├── app
├── .gitignore
├── release
│ ├── app-release.apk
│ └── output-metadata.json
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── values-zh
│ │ │ │ └── strings.xml
│ │ │ ├── values
│ │ │ │ ├── strings.xml
│ │ │ │ ├── colors.xml
│ │ │ │ └── styles.xml
│ │ │ ├── mipmap-hdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-mdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-anydpi-v26
│ │ │ │ ├── ic_launcher.xml
│ │ │ │ └── ic_launcher_round.xml
│ │ │ ├── layout
│ │ │ │ └── activity_main.xml
│ │ │ ├── drawable-v24
│ │ │ │ └── ic_launcher_foreground.xml
│ │ │ └── drawable
│ │ │ │ └── ic_launcher_background.xml
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ │ └── com
│ │ │ └── king
│ │ │ └── base
│ │ │ └── baseurlmanager
│ │ │ └── app
│ │ │ ├── App.java
│ │ │ └── MainActivity.java
│ ├── test
│ │ └── java
│ │ │ └── com
│ │ │ └── king
│ │ │ └── base
│ │ │ └── baseurlmanager
│ │ │ └── app
│ │ │ └── ExampleUnitTest.java
│ └── androidTest
│ │ └── java
│ │ └── com
│ │ └── king
│ │ └── base
│ │ └── baseurlmanager
│ │ └── app
│ │ └── ExampleInstrumentedTest.java
├── proguard-rules.pro
└── build.gradle
├── base-url-manager
├── .gitignore
├── gradle.properties
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── anim
│ │ │ │ ├── base_url_cycle.xml
│ │ │ │ └── base_url_shake.xml
│ │ │ ├── drawable-xxhdpi
│ │ │ │ ├── base_url_item_selected.png
│ │ │ │ ├── base_url_item_unselected.png
│ │ │ │ ├── base_url_toolbar_btn_back_normal.png
│ │ │ │ ├── base_url_toolbar_btn_back_pressed.png
│ │ │ │ ├── base_url_toolbar_btn_save_normal.png
│ │ │ │ └── base_url_toolbar_btn_save_pressed.png
│ │ │ ├── values-zh
│ │ │ │ └── strings.xml
│ │ │ ├── values
│ │ │ │ ├── strings.xml
│ │ │ │ ├── dimens.xml
│ │ │ │ ├── styles.xml
│ │ │ │ └── colors.xml
│ │ │ ├── drawable
│ │ │ │ ├── base_url_btn_bg_normal.xml
│ │ │ │ ├── base_url_btn_bg_pressed.xml
│ │ │ │ ├── base_url_btn_add_selector.xml
│ │ │ │ ├── base_url_item_select_selector.xml
│ │ │ │ ├── base_url_toolbar_btn_back_selector.xml
│ │ │ │ └── base_url_toolbar_btn_save_selector.xml
│ │ │ └── layout
│ │ │ │ ├── base_url_rv_url_info_item.xml
│ │ │ │ ├── base_url_manager_activity.xml
│ │ │ │ └── base_url_manager_toolbar.xml
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ │ └── com
│ │ │ └── king
│ │ │ └── base
│ │ │ └── baseurlmanager
│ │ │ ├── BaseUrlManagerProvider.java
│ │ │ ├── IBaseUrlManager.java
│ │ │ ├── bean
│ │ │ └── UrlInfo.java
│ │ │ ├── BaseUrlManagerActivity.java
│ │ │ ├── adapter
│ │ │ └── UrlInfoAdapter.java
│ │ │ ├── BaseUrlManager.java
│ │ │ └── util
│ │ │ └── BaseUrlUtil.java
│ ├── test
│ │ └── java
│ │ │ └── com
│ │ │ └── king
│ │ │ └── base
│ │ │ └── baseurlmanager
│ │ │ └── ExampleUnitTest.java
│ └── androidTest
│ │ └── java
│ │ └── com
│ │ └── king
│ │ └── base
│ │ └── baseurlmanager
│ │ └── ExampleInstrumentedTest.java
├── bintray.gradle
├── proguard-rules.pro
└── build.gradle
├── settings.gradle
├── GIF.gif
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── .gitignore
├── .circleci
└── config.yml
├── .github
└── workflows
│ ├── gradle.yml
│ └── issues-stale.yml
├── versions.gradle
├── .travis.yml
├── LICENSE
├── gradle.properties
├── gradlew.bat
├── README.md
└── gradlew
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/base-url-manager/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':base-url-manager'
2 |
--------------------------------------------------------------------------------
/GIF.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/GIF.gif
--------------------------------------------------------------------------------
/app/release/app-release.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/app/release/app-release.apk
--------------------------------------------------------------------------------
/base-url-manager/gradle.properties:
--------------------------------------------------------------------------------
1 | POM_NAME=BaseUrlManager
2 | POM_ARTIFACT_ID=base-url-manager
3 | POM_PACKAGING=aar
--------------------------------------------------------------------------------
/app/src/main/res/values-zh/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | BaseUrlManager
3 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea
5 | .DS_Store
6 | /build
7 | /captures
8 | .externalNativeBuild
9 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | BaseUrlManager
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/anim/base_url_cycle.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/drawable-xxhdpi/base_url_item_selected.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/base-url-manager/src/main/res/drawable-xxhdpi/base_url_item_selected.png
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/drawable-xxhdpi/base_url_item_unselected.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/base-url-manager/src/main/res/drawable-xxhdpi/base_url_item_unselected.png
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/drawable-xxhdpi/base_url_toolbar_btn_back_normal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/base-url-manager/src/main/res/drawable-xxhdpi/base_url_toolbar_btn_back_normal.png
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/drawable-xxhdpi/base_url_toolbar_btn_back_pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/base-url-manager/src/main/res/drawable-xxhdpi/base_url_toolbar_btn_back_pressed.png
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/drawable-xxhdpi/base_url_toolbar_btn_save_normal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/base-url-manager/src/main/res/drawable-xxhdpi/base_url_toolbar_btn_save_normal.png
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/drawable-xxhdpi/base_url_toolbar_btn_save_pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jenly1314/BaseUrlManager/HEAD/base-url-manager/src/main/res/drawable-xxhdpi/base_url_toolbar_btn_save_pressed.png
--------------------------------------------------------------------------------
/.circleci/config.yml:
--------------------------------------------------------------------------------
1 | version: 2.1
2 |
3 | orbs:
4 | android: circleci/android@0.2.0
5 |
6 | jobs:
7 | build:
8 | executor: android/android
9 |
10 | steps:
11 | - checkout
12 | - run:
13 | command: ./gradlew build
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/values-zh/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | BaseUrlManager
4 |
5 | 例如:http://192.168.100.100:8888
6 | 添加
7 |
8 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | BaseUrlManager
4 |
5 | example: http://192.168.100.100:8888
6 | Add
7 |
8 |
9 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/anim/base_url_shake.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Thu Jun 06 15:20:27 CST 2019
2 | distributionBase = GRADLE_USER_HOME
3 | distributionPath = wrapper/dists
4 | zipStoreBase = GRADLE_USER_HOME
5 | zipStorePath = wrapper/dists
6 | distributionUrl = https\://services.gradle.org/distributions/gradle-6.5-bin.zip
7 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/drawable/base_url_btn_bg_normal.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/drawable/base_url_btn_bg_pressed.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | #0086aa
5 | #0076aa
6 | #0086aa
7 |
8 | #505050
9 |
10 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/drawable/base_url_btn_add_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/drawable/base_url_item_select_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/drawable/base_url_toolbar_btn_back_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/drawable/base_url_toolbar_btn_save_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/base-url-manager/bintray.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.novoda.bintray-release'
2 |
3 | //添加
4 | publish {
5 | userOrg = 'jenly'//bintray.com用户名
6 | groupId = 'com.king.base'//jcenter上的路径s
7 | artifactId = 'base-url-manager'//项目名称
8 | publishVersion = app_version.versionName//版本号
9 | desc = 'BaseUrlManager for Android'//描述
10 | website = 'https://github.com/jenly1314/BaseUrlManager'//网站
11 | licences = ['MIT']//开源协议
12 | }
--------------------------------------------------------------------------------
/base-url-manager/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/app/release/output-metadata.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 2,
3 | "artifactType": {
4 | "type": "APK",
5 | "kind": "Directory"
6 | },
7 | "applicationId": "com.king.base.baseurlmanager.app",
8 | "variantName": "processReleaseResources",
9 | "elements": [
10 | {
11 | "type": "SINGLE",
12 | "filters": [],
13 | "versionCode": 10200,
14 | "versionName": "1.2.0",
15 | "outputFile": "app-release.apk"
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/.github/workflows/gradle.yml:
--------------------------------------------------------------------------------
1 | name: Android CI
2 |
3 | on:
4 | push:
5 | branches: [ master ]
6 | pull_request:
7 | branches: [ master ]
8 |
9 | jobs:
10 | build:
11 | runs-on: ubuntu-latest
12 |
13 | steps:
14 | - uses: actions/checkout@v2
15 | - name: Set up JDK 1.8
16 | uses: actions/setup-java@v1
17 | with:
18 | java-version: 1.8
19 | - name: Build with Gradle
20 | run: ./gradlew build
21 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 56dp
5 |
6 | 18sp
7 |
8 | 16sp
9 |
10 | 16sp
11 |
12 | 50dp
13 | 25dp
14 |
15 |
--------------------------------------------------------------------------------
/app/src/test/java/com/king/base/baseurlmanager/app/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.king.base.baseurlmanager.app;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/base-url-manager/src/test/java/com/king/base/baseurlmanager/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.king.base.baseurlmanager;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
12 |
--------------------------------------------------------------------------------
/.github/workflows/issues-stale.yml:
--------------------------------------------------------------------------------
1 | name: 'Close stale issues and PRs'
2 | on:
3 | schedule:
4 | - cron: '0 16 * * *'
5 |
6 | jobs:
7 | stale:
8 | runs-on: ubuntu-latest
9 | permissions:
10 | issues: write
11 | pull-requests: write
12 | steps:
13 | - uses: actions/stale@v5
14 | with:
15 | stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
16 | days-before-stale: 30
17 | days-before-close: 5
18 | exempt-all-pr-milestones: true
19 | exempt-issue-labels: 'help wanted'
--------------------------------------------------------------------------------
/versions.gradle:
--------------------------------------------------------------------------------
1 | // App
2 | def app_version = [:]
3 | app_version.versionCode = 10200
4 | app_version.versionName = "1.2.0"
5 | ext.app_version = app_version
6 |
7 | // build version
8 | def build_versions = [:]
9 | build_versions.minSdk = 16
10 | build_versions.targetSdk = 29
11 | build_versions.compileSdk = 29
12 | build_versions.buildTools = "29.0.3"
13 | ext.build_versions = build_versions
14 |
15 | // versions
16 | def versions = [:]
17 |
18 | versions.mavenPublish = '0.13.0'
19 | versions.gradle = "4.1.1"
20 |
21 | // androidx
22 | versions.appcompat = "1.1.0"
23 | versions.recyclerview = "1.1.0"
24 | versions.constraintLayout = "2.0.4"
25 |
26 | // test
27 | versions.junit = "1.2.0"
28 | versions.junit = "4.13.1"
29 | versions.androidExtJunit = "1.1.2"
30 | versions.espressoCore = "3.2.0"
31 |
32 | ext.versions = versions
33 |
34 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | #0086aa
5 | #0076aa
6 | #0086aa
7 |
8 | #0086aa
9 | #ffffff
10 |
11 | #ffffff
12 |
13 | #333333
14 | #ffffff
15 |
16 | #1296db
17 | #1286db
18 |
19 | #333333
20 |
21 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: android
2 | dist: trusty
3 | jdk: oraclejdk8
4 | sudo: false
5 |
6 | env:
7 | global:
8 | - ANDROID_API_LEVEL=29
9 | - ANDROID_BUILD_TOOLS_VERSION=29.0.3
10 | - TRAVIS_SECURE_ENV_VARS=true
11 |
12 | before_install:
13 | - chmod +x gradlew
14 | - mkdir "$ANDROID_HOME/licenses" || true
15 | # Hack to accept Android licenses
16 | - yes | sdkmanager "platforms;android-$ANDROID_API_LEVEL"
17 |
18 |
19 | android:
20 | components:
21 | # The BuildTools version used by your project
22 | - tools
23 | - platform-tools
24 | - build-tools-$ANDROID_BUILD_TOOLS_VERSION
25 | # The SDK version used to compile your project
26 | - android-$ANDROID_API_LEVEL
27 | - extra-android-m2repository
28 | - extra-google-android-support
29 |
30 | script:
31 | - ./gradlew clean
32 | - ./gradlew assembleRelease
--------------------------------------------------------------------------------
/base-url-manager/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/king/base/baseurlmanager/app/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.king.base.baseurlmanager.app;
2 |
3 | import android.content.Context;
4 |
5 | import org.junit.Test;
6 | import org.junit.runner.RunWith;
7 |
8 | import androidx.test.InstrumentationRegistry;
9 | import androidx.test.runner.AndroidJUnit4;
10 |
11 | import static org.junit.Assert.*;
12 |
13 | /**
14 | * Instrumented test, which will execute on an Android device.
15 | *
16 | * @see Testing documentation
17 | */
18 | @RunWith(AndroidJUnit4.class)
19 | public class ExampleInstrumentedTest {
20 | @Test
21 | public void useAppContext() {
22 | // Context of the app under test.
23 | Context appContext = InstrumentationRegistry.getTargetContext();
24 |
25 | assertEquals("com.king.base.baseurlmanager.app", appContext.getPackageName());
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/base-url-manager/src/androidTest/java/com/king/base/baseurlmanager/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.king.base.baseurlmanager;
2 |
3 | import android.content.Context;
4 |
5 | import org.junit.Test;
6 | import org.junit.runner.RunWith;
7 |
8 | import androidx.test.InstrumentationRegistry;
9 | import androidx.test.runner.AndroidJUnit4;
10 |
11 | import static org.junit.Assert.*;
12 |
13 | /**
14 | * Instrumented test, which will execute on an Android device.
15 | *
16 | * @see Testing documentation
17 | */
18 | @RunWith(AndroidJUnit4.class)
19 | public class ExampleInstrumentedTest {
20 | @Test
21 | public void useAppContext() {
22 | // Context of the app under test.
23 | Context appContext = InstrumentationRegistry.getTargetContext();
24 |
25 | assertEquals("com.king.base.baseurlmanager.test", appContext.getPackageName());
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2019 Jenly Yu
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/base-url-manager/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 | //apply from: 'bintray.gradle'
3 | apply plugin: "com.vanniktech.maven.publish"
4 |
5 | android {
6 |
7 | compileSdkVersion build_versions.compileSdk
8 | buildToolsVersion build_versions.buildTools
9 |
10 | defaultConfig {
11 | minSdkVersion build_versions.minSdk
12 | targetSdkVersion build_versions.targetSdk
13 | versionCode app_version.versionCode
14 | versionName app_version.versionName
15 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
16 |
17 | }
18 |
19 | buildTypes {
20 | release {
21 | minifyEnabled false
22 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
23 | }
24 | }
25 |
26 | lintOptions {
27 | abortOnError false
28 | warning 'InvalidPackage'
29 | }
30 |
31 | }
32 |
33 | dependencies {
34 | testImplementation "junit:junit:$versions.junit"
35 | androidTestImplementation "androidx.test.ext:junit:$versions.androidExtJunit"
36 | androidTestImplementation "androidx.test.espresso:espresso-core:$versions.espressoCore"
37 |
38 | api "androidx.appcompat:appcompat:$versions.appcompat"
39 | api "androidx.recyclerview:recyclerview:$versions.recyclerview"
40 |
41 | }
42 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion build_versions.compileSdk
5 | buildToolsVersion build_versions.buildTools
6 |
7 | defaultConfig {
8 | applicationId "com.king.base.baseurlmanager.app"
9 | minSdkVersion build_versions.minSdk
10 | targetSdkVersion build_versions.targetSdk
11 | versionCode app_version.versionCode
12 | versionName app_version.versionName
13 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
14 |
15 | }
16 | buildTypes {
17 | release {
18 | minifyEnabled false
19 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
20 | }
21 | }
22 |
23 | lintOptions {
24 | abortOnError false
25 | warning 'InvalidPackage'
26 | }
27 | }
28 |
29 | dependencies {
30 | implementation fileTree(include: ['*.jar'], dir: 'libs')
31 | testImplementation "junit:junit:$versions.junit"
32 | androidTestImplementation "androidx.test.ext:junit:$versions.androidExtJunit"
33 | androidTestImplementation "androidx.test.espresso:espresso-core:$versions.espressoCore"
34 |
35 | // implementation "androidx.appcompat:appcompat:$versions.appcompat"
36 | implementation "androidx.constraintlayout:constraintlayout:$versions.constraintLayout"
37 |
38 | implementation project(':base-url-manager')
39 | }
--------------------------------------------------------------------------------
/base-url-manager/src/main/java/com/king/base/baseurlmanager/BaseUrlManagerProvider.java:
--------------------------------------------------------------------------------
1 | package com.king.base.baseurlmanager;
2 |
3 | import android.content.ContentProvider;
4 | import android.content.ContentValues;
5 | import android.database.Cursor;
6 | import android.net.Uri;
7 |
8 | import androidx.annotation.NonNull;
9 | import androidx.annotation.Nullable;
10 |
11 | /**
12 | * @author Jenly
13 | */
14 | public class BaseUrlManagerProvider extends ContentProvider {
15 | @Override
16 | public boolean onCreate() {
17 | BaseUrlManager.init(getContext());
18 | return true;
19 | }
20 |
21 | @Nullable
22 | @Override
23 | public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
24 | return null;
25 | }
26 |
27 | @Nullable
28 | @Override
29 | public String getType(@NonNull Uri uri) {
30 | return null;
31 | }
32 |
33 | @Nullable
34 | @Override
35 | public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
36 | return null;
37 | }
38 |
39 | @Override
40 | public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
41 | return 0;
42 | }
43 |
44 | @Override
45 | public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
46 | return 0;
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/base/baseurlmanager/app/App.java:
--------------------------------------------------------------------------------
1 | package com.king.base.baseurlmanager.app;
2 |
3 | import android.app.Application;
4 |
5 | import com.king.base.baseurlmanager.BaseUrlManager;
6 | import com.king.base.baseurlmanager.bean.UrlInfo;
7 |
8 | import java.util.ArrayList;
9 | import java.util.List;
10 |
11 | /**
12 | * @author Jenly
13 | */
14 | public class App extends Application {
15 |
16 | private String[] mUrls = {
17 | "http://192.168.100.100:8888",
18 | "http://192.168.100.108:9090",
19 | "http://192.168.100.160",
20 | };
21 |
22 | @Override
23 | public void onCreate() {
24 | super.onCreate();
25 | initBaseUrlManager();
26 | }
27 |
28 | /**
29 | *
30 | */
31 | private void initBaseUrlManager(){
32 | //初始化BaseUrlManager
33 | BaseUrlManager baseUrlManager = BaseUrlManager.getInstance();
34 |
35 | //-------------------------- 下面这一段可以完全不需要,主要用来演示
36 | if(baseUrlManager.getCount()==0){
37 | List list = new ArrayList<>();
38 | int length = mUrls.length;
39 | for (int i = 0; i < length; i++){
40 | list.add(new UrlInfo(mUrls[i]));
41 | }
42 | //你也可以提前把可能需要的环境提前加到BaseUrlManager
43 | baseUrlManager.addUrlInfo(list);
44 | //设置baseUrl
45 | //baseUrlManager.setUrlInfo();
46 | }
47 | //--------------------------
48 |
49 | }
50 |
51 |
52 | }
53 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/java/com/king/base/baseurlmanager/IBaseUrlManager.java:
--------------------------------------------------------------------------------
1 | package com.king.base.baseurlmanager;
2 |
3 |
4 | import com.king.base.baseurlmanager.bean.UrlInfo;
5 |
6 | import java.util.Collection;
7 | import java.util.List;
8 | import java.lang.String;
9 |
10 | import androidx.annotation.NonNull;
11 |
12 | /**
13 | * @author Jenly
14 | */
15 | public interface IBaseUrlManager {
16 |
17 | /**
18 | * 获取BaseUrl
19 | * @return {@link String}
20 | */
21 | String getBaseUrl();
22 |
23 | /**
24 | * 获取UrlInfo
25 | * @return {@link UrlInfo}
26 | */
27 | UrlInfo getUrlInfo();
28 |
29 | /**
30 | * 设置UrlInfo
31 | * @param urlInfo
32 | */
33 | void setUrlInfo(@NonNull UrlInfo urlInfo);
34 |
35 | /**
36 | * 添加UrlInfo
37 | * @param urlInfo
38 | */
39 | void addUrlInfo(@NonNull UrlInfo urlInfo);
40 |
41 | /**
42 | * 添加UrlInfo集合
43 | * @param list
44 | */
45 | void addUrlInfo(@NonNull Collection list);
46 |
47 |
48 | /**
49 | * 移除UrlInfo
50 | * @param urlInfo
51 | */
52 | void remove(@NonNull UrlInfo urlInfo);
53 |
54 | /**
55 | * 清除
56 | */
57 | void clear();
58 |
59 | /**
60 | * 获取UrlInfo集合
61 | * @return {@link List}
62 | */
63 | List getUrlInfoList();
64 |
65 | /**
66 | * 获取url数
67 | * @return {@link int}
68 | */
69 | int getCount();
70 |
71 | /**
72 | * 刷新数据
73 | */
74 | void refreshData();
75 | }
76 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/layout/base_url_rv_url_info_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
21 |
33 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs = -Xmx1536m
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 |
15 | android.useAndroidX=true
16 | android.enableJetifier=true
17 |
18 | VERSION_NAME=1.2.0
19 | VERSION_CODE=10200
20 | GROUP=com.github.jenly1314
21 |
22 | POM_DESCRIPTION=BaseUrlManager for Android
23 | POM_URL=https://github.com/jenly1314/BaseUrlManager
24 | POM_SCM_URL=https://github.com/jenly1314/BaseUrlManager
25 | POM_SCM_CONNECTION=scm:git@github.com:jenly1314/BaseUrlManager.git
26 | POM_SCM_DEV_CONNECTION=scm:git@github.com:jenly1314/BaseUrlManager.git
27 | POM_LICENCE_NAME=The MIT License
28 | POM_LICENCE_URL=https://opensource.org/licenses/mit-license.php
29 | #POM_LICENCE_NAME=The Apache Software License, Version 2.0
30 | #POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
31 | POM_DEVELOPER_ID=jenly
32 | POM_DEVELOPER_NAME=Jenly Yu
33 | RELEASE_REPOSITORY_URL=https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/
34 | SNAPSHOT_REPOSITORY_URL=https://s01.oss.sonatype.org/content/repositories/snapshots/
35 | RELEASE_SIGNING_ENABLED=false
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
24 |
39 |
40 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
12 |
13 |
19 |
22 |
25 |
26 |
27 |
28 |
34 |
35 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/layout/base_url_manager_activity.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
29 |
44 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/res/layout/base_url_manager_toolbar.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
16 |
25 |
36 |
45 |
46 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/base/baseurlmanager/app/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.king.base.baseurlmanager.app;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.view.View;
6 | import android.widget.Toast;
7 |
8 | import com.king.base.baseurlmanager.BaseUrlManager;
9 |
10 | import androidx.annotation.Nullable;
11 | import androidx.appcompat.app.AppCompatActivity;
12 |
13 | /**
14 | * @author Jenly
15 | */
16 | public class MainActivity extends AppCompatActivity {
17 |
18 | private static final int SET_BASE_URL_REQUEST_CODE = 0X01;
19 |
20 | private String mUrl;
21 |
22 | @Override
23 | protected void onCreate(Bundle savedInstanceState) {
24 | super.onCreate(savedInstanceState);
25 | setContentView(R.layout.activity_main);
26 | mUrl = BaseUrlManager.getInstance().getBaseUrl();
27 | }
28 |
29 |
30 | @Override
31 | protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
32 | super.onActivityResult(requestCode, resultCode, data);
33 | if(resultCode == RESULT_OK){
34 | switch (requestCode){
35 | case SET_BASE_URL_REQUEST_CODE:
36 | //方式1:通过BaseUrlManager获取baseUrl
37 | mUrl = BaseUrlManager.getInstance().getBaseUrl();
38 | //方式2:通过data直接获取baseUrl
39 | // UrlInfo urlInfo = BaseUrlManager.parseActivityResult(data);
40 | // mUrl = urlInfo.getBaseUrl();
41 | Toast.makeText(this,mUrl,Toast.LENGTH_SHORT).show();
42 | break;
43 | }
44 | }
45 | }
46 |
47 |
48 | private void toSetBaseUrl(){
49 |
50 | BaseUrlManager.getInstance().startBaseUrlManager(this,SET_BASE_URL_REQUEST_CODE);
51 |
52 | //v1.0.x以前的写法
53 | // Intent intent = new Intent(this, BaseUrlManagerActivity.class);
54 | //// intent.putExtra(BaseUrlManagerActivity.KEY_TITLE,"BaseUrl配置");
55 | // //可设置正则校验,可选项
56 | //// intent.putExtra(BaseUrlManagerActivity.KEY_REGEX,BaseUrlManagerActivity.HTTP_URL_REGEX);
57 | // startActivityForResult(intent,SET_BASE_URL_REQUEST_CODE);
58 |
59 |
60 | }
61 |
62 | public void onClick(View v){
63 | switch (v.getId()){
64 | case R.id.btnSettings:
65 | toSetBaseUrl();
66 | break;
67 | }
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/java/com/king/base/baseurlmanager/bean/UrlInfo.java:
--------------------------------------------------------------------------------
1 | package com.king.base.baseurlmanager.bean;
2 |
3 | import android.os.Parcel;
4 | import android.os.Parcelable;
5 | import android.text.TextUtils;
6 |
7 | import androidx.annotation.NonNull;
8 |
9 | /**
10 | * @author Jenly
11 | */
12 | public class UrlInfo implements Parcelable, Comparable {
13 |
14 | private String baseUrl;
15 |
16 | private long time;
17 |
18 | public UrlInfo(@NonNull String baseUrl) {
19 | this(baseUrl, System.currentTimeMillis());
20 | }
21 |
22 | public UrlInfo(@NonNull String baseUrl, long time) {
23 | this.baseUrl = baseUrl;
24 | this.time = time;
25 | }
26 |
27 | public String getBaseUrl() {
28 | if (TextUtils.isEmpty(baseUrl)) {
29 | return "";
30 | }
31 | return baseUrl;
32 | }
33 |
34 | public void setBaseUrl(@NonNull String baseUrl) {
35 | this.baseUrl = baseUrl;
36 | }
37 |
38 | public long getTime() {
39 | return time;
40 | }
41 |
42 | public void setTime(long time) {
43 | this.time = time;
44 | }
45 |
46 | @Override
47 | public String toString() {
48 | return "UrlInfo{" +
49 | "baseUrl='" + baseUrl + '\'' +
50 | ", time=" + time +
51 | '}';
52 | }
53 |
54 | @Override
55 | public boolean equals(Object o) {
56 | if (this == o) return true;
57 | if (o == null || getClass() != o.getClass()) return false;
58 |
59 | UrlInfo urlInfo = (UrlInfo) o;
60 |
61 | return baseUrl.equals(urlInfo.baseUrl);
62 | }
63 |
64 | @Override
65 | public int hashCode() {
66 | return baseUrl.hashCode();
67 | }
68 |
69 |
70 | @Override
71 | public int compareTo(@NonNull UrlInfo o) {
72 | if (time > o.time) {
73 | return 1;
74 | }
75 | if (time < o.time) {
76 | return -1;
77 | }
78 | return 0;
79 | }
80 |
81 | @Override
82 | public int describeContents() {
83 | return 0;
84 | }
85 |
86 | @Override
87 | public void writeToParcel(Parcel dest, int flags) {
88 | dest.writeString(this.baseUrl);
89 | dest.writeLong(this.time);
90 | }
91 |
92 | protected UrlInfo(Parcel in) {
93 | this.baseUrl = in.readString();
94 | this.time = in.readLong();
95 | }
96 |
97 | public static final Creator CREATOR = new Creator() {
98 | @Override
99 | public UrlInfo createFromParcel(Parcel source) {
100 | return new UrlInfo(source);
101 | }
102 |
103 | @Override
104 | public UrlInfo[] newArray(int size) {
105 | return new UrlInfo[size];
106 | }
107 | };
108 | }
109 |
110 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/java/com/king/base/baseurlmanager/BaseUrlManagerActivity.java:
--------------------------------------------------------------------------------
1 | package com.king.base.baseurlmanager;
2 |
3 | import android.content.Context;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.text.TextUtils;
7 | import android.view.View;
8 | import android.view.animation.AnimationUtils;
9 | import android.view.inputmethod.InputMethodManager;
10 | import android.widget.EditText;
11 | import android.widget.TextView;
12 |
13 | import com.king.base.baseurlmanager.adapter.UrlInfoAdapter;
14 | import com.king.base.baseurlmanager.bean.UrlInfo;
15 |
16 | import java.util.List;
17 | import java.util.regex.Pattern;
18 |
19 | import androidx.annotation.Nullable;
20 | import androidx.appcompat.app.AppCompatActivity;
21 | import androidx.recyclerview.widget.DividerItemDecoration;
22 | import androidx.recyclerview.widget.LinearLayoutManager;
23 | import androidx.recyclerview.widget.RecyclerView;
24 |
25 | /**
26 | * @author Jenly
27 | */
28 | public class BaseUrlManagerActivity extends AppCompatActivity {
29 |
30 | private RecyclerView recyclerView;
31 |
32 | private EditText etUrl;
33 |
34 | private IBaseUrlManager mBaseUrlManager;
35 |
36 | private UrlInfoAdapter mAdapter;
37 |
38 | private List listData;
39 |
40 | private String mRegex = BaseUrlManager.HTTP_URL_REGEX;
41 |
42 | @Override
43 | protected void onCreate(@Nullable Bundle savedInstanceState) {
44 | super.onCreate(savedInstanceState);
45 | setContentView(R.layout.base_url_manager_activity);
46 | initUI();
47 | }
48 |
49 | private void initUI() {
50 |
51 | Bundle bundle = getIntent().getExtras();
52 | if (bundle != null) {
53 | String title = bundle.getString(BaseUrlManager.KEY_TITLE);
54 | if (!TextUtils.isEmpty(title)) {
55 | TextView tvTitle = findViewById(R.id.tvTitle);
56 | tvTitle.setText(title);
57 | }
58 | mRegex = bundle.getString(BaseUrlManager.KEY_REGEX);
59 | }
60 |
61 |
62 | recyclerView = findViewById(R.id.recyclerView);
63 | etUrl = findViewById(R.id.etUrl);
64 |
65 | mBaseUrlManager = BaseUrlManager.getInstance();
66 |
67 | listData = mBaseUrlManager.getUrlInfoList();
68 |
69 | mAdapter = new UrlInfoAdapter(listData);
70 |
71 | mAdapter.setSelected(mBaseUrlManager.getUrlInfo());
72 | recyclerView.setLayoutManager(new LinearLayoutManager(this));
73 | recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
74 |
75 | recyclerView.setAdapter(mAdapter);
76 |
77 | }
78 |
79 | /**
80 | * 保存选中的Url
81 | */
82 | private void saveSelected() {
83 | UrlInfo urlInfo = mAdapter.getSelectedItem();
84 | if (urlInfo != null) {
85 | mBaseUrlManager.setUrlInfo(urlInfo);
86 | mBaseUrlManager.refreshData();
87 | Intent intent = new Intent();
88 | intent.putExtra(BaseUrlManager.KEY_URL_INFO, urlInfo);
89 | setResult(RESULT_OK, intent);
90 | onBackPressed();
91 | }
92 | }
93 |
94 |
95 | /**
96 | * 添加Url
97 | */
98 | private void addUrl() {
99 | if (TextUtils.isEmpty(etUrl.getText())) {
100 | etUrl.startAnimation(AnimationUtils.loadAnimation(this, R.anim.base_url_shake));
101 | return;
102 | }
103 |
104 | String url = etUrl.getText().toString().trim();
105 |
106 | if ((!TextUtils.isEmpty(mRegex)) && !Pattern.matches(mRegex, url)) {
107 | etUrl.startAnimation(AnimationUtils.loadAnimation(this, R.anim.base_url_shake));
108 | return;
109 | }
110 |
111 |
112 | UrlInfo urlInfo = new UrlInfo(url);
113 |
114 | mBaseUrlManager.addUrlInfo(urlInfo);
115 |
116 | mAdapter.notifyDataSetChanged();
117 |
118 | etUrl.clearFocus();
119 |
120 | //隐藏输入法
121 | InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
122 | imm.hideSoftInputFromWindow(etUrl.getWindowToken(), 0);
123 |
124 | //滑动到最后一个
125 | int count = mAdapter.getItemCount();
126 | if (count > 0) {
127 | recyclerView.smoothScrollToPosition(count - 1);
128 | }
129 |
130 | }
131 |
132 |
133 | public void onClick(View v) {
134 | int id = v.getId();
135 | if (id == R.id.ivBack) {
136 | onBackPressed();
137 | } else if (id == R.id.ivSave) {
138 | saveSelected();
139 | } else if (id == R.id.btnAdd) {
140 | addUrl();
141 | }
142 | }
143 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # BaseUrlManager
2 |
3 | [](https://repo1.maven.org/maven2/com/github/jenly1314/BaseUrlManager)
4 | [](https://jitpack.io/#jenly1314/BaseUrlManager)
5 | [](https://github.com/jenly1314/BaseUrlManager/actions/workflows/gradle.yml)
6 | [](https://raw.githubusercontent.com/jenly1314/BaseUrlManager/master/app/release/app-release.apk)
7 | [](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)
8 | [](https://opensource.org/licenses/mit)
9 |
10 | BaseUrlManager for Android 的设计初衷主要用于开发时,有多个环境需要打包APK的场景,通过BaseUrlManager提供的BaseUrl动态设置入口,只需打一
11 | 次包,即可轻松随意的切换不同的开发环境或测试环境。在打生产环境包时,关闭BaseUrl动态设置入口即可。
12 |
13 | > 妈妈再也不用担心因环境不同需要打多个包的问题,从此告别环境不同要写一堆配置的烦恼,真香。
14 |
15 | > 配合[ **RetrofitHelper** ](https://github.com/jenly1314/RetrofitHelper)动态改变BaseUrl一起使用更香。
16 |
17 | ## 效果展示
18 | 
19 |
20 | > 你也可以直接下载 [演示App](https://raw.githubusercontent.com/jenly1314/BaseUrlManager/master/app/release/app-release.apk) 体验效果
21 |
22 | ## 引入
23 |
24 | ### Gradle:
25 |
26 | 1. 在Project的 **build.gradle** 或 **setting.gradle** 中添加远程仓库
27 |
28 | ```gradle
29 | repositories {
30 | //...
31 | mavenCentral()
32 | }
33 | ```
34 |
35 | 2. 在Module的 **build.gradle** 中添加依赖项
36 |
37 | ```gradle
38 | //AndroidX 版本
39 | implementation 'com.github.jenly1314:base-url-manager:1.2.0'
40 | ```
41 | ## 使用
42 |
43 | 集成步骤代码示例 (示例出自于[app](app)中)
44 |
45 | Step.1 在您项目中的AndroidManifest.xml中通过配置meta-data来自定义全局配置
46 | ```xml
47 |
48 |
51 | ```
52 |
53 | Step.2 在您项目Application的onCreate方法中初始化BaseUrlManager
54 |
55 | ```java
56 | //获取BaseUrlManager实例(适用于v1.1.x版本)
57 | mBaseUrlManager = BaseUrlManager.getInstance();
58 |
59 | //获取BaseUrlManager实例(适用于v1.0.x旧版本)
60 | mBaseUrlManager = new BaseUrlManager(this);
61 |
62 | //获取baseUrl
63 | String baseUrl = mBaseUrlManager.getBaseUrl();
64 |
65 | ```
66 |
67 | Step.3 提供动态配置BaseUrl的入口(通过Intent跳转到BaseUrlManagerActivity界面)
68 |
69 | v.1.1.x 新版本写法
70 | ```JAVA
71 | BaseUrlManager.getInstance().startBaseUrlManager(this,SET_BASE_URL_REQUEST_CODE);
72 |
73 | ```
74 |
75 | v1.0.x 以前版本写法
76 | ```JAVA
77 | Intent intent = new Intent(this, BaseUrlManagerActivity.class);
78 | //BaseUrlManager界面的标题
79 | //intent.putExtra(BaseUrlManagerActivity.KEY_TITLE,"BaseUrl配置");
80 | //跳转到BaseUrlManagerActivity界面
81 | startActivityForResult(intent,SET_BASE_URL_REQUEST_CODE);
82 | ```
83 |
84 | Step.4 当配置改变了baseUrl时,在Activity或Fragment的onActivityResult方法中重新获取baseUrl即可
85 | ```java
86 |
87 | //方式1:通过BaseUrlManager获取baseUrl
88 | String baseUrl = BaseUrlManager.getInstance().getBaseUrl();
89 | //方式2:通过data直接获取baseUrl
90 | UrlInfo urlInfo = BaseUrlManager.parseActivityResult(data);
91 | String baseUrl = urlInfo.getBaseUrl();
92 |
93 | ```
94 |
95 | 更多使用详情,请查看[app](app)中的源码使用示例或直接查看 [API帮助文档](https://jitpack.io/com/github/jenly1314/BaseUrlManager/latest/javadoc/)
96 |
97 | ## 相关推荐
98 |
99 | - [RetrofitHelper](https://github.com/jenly1314/RetrofitHelper) 一个为 Retrofit 提供便捷配置多个BaseUrl相关的扩展帮助类。
100 | - [LogX](http://github.com/jenly1314/LogX) 一个轻量而强大的日志框架;好用不解释。
101 | - [KVCache](http://github.com/jenly1314/KVCache) 一个便于统一管理的键值缓存库;支持无缝切换缓存实现。
102 | - [AndroidKTX](http://github.com/AndroidKTX/AndroidKTX) 一个简化 Android 开发的 Kotlin 工具类集合。
103 | - [AndroidUtil](http://github.com/AndroidUtil/AndroidUtil) 一个整理了Android常用工具类集合,平时在开发的过程中可能会经常用到。
104 | - [AppUpdater](http://github.com/jenly1314/AppUpdater) 一个专注于App更新,一键傻瓜式集成App版本升级的轻量开源库。
105 | - [MVVMFrame](https://github.com/jenly1314/MVVMFrame) 一个基于Google官方推出的JetPack构建的MVVM快速开发框架。
106 | - [AppTemplate](https://github.com/jenly1314/AppTemplate) 一款基于 MVVMFrame 构建的App模板。
107 |
108 | ## 版本日志
109 |
110 | #### v1.2.0:2022-1-25 (从v1.2.0开始发布至 MavenCentral)
111 | * 优化细节
112 |
113 | #### v1.1.1:2021-1-28
114 | * 新增支持长按复制相关功能
115 |
116 | #### v1.1.0:2020-12-4
117 | * 输入的url支持正则校验
118 | * 后续版本只支持androidx,版本名称不再带有androidx标识
119 |
120 | #### v1.0.1:2019-7-5
121 | * 移除strings.xml资源中的app_name
122 | * 支持不依赖刷新数据,直接通过onActivityResult获取baseUrl信息
123 |
124 | #### v1.0.0:2019-6-11 [支持AndroidX版本](https://github.com/jenly1314/BaseUrlManager/tree/androidx)
125 | * BaseUrlManager初始版本
126 |
127 | ---
128 |
129 | 
130 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/java/com/king/base/baseurlmanager/adapter/UrlInfoAdapter.java:
--------------------------------------------------------------------------------
1 | package com.king.base.baseurlmanager.adapter;
2 |
3 | import android.util.SparseArray;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.TextView;
8 |
9 | import com.king.base.baseurlmanager.R;
10 | import com.king.base.baseurlmanager.bean.UrlInfo;
11 |
12 | import java.util.ArrayList;
13 | import java.util.Collection;
14 | import java.util.List;
15 |
16 | import androidx.annotation.IdRes;
17 | import androidx.annotation.NonNull;
18 | import androidx.recyclerview.widget.RecyclerView;
19 |
20 | /**
21 | * @author Jenly
22 | */
23 | public class UrlInfoAdapter extends RecyclerView.Adapter {
24 |
25 |
26 | private List listData;
27 |
28 | private UrlInfo urlInfo;
29 |
30 | public UrlInfoAdapter() {
31 | listData = new ArrayList<>();
32 | }
33 |
34 | public UrlInfoAdapter(List listData) {
35 | this.listData = listData;
36 | }
37 |
38 | @NonNull
39 | @Override
40 | public UrlViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int type) {
41 | View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.base_url_rv_url_info_item, viewGroup, false);
42 | return new UrlViewHolder(itemView);
43 | }
44 |
45 | @Override
46 | public void onBindViewHolder(@NonNull UrlViewHolder viewHolder, int position) {
47 | convert(viewHolder, listData.get(position), position);
48 | }
49 |
50 | private void convert(UrlViewHolder holder, UrlInfo item, final int position) {
51 | holder.setText(R.id.tvUrl, item.getBaseUrl());
52 |
53 | holder.setSelected(R.id.ivSelect, item.equals(urlInfo));
54 |
55 | holder.itemView.setOnClickListener(new View.OnClickListener() {
56 | @Override
57 | public void onClick(View v) {
58 | setSelected(position);
59 | }
60 | });
61 | }
62 |
63 | @Override
64 | public int getItemCount() {
65 | return listData != null ? listData.size() : 0;
66 | }
67 |
68 |
69 | public void setSelected(int position) {
70 | if (position >= 0 && position < getItemCount()) {
71 | urlInfo = listData.get(position);
72 | } else {
73 | urlInfo = null;
74 | }
75 | notifyDataSetChanged();
76 | }
77 |
78 | public void noSelected() {
79 | setSelected(-1);
80 | }
81 |
82 | public void setSelected(@NonNull UrlInfo urlInfo) {
83 | if (listData != null) {
84 | for (int i = 0; i < listData.size(); i++) {
85 | if (urlInfo.equals(listData.get(i))) {
86 | setSelected(i);
87 | return;
88 | }
89 | }
90 | noSelected();
91 | }
92 | }
93 |
94 | public UrlInfo getSelectedItem() {
95 | return urlInfo;
96 | }
97 |
98 |
99 | public void replace(Collection urlInfoList) {
100 | if (listData != urlInfoList) {
101 | if (listData == null) {
102 | listData = new ArrayList<>();
103 | } else {
104 | listData.clear();
105 | }
106 |
107 | if (urlInfoList != null) {
108 | listData.addAll(urlInfoList);
109 | }
110 | }
111 |
112 | notifyDataSetChanged();
113 | }
114 |
115 | public void add(Collection urlInfoList) {
116 | if (listData != urlInfoList) {
117 | if (listData == null) {
118 | listData = new ArrayList<>();
119 | }
120 | if (urlInfoList != null) {
121 | listData.addAll(urlInfoList);
122 | }
123 | }
124 |
125 | notifyDataSetChanged();
126 | }
127 |
128 | public void add(UrlInfo urlInfo) {
129 | if (listData == null) {
130 | listData = new ArrayList<>();
131 | }
132 |
133 | listData.add(urlInfo);
134 |
135 | notifyDataSetChanged();
136 | }
137 |
138 | protected static class UrlViewHolder extends RecyclerView.ViewHolder {
139 |
140 | private SparseArray views;
141 |
142 | public UrlViewHolder(@NonNull View itemView) {
143 | super(itemView);
144 | views = new SparseArray<>();
145 | }
146 |
147 | public T getView(@IdRes int resId) {
148 | View view = views.get(resId);
149 | if (view == null) {
150 | view = itemView.findViewById(resId);
151 | views.put(resId, view);
152 | }
153 |
154 | return (T) view;
155 | }
156 |
157 | public void setText(@IdRes int resId, CharSequence text) {
158 | TextView textView = getView(resId);
159 | textView.setText(text);
160 | }
161 |
162 | public void setSelected(@IdRes int resId, boolean isSelected) {
163 | getView(resId).setSelected(isSelected);
164 | }
165 |
166 |
167 | }
168 | }
169 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Attempt to set APP_HOME
10 | # Resolve links: $0 may be a link
11 | PRG="$0"
12 | # Need this for relative symlinks.
13 | while [ -h "$PRG" ] ; do
14 | ls=`ls -ld "$PRG"`
15 | link=`expr "$ls" : '.*-> \(.*\)$'`
16 | if expr "$link" : '/.*' > /dev/null; then
17 | PRG="$link"
18 | else
19 | PRG=`dirname "$PRG"`"/$link"
20 | fi
21 | done
22 | SAVED="`pwd`"
23 | cd "`dirname \"$PRG\"`/" >/dev/null
24 | APP_HOME="`pwd -P`"
25 | cd "$SAVED" >/dev/null
26 |
27 | APP_NAME="Gradle"
28 | APP_BASE_NAME=`basename "$0"`
29 |
30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31 | DEFAULT_JVM_OPTS=""
32 |
33 | # Use the maximum available, or set MAX_FD != -1 to use that value.
34 | MAX_FD="maximum"
35 |
36 | warn () {
37 | echo "$*"
38 | }
39 |
40 | die () {
41 | echo
42 | echo "$*"
43 | echo
44 | exit 1
45 | }
46 |
47 | # OS specific support (must be 'true' or 'false').
48 | cygwin=false
49 | msys=false
50 | darwin=false
51 | nonstop=false
52 | case "`uname`" in
53 | CYGWIN* )
54 | cygwin=true
55 | ;;
56 | Darwin* )
57 | darwin=true
58 | ;;
59 | MINGW* )
60 | msys=true
61 | ;;
62 | NONSTOP* )
63 | nonstop=true
64 | ;;
65 | esac
66 |
67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68 |
69 | # Determine the Java command to use to start the JVM.
70 | if [ -n "$JAVA_HOME" ] ; then
71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72 | # IBM's JDK on AIX uses strange locations for the executables
73 | JAVACMD="$JAVA_HOME/jre/sh/java"
74 | else
75 | JAVACMD="$JAVA_HOME/bin/java"
76 | fi
77 | if [ ! -x "$JAVACMD" ] ; then
78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79 |
80 | Please set the JAVA_HOME variable in your environment to match the
81 | location of your Java installation."
82 | fi
83 | else
84 | JAVACMD="java"
85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86 |
87 | Please set the JAVA_HOME variable in your environment to match the
88 | location of your Java installation."
89 | fi
90 |
91 | # Increase the maximum file descriptors if we can.
92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93 | MAX_FD_LIMIT=`ulimit -H -n`
94 | if [ $? -eq 0 ] ; then
95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96 | MAX_FD="$MAX_FD_LIMIT"
97 | fi
98 | ulimit -n $MAX_FD
99 | if [ $? -ne 0 ] ; then
100 | warn "Could not set maximum file descriptor limit: $MAX_FD"
101 | fi
102 | else
103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104 | fi
105 | fi
106 |
107 | # For Darwin, add options to specify how the application appears in the dock
108 | if $darwin; then
109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110 | fi
111 |
112 | # For Cygwin, switch paths to Windows format before running java
113 | if $cygwin ; then
114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116 | JAVACMD=`cygpath --unix "$JAVACMD"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Escape application args
158 | save () {
159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160 | echo " "
161 | }
162 | APP_ARGS=$(save "$@")
163 |
164 | # Collect all arguments for the java command, following the shell quoting and substitution rules
165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166 |
167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169 | cd "$(dirname "$0")"
170 | fi
171 |
172 | exec "$JAVACMD" "$@"
173 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/java/com/king/base/baseurlmanager/BaseUrlManager.java:
--------------------------------------------------------------------------------
1 | package com.king.base.baseurlmanager;
2 |
3 | import android.app.Activity;
4 | import android.content.Context;
5 | import android.content.Intent;
6 | import android.os.Bundle;
7 |
8 | import com.king.base.baseurlmanager.bean.UrlInfo;
9 | import com.king.base.baseurlmanager.util.BaseUrlUtil;
10 |
11 | import java.util.Collection;
12 | import java.util.List;
13 |
14 | import androidx.annotation.NonNull;
15 | import androidx.annotation.Nullable;
16 | import androidx.fragment.app.Fragment;
17 |
18 | /**
19 | * @author Jenly
20 | */
21 | public class BaseUrlManager implements IBaseUrlManager {
22 |
23 | public static final String KEY_TITLE = "key_title";
24 |
25 | public static final String KEY_URL_INFO = "key_url_info";
26 |
27 | public static final String KEY_REGEX = "key_regex";
28 |
29 | public static final String HTTP_URL_REGEX = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
30 |
31 | private Context context;
32 |
33 | private List urlInfoList;
34 |
35 | private UrlInfo urlInfo;
36 |
37 | private String baseUrl;
38 |
39 | private static BaseUrlManager INSTANCE;
40 |
41 | public static BaseUrlManager getInstance() {
42 | return INSTANCE;
43 | }
44 |
45 | static void init(@NonNull Context context) {
46 | INSTANCE = new BaseUrlManager(context.getApplicationContext());
47 | }
48 |
49 | private BaseUrlManager(@NonNull Context context) {
50 | this.context = context;
51 | refreshData();
52 | }
53 |
54 | /**
55 | * 跳转至 BaseUrl 配置管理
56 | *
57 | * @param activity
58 | * @param requestCode
59 | */
60 | public static void startBaseUrlManager(Activity activity, int requestCode) {
61 | startBaseUrlManager(activity, requestCode, null);
62 | }
63 |
64 | /**
65 | * 跳转至 BaseUrl 配置管理
66 | *
67 | * @param activity
68 | * @param requestCode
69 | * @param bundle
70 | */
71 | public static void startBaseUrlManager(Activity activity, int requestCode, Bundle bundle) {
72 | Intent intent = new Intent(activity, BaseUrlManagerActivity.class);
73 | if (bundle != null && bundle.size() > 0) {
74 | intent.putExtra(KEY_TITLE, "");
75 | intent.getExtras().putAll(bundle);
76 | }
77 | activity.startActivityForResult(intent, requestCode);
78 | }
79 |
80 | /**
81 | * 跳转至 BaseUrl 配置管理
82 | *
83 | * @param fragment
84 | * @param requestCode
85 | */
86 | public static void startBaseUrlManager(Fragment fragment, int requestCode) {
87 | startBaseUrlManager(fragment, requestCode, null);
88 | }
89 |
90 | /**
91 | * 跳转至 BaseUrl 配置管理
92 | *
93 | * @param fragment
94 | * @param requestCode
95 | * @param bundle
96 | */
97 | public static void startBaseUrlManager(Fragment fragment, int requestCode, Bundle bundle) {
98 | Intent intent = new Intent(fragment.getContext(), BaseUrlManagerActivity.class);
99 | if (bundle != null && bundle.size() > 0) {
100 | intent.putExtra(KEY_TITLE, "");
101 | intent.getExtras().putAll(bundle);
102 | }
103 | fragment.startActivityForResult(intent, requestCode);
104 | }
105 |
106 | /**
107 | * 解析 onActivityResult中的结果
108 | *
109 | * @param data
110 | * @return
111 | */
112 | @Nullable
113 | public static UrlInfo parseActivityResult(Intent data) {
114 | if (data != null) {
115 | return data.getParcelableExtra(BaseUrlManager.KEY_URL_INFO);
116 | }
117 | return null;
118 | }
119 |
120 |
121 | @Override
122 | public String getBaseUrl() {
123 | return baseUrl;
124 | }
125 |
126 | @Override
127 | public UrlInfo getUrlInfo() {
128 | return urlInfo;
129 | }
130 |
131 | @Override
132 | public void setUrlInfo(@NonNull UrlInfo urlInfo) {
133 | this.urlInfo = urlInfo;
134 | this.baseUrl = urlInfo.getBaseUrl();
135 | if (urlInfoList != null) {
136 | if (urlInfoList.contains(urlInfo)) {
137 | urlInfoList.remove(urlInfo);
138 | }
139 | urlInfoList.add(urlInfo);
140 | BaseUrlUtil.put(context, urlInfo, true);
141 | }
142 | }
143 |
144 | @Override
145 | public void addUrlInfo(@NonNull UrlInfo urlInfo) {
146 | if (urlInfoList != null) {
147 | if (urlInfoList.contains(urlInfo)) {
148 | urlInfoList.remove(urlInfo);
149 | }
150 | urlInfoList.add(urlInfo);
151 | BaseUrlUtil.put(context, urlInfo);
152 |
153 | }
154 | }
155 |
156 | @Override
157 | public void addUrlInfo(@NonNull Collection list) {
158 | if (urlInfoList != null) {
159 | urlInfoList.addAll(list);
160 | BaseUrlUtil.put(context, list);
161 | }
162 | }
163 |
164 | @Override
165 | public void remove(@NonNull UrlInfo urlInfo) {
166 | if (urlInfoList != null) {
167 | urlInfoList.remove(urlInfo);
168 | BaseUrlUtil.remove(context, urlInfo.getBaseUrl());
169 | }
170 | }
171 |
172 | @Override
173 | public void clear() {
174 | if (urlInfoList != null) {
175 | urlInfoList.clear();
176 | }
177 | urlInfo = null;
178 | baseUrl = null;
179 | BaseUrlUtil.clear(context);
180 | }
181 |
182 | @Override
183 | public List getUrlInfoList() {
184 | return urlInfoList;
185 | }
186 |
187 |
188 | @Override
189 | public int getCount() {
190 | return urlInfoList != null ? urlInfoList.size() : 0;
191 | }
192 |
193 | @Override
194 | public void refreshData() {
195 | baseUrl = BaseUrlUtil.getBaseUrl(context);
196 | urlInfo = BaseUrlUtil.getUrlInfo(context, baseUrl);
197 | urlInfoList = BaseUrlUtil.getUrlInfoList(context);
198 | }
199 | }
200 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
11 |
16 |
21 |
26 |
31 |
36 |
41 |
46 |
51 |
56 |
61 |
66 |
71 |
76 |
81 |
86 |
91 |
96 |
101 |
106 |
111 |
116 |
121 |
126 |
131 |
136 |
141 |
146 |
151 |
156 |
161 |
166 |
171 |
172 |
--------------------------------------------------------------------------------
/base-url-manager/src/main/java/com/king/base/baseurlmanager/util/BaseUrlUtil.java:
--------------------------------------------------------------------------------
1 | package com.king.base.baseurlmanager.util;
2 |
3 | import android.content.Context;
4 | import android.content.SharedPreferences;
5 | import android.text.TextUtils;
6 |
7 | import com.king.base.baseurlmanager.bean.UrlInfo;
8 |
9 | import java.util.ArrayList;
10 | import java.util.Collection;
11 | import java.util.Collections;
12 | import java.util.List;
13 | import java.util.Map;
14 |
15 | import androidx.annotation.NonNull;
16 |
17 | /**
18 | * @author Jenly
19 | */
20 | public final class BaseUrlUtil {
21 |
22 | private static final String DEFAULT_PREF_NAME = "base_url_manager";
23 | private static final String CURRENT_URL_PREF_NAME = "cur_base_url";
24 | private static final String KEY_BASE_URL = "key_base_url";
25 |
26 | private BaseUrlUtil(){
27 | throw new AssertionError();
28 | }
29 |
30 | /**
31 | * 缓存String
32 | * @param context
33 | * @param key
34 | * @param value
35 | */
36 | public static void put(@NonNull Context context, @NonNull String key, Long value){
37 | getSharedPreferences(context).edit()
38 | .putLong(key,value)
39 | .commit();
40 | }
41 |
42 | /**
43 | * 缓存Map
44 | * @param context
45 | * @param map
46 | */
47 | public static void put(@NonNull Context context, Map map){
48 | if(map!=null){
49 | SharedPreferences.Editor editor = getSharedPreferences(context).edit();
50 |
51 | for(Map.Entry entry: map.entrySet()){
52 | if(!TextUtils.isEmpty(entry.getKey()))
53 | editor.putLong(entry.getKey(), entry.getValue());
54 | }
55 |
56 | editor.commit();
57 |
58 | }
59 | }
60 |
61 | /**
62 | * 缓存UrlInfo
63 | * @param context
64 | * @param urlInfo
65 | */
66 | public static void put(@NonNull Context context,@NonNull UrlInfo urlInfo){
67 | put(context,urlInfo,false);
68 | }
69 |
70 |
71 | /**
72 | * 缓存一个UrlInfo
73 | * @param context
74 | * @param urlInfo
75 | * @param isCurBaseUrl 是否设置为当前baseUrl
76 | */
77 | public static void put(@NonNull Context context,@NonNull UrlInfo urlInfo,boolean isCurBaseUrl){
78 | put(context,urlInfo.getBaseUrl(),urlInfo.getTime());
79 | if(isCurBaseUrl){
80 | getSharedPreferences(context,CURRENT_URL_PREF_NAME)
81 | .edit()
82 | .putString(KEY_BASE_URL,urlInfo.getBaseUrl())
83 | .commit();
84 | }
85 | }
86 |
87 | /**
88 | * 缓存UrlInfo结合
89 | * @param context
90 | * @param urlInfos
91 | */
92 | public static void put(@NonNull Context context, Collection urlInfos){
93 | if(urlInfos!=null && !urlInfos.isEmpty()){
94 | SharedPreferences.Editor editor = getSharedPreferences(context).edit();
95 |
96 | for(UrlInfo urlInfo : urlInfos){
97 | editor.putLong(urlInfo.getBaseUrl(),urlInfo.getTime());
98 | }
99 |
100 | editor.commit();
101 |
102 | }
103 | }
104 |
105 | /**
106 | * 移除指定的key
107 | * @param context
108 | * @param key
109 | */
110 | public static void remove(@NonNull Context context,String key){
111 | getSharedPreferences(context).edit()
112 | .remove(key)
113 | .commit();
114 | }
115 |
116 | /**
117 | * 清除缓存
118 | * @param context
119 | */
120 | public static void clear(@NonNull Context context){
121 | getSharedPreferences(context).edit().clear().commit();
122 | getSharedPreferences(context,CURRENT_URL_PREF_NAME).edit().clear().commit();
123 | }
124 |
125 | /**
126 | * 获取Long
127 | * @param context
128 | * @param key
129 | * @return
130 | */
131 | public static long getLong(Context context,@NonNull String key){
132 | SharedPreferences sp = getSharedPreferences(context);
133 | return sp.getLong(key,0);
134 | }
135 |
136 | /**
137 | * 获取UrlInfo
138 | * @param context
139 | * @param url
140 | * @return
141 | */
142 | public static UrlInfo getUrlInfo(Context context,@NonNull String url){
143 | long time = getLong(context,url);
144 | if(time>0){
145 | return new UrlInfo(url,time);
146 | }
147 | return new UrlInfo(url);
148 | }
149 |
150 | /**
151 | * 获取BaseUrl
152 | * @param context
153 | * @return
154 | */
155 | public static String getBaseUrl(Context context){
156 | return getSharedPreferences(context,CURRENT_URL_PREF_NAME).getString(KEY_BASE_URL,"");
157 | }
158 |
159 |
160 | /**
161 | * 获取当前的UrlInfo
162 | * @param context
163 | * @return
164 | */
165 | public static UrlInfo getBseUrlInfo(Context context){
166 | String baseUrl = getBaseUrl(context);
167 |
168 | UrlInfo urlInfo = null;
169 | if(!TextUtils.isEmpty(baseUrl)){
170 | urlInfo = getUrlInfo(context,baseUrl);
171 | }
172 | return urlInfo;
173 | }
174 |
175 | /**
176 | * 获取UrlInfo集合
177 | * @param context
178 | * @return
179 | */
180 | @NonNull
181 | public static List getUrlInfoList(@NonNull Context context){
182 | SharedPreferences sp = getSharedPreferences(context);
183 | List list = new ArrayList<>();
184 | try{
185 | Map map = (Map)sp.getAll();
186 | if(map!=null){
187 | for(Map.Entry entry : map.entrySet()){
188 | list.add(new UrlInfo(entry.getKey(),entry.getValue()));
189 | }
190 | }
191 | Collections.sort(list);
192 | }catch (Exception e){
193 | e.printStackTrace();
194 | }
195 |
196 | return list;
197 | }
198 |
199 | /**
200 | * 获取数据存储
201 | * @param context
202 | * @return
203 | */
204 | private static SharedPreferences getSharedPreferences(@NonNull Context context){
205 | return context.getSharedPreferences(DEFAULT_PREF_NAME, Context.MODE_PRIVATE);
206 | }
207 |
208 | /**
209 | * 获取数据存储
210 | * @param context
211 | * @param prefName
212 | * @return
213 | */
214 | private static SharedPreferences getSharedPreferences(@NonNull Context context,String prefName){
215 | return context.getSharedPreferences(prefName, Context.MODE_PRIVATE);
216 | }
217 | }
218 |
--------------------------------------------------------------------------------