diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000000..750e8ac81a
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/donate.png
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE/bug_report.md
similarity index 77%
rename from .github/ISSUE_TEMPLATE.md
rename to .github/ISSUE_TEMPLATE/bug_report.md
index daea781567..e29c2e45b6 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -1,8 +1,16 @@
+---
+name: Bug report
+about: Make AndroidUtilCode more perfect!
+labels: bug
+assignees: Blankj
+
+---
+
## Describe the bug
A clear and concise description of what the bug is.
-- The version of utilcode:
+- The version of AndroidUtilCode:
- The device:
- The version of device:
@@ -39,6 +47,6 @@ put the stack of crash here
If applicable, add screenshots to help explain your problem.
-Please delete the current line and the followings.
+## Please delete the current line and the following.
-Thank you for supporting [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode).
\ No newline at end of file
+Thank you for supporting [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode).
diff --git a/.github/ISSUE_TEMPLATE/bug_report_cn.md b/.github/ISSUE_TEMPLATE/bug_report_cn.md
new file mode 100644
index 0000000000..02ea0223e3
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report_cn.md
@@ -0,0 +1,52 @@
+---
+name: 提交 Bug
+about: 让工具类更完美!
+labels: bug
+assignees: Blankj
+
+---
+
+## 描述 Bug
+
+简洁地描述下 Bug。
+
+- AndroidUtilCode 的版本:
+- 出现 Bug 的设备型号:
+- 设备的 Android 版本:
+
+## 相关代码
+
+
+```
+put your code here
+```
+
+## 异常堆栈
+
+
+
+```
+put the stack of crash here
+```
+
+## 截图
+
+如果有的话请添加屏幕截图以帮助解释问题。
+
+
+## 请删除当前行及以下内容
+
+感谢支持 [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode).
diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md
new file mode 100644
index 0000000000..90a0fe1993
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature-request.md
@@ -0,0 +1,21 @@
+---
+name: Feature request
+about: Make AndroidUtilCode more perfect!
+labels: help wanted
+assignees: Blankj
+
+---
+
+## Describe the feature
+
+A clear and concise description of what the feature is.
+
+
+## Reference
+
+Hope to give some reference articles, links, code, if any.
+
+
+## Please delete the current line and the following
+
+Thank you for supporting [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode).
diff --git a/.github/ISSUE_TEMPLATE/feature-request_cn.md b/.github/ISSUE_TEMPLATE/feature-request_cn.md
new file mode 100644
index 0000000000..20862d047b
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature-request_cn.md
@@ -0,0 +1,21 @@
+---
+name: 提交需求
+about: 让工具类更健全!
+labels: help wanted
+assignees: Blankj
+
+---
+
+## 描述需求
+
+简洁地描述下需求。
+
+
+## 可借鉴的
+
+如果有的话,可以给出一些参考文章、链接、代码
+
+
+## 请删除当前行及以下内容
+
+感谢支持 [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode).
diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
new file mode 100644
index 0000000000..311fc1deaa
--- /dev/null
+++ b/.github/workflows/android.yml
@@ -0,0 +1,17 @@
+name: Android CI
+
+on: [push]
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: set up JDK 1.8
+ uses: actions/setup-java@v1
+ with:
+ java-version: 1.8
+ - name: Build with Gradle
+ run: ./gradlew build aR
diff --git a/.gitignore b/.gitignore
index 804ef71038..9d11f56a24 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,15 @@
*.iml
+__api__.json
+__bus__.json
.gradle
-/local.properties
+local.properties
.idea
.DS_Store
/build
/captures
.externalNativeBuild
-/apk
\ No newline at end of file
+/apk
+*.phrof
+/mavenLocal
+/reports
+*/reports
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index b4e77e194d..0000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-language: android
-jdk: oraclejdk8
-sudo: false
-
-android:
- components:
- - tools
- - platform-tools
- - build-tools-27.0.2
- - android-27
- - add-on
- - extra
-
- licenses:
- - 'android-sdk-license-.+'
-
- notifications:
- email: false
-
-before_install:
- - yes | $ANDROID_HOME/tools/bin/sdkmanager "build-tools;26.0.2"
-
-script:
- - ./gradlew build connectedCheck --info
diff --git a/update_log.md b/CHANGELOG.md
similarity index 55%
rename from update_log.md
rename to CHANGELOG.md
index 134b31319e..73e8145bf1 100644
--- a/update_log.md
+++ b/CHANGELOG.md
@@ -1,3 +1,161 @@
+* `22/10/15` [add] Fix some issue. Publish v1.31.1
+* `21/12/06` [add] Publish v1.31.0
+* `21/05/13` [add] Support publish mavenCentral.
+* `21/02/22` [add] Fix ToastUtils rtl bug. Publish v1.30.6.
+* `20/11/16` [add] Add ImageUtils#save2Album support param of dirName.
+* `20/11/13` [add] Fix MessengerUtils ANR. Add NetworkUtils#getWifiScanResult, [add|remove]OnWifiChangedConsumer. Publish v1.30.5.
+* `20/10/29` [add] Fix MessengerUtils startService IllegalStateException. Publish v1.30.4.
+* `20/10/28` [add] Fix BusUtils ConcurrentModificationException. Publish v1.30.3.
+* `20/10/27` [add] Fix AppUtils#getAppSignatures. Add DeviceUtils#isDevelopmentSettingsEnabled. Publish v1.30.2.
+* `20/10/26` [add] Fix AppUtils#isAppForeground. Publish v1.30.1.
+* `20/10/24` [add] Publish v1.30.0.
+* `20/10/23` [fix] LanguageUtils crash on some device.
+* `20/10/21` [add] LogUtils.Config#setOnConsoleOutputListener, setOnFileOutputListener, addFileExtraHead. LogUtils.getCurrentLogFilePath.
+* `20/10/20` [opt] ToastUtils.
+* `20/10/12` [add] PermissionUtils#explain.
+* `20/10/10` [add] ClipboardUtils.
+* `20/10/08` [add] VolumeUtils.
+* `20/09/06` [add] DebouncingUtils#isValid.
+* `20/09/04` [fix] ToastUtils adapt SDK 30.
+* `20/05/28` [fix] IntentUtils#getInstallAppIntent file exist wrong. Publish v1.29.0.
+* `20/05/23` [fix] BusUtils#postSticky times not right. Publish v1.28.6.
+* `20/05/22` [add] IntentUtils#getInstallAppIntent support Uri param.
+* `20/05/21` [add] Publish bus plugin v2.6. Publish api plugin v1.4. Publish. Publish v1.28.5.
+* `20/05/19` [fix] FileUtils#copyOrMoveDird NPE.
+* `20/05/18` [add] IntentUtils#getLaunchAppDetailsSettingsIntent support isNewTask.
+* `20/05/17` [add] ImageUtils#save2Album, NetworkUtils#getSSID, UtilsTransActivity4MainProcess.
+* `20/05/03` [add] Publish bus plugin v2.5. Publish api plugin v1.3. Publish. Publish v1.28.4.
+* `20/04/30` [add] BaseItem support partialUpdate.
+* `20/04/29` [add] Publish plugin lib com.blankj:base-transform:1.0.
+* `20/04/28` [fix] LanguageUtils#applyLanguage.
+* `20/04/27` [fix] BarUtils#isNavBarVisible.
+* `20/04/26` [fix] Utils#init fit tinker. Publish v1.28.3.
+* `20/04/25` [fix] UriUtils#uri2File Unknown URI. Publish 1.28.2.
+* `20/04/24` [add] SnackbarUtils support show on the top; UriUtils#uri2InputStream.
+* `20/04/23` [fix] UriUtils#uri2File not support HW; TransActivity crash below 21.
+* `20/04/23` [fix] PhoneUtils#getSerial, PhoneUtils#getSerial crash on Android 10.
+* `20/04/20` [fix] ImageUtils#isImage.
+* `20/04/18` [fix] PermissionUtils#callback. Publish v1.28.1.
+* `20/04/17` [fix] ImageUtils#view2Bitmap, ImageUtils.getBitmap(InputStream).
+* `20/04/16` [add] ConvertUtils#int2HexString, hexString2Int.
+* `20/04/15` [add] UiMessageUtils' demo.
+* `20/04/13` [add] NumberUtils. Publish v1.28.0.
+* `20/04/12` [opt] TimeUtils#SDF_THREAD_LOCAL.
+* `20/04/11` [add] SDCardUtils#getXxTotalSize, SDCardUtils#getXxAvailableSize. FileUtils#getFsTotalSize, FileUtils#getFsAvailableSize.
+* `20/04/10` [fix] FileUtils#isFileExists; FragmentUtils#getTop bug. Publish v1.27.6.
+* `20/04/09` [add] UriUtils#res2Uri, UriUtils#uri2File support QQBrowser; ThreadUtils#getMainHandler; PathUtils#getxxPathExternalFirst.
+* `20/04/08` [fix] ActivityUtils#finish bug. Publish v1.27.5.
+* `20/04/08` [fix] CleanUtils clean dir not work. FileUtils#isFileExists. Publish v1.27.4.
+* `20/04/08` [fix] CrashUtils DefaultUncaughtExceptionHandler is wrong; LogUtils write file failed; Utils#getApp failed run on remote process. Publish v1.27.3.
+* `20/04/07` [mdf] GsonUtils#getGson() method public.
+* `20/04/04` [fix] ShadowUtils bug running on lower version devices. Publish v1.27.2.
+* `20/04/03` [fix] UtilsActivityLifecycleImpl#HashMap#remove IllegalStateException bug.
+* `20/04/02` [fix] PathUtils sdcard enable state is wrong; ActivityUtils finish activity wrong; Publish v1.27.1.
+* `20/03/31` [add] Publish v1.27.0.
+* `20/03/30` [add] BatteryUtils in subutil.
+* `20/03/27` [add] publish.gradle.
+* `20/03/24` [add] UtilsBridge to clean the utils.
+* `20/03/22` [upd] GsonUtils support custom gson.
+* `20/03/20` [add] ActivityUtils#addActivityLifecycleCallbacks, ActivityUtils#removeActivityLifecycleCallbacks.
+* `20/01/17` [upd] Leak Canary to v2.1.
+* `20/01/06` [add] ClickUtils#expandClickArea, ClickUtils#back2HomeFriendly
+* `19/11/30` [add] Publish bus plugin v2.4. Publish api plugin v1.2.
+* `19/11/28` [add] Publish v1.26.0.
+* `19/11/27` [add] Shadow demo.
+* `19/11/26` [add] MVP demo.
+* `19/11/22` [fix] Adapt the project for Gradle version of 6.0.
+* `19/10/30` [add] Publish bus plugin v2.3. Publish api plugin v1.1.
+* `19/10/24` [upd] Demo's UI.
+* `19/10/22` [add] NotificationUtils and demo.
+* `19/10/20` [add] UiMessageUtils.
+* `19/09/20` [add] ShadowUtils.
+* `19/08/27` [add] DebugUtils.
+* `19/08/26` [fix] PermissionUtils NPE.
+* `19/08/25` [upd] ImageUtils#getImageType. [add] LogUtils#getLogFiles. Publish v1.25.9.
+* `19/08/24` [fix] PhoneUtils#getIMEI crash on SDK 29.
+* `19/08/23` [add] ViewUtils#isLayoutRtl.
+* `19/08/22` [add] LogUtils#getLogFiles.
+* `19/08/13` [add] MapUtils and MapUtilsTest. Publish v1.25.8.
+* `19/08/12` [add] CollectionUtils and CollectionUtilsTest.
+* `19/08/11` [add] ArrayUtils and ArrayUtilsTest.
+* `19/08/09` [fix] https://www.virustotal.com/gui/home/upload with ESET-NOD32. Publish v1.25.7.
+* `19/08/08` [add] BusUtils#post tag support one-to-many. Publish v1.25.6.
+* `19/08/04` [add] ThreadUtils#Task support timeout.
+* `19/08/01` [upd] EncryptUtils#rsa.
+* `19/07/31` [add] DeviceUtils#getUniqueDeviceId, DeviceUtils#isSameDevice. Publish v1.25.5.
+* `19/07/30` [fix] ThreadUtils's task can only be executed once. PhoneUtils#getIMEI wrong.
+* `19/07/29` [fix] BusUtils post father class useless. KeyboardUtils#hideSoft bug. Publish v1.25.4.
+* `19/07/28` [add] NetworkUtils#(un)registerNetworkStatusChangedListener. Publish v1.25.3.
+* `19/07/27` [fix] ThreadUtils memory leak.
+* `19/07/26` [add] ContainerUtils. Publish v1.25.2.
+* `19/07/25` [fix] PermissionUtils' NullPointException.
+* `19/07/24` [fix] ZipUtils#unzipFile.
+* `19/07/23` [fix] ThreadUtils of cache pool. Publish v1.25.1.
+* `19/07/18` [add] README of ApiUtils and BusUtils.
+* `19/07/15` [add] Publish v1.25.0.
+* `19/07/14` [upd] Bus plugin for use BusUtils. Publish bus plugin v2.0.
+* `19/07/13` [add] Api plugin for use ApiUtils. Publish api plugin v1.0.
+* `19/07/09` [upd] The frame of project.
+* `19/07/06` [upd] BusUtils which behave same as EventBus.
+* `19/07/03` [add] ApiUtils which decoupling modules.
+* `19/06/30` [add] LanguageUtils support activity's class name.
+* `19/06/29` [add] ClickUtils#OnMultiClickListener, and remove dangerous function. Publish v1.24.6.
+* `19/06/28` [add] LanguageUtils. Publish v1.24.5.
+* `19/06/20` [fix] BusUtils' permission. Publish v1.24.4.
+* `19/06/19` [fix] UriUtils. Publish v1.24.3.
+* `19/06/18` [add] ClickUtils, ViewUtils.
+* `19/06/07` [fix] LogUtils file name contains ':'. Publish v1.24.2.
+* `19/06/06` [fix] LogUtils write to file. Publish v1.24.1.
+* `19/06/03` [fix] Refactoring framework. Publish v1.24.0.
+* `19/04/25` [fix] LogUtils delete due log.
+* `19/04/24` [upd] The swipe panel.
+* `19/03/17` [fix] The ugly UI.
+* `19/03/14` [fix] AdaptScreenUtils didn't work on some HaWei tablet.
+* `19/03/09` [fix] UriUtils#uri2File.
+* `19/03/08` [add] LogUtils support multi process. Publish v1.23.7.
+* `19/03/02` [fix] LogUtils#file.
+* `19/02/28` [fix] ImageUtils#calculateInSampleSize. Publish v1.23.6.
+* `19/02/26` [fix] UriUtils#uri2File. Publish v1.23.5.
+* `19/01/31` [add] HttpUtils.
+* `19/01/30` [add] RomUtils. Publish v1.23.4.
+* `19/01/29` [fix] LogUtils format json when json not start with '{'. Publish v1.23.3.
+* `19/01/28` [fix] KeyboardUtils#fixSoftInputLeaks don't work on the device of HuaWei.
+* `19/01/26` [fix] NetworkUtils#getNetworkType.
+* `19/01/25` [add] CloneUtils, PermissionUtils support request permission of WRITE_SETTINGS and DRAW_OVERLAYS. Publish v1.23.2.
+* `19/01/24` [add] BrightnessUtils and FlashlightUtils.
+* `19/01/23` [add] Modify the demo of utilcode use kotlin. Publish v1.23.1.
+* `19/01/22` [fix] AppUtils#installApp.
+* `19/01/17` [fix] Publish v1.23.0.
+* `19/01/16` [fix] BarUtils get Activity from view and delete the function of set status bar alpha.
+* `19/01/15` [add] ColorUtils.
+* `19/01/04` [add] CacheDiskStaticUtils, CacheDoubleStaticUtils, CacheMemoryStaticUtils.
+* `19/01/03` [add] SPStaticUtils.
+* `19/01/02` [fix] LogUtils log object. Publish v1.22.10.
+* `19/01/01` [add] GsonUtils.
+* `18/12/29` [add] AntiShakeUtils and VibrateUtils. Publish v1.22.9.
+* `18/12/28` [fix] ToastUtils show behind the dialog when close notification.
+* `18/12/27` [fix] LogUtils print StringBuilder failed.
+* `18/12/24` [fix] Utils$ActivityLifecycleImpl.consumeOnActivityDestroyedListener ConcurrentModificationException. Publish v1.22.7.
+* `18/12/22` [fix] AdaptScreenUtils#pt2px don't work when start webview. Publish v1.22.6.
+* `18/12/21` [add] LogUtils support print Map, Collection and Object to String.
+* `18/12/19` [fix] AdaptScreenUtils don't work in MIUI on Android 5.1.1. Publish v1.22.5.
+* `18/12/18` [fix] ToastUtils multi show crash when run API 25. Publish v1.22.4.
+* `18/12/18` [fix] ImageUtils recycle ret equals src. Publish v1.22.3.
+* `18/12/17` [fix] Utils$FileProvider4UtilCode not found. Publish v1.22.3.
+* `18/12/17` [fix] ToastUtils leak. Publish v1.22.2.
+* `18/12/09` [add] Component for the project.
+* `18/12/04` [add] BusUtils. Publish v1.22.1.
+* `18/11/18` [fix] ToastUtils don't show in the devices grater than API 24 when close the permission of notification. Publish v1.22.0.
+* `18/11/17` [fix] AppUtils#isAppInstalled don't work in no launcher app.
+* `18/11/16` [fix] ThreadUtils#cancel block the main thread.
+* `18/11/15` [add] module of bus-gradle-plugin and change style of gradle.
+* `18/11/14` [add] BusUtils.
+* `18/11/13` [add] AdaptScreenUtils.
+* `18/11/12` [fix] SPUtils bug when use in multi threads.
+* `18/10/25` [fix] SpanUtils#setLineHeight bug of multi lines. Publish v1.21.2.
+* `18/10/24` [fix] SpanUtils#appendImage on VIVO. Publish v1.21.1.
+* `18/10/16` [add] BusUtils, DeviceUtils#isAdbEnabled. Publish v1.21.0.
+* `18/09/29` [fix] ToastUtils which causes crash in the some devices of Xiaomi. Publish v1.20.4.
* `18/09/13` 修复 ToastUtils 在小米手机显示 Toast 带有 App 名,发布 1.20.3
* `18/09/12` 修复 KeyBoardUtils#fixAndroidBug5497,完善 ToastUtils,发布 1.20.2
* `18/09/11` 新增 BarUtils#isSupportNavBar,删除 BarUtils#setNavBarImmersive
@@ -10,7 +168,7 @@
* `18/08/28` 新增 RegexUtils#isIDCard18Exact
* `18/08/26` 新增 AppUtils#getAppSignatureSHA256 和 AppUtils#getAppSignatureMD5,发布 1.19.3
* `18/08/24` 新增 ScreenUtils#restoreAdaptScreen,利用 FileProvider4UtilCode 不再需要初始化,发布 1.19.2
-* `18/08/23` 修复适配后 ToastUtils 原生 Toast 尺寸发生改变的问题,修复 KeyboardUtils#fixSoftInputLeaks,发布 1.19.1
+* `18/08/23` 修复 适配后 ToastUtils 原生 Toast 尺寸发生改变的问题,修复 KeyboardUtils#fixSoftInputLeaks,发布 1.19.1
* `18/08/10` 修复 ScreenUtils#adaptxx 导致获取状态栏和导航栏尺寸不对问题,发布 1.19.0
* `18/08/09` 新增 IntentUtils#isIntentAvailable,ToastUtils 传入空显示 null,发布 1.18.6
* `18/08/08` 修复 ScreenUtils#adaptxx 在第三方 SDK 会出现的问题,发布 1.18.5
@@ -20,7 +178,7 @@
* `18/08/04` 新增 LogUtils#Config#setSaveDays,发布 1.18.1
* `18/08/03` 新增 LogUtils#Config#addFormatter,并新增 Array, Throwable, Bundle, Intent 的格式化输出
* `18/08/02` 修复 TimeUtils 中的 SimpleDateFormat 为 ThreadLocal 实现
-* `18/08/01` 删除标记废弃的 CacheUtils, AppUtils#installApp, TimeUtils#getWeekIndex,发布 1.18.0
+* `18/08/01` 删除 标记废弃的 CacheUtils, AppUtils#installApp, TimeUtils#getWeekIndex,发布 1.18.0
* `18/07/30` 替换 ScreenUtils#adaptPortraitScreen 和 ScreenUtils#adaptLandscapeScreen,为 ScreenUtils#adaptScreen4VerticalSlide 和 ScreenUtils#adaptScreen4HorizontalSlide
* `18/07/28` 修复 NetworkUtils#getIPAddress
* `18/07/16` 新增 ScreenUtils#adaptPortraitScreen 和 ScreenUtils#adaptLandscapeScreen,发布 1.17.3
@@ -44,8 +202,8 @@
* `18/05/02` 修复 PermissionUtils 空异常,发布 1.14.2 版本
* `18/04/28` 新增 FlashlightUtils,发布 1.14.1 版本
* `18/04/26` 修复 KeyboardUtils 全屏 NO_LIMIT 的 bug
-* `18/04/25` 修复多个空异常
-* `18/04/24` 修复多 FileProvider 带来的问题,发布 1.14.0 版本
+* `18/04/25` 修复 多个空异常
+* `18/04/24` 修复 多 FileProvider 带来的问题,发布 1.14.0 版本
* `18/04/23` 新增 RSA 加解密,发布 1.13.16 版本
* `18/04/22` 新增 LogUtils 设置栈偏移
* `18/04/21` 新增 AppUtils#relaunchApp、DeviceUtils#getABIs,发布 1.13.15 版本
@@ -55,8 +213,8 @@
* `18/04/17` 修复 ToastUtils 内存泄漏问题,感谢 [LambertCoding](https://github.com/LambertCoding),发布 1.13.12 版本
* `18/04/16` 完善 AppUtils#installAppSilent 路径包含空格问题,发布 1.13.11 版本
* `18/04/10` 完善 OnCrashListener 回调崩溃信息,发布 1.13.10 版本
-* `18/04/09` 修复静默安装重载错误,发布 1.13.9 版本
-* `18/04/08` 修复获取栈顶 Activity 链表为空的异常,获取栈顶 Activity 放到 Utils 中,发布 1.13.8 版本
+* `18/04/09` 修复 静默安装重载错误,发布 1.13.9 版本
+* `18/04/08` 修复 获取栈顶 Activity 链表为空的异常,获取栈顶 Activity 放到 Utils 中,发布 1.13.8 版本
* `18/04/06` 新增 GsonUtils 及单元测试
* `18/04/05` 完善 README 文档
* `18/04/03` 修复 LogUtils 在 Android Studio 3.1 版本日志丑陋的问题,发布 1.13.7 版本
@@ -66,7 +224,7 @@
* `18/03/14` 修复 KeyboardUtils#getContentViewInvisibleHeight,发布 1.13.4 版本
* `18/03/10` 完善 AppUtils#installAppSilent 和 DeviceUtils#getMacAddress,发布 1.13.3 版本
* `18/03/09` 完善 ActivityUtils#getTopActivity
-* `18/03/08` 新增反射获取栈顶 Activity 的方法,发布 1.13.2 版本
+* `18/03/08` 新增 反射获取栈顶 Activity 的方法,发布 1.13.2 版本
* `18/03/07` 修复 PermissionUtils 请求权限为 0 的 崩溃
* `18/03/05` 修复 Library Source does not match the bytecode for class LogUtils 问题,发布 1.13.1 版本
* `18/03/04` 完善 Javadoc 中文版为英文版,发布 1.13.0 版本
@@ -83,7 +241,7 @@
* `18/02/22` 完善 Javadoc 中文版为英文版
* `18/02/21` 完善 Javadoc 中文版为英文版
* `18/02/10` 完善 Javadoc 中文版为英文版
-* `18/02/09` 完善非空转换插件 traute 的使用方式
+* `18/02/09` 完善 非空转换插件 traute 的使用方式
* `18/02/08` 修复 ActivityUtils option 低版本为空的异常
* `18/01/31` 修复 default 相关的逻辑错误,发布 1.12.4,修复 ToastUtils 在 kotlin 中转义失败,发布 1.12.5
* `18/01/28` 修复 ToastUtils 默认样式问题,发布 1.12.2,新增 DeviceUtils#getSDKVersionName,发布 1.12.3
@@ -100,8 +258,8 @@
* `18/01/08` 新增 SPActivity,删除 SPUtils 的单元测试
* `18/01/08` 修复 ToastUtils 在 SDK 为 18 的自定义 toast 崩溃问题
* `18/01/07` 新增 PermissionUtils 的 Demo
-* `18/01/06` 修复权限相关工具类内存泄漏问题
-* `18/01/05` 新增获取 Activity icon 和 logo
+* `18/01/06` 修复 权限相关工具类内存泄漏问题
+* `18/01/05` 新增 获取 Activity icon 和 logo
* `18/01/04` 完善 6.0 动态权限相关工具类
* `18/01/03` 完善 6.0 动态权限相关工具类
* `18/01/02` 完善 6.0 动态权限相关工具类
@@ -109,13 +267,13 @@
* `17/12/30` 删除 SpanUtils 中设置图标
* `17/12/29` 完善 SpanUtils 的 appendImage 对齐方式
* `17/12/28` 完善 ScreenUtils 设置全屏的方式,发布 1.10.0
-* `17/12/26` 新增状态栏、导航栏设置是否可见和判断是否可见
-* `17/12/22` 新增注册软键盘改变监听器、注册导航栏改变监听器方法
-* `17/12/21` 完善获取屏幕宽高,修复行宽度大于 100 字符
+* `17/12/26` 新增 状态栏、导航栏设置是否可见和判断是否可见
+* `17/12/22` 新增 注册软键盘改变监听器、注册导航栏改变监听器方法
+* `17/12/21` 完善 获取屏幕宽高,修复行宽度大于 100 字符
* `17/12/20` 修复 SpanUtils 图标的 bug,不高于 6.0 的版本不支持居中和底部对齐
* `17/12/19` 修复 SpanUtils 多图的 bug
* `17/12/15` 新增 ReflectUtils
-* `17/12/14` 完善手机号(精确)正则,发布 1.9.12
+* `17/12/14` 完善 手机号(精确)正则,发布 1.9.12
* `17/12/12` 完善 LogUtils,当最终日志长度为 0 时,输出 log nothing
* `17/12/11` 完善 ActivityUtils 的 finish 系列,发布 1.9.11
* `17/12/04` 完善 LogUtils 边框改为单线清爽型
@@ -123,7 +281,7 @@
* `17/11/30` 修复 ToastUtils 获取背景为空,发布 1.9.9
* `17/11/28` 修复 EmptyUtils 对 CharSequence 的判断,感谢 jiezigg
* `17/11/24` 新增 readme 格式化的 gradle 脚本
-* `17/11/15` 完善资源分包位置,使其更合理
+* `17/11/15` 完善 资源分包位置,使其更合理
* `17/11/10` 完善 LogUtils 新增日志头部,感谢 Kanade
* `17/11/07` 完善 LogUtils 无 tag 的多参数
* `17/11/06` 修复 LogUtils 多参数打印失败的问题
@@ -131,7 +289,7 @@
* `17/10/30` 完善 README
* `17/10/29` 修复 6.0 内部存储安装失败问题
* `17/10/28` 完善 compile 为 implementation, provided 为 compileOnly
-* `17/10/27` 修复兼容 AS3.0
+* `17/10/27` 修复 兼容 AS3.0
* `17/10/27` 修复 LogUtils 在 kotlin 中使用的问题
* `17/10/25` 修复 LogUtils 边框,修复 getBitmap 从流获取
* `17/09/30` 完善 FragmentUtils,发布 1.9.2
@@ -149,19 +307,19 @@
* `17/09/13` 完善 ImageUtils 的 toRound
* `17/09/13` 完善 ImageUtils 和 LogUtils
* `17/09/12` 完善 ImageUtils
-* `17/09/10` 完善单元测试
-* `17/09/08` 完善单元测试
+* `17/09/10` 完善 单元测试
+* `17/09/08` 完善 单元测试
* `17/09/06` 完善 SDCardUtils 获取 SD 卡路径,完善 SPUtils 新增 commit
* `17/09/05` 完善 LogUtils,发布版本 1.9.0
* `17/09/04` 完善 ToastUtils,去除相关 safe 函数,都改为 safe 实现,新增 CustomToast 的 Demo
* `17/09/02` 完善 ToastUtils,去除引入 view 带来的问题,发布版本 1.8.6
* `17/08/30` 修复 ToastUtils 弱引用带来的问题,修复 CacheUtils 异步问题,发布版本 1.8.5
* `17/08/28` 修复 ToastUtils 内存泄露,新增 toast 可根据系统字体显示不同字体,发布版本 1.8.4
-* `17/08/20` 新增监听 Activity 生命周期,退出 App,发布版本 1.8.3
+* `17/08/20` 新增 监听 Activity 生命周期,退出 App,发布版本 1.8.3
* `17/08/11` 完善 LogUtils 的 Builder 改为 Config,发布版本 1.8.2
* `17/08/10` 完善 FileUtils 的 deleteFilesInDir 和 listFilesInDir
-* `17/08/08` 新增反射工具类 ReflectUtils
-* `17/08/06` 完善为按功能分包,增加 subutil 的 Demo
+* `17/08/08` 新增 反射工具类 ReflectUtils
+* `17/08/06` 完善 为按功能分包,增加 subutil 的 Demo
* `17/07/31` 修复 NetworkUtils 的 isAvailableByPing 循环递归,发布 1.8.1
* `17/07/31` 完善 BarUtils,发布 1.8.0
* `17/07/31` 完善 BarUtils
@@ -177,14 +335,14 @@
* `17/07/21` 完善 xml 文件的格式化
* `17/07/17` 完善 NetworkUtils 的 isAvailableByPing 函数新增 ip 参数
* `17/07/14` 修复 FragmentUtils 的 FragmentNode 为 public
-* `17/07/11` 完善将不常用的工具类放在 subutil 中
+* `17/07/11` 完善 将不常用的工具类放在 subutil 中
* `17/07/10` 新增 subutil 库
* `17/07/07` 修复 TimeUtils 中获取当天零点的 bug
* `17/07/02` 完善 BarUtils 的 Demo
* `17/07/01` 完善 BarUtils 的 Demo
* `17/06/30` 完善 BarUtils 的 Demo
-* `17/06/29` README 新增 logo
-* `17/06/28` 新增返回键及右划返回
+* `17/06/29` 新增 README logo
+* `17/06/28` 新增 返回键及右划返回
* `17/06/27` 新增 Toolbar
* `17/06/26` 新增 final 参数
* `17/06/23` 完善 Demo 主页
@@ -208,7 +366,7 @@
* `17/05/27` 修复 CacheUtils 的 bug,发布 1.6.2
* `17/05/26` 完善 CacheUtils,发布 1.6.0 和 1.6.1
* `17/05/25` 完善 FileIOUtils 和 CacheUtils
-* `17/05/23` 新增读取文件到字符数组中两种方式
+* `17/05/23` 新增 读取文件到字符数组中两种方式
* `17/05/19` 新增 LogUtils 文件过滤和控制台开关
* `17/05/16` 新增 ActivityUtils 动画
* `17/05/12` 新增 base 系列
@@ -216,12 +374,12 @@
* `17/05/10` 完善 7.0 安装 App,完善 AppActivity
* `17/05/09` 完善 TimeUtils 单元测试
* `17/05/08` 更新 BarUtils, LogUtils 新增配置文件,TimeUtils 将 pattern 改为 format,发布 1.5.0
-* `17/05/04` 新增签名
-* `17/05/03` 修复对齐头部日期
+* `17/05/04` 新增 签名
+* `17/05/03` 修复 对齐头部日期
* `17/05/02` 完善 Demo 的 string 字符串变更,完善 ToastUtils 和 SnackbarUtils
* `17/04/27` 新增 Travis CI,使用 shields,发布 1.4.1
* `17/04/26` 完善 HandlerUtils 使用 Handler#CallBack 的回调接口及 SpannableStringUtils 图片对齐
-* `17/04/24` 修复拼写错误,修复 StringUtils 的 equalsIgnoreCase
+* `17/04/24` 修复 拼写错误,修复 StringUtils 的 equalsIgnoreCase
* `17/04/23` 完善 README
* `17/04/21` 完善 TimeUtils,发布 1.4.0
* `17/04/20` 新增 SpannableStringUtils 设置字体尺寸
@@ -230,9 +388,9 @@
* `17/03/26` 更新 LogUtils
* `17/03/25` 更新 LogUtils
* `17/03/24` 完善 StringUtils
-* `17/03/20` 修复链接错误
+* `17/03/20` 修复 链接错误
* `17/03/19` 新增 LogUtils 栈回溯
-* `17/03/14` 新增常量包
+* `17/03/14` 新增 常量包
* `17/02/14` 完善 FragmentUtils 中,Demo 测试中
* `17/02/13` 完善 FragmentUtils 中
* `17/02/12` 完善 FragmentUtils 中
@@ -247,28 +405,28 @@
* `17/02/03` 完善 FragmentUtils 中
* `17/02/02` 完善 FragmentUtils 中
* `17/02/01` 完善 FragmentUtils 中
-* `17/01/24` 完善并发布版本 1.3.6
+* `17/01/24` 完善 并发布版本 1.3.6
* `17/01/16` 新增 LogUtils 打印类名函数名及所在行
-* `17/12/26` 新增阴历相关工具类
+* `17/12/26` 新增 阴历相关工具类
* `17/12/21` 完善 SpannableStringUtils
* `16/12/19` 完善 SpannableStringUtils
* `16/12/18` 完善 SpannableStringUtils,采用构造者模式
* `16/12/17` 完善 SpannableStringUtils
-* `16/12/16` 完善拼音工具类
-* `16/12/15` 完善拼音工具类
-* `16/12/14` 新增不低于 7.0 的 Html 解码
-* `16/12/13` 新增获取文件最后修改时间
+* `16/12/16` 完善 拼音工具类
+* `16/12/15` 完善 拼音工具类
+* `16/12/14` 新增 不低于 7.0 的 Html 解码
+* `16/12/13` 新增 获取文件最后修改时间
* `16/12/12` 新增 Utils 来做初始化 context
-* `16/12/10` 完善权限中
+* `16/12/10` 完善 权限中
* `16/12/09` 新增 6.0 以上权限判断
* `16/12/07` 修复升级到 6.0 bug 中
* `16/12/06` 完善 FlashlightUtils 中
* `16/12/05` 完善 FlashlightUtils 兼容 Api21 之后
* `16/12/04` 新增 FlashlightUtils
-* `16/12/03` 完善时间工具类
-* `16/12/02` 新增获取合适型时间差
-* `16/12/01` 新增获取生肖和星座
-* `16/11/30` 新增获取友好型时间差
+* `16/12/03` 完善 时间工具类
+* `16/12/02` 新增 获取合适型时间差
+* `16/12/01` 新增 获取生肖和星座
+* `16/11/30` 新增 获取友好型时间差
* `16/11/23` 完善 LocationUtils 测试,发布 1.3.4
* `16/11/22` 修复 LocationActivity 内存泄漏
* `16/11/21` 完善 README
@@ -276,29 +434,29 @@
* `16/11/19` 完善 SizeUtils
* `16/11/18` 完善 LocationUtils
* `16/11/17` 完善 LocationUtils
-* `16/11/16` 新增拼音工具类,单独拎出来做了整理
-* `16/11/15` 完善正则工具类
-* `16/11/14` 新增启动服务
-* `16/11/13` 新增判断 sim 卡是否准备好
-* `16/11/12` 新增重启到 recovery 和 bootloader,新增获取 launcher activity,最近一直在博客搬家,所以更得有点少
+* `16/11/16` 新增 拼音工具类,单独拎出来做了整理
+* `16/11/15` 完善 正则工具类
+* `16/11/14` 新增 启动服务
+* `16/11/13` 新增 判断 sim 卡是否准备好
+* `16/11/12` 新增 重启到 recovery 和 bootloader,新增获取 launcher activity,最近一直在博客搬家,所以更得有点少
* `16/11/04` 修复 README 的缺少 process 的 bug
* `16/11/03` 修复 SnackbarUtils 中 Snackbar 持有弱引用来消除内存泄漏
-* `16/11/02` 修复内存泄漏中
-* `16/11/01` 完善发布版本 1.3.3 内存泄漏检测中
-* `16/10/31` 完善发布版本 1.3.1 和 1.3.2
-* `16/10/30` 修复获取 IpAddress 对于小米手机的 Bug
-* `16/10/29` 新增文件重命名和完善 root
-* `16/10/23` 完善测试中
-* `16/10/22` 完善测试中
-* `16/10/21` 完善测试中
-* `16/10/20` 完善测试中
-* `16/10/19` 修复判断网络是否可用
-* `16/10/18` 完善是否前台应用,完善网络状态
-* `16/10/17` 修复获取签名,完善是否前台应用,完善网络状态
+* `16/11/02` 修复 内存泄漏中
+* `16/11/01` 完善 发布版本 1.3.3 内存泄漏检测中
+* `16/10/31` 完善 发布版本 1.3.1 和 1.3.2
+* `16/10/30` 修复 获取 IpAddress 对于小米手机的 Bug
+* `16/10/29` 新增 文件重命名和完善 root
+* `16/10/23` 完善 测试中
+* `16/10/22` 完善 测试中
+* `16/10/21` 完善 测试中
+* `16/10/20` 完善 测试中
+* `16/10/19` 修复 判断网络是否可用
+* `16/10/18` 完善 是否前台应用,完善网络状态
+* `16/10/17` 修复 获取签名,完善是否前台应用,完善网络状态
* `16/10/16` 新增 SnackbarUtils
* `16/10/15` 完善 AppUtils 的 isAppForeground
* `16/10/14` 完善 README-CN 排版(强迫症一定要对齐)
-* `16/10/13` 完善测试
+* `16/10/13` 完善 测试
* `16/10/12` 新增 LogUtils 建造者模式,新增获取星期,发布版本 1.3.0,cheer
* `16/10/11` 新增 EncryptUtils 的 Hmac 系列加密
* `16/10/10` 完善 LogUtils
@@ -314,22 +472,22 @@
* `16/09/29` 完善 CleanUtils 测试完毕
* `16/09/28` 新增 EmptyUtils,完善 AppUtils 完毕
* `16/09/27` 新增 CleanUtils,完善 AppUtils
-* `16/09/26` 新增根据域名获取 ip 地址(在此感谢 jp1017),新增 ClipboardUtils 单元测试,对 ImageUtils 进行了 bug 修复
+* `16/09/26` 新增 根据域名获取 ip 地址(在此感谢 jp1017),新增 ClipboardUtils 单元测试,对 ImageUtils 进行了 bug 修复
* `16/09/25` 新增 ClipboardUtils
* `16/09/24` 完善 AppUtils
-* `16/09/23` 完善工具类,新增 ActivityUtils、BarUtils、IntentUtils
+* `16/09/23` 完善 工具类,新增 ActivityUtils、BarUtils、IntentUtils
* `16/09/22` 完善 LogUtils 中
* `16/09/21` 新增 LogUtils
-* `16/09/20` 完善昨天的单元测试
+* `16/09/20` 完善 昨天的单元测试
* `16/09/19` 新增 CameraUtils,新增获取中文首字母
-* `16/09/18` 修复少许代码,发布 1.2.1
+* `16/09/18` 修复 少许代码,发布 1.2.1
* `16/09/15` 完善 Happy Mid-Autumn Festival!
* `16/09/14` 完善 ImageUtils 完毕,完善了 6.0 及以上版本安装 App 的问题,发布版本 1.2.0
-* `16/09/13` 新增英文版 README
+* `16/09/13` 新增 英文版 README
* `16/09/12` 完善 ZipUtils 及单元测试完美谢幕(支持空文件夹)
-* `16/09/11` 完善不断更
+* `16/09/11` 完善 不断更
* `16/09/10` 完善 ZipUtils 和单元测试中
-* `16/09/09` 新增字符串反转,ImageUtils 单元测试卡住中,暂时换为真机测试
+* `16/09/09` 新增 字符串反转,ImageUtils 单元测试卡住中,暂时换为真机测试
* `16/09/08` 修复 NetworkUtils 报空,ImageUtils 单元测试卡住中
* `16/08/31` 完善 ImageUtils 单元测试中,之后 7 天鸡儿岭放假,停更
* `16/08/30` 完善 ImageUtils 单元测试(获取保存图片有问题,卡卡卡住了)
@@ -342,7 +500,7 @@
* `16/08/23` 修复 bug,接下来完善 SDCardUtils 和 ImageUtils
* `16/08/22` 完善 SPUtils 将 commit 改为 apply 提高效率,将 SPUtils 改为构造函数法创建,FileUtils 新增查找函数,规范 JavaDoc
* `16/08/21` 完善 FileUtils 单元测试,修复 FileUtils 的 bug,发布版本 1.1.2
-* `16/08/20` 完善目录、FileUtils 单元测试,发布版本 1.1.1
+* `16/08/20` 完善 目录、FileUtils 单元测试,发布版本 1.1.1
* `16/08/19` 完善 FileUtils 及单元测试,及其他小修小补(在此感谢 vpop 的三次 Pr)
* `16/08/18` 完善 FileUtils 及单元测试,完善 ImageUtils
* `16/08/17` 完善 FileUtils
@@ -352,13 +510,13 @@
* `16/08/13` 新增 MD2,SHA224,SHA256,SHA384,SHA512 加密及单元测试,正折腾 DES 加密
* `16/08/12` 新增 Base64 和 Html 编码解码及他们的单元测试,新增 TimeUtils 单元测试,更新 md
* `16/08/11` 新增 SDCardUtils, UnitUtils,单元测试慢慢完善中
-* `16/08/09` 修复目录排版,新增 Download, Proguard 和 License
+* `16/08/09` 修复 目录排版,新增 Download, Proguard 和 License
* `16/08/08` 新增 Shell 工具类,已传 jcenter 遇到好多坑,javaDoc 惹的祸,注释一定要规范
* `16/08/07` 新增 6.0 获取 Mac 地址方法,新增对 HTML 转义,新增编码解码工具类,新增 SP 工具类
-* `16/08/06` 完善名包名,新增加密相关的单元测试,MD5 加密新增文件加密重载
+* `16/08/06` 完善 名包名,新增加密相关的单元测试,MD5 加密新增文件加密重载
* `16/08/05` 新增 MD5 盐加密,完善 NetworkUtils,新增判断状态栏是否存在(在此感谢 tiandawu)
-* `16/08/04` 新增时间工具类(在此感谢 yi520000 给的补充),手机正则分简单和精确(在此感谢 MIkeeJY),新增判断是否锁屏,注释分段落,目录按首字母排序
+* `16/08/04` 新增 时间工具类(在此感谢 yi520000 给的补充),手机正则分简单和精确(在此感谢 MIkeeJY),新增判断是否锁屏,注释分段落,目录按首字母排序
* `16/08/03` 修复 onCreate 中获取 view 尺寸的 bug, MD5 和 SHA 的 Bug 修复完成(在此感谢 ssyijiu)
* `16/08/02` 修复 wifi 设置界面 bug,注释排版还在修改,获取 mac 地址增加判空,新增 QQ群:74721490,欢迎加入,新增隐藏状态栏,注释更加全面,工具类已封装,写的时候真的是一个一个测试过去的,宝宝心里苦
-* `16/08/01` 新增获取 SD 卡路径,手机和设备进行分类,代码 bug 修改部分,小修排版,正在封装类,新增目录中显示方法名,新增获取当前 App 版本 Code
-* `16/07/31` 新增点击屏幕空白区域隐藏软键盘,未能成功增加本页目录跳转功能(不支持)
+* `16/08/01` 新增 获取 SD 卡路径,手机和设备进行分类,代码 bug 修改部分,小修排版,正在封装类,新增目录中显示方法名,新增获取当前 App 版本 Code
+* `16/07/31` 新增 点击屏幕空白区域隐藏软键盘,未能成功增加本页目录跳转功能(不支持)
diff --git a/README-CN.md b/README-CN.md
index 0de1d22303..5c85dca1fe 100644
--- a/README-CN.md
+++ b/README-CN.md
@@ -1,6 +1,8 @@
-![logo][logo]
+[![logo][logo]](https://github.com/Blankj/AndroidUtilCode)
-[![auc][aucsvg]][auc] [![api][apisvg]][api] [![build][buildsvg]][build] [![Insight][insightsvg]][insight] [![License][licensesvg]][license]
+[![frame][frame]](https://github.com/Blankj/AucFrameTemplate)
+
+[![auc][aucSvg]][auc] [![result][apiSvg]][result] [![build][buildSvg]][build] [![License][licenseSvg]][license]
## [README of English][readme]
@@ -32,51 +34,54 @@
## Contact
-[![Blog][blogsvg]][blog] [![jianshu][jianshusvg]][jianshu] [![weibo][weibosvg]][weibo] [![QQGroup][qqgroupsvg]][qqgroup]
+[![Blog][blogSvg]][blog] [![jianshu][jianshuSvg]][jianshu] [![weibo][weiboSvg]][weibo] [![QQGroup][qqgroupSvg]][qqgroup]
+
+
+## [Change Log][changeLog.md]
-## [Update Log][update_log.md]
+## 打个小广告
+欢迎加入我的小专栏「**[基你太美](https://xiaozhuanlan.com/Blankj)**」一起学习。
[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png
-[aucsvg]: https://img.shields.io/badge/AndroidUtilCode-v1.20.3-brightgreen.svg
+[frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame_cn.png
+
+[aucSvg]: https://github.com/Blankj/AndroidUtilCode/workflows/Android%20CI/badge.svg?branch=master
[auc]: https://github.com/Blankj/AndroidUtilCode
-[apisvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
-[api]: https://android-arsenal.com/api?level=14
+[apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
+[result]: https://android-arsenal.com/result?level=14
-[buildsvg]: https://travis-ci.org/Blankj/AndroidUtilCode.svg?branch=master
+[buildSvg]: https://travis-ci.org/Blankj/AndroidUtilCode.svg?branch=master
[build]: https://travis-ci.org/Blankj/AndroidUtilCode
-[insightsvg]: https://www.insight.io/repoBadge/github.com/Blankj/AndroidUtilCode
-[insight]: https://insight.io/github.com/Blankj/AndroidUtilCode
-
-[licensesvg]: https://img.shields.io/badge/License-Apache--2.0-brightgreen.svg
+[licenseSvg]: https://img.shields.io/badge/License-Apache--2.0-brightgreen.svg
[license]: https://github.com/Blankj/AndroidUtilCode/blob/master/LICENSE
[readme]: https://github.com/Blankj/AndroidUtilCode
[readme-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md
-[utilcode]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/README.md
-[utilcode-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/README-CN.md
+[utilcode]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README.md
+[utilcode-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README-CN.md
-[subutil]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/README.md
-[subutil-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/README-CN.md
+[subutil]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/README.md
+[subutil-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/README-CN.md
-[update_log.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/update_log.md
+[changeLog.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/CHANGELOG.md
[donate]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/donate.png
-[blogsvg]: https://img.shields.io/badge/Blog-@Blankj-34a48e.svg
+[blogSvg]: https://img.shields.io/badge/Blog-@Blankj-34a48e.svg
[blog]: http://blankj.com
-[jianshusvg]: https://img.shields.io/badge/简书-@Blankj-34a48e.svg
+[jianshuSvg]: https://img.shields.io/badge/简书-@Blankj-34a48e.svg
[jianshu]: http://www.jianshu.com/u/46702d5c6978
-[weibosvg]: https://img.shields.io/badge/weibo-@__Blankj-34a48e.svg
+[weiboSvg]: https://img.shields.io/badge/weibo-@__Blankj-34a48e.svg
[weibo]: http://weibo.com/3076228982
-[qqgroupsvg]: https://img.shields.io/badge/QQ群-25206533-34a48e.svg
+[qqgroupSvg]: https://img.shields.io/badge/QQ群-25206533-34a48e.svg
[qqgroup]: https://shang.qq.com/wpa/qunwpa?idkey=d906789f84484465e2736f7b524366b4c23afeda38733d5c7b10fc3f6e406e9b
diff --git a/README.md b/README.md
index 7268a9f689..9ae668e26e 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,8 @@
-![logo][logo]
+[![logo][logo]](https://github.com/Blankj/AndroidUtilCode)
-[![auc][aucsvg]][auc] [![api][apisvg]][api] [![build][buildsvg]][build] [![Insight][insightsvg]][insight] [![License][licensesvg]][license]
+[![frame][frame]](https://github.com/Blankj/AucFrameTemplate)
+
+[![auc][aucSvg]][auc] [![result][apiSvg]][result] [![build][buildSvg]][build] [![License][licenseSvg]][license]
## [README of Chinese][readme-cn]
@@ -32,51 +34,54 @@ If this project helps you a lot and you want to support the project's developmen
## Contact
-[![Blog][blogsvg]][blog] [![jianshu][jianshusvg]][jianshu] [![weibo][weibosvg]][weibo] [![QQGroup][qqgroupsvg]][qqgroup]
+[![Blog][blogSvg]][blog] [![jianshu][jianshuSvg]][jianshu] [![weibo][weiboSvg]][weibo] [![QQGroup][qqgroupSvg]][qqgroup]
+
+
+## [Change Log][changeLog.md]
-## [Update Log][update_log.md]
+## 打个小广告
+欢迎加入我的小专栏「**[基你太美](https://xiaozhuanlan.com/Blankj)**」一起学习。
[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png
-[aucsvg]: https://img.shields.io/badge/AndroidUtilCode-v1.20.3-brightgreen.svg
+[frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png
+
+[aucSvg]: https://github.com/Blankj/AndroidUtilCode/workflows/Android%20CI/badge.svg?branch=master
[auc]: https://github.com/Blankj/AndroidUtilCode
-[apisvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
-[api]: https://android-arsenal.com/api?level=14
+[apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
+[result]: https://android-arsenal.com/result?level=14
-[buildsvg]: https://travis-ci.org/Blankj/AndroidUtilCode.svg?branch=master
+[buildSvg]: https://travis-ci.org/Blankj/AndroidUtilCode.svg?branch=master
[build]: https://travis-ci.org/Blankj/AndroidUtilCode
-[insightsvg]: https://www.insight.io/repoBadge/github.com/Blankj/AndroidUtilCode
-[insight]: https://insight.io/github.com/Blankj/AndroidUtilCode
-
-[licensesvg]: https://img.shields.io/badge/License-Apache--2.0-brightgreen.svg
+[licenseSvg]: https://img.shields.io/badge/License-Apache--2.0-brightgreen.svg
[license]: https://github.com/Blankj/AndroidUtilCode/blob/master/LICENSE
[readme]: https://github.com/Blankj/AndroidUtilCode
[readme-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md
-[utilcode]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/README.md
-[utilcode-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/README-CN.md
+[utilcode]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README.md
+[utilcode-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README-CN.md
-[subutil]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/README.md
-[subutil-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/README-CN.md
+[subutil]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/README.md
+[subutil-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/README-CN.md
-[update_log.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/update_log.md
+[changeLog.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/CHANGELOG.md
[donate]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/donate.png
-[blogsvg]: https://img.shields.io/badge/Blog-@Blankj-34a48e.svg
+[blogSvg]: https://img.shields.io/badge/Blog-@Blankj-34a48e.svg
[blog]: http://blankj.com
-[jianshusvg]: https://img.shields.io/badge/简书-@Blankj-34a48e.svg
+[jianshuSvg]: https://img.shields.io/badge/简书-@Blankj-34a48e.svg
[jianshu]: http://www.jianshu.com/u/46702d5c6978
-[weibosvg]: https://img.shields.io/badge/weibo-@__Blankj-34a48e.svg
+[weiboSvg]: https://img.shields.io/badge/weibo-@__Blankj-34a48e.svg
[weibo]: http://weibo.com/3076228982
-[qqgroupsvg]: https://img.shields.io/badge/QQ群-25206533-34a48e.svg
+[qqgroupSvg]: https://img.shields.io/badge/QQ群-25206533-34a48e.svg
[qqgroup]: https://shang.qq.com/wpa/qunwpa?idkey=d906789f84484465e2736f7b524366b4c23afeda38733d5c7b10fc3f6e406e9b
diff --git a/app/build.gradle b/app/build.gradle
deleted file mode 100644
index ed02ad9368..0000000000
--- a/app/build.gradle
+++ /dev/null
@@ -1,7 +0,0 @@
-plugins {
- id "com.android.application"
-}
-
-// in config.gradle
-configAndroidDomain project
-configAppDependencies project
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
deleted file mode 100644
index 781f9c8aa5..0000000000
--- a/app/proguard-rules.pro
+++ /dev/null
@@ -1,17 +0,0 @@
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in G:\Android_IDE\ADT\sdk/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the proguardFiles
-# directive in build.gradle.
-#
-# For more details, see
-# http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-# public *;
-#}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
deleted file mode 100644
index 358302056e..0000000000
--- a/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,210 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/java/com/blankj/androidutilcode/Config.java b/app/src/main/java/com/blankj/androidutilcode/Config.java
deleted file mode 100644
index 058855a3da..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/Config.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.blankj.androidutilcode;
-
-import android.os.Environment;
-
-import com.blankj.utilcode.util.Utils;
-
-import java.io.File;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/05/10
- * desc : config about constants
- *
- */
-public class Config {
-
- public static final String FILE_SEP = System.getProperty("file.separator");
- public static final String LINE_SEP = System.getProperty("line.separator");
- public static final String PKG = "com.blankj.androidutilcode";
- public static final String TEST_PKG = "com.blankj.testinstall";
- public static final String GITHUB = "https://github.com/Blankj/AndroidUtilCode";
- public static final String BLOG = "https://blankj.com";
- public static final String CACHE_PATH;
- public static final String TEST_APK_PATH;
-
- static {
- File cacheDir = Utils.getApp().getExternalCacheDir();
- if (cacheDir != null) {
- CACHE_PATH = cacheDir.getAbsolutePath();
- } else {
- CACHE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath();
- }
- TEST_APK_PATH = CACHE_PATH + FILE_SEP + "test_install.apk";
-
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/MainActivity.java b/app/src/main/java/com/blankj/androidutilcode/MainActivity.java
deleted file mode 100644
index 3dc5146f4f..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/MainActivity.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.blankj.androidutilcode;
-
-import android.graphics.Color;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.design.widget.CollapsingToolbarLayout;
-import android.support.v7.app.ActionBarDrawerToggle;
-import android.support.v7.widget.Toolbar;
-import android.view.View;
-
-import com.blankj.androidutilcode.base.BaseDrawerActivity;
-import com.blankj.androidutilcode.feature.core.CoreUtilActivity;
-import com.blankj.androidutilcode.feature.sub.SubUtilActivity;
-import com.blankj.utilcode.util.BarUtils;
-import com.blankj.utilcode.util.EncryptUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/29
- * desc : MainActivity
- *
- */
-public class MainActivity extends BaseDrawerActivity {
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_main;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- Toolbar toolbar = findViewById(R.id.toolbar);
- View fakeStatusBar = findViewById(R.id.fake_status_bar);
- CollapsingToolbarLayout ctl = findViewById(R.id.ctl);
- ctl.setExpandedTitleColor(Color.parseColor("#00FFFFFF"));
- setSupportActionBar(toolbar);
- ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this,
- rootLayout,
- toolbar,
- R.string.navigation_drawer_open,
- R.string.navigation_drawer_close);
- rootLayout.addDrawerListener(toggle);
- toggle.syncState();
-
- BarUtils.setStatusBarAlpha4Drawer(this, rootLayout, fakeStatusBar, 0, false);
- BarUtils.addMarginTopEqualStatusBarHeight(toolbar);
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
-
- }
-
- public void coreUtilClick(View view) {
- CoreUtilActivity.start(this);
- }
-
- public void subUtilClick(View view) {
- SubUtilActivity.start(this);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/base/BaseActivity.java b/app/src/main/java/com/blankj/androidutilcode/base/BaseActivity.java
deleted file mode 100644
index b09746f9e7..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/base/BaseActivity.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.blankj.androidutilcode.base;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.os.Bundle;
-import android.support.annotation.LayoutRes;
-import android.support.v7.app.AppCompatActivity;
-import android.view.LayoutInflater;
-import android.view.View;
-
-import com.blankj.utilcode.util.ScreenUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/10/24
- * desc : base about activity
- *
- */
-public abstract class BaseActivity extends AppCompatActivity
- implements IBaseView {
-
- protected View mContentView;
- protected Activity mActivity;
-
- /**
- * 上次点击时间
- */
- private long lastClick = 0;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
-// if (ScreenUtils.isPortrait()) {
-// ScreenUtils.adaptScreen4VerticalSlide(this, 720);
-// } else {
-// ScreenUtils.adaptScreen4HorizontalSlide(this, 720);
-// }
- super.onCreate(savedInstanceState);
- mActivity = this;
- Bundle bundle = getIntent().getExtras();
- initData(bundle);
- setBaseView(bindLayout());
- initView(savedInstanceState, mContentView);
- doBusiness();
- }
-
- @SuppressLint("ResourceType")
- protected void setBaseView(@LayoutRes int layoutId) {
- if (layoutId <= 0) return;
- setContentView(mContentView = LayoutInflater.from(this).inflate(layoutId, null));
- }
-
- /**
- * 判断是否快速点击
- *
- * @return {@code true}: 是 {@code false}: 否
- */
- private boolean isFastClick() {
- long now = System.currentTimeMillis();
- if (now - lastClick >= 200) {
- lastClick = now;
- return false;
- }
- return true;
- }
-
- @Override
- public void onClick(final View view) {
- if (!isFastClick()) onWidgetClick(view);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/base/BaseApplication.java b/app/src/main/java/com/blankj/androidutilcode/base/BaseApplication.java
deleted file mode 100644
index db1a8cac36..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/base/BaseApplication.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.blankj.androidutilcode.base;
-
-import android.app.Activity;
-import android.app.Application;
-import android.os.Bundle;
-import android.util.Log;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/03/30
- * desc : base about application
- *
- */
-public class BaseApplication extends Application {
-
- private static final String TAG = "BaseApplication";
-
- private static BaseApplication sInstance;
-
- public static BaseApplication getInstance() {
- return sInstance;
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- sInstance = this;
- registerActivityLifecycleCallbacks(mCallbacks);
- }
-
- private ActivityLifecycleCallbacks mCallbacks = new ActivityLifecycleCallbacks() {
-
- @Override
- public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
- Log.d(TAG, "onActivityCreated() called with: activity = [" + activity + "], savedInstanceState = [" + savedInstanceState + "]");
- }
-
- @Override
- public void onActivityStarted(Activity activity) {
- Log.d(TAG, "onActivityStarted() called with: activity = [" + activity + "]");
- }
-
- @Override
- public void onActivityResumed(Activity activity) {
- Log.d(TAG, "onActivityResumed() called with: activity = [" + activity + "]");
- }
-
- @Override
- public void onActivityPaused(Activity activity) {
- Log.d(TAG, "onActivityPaused() called with: activity = [" + activity + "]");
- }
-
- @Override
- public void onActivityStopped(Activity activity) {
- Log.d(TAG, "onActivityStopped() called with: activity = [" + activity + "]");
- }
-
- @Override
- public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
- Log.d(TAG, "onActivitySaveInstanceState() called with: activity = [" + activity + "], outState = [" + outState + "]");
- }
-
- @Override
- public void onActivityDestroyed(Activity activity) {
- Log.d(TAG, "onActivityDestroyed() called with: activity = [" + activity + "]");
- }
- };
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/base/BaseBackActivity.java b/app/src/main/java/com/blankj/androidutilcode/base/BaseBackActivity.java
deleted file mode 100644
index dab3c6c092..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/base/BaseBackActivity.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.blankj.androidutilcode.base;
-
-import android.annotation.SuppressLint;
-import android.support.annotation.LayoutRes;
-import android.support.design.widget.AppBarLayout;
-import android.support.design.widget.CoordinatorLayout;
-import android.support.v4.content.ContextCompat;
-import android.support.v7.app.ActionBar;
-import android.support.v7.widget.Toolbar;
-import android.view.LayoutInflater;
-import android.view.MenuItem;
-import android.widget.FrameLayout;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.UtilsApp;
-import com.blankj.utilcode.util.BarUtils;
-import com.r0adkll.slidr.Slidr;
-
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/06/27
- * desc : base about back activity
- *
- */
-public abstract class BaseBackActivity extends BaseActivity {
-
- protected CoordinatorLayout rootLayout;
- protected Toolbar mToolbar;
- protected AppBarLayout abl;
- protected FrameLayout flActivityContainer;
-
- @SuppressLint("ResourceType")
- @Override
- protected void setBaseView(@LayoutRes int layoutId) {
- Slidr.attach(this);
- mContentView = LayoutInflater.from(this).inflate(R.layout.activity_back, null);
- setContentView(mContentView);
- rootLayout = findViewById(R.id.root_layout);
- abl = findViewById(R.id.abl);
- mToolbar = findViewById(R.id.toolbar);
- flActivityContainer = findViewById(R.id.activity_container);
- if (layoutId > 0) {
- flActivityContainer.addView(LayoutInflater.from(this).inflate(layoutId, flActivityContainer, false));
- }
- setSupportActionBar(mToolbar);
- getToolBar().setDisplayHomeAsUpEnabled(true);
-
- BarUtils.setStatusBarColor(this, ContextCompat.getColor(UtilsApp.getInstance(), R.color.colorPrimary), 0);
- BarUtils.addMarginTopEqualStatusBarHeight(rootLayout);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (item.getItemId() == android.R.id.home) {
- finish();
- }
- return super.onOptionsItemSelected(item);
- }
-
- protected ActionBar getToolBar() {
- return getSupportActionBar();
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/base/BaseDrawerActivity.java b/app/src/main/java/com/blankj/androidutilcode/base/BaseDrawerActivity.java
deleted file mode 100644
index 4b0d6f6c49..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/base/BaseDrawerActivity.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.blankj.androidutilcode.base;
-
-import android.content.Intent;
-import android.net.Uri;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.design.widget.NavigationView;
-import android.support.v4.widget.DrawerLayout;
-import android.view.LayoutInflater;
-import android.view.MenuItem;
-import android.widget.FrameLayout;
-
-import com.blankj.androidutilcode.Config;
-import com.blankj.androidutilcode.R;
-
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/06/27
- * desc : base about drawer activity
- *
- */
-public abstract class BaseDrawerActivity extends BaseActivity {
-
- protected DrawerLayout rootLayout;
- protected FrameLayout flActivityContainer;
-
- NavigationView.OnNavigationItemSelectedListener mListener = new NavigationView.OnNavigationItemSelectedListener() {
- @Override
- public boolean onNavigationItemSelected(@NonNull MenuItem item) {
- switch (item.getItemId()) {
- case R.id.action_git_hub:
- startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Config.GITHUB)));
- break;
- case R.id.action_blog:
- startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Config.BLOG)));
- break;
- }
- return false;
- }
- };
-
- @Override
- protected void setBaseView(@LayoutRes int layoutId) {
- mContentView = LayoutInflater.from(this).inflate(R.layout.activity_drawer, null);
- setContentView(mContentView);
- rootLayout = findViewById(R.id.root_layout);
- flActivityContainer = findViewById(R.id.activity_container);
- flActivityContainer.addView(LayoutInflater.from(this).inflate(layoutId, flActivityContainer, false));
- NavigationView navigationView = findViewById(R.id.nav_view);
- navigationView.setNavigationItemSelectedListener(mListener);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/base/BaseFragment.java b/app/src/main/java/com/blankj/androidutilcode/base/BaseFragment.java
deleted file mode 100644
index a1ff0dabc0..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/base/BaseFragment.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package com.blankj.androidutilcode.base;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.support.annotation.IdRes;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentTransaction;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/03/28
- * desc : base about v4-fragment
- *
- */
-public abstract class BaseFragment extends Fragment
- implements IBaseView {
-
- private static final String TAG = "BaseFragment";
- private static final String STATE_SAVE_IS_HIDDEN = "STATE_SAVE_IS_HIDDEN";
-
- protected View mContentView;
- protected Activity mActivity;
-
- private long lastClick = 0;
-
- @Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- Log.d(TAG, "onCreate: ");
- super.onCreate(savedInstanceState);
- if (savedInstanceState != null) {
- boolean isSupportHidden = savedInstanceState.getBoolean(STATE_SAVE_IS_HIDDEN);
- FragmentTransaction ft = getFragmentManager().beginTransaction();
- if (isSupportHidden) {
- ft.hide(this);
- } else {
- ft.show(this);
- }
- ft.commitAllowingStateLoss();
- }
- }
-
- @Nullable
- @Override
- public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
- Log.d(TAG, "onCreateView: ");
- setBaseView(inflater, bindLayout());
- return mContentView;
- }
-
- protected void setBaseView(@NonNull LayoutInflater inflater, @LayoutRes int layoutId) {
- if (layoutId <= 0) return;
- mContentView = inflater.inflate(layoutId, null);
- }
-
- @Override
- public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
- Log.d(TAG, "onViewCreated: ");
- super.onViewCreated(view, savedInstanceState);
- Bundle bundle = getArguments();
- initData(bundle);
- }
-
- @Override
- public void onActivityCreated(@Nullable Bundle savedInstanceState) {
- Log.d(TAG, "onActivityCreated: ");
- super.onActivityCreated(savedInstanceState);
- mActivity = getActivity();
- initView(savedInstanceState, mContentView);
- doBusiness();
- }
-
- @Override
- public void onDestroyView() {
- Log.d(TAG, "onDestroyView: ");
- if (mContentView != null) {
- ((ViewGroup) mContentView.getParent()).removeView(mContentView);
- }
- super.onDestroyView();
- }
-
- @Override
- public void onDestroy() {
- Log.d(TAG, "onDestroy: ");
- super.onDestroy();
- }
-
- @Override
- public void onSaveInstanceState(@NonNull Bundle outState) {
- Log.d(TAG, "onSaveInstanceState: ");
- super.onSaveInstanceState(outState);
- outState.putBoolean(STATE_SAVE_IS_HIDDEN, isHidden());
- }
-
- private boolean isFastClick() {
- long now = System.currentTimeMillis();
- if (now - lastClick >= 200) {
- lastClick = now;
- return false;
- }
- return true;
- }
-
- @Override
- public void onClick(View view) {
- if (!isFastClick()) onWidgetClick(view);
- }
-
- public T findViewById(@IdRes int id) {
- if (mContentView == null) throw new NullPointerException("ContentView is null.");
- return mContentView.findViewById(id);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/base/BaseLazyFragment.java b/app/src/main/java/com/blankj/androidutilcode/base/BaseLazyFragment.java
deleted file mode 100644
index 05c88cc8e9..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/base/BaseLazyFragment.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.blankj.androidutilcode.base;
-
-import android.util.Log;
-
-/**
- *
- * author: blankj
- * blog : http://blankj.com
- * time : 2018/03/23
- * desc : base about lazy fragment
- *
- */
-public abstract class BaseLazyFragment extends BaseFragment {
-
- private static final String TAG = "BaseLazyFragment";
-
- private boolean isDataLoaded;
-
- public abstract void doLazyBusiness();
-
- @Override
- public void setUserVisibleHint(boolean isVisibleToUser) {
- Log.d(TAG, "setUserVisibleHint: " + isVisibleToUser);
- super.setUserVisibleHint(isVisibleToUser);
- if (isVisibleToUser && mContentView != null && !isDataLoaded) {
- doLazyBusiness();
- isDataLoaded = true;
- }
- }
-
- @Override
- public void doBusiness() {
- if (getUserVisibleHint()) {
- doLazyBusiness();
- isDataLoaded = true;
- }
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/base/IBaseView.java b/app/src/main/java/com/blankj/androidutilcode/base/IBaseView.java
deleted file mode 100644
index 01e16c64fa..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/base/IBaseView.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.blankj.androidutilcode.base;
-
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/06/27
- * desc :
- *
- */
-interface IBaseView extends View.OnClickListener {
-
- /**
- * 初始化数据
- *
- * @param bundle 传递过来的 bundle
- */
- void initData(@Nullable final Bundle bundle);
-
- /**
- * 绑定布局
- *
- * @return 布局 Id
- */
- int bindLayout();
-
- /**
- * 初始化 view
- */
- void initView(final Bundle savedInstanceState, final View contentView);
-
- /**
- * 业务操作
- */
- void doBusiness();
-
- /**
- * 视图点击事件
- *
- * @param view 视图
- */
- void onWidgetClick(final View view);
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/base/rv/BaseViewHolder.java b/app/src/main/java/com/blankj/androidutilcode/base/rv/BaseViewHolder.java
deleted file mode 100644
index 2da4de8849..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/base/rv/BaseViewHolder.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.blankj.androidutilcode.base.rv;
-
-import android.support.annotation.IdRes;
-import android.support.v7.widget.RecyclerView;
-import android.util.SparseArray;
-import android.view.View;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/08/22
- * desc :
- *
- */
-public class BaseViewHolder extends RecyclerView.ViewHolder {
-
- private SparseArray viewArray = new SparseArray<>();
-
- public BaseViewHolder(View itemView) {
- super(itemView);
- }
-
- @SuppressWarnings("unchecked")
- public T getView(@IdRes final int viewId) {
- View view = viewArray.get(viewId);
- if (view == null) {
- view = itemView.findViewById(viewId);
- viewArray.put(viewId, view);
- }
- return (T) view;
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/base/rv/adapter/BaseAdapter.java b/app/src/main/java/com/blankj/androidutilcode/base/rv/adapter/BaseAdapter.java
deleted file mode 100644
index 506ee91f48..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/base/rv/adapter/BaseAdapter.java
+++ /dev/null
@@ -1,198 +0,0 @@
-package com.blankj.androidutilcode.base.rv.adapter;
-
-import android.content.Context;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.v7.widget.RecyclerView;
-import android.util.SparseArray;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.blankj.androidutilcode.base.rv.BaseViewHolder;
-import com.blankj.androidutilcode.base.rv.listener.OnItemClickListener;
-import com.blankj.androidutilcode.base.rv.listener.OnItemLongClickListener;
-
-import java.util.List;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/08/22
- * desc :
- *
- */
-public abstract class BaseAdapter extends RecyclerView.Adapter {
-
- protected static final int VIEW_TYPE_EMPTY = 0xfff0;
- protected static final int VIEW_TYPE_HEADER = 0xfff1;
- protected static final int VIEW_TYPE_FOOTER = 0xfff2;
- protected static final int VIEW_TYPE_DEFAULT = 0xfff3;
-
- private final SparseArray mViewArray = new SparseArray<>();
-
- protected List mData;
- protected Context mContext;
- protected ViewGroup mParent;
-
- protected LayoutInflater mInflater;
-
- private OnItemClickListener mClickListener;
- private OnItemLongClickListener mLongClickListener;
-
- public void setData(@NonNull final List data) {
- mData = data;
- }
-
- @Override
- public final int getItemViewType(int position) {
- if (getDataSize() == 0 && mViewArray.get(VIEW_TYPE_EMPTY) != null) {
- return VIEW_TYPE_EMPTY;
- } else if (position == 0 && mViewArray.get(VIEW_TYPE_HEADER) != null) {
- return VIEW_TYPE_HEADER;
- } else if (position == getItemCount() - 1 && mViewArray.get(VIEW_TYPE_FOOTER) != null) {
- return VIEW_TYPE_FOOTER;
- } else {
- return getCustomViewType(position);
- }
- }
-
- protected int getCustomViewType(final int position) {
- return VIEW_TYPE_DEFAULT;
- }
-
- protected abstract int bindLayout(final int viewType);
-
- @Override
- public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- if (mParent == null) {
- mParent = parent;
- mContext = parent.getContext();
- mInflater = LayoutInflater.from(mContext);
- }
- View itemView = mViewArray.get(viewType);
- if (itemView == null) {
- itemView = inflateLayout(bindLayout(viewType));
- }
- return new BaseViewHolder(itemView);
- }
-
- @Override
- public final void onBindViewHolder(BaseViewHolder holder, int position) {
- switch (holder.getItemViewType()) {
- case VIEW_TYPE_EMPTY:
- case VIEW_TYPE_HEADER:
- case VIEW_TYPE_FOOTER:
- break;
- default:
- bindCustomViewHolder(holder, position);
- break;
- }
- }
-
- protected void bindCustomViewHolder(final BaseViewHolder holder, final int position) {
- final int dataPos = position - (mViewArray.get(VIEW_TYPE_HEADER) == null ? 0 : 1);
- holder.itemView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mClickListener != null) {
- mClickListener.onItemClick(v, dataPos);
- }
- }
- });
- holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
- @Override
- public boolean onLongClick(View v) {
- return mLongClickListener != null && mLongClickListener.onItemLongClick(v, dataPos);
- }
- });
- bind(holder, mData.get(dataPos));
- }
-
- protected abstract void bind(final BaseViewHolder holder, final M data);
-
- @Override
- public int getItemCount() {
- return getDataSize() + getExtraViewCount();
- }
-
- public void setEmptyView(@NonNull View emptyView) {
- setView(VIEW_TYPE_EMPTY, emptyView);
- }
-
- public View getEmptyView() {
- return getView(VIEW_TYPE_EMPTY);
- }
-
- public void removeEmptyView() {
- removeView(VIEW_TYPE_EMPTY);
- }
-
- public void setHeaderView(@NonNull View headerView) {
- setView(VIEW_TYPE_HEADER, headerView);
- }
-
- public View getHeaderView() {
- return getView(VIEW_TYPE_HEADER);
- }
-
- public void removeHeaderView() {
- removeView(VIEW_TYPE_HEADER);
- }
-
- public void setFooterView(@NonNull View footerView) {
- setView(VIEW_TYPE_FOOTER, footerView);
- }
-
- public View getFooterView() {
- return getView(VIEW_TYPE_FOOTER);
- }
-
- public void removeFooterView() {
- removeView(VIEW_TYPE_FOOTER);
- }
-
- private void setView(final int type, @NonNull final View view) {
- mViewArray.put(type, view);
- notifyDataSetChanged();
- }
-
- private View getView(final int type) {
- return mViewArray.get(type);
- }
-
- private void removeView(final int type) {
- if (mViewArray.get(type) != null) {
- mViewArray.delete(type);
- notifyDataSetChanged();
- }
- }
-
- private View inflateLayout(@LayoutRes final int layoutId) {
- return mInflater.inflate(layoutId, mParent, false);
- }
-
- private int getExtraViewCount() {
- int extraViewCount = 0;
- if (mViewArray.get(VIEW_TYPE_HEADER) != null) {
- extraViewCount++;
- }
- if (mViewArray.get(VIEW_TYPE_FOOTER) != null) {
- extraViewCount++;
- }
- return extraViewCount;
- }
-
- public void setOnItemClickListener(final OnItemClickListener clickListener) {
- mClickListener = clickListener;
- }
-
- public void setOnItemLongClickListener(final OnItemLongClickListener longClickListener) {
- mLongClickListener = longClickListener;
- }
-
- private int getDataSize() {
- return mData == null ? 0 : mData.size();
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/base/rv/adapter/SingleAdapter.java b/app/src/main/java/com/blankj/androidutilcode/base/rv/adapter/SingleAdapter.java
deleted file mode 100644
index 60e12c6514..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/base/rv/adapter/SingleAdapter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.blankj.androidutilcode.base.rv.adapter;
-
-import android.support.annotation.LayoutRes;
-
-import java.util.List;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/08/22
- * desc :
- *
- */
-public abstract class SingleAdapter extends BaseAdapter {
-
- private final int mLayoutId;
-
- public SingleAdapter(List list, @LayoutRes int layoutId) {
- setData(list);
- mLayoutId = layoutId;
- }
-
- @Override
- protected int bindLayout(final int viewType) {
- return mLayoutId;
- }
-
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/base/rv/listener/OnItemClickListener.java b/app/src/main/java/com/blankj/androidutilcode/base/rv/listener/OnItemClickListener.java
deleted file mode 100644
index f964cd210f..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/base/rv/listener/OnItemClickListener.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.blankj.androidutilcode.base.rv.listener;
-
-import android.view.View;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/08/21
- * desc :
- *
- */
-public interface OnItemClickListener {
- void onItemClick(final View view, final int position);
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/base/rv/listener/OnItemLongClickListener.java b/app/src/main/java/com/blankj/androidutilcode/base/rv/listener/OnItemLongClickListener.java
deleted file mode 100644
index 5f065dc99c..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/base/rv/listener/OnItemLongClickListener.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.blankj.androidutilcode.base.rv.listener;
-
-import android.view.View;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/08/21
- * desc :
- *
- */
-public interface OnItemLongClickListener {
- boolean onItemLongClick(final View view, final int position);
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/data/DataManager.java b/app/src/main/java/com/blankj/androidutilcode/data/DataManager.java
deleted file mode 100644
index 10699a5894..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/data/DataManager.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package com.blankj.androidutilcode.data;
-
-import com.blankj.utilcode.util.SPUtils;
-
-import java.util.Map;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2018/01/08
- * desc : manager about data
- *
- */
-public class DataManager {
-
- private static final SPUtils SP_UTILS = SPUtils.getInstance("demo");
-
- public static void putString() {
- SP_UTILS.put("STRING", "string");
- }
-
- public static String getString() {
- return SP_UTILS.getString("STRING");
- }
-
- public static void putInt() {
- SP_UTILS.put("INT", 21);
- }
-
- public static String getInt() {
- return String.valueOf(SP_UTILS.getInt("INT"));
- }
-
- public static void putLong() {
- SP_UTILS.put("LONG", Long.MAX_VALUE);
- }
-
- public static String getLong() {
- return String.valueOf(SP_UTILS.getLong("LONG"));
- }
-
- public static void putFloat() {
- SP_UTILS.put("FLOAT", (float) Math.PI);
- }
-
- public static String getFloat() {
- return String.valueOf(SP_UTILS.getFloat("FLOAT"));
- }
-
- public static void putBoolean() {
- SP_UTILS.put("BOOLEAN", true);
- }
-
- public static String getBoolean() {
- return String.valueOf(SP_UTILS.getBoolean("BOOLEAN"));
- }
-
- public static void clear() {
- SP_UTILS.clear();
- }
-
- public static String sp2String() {
- StringBuilder sb = new StringBuilder();
- Map map = SP_UTILS.getAll();
- for (Map.Entry entry : map.entrySet()) {
- sb.append(entry.getKey())
- .append(": ")
- .append(entry.getValue())
- .append("\n");
- }
- return sb.toString();
- }
-
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/CoreUtilActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/CoreUtilActivity.java
deleted file mode 100644
index 06b0e1f86c..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/CoreUtilActivity.java
+++ /dev/null
@@ -1,176 +0,0 @@
-package com.blankj.androidutilcode.feature.core;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.androidutilcode.feature.core.activity.ActivityActivity;
-import com.blankj.androidutilcode.feature.core.app.AppActivity;
-import com.blankj.androidutilcode.feature.core.bar.BarActivity;
-import com.blankj.androidutilcode.feature.core.clean.CleanActivity;
-import com.blankj.androidutilcode.feature.core.device.DeviceActivity;
-import com.blankj.androidutilcode.feature.core.fragment.FragmentActivity;
-import com.blankj.androidutilcode.feature.core.image.ImageActivity;
-import com.blankj.androidutilcode.feature.core.keyboard.KeyboardActivity;
-import com.blankj.androidutilcode.feature.core.log.LogActivity;
-import com.blankj.androidutilcode.feature.core.meta_data.MetaDataActivity;
-import com.blankj.androidutilcode.feature.core.network.NetworkActivity;
-import com.blankj.androidutilcode.feature.core.path.PathActivity;
-import com.blankj.androidutilcode.feature.core.permission.PermissionActivity;
-import com.blankj.androidutilcode.feature.core.phone.PhoneActivity;
-import com.blankj.androidutilcode.feature.core.process.ProcessActivity;
-import com.blankj.androidutilcode.feature.core.reflect.ReflectActivity;
-import com.blankj.androidutilcode.feature.core.resource.ResourceActivity;
-import com.blankj.androidutilcode.feature.core.screen.ScreenActivity;
-import com.blankj.androidutilcode.feature.core.sdcard.SDCardActivity;
-import com.blankj.androidutilcode.feature.core.snackbar.SnackbarActivity;
-import com.blankj.androidutilcode.feature.core.sp.SPActivity;
-import com.blankj.androidutilcode.feature.core.span.SpanActivity;
-import com.blankj.androidutilcode.feature.core.toast.ToastActivity;
-import com.blankj.utilcode.util.Utils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/29
- * desc :
- *
- */
-public class CoreUtilActivity extends BaseBackActivity {
-
- public static void start(Context context) {
- Intent starter = new Intent(context, CoreUtilActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_util_core;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- Utils.getApp();
- getToolBar().setTitle(getString(R.string.core_util));
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
-
- }
-
- public void coreUtilClick(View view) {
-
- }
-
- public void activityClick(View view) {
- ActivityActivity.start(this);
- }
-
- public void appClick(View view) {
- AppActivity.start(this);
- }
-
- public void barClick(View view) {
- BarActivity.start(this);
- }
-
- public void cleanClick(View view) {
- CleanActivity.start(this);
- }
-
- public void crashClick(View view) {
- throw new NullPointerException("crash test");
- }
-
- public void deviceClick(View view) {
- DeviceActivity.start(this);
- }
-
- public void fragmentClick(View view) {
- FragmentActivity.start(this);
- }
-
- public void imageClick(View view) {
- ImageActivity.start(this);
- }
-
- public void keyboardClick(View view) {
- KeyboardActivity.start(this);
- }
-
- public void logClick(View view) {
- LogActivity.start(this);
- }
-
- public void metaDataClick(View view) {
- MetaDataActivity.start(this);
- }
-
- public void networkClick(View view) {
- NetworkActivity.start(this);
- }
-
- public void pathClick(View view) {
- PathActivity.start(this);
- }
-
- public void permissionClick(View view) {
- PermissionActivity.start(this);
- }
-
- public void phoneClick(View view) {
- PhoneActivity.start(this);
- }
-
- public void processClick(View view) {
- ProcessActivity.start(this);
- }
-
- public void reflectClick(View view) {
- ReflectActivity.start(this);
- }
-
- public void resourceClick(View view) {
- ResourceActivity.start(this);
- }
-
- public void screenClick(View view) {
- ScreenActivity.start(this);
- }
-
- public void sdcardClick(View view) {
- SDCardActivity.start(this);
- }
-
- public void snackbarClick(View view) {
- SnackbarActivity.start(this);
- }
-
- public void spClick(View view) {
- SPActivity.start(this);
- }
-
- public void spannableClick(View view) {
- SpanActivity.start(this);
- }
-
- public void toastClick(View view) {
- ToastActivity.start(this);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/activity/ActivityActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/activity/ActivityActivity.java
deleted file mode 100644
index 21a92280a3..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/activity/ActivityActivity.java
+++ /dev/null
@@ -1,285 +0,0 @@
-package com.blankj.androidutilcode.feature.core.activity;
-
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
-import android.os.Build;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.app.ActivityOptionsCompat;
-import android.view.View;
-import android.view.Window;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.Config;
-import com.blankj.androidutilcode.MainActivity;
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.androidutilcode.feature.core.CoreUtilActivity;
-import com.blankj.utilcode.util.ActivityUtils;
-import com.blankj.utilcode.util.LogUtils;
-import com.blankj.utilcode.util.SpanUtils;
-
-import java.util.Random;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/10/13
- * desc : demo about ActivityUtils
- *
- */
-public class ActivityActivity extends BaseBackActivity {
-
- ImageView viewSharedElement;
- Random random = new Random();
- private Bitmap bitmap;
- private Intent intent;
- private Intent[] intents = new Intent[2];
-
- public static void start(Context context) {
- Intent starter = new Intent(context, ActivityActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
- }
- return R.layout.activity_activity;
- }
-
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_activity));
- viewSharedElement = findViewById(R.id.view_shared_element);
- findViewById(R.id.btn_clz).setOnClickListener(this);
- findViewById(R.id.btn_clz_opt).setOnClickListener(this);
- findViewById(R.id.btn_clz_anim).setOnClickListener(this);
- findViewById(R.id.btn_act_clz).setOnClickListener(this);
- findViewById(R.id.btn_act_clz_opt).setOnClickListener(this);
- findViewById(R.id.btn_act_clz_shared_element).setOnClickListener(this);
- findViewById(R.id.btn_act_clz_anim).setOnClickListener(this);
- findViewById(R.id.btn_pkg_cls).setOnClickListener(this);
- findViewById(R.id.btn_pkg_cls_opt).setOnClickListener(this);
- findViewById(R.id.btn_pkg_cls_anim).setOnClickListener(this);
- findViewById(R.id.btn_act_pkg_cls).setOnClickListener(this);
- findViewById(R.id.btn_act_pkg_cls_opt).setOnClickListener(this);
- findViewById(R.id.btn_act_pkg_cls_shared_element).setOnClickListener(this);
- findViewById(R.id.btn_act_pkg_cls_anim).setOnClickListener(this);
- findViewById(R.id.btn_intent).setOnClickListener(this);
- findViewById(R.id.btn_intent_opt).setOnClickListener(this);
- findViewById(R.id.btn_intent_shared_element).setOnClickListener(this);
- findViewById(R.id.btn_intent_anim).setOnClickListener(this);
- findViewById(R.id.btn_intents).setOnClickListener(this);
- findViewById(R.id.btn_intents_opt).setOnClickListener(this);
- findViewById(R.id.btn_intents_anim).setOnClickListener(this);
- findViewById(R.id.btn_act_intents).setOnClickListener(this);
- findViewById(R.id.btn_act_intents_opt).setOnClickListener(this);
- findViewById(R.id.btn_act_intents_anim).setOnClickListener(this);
- findViewById(R.id.btn_act_clz_shared_element).setOnClickListener(this);
- findViewById(R.id.btn_start_home_activity).setOnClickListener(this);
- findViewById(R.id.btn_finish_activity).setOnClickListener(this);
- findViewById(R.id.btn_finish_to_activity).setOnClickListener(this);
- findViewById(R.id.btn_finish_all_activities).setOnClickListener(this);
- TextView tvAboutActivity = findViewById(R.id.tv_about_activity);
- tvAboutActivity.setText(new SpanUtils()
- .appendLine("isActivityExists: " + ActivityUtils.isActivityExists(Config.PKG, SubActivityActivity.class.getName()))
- .appendLine("getLauncherActivity: " + ActivityUtils.getLauncherActivity(Config.PKG))
- .appendLine("getTopActivity: " + ActivityUtils.getTopActivity())
- .appendLine("isActivityExistsInStack: " + ActivityUtils.isActivityExistsInStack(CoreUtilActivity.class))
- .append("getActivityIcon: ")
- .appendImage(ActivityUtils.getActivityIcon(this), SpanUtils.ALIGN_CENTER)
- .appendLine()
- .append("getActivityLogo: ")
- .appendImage(ActivityUtils.getActivityLogo(this), SpanUtils.ALIGN_CENTER)
- .create()
- );
- bitmap = ((BitmapDrawable) viewSharedElement.getDrawable()).getBitmap();
-
- intent = new Intent(this, SubActivityActivity.class);
- intents[0] = intent;
- intents[1] = new Intent(this, SubActivityActivity.class);
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_clz:
- ActivityUtils.startActivity(SubActivityActivity.class);
- break;
- case R.id.btn_clz_opt:
- ActivityUtils.startActivity(SubActivityActivity.class,
- getOption(random.nextInt(5)));
- break;
- case R.id.btn_clz_anim:
- ActivityUtils.startActivity(SubActivityActivity.class,
- R.anim.fade_in_1000, R.anim.fade_out_1000);
- break;
- case R.id.btn_act_clz:
- ActivityUtils.startActivity(this,
- SubActivityActivity.class);
- break;
- case R.id.btn_act_clz_opt:
- ActivityUtils.startActivity(this,
- SubActivityActivity.class,
- getOption(random.nextInt(5)));
- break;
-
- case R.id.btn_act_clz_shared_element:
- ActivityUtils.startActivity(this,
- SubActivityActivity.class,
- viewSharedElement);
- break;
- case R.id.btn_act_clz_anim:
- ActivityUtils.startActivity(this,
- SubActivityActivity.class,
- R.anim.fade_in_1000, R.anim.fade_out_1000);
- break;
- case R.id.btn_pkg_cls:
- ActivityUtils.startActivity(this.getPackageName(),
- SubActivityActivity.class.getName());
- break;
- case R.id.btn_pkg_cls_opt:
- ActivityUtils.startActivity(this.getPackageName(),
- SubActivityActivity.class.getName(),
- getOption(random.nextInt(5)));
- break;
- case R.id.btn_pkg_cls_anim:
- ActivityUtils.startActivity(this.getPackageName(),
- SubActivityActivity.class.getName(),
- R.anim.fade_in_1000, R.anim.fade_out_1000);
- break;
- case R.id.btn_act_pkg_cls:
- ActivityUtils.startActivity(this,
- this.getPackageName(),
- SubActivityActivity.class.getName());
- break;
- case R.id.btn_act_pkg_cls_opt:
- ActivityUtils.startActivity(this,
- this.getPackageName(),
- SubActivityActivity.class.getName(),
- getOption(random.nextInt(5)));
- break;
- case R.id.btn_act_pkg_cls_shared_element:
- ActivityUtils.startActivity(this,
- this.getPackageName(),
- SubActivityActivity.class.getName(),
- viewSharedElement);
- break;
- case R.id.btn_act_pkg_cls_anim:
- ActivityUtils.startActivity(this,
- this.getPackageName(),
- SubActivityActivity.class.getName(),
- R.anim.fade_in_1000, R.anim.fade_out_1000);
- break;
- case R.id.btn_intent:
- ActivityUtils.startActivity(this,
- intent);
- break;
- case R.id.btn_intent_opt:
- ActivityUtils.startActivity(this,
- intent,
- getOption(random.nextInt(5)));
- break;
- case R.id.btn_intent_shared_element:
- ActivityUtils.startActivity(this,
- intent,
- viewSharedElement);
- break;
- case R.id.btn_intent_anim:
- ActivityUtils.startActivity(this,
- intent,
- R.anim.fade_in_1000, R.anim.fade_out_1000);
- break;
- case R.id.btn_intents:
- ActivityUtils.startActivities(intents);
- break;
- case R.id.btn_intents_opt:
- ActivityUtils.startActivities(intents,
- getOption(random.nextInt(5)));
- break;
- case R.id.btn_intents_anim:
- ActivityUtils.startActivities(intents,
- R.anim.fade_in_1000, R.anim.fade_out_1000);
- break;
- case R.id.btn_act_intents:
- ActivityUtils.startActivities(this,
- intents,
- R.anim.fade_in_1000, R.anim.fade_out_1000);
- break;
- case R.id.btn_act_intents_opt:
- ActivityUtils.startActivities(this,
- intents,
- getOption(random.nextInt(5)));
- break;
- case R.id.btn_act_intents_anim:
- ActivityUtils.startActivities(this,
- intents,
- R.anim.fade_in_1000, R.anim.fade_out_1000);
- break;
- case R.id.btn_start_home_activity:
- ActivityUtils.startHomeActivity();
- break;
- case R.id.btn_finish_activity:
- ActivityUtils.finishActivity(MainActivity.class);
- break;
- case R.id.btn_finish_to_activity:
- ActivityUtils.finishToActivity(MainActivity.class, false, true);
- break;
- case R.id.btn_finish_all_activities:
- ActivityUtils.finishAllActivities();
- break;
- }
- }
-
- private Bundle getOption(int type) {
- LogUtils.d(type);
- switch (type) {
- case 0:
- return ActivityOptionsCompat.makeCustomAnimation(this,
- R.anim.slide_in_right_1000,
- R.anim.slide_out_left_1000)
- .toBundle();
- case 1:
- return ActivityOptionsCompat.makeScaleUpAnimation(viewSharedElement,
- viewSharedElement.getWidth() / 2,
- viewSharedElement.getHeight() / 2,
- 0, 0)
- .toBundle();
- case 2:
- return ActivityOptionsCompat.makeThumbnailScaleUpAnimation(viewSharedElement,
- bitmap,
- 0, 0)
- .toBundle();
- case 3:
- return ActivityOptionsCompat.makeSceneTransitionAnimation(this,
- viewSharedElement,
- getString(R.string.activity_shared_element))
- .toBundle();
- case 4:
- return ActivityOptionsCompat.makeClipRevealAnimation(viewSharedElement,
- viewSharedElement.getWidth() / 2,
- viewSharedElement.getHeight() / 2,
- 0, 0)
- .toBundle();
- default:
- return null;
- }
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/activity/SubActivityActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/activity/SubActivityActivity.java
deleted file mode 100644
index 0d0f761def..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/activity/SubActivityActivity.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.blankj.androidutilcode.feature.core.activity;
-
-import android.graphics.Color;
-import android.os.Build;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.app.ActivityCompat;
-import android.view.View;
-import android.view.Window;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-
-import java.util.Random;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/10/13
- * desc : demo about ActivityUtils
- *
- */
-public class SubActivityActivity extends BaseBackActivity {
-
- Random random = new Random();
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
- }
- return R.layout.activity_activity_sub;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- ((View)flActivityContainer.getParent()).setBackgroundColor(Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
-
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- }
-
- @Override
- public void onBackPressed() {
- super.onBackPressed();
- ActivityCompat.finishAfterTransition(this);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/app/AppActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/app/AppActivity.java
deleted file mode 100644
index 5a9762b9f7..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/app/AppActivity.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package com.blankj.androidutilcode.feature.core.app;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.Config;
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.androidutilcode.helper.PermissionHelper;
-import com.blankj.utilcode.util.AppUtils;
-import com.blankj.utilcode.util.FileUtils;
-import com.blankj.utilcode.util.LogUtils;
-import com.blankj.utilcode.util.SpanUtils;
-import com.blankj.utilcode.util.ToastUtils;
-import com.blankj.utilcode.util.Utils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/10/13
- * desc : demo about AppUtils
- *
- */
-
-public class AppActivity extends BaseBackActivity {
-
- private final OnReleasedListener listener = new OnReleasedListener() {
- @Override
- public void onReleased() {
- AppUtils.installApp(Config.TEST_APK_PATH);
- }
- };
-
- public static void start(Context context) {
- Intent starter = new Intent(context, AppActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
- AppUtils.registerAppStatusChangedListener(this, new Utils.OnAppStatusChangedListener() {
- @Override
- public void onForeground() {
- ToastUtils.showShort("foreground");
- }
-
- @Override
- public void onBackground() {
- ToastUtils.showShort("background");
- }
- });
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_app;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_app));
-
- findViewById(R.id.btn_install_app).setOnClickListener(this);
- findViewById(R.id.btn_install_app_silent).setOnClickListener(this);
- findViewById(R.id.btn_uninstall_app).setOnClickListener(this);
- findViewById(R.id.btn_uninstall_app_silent).setOnClickListener(this);
- findViewById(R.id.btn_launch_app).setOnClickListener(this);
- findViewById(R.id.btn_relaunch_app).setOnClickListener(this);
- findViewById(R.id.btn_exit_app).setOnClickListener(this);
- findViewById(R.id.btn_launch_app_details_settings).setOnClickListener(this);
- TextView tvAboutApp = findViewById(R.id.tv_about_app);
- tvAboutApp.setText(new SpanUtils()
- .appendLine("isAppRoot: " + AppUtils.isAppRoot())
- .appendLine("isAppDebug: " + AppUtils.isAppDebug())
- .appendLine("isAppSystem: " + AppUtils.isAppSystem())
- .appendLine("isAppForeground: " + AppUtils.isAppForeground())
- .append("getAppIcon: ").appendImage(AppUtils.getAppIcon(), SpanUtils.ALIGN_CENTER)
- .appendLine()
- .appendLine("getAppPackageName: " + AppUtils.getAppPackageName())
- .appendLine("getAppName: " + AppUtils.getAppName())
- .appendLine("getAppPath: " + AppUtils.getAppPath())
- .appendLine("getAppVersionName: " + AppUtils.getAppVersionName())
- .appendLine("getAppVersionCode: " + AppUtils.getAppVersionCode())
- .appendLine("getAppSignatureSHA1: " + AppUtils.getAppSignatureSHA1())
- .appendLine("getAppSignatureSHA256: " + AppUtils.getAppSignatureSHA256())
- .append("getAppSignatureMD5: " + AppUtils.getAppSignatureMD5())
- .create());
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_install_app:
- if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
- ToastUtils.showShort(R.string.app_install_tips);
- } else {
- PermissionHelper.requestStorage(new PermissionHelper.OnPermissionGrantedListener() {
- @Override
- public void onPermissionGranted() {
- if (!FileUtils.isFileExists(Config.TEST_APK_PATH)) {
- new ReleaseInstallApkTask(listener).execute();
- } else {
- listener.onReleased();
- LogUtils.d("test apk existed.");
- }
- }
- });
- }
- break;
- case R.id.btn_install_app_silent:
- if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
- ToastUtils.showShort(R.string.app_install_tips);
- } else {
- if (AppUtils.installAppSilent(Config.TEST_APK_PATH)) {
- ToastUtils.showShort(R.string.install_successfully);
- } else {
- ToastUtils.showShort(R.string.install_unsuccessfully);
- }
- }
- break;
- case R.id.btn_uninstall_app:
- if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
- AppUtils.uninstallApp(Config.TEST_PKG);
- } else {
- ToastUtils.showShort(R.string.app_uninstall_tips);
- }
- break;
- case R.id.btn_uninstall_app_silent:
- if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
- if (AppUtils.uninstallAppSilent(Config.TEST_PKG, false)) {
- ToastUtils.showShort(R.string.uninstall_successfully);
- } else {
- ToastUtils.showShort(R.string.uninstall_unsuccessfully);
- }
- } else {
- ToastUtils.showShort(R.string.app_uninstall_tips);
- }
- break;
- case R.id.btn_launch_app:
- AppUtils.launchApp(this.getPackageName());
- break;
- case R.id.btn_relaunch_app:
- AppUtils.relaunchApp();
- break;
- case R.id.btn_launch_app_details_settings:
- AppUtils.launchAppDetailsSettings();
- break;
- case R.id.btn_exit_app:
- AppUtils.exitApp();
- break;
- }
- }
-
- @Override
- protected void onDestroy() {
- AppUtils.unregisterAppStatusChangedListener(this);
- super.onDestroy();
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/app/OnReleasedListener.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/app/OnReleasedListener.java
deleted file mode 100644
index 4e935b28c9..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/app/OnReleasedListener.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.blankj.androidutilcode.feature.core.app;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2018/05/23
- * desc :
- *
- */
-public interface OnReleasedListener {
- void onReleased();
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/app/ReleaseInstallApkTask.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/app/ReleaseInstallApkTask.java
deleted file mode 100644
index 8bc28dd54b..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/app/ReleaseInstallApkTask.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.blankj.androidutilcode.feature.core.app;
-
-import com.blankj.androidutilcode.Config;
-import com.blankj.utilcode.util.ResourceUtils;
-import com.blankj.utilcode.util.ThreadUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2018/05/23
- * desc :
- *
- */
-public class ReleaseInstallApkTask extends ThreadUtils.SimpleTask {
-
- private OnReleasedListener mListener;
-
- public ReleaseInstallApkTask(final OnReleasedListener listener) {
- mListener = listener;
- }
-
- @Override
- public Void doInBackground() {
- ResourceUtils.copyFileFromAssets("test_install", Config.TEST_APK_PATH);
- return null;
- }
-
- @Override
- public void onSuccess(Void result) {
- if (mListener != null) {
- mListener.onReleased();
- }
- }
-
- public void execute() {
- ThreadUtils.executeByIo(this);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarActivity.java
deleted file mode 100644
index 4c665a4f6f..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarActivity.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package com.blankj.androidutilcode.feature.core.bar;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/05/27
- * desc : demo about BarUtils
- *
- */
-public class BarActivity extends BaseBackActivity {
-
- private TextView tvAboutStatus;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, BarActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_bar;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_bar));
-
- tvAboutStatus = findViewById(R.id.tv_about_status);
- findViewById(R.id.btn_status_bar).setOnClickListener(this);
- findViewById(R.id.btn_status_bar_color).setOnClickListener(this);
- findViewById(R.id.btn_status_bar_alpha).setOnClickListener(this);
- findViewById(R.id.btn_status_bar_image_view).setOnClickListener(this);
- findViewById(R.id.btn_status_bar_fragment).setOnClickListener(this);
- findViewById(R.id.btn_status_bar_swipe_back).setOnClickListener(this);
- findViewById(R.id.btn_status_bar_drawer).setOnClickListener(this);
- findViewById(R.id.btn_notification_bar).setOnClickListener(this);
- findViewById(R.id.btn_nav_bar).setOnClickListener(this);
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_status_bar:
- BarStatusActivity.start(this);
- break;
- case R.id.btn_status_bar_color:
- BarStatusColorActivity.start(this);
- break;
- case R.id.btn_status_bar_alpha:
- BarStatusAlphaActivity.start(this);
- break;
- case R.id.btn_status_bar_image_view:
- BarStatusImageViewActivity.start(this);
- break;
- case R.id.btn_status_bar_fragment:
- BarStatusFragmentActivity.start(this);
- break;
- case R.id.btn_status_bar_swipe_back:
- BarStatusSwipeBackActivity.start(this);
- break;
- case R.id.btn_status_bar_drawer:
- BarStatusDrawerActivity.start(this);
- break;
- case R.id.btn_notification_bar:
- BarNotificationActivity.start(this);
- break;
- case R.id.btn_nav_bar:
- BarNavActivity.start(this);
- break;
- }
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarNavActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarNavActivity.java
deleted file mode 100644
index 864be5c0f8..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarNavActivity.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package com.blankj.androidutilcode.feature.core.bar;
-
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Color;
-import android.os.Build;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
-import android.support.v4.content.ContextCompat;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.UtilsApp;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.BarUtils;
-import com.blankj.utilcode.util.SpanUtils;
-
-import java.util.Random;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/10/13
- * desc : demo about BarUtils
- *
- */
-public class BarNavActivity extends BaseBackActivity {
-
- private Random random = new Random();
-
- private TextView tvAboutNav;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, BarNavActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_bar_nav;
- }
-
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- rootLayout.setBackgroundColor(Color.GRAY);
- getToolBar().setTitle(getString(R.string.demo_bar));
-
- tvAboutNav = findViewById(R.id.tv_about_nav);
- findViewById(R.id.btn_nav_show).setOnClickListener(this);
- findViewById(R.id.btn_nav_hide).setOnClickListener(this);
- findViewById(R.id.btn_nav_set_color).setOnClickListener(this);
- updateAboutNav();
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_nav_show:
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
- BarUtils.setNavBarVisibility(this, true);
- }
- break;
- case R.id.btn_nav_hide:
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
- BarUtils.setNavBarVisibility(this, false);
- }
- break;
- case R.id.btn_nav_set_color:
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- BarUtils.setNavBarColor(this, Color.argb(random.nextInt(256), random.nextInt(256), random.nextInt(256), random.nextInt(256)));
- }
- break;
- }
- updateAboutNav();
- }
-
- private void updateAboutNav() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- tvAboutNav.setText(new SpanUtils()
- .appendLine("navHeight: " + BarUtils.getNavBarHeight())
- .appendLine("isNavBarVisible: " + BarUtils.isNavBarVisible(this))
- .appendLine("getNavBarColor: #" + Integer.toHexString(BarUtils.getNavBarColor(this)))
- .append("isSupportNavBar: " + BarUtils.isSupportNavBar())
- .create()
- );
- } else {
- tvAboutNav.setText(new SpanUtils()
- .appendLine("navHeight: " + BarUtils.getNavBarHeight())
- .appendLine("isNavBarVisible: " + BarUtils.isNavBarVisible(this))
- .append("isSupportNavBar: " + BarUtils.isSupportNavBar())
- .create()
- );
- }
- }
-
- @RequiresApi(api = Build.VERSION_CODES.KITKAT)
- @Override
- public void onWindowFocusChanged(boolean hasFocus) {
- super.onWindowFocusChanged(hasFocus);
- BarUtils.setNavBarVisibility(this, BarUtils.isNavBarVisible(this));
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarNotificationActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarNotificationActivity.java
deleted file mode 100644
index 6cfecb221c..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarNotificationActivity.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package com.blankj.androidutilcode.feature.core.bar;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Handler;
-import android.support.annotation.Nullable;
-import android.view.View;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.BarUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/10/13
- * desc : demo about BarUtils
- *
- */
-public class BarNotificationActivity extends BaseBackActivity {
-
- private Handler mHandler = new Handler();
-
- public static void start(Context context) {
- Intent starter = new Intent(context, BarNotificationActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_bar_notification;
- }
-
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_bar));
-
- findViewById(R.id.btn_show_notification).setOnClickListener(this);
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_show_notification:
- BarUtils.setNotificationBarVisibility(true);
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- BarUtils.setNotificationBarVisibility(false);
- }
- }, 2000);
- break;
- }
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- mHandler.removeCallbacksAndMessages(null);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusActivity.java
deleted file mode 100644
index 9b5fd56891..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusActivity.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package com.blankj.androidutilcode.feature.core.bar;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.BarUtils;
-import com.blankj.utilcode.util.SpanUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/10/13
- * desc : demo about BarUtils
- *
- */
-public class BarStatusActivity extends BaseBackActivity {
-
- private TextView tvAboutStatus;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, BarStatusActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_bar_status;
- }
-
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_bar));
-
- tvAboutStatus = findViewById(R.id.tv_about_status);
- findViewById(R.id.btn_show_status).setOnClickListener(this);
- findViewById(R.id.btn_hide_status).setOnClickListener(this);
- findViewById(R.id.btn_light_mode).setOnClickListener(this);
- findViewById(R.id.btn_dark_mode).setOnClickListener(this);
- updateAboutStatus();
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_show_status:
- BarUtils.setStatusBarVisibility(this, true);
- break;
- case R.id.btn_hide_status:
- BarUtils.setStatusBarVisibility(this, false);
- break;
- case R.id.btn_light_mode:
- BarUtils.setStatusBarLightMode(this, true);
- break;
- case R.id.btn_dark_mode:
- BarUtils.setStatusBarLightMode(this, false);
- break;
- }
- updateAboutStatus();
- }
-
- private void updateAboutStatus() {
- tvAboutStatus.setText(new SpanUtils()
- .appendLine("statusHeight: " + BarUtils.getStatusBarHeight())
- .append("isStatusVisible: " + BarUtils.isStatusBarVisible(this))
- .create());
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusAlphaActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusAlphaActivity.java
deleted file mode 100644
index 4bf4e3c2b4..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusAlphaActivity.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package com.blankj.androidutilcode.feature.core.bar;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseActivity;
-import com.blankj.utilcode.util.BarUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/05/27
- * desc : demo about BarUtils
- *
- */
-public class BarStatusAlphaActivity extends BaseActivity {
-
- private int mAlpha;
-
- private TextView mTvStatusAlpha;
- private SeekBar sbChangeAlpha;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, BarStatusAlphaActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
- mAlpha = 112;
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_bar_status_alpha;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- findViewById(R.id.btn_set_transparent).setOnClickListener(this);
- mTvStatusAlpha = findViewById(R.id.tv_status_alpha);
- sbChangeAlpha = findViewById(R.id.sb_change_alpha);
- sbChangeAlpha.setOnSeekBarChangeListener(translucentListener);
- mTvStatusAlpha.setText(String.valueOf(mAlpha));
-
- updateStatusBar();
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_set_transparent:
- sbChangeAlpha.setProgress(0);
- break;
- }
- }
-
- private SeekBar.OnSeekBarChangeListener translucentListener = new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- mAlpha = progress;
- mTvStatusAlpha.setText(String.valueOf(mAlpha));
- updateStatusBar();
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
-
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
-
- }
- };
-
- private void updateStatusBar() {
- BarUtils.setStatusBarAlpha(BarStatusAlphaActivity.this, mAlpha);
- BarUtils.addMarginTopEqualStatusBarHeight(mTvStatusAlpha);// 其实这个只需要调用一次即可
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusAlphaFragment.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusAlphaFragment.java
deleted file mode 100644
index 3c430c3ffd..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusAlphaFragment.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package com.blankj.androidutilcode.feature.core.bar;
-
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseLazyFragment;
-import com.blankj.utilcode.util.BarUtils;
-import com.blankj.utilcode.util.LogUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/07/01
- * desc : demo about BarUtils
- *
- */
-public class BarStatusAlphaFragment extends BaseLazyFragment {
-
- private int mAlpha;
-
- private TextView mTvStatusAlpha;
- private SeekBar sbChangeAlpha;
- private View fakeStatusBar;
-
-
- public static BarStatusAlphaFragment newInstance() {
- return new BarStatusAlphaFragment();
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
- mAlpha = 112;
- }
-
- @Override
- public int bindLayout() {
- return R.layout.fragment_bar_status_alpha;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- fakeStatusBar = findViewById(R.id.fake_status_bar);
- mTvStatusAlpha = findViewById(R.id.tv_status_alpha);
- sbChangeAlpha = findViewById(R.id.sb_change_alpha);
- findViewById(R.id.btn_set_transparent).setOnClickListener(this);
- sbChangeAlpha.setOnSeekBarChangeListener(translucentListener);
- mTvStatusAlpha.setText(String.valueOf(mAlpha));
-
- updateFakeStatusBar();
- }
-
- @Override
- public void doLazyBusiness() {
- LogUtils.d("doLazyBusiness() called");
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_set_transparent:
- sbChangeAlpha.setProgress(0);
- break;
- }
- }
-
- private SeekBar.OnSeekBarChangeListener translucentListener = new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- mAlpha = progress;
- mTvStatusAlpha.setText(String.valueOf(mAlpha));
- updateFakeStatusBar();
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
-
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
-
- }
- };
-
- public void updateFakeStatusBar() {
- BarUtils.setStatusBarAlpha(fakeStatusBar, mAlpha);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusColorActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusColorActivity.java
deleted file mode 100644
index bd978c2f9a..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusColorActivity.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package com.blankj.androidutilcode.feature.core.bar;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.content.ContextCompat;
-import android.view.View;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.UtilsApp;
-import com.blankj.androidutilcode.base.BaseActivity;
-import com.blankj.utilcode.util.BarUtils;
-
-import java.util.Random;
-
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/05/27
- * desc : demo about BarUtils
- *
- */
-public class BarStatusColorActivity extends BaseActivity {
-
- private Random mRandom;
- private int mColor;
- private int mAlpha;
-
- private TextView mTvStatusAlpha;
- private SeekBar sbChangeAlpha;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, BarStatusColorActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
- mRandom = new Random();
- mColor = ContextCompat.getColor(UtilsApp.getInstance(), R.color.colorPrimary);
- mAlpha = 112;
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_bar_status_color;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- findViewById(R.id.btn_random_color).setOnClickListener(this);
- findViewById(R.id.btn_set_transparent).setOnClickListener(this);
- mTvStatusAlpha = findViewById(R.id.tv_status_alpha);
- sbChangeAlpha = findViewById(R.id.sb_change_alpha);
- sbChangeAlpha.setOnSeekBarChangeListener(colorListener);
- mTvStatusAlpha.setText(String.valueOf(mAlpha));
-
- updateStatusBar();
- }
-
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_random_color:
- mColor = 0xff000000 | mRandom.nextInt(0xffffff);
- updateStatusBar();
- break;
- case R.id.btn_set_transparent:
- sbChangeAlpha.setProgress(0);
- break;
- }
- }
-
- private SeekBar.OnSeekBarChangeListener colorListener = new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- mAlpha = progress;
- mTvStatusAlpha.setText(String.valueOf(mAlpha));
- updateStatusBar();
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
-
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
-
- }
- };
-
- private void updateStatusBar() {
- BarUtils.setStatusBarColor(this, mColor, mAlpha);
- BarUtils.addMarginTopEqualStatusBarHeight(mTvStatusAlpha);// 其实这个只需要调用一次即可
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusColorFragment.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusColorFragment.java
deleted file mode 100644
index c0c6a6faf7..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusColorFragment.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package com.blankj.androidutilcode.feature.core.bar;
-
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.content.ContextCompat;
-import android.view.View;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.UtilsApp;
-import com.blankj.androidutilcode.base.BaseLazyFragment;
-import com.blankj.utilcode.util.BarUtils;
-import com.blankj.utilcode.util.LogUtils;
-
-import java.util.Random;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/07/01
- * desc : demo about BarUtils
- *
- */
-public class BarStatusColorFragment extends BaseLazyFragment {
-
- private Random mRandom;
- private int mColor;
- private int mAlpha;
-
- private TextView mTvStatusAlpha;
- private SeekBar sbChangeAlpha;
- private View fakeStatusBar;
-
- public static BarStatusColorFragment newInstance() {
- return new BarStatusColorFragment();
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
- mRandom = new Random();
- mColor = ContextCompat.getColor(UtilsApp.getInstance(), R.color.colorPrimary);
- mAlpha = 112;
- }
-
- @Override
- public int bindLayout() {
- return R.layout.fragment_bar_status_color;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- fakeStatusBar = findViewById(R.id.fake_status_bar);
- findViewById(R.id.btn_random_color).setOnClickListener(this);
- findViewById(R.id.btn_set_transparent).setOnClickListener(this);
- mTvStatusAlpha = findViewById(R.id.tv_status_alpha);
- sbChangeAlpha = findViewById(R.id.sb_change_alpha);
- sbChangeAlpha.setOnSeekBarChangeListener(colorListener);
- mTvStatusAlpha.setText(String.valueOf(mAlpha));
-
- updateFakeStatusBar();
- }
-
-
- @Override
- public void doLazyBusiness() {
- LogUtils.d("doLazyBusiness() called");
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_random_color:
- mColor = 0xff000000 | mRandom.nextInt(0xffffff);
- updateFakeStatusBar();
- break;
- case R.id.btn_set_transparent:
- sbChangeAlpha.setProgress(0);
- break;
- }
- }
-
- private SeekBar.OnSeekBarChangeListener colorListener = new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- mAlpha = progress;
- mTvStatusAlpha.setText(String.valueOf(mAlpha));
- updateFakeStatusBar();
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
-
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
-
- }
- };
-
- public void updateFakeStatusBar() {
- BarUtils.setStatusBarColor(fakeStatusBar, mColor, mAlpha);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusDrawerActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusDrawerActivity.java
deleted file mode 100644
index d8e7618415..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusDrawerActivity.java
+++ /dev/null
@@ -1,149 +0,0 @@
-package com.blankj.androidutilcode.feature.core.bar;
-
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Color;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.content.ContextCompat;
-import android.view.View;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.CompoundButton;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.UtilsApp;
-import com.blankj.androidutilcode.base.BaseDrawerActivity;
-import com.blankj.utilcode.util.BarUtils;
-
-import java.util.Random;
-
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/05/27
- * desc : demo about BarUtils
- *
- */
-public class BarStatusDrawerActivity extends BaseDrawerActivity {
-
- private Random mRandom;
- private int mColor;
- private int mAlpha;
-
- private View fakeStatusBar;
- private CheckBox cbAlpha;
- private CheckBox cbFront;
- private TextView tvStatusAlpha;
- private SeekBar sbChangeAlpha;
- private Button btnRandomColor;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, BarStatusDrawerActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
- mRandom = new Random();
- mColor = ContextCompat.getColor(UtilsApp.getInstance(), R.color.colorPrimary);
- mAlpha = 112;
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_bar_status_drawer;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- fakeStatusBar = findViewById(R.id.fake_status_bar);
- cbAlpha = findViewById(R.id.cb_alpha);
- cbFront = findViewById(R.id.cb_front);
- btnRandomColor = findViewById(R.id.btn_random_color);
- tvStatusAlpha = findViewById(R.id.tv_status_alpha);
- sbChangeAlpha = findViewById(R.id.sb_change_alpha);
-
- cbAlpha.setOnCheckedChangeListener(mAlphaCheckedChangeListener);
- cbFront.setOnCheckedChangeListener(mFrontCheckedChangeListener);
- btnRandomColor.setOnClickListener(this);
- findViewById(R.id.btn_set_transparent).setOnClickListener(this);
- sbChangeAlpha.setOnSeekBarChangeListener(mColorListener);
-
- tvStatusAlpha.setText(String.valueOf(mAlpha));
-
- updateStatusBar();
- }
-
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_random_color:
- mColor = 0xff000000 | mRandom.nextInt(0xffffff);
- updateStatusBar();
- break;
- case R.id.btn_set_transparent:
- sbChangeAlpha.setProgress(0);
- break;
- }
- }
-
- private SeekBar.OnSeekBarChangeListener mColorListener = new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- mAlpha = progress;
- tvStatusAlpha.setText(String.valueOf(mAlpha));
- updateStatusBar();
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
-
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
-
- }
- };
-
- CompoundButton.OnCheckedChangeListener mAlphaCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- if (isChecked) {
- btnRandomColor.setVisibility(View.GONE);
- flActivityContainer.setBackgroundResource(R.drawable.bg_bar);
- } else {
- btnRandomColor.setVisibility(View.VISIBLE);
- flActivityContainer.setBackgroundColor(Color.WHITE);
- }
- updateStatusBar();
- }
- };
-
- CompoundButton.OnCheckedChangeListener mFrontCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- updateStatusBar();
- }
- };
-
- private void updateStatusBar() {
- if (cbAlpha.isChecked()) {
- BarUtils.setStatusBarAlpha4Drawer(BarStatusDrawerActivity.this, rootLayout, fakeStatusBar, mAlpha, cbFront.isChecked());
- } else {
- BarUtils.setStatusBarColor4Drawer(BarStatusDrawerActivity.this, rootLayout, fakeStatusBar, mColor, mAlpha, cbFront.isChecked());
- }
- BarUtils.addMarginTopEqualStatusBarHeight(cbAlpha);// 其实这个只需要调用一次即可
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusFragmentActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusFragmentActivity.java
deleted file mode 100644
index 728c6fa416..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusFragmentActivity.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package com.blankj.androidutilcode.feature.core.bar;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.design.widget.BottomNavigationView;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentPagerAdapter;
-import android.support.v4.view.ViewPager;
-import android.view.MenuItem;
-import android.view.View;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseActivity;
-
-import java.util.ArrayList;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/05/27
- * desc : demo about BarUtils
- *
- */
-public class BarStatusFragmentActivity extends BaseActivity {
-
- private int[] itemIds = new int[]{
- R.id.navigation_color,
- R.id.navigation_alpha,
- R.id.navigation_image_view
- };
-
- private ViewPager mVpStatusBar;
- private BottomNavigationView navigation;
- private ArrayList mFragmentList = new ArrayList<>();
-
- public static void start(Context context) {
- Intent starter = new Intent(context, BarStatusFragmentActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public Intent getIntent() {
- return super.getIntent();
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_bar_status_fragment;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- mVpStatusBar = findViewById(R.id.vp_status_bar);
- navigation = findViewById(R.id.navigation_status_bar);
-
- mFragmentList.add(BarStatusColorFragment.newInstance());
- mFragmentList.add(BarStatusAlphaFragment.newInstance());
- mFragmentList.add(BarStatusImageViewFragment.newInstance());
-
- mVpStatusBar.setOffscreenPageLimit(2);
- mVpStatusBar.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
- @Override
- public Fragment getItem(int position) {
- return mFragmentList.get(position);
- }
-
- @Override
- public int getCount() {
- return mFragmentList.size();
- }
- });
-
- mVpStatusBar.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
- @Override
- public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-
- }
-
- @Override
- public void onPageSelected(int position) {
- navigation.setSelectedItemId(itemIds[position]);
- }
-
- @Override
- public void onPageScrollStateChanged(int state) {
-
- }
- });
-
- navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
-
- }
-
- private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
- = new BottomNavigationView.OnNavigationItemSelectedListener() {
-
- @Override
- public boolean onNavigationItemSelected(@NonNull MenuItem item) {
- switch (item.getItemId()) {
- case R.id.navigation_color:
- mVpStatusBar.setCurrentItem(0);
- return true;
- case R.id.navigation_alpha:
- mVpStatusBar.setCurrentItem(1);
- return true;
- case R.id.navigation_image_view:
- mVpStatusBar.setCurrentItem(2);
- return true;
- }
- return false;
- }
- };
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusImageViewActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusImageViewActivity.java
deleted file mode 100644
index d422f2f1e6..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusImageViewActivity.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package com.blankj.androidutilcode.feature.core.bar;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseActivity;
-import com.blankj.utilcode.util.BarUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/05/27
- * desc : demo about BarUtils
- *
- */
-public class BarStatusImageViewActivity extends BaseActivity {
-
- private int mAlpha;
-
- private TextView mTvStatusAlpha;
- private SeekBar sbChangeAlpha;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, BarStatusImageViewActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
- mAlpha = 112;
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_bar_status_image_view;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- findViewById(R.id.btn_set_transparent).setOnClickListener(this);
- mTvStatusAlpha = findViewById(R.id.tv_status_alpha);
- sbChangeAlpha = findViewById(R.id.sb_change_alpha);
- sbChangeAlpha.setOnSeekBarChangeListener(translucentListener);
- mTvStatusAlpha.setText(String.valueOf(mAlpha));
-
- updateStatusBar();
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_set_transparent:
- sbChangeAlpha.setProgress(0);
- break;
- }
- }
-
- private SeekBar.OnSeekBarChangeListener translucentListener = new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- mAlpha = progress;
- mTvStatusAlpha.setText(String.valueOf(mAlpha));
- updateStatusBar();
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
-
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
-
- }
- };
-
- private void updateStatusBar() {
- BarUtils.setStatusBarAlpha(BarStatusImageViewActivity.this, mAlpha, true);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusImageViewFragment.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusImageViewFragment.java
deleted file mode 100644
index 7f81597156..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusImageViewFragment.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package com.blankj.androidutilcode.feature.core.bar;
-
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseLazyFragment;
-import com.blankj.utilcode.util.BarUtils;
-import com.blankj.utilcode.util.LogUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/07/01
- * desc : demo about BarUtils
- *
- */
-public class BarStatusImageViewFragment extends BaseLazyFragment {
-
- private int mAlpha;
-
- private TextView mTvStatusAlpha;
- private SeekBar sbChangeAlpha;
- private View fakeStatusBar;
-
- public static BarStatusImageViewFragment newInstance() {
- return new BarStatusImageViewFragment();
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
- mAlpha = 112;
- }
-
- @Override
- public int bindLayout() {
- return R.layout.fragment_bar_status_image_view;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- fakeStatusBar = findViewById(R.id.fake_status_bar);
- mTvStatusAlpha = findViewById(R.id.tv_status_alpha);
- sbChangeAlpha = findViewById(R.id.sb_change_alpha);
- findViewById(R.id.btn_set_transparent).setOnClickListener(this);
- sbChangeAlpha.setOnSeekBarChangeListener(translucentListener);
- mTvStatusAlpha.setText(String.valueOf(mAlpha));
-
- updateFakeStatusBar();
- }
-
- @Override
- public void doLazyBusiness() {
- LogUtils.d("doLazyBusiness() called");
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_set_transparent:
- sbChangeAlpha.setProgress(0);
- break;
- }
- }
-
- private SeekBar.OnSeekBarChangeListener translucentListener = new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- mAlpha = progress;
- mTvStatusAlpha.setText(String.valueOf(mAlpha));
- updateFakeStatusBar();
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
-
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
-
- }
- };
-
- public void updateFakeStatusBar() {
- BarUtils.setStatusBarAlpha(fakeStatusBar, mAlpha);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusSwipeBackActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusSwipeBackActivity.java
deleted file mode 100644
index fbfbfda201..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusSwipeBackActivity.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package com.blankj.androidutilcode.feature.core.bar;
-
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Color;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.content.ContextCompat;
-import android.view.View;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.CompoundButton;
-import android.widget.LinearLayout;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.UtilsApp;
-import com.blankj.androidutilcode.base.BaseActivity;
-import com.blankj.utilcode.util.BarUtils;
-import com.r0adkll.slidr.Slidr;
-
-import java.util.Random;
-
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/05/27
- * desc : demo about BarUtils
- *
- */
-public class BarStatusSwipeBackActivity extends BaseActivity {
-
- private Random mRandom;
- private int mColor;
- private int mAlpha;
-
- private LinearLayout llContainer;
- private CheckBox cbAlpha;
- private TextView tvStatusAlpha;
- private SeekBar sbChangeAlpha;
- private Button btnRandomColor;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, BarStatusSwipeBackActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
- mRandom = new Random();
- mColor = ContextCompat.getColor(UtilsApp.getInstance(), R.color.colorPrimary);
- mAlpha = 112;
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_bar_status_swipe_back;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- Slidr.attach(this);
-
- llContainer = findViewById(R.id.ll_container);
- cbAlpha = findViewById(R.id.cb_alpha);
- btnRandomColor = findViewById(R.id.btn_random_color);
- tvStatusAlpha = findViewById(R.id.tv_status_alpha);
- sbChangeAlpha = findViewById(R.id.sb_change_alpha);
-
- cbAlpha.setOnCheckedChangeListener(mCheckedChangeListener);
- btnRandomColor.setOnClickListener(this);
- findViewById(R.id.btn_set_transparent).setOnClickListener(this);
- sbChangeAlpha.setOnSeekBarChangeListener(mColorListener);
-
- tvStatusAlpha.setText(String.valueOf(mAlpha));
-
- updateStatusBar();
- }
-
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_random_color:
- mColor = 0xff000000 | mRandom.nextInt(0xffffff);
- updateStatusBar();
- break;
- case R.id.btn_set_transparent:
- sbChangeAlpha.setProgress(0);
- break;
- }
- }
-
- private SeekBar.OnSeekBarChangeListener mColorListener = new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- mAlpha = progress;
- tvStatusAlpha.setText(String.valueOf(mAlpha));
- updateStatusBar();
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
-
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
-
- }
- };
-
- CompoundButton.OnCheckedChangeListener mCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- if (isChecked) {
- btnRandomColor.setVisibility(View.GONE);
- llContainer.setBackgroundResource(R.drawable.bg_bar);
- } else {
- btnRandomColor.setVisibility(View.VISIBLE);
- llContainer.setBackgroundColor(Color.WHITE);
- }
- updateStatusBar();
- }
- };
-
- private void updateStatusBar() {
- if (cbAlpha.isChecked()) {
- BarUtils.setStatusBarAlpha(this, mAlpha);
- BarUtils.addMarginTopEqualStatusBarHeight(cbAlpha);
- } else {
- BarUtils.setStatusBarColor(this, mColor, mAlpha);
- BarUtils.addMarginTopEqualStatusBarHeight(cbAlpha);
- }
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/clean/CleanActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/clean/CleanActivity.java
deleted file mode 100644
index b066801ede..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/clean/CleanActivity.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package com.blankj.androidutilcode.feature.core.clean;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Environment;
-import android.support.annotation.Nullable;
-import android.view.View;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.CleanUtils;
-import com.blankj.utilcode.util.SnackbarUtils;
-
-import java.io.File;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/29
- * desc : demo about CleanUtils
- *
- */
-public class CleanActivity extends BaseBackActivity {
-
- private View snackBarRootView;
- private String internalCachePath;
- private String internalFilesPath;
- private String internalDbs;
- private String internalSp;
- private String externalCache;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, CleanActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_clean;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_clean));
-
- snackBarRootView = findViewById(android.R.id.content);
- findViewById(R.id.btn_clean_internal_cache).setOnClickListener(this);
- findViewById(R.id.btn_clean_internal_files).setOnClickListener(this);
- findViewById(R.id.btn_clean_internal_databases).setOnClickListener(this);
- findViewById(R.id.btn_clean_internal_sp).setOnClickListener(this);
- findViewById(R.id.btn_clean_external_cache).setOnClickListener(this);
-
- internalCachePath = getCacheDir().getPath();
- internalFilesPath = getFilesDir().getPath();
- internalDbs = getFilesDir().getParent() + File.separator + "databases";
- internalSp = getFilesDir().getParent() + File.separator + "shared_prefs";
-
- if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
- externalCache = getExternalCacheDir().getAbsolutePath();
- }
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_clean_internal_cache:
- showSnackbar(CleanUtils.cleanInternalCache(), internalCachePath);
- break;
- case R.id.btn_clean_internal_files:
- showSnackbar(CleanUtils.cleanInternalFiles(), internalFilesPath);
- break;
- case R.id.btn_clean_internal_databases:
- showSnackbar(CleanUtils.cleanInternalDbs(), internalDbs);
- break;
- case R.id.btn_clean_internal_sp:
- showSnackbar(CleanUtils.cleanInternalSp(), internalSp);
- break;
- case R.id.btn_clean_external_cache:
- showSnackbar(CleanUtils.cleanExternalCache(), externalCache);
- break;
- }
- }
-
- private void showSnackbar(final boolean isSuccess, final String path) {
- if (isSuccess) {
- SnackbarUtils.with(snackBarRootView)
- .setMessage("clean \"" + path + "\" dir success")
- .setDuration(SnackbarUtils.LENGTH_LONG)
- .showSuccess();
- } else {
- SnackbarUtils.with(snackBarRootView)
- .setMessage("clean \"" + path + "\" dir failed")
- .setDuration(SnackbarUtils.LENGTH_LONG)
- .showError();
- }
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/device/DeviceActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/device/DeviceActivity.java
deleted file mode 100644
index ac941a17df..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/device/DeviceActivity.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package com.blankj.androidutilcode.feature.core.device;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.DeviceUtils;
-import com.blankj.utilcode.util.SpanUtils;
-
-import java.util.Arrays;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/27
- * desc : demo about DeviceUtils
- *
- */
-public class DeviceActivity extends BaseBackActivity {
-
- public static void start(Context context) {
- Intent starter = new Intent(context, DeviceActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_device;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_device));
-
- findViewById(R.id.btn_shutdown).setOnClickListener(this);
- findViewById(R.id.btn_reboot).setOnClickListener(this);
- findViewById(R.id.btn_reboot_to_recovery).setOnClickListener(this);
- findViewById(R.id.btn_reboot_to_bootloader).setOnClickListener(this);
- TextView tvAboutDevice = findViewById(R.id.tv_about_device);
- tvAboutDevice.setText(new SpanUtils()
- .appendLine("isRoot: " + DeviceUtils.isDeviceRooted())
- .appendLine("getSDKVersionName: " + DeviceUtils.getSDKVersionName())
- .appendLine("getSDKVersionCode: " + DeviceUtils.getSDKVersionCode())
- .appendLine("getAndroidID: " + DeviceUtils.getAndroidID())
- .appendLine("getMacAddress: " + DeviceUtils.getMacAddress())
- .appendLine("getManufacturer: " + DeviceUtils.getManufacturer())
- .appendLine("getModel: " + DeviceUtils.getModel())
- .append("getABIs: " + Arrays.asList(DeviceUtils.getABIs()))
- .create()
- );
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_shutdown:
- DeviceUtils.shutdown();
- break;
- case R.id.btn_reboot:
- DeviceUtils.reboot();
- break;
- case R.id.btn_reboot_to_recovery:
- DeviceUtils.reboot2Recovery();
- break;
- case R.id.btn_reboot_to_bootloader:
- DeviceUtils.reboot2Bootloader();
- break;
- }
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/ChildFragment.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/ChildFragment.java
deleted file mode 100644
index 94b59ef5ac..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/ChildFragment.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package com.blankj.androidutilcode.feature.core.fragment;
-
-import android.graphics.Color;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseFragment;
-import com.blankj.utilcode.util.FragmentUtils;
-import com.blankj.utilcode.util.LogUtils;
-
-import java.util.Random;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 17/02/02
- * desc : demo about FragmentUtils
- *
- */
-public class ChildFragment extends BaseFragment
- implements FragmentUtils.OnBackClickListener {
-
- private TextView tvAboutFragment;
-
- public static ChildFragment newInstance() {
- Bundle args = new Bundle();
- ChildFragment fragment = new ChildFragment();
- fragment.setArguments(args);
- return fragment;
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.fragment_child;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- Random random = new Random();
- FragmentUtils.setBackgroundColor(this, Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
- findViewById(R.id.btn_show_about_fragment).setOnClickListener(this);
- findViewById(R.id.btn_pop).setOnClickListener(this);
- tvAboutFragment = findViewById(R.id.tv_about_fragment);
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- tvAboutFragment.setText("");
- switch (view.getId()) {
- case R.id.btn_show_about_fragment:
- tvAboutFragment.setText("top: " + FragmentUtils.getSimpleName(FragmentUtils.getTop(getFragmentManager()))
- + "\ntopInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopInStack(getFragmentManager()))
- + "\ntopShow: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShow(getFragmentManager()))
- + "\ntopShowInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShowInStack(getFragmentManager()))
- + "\n---all of fragments---\n"
- + FragmentUtils.getAllFragments(getFragmentManager()).toString()
- + "\n----------------------\n\n"
- + "---stack top---\n"
- + FragmentUtils.getAllFragmentsInStack(getFragmentManager()).toString()
- + "\n---stack bottom---\n\n"
- );
- break;
-// case R.id.btn_pop:
-// FragmentUtils.popFragment(getFragmentManager());
-// break;
- }
- }
-
- @Override
- public boolean onBackClick() {
- LogUtils.d("demo2 onBackClick");
- return false;
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/DetailTransition.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/DetailTransition.java
deleted file mode 100644
index 1893362676..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/DetailTransition.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.blankj.androidutilcode.feature.core.fragment;
-
-import android.content.Context;
-import android.os.Build;
-import android.support.annotation.RequiresApi;
-import android.transition.ChangeBounds;
-import android.transition.ChangeImageTransform;
-import android.transition.ChangeTransform;
-import android.transition.TransitionSet;
-import android.util.AttributeSet;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 17/02/21
- * desc : demo about FragmentUtils
- *
- */
-@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
-public class DetailTransition extends TransitionSet {
- public DetailTransition() {
- init();
- }
-
- // 允许资源文件使用
- public DetailTransition(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
-
- private void init() {
- setOrdering(ORDERING_TOGETHER);
- addTransition(new ChangeBounds()).
- addTransition(new ChangeTransform()).
- addTransition(new ChangeImageTransform());
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/FragmentActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/FragmentActivity.java
deleted file mode 100644
index c4524c3a04..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/FragmentActivity.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package com.blankj.androidutilcode.feature.core.fragment;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.PersistableBundle;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.design.widget.BottomNavigationView;
-import android.support.v4.app.Fragment;
-import android.view.MenuItem;
-import android.view.View;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseActivity;
-import com.blankj.utilcode.util.FragmentUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 17/02/01
- * desc : demo about FragmentUtils
- *
- */
-public class FragmentActivity extends BaseActivity {
-
- private int[] itemIds = new int[]{
- R.id.navigation_fragment_zero,
- R.id.navigation_fragment_one,
- R.id.navigation_fragment_two
- };
-
- private BottomNavigationView navigation;
- private Fragment[] mFragments = new Fragment[3];
- private int curIndex;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, FragmentActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_fragment;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- if (savedInstanceState != null) {
- curIndex = savedInstanceState.getInt("curIndex");
- }
-
- navigation = findViewById(R.id.navigation_fragment);
- navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
-
- mFragments[0] = Root0Fragment.newInstance();
- mFragments[1] = Root1Fragment.newInstance();
- mFragments[2] = Root2Fragment.newInstance();
- FragmentUtils.add(getSupportFragmentManager(), mFragments, R.id.fragment_container, curIndex);
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
-
- }
-
-
-// @Override
-// public void onBackPressed() {
-// if (!FragmentUtils.dispatchBackPress(getSupportFragmentManager())) {
-// super.onBackPressed();
-// }
-// }
-
- private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
- = new BottomNavigationView.OnNavigationItemSelectedListener() {
-
- @Override
- public boolean onNavigationItemSelected(@NonNull MenuItem item) {
- switch (item.getItemId()) {
- case R.id.navigation_fragment_zero:
- showCurrentFragment(0);
- return true;
- case R.id.navigation_fragment_one:
- showCurrentFragment(1);
- return true;
- case R.id.navigation_fragment_two:
- showCurrentFragment(2);
- return true;
- }
- return false;
- }
- };
-
- private void showCurrentFragment(int index) {
- FragmentUtils.showHide(curIndex = index, mFragments);
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
- super.onSaveInstanceState(outState, outPersistentState);
- outState.putInt("curIndex", curIndex);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/Root0Fragment.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/Root0Fragment.java
deleted file mode 100644
index a7048f6379..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/Root0Fragment.java
+++ /dev/null
@@ -1,166 +0,0 @@
-package com.blankj.androidutilcode.feature.core.fragment;
-
-import android.graphics.Color;
-import android.os.Build;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.transition.Fade;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseFragment;
-import com.blankj.utilcode.util.FragmentUtils;
-
-import java.util.Random;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 17/02/02
- * desc : demo about FragmentUtils
- *
- */
-public class Root0Fragment extends BaseFragment
- implements FragmentUtils.OnBackClickListener {
-
- ImageView ivSharedElement;
- TextView tvAboutFragment;
-
- public static Root0Fragment newInstance() {
- Bundle args = new Bundle();
- Root0Fragment fragment = new Root0Fragment();
- fragment.setArguments(args);
- return fragment;
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.fragment_root;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- Random random = new Random();
- FragmentUtils.setBackgroundColor(this, Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
- findViewById(R.id.btn_show_about_fragment).setOnClickListener(this);
- findViewById(R.id.btn_add).setOnClickListener(this);
- findViewById(R.id.btn_add_hide).setOnClickListener(this);
- findViewById(R.id.btn_add_hide_stack).setOnClickListener(this);
- findViewById(R.id.btn_add).setOnClickListener(this);
- findViewById(R.id.btn_add_show).setOnClickListener(this);
- findViewById(R.id.btn_add_child).setOnClickListener(this);
- findViewById(R.id.btn_pop_to_root).setOnClickListener(this);
- findViewById(R.id.btn_pop_add).setOnClickListener(this);
- findViewById(R.id.btn_hide_show).setOnClickListener(this);
- findViewById(R.id.btn_replace).setOnClickListener(this);
- ivSharedElement = findViewById(R.id.iv_shared_element);
- tvAboutFragment = findViewById(R.id.tv_about_fragment);
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- tvAboutFragment.setText("");
- switch (view.getId()) {
- case R.id.btn_show_about_fragment:
- tvAboutFragment.setText("top: " + FragmentUtils.getSimpleName(FragmentUtils.getTop(getFragmentManager()))
- + "\ntopInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopInStack(getFragmentManager()))
- + "\ntopShow: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShow(getFragmentManager()))
- + "\ntopShowInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShowInStack(getFragmentManager()))
- + "\n---all of fragments---\n"
- + FragmentUtils.getAllFragments(getFragmentManager()).toString()
- + "\n----------------------\n\n"
- + "---stack top---\n"
- + FragmentUtils.getAllFragmentsInStack(getFragmentManager()).toString()
- + "\n---stack bottom---\n\n"
- );
- break;
- case R.id.btn_add:
- FragmentUtils.add(getFragmentManager(),
- ChildFragment.newInstance(),
- R.id.child_fragment_container,
- false,
- true);
- break;
- case R.id.btn_add_hide:
- FragmentUtils.add(getFragmentManager(),
- ChildFragment.newInstance(),
- R.id.fragment_container,
- true);
- break;
- case R.id.btn_add_hide_stack:
- FragmentUtils.add(getFragmentManager(),
- ChildFragment.newInstance(),
- R.id.fragment_container,
- true,
- true);
- break;
-// case R.id.btn_add_show:
-// FragmentUtils.add(getFragmentManager(),
-// addSharedElement(Demo1Fragment.newInstance()),
-// R.id.fragment_container,
-// false,
-// false,
-// sharedElement);
-// break;
-// case R.id.btn_add_child:
-// FragmentUtils.add(getChildFragmentManager(),
-// ChildFragment.newInstance(),
-// R.id.child_fragment_container,
-// false,
-// true);
-// break;
-// case R.id.btn_pop_to_root:
-// FragmentUtils.popToFragment(getFragmentManager(),
-// Demo1Fragment.class,
-// true);
-// break;
-// case R.id.btn_pop_add:
-// FragmentUtils.popAddFragment(getFragmentManager(),
-// addSharedElement(ChildFragment.newInstance()),
-// R.id.fragment_container,
-// true,
-// sharedElement);
-// break;
-// case R.id.btn_hide_show:
-// Fragment fragment1 = FragmentUtils.findFragment(getFragmentManager(), Demo1Fragment.class);
-// if (fragment1 != null) {
-// FragmentUtils.showHideFragment(this, fragment1);
-// } else {
-// ToastUtils.showLong("please add demo1 first!");
-// }
-// break;
-// case R.id.btn_replace:
-// ((FragmentActivity) getActivity()).rootFragment = FragmentUtils.replaceFragment(this, addSharedElement(Demo3Fragment.newInstance()), false, sharedElement);
-// break;
- }
- }
-
- private Fragment addSharedElement(Fragment fragment) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- fragment.setSharedElementEnterTransition(new DetailTransition());
- fragment.setEnterTransition(new Fade());
- fragment.setSharedElementReturnTransition(new DetailTransition());
- }
- return fragment;
- }
-
- @Override
- public boolean onBackClick() {
-// FragmentUtils.popToFragment(getFragmentManager(), Demo1Fragment.class, true);
- return false;
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/Root1Fragment.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/Root1Fragment.java
deleted file mode 100644
index cce86072d2..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/Root1Fragment.java
+++ /dev/null
@@ -1,164 +0,0 @@
-package com.blankj.androidutilcode.feature.core.fragment;
-
-import android.graphics.Color;
-import android.os.Build;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.transition.Fade;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseFragment;
-import com.blankj.utilcode.util.FragmentUtils;
-
-import java.util.Random;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 17/02/02
- * desc : demo about FragmentUtils
- *
- */
-public class Root1Fragment extends BaseFragment
- implements FragmentUtils.OnBackClickListener {
-
- ImageView ivSharedElement;
- TextView tvAboutFragment;
-
- public static Root1Fragment newInstance() {
- Bundle args = new Bundle();
- Root1Fragment fragment = new Root1Fragment();
- fragment.setArguments(args);
- return fragment;
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.fragment_root;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- Random random = new Random();
- FragmentUtils.setBackgroundColor(this, Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
- findViewById(R.id.btn_show_about_fragment).setOnClickListener(this);
- findViewById(R.id.btn_add).setOnClickListener(this);
- findViewById(R.id.btn_add_hide).setOnClickListener(this);
- findViewById(R.id.btn_add_hide_stack).setOnClickListener(this);
- findViewById(R.id.btn_add).setOnClickListener(this);
- findViewById(R.id.btn_add_show).setOnClickListener(this);
- findViewById(R.id.btn_add_child).setOnClickListener(this);
- findViewById(R.id.btn_pop_to_root).setOnClickListener(this);
- findViewById(R.id.btn_pop_add).setOnClickListener(this);
- findViewById(R.id.btn_hide_show).setOnClickListener(this);
- findViewById(R.id.btn_replace).setOnClickListener(this);
- ivSharedElement = findViewById(R.id.iv_shared_element);
- tvAboutFragment = findViewById(R.id.tv_about_fragment);
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- tvAboutFragment.setText("");
- switch (view.getId()) {
- case R.id.btn_show_about_fragment:
- tvAboutFragment.setText("top: " + FragmentUtils.getSimpleName(FragmentUtils.getTop(getFragmentManager()))
- + "\ntopInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopInStack(getFragmentManager()))
- + "\ntopShow: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShow(getFragmentManager()))
- + "\ntopShowInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShowInStack(getFragmentManager()))
- + "\n---all of fragments---\n"
- + FragmentUtils.getAllFragments(getFragmentManager()).toString()
- + "\n----------------------\n\n"
- + "---stack top---\n"
- + FragmentUtils.getAllFragmentsInStack(getFragmentManager()).toString()
- + "\n---stack bottom---\n\n"
- );
- break;
- case R.id.btn_add:
- FragmentUtils.add(getFragmentManager(),
- ChildFragment.newInstance(),
- R.id.fragment_container);
- break;
- case R.id.btn_add_hide:
- FragmentUtils.add(getFragmentManager(),
- ChildFragment.newInstance(),
- R.id.fragment_container,
- true);
- break;
- case R.id.btn_add_hide_stack:
- FragmentUtils.add(getFragmentManager(),
- ChildFragment.newInstance(),
- R.id.fragment_container,
- true,
- true);
- break;
-// case R.id.btn_add_show:
-// FragmentUtils.add(getFragmentManager(),
-// addSharedElement(Demo1Fragment.newInstance()),
-// R.id.fragment_container,
-// false,
-// false,
-// sharedElement);
-// break;
-// case R.id.btn_add_child:
-// FragmentUtils.add(getChildFragmentManager(),
-// ChildFragment.newInstance(),
-// R.id.child_fragment_container,
-// false,
-// true);
-// break;
-// case R.id.btn_pop_to_root:
-// FragmentUtils.popToFragment(getFragmentManager(),
-// Demo1Fragment.class,
-// true);
-// break;
-// case R.id.btn_pop_add:
-// FragmentUtils.popAddFragment(getFragmentManager(),
-// addSharedElement(ChildFragment.newInstance()),
-// R.id.fragment_container,
-// true,
-// sharedElement);
-// break;
-// case R.id.btn_hide_show:
-// Fragment fragment1 = FragmentUtils.findFragment(getFragmentManager(), Demo1Fragment.class);
-// if (fragment1 != null) {
-// FragmentUtils.showHideFragment(this, fragment1);
-// } else {
-// ToastUtils.showLong("please add demo1 first!");
-// }
-// break;
-// case R.id.btn_replace:
-// ((FragmentActivity) getActivity()).rootFragment = FragmentUtils.replaceFragment(this, addSharedElement(Demo3Fragment.newInstance()), false, sharedElement);
-// break;
- }
- }
-
- private Fragment addSharedElement(Fragment fragment) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- fragment.setSharedElementEnterTransition(new DetailTransition());
- fragment.setEnterTransition(new Fade());
- fragment.setSharedElementReturnTransition(new DetailTransition());
- }
- return fragment;
- }
-
- @Override
- public boolean onBackClick() {
-// FragmentUtils.popToFragment(getFragmentManager(), Demo1Fragment.class, true);
- return false;
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/Root2Fragment.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/Root2Fragment.java
deleted file mode 100644
index 2a6bc6c3d5..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/fragment/Root2Fragment.java
+++ /dev/null
@@ -1,164 +0,0 @@
-package com.blankj.androidutilcode.feature.core.fragment;
-
-import android.graphics.Color;
-import android.os.Build;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.transition.Fade;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseFragment;
-import com.blankj.utilcode.util.FragmentUtils;
-
-import java.util.Random;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 17/02/02
- * desc : demo about FragmentUtils
- *
- */
-public class Root2Fragment extends BaseFragment
- implements FragmentUtils.OnBackClickListener {
-
- ImageView ivSharedElement;
- TextView tvAboutFragment;
-
- public static Root2Fragment newInstance() {
- Bundle args = new Bundle();
- Root2Fragment fragment = new Root2Fragment();
- fragment.setArguments(args);
- return fragment;
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.fragment_root;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- Random random = new Random();
- FragmentUtils.setBackgroundColor(this, Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
- findViewById(R.id.btn_show_about_fragment).setOnClickListener(this);
- findViewById(R.id.btn_add).setOnClickListener(this);
- findViewById(R.id.btn_add_hide).setOnClickListener(this);
- findViewById(R.id.btn_add_hide_stack).setOnClickListener(this);
- findViewById(R.id.btn_add).setOnClickListener(this);
- findViewById(R.id.btn_add_show).setOnClickListener(this);
- findViewById(R.id.btn_add_child).setOnClickListener(this);
- findViewById(R.id.btn_pop_to_root).setOnClickListener(this);
- findViewById(R.id.btn_pop_add).setOnClickListener(this);
- findViewById(R.id.btn_hide_show).setOnClickListener(this);
- findViewById(R.id.btn_replace).setOnClickListener(this);
- ivSharedElement = findViewById(R.id.iv_shared_element);
- tvAboutFragment = findViewById(R.id.tv_about_fragment);
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- tvAboutFragment.setText("");
- switch (view.getId()) {
- case R.id.btn_show_about_fragment:
- tvAboutFragment.setText("top: " + FragmentUtils.getSimpleName(FragmentUtils.getTop(getFragmentManager()))
- + "\ntopInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopInStack(getFragmentManager()))
- + "\ntopShow: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShow(getFragmentManager()))
- + "\ntopShowInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShowInStack(getFragmentManager()))
- + "\n---all of fragments---\n"
- + FragmentUtils.getAllFragments(getFragmentManager()).toString()
- + "\n----------------------\n\n"
- + "---stack top---\n"
- + FragmentUtils.getAllFragmentsInStack(getFragmentManager()).toString()
- + "\n---stack bottom---\n\n"
- );
- break;
- case R.id.btn_add:
- FragmentUtils.add(getFragmentManager(),
- ChildFragment.newInstance(),
- R.id.fragment_container);
- break;
- case R.id.btn_add_hide:
- FragmentUtils.add(getFragmentManager(),
- ChildFragment.newInstance(),
- R.id.fragment_container,
- true);
- break;
- case R.id.btn_add_hide_stack:
- FragmentUtils.add(getFragmentManager(),
- ChildFragment.newInstance(),
- R.id.fragment_container,
- true,
- true);
- break;
-// case R.id.btn_add_show:
-// FragmentUtils.add(getFragmentManager(),
-// addSharedElement(Demo1Fragment.newInstance()),
-// R.id.fragment_container,
-// false,
-// false,
-// sharedElement);
-// break;
-// case R.id.btn_add_child:
-// FragmentUtils.add(getChildFragmentManager(),
-// ChildFragment.newInstance(),
-// R.id.child_fragment_container,
-// false,
-// true);
-// break;
-// case R.id.btn_pop_to_root:
-// FragmentUtils.popToFragment(getFragmentManager(),
-// Demo1Fragment.class,
-// true);
-// break;
-// case R.id.btn_pop_add:
-// FragmentUtils.popAddFragment(getFragmentManager(),
-// addSharedElement(ChildFragment.newInstance()),
-// R.id.fragment_container,
-// true,
-// sharedElement);
-// break;
-// case R.id.btn_hide_show:
-// Fragment fragment1 = FragmentUtils.findFragment(getFragmentManager(), Demo1Fragment.class);
-// if (fragment1 != null) {
-// FragmentUtils.showHideFragment(this, fragment1);
-// } else {
-// ToastUtils.showLong("please add demo1 first!");
-// }
-// break;
-// case R.id.btn_replace:
-// ((FragmentActivity) getActivity()).rootFragment = FragmentUtils.replaceFragment(this, addSharedElement(Demo3Fragment.newInstance()), false, sharedElement);
-// break;
- }
- }
-
- private Fragment addSharedElement(Fragment fragment) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- fragment.setSharedElementEnterTransition(new DetailTransition());
- fragment.setEnterTransition(new Fade());
- fragment.setSharedElementReturnTransition(new DetailTransition());
- }
- return fragment;
- }
-
- @Override
- public boolean onBackClick() {
-// FragmentUtils.popToFragment(getFragmentManager(), Demo1Fragment.class, true);
- return false;
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/image/ImageActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/image/ImageActivity.java
deleted file mode 100644
index c414c01842..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/image/ImageActivity.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package com.blankj.androidutilcode.feature.core.image;
-
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.Color;
-import android.os.Build;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.view.View;
-
-import com.blankj.androidutilcode.Config;
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.ImageUtils;
-import com.blankj.utilcode.util.ToastUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/26
- * desc : demo about ImageUtils
- *
- */
-public class ImageActivity extends BaseBackActivity {
-
- Bitmap src;
- List mList = new ArrayList<>();
-
- public static void start(Context context) {
- Intent starter = new Intent(context, ImageActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_image;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_image));
-
- RecyclerView rvImages = findViewById(R.id.rv_images);
- findViewById(R.id.btn_save).setOnClickListener(this);
-
- src = ImageUtils.getBitmap(R.drawable.img_lena);
- Bitmap round = ImageUtils.getBitmap(R.drawable.avatar_round);
- Bitmap watermark = ImageUtils.getBitmap(R.mipmap.ic_launcher);
-
- int width = src.getWidth();
- int height = src.getHeight();
-
- mList.add(new ImageBean(R.string.image_src, src));
- mList.add(new ImageBean(R.string.image_add_color, ImageUtils.drawColor(src, Color.parseColor("#8000FF00"))));
- mList.add(new ImageBean(R.string.image_scale, ImageUtils.scale(src, width / 2, height / 2)));
- mList.add(new ImageBean(R.string.image_clip, ImageUtils.clip(src, 0, 0, width / 2, height / 2)));
- mList.add(new ImageBean(R.string.image_skew, ImageUtils.skew(src, 0.2f, 0.1f)));
- mList.add(new ImageBean(R.string.image_rotate, ImageUtils.rotate(src, 90, width / 2, height / 2)));
- mList.add(new ImageBean(R.string.image_to_round, ImageUtils.toRound(src)));
- mList.add(new ImageBean(R.string.image_to_round_border, ImageUtils.toRound(src, 16, Color.GREEN)));
- mList.add(new ImageBean(R.string.image_to_round_corner, ImageUtils.toRoundCorner(src, 80)));
- mList.add(new ImageBean(R.string.image_to_round_corner_border, ImageUtils.toRoundCorner(src, 80, 16, Color.GREEN)));
- mList.add(new ImageBean(R.string.image_add_corner_border, ImageUtils.addCornerBorder(src, 16, Color.GREEN, 0)));
- mList.add(new ImageBean(R.string.image_add_circle_border, ImageUtils.addCircleBorder(round, 16, Color.GREEN)));
- mList.add(new ImageBean(R.string.image_add_reflection, ImageUtils.addReflection(src, 80)));
- mList.add(new ImageBean(R.string.image_add_text_watermark, ImageUtils.addTextWatermark(src, "blankj", 40, Color.GREEN, 0, 0)));
- mList.add(new ImageBean(R.string.image_add_image_watermark, ImageUtils.addImageWatermark(src, watermark, 0, 0, 0x88)));
- mList.add(new ImageBean(R.string.image_to_gray, ImageUtils.toGray(src)));
- mList.add(new ImageBean(R.string.image_fast_blur, ImageUtils.fastBlur(src, 0.1f, 5)));
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
- mList.add(new ImageBean(R.string.image_render_script_blur, ImageUtils.renderScriptBlur(src, 10)));
- }
- mList.add(new ImageBean(R.string.image_stack_blur, ImageUtils.stackBlur(src, 10)));
- mList.add(new ImageBean(R.string.image_compress_by_scale, ImageUtils.compressByScale(src, 0.5f, 0.5f)));
- mList.add(new ImageBean(R.string.image_compress_by_quality_half, ImageUtils.compressByQuality(src, 50)));
- mList.add(new ImageBean(R.string.image_compress_by_quality_max_size, ImageUtils.compressByQuality(src, 10L * 1024)));// 10Kb
- mList.add(new ImageBean(R.string.image_compress_by_sample_size, ImageUtils.compressBySampleSize(src, 2)));
-
- rvImages.setAdapter(new ImageAdapter(mList, R.layout.item_image));
- rvImages.setLayoutManager(new LinearLayoutManager(this));
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_save:
- boolean save = ImageUtils.save(src, Config.CACHE_PATH + "lena.jpg", Bitmap.CompressFormat.JPEG);
- ToastUtils.showLong(save ? "successful" : "failed");
- break;
- }
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/image/ImageAdapter.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/image/ImageAdapter.java
deleted file mode 100644
index bad73d299a..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/image/ImageAdapter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.blankj.androidutilcode.feature.core.image;
-
-import android.support.annotation.LayoutRes;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.rv.BaseViewHolder;
-import com.blankj.androidutilcode.base.rv.adapter.SingleAdapter;
-
-import java.util.List;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/09/18
- * desc : demo about ImageUtils
- *
- */
-public class ImageAdapter extends SingleAdapter {
-
- public ImageAdapter(List list, @LayoutRes int layoutId) {
- super(list, layoutId);
- }
-
- @Override
- protected void bind(BaseViewHolder holder, ImageBean data) {
- TextView textView = holder.getView(R.id.tv_image_name);
- textView.setText(data.getName());
- ImageView image = holder.getView(R.id.iv_image);
- image.setImageBitmap(data.getImage());
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/image/ImageBean.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/image/ImageBean.java
deleted file mode 100644
index 3113cd0b17..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/image/ImageBean.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.blankj.androidutilcode.feature.core.image;
-
-import android.graphics.Bitmap;
-import android.support.annotation.StringRes;
-
-import com.blankj.utilcode.util.Utils;
-
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/09/18
- * desc : demo about ImageUtils
- *
- */
-public class ImageBean {
-
- int resId;
- String name;
- Bitmap image;
-
- public ImageBean(@StringRes int resId, Bitmap image) {
- name = Utils.getApp().getString(resId);
- this.image = image;
- }
-
- public ImageBean(String name, Bitmap image) {
- this.name = name;
- this.image = image;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Bitmap getImage() {
- return image;
- }
-
- public void setImage(Bitmap image) {
- this.image = image;
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/keyboard/KeyboardActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/keyboard/KeyboardActivity.java
deleted file mode 100644
index c255c1c7be..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/keyboard/KeyboardActivity.java
+++ /dev/null
@@ -1,128 +0,0 @@
-package com.blankj.androidutilcode.feature.core.keyboard;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v7.app.AlertDialog;
-import android.view.View;
-import android.widget.EditText;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.androidutilcode.helper.DialogHelper;
-import com.blankj.utilcode.util.KeyboardUtils;
-import com.blankj.utilcode.util.SpanUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/27
- * desc : demo about KeyboardUtils
- *
- */
-public class KeyboardActivity extends BaseBackActivity {
-
- public static void start(Context context) {
- Intent starter = new Intent(context, KeyboardActivity.class);
- context.startActivity(starter);
- }
-
- TextView tvAboutKeyboard;
- EditText etInput;
- private AlertDialog dialog;
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_keyboard;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- KeyboardUtils.fixAndroidBug5497(this);
- etInput = findViewById(R.id.et_input);
- findViewById(R.id.btn_hide_soft_input).setOnClickListener(this);
- findViewById(R.id.btn_show_soft_input).setOnClickListener(this);
- findViewById(R.id.btn_toggle_soft_input).setOnClickListener(this);
- findViewById(R.id.btn_keyboard_in_fragment).setOnClickListener(this);
- tvAboutKeyboard = findViewById(R.id.tv_about_keyboard);
-
- KeyboardUtils.registerSoftInputChangedListener(this,
- new KeyboardUtils.OnSoftInputChangedListener() {
- @Override
- public void onSoftInputChanged(int height) {
- tvAboutKeyboard.setText(new SpanUtils()
- .appendLine("isSoftInputVisible: " + KeyboardUtils.isSoftInputVisible(KeyboardActivity.this))
- .append("height: " + height)
- .create()
- );
- }
- });
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_hide_soft_input:
- KeyboardUtils.hideSoftInput(this);
- break;
- case R.id.btn_show_soft_input:
- KeyboardUtils.showSoftInput(this);
- break;
- case R.id.btn_toggle_soft_input:
- KeyboardUtils.toggleSoftInput();
- break;
- case R.id.btn_keyboard_in_fragment:
- DialogHelper.showKeyboardDialog();
- KeyboardUtils.showSoftInput(this);
- break;
- }
- }
-
-// @Override
-// public boolean dispatchTouchEvent(MotionEvent ev) {
-// if (ev.getAction() == MotionEvent.ACTION_DOWN) {
-// View v = getCurrentFocus();
-// if (isShouldHideKeyboard(v, ev)) {
-// InputMethodManager imm =
-// (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
-// if (imm == null) return super.dispatchTouchEvent(ev);
-// imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
-// }
-// }
-// return super.dispatchTouchEvent(ev);
-// }
-//
-// // 根据 EditText 所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘
-// private boolean isShouldHideKeyboard(View v, MotionEvent event) {
-// if (v != null && (v instanceof EditText)) {
-// int[] l = {0, 0};
-// v.getLocationInWindow(l);
-// int left = l[0],
-// top = l[1],
-// bottom = top + v.getHeight(),
-// right = left + v.getWidth();
-// return !(event.getX() > left && event.getX() < right
-// && event.getY() > top && event.getY() < bottom);
-// }
-// return false;
-// }
-
- @Override
- protected void onDestroy() {
- KeyboardUtils.unregisterSoftInputChangedListener(this);
- super.onDestroy();
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/log/LogActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/log/LogActivity.java
deleted file mode 100644
index fde5051c7b..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/log/LogActivity.java
+++ /dev/null
@@ -1,352 +0,0 @@
-package com.blankj.androidutilcode.feature.core.log;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Environment;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.Config;
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.UtilsApp;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.LogUtils;
-
-import java.util.ArrayList;
-
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/03/22
- * desc : demo about LogUtils
- *
- */
-public class LogActivity extends BaseBackActivity {
-
- private static final String TAG = "CMJ";
- private static final int UPDATE_LOG = 0x01;
- private static final int UPDATE_CONSOLE = 0x01 << 1;
- private static final int UPDATE_TAG = 0x01 << 2;
- private static final int UPDATE_HEAD = 0x01 << 3;
- private static final int UPDATE_FILE = 0x01 << 4;
- private static final int UPDATE_DIR = 0x01 << 5;
- private static final int UPDATE_BORDER = 0x01 << 6;
- private static final int UPDATE_SINGLE = 0x01 << 7;
- private static final int UPDATE_CONSOLE_FILTER = 0x01 << 8;
- private static final int UPDATE_FILE_FILTER = 0x01 << 9;
-
- private static final String JSON = "{\"tools\": [{ \"name\":\"css format\" , \"site\":\"http://tools.w3cschool.cn/code/css\" },{ \"name\":\"JSON format\" , \"site\":\"http://tools.w3cschool.cn/code/JSON\" },{ \"name\":\"pwd check\" , \"site\":\"http://tools.w3cschool.cn/password/my_password_safe\" }]}";
- private static final String XML = "Jack Herrington PHP Hacks O'Reilly Jack Herrington Podcasting Hacks O'Reilly ";
- private static final int[] ONE_D_ARRAY = new int[]{1, 2, 3};
- private static final int[][] TWO_D_ARRAY = new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
- private static final Throwable THROWABLE = new NullPointerException();
- private static final Bundle BUNDLE = new Bundle();
- private static final Intent INTENT = new Intent();
- private static final ArrayList LIST = new ArrayList<>();
-
- private static final String LONG_STR;
-
- static {
- StringBuilder sb = new StringBuilder();
- sb.append("len = 10400\ncontent = \"");
- for (int i = 0; i < 800; ++i) {
- sb.append("Hello world. ");
- }
- sb.append("\"");
- LONG_STR = sb.toString();
-
- BUNDLE.putByte("byte", (byte) -1);
- BUNDLE.putChar("char", 'c');
- BUNDLE.putCharArray("charArray", new char[]{'c', 'h', 'a', 'r', 'A', 'r', 'r', 'a', 'y'});
- BUNDLE.putCharSequence("charSequence", "charSequence");
- BUNDLE.putCharSequenceArray("charSequenceArray", new CharSequence[]{"char", "Sequence", "Array"});
- BUNDLE.putBundle("bundle", BUNDLE);
- BUNDLE.putBoolean("boolean", true);
- BUNDLE.putInt("int", 1);
- BUNDLE.putFloat("float", 1.f);
- BUNDLE.putLong("long", 1L);
- BUNDLE.putShort("short", (short) 1);
-
- INTENT.setAction("LogUtils action");
- INTENT.addCategory("LogUtils category");
- INTENT.setData(Uri.parse(Config.BLOG));
- INTENT.setType(Intent.ACTION_DIAL);
- INTENT.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- INTENT.setPackage(Config.PKG);
- INTENT.setComponent(new ComponentName(Config.PKG, LogActivity.class.toString()));
- INTENT.putExtra("int", 1);
- INTENT.putExtra("float", 1f);
- INTENT.putExtra("char", 'c');
- INTENT.putExtra("string", "string");
- INTENT.putExtra("intArray", ONE_D_ARRAY);
- ArrayList list = new ArrayList<>();
- list.add("ArrayList");
- list.add("is");
- list.add("serializable");
- INTENT.putExtra("serializable", list);
- INTENT.putExtra("bundle", BUNDLE);
-
- LIST.add("hello");
- LIST.add("log");
- LIST.add("utils");
- }
-
- private TextView tvAboutLog;
-
- private LogUtils.Config mConfig = LogUtils.getConfig();
-
- private String dir = "";
- private String globalTag = "";
- private boolean log = true;
- private boolean console = true;
- private boolean head = true;
- private boolean file = false;
- private boolean border = true;
- private boolean single = true;
- private int consoleFilter = LogUtils.V;
- private int fileFilter = LogUtils.V;
-
-
- private Runnable mRunnable = new Runnable() {
- @Override
- public void run() {
- LogUtils.v("verbose");
- LogUtils.d("debug");
- LogUtils.i("info");
- LogUtils.w("warn");
- LogUtils.e("error");
- LogUtils.a("assert");
- }
- };
-
- public static void start(Context context) {
- Intent starter = new Intent(context, LogActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_log;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_log));
-
- tvAboutLog = findViewById(R.id.tv_about_log);
- findViewById(R.id.btn_toggle_log).setOnClickListener(this);
- findViewById(R.id.btn_toggle_console).setOnClickListener(this);
- findViewById(R.id.btn_toggle_tag).setOnClickListener(this);
- findViewById(R.id.btn_toggle_head).setOnClickListener(this);
- findViewById(R.id.btn_toggle_border).setOnClickListener(this);
- findViewById(R.id.btn_toggle_single).setOnClickListener(this);
- findViewById(R.id.btn_toggle_file).setOnClickListener(this);
- findViewById(R.id.btn_toggle_dir).setOnClickListener(this);
- findViewById(R.id.btn_toggle_conole_filter).setOnClickListener(this);
- findViewById(R.id.btn_toggle_file_filter).setOnClickListener(this);
- findViewById(R.id.btn_log_no_tag).setOnClickListener(this);
- findViewById(R.id.btn_log_with_tag).setOnClickListener(this);
- findViewById(R.id.btn_log_in_new_thread).setOnClickListener(this);
- findViewById(R.id.btn_log_null).setOnClickListener(this);
- findViewById(R.id.btn_log_many_params).setOnClickListener(this);
- findViewById(R.id.btn_log_long).setOnClickListener(this);
- findViewById(R.id.btn_log_file).setOnClickListener(this);
- findViewById(R.id.btn_log_json).setOnClickListener(this);
- findViewById(R.id.btn_log_xml).setOnClickListener(this);
- findViewById(R.id.btn_log_array).setOnClickListener(this);
- findViewById(R.id.btn_log_throwable).setOnClickListener(this);
- findViewById(R.id.btn_log_bundle).setOnClickListener(this);
- findViewById(R.id.btn_log_intent).setOnClickListener(this);
- findViewById(R.id.btn_log_array_list).setOnClickListener(this);
- updateConfig(0);
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_toggle_log:
- updateConfig(UPDATE_LOG);
- break;
- case R.id.btn_toggle_console:
- updateConfig(UPDATE_CONSOLE);
- break;
- case R.id.btn_toggle_tag:
- updateConfig(UPDATE_TAG);
- break;
- case R.id.btn_toggle_head:
- updateConfig(UPDATE_HEAD);
- break;
- case R.id.btn_toggle_file:
- updateConfig(UPDATE_FILE);
- break;
- case R.id.btn_toggle_dir:
- updateConfig(UPDATE_DIR);
- break;
- case R.id.btn_toggle_border:
- updateConfig(UPDATE_BORDER);
- break;
- case R.id.btn_toggle_single:
- updateConfig(UPDATE_SINGLE);
- break;
- case R.id.btn_toggle_conole_filter:
- updateConfig(UPDATE_CONSOLE_FILTER);
- break;
- case R.id.btn_toggle_file_filter:
- updateConfig(UPDATE_FILE_FILTER);
- break;
- case R.id.btn_log_no_tag:
- LogUtils.v("verbose");
- LogUtils.d("debug");
- LogUtils.i("info");
- LogUtils.w("warn");
- LogUtils.e("error");
- LogUtils.a("assert");
- break;
- case R.id.btn_log_with_tag:
- LogUtils.vTag("customTag", "verbose");
- LogUtils.dTag("customTag", "debug");
- LogUtils.iTag("customTag", "info");
- LogUtils.wTag("customTag", "warn");
- LogUtils.eTag("customTag", "error");
- LogUtils.aTag("customTag", "assert");
- break;
- case R.id.btn_log_in_new_thread:
- Thread thread = new Thread(mRunnable);
- thread.start();
- break;
- case R.id.btn_log_null:
- LogUtils.v((Object) null);
- LogUtils.d((Object) null);
- LogUtils.i((Object) null);
- LogUtils.w((Object) null);
- LogUtils.e((Object) null);
- LogUtils.a((Object) null);
- break;
- case R.id.btn_log_many_params:
- LogUtils.v("verbose0", "verbose1");
- LogUtils.vTag("customTag", "verbose0", "verbose1");
- LogUtils.d("debug0", "debug1");
- LogUtils.dTag("customTag", "debug0", "debug1");
- LogUtils.i("info0", "info1");
- LogUtils.iTag("customTag", "info0", "info1");
- LogUtils.w("warn0", "warn1");
- LogUtils.wTag("customTag", "warn0", "warn1");
- LogUtils.e("error0", "error1");
- LogUtils.eTag("customTag", "error0", "error1");
- LogUtils.a("assert0", "assert1");
- LogUtils.aTag("customTag", "assert0", "assert1");
- break;
- case R.id.btn_log_long:
- LogUtils.d(LONG_STR);
- break;
- case R.id.btn_log_file:
- for (int i = 0; i < 100; i++) {
- LogUtils.file("test0 log to file");
- LogUtils.file(LogUtils.I, "test0 log to file");
- }
- break;
- case R.id.btn_log_json:
- LogUtils.json(JSON);
- LogUtils.json(LogUtils.I, JSON);
- break;
- case R.id.btn_log_xml:
- LogUtils.xml(XML);
- LogUtils.xml(LogUtils.I, XML);
- break;
- case R.id.btn_log_array:
- LogUtils.e((Object) ONE_D_ARRAY);
- LogUtils.e((Object) TWO_D_ARRAY);
- break;
- case R.id.btn_log_throwable:
- LogUtils.e(THROWABLE);
- break;
- case R.id.btn_log_bundle:
- LogUtils.e(BUNDLE);
- break;
- case R.id.btn_log_intent:
- LogUtils.e(INTENT);
- break;
- case R.id.btn_log_array_list:
- LogUtils.e(LIST);
- break;
- }
- }
-
- private void updateConfig(int args) {
- switch (args) {
- case UPDATE_LOG:
- log = !log;
- break;
- case UPDATE_CONSOLE:
- console = !console;
- break;
- case UPDATE_TAG:
- globalTag = globalTag.equals(TAG) ? "" : TAG;
- break;
- case UPDATE_HEAD:
- head = !head;
- break;
- case UPDATE_FILE:
- file = !file;
- break;
- case UPDATE_DIR:
- if (getDir().contains("test")) {
- dir = null;
- } else {
- if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
- dir = Environment.getExternalStorageDirectory().getPath() + System.getProperty("file.separator") + "test";
- }
- }
- break;
- case UPDATE_BORDER:
- border = !border;
- break;
- case UPDATE_SINGLE:
- single = !single;
- break;
- case UPDATE_CONSOLE_FILTER:
- consoleFilter = consoleFilter == LogUtils.V ? LogUtils.W : LogUtils.V;
- break;
- case UPDATE_FILE_FILTER:
- fileFilter = fileFilter == LogUtils.V ? LogUtils.I : LogUtils.V;
- break;
- }
- mConfig.setLogSwitch(log)
- .setConsoleSwitch(console)
- .setGlobalTag(globalTag)
- .setLogHeadSwitch(head)
- .setLog2FileSwitch(file)
- .setDir(dir)
- .setBorderSwitch(border)
- .setSingleTagSwitch(single)
- .setConsoleFilter(consoleFilter)
- .setFileFilter(fileFilter);
- tvAboutLog.setText(mConfig.toString());
- }
-
- private String getDir() {
- return mConfig.toString().split(System.getProperty("line.separator"))[5].substring(5);
- }
-
- @Override
- protected void onDestroy() {
- UtilsApp.getInstance().initLog();
- super.onDestroy();
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/meta_data/MetaDataActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/meta_data/MetaDataActivity.java
deleted file mode 100644
index cd2fb0ff71..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/meta_data/MetaDataActivity.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.blankj.androidutilcode.feature.core.meta_data;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.MetaDataUtils;
-import com.blankj.utilcode.util.SpanUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2018/05/15
- * desc : demo about MetaDataUtils
- *
- */
-public class MetaDataActivity extends BaseBackActivity {
-
- public static void start(Context context) {
- Intent starter = new Intent(context, MetaDataActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_meta_data;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_meta_data));
-
- TextView tvAboutMetaData = findViewById(R.id.tv_about_metadata);
- tvAboutMetaData.setText(new SpanUtils()
- .appendLine("getMetaDataInApp: " + MetaDataUtils.getMetaDataInApp("app_meta_data"))
- .append("getMetaDataInActivity: " + MetaDataUtils.getMetaDataInActivity(this, "activity_meta_data"))
- .create());
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
-
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/network/NetworkActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/network/NetworkActivity.java
deleted file mode 100644
index b7d3e361c8..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/network/NetworkActivity.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package com.blankj.androidutilcode.feature.core.network;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.NetworkUtils;
-import com.blankj.utilcode.util.SpanUtils;
-import com.blankj.utilcode.util.ThreadUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/10/13
- * desc : demo about NetworkUtils
- *
- */
-public class NetworkActivity extends BaseBackActivity {
-
- TextView tvAboutNetwork;
- TextView tvAboutNetworkAsync;
- ThreadUtils.SimpleTask mSimpleTask = new ThreadUtils.SimpleTask() {
- @Override
- public String doInBackground() {
- return "isAvailableByPing: " + NetworkUtils.isAvailableByPing()
- + "\ngetBaiduDomainAddress: " + NetworkUtils.getDomainAddress("baidu.com");
- }
-
- @Override
- public void onSuccess(String result) {
- tvAboutNetworkAsync.setText(result);
- }
- };
-
- public static void start(Context context) {
- Intent starter = new Intent(context, NetworkActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_network;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_network));
-
- tvAboutNetwork = findViewById(R.id.tv_about_network);
- tvAboutNetworkAsync = findViewById(R.id.tv_about_network_async);
- findViewById(R.id.btn_open_wireless_settings).setOnClickListener(this);
- findViewById(R.id.btn_set_wifi_enabled).setOnClickListener(this);
- updateAboutNetwork();
- }
-
- @Override
- public void doBusiness() {
- ThreadUtils.executeBySingle(mSimpleTask);
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_open_wireless_settings:
- NetworkUtils.openWirelessSettings();
- break;
- case R.id.btn_set_data_enabled:
- NetworkUtils.setMobileDataEnabled(!NetworkUtils.getMobileDataEnabled());
- break;
- case R.id.btn_set_wifi_enabled:
- NetworkUtils.setWifiEnabled(!NetworkUtils.getWifiEnabled());
- break;
- }
- updateAboutNetwork();
- }
-
- private void updateAboutNetwork() {
- tvAboutNetwork.setText(new SpanUtils()
- .appendLine("isConnected: " + NetworkUtils.isConnected())
- .appendLine("getMobileDataEnabled: " + NetworkUtils.getMobileDataEnabled())
- .appendLine("isMobileData: " + NetworkUtils.isMobileData())
- .appendLine("is4G: " + NetworkUtils.is4G())
- .appendLine("getWifiEnabled: " + NetworkUtils.getWifiEnabled())
- .appendLine("isWifiConnected: " + NetworkUtils.isWifiConnected())
- .appendLine("isWifiAvailable: " + NetworkUtils.isWifiAvailable())
- .appendLine("getNetworkOperatorName: " + NetworkUtils.getNetworkOperatorName())
- .appendLine("getNetworkTypeName: " + NetworkUtils.getNetworkType())
- .appendLine("getIPv4Address: " + NetworkUtils.getIPAddress(true))
- .appendLine("getIPv6Address: " + NetworkUtils.getIPAddress(false))
- .appendLine("getBroadcastIpAddress: " + NetworkUtils.getBroadcastIpAddress())
- .appendLine("getIpAddressByWifi: " + NetworkUtils.getIpAddressByWifi())
- .appendLine("getGatewayByWifi: " + NetworkUtils.getGatewayByWifi())
- .appendLine("getNetMaskByWifi: " + NetworkUtils.getNetMaskByWifi())
- .append("getServerAddressByWifi: " + NetworkUtils.getServerAddressByWifi())
- .create()
- );
- }
-
- @Override
- protected void onDestroy() {
- mSimpleTask.cancel();
- super.onDestroy();
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/path/PathActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/path/PathActivity.java
deleted file mode 100644
index 41a9850f2b..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/path/PathActivity.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package com.blankj.androidutilcode.feature.core.path;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.PathUtils;
-import com.blankj.utilcode.util.SpanUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/10/13
- * desc : demo about PathUtils
- *
- */
-public class PathActivity extends BaseBackActivity {
-
- public static void start(Context context) {
- Intent starter = new Intent(context, PathActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_path;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_path));
-
- TextView tvAboutMetaData = findViewById(R.id.tv_about_path);
- tvAboutMetaData.setText(new SpanUtils()
- .appendLine("getRootPath: " + PathUtils.getRootPath())
- .appendLine("getDataPath: " + PathUtils.getDataPath())
- .appendLine("getDownloadCachePath: " + PathUtils.getDownloadCachePath())
-
- .appendLine("getInternalAppDataPath: " + PathUtils.getInternalAppDataPath())
- .appendLine("getInternalAppCodeCacheDir: " + PathUtils.getInternalAppCodeCacheDir())
- .appendLine("getInternalAppCachePath: " + PathUtils.getInternalAppCachePath())
- .appendLine("getInternalAppDbsPath: " + PathUtils.getInternalAppDbsPath())
- .appendLine("getInternalAppDbPath: " + PathUtils.getInternalAppDbPath("demo"))
- .appendLine("getInternalAppFilesPath: " + PathUtils.getInternalAppFilesPath())
- .appendLine("getInternalAppSpPath: " + PathUtils.getInternalAppSpPath())
- .appendLine("getInternalAppNoBackupFilesPath: " + PathUtils.getInternalAppNoBackupFilesPath())
-
- .appendLine("getExternalStoragePath: " + PathUtils.getExternalStoragePath())
- .appendLine("getExternalMusicPath: " + PathUtils.getExternalMusicPath())
- .appendLine("getExternalPodcastsPath: " + PathUtils.getExternalPodcastsPath())
- .appendLine("getExternalRingtonesPath: " + PathUtils.getExternalRingtonesPath())
- .appendLine("getExternalAlarmsPath: " + PathUtils.getExternalAlarmsPath())
- .appendLine("getExternalNotificationsPath: " + PathUtils.getExternalNotificationsPath())
- .appendLine("getExternalPicturesPath: " + PathUtils.getExternalPicturesPath())
- .appendLine("getExternalMoviesPath: " + PathUtils.getExternalMoviesPath())
- .appendLine("getExternalDownloadsPath: " + PathUtils.getExternalDownloadsPath())
- .appendLine("getExternalDcimPath: " + PathUtils.getExternalDcimPath())
- .appendLine("getExternalDocumentsPath: " + PathUtils.getExternalDocumentsPath())
-
- .appendLine("getExternalAppDataPath: " + PathUtils.getExternalAppDataPath())
- .appendLine("getExternalAppCachePath: " + PathUtils.getExternalAppCachePath())
- .appendLine("getExternalAppFilesPath: " + PathUtils.getExternalAppFilesPath())
- .appendLine("getExternalAppMusicPath: " + PathUtils.getExternalAppMusicPath())
- .appendLine("getExternalAppPodcastsPath: " + PathUtils.getExternalAppPodcastsPath())
- .appendLine("getExternalAppRingtonesPath: " + PathUtils.getExternalAppRingtonesPath())
- .appendLine("getExternalAppAlarmsPath: " + PathUtils.getExternalAppAlarmsPath())
- .appendLine("getExternalAppNotificationsPath: " + PathUtils.getExternalAppNotificationsPath())
- .appendLine("getExternalAppPicturesPath: " + PathUtils.getExternalAppPicturesPath())
- .appendLine("getExternalAppMoviesPath: " + PathUtils.getExternalAppMoviesPath())
- .appendLine("getExternalAppDownloadPath: " + PathUtils.getExternalAppDownloadPath())
- .appendLine("getExternalAppDcimPath: " + PathUtils.getExternalAppDcimPath())
- .appendLine("getExternalAppDocumentsPath: " + PathUtils.getExternalAppDocumentsPath())
- .appendLine("getExternalAppObbPath: " + PathUtils.getExternalAppObbPath())
- .append("")
- .create());
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
-
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/permission/PermissionActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/permission/PermissionActivity.java
deleted file mode 100644
index 8e92f82812..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/permission/PermissionActivity.java
+++ /dev/null
@@ -1,179 +0,0 @@
-package com.blankj.androidutilcode.feature.core.permission;
-
-import android.Manifest;
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.androidutilcode.helper.DialogHelper;
-import com.blankj.utilcode.constant.PermissionConstants;
-import com.blankj.utilcode.util.LogUtils;
-import com.blankj.utilcode.util.PermissionUtils;
-import com.blankj.utilcode.util.ScreenUtils;
-import com.blankj.utilcode.util.SpanUtils;
-
-import java.util.List;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2018/01/01
- * desc : demo about PermissionUtils
- *
- */
-public class PermissionActivity extends BaseBackActivity {
-
- TextView tvAboutPermission;
- String permissions;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, PermissionActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_permission;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_permission));
-
- tvAboutPermission = findViewById(R.id.tv_about_permission);
- findViewById(R.id.btn_open_app_settings).setOnClickListener(this);
- findViewById(R.id.btn_request_calendar).setOnClickListener(this);
- findViewById(R.id.btn_request_record_audio).setOnClickListener(this);
- findViewById(R.id.btn_request_calendar_and_record_audio).setOnClickListener(this);
-
- StringBuilder sb = new StringBuilder();
- for (String s : PermissionUtils.getPermissions()) {
- sb.append(s.substring(s.lastIndexOf('.') + 1)).append("\n");
- }
- permissions = sb.toString();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- updateAboutPermission();
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_open_app_settings:
- PermissionUtils.launchAppDetailsSettings();
- break;
- case R.id.btn_request_calendar:
- PermissionUtils.permission(PermissionConstants.CALENDAR)
- .rationale(new PermissionUtils.OnRationaleListener() {
- @Override
- public void rationale(final ShouldRequest shouldRequest) {
- DialogHelper.showRationaleDialog(shouldRequest);
- }
- })
- .callback(new PermissionUtils.FullCallback() {
- @Override
- public void onGranted(List permissionsGranted) {
- updateAboutPermission();
- LogUtils.d(permissionsGranted);
- }
-
- @Override
- public void onDenied(List permissionsDeniedForever,
- List permissionsDenied) {
- if (!permissionsDeniedForever.isEmpty()) {
- DialogHelper.showOpenAppSettingDialog();
- }
- LogUtils.d(permissionsDeniedForever, permissionsDenied);
- }
- })
- .theme(new PermissionUtils.ThemeCallback() {
- @Override
- public void onActivityCreate(Activity activity) {
- ScreenUtils.setFullScreen(activity);
- }
- })
- .request();
- break;
- case R.id.btn_request_record_audio:
- PermissionUtils.permission(PermissionConstants.MICROPHONE)
- .rationale(new PermissionUtils.OnRationaleListener() {
- @Override
- public void rationale(final ShouldRequest shouldRequest) {
- DialogHelper.showRationaleDialog(shouldRequest);
- }
- })
- .callback(new PermissionUtils.FullCallback() {
- @Override
- public void onGranted(List permissionsGranted) {
- updateAboutPermission();
- LogUtils.d(permissionsGranted);
- }
-
- @Override
- public void onDenied(List permissionsDeniedForever,
- List permissionsDenied) {
- if (!permissionsDeniedForever.isEmpty()) {
- DialogHelper.showOpenAppSettingDialog();
- }
- LogUtils.d(permissionsDeniedForever, permissionsDenied);
- }
- })
- .request();
- break;
- case R.id.btn_request_calendar_and_record_audio:
- PermissionUtils.permission(PermissionConstants.CALENDAR, PermissionConstants.MICROPHONE)
- .rationale(new PermissionUtils.OnRationaleListener() {
- @Override
- public void rationale(final ShouldRequest shouldRequest) {
- DialogHelper.showRationaleDialog(shouldRequest);
- }
- })
- .callback(new PermissionUtils.FullCallback() {
- @Override
- public void onGranted(List permissionsGranted) {
- updateAboutPermission();
- LogUtils.d(permissionsGranted);
- }
-
- @Override
- public void onDenied(List permissionsDeniedForever,
- List permissionsDenied) {
- if (!permissionsDeniedForever.isEmpty()) {
- DialogHelper.showOpenAppSettingDialog();
- }
- LogUtils.d(permissionsDeniedForever, permissionsDenied);
- }
- })
- .request();
- break;
- }
- }
-
- private void updateAboutPermission() {
- tvAboutPermission.setText(new SpanUtils()
- .append(permissions).setBold()
- .appendLine("READ_CALENDAR: " + PermissionUtils.isGranted(Manifest.permission.READ_CALENDAR))
- .appendLine("RECORD_AUDIO: " + PermissionUtils.isGranted(Manifest.permission.RECORD_AUDIO))
- .create());
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/phone/PhoneActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/phone/PhoneActivity.java
deleted file mode 100644
index a0b2abc63b..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/phone/PhoneActivity.java
+++ /dev/null
@@ -1,127 +0,0 @@
-package com.blankj.androidutilcode.feature.core.phone;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.androidutilcode.helper.PermissionHelper;
-import com.blankj.utilcode.util.PhoneUtils;
-import com.blankj.utilcode.util.SpanUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/10/13
- * desc : demo about PhoneUtils
- *
- */
-public class PhoneActivity extends BaseBackActivity {
-
- private TextView tvAboutPhone;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, PhoneActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_phone;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_phone));
-
- findViewById(R.id.btn_dial).setOnClickListener(this);
- findViewById(R.id.btn_call).setOnClickListener(this);
- findViewById(R.id.btn_send_sms).setOnClickListener(this);
- findViewById(R.id.btn_send_sms_silent).setOnClickListener(this);
- tvAboutPhone = findViewById(R.id.tv_about_phone);
-
- PermissionHelper.requestPhone(
- new PermissionHelper.OnPermissionGrantedListener() {
- @SuppressLint("MissingPermission")
- @Override
- public void onPermissionGranted() {
- tvAboutPhone.setText(new SpanUtils()
- .appendLine("isPhone: " + PhoneUtils.isPhone())
- .appendLine("getDeviceId: " + PhoneUtils.getDeviceId())
- .appendLine("getIMEI: " + PhoneUtils.getIMEI())
- .appendLine("getMEID: " + PhoneUtils.getMEID())
- .appendLine("getIMSI: " + PhoneUtils.getIMSI())
- .appendLine("getPhoneType: " + PhoneUtils.getPhoneType())
- .appendLine("isSimCardReady: " + PhoneUtils.isSimCardReady())
- .appendLine("getSimOperatorName: " + PhoneUtils.getSimOperatorName())
- .appendLine("getSimOperatorByMnc: " + PhoneUtils.getSimOperatorByMnc())
- .appendLine("getPhoneStatus: " + PhoneUtils.getPhoneStatus())
- .create());
- }
- },
- new PermissionHelper.OnPermissionDeniedListener() {
- @Override
- public void onPermissionDenied() {
- tvAboutPhone.setText(new SpanUtils()
- .appendLine("isPhone: " + PhoneUtils.isPhone())
- .appendLine("getDeviceId: " + "need permission")
- .appendLine("getIMEI: " + "need permission")
- .appendLine("getMEID: " + "need permission")
- .appendLine("getIMSI: " + "need permission")
- .appendLine("getPhoneType: " + PhoneUtils.getPhoneType())
- .appendLine("isSimCardReady: " + PhoneUtils.isSimCardReady())
- .appendLine("getSimOperatorName: " + PhoneUtils.getSimOperatorName())
- .appendLine("getSimOperatorByMnc: " + PhoneUtils.getSimOperatorByMnc())
- .appendLine("getPhoneStatus: " + "need permission")
- .create());
- }
- }
- );
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_dial:
- PhoneUtils.dial("10000");
- break;
- case R.id.btn_call:
- PermissionHelper.requestPhone(new PermissionHelper.OnPermissionGrantedListener() {
- @SuppressLint("MissingPermission")
- @Override
- public void onPermissionGranted() {
- PhoneUtils.call("10000");
- }
- });
- break;
- case R.id.btn_send_sms:
- PhoneUtils.sendSms("10000", "sendSms");
- break;
- case R.id.btn_send_sms_silent:
- PermissionHelper.requestSms(new PermissionHelper.OnPermissionGrantedListener() {
- @SuppressLint("MissingPermission")
- @Override
- public void onPermissionGranted() {
- PhoneUtils.sendSmsSilent("10000", "sendSmsSilent");
- }
- });
- break;
- }
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/process/ProcessActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/process/ProcessActivity.java
deleted file mode 100644
index a262a23ec9..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/process/ProcessActivity.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package com.blankj.androidutilcode.feature.core.process;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.ProcessUtils;
-import com.blankj.utilcode.util.SpanUtils;
-
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/10/13
- * desc : demo about ProcessUtils
- *
- */
-public class ProcessActivity extends BaseBackActivity {
-
- public static void start(Context context) {
- Intent starter = new Intent(context, ProcessActivity.class);
- context.startActivity(starter);
- }
-
- private TextView tvAboutProcess;
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_process;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_process));
-
- findViewById(R.id.btn_kill_all_background_processes).setOnClickListener(this);
- tvAboutProcess = findViewById(R.id.tv_about_process);
- Set set = ProcessUtils.getAllBackgroundProcesses();
- tvAboutProcess.setText(new SpanUtils()
- .appendLine("getForegroundProcessName: " + ProcessUtils.getForegroundProcessName())
- .appendLine("getAllBackgroundProcesses: " + getSetItems(set))
- .appendLine("size: " + set.size())
- .appendLine("isMainProcess: " + ProcessUtils.isMainProcess())
- .append("getCurrentProcessName: " + ProcessUtils.getCurrentProcessName())
- .create()
- );
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_kill_all_background_processes:
- Set set = ProcessUtils.getAllBackgroundProcesses();
- Set set1 = ProcessUtils.killAllBackgroundProcesses();
- tvAboutProcess.setText(new SpanUtils()
- .appendLine("getForegroundProcessName: " + ProcessUtils.getForegroundProcessName())
- .appendLine("getAllBackgroundProcesses: " + getSetItems(set))
- .appendLine("size: " + set.size())
- .appendLine("killAllBackgroundProcesses: " + getSetItems(set1))
- .appendLine("size: " + set1.size())
- .appendLine("isMainProcess: " + ProcessUtils.isMainProcess())
- .append("getCurrentProcessName: " + ProcessUtils.getCurrentProcessName())
- .create()
- );
- break;
- }
- }
-
- private String getSetItems(Set set) {
- Iterator iterator = set.iterator();
- StringBuilder sb = new StringBuilder();
- while (iterator.hasNext()) {
- sb.append(iterator.next()).append("\n");
- }
- return sb.toString();
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/reflect/ReflectActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/reflect/ReflectActivity.java
deleted file mode 100644
index 40d9779805..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/reflect/ReflectActivity.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.blankj.androidutilcode.feature.core.reflect;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.ReflectUtils;
-import com.blankj.utilcode.util.SpanUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2018/01/29
- * desc : demo about ReflectUtils
- *
- */
-public class ReflectActivity extends BaseBackActivity {
-
- public static void start(Context context) {
- Intent starter = new Intent(context, ReflectActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_reflect;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_reflect));
-
- TextView tvAboutReflect = findViewById(R.id.tv_about_reflect);
-
- tvAboutReflect.setText(new SpanUtils()
- .appendLine("before reflect: " + ReflectUtils.reflect(TestPrivateStaticFinal.class).field("I1").get())
- .append("after reflect: " + ReflectUtils.reflect(TestPrivateStaticFinal.class).field("I1", 2).field("I1").get())
- .create());
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
-
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/reflect/TestPrivateStaticFinal.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/reflect/TestPrivateStaticFinal.java
deleted file mode 100755
index 03c512d21c..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/reflect/TestPrivateStaticFinal.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.blankj.androidutilcode.feature.core.reflect;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2018/01/12
- * desc : demo about ReflectUtils
- *
- */
-public class TestPrivateStaticFinal {
- private static final int I1 = 1;
-
- public static int getI1() {
- return I1;
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/resource/ResourceActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/resource/ResourceActivity.java
deleted file mode 100644
index e4d459abc6..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/resource/ResourceActivity.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.blankj.androidutilcode.feature.core.resource;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.Config;
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.ResourceUtils;
-import com.blankj.utilcode.util.SpanUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2018/05/07
- * desc :
- *
- */
-public class ResourceActivity extends BaseBackActivity {
-
- public static void start(Context context) {
- Intent starter = new Intent(context, ResourceActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_resource;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- findViewById(R.id.btn_resource_test_assets).setOnClickListener(this);
- findViewById(R.id.btn_resource_test_raw).setOnClickListener(this);
- TextView tvAboutResource = findViewById(R.id.tv_about_resource);
-
- tvAboutResource.setText(new SpanUtils()
- .appendLine("readAssets2String: " + ResourceUtils.readAssets2String("test/test.txt"))
- .appendLine("readAssets2List: " + ResourceUtils.readAssets2List("test/test.txt").toString())
- .append("readRaw2List: " + ResourceUtils.readRaw2List(R.raw.test).toString())
- .create());
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_resource_test_assets:
- ResourceUtils.copyFileFromAssets("test", Config.CACHE_PATH + "/assets/test");
- break;
- case R.id.btn_resource_test_raw:
- ResourceUtils.copyFileFromRaw(R.raw.test, Config.CACHE_PATH + "/raw/test.txt");
- break;
- }
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/screen/ScreenActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/screen/ScreenActivity.java
deleted file mode 100644
index c88c5818f0..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/screen/ScreenActivity.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package com.blankj.androidutilcode.feature.core.screen;
-
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Color;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseActivity;
-import com.blankj.utilcode.util.LogUtils;
-import com.blankj.utilcode.util.ScreenUtils;
-import com.blankj.utilcode.util.SpanUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/27
- * desc : demo about ScreenUtils
- *
- */
-public class ScreenActivity extends BaseActivity {
-
- ImageView ivScreenshot;
- TextView tvAboutScreen;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, ScreenActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_screen;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- ivScreenshot = findViewById(R.id.iv_screenshot);
- tvAboutScreen = findViewById(R.id.tv_about_screen);
- findViewById(R.id.btn_set_fullscreen).setOnClickListener(this);
- findViewById(R.id.btn_set_non_fullscreen).setOnClickListener(this);
- findViewById(R.id.btn_toggle_fullscreen).setOnClickListener(this);
- findViewById(R.id.btn_set_landscape).setOnClickListener(this);
- findViewById(R.id.btn_set_portrait).setOnClickListener(this);
- findViewById(R.id.btn_screenshot).setOnClickListener(this);
- findViewById(R.id.btn_set_sleep_duration).setOnClickListener(this);
- findViewById(R.id.btn_test_adapt_screen).setOnClickListener(this);
-
- updateAboutScreen();
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_set_fullscreen:
- ScreenUtils.setFullScreen(this);
- break;
- case R.id.btn_set_non_fullscreen:
- ScreenUtils.setNonFullScreen(this);
- break;
- case R.id.btn_toggle_fullscreen:
- ScreenUtils.toggleFullScreen(this);
- break;
- case R.id.btn_set_landscape:
- ScreenUtils.setLandscape(this);
- break;
- case R.id.btn_set_portrait:
- ScreenUtils.setPortrait(this);
- break;
- case R.id.btn_screenshot:
- ivScreenshot.setImageBitmap(ScreenUtils.screenShot(this));
- break;
- case R.id.btn_set_sleep_duration:
- ScreenUtils.setSleepDuration(100000);
- break;
- case R.id.btn_test_adapt_screen:
- ScreenAdaptActivity.start(this);
- break;
- }
- updateAboutScreen();
- }
-
- private void updateAboutScreen() {
- tvAboutScreen.setText(new SpanUtils()
- .appendLine("getScreenWidth: " + ScreenUtils.getScreenWidth())
- .appendLine("getScreenHeight: " + ScreenUtils.getScreenHeight())
- .appendLine("isLandscape: " + ScreenUtils.isLandscape())
- .appendLine("isPortrait: " + ScreenUtils.isPortrait())
- .appendLine("getScreenRotation: " + ScreenUtils.getScreenRotation(this))
- .appendLine("isScreenLock: " + ScreenUtils.isScreenLock())
- .appendLine("getSleepDuration: " + ScreenUtils.getSleepDuration())
- .append("isTablet: " + ScreenUtils.isTablet())
- .create()
- );
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/screen/ScreenAdaptActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/screen/ScreenAdaptActivity.java
deleted file mode 100644
index 06ec930dff..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/screen/ScreenAdaptActivity.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package com.blankj.androidutilcode.feature.core.screen;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseActivity;
-import com.blankj.androidutilcode.helper.DialogHelper;
-import com.blankj.utilcode.util.ScreenUtils;
-import com.blankj.utilcode.util.ToastUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/27
- * desc : demo about ScreenUtils
- *
- */
-public class ScreenAdaptActivity extends BaseActivity {
-
- private TextView tvUp;
- private TextView tvDown;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, ScreenAdaptActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
- if (ScreenUtils.isPortrait()) {
- ScreenUtils.adaptScreen4VerticalSlide(this, 720);
- } else {
- ScreenUtils.setFullScreen(this);
- ScreenUtils.adaptScreen4HorizontalSlide(this, 720);
- }
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_screen_adapt;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- if (ScreenUtils.isPortrait()) {
- findViewById(R.id.btn_show_system_toast).setOnClickListener(this);
- findViewById(R.id.btn_show_util_toast).setOnClickListener(this);
- findViewById(R.id.btn_system_dialog).setOnClickListener(this);
- findViewById(R.id.btn_system_dialog_without_adapt).setOnClickListener(this);
- }
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_show_system_toast:
- Toast.makeText(this, "System Toast", Toast.LENGTH_SHORT).show();
- break;
- case R.id.btn_show_util_toast:
- ToastUtils.showShort("Util Toast");
- break;
- case R.id.btn_system_dialog:
- DialogHelper.showAdaptScreenDialog();
- break;
- case R.id.btn_system_dialog_without_adapt:
- ScreenUtils.cancelAdaptScreen(this);
- DialogHelper.showAdaptScreenDialog();
- ScreenUtils.adaptScreen4VerticalSlide(this, 720);
- break;
- }
- }
-
- @Override
- protected void onDestroy() {
-// ScreenUtils.cancelAdaptScreen(this);
- super.onDestroy();
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/sdcard/SDCardActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/sdcard/SDCardActivity.java
deleted file mode 100644
index 1d61cac3c5..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/sdcard/SDCardActivity.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.blankj.androidutilcode.feature.core.sdcard;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.SDCardUtils;
-import com.blankj.utilcode.util.SpanUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/27
- * desc : demo about SDCardUtils
- *
- */
-public class SDCardActivity extends BaseBackActivity {
-
- public static void start(Context context) {
- Intent starter = new Intent(context, SDCardActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_sdcard;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_sdcard));
-
- TextView tvAboutSdcard = findViewById(R.id.tv_about_sdcard);
- tvAboutSdcard.setText(new SpanUtils()
- .appendLine("isSDCardEnableByEnvironment: " + SDCardUtils.isSDCardEnableByEnvironment())
- .appendLine("getSDCardPathByEnvironment: " + SDCardUtils.getSDCardPathByEnvironment())
- .appendLine("isSDCardEnable: " + SDCardUtils.isSDCardEnable())
- .appendLine("getSDCardPaths: " + SDCardUtils.getSDCardPaths())
- .appendLine("getInnerSDCardPaths: " + SDCardUtils.getSDCardPaths(true))
- .appendLine("getOuterSDCardPaths: " + SDCardUtils.getSDCardPaths(false))
- .create()
- );
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
-
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/snackbar/SnackbarActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/snackbar/SnackbarActivity.java
deleted file mode 100644
index c93db56c08..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/snackbar/SnackbarActivity.java
+++ /dev/null
@@ -1,205 +0,0 @@
-package com.blankj.androidutilcode.feature.core.snackbar;
-
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Color;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.annotation.StringRes;
-import android.text.SpannableStringBuilder;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.SnackbarUtils;
-import com.blankj.utilcode.util.SpanUtils;
-import com.blankj.utilcode.util.ToastUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/10/17
- * desc : demo about SnackbarUtils
- *
- */
-public class SnackbarActivity extends BaseBackActivity {
-
- View snackBarRootView;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, SnackbarActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_snackbar;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_snackbar));
-
- snackBarRootView = findViewById(android.R.id.content);
- findViewById(R.id.btn_short_snackbar).setOnClickListener(this);
- findViewById(R.id.btn_short_snackbar_with_action).setOnClickListener(this);
- findViewById(R.id.btn_long_snackbar).setOnClickListener(this);
- findViewById(R.id.btn_long_snackbar_with_action).setOnClickListener(this);
- findViewById(R.id.btn_indefinite_snackbar).setOnClickListener(this);
- findViewById(R.id.btn_indefinite_snackbar_with_action).setOnClickListener(this);
- findViewById(R.id.btn_add_view).setOnClickListener(this);
- findViewById(R.id.btn_add_view_with_action).setOnClickListener(this);
- findViewById(R.id.btn_show_success).setOnClickListener(this);
- findViewById(R.id.btn_show_warning).setOnClickListener(this);
- findViewById(R.id.btn_show_error).setOnClickListener(this);
- findViewById(R.id.btn_dismiss_snackbar).setOnClickListener(this);
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_short_snackbar:
- SnackbarUtils.with(snackBarRootView)
- .setMessage(getMsg(R.string.snackbar_short))
- .setMessageColor(Color.WHITE)
- .setBgResource(R.drawable.shape_top_round_rect)
- .show();
- break;
-
- case R.id.btn_short_snackbar_with_action:
- SnackbarUtils.with(snackBarRootView)
- .setMessage(getMsg(R.string.snackbar_short))
- .setMessageColor(Color.WHITE)
- .setBgResource(R.drawable.shape_top_round_rect)
- .setAction(getString(R.string.snackbar_click), Color.YELLOW, new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- ToastUtils.showShort(getString(R.string.snackbar_click));
- }
- })
- .show();
- break;
-
- case R.id.btn_long_snackbar:
- SnackbarUtils.with(snackBarRootView)
- .setMessage(getMsg(R.string.snackbar_long))
- .setMessageColor(Color.WHITE)
- .setDuration(SnackbarUtils.LENGTH_LONG)
- .setBgResource(R.drawable.shape_top_round_rect)
- .show();
- break;
-
- case R.id.btn_long_snackbar_with_action:
- SnackbarUtils.with(snackBarRootView)
- .setMessage(getMsg(R.string.snackbar_long))
- .setMessageColor(Color.WHITE)
- .setBgResource(R.drawable.shape_top_round_rect)
- .setDuration(SnackbarUtils.LENGTH_LONG)
- .setAction(getString(R.string.snackbar_click), Color.YELLOW, new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- ToastUtils.showShort(getString(R.string.snackbar_click));
- }
- })
- .show();
- break;
-
- case R.id.btn_indefinite_snackbar:
- SnackbarUtils.with(snackBarRootView)
- .setMessage(getMsg(R.string.snackbar_indefinite))
- .setMessageColor(Color.WHITE)
- .setDuration(SnackbarUtils.LENGTH_INDEFINITE)
- .setBgResource(R.drawable.shape_top_round_rect)
- .show();
- break;
-
- case R.id.btn_indefinite_snackbar_with_action:
- SnackbarUtils.with(snackBarRootView)
- .setMessage(getMsg(R.string.snackbar_indefinite))
- .setMessageColor(Color.WHITE)
- .setDuration(SnackbarUtils.LENGTH_INDEFINITE)
- .setBgResource(R.drawable.shape_top_round_rect)
- .setAction(getString(R.string.snackbar_click), Color.YELLOW, new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- ToastUtils.showShort(getString(R.string.snackbar_click));
- }
- })
- .show();
- break;
-
- case R.id.btn_add_view:
- ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
- SnackbarUtils.with(snackBarRootView)
- .setBgColor(Color.TRANSPARENT)
- .setDuration(SnackbarUtils.LENGTH_INDEFINITE)
- .show();
- SnackbarUtils.addView(R.layout.snackbar_custom, params);
- break;
-
- case R.id.btn_add_view_with_action:
- SnackbarUtils.with(snackBarRootView)
- .setBgColor(Color.TRANSPARENT)
- .setDuration(SnackbarUtils.LENGTH_INDEFINITE)
- .show();
- params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT);
- SnackbarUtils.addView(R.layout.snackbar_custom, params);
- View snackbarView = SnackbarUtils.getView();
- if (snackbarView != null) {
- TextView tvSnackbarCustom = snackbarView.findViewById(R.id.tv_snackbar_custom);
- tvSnackbarCustom.setText("点我可消失");
- snackbarView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- SnackbarUtils.dismiss();
- }
- });
- }
- break;
-
- case R.id.btn_show_success:
- SnackbarUtils.with(snackBarRootView)
- .setMessage(getMsg(R.string.snackbar_success))
- .showSuccess();
- break;
-
- case R.id.btn_show_warning:
- SnackbarUtils.with(snackBarRootView)
- .setMessage(getMsg(R.string.snackbar_warning))
- .showWarning();
- break;
-
- case R.id.btn_show_error:
- SnackbarUtils.with(snackBarRootView)
- .setMessage(getMsg(R.string.snackbar_error))
- .showError();
- break;
-
- case R.id.btn_dismiss_snackbar:
- SnackbarUtils.dismiss();
- break;
- }
- }
-
- private SpannableStringBuilder getMsg(@StringRes int resId) {
- return new SpanUtils()
- .appendImage(R.mipmap.ic_launcher, SpanUtils.ALIGN_CENTER)
- .appendSpace(32)
- .append(getString(resId)).setFontSize(24, true)
- .create();
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/sp/SPActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/sp/SPActivity.java
deleted file mode 100644
index 4bb0181913..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/sp/SPActivity.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package com.blankj.androidutilcode.feature.core.sp;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.androidutilcode.data.DataManager;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2018/01/08
- * desc : demo about SPUtils
- *
- */
-public class SPActivity extends BaseBackActivity {
-
- private TextView tvAboutSp;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, SPActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_sp;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- tvAboutSp = findViewById(R.id.tv_about_sp);
- findViewById(R.id.btn_sp_put_string).setOnClickListener(this);
- findViewById(R.id.btn_sp_put_int).setOnClickListener(this);
- findViewById(R.id.btn_sp_put_long).setOnClickListener(this);
- findViewById(R.id.btn_sp_put_float).setOnClickListener(this);
- findViewById(R.id.btn_sp_put_boolean).setOnClickListener(this);
- findViewById(R.id.btn_sp_clear).setOnClickListener(this);
- }
-
- @Override
- public void doBusiness() {
- updateAboutSp();
- }
-
- @Override
- public void onWidgetClick(View view) {
- switch (view.getId()) {
- case R.id.btn_sp_put_string:
- DataManager.putString();
- break;
- case R.id.btn_sp_put_int:
- DataManager.putInt();
- break;
- case R.id.btn_sp_put_long:
- DataManager.putLong();
- break;
- case R.id.btn_sp_put_float:
- DataManager.putFloat();
- break;
- case R.id.btn_sp_put_boolean:
- DataManager.putBoolean();
- break;
- case R.id.btn_sp_clear:
- DataManager.clear();
- break;
- }
- updateAboutSp();
- }
-
- private void updateAboutSp() {
- tvAboutSp.setText(DataManager.sp2String());
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/span/BlurMaskFilterSpan.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/span/BlurMaskFilterSpan.java
deleted file mode 100644
index 029d42706e..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/span/BlurMaskFilterSpan.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.blankj.androidutilcode.feature.core.span;
-
-import android.graphics.BlurMaskFilter;
-import android.graphics.MaskFilter;
-import android.text.TextPaint;
-import android.text.style.CharacterStyle;
-import android.text.style.UpdateAppearance;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/27
- * desc : demo about SpanUtils
- *
- */
-public class BlurMaskFilterSpan extends CharacterStyle implements UpdateAppearance {
-
- private float mRadius;
- private MaskFilter mFilter;
-
- public BlurMaskFilterSpan(float radius) {
- mRadius = radius;
- }
-
- public void setRadius(float radius) {
- mRadius = radius;
- mFilter = new BlurMaskFilter(mRadius, BlurMaskFilter.Blur.NORMAL);
- }
-
- public float getRadius() {
- return mRadius;
- }
-
- @Override
- public void updateDrawState(TextPaint ds) {
- ds.setMaskFilter(mFilter);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/span/ForegroundAlphaColorSpan.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/span/ForegroundAlphaColorSpan.java
deleted file mode 100644
index 5b1c5026a2..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/span/ForegroundAlphaColorSpan.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.blankj.androidutilcode.feature.core.span;
-
-import android.graphics.Color;
-import android.support.annotation.ColorInt;
-import android.text.TextPaint;
-import android.text.style.CharacterStyle;
-import android.text.style.UpdateAppearance;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/27
- * desc : demo about SpanUtils
- *
- */
-public class ForegroundAlphaColorSpan extends CharacterStyle
- implements UpdateAppearance {
-
- private int mColor;
-
- public ForegroundAlphaColorSpan(@ColorInt int color) {
- mColor = color;
- }
-
- public void setAlpha(int alpha) {
- mColor = Color.argb(alpha, Color.red(mColor), Color.green(mColor), Color.blue(mColor));
- }
-
- @Override
- public void updateDrawState(TextPaint ds) {
- ds.setColor(mColor);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/span/ForegroundAlphaColorSpanGroup.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/span/ForegroundAlphaColorSpanGroup.java
deleted file mode 100644
index 86df9615df..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/span/ForegroundAlphaColorSpanGroup.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.blankj.androidutilcode.feature.core.span;
-
-import java.util.ArrayList;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/27
- * desc : demo about SpanUtils
- *
- */
-public class ForegroundAlphaColorSpanGroup {
-
- private final float mAlpha;
-
- private final ArrayList mSpans;
-
- public ForegroundAlphaColorSpanGroup(float alpha) {
- mAlpha = alpha;
- mSpans = new ArrayList<>();
- }
-
- public void addSpan(ForegroundAlphaColorSpan span) {
- span.setAlpha((int) (mAlpha * 255));
- mSpans.add(span);
- }
-
- public void setAlpha(float alpha) {
- int size = mSpans.size();
- float total = 1.0f * size * alpha;
- for (int index = 0; index < size; index++) {
- ForegroundAlphaColorSpan span = mSpans.get(index);
- if (total >= 1.0f) {
- span.setAlpha(255);
- total -= 1.0f;
- } else {
- span.setAlpha((int) (total * 255));
- total = 0.0f;
- }
- }
- }
-
- public float getAlpha() {
- return mAlpha;
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/span/ShadowSpan.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/span/ShadowSpan.java
deleted file mode 100644
index 457c575ce9..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/span/ShadowSpan.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.blankj.androidutilcode.feature.core.span;
-
-import android.text.TextPaint;
-import android.text.style.CharacterStyle;
-import android.text.style.UpdateAppearance;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/27
- * desc : demo about SpanUtils
- *
- */
-public class ShadowSpan extends CharacterStyle implements UpdateAppearance {
- private float radius;
- private float dx;
- private float dy;
- private int shadowColor;
-
- public ShadowSpan(float radius, float dx, float dy, int shadowColor) {
- this.radius = radius;
- this.dx = dx;
- this.dy = dy;
- this.shadowColor = shadowColor;
- }
-
- public float getDx() {
- return dx;
- }
-
- public void setDx(float dx) {
- this.dx = dx;
- }
-
- public float getDy() {
- return dy;
- }
-
- public void setDy(float dy) {
- this.dy = dy;
- }
-
- @Override
- public void updateDrawState(TextPaint tp) {
- tp.setShadowLayer(radius, dx, dy, shadowColor);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/span/SpanActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/span/SpanActivity.java
deleted file mode 100644
index 223c1aea11..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/span/SpanActivity.java
+++ /dev/null
@@ -1,267 +0,0 @@
-package com.blankj.androidutilcode.feature.core.span;
-
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.BitmapFactory;
-import android.graphics.BitmapShader;
-import android.graphics.BlurMaskFilter;
-import android.graphics.Color;
-import android.graphics.LinearGradient;
-import android.graphics.Matrix;
-import android.graphics.Shader;
-import android.graphics.Typeface;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.content.ContextCompat;
-import android.text.Layout;
-import android.text.SpannableStringBuilder;
-import android.text.TextPaint;
-import android.text.method.LinkMovementMethod;
-import android.text.style.ClickableSpan;
-import android.view.View;
-import android.view.animation.LinearInterpolator;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.SpanUtils;
-import com.blankj.utilcode.util.ToastUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/27
- * desc : demo about SpanUtils
- *
- */
-public class SpanActivity extends BaseBackActivity {
-
- SpanUtils mSpanUtils;
- SpannableStringBuilder animSsb;
-
- int lineHeight;
- float textSize;
- ValueAnimator valueAnimator;
- Shader mShader;
- float mShaderWidth;
- Matrix matrix;
-
- BlurMaskFilterSpan mBlurMaskFilterSpan;
-
- ShadowSpan mShadowSpan;
-
- ForegroundAlphaColorSpan mForegroundAlphaColorSpan;
-
- ForegroundAlphaColorSpanGroup mForegroundAlphaColorSpanGroup;
-
- String mPrinterString;
-
-
- float density;
- TextView tvAboutSpan;
- TextView tvAboutAnimRainbow;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, SpanActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_span;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_span));
-
- ClickableSpan clickableSpan = new ClickableSpan() {
- @Override
- public void onClick(View widget) {
- ToastUtils.showShort("事件触发了");
- }
-
- @Override
- public void updateDrawState(TextPaint ds) {
- ds.setColor(Color.BLUE);
- ds.setUnderlineText(false);
- }
- };
-
- tvAboutSpan = findViewById(R.id.tv_about_span);
- tvAboutAnimRainbow = findViewById(R.id.tv_about_anim_span);
-
- // 响应点击事件的话必须设置以下属性
- tvAboutSpan.setMovementMethod(LinkMovementMethod.getInstance());
- // 去掉点击事件后的高亮
- tvAboutSpan.setHighlightColor(ContextCompat.getColor(this, android.R.color.transparent));
- lineHeight = tvAboutSpan.getLineHeight();
- textSize = tvAboutSpan.getTextSize();
- density = getResources().getDisplayMetrics().density;
-
- initAnimSpan();
- startAnim();
-
-
- tvAboutSpan.setText(new SpanUtils()
- .appendLine("SpanUtils").setBackgroundColor(Color.LTGRAY).setBold().setForegroundColor(Color.YELLOW).setAlign(Layout.Alignment.ALIGN_CENTER)
- .appendLine("前景色").setForegroundColor(Color.GREEN)
- .appendLine("背景色").setBackgroundColor(Color.LTGRAY)
- .appendLine("行高顶部对齐").setLineHeight(2 * lineHeight, SpanUtils.ALIGN_TOP).setBackgroundColor(Color.GREEN)
- .appendLine("行高居中对齐").setLineHeight(2 * lineHeight, SpanUtils.ALIGN_CENTER).setBackgroundColor(Color.LTGRAY)
- .appendLine("行高底部对齐").setLineHeight(2 * lineHeight, SpanUtils.ALIGN_BOTTOM).setBackgroundColor(Color.GREEN)
- .appendLine("测试段落缩,首行缩进两字,其他行不缩进").setLeadingMargin((int) textSize * 2, 10).setBackgroundColor(Color.GREEN)
- .appendLine("测试引用,后面的字是为了凑到两行的效果").setQuoteColor(Color.GREEN, 10, 10).setBackgroundColor(Color.LTGRAY)
- .appendLine("测试列表项,后面的字是为了凑到两行的效果").setBullet(Color.GREEN, 20, 10).setBackgroundColor(Color.LTGRAY).setBackgroundColor(Color.GREEN)
- .appendLine("32dp 字体").setFontSize(32, true)
- .appendLine("2 倍字体").setFontProportion(2)
- .appendLine("横向 2 倍字体").setFontXProportion(1.5f)
- .appendLine("删除线").setStrikethrough()
- .appendLine("下划线").setUnderline()
- .append("测试").appendLine("上标").setSuperscript()
- .append("测试").appendLine("下标").setSubscript()
- .appendLine("粗体").setBold()
- .appendLine("斜体").setItalic()
- .appendLine("粗斜体").setBoldItalic()
- .appendLine("monospace 字体").setFontFamily("monospace")
- .appendLine("自定义字体").setTypeface(Typeface.createFromAsset(getAssets(), "fonts/dnmbhs.ttf"))
- .appendLine("相反对齐").setAlign(Layout.Alignment.ALIGN_OPPOSITE)
- .appendLine("居中对齐").setAlign(Layout.Alignment.ALIGN_CENTER)
- .appendLine("正常对齐").setAlign(Layout.Alignment.ALIGN_NORMAL)
- .append("测试").appendLine("点击事件").setClickSpan(clickableSpan)
- .append("测试").appendLine("Url").setUrl("https://github.com/Blankj/AndroidUtilCode")
- .append("测试").appendLine("模糊").setBlur(3, BlurMaskFilter.Blur.NORMAL)
- .appendLine("颜色渐变").setShader(new LinearGradient(0, 0,
- 64 * density * 4, 0,
- getResources().getIntArray(R.array.rainbow),
- null,
- Shader.TileMode.REPEAT)).setFontSize(64, true)
- .appendLine("图片着色").setFontSize(64, true).setShader(new BitmapShader(BitmapFactory.decodeResource(getResources(), R.drawable.span_cheetah),
- Shader.TileMode.REPEAT,
- Shader.TileMode.REPEAT))
- .appendLine("阴影效果").setFontSize(64, true).setBackgroundColor(Color.BLACK).setShadow(24, 8, 8, Color.WHITE)
-
- .append("小图").setBackgroundColor(Color.GREEN)
- .appendImage(R.drawable.shape_spannable_block_low, SpanUtils.ALIGN_TOP)
- .append("顶部").setBackgroundColor(Color.GREEN)
- .appendImage(R.drawable.shape_spannable_block_low, SpanUtils.ALIGN_CENTER)
- .append("居中").setBackgroundColor(Color.GREEN)
- .appendImage(R.drawable.shape_spannable_block_low, SpanUtils.ALIGN_BASELINE)
- .append("底部").setBackgroundColor(Color.GREEN)
- .appendImage(R.drawable.shape_spannable_block_low, SpanUtils.ALIGN_BOTTOM)
- .appendLine("对齐").setBackgroundColor(Color.GREEN)
-
- .appendImage(R.drawable.shape_spannable_block_high, SpanUtils.ALIGN_TOP)
- .append("大图").setBackgroundColor(Color.LTGRAY)
- .appendImage(R.drawable.shape_spannable_block_high, SpanUtils.ALIGN_TOP)
- .append("顶部").setBackgroundColor(Color.LTGRAY)
- .appendImage(R.drawable.shape_spannable_block_high, SpanUtils.ALIGN_TOP)
- .appendLine("对齐").setBackgroundColor(Color.LTGRAY)
-
- .appendImage(R.drawable.shape_spannable_block_high, SpanUtils.ALIGN_CENTER)
- .append("大图").setBackgroundColor(Color.GREEN)
- .appendImage(R.drawable.shape_spannable_block_high, SpanUtils.ALIGN_CENTER)
- .append("居中").setBackgroundColor(Color.GREEN)
- .appendImage(R.drawable.shape_spannable_block_high, SpanUtils.ALIGN_CENTER)
- .appendLine("对齐").setBackgroundColor(Color.GREEN)
-
- .appendImage(R.drawable.shape_spannable_block_high, SpanUtils.ALIGN_BOTTOM)
- .append("大图").setBackgroundColor(Color.LTGRAY)
- .appendImage(R.drawable.shape_spannable_block_high, SpanUtils.ALIGN_BOTTOM)
- .append("底部").setBackgroundColor(Color.LTGRAY)
- .appendImage(R.drawable.shape_spannable_block_high, SpanUtils.ALIGN_BOTTOM)
- .appendLine("对齐").setBackgroundColor(Color.LTGRAY)
-
- .append("测试空格").appendSpace(30, Color.LTGRAY).appendSpace(50, Color.GREEN).appendSpace(100).appendSpace(30, Color.LTGRAY).appendSpace(50, Color.GREEN)
- .create());
- }
-
- private void initAnimSpan() {
- mShaderWidth = 64 * density * 4;
- mShader = new LinearGradient(0, 0,
- mShaderWidth, 0,
- getResources().getIntArray(R.array.rainbow),
- null,
- Shader.TileMode.REPEAT);
- matrix = new Matrix();
-
- mBlurMaskFilterSpan = new BlurMaskFilterSpan(25);
-
- mShadowSpan = new ShadowSpan(8, 8, 8, Color.WHITE);
-
- mForegroundAlphaColorSpan = new ForegroundAlphaColorSpan(Color.TRANSPARENT);
-
- mForegroundAlphaColorSpanGroup = new ForegroundAlphaColorSpanGroup(0);
-
- mPrinterString = "打印动画,后面的文字是为了测试打印效果...";
-
- mSpanUtils = new SpanUtils()
- .appendLine("彩虹动画").setFontSize(64, true).setShader(mShader)
- .appendLine("模糊动画").setFontSize(64, true).setSpans(mBlurMaskFilterSpan)
- .appendLine("阴影动画").setFontSize(64, true).setBackgroundColor(Color.BLACK).setSpans(mShadowSpan)
- .appendLine("透明动画").setFontSize(64, true).setSpans(mForegroundAlphaColorSpan);
- for (int i = 0, len = mPrinterString.length(); i < len; ++i) {
- ForegroundAlphaColorSpan span = new ForegroundAlphaColorSpan(Color.TRANSPARENT);
- mSpanUtils.append(mPrinterString.substring(i, i + 1)).setSpans(span);
- mForegroundAlphaColorSpanGroup.addSpan(span);
- }
- animSsb = mSpanUtils.create();
- }
-
- private void startAnim() {
- valueAnimator = ValueAnimator.ofFloat(0, 1);
- valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- // shader
- matrix.reset();
- matrix.setTranslate((Float) animation.getAnimatedValue() * mShaderWidth, 0);
- mShader.setLocalMatrix(matrix);
-
- // blur
- mBlurMaskFilterSpan.setRadius(25 * (1.00001f - (Float) animation.getAnimatedValue()));
-
- // shadow
- mShadowSpan.setDx(16 * (0.5f - (Float) animation.getAnimatedValue()));
- mShadowSpan.setDy(16 * (0.5f - (Float) animation.getAnimatedValue()));
-
- // alpha
- mForegroundAlphaColorSpan.setAlpha((int) (255 * (Float) animation.getAnimatedValue()));
-
- // printer
- mForegroundAlphaColorSpanGroup.setAlpha((Float) animation.getAnimatedValue());
-
- // update
- tvAboutAnimRainbow.setText(animSsb);
- }
- });
-
- valueAnimator.setInterpolator(new LinearInterpolator());
- valueAnimator.setDuration(600 * 3);
- valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
- valueAnimator.start();
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
-
- }
-
- @Override
- protected void onDestroy() {
- valueAnimator.cancel();
- super.onDestroy();
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/toast/CustomToast.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/toast/CustomToast.java
deleted file mode 100644
index 5a2cf8a6e8..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/toast/CustomToast.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package com.blankj.androidutilcode.feature.core.toast;
-
-import android.os.Handler;
-import android.os.Looper;
-import android.support.annotation.NonNull;
-import android.support.annotation.StringRes;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.UtilsApp;
-import com.blankj.utilcode.util.ToastUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2017/08/31
- * desc : demo about ToastUtils
- *
- */
-public class CustomToast {
-
- private static final Handler HANDLER = new Handler(Looper.getMainLooper());
-
- public static void showShort(@NonNull final CharSequence text) {
- show(text, Toast.LENGTH_SHORT);
- }
-
- public static void showShort(@StringRes final int resId) {
- show(resId, Toast.LENGTH_SHORT);
- }
-
- public static void showShort(@StringRes final int resId, final Object... args) {
- show(resId, Toast.LENGTH_SHORT, args);
- }
-
- public static void showShort(final String format, final Object... args) {
- show(format, Toast.LENGTH_SHORT, args);
- }
-
- public static void showLong(@NonNull final CharSequence text) {
- show(text, Toast.LENGTH_LONG);
- }
-
- public static void showLong(@StringRes final int resId) {
- show(resId, Toast.LENGTH_LONG);
- }
-
- public static void showLong(@StringRes final int resId, final Object... args) {
- show(resId, Toast.LENGTH_LONG, args);
- }
-
- public static void showLong(final String format, final Object... args) {
- show(format, Toast.LENGTH_LONG, args);
- }
-
- private static void show(@StringRes final int resId, final int duration) {
- show(UtilsApp.getInstance().getResources().getString(resId), duration);
- }
-
- private static void show(@StringRes final int resId, final int duration, final Object... args) {
- show(String.format(UtilsApp.getInstance().getResources().getString(resId), args), duration);
- }
-
- private static void show(final String format, final int duration, final Object... args) {
- show(String.format(format, args), duration);
- }
-
- private static void show(final CharSequence text, final int duration) {
- HANDLER.post(new Runnable() {
- @Override
- public void run() {
- TextView toastView;
- if (duration == Toast.LENGTH_SHORT) {
- toastView = (TextView) ToastUtils.showCustomShort(R.layout.toast_custom);
- } else {
- toastView = (TextView) ToastUtils.showCustomLong(R.layout.toast_custom);
- }
- toastView.setText(text);
- }
- });
- }
-
- public static void cancel() {
- ToastUtils.cancel();
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/toast/ToastActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/toast/ToastActivity.java
deleted file mode 100644
index d36fb31659..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/toast/ToastActivity.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package com.blankj.androidutilcode.feature.core.toast;
-
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Color;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.content.ContextCompat;
-import android.view.Gravity;
-import android.view.View;
-import android.widget.Toast;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.SizeUtils;
-import com.blankj.utilcode.util.SpanUtils;
-import com.blankj.utilcode.util.ToastUtils;
-import com.blankj.utilcode.util.Utils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/29
- * desc : demo about ToastUtils
- *
- */
-public class ToastActivity extends BaseBackActivity {
-
- View toastView;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, ToastActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_toast;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_toast));
-
- findViewById(R.id.btn_show_short_toast).setOnClickListener(this);
- findViewById(R.id.btn_show_long_toast).setOnClickListener(this);
- findViewById(R.id.btn_show_green_font).setOnClickListener(this);
- findViewById(R.id.btn_show_bg_color).setOnClickListener(this);
- findViewById(R.id.btn_show_bg_resource).setOnClickListener(this);
- findViewById(R.id.btn_show_span).setOnClickListener(this);
- findViewById(R.id.btn_show_custom_view).setOnClickListener(this);
- findViewById(R.id.btn_show_middle).setOnClickListener(this);
- findViewById(R.id.btn_cancel_toast).setOnClickListener(this);
- toastView = findViewById(R.id.btn_cancel_toast);
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
- resetToast();
- switch (view.getId()) {
- case R.id.btn_show_short_toast:
- new Thread(new Runnable() {
- @Override
- public void run() {
- ToastUtils.showShort(R.string.toast_short);
- }
- }).start();
- break;
- case R.id.btn_show_long_toast:
- new Thread(new Runnable() {
- @Override
- public void run() {
- ToastUtils.showLong(R.string.toast_long);
- }
- }).start();
- break;
- case R.id.btn_show_green_font:
- ToastUtils.setMsgColor(Color.GREEN);
- ToastUtils.showLong(R.string.toast_green_font);
- break;
- case R.id.btn_show_bg_color:
- ToastUtils.setBgColor(ContextCompat.getColor(this, R.color.colorAccent));
- ToastUtils.showLong(R.string.toast_bg_color);
- break;
- case R.id.btn_show_bg_resource:
- ToastUtils.setBgResource(R.drawable.shape_round_rect);
- ToastUtils.showLong(R.string.toast_custom_bg);
- break;
- case R.id.btn_show_span:
- ToastUtils.showLong(new SpanUtils()
- .appendImage(R.mipmap.ic_launcher, SpanUtils.ALIGN_CENTER)
- .appendSpace(32)
- .append(getString(R.string.toast_span)).setFontSize(24, true)
- .create()
- );
- break;
- case R.id.btn_show_custom_view:
- new Thread(new Runnable() {
- @Override
- public void run() {
- CustomToast.showLong(R.string.toast_custom_view);
- }
- }).start();
- break;
- case R.id.btn_show_middle:
- ToastUtils.setGravity(Gravity.CENTER, 0, 0);
- ToastUtils.showLong(R.string.toast_middle);
- break;
- case R.id.btn_cancel_toast:
- ToastUtils.cancel();
- break;
- }
- }
-
- @Override
- protected void onDestroy() {
- resetToast();
- super.onDestroy();
- }
-
- private void resetToast() {
- ToastUtils.setMsgColor(0xFEFFFFFF);
- ToastUtils.setBgColor(0xFEFFFFFF);
- ToastUtils.setBgResource(-1);
- ToastUtils.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, getResources().getDimensionPixelSize(R.dimen.offset_64));
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/sub/SubUtilActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/sub/SubUtilActivity.java
deleted file mode 100644
index ffca01e93f..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/sub/SubUtilActivity.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.blankj.androidutilcode.feature.sub;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.androidutilcode.feature.sub.brightness.BrightnessActivity;
-import com.blankj.androidutilcode.feature.sub.flashlight.FlashlightActivity;
-import com.blankj.androidutilcode.feature.sub.location.LocationActivity;
-import com.blankj.androidutilcode.feature.sub.pinyin.PinyinActivity;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/29
- * desc : MainActivity
- *
- */
-public class SubUtilActivity extends BaseBackActivity {
-
- public static void start(Context context) {
- Intent starter = new Intent(context, SubUtilActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_util_sub;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.sub_util));
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
-
- }
-
- public void brightnessClick(View view) {
- BrightnessActivity.start(this);
- }
-
- public void flashlightClick(View view) {
- FlashlightActivity.start(this);
- }
-
- public void locationClick(View view) {
- LocationActivity.start(this);
- }
-
- public void pinyinClick(View view) {
- PinyinActivity.start(this);
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/sub/brightness/BrightnessActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/sub/brightness/BrightnessActivity.java
deleted file mode 100644
index f67e31fd3e..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/sub/brightness/BrightnessActivity.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package com.blankj.androidutilcode.feature.sub.brightness;
-
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-import android.provider.Settings;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.CompoundButton;
-import android.widget.SeekBar;
-import android.widget.TextView;
-import android.widget.ToggleButton;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseActivity;
-import com.blankj.subutil.util.BrightnessUtils;
-import com.blankj.subutil.util.Utils;
-import com.blankj.utilcode.util.SpanUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2018/02/08
- * desc : demo about BrightnessUtils
- *
- */
-public class BrightnessActivity extends BaseActivity {
-
- TextView tvBrightness;
- SeekBar sbBrightness;
- TextView tvWindowBrightness;
- SeekBar sbWindowBrightness;
- ToggleButton tbAutoBrightness;
-
- private SeekBar.OnSeekBarChangeListener brightnessChangeListener
- = new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- BrightnessUtils.setBrightness(progress);
- updateBrightness();
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
-
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
-
- }
- };
-
- private SeekBar.OnSeekBarChangeListener windowBrightnessChangeListener
- = new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- BrightnessUtils.setWindowBrightness(getWindow(), progress);
- updateWindowBrightness();
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
-
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
-
- }
- };
-
- public static void start(Context context) {
- Intent starter = new Intent(context, BrightnessActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_brightness;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- tvBrightness = findViewById(R.id.tv_brightness);
- sbBrightness = findViewById(R.id.sb_brightness);
- tvWindowBrightness = findViewById(R.id.tv_window_brightness);
- sbWindowBrightness = findViewById(R.id.sb_window_brightness);
- tbAutoBrightness = findViewById(R.id.tb_set_auto_brightness_enable);
-
- sbBrightness.setProgress(BrightnessUtils.getBrightness());
- sbBrightness.setOnSeekBarChangeListener(brightnessChangeListener);
- updateBrightness();
-
- sbWindowBrightness.setProgress(BrightnessUtils.getWindowBrightness(getWindow()));
- sbWindowBrightness.setOnSeekBarChangeListener(windowBrightnessChangeListener);
- updateWindowBrightness();
-
- tbAutoBrightness.setChecked(BrightnessUtils.isAutoBrightnessEnabled());
- tbAutoBrightness.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
- && !Settings.System.canWrite(Utils.getApp())) {
- Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
- intent.setData(Uri.parse("package:" + Utils.getApp().getPackageName()));
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- Utils.getApp().startActivity(intent);
- }
- }
- });
-
- tbAutoBrightness.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- boolean isSuccess = BrightnessUtils.setAutoBrightnessEnabled(isChecked);
- if (!isSuccess) {
- tbAutoBrightness.toggle();
- }
- }
- });
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
-
- }
-
- private void updateBrightness() {
- tvBrightness.setText(new SpanUtils()
- .append(String.valueOf(BrightnessUtils.getBrightness()))
- .create()
- );
- }
-
- private void updateWindowBrightness() {
- tvWindowBrightness.setText(new SpanUtils()
- .append(String.valueOf(BrightnessUtils.getWindowBrightness(getWindow())))
- .create()
- );
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/sub/flashlight/FlashlightActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/sub/flashlight/FlashlightActivity.java
deleted file mode 100644
index 0e30a98910..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/sub/flashlight/FlashlightActivity.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package com.blankj.androidutilcode.feature.sub.flashlight;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.androidutilcode.helper.PermissionHelper;
-import com.blankj.subutil.util.FlashlightUtils;
-import com.blankj.utilcode.util.SpanUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2018/04/27
- * desc : demo about FlashlightUtils
- *
- */
-public class FlashlightActivity extends BaseBackActivity {
-
- TextView tvAboutFlashlight;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, FlashlightActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_flashlight;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- tvAboutFlashlight = findViewById(R.id.tv_about_flashlight);
- findViewById(R.id.btn_set_flashlight_on).setOnClickListener(this);
- findViewById(R.id.btn_set_flashlight_off).setOnClickListener(this);
- }
-
- @Override
- public void doBusiness() {
- if (FlashlightUtils.isFlashlightEnable()) {
- FlashlightUtils.getInstance().register();
- }
- updateAboutFlashlight();
- }
-
- @Override
- public void onWidgetClick(View view) {
- if (!FlashlightUtils.isFlashlightEnable()) return;
- switch (view.getId()) {
- case R.id.btn_set_flashlight_on:
- PermissionHelper.requestCamera(new PermissionHelper.OnPermissionGrantedListener() {
- @Override
- public void onPermissionGranted() {
- FlashlightUtils.getInstance().setFlashlightOn();
- }
- });
- break;
- case R.id.btn_set_flashlight_off:
- PermissionHelper.requestCamera(new PermissionHelper.OnPermissionGrantedListener() {
- @Override
- public void onPermissionGranted() {
- FlashlightUtils.getInstance().setFlashlightOff();
- }
- });
- break;
- }
- updateAboutFlashlight();
- }
-
- @Override
- protected void onDestroy() {
- FlashlightUtils.getInstance().unregister();
- super.onDestroy();
- }
-
- private void updateAboutFlashlight() {
- PermissionHelper.requestCamera(new PermissionHelper.OnPermissionGrantedListener() {
- @Override
- public void onPermissionGranted() {
- tvAboutFlashlight.setText(new SpanUtils()
- .appendLine("isFlashlightEnable: " + FlashlightUtils.isFlashlightEnable())
- .appendLine("isFlashlightOn: " + FlashlightUtils.getInstance().isFlashlightOn())
- .create());
- }
- });
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/sub/location/LocationActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/sub/location/LocationActivity.java
deleted file mode 100755
index 4c81895f57..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/sub/location/LocationActivity.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package com.blankj.androidutilcode.feature.sub.location;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.utilcode.util.SpanUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/10/13
- * desc : demo about LocationUtils
- *
- */
-public class LocationActivity extends BaseBackActivity {
-
- TextView tvAboutLocation;
- LocationService mLocationService;
-
- public static void start(Context context) {
- Intent starter = new Intent(context, LocationActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_location;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_location));
-
- tvAboutLocation = findViewById(R.id.tv_about_location);
- tvAboutLocation.setText(new SpanUtils()
- .appendLine("lastLatitude: unknown")
- .appendLine("lastLongitude: unknown")
- .appendLine("latitude: unknown")
- .appendLine("longitude: unknown")
- .appendLine("getCountryName: unknown")
- .appendLine("getLocality: unknown")
- .appendLine("getStreet: unknown")
- .create()
- );
- }
-
- @Override
- public void doBusiness() {
- bindService(new Intent(this, LocationService.class), conn, Context.BIND_AUTO_CREATE);
- }
-
- @Override
- public void onWidgetClick(View view) {
-
- }
-
- @Override
- protected void onDestroy() {
- unbindService(conn);
- super.onDestroy();
- }
-
- ServiceConnection conn = new ServiceConnection() {
- @Override
- public void onServiceDisconnected(ComponentName name) {
-
- }
-
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- mLocationService = ((LocationService.LocationBinder) service).getService();
- mLocationService.setOnGetLocationListener(new LocationService.OnGetLocationListener() {
- @Override
- public void getLocation(final String lastLatitude, final String lastLongitude, final String latitude, final String longitude, final String country, final String locality, final String street) {
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- tvAboutLocation.setText(new SpanUtils()
- .appendLine("lastLatitude: " + lastLatitude)
- .appendLine("lastLongitude: " + lastLongitude)
- .appendLine("latitude: " + latitude)
- .appendLine("longitude: " + longitude)
- .appendLine("getCountryName: " + country )
- .appendLine("getLocality: " + locality)
- .appendLine( "getStreet: " + street)
- .create()
- );
- }
- });
- }
- });
- }
- };
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/sub/location/LocationService.java b/app/src/main/java/com/blankj/androidutilcode/feature/sub/location/LocationService.java
deleted file mode 100755
index 5828d19c7d..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/sub/location/LocationService.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package com.blankj.androidutilcode.feature.sub.location;
-
-import android.app.Service;
-import android.content.Intent;
-import android.location.Location;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.Looper;
-import android.support.annotation.Nullable;
-
-import com.blankj.androidutilcode.helper.PermissionHelper;
-import com.blankj.subutil.util.LocationUtils;
-import com.blankj.utilcode.util.ToastUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/11/21
- * desc : demo about LocationUtils
- *
- */
-public class LocationService extends Service {
-
- private boolean isSuccess;
- private String lastLatitude = "loading...";
- private String lastLongitude = "loading...";
- private String latitude = "loading...";
- private String longitude = "loading...";
- private String country = "loading...";
- private String locality = "loading...";
- private String street = "loading...";
- private OnGetLocationListener mOnGetLocationListener;
-
- public void setOnGetLocationListener(OnGetLocationListener onGetLocationListener) {
- mOnGetLocationListener = onGetLocationListener;
- }
-
- private LocationUtils.OnLocationChangeListener mOnLocationChangeListener = new LocationUtils.OnLocationChangeListener() {
- @Override
- public void getLastKnownLocation(Location location) {
- lastLatitude = String.valueOf(location.getLatitude());
- lastLongitude = String.valueOf(location.getLongitude());
- if (mOnGetLocationListener != null) {
- mOnGetLocationListener.getLocation(lastLatitude, lastLongitude, latitude, longitude, country, locality, street);
- }
- }
-
- @Override
- public void onLocationChanged(final Location location) {
- latitude = String.valueOf(location.getLatitude());
- longitude = String.valueOf(location.getLongitude());
- if (mOnGetLocationListener != null) {
- mOnGetLocationListener.getLocation(lastLatitude, lastLongitude, latitude, longitude, country, locality, street);
- }
- country = LocationUtils.getCountryName(Double.parseDouble(latitude), Double.parseDouble(longitude));
- locality = LocationUtils.getLocality(Double.parseDouble(latitude), Double.parseDouble(longitude));
- street = LocationUtils.getStreet(Double.parseDouble(latitude), Double.parseDouble(longitude));
- if (mOnGetLocationListener != null) {
- mOnGetLocationListener.getLocation(lastLatitude, lastLongitude, latitude, longitude, country, locality, street);
- }
- }
-
- @Override
- public void onStatusChanged(String provider, int status, Bundle extras) {
-
- }
- };
-
- @Override
- public void onCreate() {
- super.onCreate();
- PermissionHelper.requestLocation(new PermissionHelper.OnPermissionGrantedListener() {
- @Override
- public void onPermissionGranted() {
- new Thread(new Runnable() {
- @Override
- public void run() {
- Looper.prepare();
- isSuccess = LocationUtils.register(0, 0, mOnLocationChangeListener);
- if (isSuccess) ToastUtils.showShort("init success");
- Looper.loop();
- }
- }).start();
- }
- });
- }
-
- @Nullable
- @Override
- public IBinder onBind(Intent intent) {
- return new LocationBinder();
- }
-
- public class LocationBinder extends Binder {
- public LocationService getService() {
- return LocationService.this;
- }
- }
-
- @Override
- public void onDestroy() {
- LocationUtils.unregister();
- // 一定要制空,否则内存泄漏
- mOnGetLocationListener = null;
- super.onDestroy();
- }
-
- /**
- * 获取位置监听器
- */
- public interface OnGetLocationListener {
- void getLocation(
- String lastLatitude, String lastLongitude,
- String latitude, String longitude,
- String country, String locality, String street
- );
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/sub/pinyin/PinyinActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/sub/pinyin/PinyinActivity.java
deleted file mode 100644
index d600d20a9c..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/sub/pinyin/PinyinActivity.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package com.blankj.androidutilcode.feature.sub.pinyin;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.widget.TextView;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.androidutilcode.base.BaseBackActivity;
-import com.blankj.subutil.util.PinyinUtils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 17/02/01
- * desc : demo about PinyinUtils
- *
- */
-public class PinyinActivity extends BaseBackActivity {
-
- public static void start(Context context) {
- Intent starter = new Intent(context, PinyinActivity.class);
- context.startActivity(starter);
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.activity_pinyin;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- getToolBar().setTitle(getString(R.string.demo_pinyin));
-
- TextView tvAboutPinyin = findViewById(R.id.tv_about_pinyin);
-
- String surnames = "乐乘乜仇会便区单参句召员宓弗折曾朴查洗盖祭种秘繁缪能蕃覃解谌适都阿难黑";
- int size = surnames.length();
- StringBuilder sb = new StringBuilder("汉字转拼音: " + PinyinUtils.ccs2Pinyin("汉字转拼音", " ")
- + "\n获取首字母: " + PinyinUtils.getPinyinFirstLetters("获取首字母", " ")
- + "\n\n测试姓氏"
- + "\n澹台: " + PinyinUtils.getSurnamePinyin("澹台")
- + "\n尉迟: " + PinyinUtils.getSurnamePinyin("尉迟")
- + "\n万俟: " + PinyinUtils.getSurnamePinyin("万俟")
- + "\n单于: " + PinyinUtils.getSurnamePinyin("单于"));
- for (int i = 0; i < size; ++i) {
- String surname = String.valueOf(surnames.charAt(i));
- sb.append(String.format(
- "\n%s 正确: %-6s 错误: %-6s",
- surname,
- PinyinUtils.getSurnamePinyin(surname),
- PinyinUtils.ccs2Pinyin(surname)
- ));
- }
- tvAboutPinyin.setText(sb.toString());
- }
-
- @Override
- public void doBusiness() {
-
- }
-
- @Override
- public void onWidgetClick(View view) {
-
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/helper/DialogHelper.java b/app/src/main/java/com/blankj/androidutilcode/helper/DialogHelper.java
deleted file mode 100644
index 1118ac8f99..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/helper/DialogHelper.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package com.blankj.androidutilcode.helper;
-
-import android.app.Activity;
-import android.content.DialogInterface;
-import android.support.v7.app.AlertDialog;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.EditText;
-
-import com.blankj.androidutilcode.R;
-import com.blankj.utilcode.util.ActivityUtils;
-import com.blankj.utilcode.util.KeyboardUtils;
-import com.blankj.utilcode.util.PermissionUtils;
-import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldRequest;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2018/01/10
- * desc : helper about dialog
- *
- */
-public class DialogHelper {
-
- public static void showRationaleDialog(final ShouldRequest shouldRequest) {
- Activity topActivity = ActivityUtils.getTopActivity();
- if (topActivity == null) return;
- new AlertDialog.Builder(topActivity)
- .setTitle(android.R.string.dialog_alert_title)
- .setMessage(R.string.permission_rationale_message)
- .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- shouldRequest.again(true);
- }
- })
- .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- shouldRequest.again(false);
- }
- })
- .setCancelable(false)
- .create()
- .show();
-
- }
-
- public static void showOpenAppSettingDialog() {
- Activity topActivity = ActivityUtils.getTopActivity();
- if (topActivity == null) return;
- new AlertDialog.Builder(topActivity)
- .setTitle(android.R.string.dialog_alert_title)
- .setMessage(R.string.permission_denied_forever_message)
- .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- PermissionUtils.launchAppDetailsSettings();
- }
- })
- .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
-
- }
- })
- .setCancelable(false)
- .create()
- .show();
- }
-
- public static void showAdaptScreenDialog() {
- Activity topActivity = ActivityUtils.getTopActivity();
- if (topActivity == null) return;
- new AlertDialog.Builder(topActivity)
- .setTitle(android.R.string.dialog_alert_title)
- .setMessage("Message!")
- .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
-
- }
- })
- .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
-
- }
- })
- .setCancelable(false)
- .create()
- .show();
- }
-
- public static void showKeyboardDialog() {
- Activity topActivity = ActivityUtils.getTopActivity();
- if (topActivity == null) return;
- final View dialogView = LayoutInflater.from(topActivity).inflate(R.layout.dialog_keyboard, null);
- final EditText etInput = dialogView.findViewById(R.id.et_input);
- final AlertDialog dialog = new AlertDialog.Builder(topActivity).setView(dialogView).create();
- dialog.setCanceledOnTouchOutside(false);
- View.OnClickListener listener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.btn_hide_soft_input:
- KeyboardUtils.hideSoftInput(etInput);
- break;
- case R.id.btn_show_soft_input:
- KeyboardUtils.showSoftInput(etInput);
- break;
- case R.id.btn_toggle_soft_input:
- KeyboardUtils.toggleSoftInput();
- break;
- case R.id.btn_close_dialog:
- KeyboardUtils.hideSoftInput(etInput);
- dialog.dismiss();
- break;
- }
- }
- };
- dialogView.findViewById(R.id.btn_hide_soft_input).setOnClickListener(listener);
- dialogView.findViewById(R.id.btn_show_soft_input).setOnClickListener(listener);
- dialogView.findViewById(R.id.btn_toggle_soft_input).setOnClickListener(listener);
- dialogView.findViewById(R.id.btn_close_dialog).setOnClickListener(listener);
- dialog.show();
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/helper/PermissionHelper.java b/app/src/main/java/com/blankj/androidutilcode/helper/PermissionHelper.java
deleted file mode 100644
index 1012a4392d..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/helper/PermissionHelper.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package com.blankj.androidutilcode.helper;
-
-import com.blankj.utilcode.constant.PermissionConstants;
-import com.blankj.utilcode.util.LogUtils;
-import com.blankj.utilcode.util.PermissionUtils;
-
-import java.util.List;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2018/01/06
- * desc : helper about permission
- *
- */
-public class PermissionHelper {
-
- public static void requestCamera(final OnPermissionGrantedListener listener) {
- request(listener, PermissionConstants.CAMERA);
- }
-
- public static void requestStorage(final OnPermissionGrantedListener listener) {
- request(listener, PermissionConstants.STORAGE);
- }
-
- public static void requestPhone(final OnPermissionGrantedListener listener) {
- request(listener, PermissionConstants.PHONE);
- }
-
- public static void requestPhone(final OnPermissionGrantedListener grantedListener,
- final OnPermissionDeniedListener deniedListener) {
- request(grantedListener, deniedListener, PermissionConstants.PHONE);
- }
-
- public static void requestSms(final OnPermissionGrantedListener listener) {
- request(listener, PermissionConstants.SMS);
- }
-
- public static void requestLocation(final OnPermissionGrantedListener listener) {
- request(listener, PermissionConstants.LOCATION);
- }
-
- private static void request(final OnPermissionGrantedListener grantedListener,
- final @PermissionConstants.Permission String... permissions) {
- request(grantedListener, null, permissions);
- }
-
- private static void request(final OnPermissionGrantedListener grantedListener,
- final OnPermissionDeniedListener deniedListener,
- final @PermissionConstants.Permission String... permissions) {
- PermissionUtils.permission(permissions)
- .rationale(new PermissionUtils.OnRationaleListener() {
- @Override
- public void rationale(ShouldRequest shouldRequest) {
- DialogHelper.showRationaleDialog(shouldRequest);
- }
- })
- .callback(new PermissionUtils.FullCallback() {
- @Override
- public void onGranted(List permissionsGranted) {
- if (grantedListener != null) {
- grantedListener.onPermissionGranted();
- }
- LogUtils.d(permissionsGranted);
- }
-
- @Override
- public void onDenied(List permissionsDeniedForever, List permissionsDenied) {
- if (!permissionsDeniedForever.isEmpty()) {
- DialogHelper.showOpenAppSettingDialog();
- }
- if (deniedListener != null) {
- deniedListener.onPermissionDenied();
- }
- LogUtils.d(permissionsDeniedForever, permissionsDenied);
- }
- })
- .request();
- }
-
- public interface OnPermissionGrantedListener {
- void onPermissionGranted();
- }
-
- public interface OnPermissionDeniedListener {
- void onPermissionDenied();
- }
-}
diff --git a/app/src/main/res/drawable/bg_header.jpeg b/app/src/main/res/drawable/bg_header.jpeg
deleted file mode 100644
index 875fc58c21..0000000000
Binary files a/app/src/main/res/drawable/bg_header.jpeg and /dev/null differ
diff --git a/app/src/main/res/drawable/blue.png b/app/src/main/res/drawable/blue.png
deleted file mode 100644
index 64b89fb1e2..0000000000
Binary files a/app/src/main/res/drawable/blue.png and /dev/null differ
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
deleted file mode 100644
index 55478c0d0c..0000000000
--- a/app/src/main/res/layout/activity_main.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/menu/main_drawer.xml b/app/src/main/res/menu/main_drawer.xml
deleted file mode 100644
index 9d3908bf95..0000000000
--- a/app/src/main/res/menu/main_drawer.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/main/res/menu/navigation_fragment.xml b/app/src/main/res/menu/navigation_fragment.xml
deleted file mode 100644
index b9d9d834a7..0000000000
--- a/app/src/main/res/menu/navigation_fragment.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/menu/navigation_status_bar.xml b/app/src/main/res/menu/navigation_status_bar.xml
deleted file mode 100644
index 876fc0ae00..0000000000
--- a/app/src/main/res/menu/navigation_status_bar.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-v26/styles.xml b/app/src/main/res/values-v26/styles.xml
deleted file mode 100644
index 92c11a8346..0000000000
--- a/app/src/main/res/values-v26/styles.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values-v27/styles.xml b/app/src/main/res/values-v27/styles.xml
deleted file mode 100644
index f5291b5ea5..0000000000
--- a/app/src/main/res/values-v27/styles.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
deleted file mode 100644
index 6000e63d42..0000000000
--- a/app/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
- #34A48E
- #8034A48E
- #245C50
- #FF73A3
- #80245C50
-
- #FFFFFF
- #191919
-
- #bf0c43
- #f9ba15
- #8eac00
- #127a97
- #452b72
-
-
- - @color/rainbow_red
- - @color/rainbow_yellow
- - @color/rainbow_green
- - @color/rainbow_blue
- - @color/rainbow_purple
-
-
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
deleted file mode 100644
index f5291b5ea5..0000000000
--- a/app/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/anim/fade_in_1000.xml b/app/src/main/res_core/anim/fade_in_1000.xml
deleted file mode 100644
index 030275d5b9..0000000000
--- a/app/src/main/res_core/anim/fade_in_1000.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/anim/fade_out_1000.xml b/app/src/main/res_core/anim/fade_out_1000.xml
deleted file mode 100644
index 0614000d4c..0000000000
--- a/app/src/main/res_core/anim/fade_out_1000.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/drawable/bg_bar.png b/app/src/main/res_core/drawable/bg_bar.png
deleted file mode 100644
index ab8065f49a..0000000000
Binary files a/app/src/main/res_core/drawable/bg_bar.png and /dev/null differ
diff --git a/app/src/main/res_core/drawable/img_lena.png b/app/src/main/res_core/drawable/img_lena.png
deleted file mode 100644
index fa49ea640b..0000000000
Binary files a/app/src/main/res_core/drawable/img_lena.png and /dev/null differ
diff --git a/app/src/main/res_core/layout-land/activity_screen_adapt.xml b/app/src/main/res_core/layout-land/activity_screen_adapt.xml
deleted file mode 100644
index 5e54ddad31..0000000000
--- a/app/src/main/res_core/layout-land/activity_screen_adapt.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/layout-port/activity_screen_adapt.xml b/app/src/main/res_core/layout-port/activity_screen_adapt.xml
deleted file mode 100644
index a4e9f70e11..0000000000
--- a/app/src/main/res_core/layout-port/activity_screen_adapt.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/activity_activity.xml b/app/src/main/res_core/layout/activity_activity.xml
deleted file mode 100644
index 806d9d8125..0000000000
--- a/app/src/main/res_core/layout/activity_activity.xml
+++ /dev/null
@@ -1,219 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_app.xml b/app/src/main/res_core/layout/activity_app.xml
deleted file mode 100644
index 34565cad80..0000000000
--- a/app/src/main/res_core/layout/activity_app.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_bar.xml b/app/src/main/res_core/layout/activity_bar.xml
deleted file mode 100644
index b8ff446b81..0000000000
--- a/app/src/main/res_core/layout/activity_bar.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_bar_nav.xml b/app/src/main/res_core/layout/activity_bar_nav.xml
deleted file mode 100644
index 693a5cd22f..0000000000
--- a/app/src/main/res_core/layout/activity_bar_nav.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_bar_status.xml b/app/src/main/res_core/layout/activity_bar_status.xml
deleted file mode 100644
index ffe0cd467a..0000000000
--- a/app/src/main/res_core/layout/activity_bar_status.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_bar_status_alpha.xml b/app/src/main/res_core/layout/activity_bar_status_alpha.xml
deleted file mode 100644
index c669d0c69b..0000000000
--- a/app/src/main/res_core/layout/activity_bar_status_alpha.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_bar_status_color.xml b/app/src/main/res_core/layout/activity_bar_status_color.xml
deleted file mode 100644
index 16157979ce..0000000000
--- a/app/src/main/res_core/layout/activity_bar_status_color.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_bar_status_drawer.xml b/app/src/main/res_core/layout/activity_bar_status_drawer.xml
deleted file mode 100644
index acd82ba420..0000000000
--- a/app/src/main/res_core/layout/activity_bar_status_drawer.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/activity_bar_status_image_view.xml b/app/src/main/res_core/layout/activity_bar_status_image_view.xml
deleted file mode 100644
index da7b47825d..0000000000
--- a/app/src/main/res_core/layout/activity_bar_status_image_view.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/activity_bar_status_swipe_back.xml b/app/src/main/res_core/layout/activity_bar_status_swipe_back.xml
deleted file mode 100644
index e6bf6197ff..0000000000
--- a/app/src/main/res_core/layout/activity_bar_status_swipe_back.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/activity_clean.xml b/app/src/main/res_core/layout/activity_clean.xml
deleted file mode 100644
index adcea0eb17..0000000000
--- a/app/src/main/res_core/layout/activity_clean.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/activity_device.xml b/app/src/main/res_core/layout/activity_device.xml
deleted file mode 100644
index 0cd4056dcf..0000000000
--- a/app/src/main/res_core/layout/activity_device.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_flashlight.xml b/app/src/main/res_core/layout/activity_flashlight.xml
deleted file mode 100644
index d2508c7e3a..0000000000
--- a/app/src/main/res_core/layout/activity_flashlight.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_image.xml b/app/src/main/res_core/layout/activity_image.xml
deleted file mode 100644
index f708eb5bb6..0000000000
--- a/app/src/main/res_core/layout/activity_image.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/activity_log.xml b/app/src/main/res_core/layout/activity_log.xml
deleted file mode 100644
index fc56b5e7c0..0000000000
--- a/app/src/main/res_core/layout/activity_log.xml
+++ /dev/null
@@ -1,184 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/activity_network.xml b/app/src/main/res_core/layout/activity_network.xml
deleted file mode 100644
index 463205cc2f..0000000000
--- a/app/src/main/res_core/layout/activity_network.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/activity_path.xml b/app/src/main/res_core/layout/activity_path.xml
deleted file mode 100644
index a691536786..0000000000
--- a/app/src/main/res_core/layout/activity_path.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/activity_permission.xml b/app/src/main/res_core/layout/activity_permission.xml
deleted file mode 100644
index 11090040e8..0000000000
--- a/app/src/main/res_core/layout/activity_permission.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_phone.xml b/app/src/main/res_core/layout/activity_phone.xml
deleted file mode 100644
index abb8234c06..0000000000
--- a/app/src/main/res_core/layout/activity_phone.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_process.xml b/app/src/main/res_core/layout/activity_process.xml
deleted file mode 100644
index 3e8eee335d..0000000000
--- a/app/src/main/res_core/layout/activity_process.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/activity_reflect.xml b/app/src/main/res_core/layout/activity_reflect.xml
deleted file mode 100644
index f4313589eb..0000000000
--- a/app/src/main/res_core/layout/activity_reflect.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_resource.xml b/app/src/main/res_core/layout/activity_resource.xml
deleted file mode 100644
index 969a73843b..0000000000
--- a/app/src/main/res_core/layout/activity_resource.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_screen.xml b/app/src/main/res_core/layout/activity_screen.xml
deleted file mode 100644
index 1c6f0ca042..0000000000
--- a/app/src/main/res_core/layout/activity_screen.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/activity_sdcard.xml b/app/src/main/res_core/layout/activity_sdcard.xml
deleted file mode 100644
index 106f4a3e4e..0000000000
--- a/app/src/main/res_core/layout/activity_sdcard.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_snackbar.xml b/app/src/main/res_core/layout/activity_snackbar.xml
deleted file mode 100644
index e2c0e24420..0000000000
--- a/app/src/main/res_core/layout/activity_snackbar.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_sp.xml b/app/src/main/res_core/layout/activity_sp.xml
deleted file mode 100644
index 2f29c5d838..0000000000
--- a/app/src/main/res_core/layout/activity_sp.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_toast.xml b/app/src/main/res_core/layout/activity_toast.xml
deleted file mode 100644
index e1c413744a..0000000000
--- a/app/src/main/res_core/layout/activity_toast.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/activity_util_core.xml b/app/src/main/res_core/layout/activity_util_core.xml
deleted file mode 100644
index d73160d307..0000000000
--- a/app/src/main/res_core/layout/activity_util_core.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/dialog_keyboard.xml b/app/src/main/res_core/layout/dialog_keyboard.xml
deleted file mode 100644
index 684a1dcc01..0000000000
--- a/app/src/main/res_core/layout/dialog_keyboard.xml
+++ /dev/null
@@ -1,133 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/fragment_bar_status_alpha.xml b/app/src/main/res_core/layout/fragment_bar_status_alpha.xml
deleted file mode 100644
index d1dc4f2003..0000000000
--- a/app/src/main/res_core/layout/fragment_bar_status_alpha.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/fragment_bar_status_color.xml b/app/src/main/res_core/layout/fragment_bar_status_color.xml
deleted file mode 100644
index 4e9080d5be..0000000000
--- a/app/src/main/res_core/layout/fragment_bar_status_color.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_core/layout/fragment_bar_status_image_view.xml b/app/src/main/res_core/layout/fragment_bar_status_image_view.xml
deleted file mode 100644
index 8e0320c106..0000000000
--- a/app/src/main/res_core/layout/fragment_bar_status_image_view.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/fragment_child.xml b/app/src/main/res_core/layout/fragment_child.xml
deleted file mode 100644
index 887a143c76..0000000000
--- a/app/src/main/res_core/layout/fragment_child.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/fragment_root.xml b/app/src/main/res_core/layout/fragment_root.xml
deleted file mode 100644
index 00b8bf5c01..0000000000
--- a/app/src/main/res_core/layout/fragment_root.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/item_image.xml b/app/src/main/res_core/layout/item_image.xml
deleted file mode 100644
index 100d32cf0f..0000000000
--- a/app/src/main/res_core/layout/item_image.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_sub/layout/activity_brightness.xml b/app/src/main/res_sub/layout/activity_brightness.xml
deleted file mode 100644
index dbc7a934ce..0000000000
--- a/app/src/main/res_sub/layout/activity_brightness.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_sub/layout/activity_location.xml b/app/src/main/res_sub/layout/activity_location.xml
deleted file mode 100755
index 46cdb8d2c4..0000000000
--- a/app/src/main/res_sub/layout/activity_location.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/main/res_sub/layout/activity_meta_data.xml b/app/src/main/res_sub/layout/activity_meta_data.xml
deleted file mode 100755
index 058b2d8a4f..0000000000
--- a/app/src/main/res_sub/layout/activity_meta_data.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_sub/layout/activity_pinyin.xml b/app/src/main/res_sub/layout/activity_pinyin.xml
deleted file mode 100755
index 1c85ce928c..0000000000
--- a/app/src/main/res_sub/layout/activity_pinyin.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res_sub/layout/activity_util_sub.xml b/app/src/main/res_sub/layout/activity_util_sub.xml
deleted file mode 100644
index 1316d6bfcf..0000000000
--- a/app/src/main/res_sub/layout/activity_util_sub.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res_sub/values/strings.xml b/app/src/main/res_sub/values/strings.xml
deleted file mode 100644
index 69bfb7c30a..0000000000
--- a/app/src/main/res_sub/values/strings.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- FlashlightUtils Demo
- Brightness Demo
- LocationUtils Demo
- PinyinUtils Demo
-
-
- Set Auto Brightness Enable
- Set Auto Brightness Disable
-
-
- Set Flashlight On
- Set Flashlight Off
-
-
-
diff --git a/art/auc_frame.png b/art/auc_frame.png
new file mode 100644
index 0000000000..68c92d37b1
Binary files /dev/null and b/art/auc_frame.png differ
diff --git a/art/auc_frame_cn.png b/art/auc_frame_cn.png
new file mode 100644
index 0000000000..2382c03197
Binary files /dev/null and b/art/auc_frame_cn.png differ
diff --git a/art/busutil_vs_eventbus.png b/art/busutil_vs_eventbus.png
new file mode 100644
index 0000000000..1a2272b808
Binary files /dev/null and b/art/busutil_vs_eventbus.png differ
diff --git a/art/communication.png b/art/communication.png
new file mode 100644
index 0000000000..f3d68d0b10
Binary files /dev/null and b/art/communication.png differ
diff --git a/bintrayUpload.gradle b/bintrayUpload.gradle
deleted file mode 100644
index 0db00c1240..0000000000
--- a/bintrayUpload.gradle
+++ /dev/null
@@ -1,117 +0,0 @@
-
-apply plugin: 'com.github.dcendents.android-maven'
-apply plugin: 'com.jfrog.bintray'
-
-// load properties
-Properties properties = new Properties()
-File localPropertiesFile = project.file("local.properties");
-if(localPropertiesFile.exists()){
- properties.load(localPropertiesFile.newDataInputStream())
-}
-File projectPropertiesFile = project.file("project.properties");
-if(projectPropertiesFile.exists()){
- properties.load(projectPropertiesFile.newDataInputStream())
-}
-
-// read properties
-def projectName = properties.getProperty("project.name")
-def projectGroupId = properties.getProperty("project.groupId")
-def projectArtifactId = properties.getProperty("project.artifactId")
-def projectVersionName = android.defaultConfig.versionName
-def projectPackaging = properties.getProperty("project.packaging")
-def projectSiteUrl = properties.getProperty("project.siteUrl")
-def projectGitUrl = properties.getProperty("project.gitUrl")
-
-def developerId = properties.getProperty("developer.id")
-def developerName = properties.getProperty("developer.name")
-def developerEmail = properties.getProperty("developer.email")
-
-def bintrayUser = properties.getProperty("bintray.user")
-def bintrayApikey = properties.getProperty("bintray.apikey")
-
-def javadocName = properties.getProperty("javadoc.name")
-
-group = projectGroupId
-
-// This generates POM.xml with proper parameters
-install {
- repositories.mavenInstaller {
- pom {
- project {
- name projectName
- groupId projectGroupId
- artifactId projectArtifactId
- version projectVersionName
- packaging projectPackaging
- url projectSiteUrl
- licenses {
- license {
- name 'The Apache Software License, Version 2.0'
- url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
- }
- }
- developers {
- developer {
- id developerId
- name developerName
- email developerEmail
- }
- }
- scm {
- connection projectGitUrl
- developerConnection projectGitUrl
- url projectSiteUrl
- }
- }
- }
- }
-}
-
-// This generates sources.jar
-task sourcesJar(type: Jar) {
- from android.sourceSets.main.java.srcDirs
- classifier = 'sources'
-}
-
-task javadoc(type: Javadoc) {
- source = android.sourceSets.main.java.srcDirs
- classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
-}
-
-// This generates javadoc.jar
-task javadocJar(type: Jar, dependsOn: javadoc) {
- classifier = 'javadoc'
- from javadoc.destinationDir
-}
-
-artifacts {
- archives javadocJar
- archives sourcesJar
-}
-
-// javadoc configuration
-javadoc {
- options{
- encoding "UTF-8"
- charSet 'UTF-8'
- author true
- version projectVersionName
- links "http://docs.oracle.com/javase/7/docs/api"
- title javadocName
- }
-}
-
-// bintray configuration
-bintray {
- user = bintrayUser
- key = bintrayApikey
- configurations = ['archives']
- pkg {
- repo = "maven"
- name = projectName
- websiteUrl = projectSiteUrl
- vcsUrl = projectGitUrl
- licenses = ["Apache-2.0"]
- publish = true
- }
-}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 2965e8c2bc..e0f0f36c87 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,20 +1,26 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
- apply from: 'config.gradle'
+ ConfigUtils.init(gradle)
repositories {
+ mavenLocal()
google()
+ mavenCentral()
jcenter()
}
dependencies {
- classpath depConfig.gradle
-// classpath depConfig.kotlin_gradle_plugin
+ for (def entrySet : ConfigUtils.getApplyPlugins().entrySet()) {
+ classpath entrySet.value.path
+ }
}
}
allprojects {
repositories {
+ mavenLocal()
+ maven { url "https://jitpack.io" }
google()
+ mavenCentral()
jcenter()
}
@@ -22,9 +28,9 @@ allprojects {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
resolutionStrategy.eachDependency {
- if (it.requested.group == 'com.android.support'
- && !it.requested.name.contains('multidex')) {
- it.useVersion versionConfig.support
+ if (it.requested.group == 'com.android.support' && !it.requested.name.contains(
+ 'multidex')) {
+ it.useVersion Config.supportVersion
}
}
}
diff --git a/buildApp.gradle b/buildApp.gradle
new file mode 100644
index 0000000000..93f0b9b1d4
--- /dev/null
+++ b/buildApp.gradle
@@ -0,0 +1,131 @@
+apply plugin: "com.android.application"
+
+apply {
+ from "${rootDir.path}/buildCommon.gradle"
+ from "${rootDir.path}/config/flavor.gradle"
+ if (Config.plugins.plugin_api.isApply) {
+ plugin Config.plugins.plugin_api.id
+ }
+ if (Config.plugins.plugin_bus.isApply) {
+ plugin Config.plugins.plugin_bus.id
+ }
+}
+
+configSigning()
+configApkName()
+
+//if (PluginConfig.plugin_bus.isApply) {
+// bus {
+// onlyScanLibRegex = '^([:]|(com\\.blankj)).+$'
+// }
+//}
+//
+//if (PluginConfig.plugin_api.isApply) {
+// api {
+// onlyScanLibRegex = '^([:]|(com\\.blankj)).+$'
+// }
+//}
+
+android {
+ defaultConfig {
+ applicationId Config.applicationId + suffix
+ targetSdkVersion Config.targetSdkVersion
+ multiDexEnabled true
+ }
+
+ buildTypes {
+ debug {}
+
+ release {
+ minifyEnabled true
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ packagingOptions {
+ exclude 'META-INF/*'
+ }
+
+ dexOptions {
+ preDexLibraries true
+ javaMaxHeapSize "8g"
+ maxProcessCount 8
+ dexInProcess = true
+ }
+
+ productFlavors {
+ dev {
+ applicationIdSuffix ".dev"
+ versionNameSuffix "-dev"
+ resValue "string", "app_name", Config.appName + suffix + "-dev"
+ }
+
+ production {
+ resValue "string", "app_name", Config.appName + suffix
+ }
+ }
+}
+
+dependencies {
+ // LeakCanary
+ debugImplementation Config.libs.leakcanary.path
+
+ debugImplementation Config.modules.lib_utildebug.dep
+ releaseImplementation Config.modules.lib_utildebug_no_op.dep
+
+ // 根据 Config.pkgConfig 来依赖所有 pkg
+ for (def entrySet : ConfigUtils.getApplyPkgs().entrySet()) {
+ api entrySet.value.dep
+ }
+
+ if (Config.modules.feature_mock.isApply) {
+ api ModuleConfig.modules.feature_mock.dep
+ }
+}
+
+def getSuffix() {
+ if (project.name == "feature_launcher_app") return ""
+ return "." + project.
+ name.
+ substring("feature_".length(), project.name.length() - "_app".length())
+}
+
+def configSigning() {
+
+ File signPropertiesFile = file("${rootDir.path}/sign/keystore.properties")
+ if (!signPropertiesFile.exists()) return
+
+ GLog.d("${project.toString()} sign start...")
+ project.android {
+ Properties properties = new Properties()
+ properties.load(new FileInputStream(signPropertiesFile))
+ signingConfigs {
+ release {
+ storeFile new File(signPropertiesFile.getParent(), properties['keystore'])
+ storePassword properties['storePassword']
+ keyAlias properties['keyAlias']
+ keyPassword properties['keyPassword']
+ }
+ }
+ buildTypes.release.signingConfig signingConfigs.release
+ }
+ GLog.d("${project.toString()} sign end...")
+}
+
+def configApkName() {
+ project.android.applicationVariants.all { variant ->
+ if (variant.buildType.name != "debug") {
+ def artifact = variant.getPackageApplicationProvider().get()
+ artifact.outputDirectory = new File("${rootDir.path}/apk")
+ variant.outputs.each {
+ it.outputFileName = "util" + suffix +
+ (variant.flavorName == "" ? "" : ("_" + variant.flavorName)) +
+ "_" +
+ variant.versionName.replace(".", "_") +
+ "_" +
+ variant.buildType.name +
+ ".apk"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/buildCommon.gradle b/buildCommon.gradle
new file mode 100644
index 0000000000..2cba3ffea2
--- /dev/null
+++ b/buildCommon.gradle
@@ -0,0 +1,30 @@
+apply {
+ plugin "kotlin-android"
+ plugin "kotlin-android-extensions"
+}
+
+android {
+ compileSdkVersion Config.compileSdkVersion
+ defaultConfig {
+ minSdkVersion Config.minSdkVersion
+ versionCode Config.versionCode
+ versionName Config.versionName
+ consumerProguardFiles 'proguard-rules.pro'
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled true
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ lintOptions {
+ abortOnError false
+ }
+}
\ No newline at end of file
diff --git a/buildLib.gradle b/buildLib.gradle
new file mode 100644
index 0000000000..aed207cbee
--- /dev/null
+++ b/buildLib.gradle
@@ -0,0 +1,13 @@
+apply plugin: "com.android.library"
+apply from: "${rootDir.path}/buildCommon.gradle"
+
+dependencies {
+ if (project.name.endsWith("_pkg") || project.name.endsWith("_mock")) {
+ // if module's name equals 'pkg', api all of export
+ for (def entrySet : ConfigUtils.getApplyExports().entrySet()) {
+ api entrySet.value.dep
+ }
+ } else if (project.name.endsWith("_export")) {
+ api Config.modules.lib_common.dep
+ }
+}
\ No newline at end of file
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
index 129a80f1d3..349aed4fec 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -1,6 +1,37 @@
-apply plugin: 'groovy'
+repositories {
+ google()
+ jcenter()
+}
+
+apply {
+ plugin 'groovy'
+ plugin 'java-gradle-plugin'
+}
+
+gradlePlugin {
+ plugins {
+ readmeCore {
+ id = 'readme-core'
+ implementationClass = 'com.blankj.plugin.readme.ReadmeCorePlugin'
+ }
+
+ readmeSub {
+ id = 'readme-sub'
+ implementationClass = 'com.blankj.plugin.readme.ReadmeSubPlugin'
+ }
+ }
+}
dependencies {
- compile gradleApi()
- compile localGroovy()
+ implementation gradleApi()
+ implementation localGroovy()
+ implementation "commons-io:commons-io:2.6"
}
+
+sourceSets {
+ main {
+ groovy {
+ srcDirs += 'src/main/java'
+ }
+ }
+}
\ No newline at end of file
diff --git a/buildSrc/settings.gradle b/buildSrc/settings.gradle
new file mode 100644
index 0000000000..8a313c3b99
--- /dev/null
+++ b/buildSrc/settings.gradle
@@ -0,0 +1,8 @@
+//dependencyResolutionManagement {
+// repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+// repositories {
+// google()
+// mavenCentral()
+// jcenter() // Warning: this repository is going to shut down soon
+// }
+//}
\ No newline at end of file
diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy
new file mode 100644
index 0000000000..9a8d69d659
--- /dev/null
+++ b/buildSrc/src/main/groovy/Config.groovy
@@ -0,0 +1,89 @@
+class Config {
+
+ static applicationId = 'com.blankj.androidutilcode'
+ static appName = 'Util'
+
+ static compileSdkVersion = 29
+ static minSdkVersion = 14
+ static targetSdkVersion = 29
+ static versionCode = 1_031_001
+ static versionName = '1.31.1'// E.g. 1.9.72 => 1,009,072
+
+ // lib version
+ static gradlePluginVersion = '4.1.0'
+ static kotlinVersion = '1.3.72'
+ static androidxVersion = '1.0.0'
+
+ static modules = [
+ /*Don't delete this line*/
+ /*Generated by "module_config.json"*/
+ plugin_api_gradle_plugin : new ModuleConfig(isApply: true , useLocal: true , localPath: "./plugin/api-gradle-plugin"),
+ plugin_bus_gradle_plugin : new ModuleConfig(isApply: true , useLocal: true , localPath: "./plugin/bus-gradle-plugin"),
+ plugin_lib_base_transform : new ModuleConfig(isApply: true , useLocal: true , localPath: "./plugin/lib/base-transform", remotePath: "com.blankj:base-transform:1.0"),
+ plugin_buildSrc_plugin : new ModuleConfig(isApply: true , useLocal: true , localPath: "./plugin/buildSrc-plugin"),
+ feature_mock : new ModuleConfig(isApply: false, useLocal: true , localPath: "./feature/mock"),
+ feature_launcher_app : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/launcher/app"),
+ feature_main_app : new ModuleConfig(isApply: false, useLocal: true , localPath: "./feature/main/app"),
+ feature_main_pkg : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/main/pkg"),
+ feature_subutil_app : new ModuleConfig(isApply: false, useLocal: true , localPath: "./feature/subutil/app"),
+ feature_subutil_pkg : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/subutil/pkg"),
+ feature_subutil_export : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/subutil/export"),
+ feature_utilcode_app : new ModuleConfig(isApply: false, useLocal: true , localPath: "./feature/utilcode/app"),
+ feature_utilcode_pkg : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/utilcode/pkg"),
+ feature_utilcode_export : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/utilcode/export", remotePath: "com.blankj:utilcode-export:1.1"),
+ lib_base : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/base"),
+ lib_common : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/common"),
+ lib_subutil : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/subutil"),
+ lib_utilcode : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/utilcode", remotePath: "com.blankj:utilcodex:$Config.versionName"),
+ lib_utildebug : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/utildebug"),
+ lib_utildebug_no_op : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/utildebug-no-op"),
+ /*Don't delete this line*/
+ ]
+
+ static plugins = [
+ plugin_gradle : new PluginConfig(path: "com.android.tools.build:gradle:$gradlePluginVersion"),
+ plugin_kotlin : new PluginConfig(path: "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"),
+ // 上传到 maven
+ plugin_maven : new PluginConfig(path: "com.github.dcendents:android-maven-gradle-plugin:2.1", id: "com.github.dcendents.android-maven"),
+
+ // 上传新版本插件更新 path 中的版本号,并设置 isApply = false
+ // 通过 mavenLocal 上传本地版本,设置 isApply = true 即可应用插件来调试,最后通过 bintrayUpload 来发布插件
+ plugin_api : new PluginConfig(isApply: true, useLocal: false, path: "com.blankj:api-gradle-plugin:1.5", id: "com.blankj.api"),
+ //./gradlew clean :plugin_api-gradle-plugin:mavenLocal // 上传到本地 mavenLocal
+ //./gradlew clean :plugin_api-gradle-plugin:bintrayUpload // 上传到 jcenter
+ plugin_bus : new PluginConfig(isApply: true, useLocal: false, path: "com.blankj:bus-gradle-plugin:2.6", id: "com.blankj.bus"),
+ //./gradlew clean :plugin_bus-gradle-plugin:mavenLocal // 上传到本地 mavenLocal
+ //./gradlew clean :plugin_bus-gradle-plugin:bintrayUpload // 上传到 jcenter
+ plugin_buildSrc: new PluginConfig(isApply: false, useLocal: false, path: "com.blankj:buildSrc-plugin:1.0", id: "com.blankj.buildSrc"),
+ //./gradlew clean :plugin_bus-gradle-plugin:mavenLocal // 上传到本地 mavenLocal
+ //./gradlew clean :plugin_bus-gradle-plugin:bintrayUpload // 上传到 jcenter
+ ]
+
+ static libs = [
+ androidx_appcompat : new LibConfig(path: "androidx.appcompat:appcompat:$androidxVersion"),
+ androidx_material : new LibConfig(path: "com.google.android.material:material:$androidxVersion"),
+ androidx_multidex : new LibConfig(path: "androidx.multidex:multidex:2.0.0"),
+ androidx_constraint: new LibConfig(path: "androidx.constraintlayout:constraintlayout:1.1.3"),
+
+ kotlin : new LibConfig(path: "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"),
+
+ leakcanary : new LibConfig(path: "com.squareup.leakcanary:leakcanary-android:2.1"),
+
+ free_proguard : new LibConfig(path: "com.blankj:free-proguard:1.0.2"),
+ swipe_panel : new LibConfig(path: "com.blankj:swipe-panel:1.2"),
+
+ gson : new LibConfig(path: "com.google.code.gson:gson:2.8.5"),
+ glide : new LibConfig(path: "com.github.bumptech.glide:glide:4.7.1"),
+ retrofit : new LibConfig(path: "com.squareup.retrofit2:retrofit:2.4.0"),
+ commons_io : new LibConfig(path: "commons-io:commons-io:2.6"),
+
+ eventbus_lib : new LibConfig(path: "org.greenrobot:eventbus:3.1.1"),
+ eventbus_processor : new LibConfig(path: "org.greenrobot:eventbus-annotation-processor:3.0.1"),
+
+ photo_view : new LibConfig(path: "com.github.chrisbanes:PhotoView:2.0.0"),
+
+ test_junit : new LibConfig(path: "junit:junit:4.12"),
+ test_robolectric : new LibConfig(path: "org.robolectric:robolectric:4.3.1"),
+ ]
+}
+//./gradlew clean :lib_utilcode:bintrayUpload
\ No newline at end of file
diff --git a/buildSrc/src/main/groovy/ConfigUtils.groovy b/buildSrc/src/main/groovy/ConfigUtils.groovy
new file mode 100644
index 0000000000..6a09d2f2d9
--- /dev/null
+++ b/buildSrc/src/main/groovy/ConfigUtils.groovy
@@ -0,0 +1,99 @@
+import org.gradle.api.Project
+import org.gradle.api.ProjectEvaluationListener
+import org.gradle.api.ProjectState
+import org.gradle.api.invocation.Gradle
+
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2019/07/13
+ * desc :
+ *
+ */
+class ConfigUtils {
+
+ static init(Gradle gradle) {
+ generateDep(gradle)
+ addCommonGradle(gradle)
+ TaskDurationUtils.init(gradle)
+ }
+
+ /**
+ * 根据 depConfig 生成 dep
+ */
+ private static void generateDep(Gradle gradle) {
+ def configs = [:]
+ for (Map.Entry entry : Config.modules.entrySet()) {
+ def (name, config) = [entry.key, entry.value]
+ if (config.useLocal) {
+ config.dep = gradle.rootProject.findProject(name)
+ } else {
+ config.dep = config.remotePath
+ }
+ configs.put(name, config)
+ }
+ GLog.l("generateDep = ${GLog.object2String(configs)}")
+ }
+
+ private static addCommonGradle(Gradle gradle) {
+ gradle.addProjectEvaluationListener(new ProjectEvaluationListener() {
+ @Override
+ void beforeEvaluate(Project project) {
+ // 在 project 的 build.gradle 前 do sth.
+ if (project.name.contains("plugin")) {
+ return
+ }
+ if (project.name.endsWith("_app")) {
+ GLog.l(project.toString() + " applies buildApp.gradle")
+ project.apply {
+ from "${project.rootDir.path}/buildApp.gradle"
+ }
+ } else {
+ GLog.l(project.toString() + " applies buildLib.gradle")
+ project.apply {
+ from "${project.rootDir.path}/buildLib.gradle"
+ }
+ }
+ }
+
+ @Override
+ void afterEvaluate(Project project, ProjectState state) {
+ // 在 project 的 build.gradle 末 do sth.
+ }
+ })
+ }
+
+ static getApplyPlugins() {
+ def plugins = [:]
+ for (Map.Entry entry : Config.plugins.entrySet()) {
+ if (entry.value.isApply) {
+ plugins.put(entry.key, entry.value)
+ }
+ }
+ GLog.d("getApplyPlugins = ${GLog.object2String(plugins)}")
+ return plugins
+ }
+
+ static getApplyPkgs() {
+ def pkgs = [:]
+ for (Map.Entry entry : Config.modules.entrySet()) {
+ if (entry.value.isApply && entry.key.endsWith("_pkg")) {
+ pkgs.put(entry.key, entry.value)
+ }
+ }
+ GLog.d("getApplyPkgs = ${GLog.object2String(pkgs)}")
+ return pkgs
+ }
+
+ static getApplyExports() {
+ def exports = [:]
+ for (Map.Entry entry : Config.modules.entrySet()) {
+ if (entry.value.isApply && entry.key.endsWith("_export")) {
+ exports.put(entry.key, entry.value)
+ }
+ }
+ GLog.d("getApplyExports = ${GLog.object2String(exports)}")
+ return exports
+ }
+}
diff --git a/buildSrc/src/main/groovy/GLog.groovy b/buildSrc/src/main/groovy/GLog.groovy
new file mode 100644
index 0000000000..6a5554fc46
--- /dev/null
+++ b/buildSrc/src/main/groovy/GLog.groovy
@@ -0,0 +1,208 @@
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2019/07/13
+ * desc :
+ *
+ */
+class GLog {
+
+ def static debugSwitch = true
+
+ static d(Object... contents) {
+ if (!debugSwitch) return contents
+ return l(contents)
+ }
+
+ static l(Object... contents) {
+ StringBuilder sb = new StringBuilder()
+ sb.append(LogConst.BORDER_TOP)
+ sb.append(borderMsg(processContents(contents)))
+ sb.append(LogConst.BORDER_BTM)
+ print sb.toString()
+ return contents
+ }
+
+ private static borderMsg(String msg) {
+ StringBuilder sb = new StringBuilder()
+ object2String(msg).split(LogConst.LINE_SEP).each { line ->
+ sb.append(LogConst.BORDER_LFT).append(line).append(LogConst.LINE_SEP)
+ }
+ return sb
+ }
+
+ private static processContents(final Object... contents) {
+ String body = LogConst.NULL
+ if (contents != null) {
+ if (contents.length == 1) {
+ body = object2String(contents[0])
+ } else {
+ StringBuilder sb = new StringBuilder()
+ int i = 0
+ for (int len = contents.length; i < len; ++i) {
+ Object content = contents[i]
+ sb.append("args[$i] = ")
+ .append(object2String(content))
+ .append(LogConst.LINE_SEP)
+ }
+ body = sb.toString()
+ }
+ }
+ return body.length() == 0 ? LogConst.NOTHING : body
+ }
+
+ static String object2String(Object object) {
+ if (object == null) return "null";
+ if (object.getClass().isArray()) return LogFormatter.array2String(object);
+ if (object instanceof List) return LogFormatter.list2String(object);
+ if (object instanceof Map) return LogFormatter.map2String(object);
+ if (object instanceof Throwable) return LogFormatter.throwable2String(object);
+ return object.toString();
+ }
+
+ static class LogFormatter {
+
+ private static array2String(Object object) {
+ if (object instanceof Object[]) {
+ return Arrays.deepToString((Object[]) object);
+ } else if (object instanceof boolean[]) {
+ return Arrays.toString((boolean[]) object);
+ } else if (object instanceof byte[]) {
+ return Arrays.toString((byte[]) object);
+ } else if (object instanceof char[]) {
+ return Arrays.toString((char[]) object);
+ } else if (object instanceof double[]) {
+ return Arrays.toString((double[]) object);
+ } else if (object instanceof float[]) {
+ return Arrays.toString((float[]) object);
+ } else if (object instanceof int[]) {
+ return Arrays.toString((int[]) object);
+ } else if (object instanceof long[]) {
+ return Arrays.toString((long[]) object);
+ } else if (object instanceof short[]) {
+ return Arrays.toString((short[]) object);
+ }
+ throw new IllegalArgumentException("Array has incompatible type: " + object.getClass());
+ }
+
+ private static list2String(List list) {
+ StringBuilder sb = new StringBuilder()
+ sb.append("[")
+ list.each { v ->
+ if (v instanceof Map || v instanceof List) {
+ sb.append(String.format("$LogConst.LINE_SEP%${deep++ * 8}s${object2String(v)},", ""))
+ deep--
+ } else {
+ sb.append(String.format("$LogConst.LINE_SEP%${deep * 8}s$v,", ""))
+ }
+ }
+ sb.deleteCharAt(sb.length() - 1)
+ if (deep - 1 == 0) {
+ sb.append("$LogConst.LINE_SEP]")
+ } else {
+ sb.append(String.format("$LogConst.LINE_SEP%${(deep - 1) * 8}s]", ""))
+ }
+ return sb.toString()
+ }
+
+ private static deep = 1;
+
+ private static map2String(Map map) {
+ StringBuilder sb = new StringBuilder()
+ sb.append("[")
+ map.each { k, v ->
+ if (v instanceof Map || v instanceof List) {
+ sb.append(String.format("$LogConst.LINE_SEP%${deep++ * 8}s%-26s: ${object2String(v)},", "", k))
+ deep--
+ } else {
+ sb.append(String.format("$LogConst.LINE_SEP%${deep * 8}s%-26s: $v,", "", k))
+ }
+ }
+ sb.deleteCharAt(sb.length() - 1)
+ if (deep - 1 == 0) {
+ sb.append("$LogConst.LINE_SEP]")
+ } else {
+ sb.append(String.format("$LogConst.LINE_SEP%${(deep - 1) * 8}s]", ""))
+ }
+ return sb.toString()
+ }
+
+ private static throwable2String(Throwable throwable) {
+ final List throwableList = new ArrayList<>();
+ while (throwable != null && !throwableList.contains(throwable)) {
+ throwableList.add(throwable);
+ throwable = throwable.getCause();
+ }
+ final int size = throwableList.size();
+ final List frames = new ArrayList<>();
+ List nextTrace = getStackFrameList(throwableList.get(size - 1));
+ for (int i = size; --i >= 0;) {
+ final List trace = nextTrace;
+ if (i != 0) {
+ nextTrace = getStackFrameList(throwableList.get(i - 1));
+ removeCommonFrames(trace, nextTrace);
+ }
+ if (i == size - 1) {
+ frames.add(throwableList.get(i).toString());
+ } else {
+ frames.add(" Caused by: " + throwableList.get(i).toString());
+ }
+ frames.addAll(trace);
+ }
+ StringBuilder sb = new StringBuilder();
+ for (final String element : frames) {
+ sb.append(element).append(LogConst.LINE_SEP);
+ }
+ return sb.toString();
+ }
+
+ private static List getStackFrameList(final Throwable throwable) {
+ final StringWriter sw = new StringWriter();
+ final PrintWriter pw = new PrintWriter(sw, true);
+ throwable.printStackTrace(pw);
+ final String stackTrace = sw.toString();
+ final StringTokenizer frames = new StringTokenizer(stackTrace, LogConst.LINE_SEP);
+ final List list = new ArrayList<>();
+ boolean traceStarted = false;
+ while (frames.hasMoreTokens()) {
+ final String token = frames.nextToken();
+ // Determine if the line starts with at
+ final int at = token.indexOf("at");
+ if (at != -1 && token.substring(0, at).trim().isEmpty()) {
+ traceStarted = true;
+ list.add(token);
+ } else if (traceStarted) {
+ break;
+ }
+ }
+ return list;
+ }
+
+ private static void removeCommonFrames(final List causeFrames, final List wrapperFrames) {
+ int causeFrameIndex = causeFrames.size() - 1;
+ int wrapperFrameIndex = wrapperFrames.size() - 1;
+ while (causeFrameIndex >= 0 && wrapperFrameIndex >= 0) {
+ // Remove the frame from the cause trace if it is the same
+ // as in the wrapper trace
+ final String causeFrame = causeFrames.get(causeFrameIndex);
+ final String wrapperFrame = wrapperFrames.get(wrapperFrameIndex);
+ if (causeFrame.equals(wrapperFrame)) {
+ causeFrames.remove(causeFrameIndex);
+ }
+ causeFrameIndex--;
+ wrapperFrameIndex--;
+ }
+ }
+ }
+
+ static class LogConst {
+ static LINE_SEP = System.getProperty("line.separator");
+ static BORDER_TOP = "┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────" + LINE_SEP
+ static BORDER_LFT = "│ ";
+ static BORDER_BTM = "└────────────────────────────────────────────────────────────────────────────────────────────────────────────────" + LINE_SEP
+
+ static final NOTHING = "log nothing";
+ static final NULL = "null";
+ }
+}
diff --git a/buildSrc/src/main/groovy/LibConfig.groovy b/buildSrc/src/main/groovy/LibConfig.groovy
new file mode 100644
index 0000000000..6369553ba0
--- /dev/null
+++ b/buildSrc/src/main/groovy/LibConfig.groovy
@@ -0,0 +1,29 @@
+class LibConfig {
+
+ String path
+
+ String getGroupId() {
+ String[] splits = path.split(":")
+ return splits.length == 3 ? splits[0] : null
+ }
+
+ String getArtifactId() {
+ String[] splits = path.split(":")
+ return splits.length == 3 ? splits[1] : null
+ }
+
+ String getVersion() {
+ String[] splits = path.split(":")
+ return splits.length == 3 ? splits[2] : null
+ }
+
+ @Override
+ String toString() {
+ return "LibConfig { path = $path }"
+ }
+
+ static String getFlag(boolean b) {
+ return b ? "✅" : "❌"
+ }
+}
+
diff --git a/buildSrc/src/main/groovy/ModuleConfig.groovy b/buildSrc/src/main/groovy/ModuleConfig.groovy
new file mode 100644
index 0000000000..291abd8ffe
--- /dev/null
+++ b/buildSrc/src/main/groovy/ModuleConfig.groovy
@@ -0,0 +1,35 @@
+class ModuleConfig {
+
+ boolean isApply // 是否应用
+ boolean useLocal // 是否使用本地的
+ String localPath // 本地路径
+ String remotePath // 远程路径
+ def dep // 根据条件生成项目最终的依赖项
+
+ String getGroupId() {
+ String[] splits = remotePath.split(":")
+ return splits.length == 3 ? splits[0] : null
+ }
+
+ String getArtifactId() {
+ String[] splits = remotePath.split(":")
+ return splits.length == 3 ? splits[1] : null
+ }
+
+ String getVersion() {
+ String[] splits = remotePath.split(":")
+ return splits.length == 3 ? splits[2] : null
+ }
+
+ @Override
+ String toString() {
+ return "ModuleConfig { isApply = ${getFlag(isApply)}" +
+ ", dep = " + dep +
+ " }"
+ }
+
+ static String getFlag(boolean b) {
+ return b ? "✅" : "❌"
+ }
+}
+
diff --git a/buildSrc/src/main/groovy/PluginConfig.groovy b/buildSrc/src/main/groovy/PluginConfig.groovy
new file mode 100644
index 0000000000..3811c6a0ca
--- /dev/null
+++ b/buildSrc/src/main/groovy/PluginConfig.groovy
@@ -0,0 +1,35 @@
+final class PluginConfig {
+
+ boolean isApply = true // 是否应用
+ boolean useLocal // 是否使用本地的
+ String path // 插件路径
+ String id // 插件 ID
+
+ String getGroupId() {
+ String[] splits = path.split(":")
+ return splits.length == 3 ? splits[0] : null
+ }
+
+ String getArtifactId() {
+ String[] splits = path.split(":")
+ return splits.length == 3 ? splits[1] : null
+ }
+
+ String getVersion() {
+ String[] splits = path.split(":")
+ return splits.length == 3 ? splits[2] : null
+ }
+
+ @Override
+ String toString() {
+ return "PluginConfig { isApply = ${getFlag(isApply)}" +
+ ", useLocal = ${getFlag(useLocal)}" +
+ ", path = " + path +
+ ", id = " + id +
+ " }"
+ }
+
+ static String getFlag(boolean b) {
+ return b ? "✅" : "❌"
+ }
+}
\ No newline at end of file
diff --git a/buildSrc/src/main/groovy/TaskDurationUtils.groovy b/buildSrc/src/main/groovy/TaskDurationUtils.groovy
new file mode 100644
index 0000000000..6aacfcf30f
--- /dev/null
+++ b/buildSrc/src/main/groovy/TaskDurationUtils.groovy
@@ -0,0 +1,91 @@
+import org.gradle.BuildListener
+import org.gradle.BuildResult
+import org.gradle.api.Task
+import org.gradle.api.execution.TaskExecutionListener
+import org.gradle.api.initialization.Settings
+import org.gradle.api.invocation.Gradle
+import org.gradle.api.tasks.TaskState
+
+import java.text.SimpleDateFormat
+
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2019/11/22
+ * desc :
+ *
+ */
+class TaskDurationUtils {
+
+ static List taskInfoList = []
+ static long startMillis
+
+ static init(Gradle grd) {
+ startMillis = System.currentTimeMillis()
+ grd.addListener(new TaskExecutionListener() {
+ @Override
+ void beforeExecute(Task task) {
+ task.ext.startTime = System.currentTimeMillis()
+ }
+
+ @Override
+ void afterExecute(Task task, TaskState state) {
+ def exeDuration = System.currentTimeMillis() - task.ext.startTime
+ if (exeDuration >= 500) {
+ taskInfoList.add(new TaskInfo(task: task, exeDuration: exeDuration))
+ }
+ }
+ })
+ grd.addBuildListener(new BuildListener() {
+ @Override
+ void beforeSettings(Settings settings) {
+ super.beforeSettings(settings)
+ }
+
+ @Override
+ void buildStarted(Gradle gradle) {}
+
+ @Override
+ void settingsEvaluated(Settings settings) {}
+
+ @Override
+ void projectsLoaded(Gradle gradle) {}
+
+ @Override
+ void projectsEvaluated(Gradle gradle) {}
+
+ @Override
+ void buildFinished(BuildResult buildResult) {
+ if (!taskInfoList.isEmpty()) {
+ Collections.sort(taskInfoList, new Comparator() {
+ @Override
+ int compare(TaskInfo t, TaskInfo t1) {
+ return t1.exeDuration - t.exeDuration
+ }
+ })
+ StringBuilder sb = new StringBuilder()
+ int buildSec = (System.currentTimeMillis() - startMillis) / 1000;
+ int m = buildSec / 60;
+ int s = buildSec % 60;
+ def timeInfo = (m == 0 ? "${s}s" : "${m}m ${s}s (${buildSec}s)")
+ sb.append("BUILD FINISHED in $timeInfo\n")
+ taskInfoList.each {
+ sb.append(String.format("%7sms %s\n", it.exeDuration, it.task.path))
+ }
+ def content = sb.toString()
+ GLog.d(content)
+ File file = new File(grd.rootProject.buildDir.getAbsolutePath(),
+ "build_time_records_" + new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + ".txt")
+ file.getParentFile().mkdirs()
+ file.write(content)
+ }
+ }
+ })
+ }
+
+ private static class TaskInfo {
+ Task task
+ long exeDuration
+ }
+}
diff --git a/buildSrc/src/main/groovy/com/blankj/plugin/FormatUtils.groovy b/buildSrc/src/main/java/com/blankj/plugin/readme/FormatUtils.groovy
similarity index 96%
rename from buildSrc/src/main/groovy/com/blankj/plugin/FormatUtils.groovy
rename to buildSrc/src/main/java/com/blankj/plugin/readme/FormatUtils.groovy
index bc82b9f0f6..f617ff2eae 100644
--- a/buildSrc/src/main/groovy/com/blankj/plugin/FormatUtils.groovy
+++ b/buildSrc/src/main/java/com/blankj/plugin/readme/FormatUtils.groovy
@@ -1,9 +1,9 @@
-package com.blankj.plugin
+package com.blankj.plugin.readme
class FormatUtils {
static def LINE_SEP = System.getProperty("line.separator")
- static def LONG_SPACE = " "
+ static def LONG_SPACE = " "
static def format(File readmeCN) {
def sb = new StringBuilder(),
diff --git a/buildSrc/src/main/groovy/com/blankj/plugin/ReadmeCorePlugin.groovy b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeCorePlugin.groovy
similarity index 61%
rename from buildSrc/src/main/groovy/com/blankj/plugin/ReadmeCorePlugin.groovy
rename to buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeCorePlugin.groovy
index 3c2d551a1c..8f3cf47780 100644
--- a/buildSrc/src/main/groovy/com/blankj/plugin/ReadmeCorePlugin.groovy
+++ b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeCorePlugin.groovy
@@ -1,4 +1,4 @@
-package com.blankj.plugin
+package com.blankj.plugin.readme
import org.gradle.api.Plugin
import org.gradle.api.Project
@@ -13,8 +13,10 @@ class ReadmeCorePlugin implements Plugin {
doLast {
println "readmeTask start..."
- def readmeCN = project['readme'].readmeCnFile
- def readmeEng = project['readme'].readmeFile
+ def ext = project['readme'] as ReadmeExtension
+ def readmeCN = ext.readmeCnFile
+ def readmeEng = ext.readmeFile
+
readmeOfUtilCode2Eng(readmeCN, readmeEng)
println "readmeTask finished."
@@ -28,10 +30,16 @@ class ReadmeCorePlugin implements Plugin {
def sb = new StringBuilder()
readmeCN.eachLine { line ->
if (line.contains("* ###")) {
- String utilsName = line.substring(line.indexOf("[") + 1, line.indexOf("Utils"))
- sb.append("* ### About ").append(utilsName).append(line.substring(line.indexOf(" -> ")))
+ if (line.contains("UtilsTransActivity")) {
+ sb.append(line)
+ } else {
+ String utilsName = line.substring(line.indexOf("[") + 1, line.indexOf("Utils"))
+ sb.append("* ### About ").append(utilsName).append(line.substring(line.indexOf(" -> ")))
+ }
} else if (line.contains(": ") && !line.contains("[")) {
sb.append(line.substring(0, line.indexOf(':')).trim())
+ } else if (line.contains("打个小广告") || line.contains("基你太美")) {
+ return
} else {
sb.append(line)
}
diff --git a/buildSrc/src/main/groovy/com/blankj/plugin/ReadmeExtension.groovy b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeExtension.groovy
similarity index 68%
rename from buildSrc/src/main/groovy/com/blankj/plugin/ReadmeExtension.groovy
rename to buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeExtension.groovy
index 91ca50af95..789e683c80 100644
--- a/buildSrc/src/main/groovy/com/blankj/plugin/ReadmeExtension.groovy
+++ b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeExtension.groovy
@@ -1,4 +1,4 @@
-package com.blankj.plugin
+package com.blankj.plugin.readme
class ReadmeExtension {
diff --git a/buildSrc/src/main/groovy/com/blankj/plugin/ReadmeSubPlugin.groovy b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeSubPlugin.groovy
similarity index 76%
rename from buildSrc/src/main/groovy/com/blankj/plugin/ReadmeSubPlugin.groovy
rename to buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeSubPlugin.groovy
index 39b6d0abdc..bade51bbf4 100644
--- a/buildSrc/src/main/groovy/com/blankj/plugin/ReadmeSubPlugin.groovy
+++ b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeSubPlugin.groovy
@@ -1,10 +1,8 @@
-package com.blankj.plugin
+package com.blankj.plugin.readme
import org.gradle.api.Plugin
import org.gradle.api.Project
-import static com.blankj.plugin.FormatUtils.LINE_SEP;
-
class ReadmeSubPlugin implements Plugin {
@Override
@@ -15,8 +13,10 @@ class ReadmeSubPlugin implements Plugin {
doLast {
println "readmeTask start..."
- def readmeCN = project['readme'].readmeCnFile
- def readmeEng = project['readme'].readmeFile
+ def ext = project['readme'] as ReadmeExtension
+ def readmeCN = ext.readmeCnFile
+ def readmeEng = ext.readmeFile
+
readmeOfSubUtil2Eng(readmeCN, readmeEng)
println "readmeTask finished."
@@ -27,9 +27,9 @@ class ReadmeSubPlugin implements Plugin {
static def readmeOfSubUtil2Eng(File readmeCN, File readmeEng) {
FormatUtils.format(readmeCN)
def lines = readmeCN.readLines("UTF-8"),
- sb = new StringBuilder("## How to use" + LINE_SEP
- + LINE_SEP +
- "You should copy the following classes which you want to use in your project." + LINE_SEP),
+ sb = new StringBuilder("## How to use" + FormatUtils.LINE_SEP
+ + FormatUtils.LINE_SEP +
+ "You should copy the following classes which you want to use in your project." + FormatUtils.LINE_SEP),
i = 3,
size = lines.size()
for (; i < size; ++i) {
@@ -42,7 +42,7 @@ class ReadmeSubPlugin implements Plugin {
} else {
sb.append(line)
}
- sb.append(LINE_SEP)
+ sb.append(FormatUtils.LINE_SEP)
}
readmeEng.write(sb.toString(), "UTF-8")
}
diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/com.blankj.readme.core.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/com.blankj.readme.core.properties
deleted file mode 100644
index 6bac059cac..0000000000
--- a/buildSrc/src/main/resources/META-INF/gradle-plugins/com.blankj.readme.core.properties
+++ /dev/null
@@ -1 +0,0 @@
-implementation-class=com.blankj.plugin.ReadmeCorePlugin
\ No newline at end of file
diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/com.blankj.readme.sub.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/com.blankj.readme.sub.properties
deleted file mode 100644
index e0735eab1d..0000000000
--- a/buildSrc/src/main/resources/META-INF/gradle-plugins/com.blankj.readme.sub.properties
+++ /dev/null
@@ -1 +0,0 @@
-implementation-class=com.blankj.plugin.ReadmeSubPlugin
\ No newline at end of file
diff --git a/config.gradle b/config.gradle
deleted file mode 100644
index fa19194b55..0000000000
--- a/config.gradle
+++ /dev/null
@@ -1,205 +0,0 @@
-ext {
- androidConfig = [
- applicationId : 'com.blankj.androidutilcode',
- appName : 'Util',
-
- compileSdkVersion: 27,
- minSdkVersion : 14,
- targetSdkVersion : 27,
- versionCode : 1_020_003,
- versionName : '1.20.3'// E.g. 1.9.72 => 1,009,072
- ]
-
- versionConfig = [
- // plugin
- gradle : '3.1.3',
- kotlin : '1.2.30',
- // lib
- support : '27.1.0',
- gson : '2.8.2',
- glide : '4.7.1',
- leakcanary : '1.5.4',
- retrofit : '2.4.0',
- free_proguard: '0.0.7',
- // test
- junit : '4.12',
- robolectric : '3.1.2'
- ]
-
- depConfig = [
- gradle : "com.android.tools.build:gradle:$versionConfig.gradle",
- kotlin_gradle_plugin: "org.jetbrains.kotlin:kotlin-gradle-plugin:$versionConfig.kotlin",
-
- support : [
- appcompat_v7: "com.android.support:appcompat-v7:$versionConfig.support",
- design : "com.android.support:design:$versionConfig.support",
- ],
- kotlin_stdlib_jdk7 : "org.jetbrains.kotlin:kotlin-stdlib-jdk7",
- leakcanary : [
- android : "com.squareup.leakcanary:leakcanary-android:$versionConfig.leakcanary",
- android_no_op: "com.squareup.leakcanary:leakcanary-android-no-op:$versionConfig.leakcanary",
- ],
- gson : "com.google.code.gson:gson:$versionConfig.gson",
- glide : "com.github.bumptech.glide:glide:$versionConfig.glide",
- retrofit : "com.squareup.retrofit2:retrofit:$versionConfig.retrofit",
- free_proguard : "com.blankj:free-proguard:$versionConfig.free_proguard",
-
- junit : "junit:junit:$versionConfig.junit",
- robolectric : "org.robolectric:robolectric:$versionConfig.robolectric",
- ]
-
- configAndroidDomain = this.&configAndroidDomain
- configAppDependencies = this.&configAppDependencies
- configUtilCodeDependencies = this.&configUtilCodeDependencies
- configSubUtilDependencies = this.&configSubUtilDependencies
-}
-
-def configAndroidDomain(Project pro) {
- if (pro.plugins.hasPlugin("com.android.application")) {
- configAppAndroidDomain(pro)
- } else {
- configLibAndroidDomain(pro)
- }
-}
-
-def configAppAndroidDomain(Project pro) {
- configField(pro)
- configSigning(pro)
- configApkName(pro)
- pro.android {
- compileSdkVersion androidConfig.compileSdkVersion
- defaultConfig {
- applicationId androidConfig.applicationId
- minSdkVersion androidConfig.minSdkVersion
- targetSdkVersion androidConfig.targetSdkVersion
- versionCode androidConfig.versionCode
- versionName androidConfig.versionName
- }
-
- buildTypes {
- release {
- minifyEnabled true
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
-
- sourceSets {
- main.res.srcDirs += 'src/main/res_core'
- main.res.srcDirs += 'src/main/res_sub'
- }
-
- lintOptions {
- abortOnError false
- }
- }
-}
-
-def configField(Project pro) {
- pro.android.defaultConfig {
- resValue "string", "app_name", androidConfig.appName
- }
-}
-
-def configSigning(Project pro) {
- File signPropertiesFile = file('sign/keystore.properties')
- if (!signPropertiesFile.exists()) return
- pro.android {
- Properties properties = new Properties()
- properties.load(new FileInputStream(signPropertiesFile))
- signingConfigs {
- release {
- storeFile file(properties['keystore'])
- storePassword properties['storePassword']
- keyAlias properties['keyAlias']
- keyPassword properties['keyPassword']
- }
- }
- buildTypes.release.signingConfig signingConfigs.release
- }
-}
-
-def configApkName(Project pro) {
- pro.android.applicationVariants.all { variant ->
- if (variant.buildType.name != "debug") {
- variant.getPackageApplication().outputDirectory = new File(project.rootDir.absolutePath + "/apk")
- variant.getPackageApplication().outputScope.apkDatas.forEach { apkData ->
- apkData.outputFileName = "util_" + variant.versionName.replace(".", "_") + ".apk"
- }
- }
- }
-}
-
-def configLibAndroidDomain(Project pro) {
- pro.android {
- compileSdkVersion androidConfig.compileSdkVersion
- defaultConfig {
- minSdkVersion androidConfig.minSdkVersion
- versionCode androidConfig.versionCode
- versionName androidConfig.versionName
- }
-
- buildTypes {
- release {
- minifyEnabled false
- consumerProguardFiles 'proguard-rules.pro'
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
-
- lintOptions {
- abortOnError false
- }
-
- testOptions.unitTests.all {
- testLogging {
- events 'passed', 'skipped', 'failed', 'standardOut', 'standardError'
- }
- }
- }
-}
-
-
-def configAppDependencies(Project pro) {
- pro.dependencies {
- implementation fileTree(include: ['*.jar'], dir: 'app/libs')
- implementation project(':utilcode')
- implementation project(':subutil')
-
- implementation depConfig.support.appcompat_v7
- implementation depConfig.support.design
- implementation depConfig.free_proguard
- implementation 'com.r0adkll:slidableactivity:2.0.5'
- // LeakCanary
- debugImplementation depConfig.leakcanary.android
- releaseImplementation depConfig.leakcanary.android_no_op
-// implementation 'com.blankj:utilcode:1.20.3'
- }
-}
-
-def configUtilCodeDependencies(Project pro) {
- pro.dependencies {
- compileOnly depConfig.support.appcompat_v7
- compileOnly depConfig.support.design
-
- testImplementation depConfig.junit
- testImplementation depConfig.robolectric
- testImplementation depConfig.support.appcompat_v7
- }
-}
-
-def configSubUtilDependencies(Project pro) {
- pro.dependencies {
- compileOnly depConfig.support.appcompat_v7
- compileOnly depConfig.support.design
-
- api depConfig.gson
- api(depConfig.glide) {
- exclude group: "com.android.support"
- }
- api depConfig.retrofit
-
- testImplementation depConfig.junit
- testImplementation depConfig.robolectric
- }
-}
-//./gradlew bintrayUpload
\ No newline at end of file
diff --git a/config/flavor.gradle b/config/flavor.gradle
new file mode 100644
index 0000000000..25c1801983
--- /dev/null
+++ b/config/flavor.gradle
@@ -0,0 +1,22 @@
+android {
+ flavorDimensions "env"
+ productFlavors {
+ dev {
+ dimension "env"
+ }
+
+ production {
+ dimension "env"
+ }
+ }
+
+ variantFilter { variant ->
+ def flavorNames = variant.flavors*.name
+ def buildTypeName = variant.buildType.name
+
+ // production 包不允许 debug 构建
+ if (flavorNames.contains("production") && buildTypeName.contains("debug")) {
+ variant.setIgnore(true)
+ }
+ }
+}
\ No newline at end of file
diff --git a/config/publish.gradle b/config/publish.gradle
new file mode 100644
index 0000000000..7608215123
--- /dev/null
+++ b/config/publish.gradle
@@ -0,0 +1,226 @@
+/*
+ 1. add
+ signing.keyId=xx
+ signing.password=xx
+ signing.secretKeyRingFile=/Users/xx/secring.gpg
+ ossrhUsername=xx
+ ossrhPassword=xx
+ in root local.properties
+
+ 2. copy the file to the directory of gradle, and apply the file in the module
+ ext {
+ groupId = Config.modules.lib_utilcode.groupId
+ artifactId = Config.modules.lib_utilcode.artifactId
+ version = Config.modules.lib_utilcode.version
+ website = "https://github.com/Blankj/AndroidUtilCode"
+}
+ apply from: "${rootDir.path}/config/publish.gradle"
+
+ 3. execute following command to publish
+ ./gradlew :xxmodule:publish2Local -> upload to mavenLocal
+ ./gradlew :xxmodule:publish2Remote -> upload to mavenCentral
+*/
+
+apply plugin: 'maven-publish'
+apply plugin: 'signing'
+
+ext.multiPublishMode = true
+
+File localPropertiesFile = project.rootProject.file("local.properties");
+if (!localPropertiesFile.exists()) {
+ return
+}
+
+Properties properties = new Properties()
+properties.load(new FileInputStream(localPropertiesFile))
+properties.each { name, value -> ext[name] = value }
+
+afterEvaluate {
+ def ext = project.ext
+ publishing {
+ publications {
+ release(MavenPublication) {
+ groupId ext.groupId
+ artifactId ext.artifactId
+ version ext.version
+
+ if (isAndroidEnv(project)) {
+ if (project.ext.multiPublishMode) {
+ artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
+ artifact sourcesJar
+ } else {
+ from project.components.release
+ }
+ } else {
+ from project.components.java
+ }
+
+ pom {
+ name = ext.artifactId
+ description = ext.artifactId
+ url = ext.website
+
+ licenses {
+ license {
+ name = 'The Apache Software License, Version 2.0'
+ url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+ }
+ }
+ developers {
+ developer {
+ id = ext.ossrhUsername
+ name = ext.ossrhUsername
+ }
+ }
+ scm {
+ url = ext.website
+ connection = ext.website
+ developerConnection = ext.website + ".git"
+ }
+
+ if (project.ext.multiPublishMode) {
+ withXml {
+ def dependenciesNode = asNode().getAt('dependencies')[0] ?:
+ asNode().appendNode('dependencies')
+
+ configurations.api.getDependencies().each {
+ dep -> addDependency(project, dependenciesNode, dep, "compile")
+ }
+ configurations.implementation.getDependencies().each {
+ dep -> addDependency(project, dependenciesNode, dep, "runtime")
+ }
+ }
+ }
+ }
+ }
+ }
+
+ repositories {
+ maven {
+ // s01 is newest
+ def releasesUrl = "https://s01.oss.sonatype.org/content/repositories/releases/"
+ def snapshotUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
+ url = version.toUpperCase().endsWith('SNAPSHOT') ? snapshotUrl : releasesUrl
+
+ credentials {
+ username ossrhUsername
+ password ossrhPassword
+ }
+ }
+ }
+ }
+
+ signing {
+ sign publishing.publications
+ }
+}
+
+private void addDependency(Project project, def dependenciesNode, Dependency dep, String scope) {
+ if (dep.group == null || dep.version == null || dep.name == null || dep.name == "unspecified") {
+ return
+ }
+
+ final dependencyNode = dependenciesNode.appendNode('dependency')
+ dependencyNode.appendNode('scope', scope)
+
+ if (dep.version == 'unspecified') {
+ // 检测 module 中的 dependencies 是否有源码依赖
+ // 如果是源码依赖,而且没有在 config 中配置 remotePath,
+ // 那么发布到仓库,其他地方依赖该库时会找不到源码的那个库
+ println "publish -> module(unspecified) <${dep.group}:${dep.name}:${dep.version}>"
+ if (project.ext.groupId || project.ext.version) {
+ throw new GradleException("The module of <" + dep.name + "> should set groupId & version.")
+ }
+ // 源码依赖,但配置了 remotePath,让 pom 中写入 remotePath
+ println("publish -> module(wrapped) <${project.ext.groupId}:${name}:${project.ext.version}>")
+
+ dependencyNode.appendNode('groupId', project.ext.pomGroupID)
+ dependencyNode.appendNode('artifactId', dep.name)
+ dependencyNode.appendNode('version', project.ext.pomVersion)
+ } else {
+ dependencyNode.appendNode('groupId', dep.group)
+ dependencyNode.appendNode('artifactId', dep.name)
+ dependencyNode.appendNode('version', dep.version)
+ println("publish -> library <${dep.group}:${dep.name}:${dep.version}>")
+ }
+
+ if (!dep.transitive) {
+ // In case of non transitive dependency,
+ // all its dependencies should be force excluded from them POM file
+ final exclusionNode = dependencyNode.appendNode('exclusions').appendNode('exclusion')
+ exclusionNode.appendNode('groupId', '*')
+ exclusionNode.appendNode('artifactId', '*')
+ } else if (!dep.properties.excludeRules.empty) {
+ // For transitive with exclusions, all exclude rules should be added to the POM file
+ final exclusions = dependencyNode.appendNode('exclusions')
+ dep.properties.excludeRules.each { ExcludeRule rule ->
+ final exclusionNode = exclusions.appendNode('exclusion')
+ exclusionNode.appendNode('groupId', rule.group ?: '*')
+ exclusionNode.appendNode('artifactId', rule.module ?: '*')
+ }
+ }
+}
+
+if (isAndroidEnv(project)) {
+ // This generates sources.jar
+ task sourcesJar(type: Jar) {
+ classifier = 'sources'
+ from android.sourceSets.main.java.source
+ }
+
+ task javadoc(type: Javadoc) {
+ source = android.sourceSets.main.java.source
+ classpath += configurations.compile
+ classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
+ }
+
+ task javadocJar(type: Jar, dependsOn: javadoc) {
+ classifier = 'javadoc'
+ from javadoc.destinationDir
+ }
+} else {
+ task sourcesJar(type: Jar, dependsOn: classes) {
+ classifier = 'sources'
+ from sourceSets.main.allSource
+ }
+
+ task javadocJar(type: Jar, dependsOn: javadoc) {
+ classifier = 'javadoc'
+ from javadoc.destinationDir
+ }
+}
+
+if (project.hasProperty("kotlin")) {
+ // Disable creating javadocs
+ project.tasks.withType(Javadoc) {
+ enabled = false
+ }
+}
+
+javadoc {
+ options {
+ encoding "UTF-8"
+ charSet 'UTF-8'
+ author true
+ version project.ext.version
+ links "http://docs.oracle.com/javase/7/docs/api"
+ title "${project.ext.artifactId} ${project.ext.version}"
+ }
+}
+
+artifacts {
+ archives javadocJar
+ archives sourcesJar
+}
+
+static def isAndroidEnv(Project project) {
+ return project.getPlugins().hasPlugin('com.android.application') || project.getPlugins().hasPlugin('com.android.library')
+}
+
+task publish2Local(type: GradleBuild) {
+ tasks = ['assemble', 'publishReleasePublicationToMavenLocal']
+}
+
+task publish2Remote(type: GradleBuild) {
+ tasks = ['assemble', 'publishReleasePublicationToMavenRepository']
+}
\ No newline at end of file
diff --git a/app/.gitignore b/feature/launcher/app/.gitignore
similarity index 100%
rename from app/.gitignore
rename to feature/launcher/app/.gitignore
diff --git a/feature/launcher/app/build.gradle b/feature/launcher/app/build.gradle
new file mode 100644
index 0000000000..8f2b6d205d
--- /dev/null
+++ b/feature/launcher/app/build.gradle
@@ -0,0 +1,5 @@
+apply plugin: 'kotlin-kapt'
+
+dependencies {
+ kapt Config.libs.eventbus_processor.path
+}
\ No newline at end of file
diff --git a/feature/launcher/app/proguard-rules.pro b/feature/launcher/app/proguard-rules.pro
new file mode 100644
index 0000000000..f1b424510d
--- /dev/null
+++ b/feature/launcher/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/feature/launcher/app/src/main/AndroidManifest.xml b/feature/launcher/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..4f033c06a6
--- /dev/null
+++ b/feature/launcher/app/src/main/AndroidManifest.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feature/launcher/app/src/main/java/com/blankj/launcher/app/LauncherApp.java b/feature/launcher/app/src/main/java/com/blankj/launcher/app/LauncherApp.java
new file mode 100644
index 0000000000..7dc22cee69
--- /dev/null
+++ b/feature/launcher/app/src/main/java/com/blankj/launcher/app/LauncherApp.java
@@ -0,0 +1,28 @@
+package com.blankj.launcher.app;
+
+import com.blankj.common.CommonApplication;
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/12
+ * desc :
+ *
+ */
+public class LauncherApp extends CommonApplication {
+
+ private static LauncherApp sInstance;
+
+ public static LauncherApp getInstance() {
+ return sInstance;
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ sInstance = this;
+ }
+}
+
+
diff --git a/subutil/.gitignore b/feature/main/app/.gitignore
similarity index 100%
rename from subutil/.gitignore
rename to feature/main/app/.gitignore
diff --git a/feature/main/app/build.gradle b/feature/main/app/build.gradle
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/feature/main/app/proguard-rules.pro b/feature/main/app/proguard-rules.pro
new file mode 100644
index 0000000000..f1b424510d
--- /dev/null
+++ b/feature/main/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/feature/main/app/src/main/AndroidManifest.xml b/feature/main/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..bb8c3398d4
--- /dev/null
+++ b/feature/main/app/src/main/AndroidManifest.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feature/main/app/src/main/java/com/blankj/main/app/MainApp.java b/feature/main/app/src/main/java/com/blankj/main/app/MainApp.java
new file mode 100644
index 0000000000..7b083b92ba
--- /dev/null
+++ b/feature/main/app/src/main/java/com/blankj/main/app/MainApp.java
@@ -0,0 +1,35 @@
+package com.blankj.main.app;
+
+import android.content.Context;
+
+import com.blankj.common.CommonApplication;
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/12
+ * desc :
+ *
+ */
+public class MainApp extends CommonApplication {
+
+ private static MainApp sInstance;
+
+ public static MainApp getInstance() {
+ return sInstance;
+ }
+
+ @Override
+ protected void attachBaseContext(Context base) {
+ super.attachBaseContext(base);
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ sInstance = this;
+ }
+}
+
+
diff --git a/feature/main/pkg/.gitignore b/feature/main/pkg/.gitignore
new file mode 100644
index 0000000000..796b96d1c4
--- /dev/null
+++ b/feature/main/pkg/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/feature/main/pkg/build.gradle b/feature/main/pkg/build.gradle
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/feature/main/pkg/proguard-rules.pro b/feature/main/pkg/proguard-rules.pro
new file mode 100644
index 0000000000..f1b424510d
--- /dev/null
+++ b/feature/main/pkg/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/feature/main/pkg/src/main/AndroidManifest.xml b/feature/main/pkg/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..1cfdba8f69
--- /dev/null
+++ b/feature/main/pkg/src/main/AndroidManifest.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
diff --git a/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt b/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt
new file mode 100644
index 0000000000..b00aba9585
--- /dev/null
+++ b/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt
@@ -0,0 +1,74 @@
+package com.blankj.main.pkg
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import androidx.appcompat.app.ActionBarDrawerToggle
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.subutil.export.api.SubUtilApi
+import com.blankj.utilcode.export.api.UtilCodeApi
+import com.blankj.utilcode.util.ApiUtils
+import com.blankj.utilcode.util.BarUtils
+import com.blankj.utilcode.util.ClickUtils
+import com.blankj.utilcode.util.CollectionUtils
+import kotlinx.android.synthetic.main.activity_main.*
+
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/09/29
+ * desc : MainActivity
+ * ```
+ */
+class MainActivity : CommonActivity() {
+
+ override fun isSwipeBack(): Boolean {
+ return false
+ }
+
+ override fun bindDrawer(): Boolean {
+ return true
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.activity_main
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ window.setBackgroundDrawable(null)
+ super.onCreate(savedInstanceState)
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ setCommonItems(mainRv, CollectionUtils.newArrayList>(
+ CommonItemClick(R.string.core_util, true) {
+ ApiUtils.getApi(UtilCodeApi::class.java)?.startUtilCodeActivity(this)
+ },
+ CommonItemClick(R.string.sub_util, true) {
+ ApiUtils.getApi(SubUtilApi::class.java)?.startSubUtilActivity(this)
+ }
+ ))
+
+ launcherMainCtl.setExpandedTitleColor(Color.TRANSPARENT)
+ setSupportActionBar(launcherMainToolbar)
+ val toggle = ActionBarDrawerToggle(this,
+ drawerView.mBaseDrawerRootLayout,
+ launcherMainToolbar,
+ R.string.navigation_drawer_open,
+ R.string.navigation_drawer_close)
+ drawerView.mBaseDrawerRootLayout.addDrawerListener(toggle)
+ toggle.syncState()
+
+ BarUtils.setStatusBarColor4Drawer(drawerView.mBaseDrawerRootLayout, launcherMainFakeStatusBar, Color.TRANSPARENT, false)
+ BarUtils.addMarginTopEqualStatusBarHeight(launcherMainToolbar)
+ }
+
+ override fun onBackPressed() {
+ ClickUtils.back2HomeFriendly("Press again to exit.")
+ }
+}
diff --git a/feature/main/pkg/src/main/java/com/blankj/main/pkg/SplashActivity.kt b/feature/main/pkg/src/main/java/com/blankj/main/pkg/SplashActivity.kt
new file mode 100644
index 0000000000..9f842cda06
--- /dev/null
+++ b/feature/main/pkg/src/main/java/com/blankj/main/pkg/SplashActivity.kt
@@ -0,0 +1,7 @@
+package com.blankj.main.pkg
+
+import com.blankj.common.activity.CommonActivity
+
+class SplashActivity : CommonActivity() {
+
+}
\ No newline at end of file
diff --git a/feature/main/pkg/src/main/res/layout/activity_main.xml b/feature/main/pkg/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000000..3a33dd0f8e
--- /dev/null
+++ b/feature/main/pkg/src/main/res/layout/activity_main.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/feature/main/pkg/src/main/res/values/strings.xml b/feature/main/pkg/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..7abc06d3ba
--- /dev/null
+++ b/feature/main/pkg/src/main/res/values/strings.xml
@@ -0,0 +1 @@
+
diff --git a/feature/mock/.gitignore b/feature/mock/.gitignore
new file mode 100644
index 0000000000..796b96d1c4
--- /dev/null
+++ b/feature/mock/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/feature/mock/build.gradle b/feature/mock/build.gradle
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/feature/mock/proguard-rules.pro b/feature/mock/proguard-rules.pro
new file mode 100644
index 0000000000..f1b424510d
--- /dev/null
+++ b/feature/mock/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/feature/mock/src/main/AndroidManifest.xml b/feature/mock/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..8c0f9aa047
--- /dev/null
+++ b/feature/mock/src/main/AndroidManifest.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/feature/mock/src/main/java/com/blankj/mock/subutil/SubUtilApiMock.java b/feature/mock/src/main/java/com/blankj/mock/subutil/SubUtilApiMock.java
new file mode 100644
index 0000000000..6c5af69924
--- /dev/null
+++ b/feature/mock/src/main/java/com/blankj/mock/subutil/SubUtilApiMock.java
@@ -0,0 +1,25 @@
+package com.blankj.mock.subutil;
+
+import android.content.Context;
+
+import com.blankj.subutil.export.api.SubUtilApi;
+import com.blankj.utilcode.util.ApiUtils;
+import com.blankj.utilcode.util.ToastUtils;
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/07/10
+ * desc :
+ *
+ */
+@ApiUtils.Api(isMock = true)
+public class SubUtilApiMock extends SubUtilApi {
+
+ @Override
+ public void startSubUtilActivity(Context context) {
+ ToastUtils.showShort("startSubUtilActivity");
+ }
+
+}
diff --git a/feature/mock/src/main/java/com/blankj/mock/utilcode/UtilCodeApiMock.java b/feature/mock/src/main/java/com/blankj/mock/utilcode/UtilCodeApiMock.java
new file mode 100644
index 0000000000..df22cbf92a
--- /dev/null
+++ b/feature/mock/src/main/java/com/blankj/mock/utilcode/UtilCodeApiMock.java
@@ -0,0 +1,32 @@
+package com.blankj.mock.utilcode;
+
+import android.content.Context;
+
+import com.blankj.utilcode.export.api.UtilCodeApi;
+import com.blankj.utilcode.util.ApiUtils;
+import com.blankj.utilcode.util.ToastUtils;
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/07/10
+ * desc :
+ *
+ */
+@ApiUtils.Api(isMock = true)
+public class UtilCodeApiMock extends UtilCodeApi {
+
+ @Override
+ public void startUtilCodeActivity(Context context) {
+ ToastUtils.showShort("startUtilCodeActivity");
+ }
+
+ @Override
+ public void testCallback(Callback callback) {
+ if (callback != null) {
+ callback.call();
+ }
+ }
+
+}
diff --git a/feature/subutil/app/.gitignore b/feature/subutil/app/.gitignore
new file mode 100644
index 0000000000..796b96d1c4
--- /dev/null
+++ b/feature/subutil/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/feature/subutil/app/build.gradle b/feature/subutil/app/build.gradle
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/feature/subutil/app/proguard-rules.pro b/feature/subutil/app/proguard-rules.pro
new file mode 100644
index 0000000000..f1b424510d
--- /dev/null
+++ b/feature/subutil/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/feature/subutil/app/src/main/AndroidManifest.xml b/feature/subutil/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..2989dbfebf
--- /dev/null
+++ b/feature/subutil/app/src/main/AndroidManifest.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feature/subutil/app/src/main/java/com/blankj/subutil/app/SubUtilApp.kt b/feature/subutil/app/src/main/java/com/blankj/subutil/app/SubUtilApp.kt
new file mode 100644
index 0000000000..9667490cf4
--- /dev/null
+++ b/feature/subutil/app/src/main/java/com/blankj/subutil/app/SubUtilApp.kt
@@ -0,0 +1,32 @@
+package com.blankj.subutil.app
+
+import android.content.Context
+import com.blankj.common.CommonApplication
+
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/12
+ * desc : app about utils
+ * ```
+ */
+class SubUtilApp : CommonApplication() {
+
+ companion object {
+ var instance: SubUtilApp? = null
+ private set
+ }
+
+ override fun attachBaseContext(base: Context) {
+ super.attachBaseContext(base)
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ }
+}
+
+
diff --git a/feature/subutil/export/.gitignore b/feature/subutil/export/.gitignore
new file mode 100644
index 0000000000..796b96d1c4
--- /dev/null
+++ b/feature/subutil/export/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/feature/subutil/export/build.gradle b/feature/subutil/export/build.gradle
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/feature/subutil/export/proguard-rules.pro b/feature/subutil/export/proguard-rules.pro
new file mode 100644
index 0000000000..f1b424510d
--- /dev/null
+++ b/feature/subutil/export/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/feature/subutil/export/src/main/AndroidManifest.xml b/feature/subutil/export/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..de00a6d73e
--- /dev/null
+++ b/feature/subutil/export/src/main/AndroidManifest.xml
@@ -0,0 +1 @@
+
diff --git a/feature/subutil/export/src/main/java/com/blankj/subutil/export/api/SubUtilApi.java b/feature/subutil/export/src/main/java/com/blankj/subutil/export/api/SubUtilApi.java
new file mode 100644
index 0000000000..c0e4abe037
--- /dev/null
+++ b/feature/subutil/export/src/main/java/com/blankj/subutil/export/api/SubUtilApi.java
@@ -0,0 +1,20 @@
+package com.blankj.subutil.export.api;
+
+import android.content.Context;
+
+import com.blankj.utilcode.util.ApiUtils;
+
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/06/09
+ * desc :
+ *
+ */
+public abstract class SubUtilApi extends ApiUtils.BaseApi {
+
+ public abstract void startSubUtilActivity(Context context);
+
+}
diff --git a/feature/subutil/pkg/.gitignore b/feature/subutil/pkg/.gitignore
new file mode 100644
index 0000000000..796b96d1c4
--- /dev/null
+++ b/feature/subutil/pkg/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/feature/subutil/pkg/build.gradle b/feature/subutil/pkg/build.gradle
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/feature/subutil/pkg/proguard-rules.pro b/feature/subutil/pkg/proguard-rules.pro
new file mode 100644
index 0000000000..f1b424510d
--- /dev/null
+++ b/feature/subutil/pkg/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/feature/subutil/pkg/src/main/AndroidManifest.xml b/feature/subutil/pkg/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..198eb5c31b
--- /dev/null
+++ b/feature/subutil/pkg/src/main/AndroidManifest.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/Config.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/Config.kt
new file mode 100644
index 0000000000..82a8db84d3
--- /dev/null
+++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/Config.kt
@@ -0,0 +1,31 @@
+package com.blankj.subutil.pkg
+
+import android.os.Environment
+import com.blankj.utilcode.util.Utils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2017/05/10
+ * desc : config about constants
+ * ```
+ */
+object Config {
+
+ val FILE_SEP = System.getProperty("file.separator")
+ val LINE_SEP = System.getProperty("line.separator")
+ const val TEST_PKG = "com.blankj.testinstall"
+ private val CACHE_PATH: String
+ val TEST_APK_PATH: String
+
+ init {
+ val cacheDir = Utils.getApp().externalCacheDir
+ CACHE_PATH = if (cacheDir != null) {
+ cacheDir.absolutePath
+ } else {
+ Environment.getExternalStorageDirectory().absolutePath
+ } + FILE_SEP
+ TEST_APK_PATH = CACHE_PATH + "test_install.apk"
+ }
+}
diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/SubUtilApiImpl.java b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/SubUtilApiImpl.java
new file mode 100644
index 0000000000..0b978f1bcd
--- /dev/null
+++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/SubUtilApiImpl.java
@@ -0,0 +1,25 @@
+package com.blankj.subutil.pkg;
+
+import android.content.Context;
+
+import com.blankj.subutil.export.api.SubUtilApi;
+import com.blankj.subutil.pkg.feature.SubUtilActivity;
+import com.blankj.utilcode.util.ApiUtils;
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/07/02
+ * desc :
+ *
+ */
+@ApiUtils.Api
+public class SubUtilApiImpl extends SubUtilApi {
+
+ @Override
+ public void startSubUtilActivity(Context context) {
+ SubUtilActivity.Companion.start(context);
+ }
+
+}
diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/SubUtilActivity.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/SubUtilActivity.kt
new file mode 100644
index 0000000000..2c6af650ef
--- /dev/null
+++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/SubUtilActivity.kt
@@ -0,0 +1,61 @@
+package com.blankj.subutil.pkg.feature
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.subutil.pkg.R
+import com.blankj.subutil.pkg.feature.appStore.AppStoreActivity
+import com.blankj.subutil.pkg.feature.battery.BatteryActivity
+import com.blankj.subutil.pkg.feature.country.CountryActivity
+import com.blankj.subutil.pkg.feature.dangerous.DangerousActivity
+import com.blankj.subutil.pkg.feature.location.LocationActivity
+import com.blankj.subutil.pkg.feature.pinyin.PinyinActivity
+import com.blankj.utilcode.util.CollectionUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/09/29
+ * desc : MainActivity
+ * ```
+ */
+class SubUtilActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, SubUtilActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+
+ override fun bindTitleRes(): Int {
+ return R.string.sub_util
+ }
+
+ override fun bindItems(): List> {
+ return CollectionUtils.newArrayList(
+ CommonItemClick(R.string.demo_app_store, true) {
+ AppStoreActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_battery, true) {
+ BatteryActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_country, true) {
+ CountryActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_dangerous, true) {
+ DangerousActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_location, true) {
+ LocationActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_pinyin, true) {
+ PinyinActivity.start(this)
+ }
+ )
+ }
+}
diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/appStore/AppStoreActivity.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/appStore/AppStoreActivity.kt
new file mode 100644
index 0000000000..e7c2953448
--- /dev/null
+++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/appStore/AppStoreActivity.kt
@@ -0,0 +1,43 @@
+package com.blankj.subutil.pkg.feature.appStore
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.subutil.pkg.R
+import com.blankj.subutil.util.AppStoreUtils
+import com.blankj.utilcode.util.ActivityUtils
+import com.blankj.utilcode.util.CollectionUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 17/02/01
+ * desc : demo about AppStore
+ * ```
+ */
+class AppStoreActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, AppStoreActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_app_store
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemClick(R.string.app_store_system, true) {
+ AppStoreUtils.getAppStoreIntent("com.tencent.mm").apply {
+ ActivityUtils.startActivity(this)
+ }
+ }
+ )
+ }
+}
diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/battery/BatteryActivity.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/battery/BatteryActivity.kt
new file mode 100644
index 0000000000..8e04163c4f
--- /dev/null
+++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/battery/BatteryActivity.kt
@@ -0,0 +1,56 @@
+package com.blankj.subutil.pkg.feature.battery
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.subutil.pkg.R
+import com.blankj.subutil.util.BatteryUtils
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ToastUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 20/03/31
+ * desc : demo about Battery
+ * ```
+ */
+class BatteryActivity : CommonActivity(), BatteryUtils.OnBatteryStatusChangedListener {
+
+ private val titleItem: CommonItemTitle = CommonItemTitle("", true);
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, BatteryActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_battery
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(titleItem)
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ BatteryUtils.registerBatteryStatusChangedListener(this)
+ }
+
+ override fun onBatteryStatusChanged(status: BatteryUtils.Status) {
+ titleItem.title = status.toString()
+ ToastUtils.showShort(status.toString())
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ BatteryUtils.unregisterBatteryStatusChangedListener(this)
+ }
+}
diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/country/CountryActivity.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/country/CountryActivity.kt
new file mode 100644
index 0000000000..c2daa6ef50
--- /dev/null
+++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/country/CountryActivity.kt
@@ -0,0 +1,41 @@
+package com.blankj.subutil.pkg.feature.country
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.subutil.pkg.R
+import com.blankj.subutil.util.CountryUtils
+import com.blankj.utilcode.util.CollectionUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 17/02/01
+ * desc : demo about Country
+ * ```
+ */
+class CountryActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, CountryActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_country
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("getCountryCodeBySim", CountryUtils.getCountryCodeBySim("Default")),
+ CommonItemTitle("getCountryCodeByLanguage", CountryUtils.getCountryCodeByLanguage("Default")),
+ CommonItemTitle("getCountryBySim", CountryUtils.getCountryBySim()),
+ CommonItemTitle("getCountryByLanguage", CountryUtils.getCountryByLanguage())
+ )
+ }
+}
diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/dangerous/DangerousActivity.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/dangerous/DangerousActivity.kt
new file mode 100644
index 0000000000..cc5c60f470
--- /dev/null
+++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/dangerous/DangerousActivity.kt
@@ -0,0 +1,123 @@
+package com.blankj.subutil.pkg.feature.dangerous
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.helper.PermissionHelper
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemSwitch
+import com.blankj.subutil.pkg.Config
+import com.blankj.subutil.pkg.R
+import com.blankj.subutil.util.DangerousUtils
+import com.blankj.utilcode.constant.PermissionConstants
+import com.blankj.utilcode.util.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 17/02/01
+ * desc : demo about dangerous
+ * ```
+ */
+class DangerousActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
+ override fun onGranted() {
+ val starter = Intent(context, DangerousActivity::class.java)
+ context.startActivity(starter)
+ }
+
+ override fun onDenied() {
+ }
+ }, PermissionConstants.STORAGE, PermissionConstants.SMS)
+ }
+ }
+
+ private val listener = object : OnReleasedListener {
+ override fun onReleased() {
+ if (DangerousUtils.installAppSilent(Config.TEST_APK_PATH)) {
+ ToastUtils.showShort(R.string.dangerous_install_successfully)
+ } else {
+ ToastUtils.showShort(R.string.dangerous_install_unsuccessfully)
+ }
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_dangerous
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemClick(R.string.dangerous_install_silent) {
+ if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
+ ToastUtils.showShort(R.string.dangerous_app_install_tips)
+ } else {
+ if (!FileUtils.isFileExists(Config.TEST_APK_PATH)) {
+ ReleaseInstallApkTask(listener).execute()
+ } else {
+ listener.onReleased()
+ }
+ }
+ },
+ CommonItemClick(R.string.dangerous_uninstall_silent) {
+ if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
+ if (DangerousUtils.uninstallAppSilent(Config.TEST_PKG, false)) {
+ ToastUtils.showShort(R.string.dangerous_uninstall_successfully)
+ } else {
+ ToastUtils.showShort(R.string.dangerous_uninstall_unsuccessfully)
+ }
+ } else {
+ ToastUtils.showShort(R.string.dangerous_app_uninstall_tips)
+ }
+ },
+ CommonItemClick(R.string.dangerous_shutdown) {
+ ToastUtils.showShort(DangerousUtils.shutdown().toString())
+ },
+ CommonItemClick(R.string.dangerous_reboot) {
+ ToastUtils.showShort(DangerousUtils.reboot().toString())
+ },
+ CommonItemClick(R.string.dangerous_reboot_to_recovery) {
+ ToastUtils.showShort(DangerousUtils.reboot2Recovery().toString())
+ },
+ CommonItemClick(R.string.dangerous_reboot_to_bootloader) {
+ ToastUtils.showShort(DangerousUtils.reboot2Bootloader().toString())
+ },
+ CommonItemSwitch(
+ R.string.dangerous_data_enabled,
+ { NetworkUtils.getMobileDataEnabled() },
+ {
+ if (AppUtils.isAppSystem()) {
+ DangerousUtils.setMobileDataEnabled(it)
+ }
+ }
+ ),
+ CommonItemClick(R.string.dangerous_send_sms_silent) {
+ DangerousUtils.sendSmsSilent("10000", "sendSmsSilent")
+ }
+ )
+ }
+}
+
+class ReleaseInstallApkTask(private val mListener: OnReleasedListener) : ThreadUtils.SimpleTask() {
+
+ override fun doInBackground() {
+ ResourceUtils.copyFileFromAssets("test_install", Config.TEST_APK_PATH)
+ }
+
+ override fun onSuccess(result: Unit) {
+ mListener.onReleased()
+ }
+
+ fun execute() {
+ ThreadUtils.executeByIo(this)
+ }
+}
+
+interface OnReleasedListener {
+ fun onReleased()
+}
\ No newline at end of file
diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationActivity.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationActivity.kt
new file mode 100755
index 0000000000..8f4217c96c
--- /dev/null
+++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationActivity.kt
@@ -0,0 +1,100 @@
+package com.blankj.subutil.pkg.feature.location
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.ServiceConnection
+import android.os.IBinder
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.helper.PermissionHelper
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.subutil.pkg.R
+import com.blankj.utilcode.constant.PermissionConstants
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.PermissionUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/13
+ * desc : demo about LocationUtils
+ * ```
+ */
+class LocationActivity : CommonActivity() {
+
+ private var lastLatitude: String = "unknown"
+ private var lastLongitude: String = "unknown"
+ private var latitude: String = "unknown"
+ private var longitude: String = "unknown"
+ private var country: String = "unknown"
+ private var locality: String = "unknown"
+ private var street: String = "unknown"
+
+ companion object {
+ fun start(context: Context) {
+ PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
+ override fun onGranted() {
+ val starter = Intent(context, LocationActivity::class.java)
+ context.startActivity(starter)
+ }
+
+ override fun onDenied() {
+ }
+ }, PermissionConstants.LOCATION)
+ }
+ }
+
+ private lateinit var mLocationService: LocationService
+
+ private var conn: ServiceConnection = object : ServiceConnection {
+ override fun onServiceDisconnected(name: ComponentName) {}
+
+ override fun onServiceConnected(name: ComponentName, service: IBinder) {
+ mLocationService = (service as LocationService.LocationBinder).service
+ mLocationService.setOnGetLocationListener(object : LocationService.OnGetLocationListener {
+ override fun getLocation(lastLatitude: String, lastLongitude: String, latitude: String,
+ longitude: String, country: String, locality: String, street: String) {
+ this@LocationActivity.apply {
+ this.lastLatitude = lastLatitude
+ this.lastLongitude = lastLongitude
+ this.latitude = latitude
+ this.longitude = longitude
+ this.country = country
+ this.locality = locality
+ this.street = street
+ }
+ runOnUiThread {
+ itemsView.updateItems(bindItems())
+ }
+ }
+ })
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_location
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("lastLatitude", lastLatitude),
+ CommonItemTitle("lastLongitude", lastLongitude),
+ CommonItemTitle("latitude", latitude),
+ CommonItemTitle("longitude", longitude),
+ CommonItemTitle("getCountryName", country),
+ CommonItemTitle("getLocality", locality),
+ CommonItemTitle("getStreet", street)
+ )
+ }
+
+ override fun doBusiness() {
+ bindService(Intent(this, LocationService::class.java), conn, Context.BIND_AUTO_CREATE)
+ }
+
+ override fun onDestroy() {
+ unbindService(conn)
+ super.onDestroy()
+ }
+}
diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationService.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationService.kt
new file mode 100755
index 0000000000..8322500d63
--- /dev/null
+++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationService.kt
@@ -0,0 +1,95 @@
+package com.blankj.subutil.pkg.feature.location
+
+import android.app.Service
+import android.content.Intent
+import android.location.Location
+import android.os.Binder
+import android.os.Bundle
+import android.os.IBinder
+import android.os.Looper
+
+import com.blankj.subutil.util.LocationUtils
+import com.blankj.utilcode.util.ToastUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/11/21
+ * desc : demo about LocationUtils
+ * ```
+ */
+class LocationService : Service() {
+
+ private var isSuccess: Boolean = false
+ private var lastLatitude = "loading..."
+ private var lastLongitude = "loading..."
+ private var latitude = "loading..."
+ private var longitude = "loading..."
+ private var country = "loading..."
+ private var locality = "loading..."
+ private var street = "loading..."
+
+ private var mOnGetLocationListener: OnGetLocationListener? = null
+
+ private val mOnLocationChangeListener = object : LocationUtils.OnLocationChangeListener {
+ override fun getLastKnownLocation(location: Location) {
+ lastLatitude = location.latitude.toString()
+ lastLongitude = location.longitude.toString()
+ mOnGetLocationListener?.getLocation(lastLatitude, lastLongitude, latitude, longitude, country, locality, street)
+ }
+
+ override fun onLocationChanged(location: Location) {
+ latitude = location.latitude.toString()
+ longitude = location.longitude.toString()
+ mOnGetLocationListener?.getLocation(lastLatitude, lastLongitude, latitude, longitude, country, locality, street)
+ country = LocationUtils.getCountryName(java.lang.Double.parseDouble(latitude), java.lang.Double.parseDouble(longitude))
+ locality = LocationUtils.getLocality(java.lang.Double.parseDouble(latitude), java.lang.Double.parseDouble(longitude))
+ street = LocationUtils.getStreet(java.lang.Double.parseDouble(latitude), java.lang.Double.parseDouble(longitude))
+ mOnGetLocationListener?.getLocation(lastLatitude, lastLongitude, latitude, longitude, country, locality, street)
+ }
+
+ override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {}
+ }
+
+ fun setOnGetLocationListener(onGetLocationListener: OnGetLocationListener) {
+ mOnGetLocationListener = onGetLocationListener
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ Thread(Runnable {
+ Looper.prepare()
+ isSuccess = LocationUtils.register(0, 0, mOnLocationChangeListener)
+ if (isSuccess) ToastUtils.showShort("init success")
+ Looper.loop()
+ }).start()
+ }
+
+ override fun onBind(intent: Intent): IBinder? {
+ return LocationBinder()
+ }
+
+ inner class LocationBinder : Binder() {
+ val service: LocationService
+ get() = this@LocationService
+ }
+
+ override fun onDestroy() {
+ LocationUtils.unregister()
+ // 一定要制空,否则内存泄漏
+ mOnGetLocationListener = null
+ super.onDestroy()
+ }
+
+ /**
+ * 获取位置监听器
+ */
+ interface OnGetLocationListener {
+ fun getLocation(
+ lastLatitude: String, lastLongitude: String,
+ latitude: String, longitude: String,
+ country: String, locality: String, street: String
+ )
+ }
+}
diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/pinyin/PinyinActivity.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/pinyin/PinyinActivity.kt
new file mode 100644
index 0000000000..648dcb295d
--- /dev/null
+++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/pinyin/PinyinActivity.kt
@@ -0,0 +1,56 @@
+package com.blankj.subutil.pkg.feature.pinyin
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.subutil.pkg.R
+import com.blankj.subutil.util.PinyinUtils
+import com.blankj.utilcode.util.CollectionUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 17/02/01
+ * desc : demo about PinyinUtils
+ * ```
+ */
+class PinyinActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, PinyinActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_pinyin
+ }
+
+ override fun bindItems(): MutableList> {
+ val surnames = "乐乘乜仇会便区单参句召员宓弗折曾朴查洗盖祭种秘繁缪能蕃覃解谌适都阿难黑"
+ val size = surnames.length
+ val sb = StringBuilder("澹台: " + PinyinUtils.getSurnamePinyin("澹台")
+ + "\n尉迟: " + PinyinUtils.getSurnamePinyin("尉迟")
+ + "\n万俟: " + PinyinUtils.getSurnamePinyin("万俟")
+ + "\n单于: " + PinyinUtils.getSurnamePinyin("单于"))
+ for (i in 0 until size) {
+ val surname = surnames[i].toString()
+ sb.append(String.format(
+ "\n%s 正确: %-8s 错误: %-8s",
+ surname,
+ PinyinUtils.getSurnamePinyin(surname),
+ PinyinUtils.ccs2Pinyin(surname)
+ ))
+ }
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("汉字转拼音", PinyinUtils.ccs2Pinyin("汉字转拼音", " ")),
+ CommonItemTitle("获取首字母", PinyinUtils.getPinyinFirstLetters("获取首字母", " ")),
+ CommonItemTitle("测试姓氏", sb.toString())
+
+ )
+ }
+}
\ No newline at end of file
diff --git a/feature/subutil/pkg/src/main/res/values/strings.xml b/feature/subutil/pkg/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..e758c294a0
--- /dev/null
+++ b/feature/subutil/pkg/src/main/res/values/strings.xml
@@ -0,0 +1,29 @@
+
+
+ App Store Demo
+ Battery Demo
+ Country Demo
+ Dangerous Demo
+ LocationUtils Demo
+ PinyinUtils Demo
+
+
+ Go System App Store In WeChat Page
+
+ Install Test App Silently
+ Uninstall App Silently
+ Test app have installed
+ Install successfully
+ Install unsuccessfully
+ Please install test app first
+ Uninstall successfully
+ Uninstall unsuccessfully
+ Shutdown
+ Reboot
+ Reboot To Recovery
+ Reboot To Bootloader
+ Send SMS Silent
+ Mobile Data Enabled
+
+
+
\ No newline at end of file
diff --git a/feature/utilcode/app/.gitignore b/feature/utilcode/app/.gitignore
new file mode 100644
index 0000000000..796b96d1c4
--- /dev/null
+++ b/feature/utilcode/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/feature/utilcode/app/build.gradle b/feature/utilcode/app/build.gradle
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/feature/utilcode/app/proguard-rules.pro b/feature/utilcode/app/proguard-rules.pro
new file mode 100644
index 0000000000..f1b424510d
--- /dev/null
+++ b/feature/utilcode/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/feature/utilcode/app/src/main/AndroidManifest.xml b/feature/utilcode/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..34308fcb79
--- /dev/null
+++ b/feature/utilcode/app/src/main/AndroidManifest.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feature/utilcode/app/src/main/java/com/blankj/utilcode/app/UtilCodeApp.kt b/feature/utilcode/app/src/main/java/com/blankj/utilcode/app/UtilCodeApp.kt
new file mode 100644
index 0000000000..42d2909041
--- /dev/null
+++ b/feature/utilcode/app/src/main/java/com/blankj/utilcode/app/UtilCodeApp.kt
@@ -0,0 +1,30 @@
+package com.blankj.utilcode.app
+
+import com.blankj.common.CommonApplication
+import com.blankj.utilcode.util.Utils
+
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/12
+ * desc : app about utils
+ * ```
+ */
+class UtilCodeApp : CommonApplication() {
+
+ companion object {
+ lateinit var instance: UtilCodeApp
+ private set
+ }
+
+ override fun onCreate() {
+ Utils.init(this)
+ super.onCreate()
+ instance = this
+// BusUtils.register("com.blankj.androidutilcode")
+ }
+}
+
+
diff --git a/feature/utilcode/export/.gitignore b/feature/utilcode/export/.gitignore
new file mode 100644
index 0000000000..796b96d1c4
--- /dev/null
+++ b/feature/utilcode/export/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/feature/utilcode/export/build.gradle b/feature/utilcode/export/build.gradle
new file mode 100644
index 0000000000..30e59272ee
--- /dev/null
+++ b/feature/utilcode/export/build.gradle
@@ -0,0 +1,8 @@
+ext {
+ groupId = Config.modules.feature_utilcode_export.groupId
+ artifactId = Config.modules.feature_utilcode_export.artifactId
+ version = Config.modules.feature_utilcode_export.version
+ website = "https://github.com/Blankj/AndroidUtilCode"
+}
+//apply from: "${rootDir.path}/config/publish.gradle"
+//./gradlew :feature_utilcode_export:mavenLocal // 上传到本地 mavenLocal
\ No newline at end of file
diff --git a/feature/utilcode/export/proguard-rules.pro b/feature/utilcode/export/proguard-rules.pro
new file mode 100644
index 0000000000..f1b424510d
--- /dev/null
+++ b/feature/utilcode/export/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/feature/utilcode/export/src/main/AndroidManifest.xml b/feature/utilcode/export/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..9bbbcc3210
--- /dev/null
+++ b/feature/utilcode/export/src/main/AndroidManifest.xml
@@ -0,0 +1 @@
+
diff --git a/feature/utilcode/export/src/main/java/com/blankj/utilcode/export/api/UtilCodeApi.java b/feature/utilcode/export/src/main/java/com/blankj/utilcode/export/api/UtilCodeApi.java
new file mode 100644
index 0000000000..ea7d5291be
--- /dev/null
+++ b/feature/utilcode/export/src/main/java/com/blankj/utilcode/export/api/UtilCodeApi.java
@@ -0,0 +1,26 @@
+package com.blankj.utilcode.export.api;
+
+import android.content.Context;
+
+import com.blankj.utilcode.util.ApiUtils;
+
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/07/01
+ * desc :
+ *
+ */
+public abstract class UtilCodeApi extends ApiUtils.BaseApi {
+
+ public abstract void startUtilCodeActivity(Context context);
+
+ public abstract void testCallback(Callback callback);
+
+ public interface Callback {
+ void call();
+ }
+
+}
\ No newline at end of file
diff --git a/feature/utilcode/pkg/.gitignore b/feature/utilcode/pkg/.gitignore
new file mode 100644
index 0000000000..796b96d1c4
--- /dev/null
+++ b/feature/utilcode/pkg/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/feature/utilcode/pkg/build.gradle b/feature/utilcode/pkg/build.gradle
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/feature/utilcode/pkg/proguard-rules.pro b/feature/utilcode/pkg/proguard-rules.pro
new file mode 100644
index 0000000000..f1b424510d
--- /dev/null
+++ b/feature/utilcode/pkg/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/feature/utilcode/pkg/src/main/AndroidManifest.xml b/feature/utilcode/pkg/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..8da0667a23
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/AndroidManifest.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/assets/fonts/dnmbhs.ttf b/feature/utilcode/pkg/src/main/assets/fonts/dnmbhs.ttf
similarity index 100%
rename from app/src/main/assets/fonts/dnmbhs.ttf
rename to feature/utilcode/pkg/src/main/assets/fonts/dnmbhs.ttf
diff --git a/app/src/main/assets/test/sub/test.txt b/feature/utilcode/pkg/src/main/assets/test/sub/test.txt
similarity index 100%
rename from app/src/main/assets/test/sub/test.txt
rename to feature/utilcode/pkg/src/main/assets/test/sub/test.txt
diff --git a/app/src/main/assets/test/test.txt b/feature/utilcode/pkg/src/main/assets/test/test.txt
similarity index 100%
rename from app/src/main/assets/test/test.txt
rename to feature/utilcode/pkg/src/main/assets/test/test.txt
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/Config.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/Config.kt
new file mode 100644
index 0000000000..51bb0b7e66
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/Config.kt
@@ -0,0 +1,19 @@
+package com.blankj.utilcode.pkg
+
+import com.blankj.utilcode.util.PathUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2017/05/10
+ * desc : config about constants
+ * ```
+ */
+object Config {
+ val FILE_SEP = System.getProperty("file.separator")
+ val LINE_SEP = System.getProperty("line.separator")
+ const val TEST_PKG = "com.blankj.testinstall"
+ val CACHE_PATH = PathUtils.getCachePathExternalFirst() + FILE_SEP
+ val TEST_APK_PATH: String = CACHE_PATH + "test_install.apk"
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/UtilCodeApiImpl.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/UtilCodeApiImpl.java
new file mode 100644
index 0000000000..076858b3d1
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/UtilCodeApiImpl.java
@@ -0,0 +1,31 @@
+package com.blankj.utilcode.pkg;
+
+import android.content.Context;
+
+import com.blankj.utilcode.export.api.UtilCodeApi;
+import com.blankj.utilcode.pkg.feature.CoreUtilActivity;
+import com.blankj.utilcode.util.ApiUtils;
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/07/01
+ * desc :
+ *
+ */
+@ApiUtils.Api
+public class UtilCodeApiImpl extends UtilCodeApi {
+
+ @Override
+ public void startUtilCodeActivity(Context context) {
+ CoreUtilActivity.Companion.start(context);
+ }
+
+ @Override
+ public void testCallback(Callback callback) {
+ if (callback != null) {
+ callback.call();
+ }
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/CoreUtilActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/CoreUtilActivity.kt
new file mode 100644
index 0000000000..2640191959
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/CoreUtilActivity.kt
@@ -0,0 +1,226 @@
+package com.blankj.utilcode.pkg.feature
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.widget.TextView
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.pkg.feature.activity.ActivityActivity
+import com.blankj.utilcode.pkg.feature.adaptScreen.AdaptScreenActivity
+import com.blankj.utilcode.pkg.feature.api.ApiActivity
+import com.blankj.utilcode.pkg.feature.app.AppActivity
+import com.blankj.utilcode.pkg.feature.bar.BarActivity
+import com.blankj.utilcode.pkg.feature.brightness.BrightnessActivity
+import com.blankj.utilcode.pkg.feature.bus.BusActivity
+import com.blankj.utilcode.pkg.feature.clean.CleanActivity
+import com.blankj.utilcode.pkg.feature.click.ClickActivity
+import com.blankj.utilcode.pkg.feature.clipboard.ClipboardActivity
+import com.blankj.utilcode.pkg.feature.device.DeviceActivity
+import com.blankj.utilcode.pkg.feature.file.FileActivity
+import com.blankj.utilcode.pkg.feature.flashlight.FlashlightActivity
+import com.blankj.utilcode.pkg.feature.fragment.FragmentActivity
+import com.blankj.utilcode.pkg.feature.image.ImageActivity
+import com.blankj.utilcode.pkg.feature.intent.IntentActivity
+import com.blankj.utilcode.pkg.feature.keyboard.KeyboardActivity
+import com.blankj.utilcode.pkg.feature.language.LanguageActivity
+import com.blankj.utilcode.pkg.feature.log.LogActivity
+import com.blankj.utilcode.pkg.feature.messenger.MessengerActivity
+import com.blankj.utilcode.pkg.feature.metaData.MetaDataActivity
+import com.blankj.utilcode.pkg.feature.mvp.MvpActivity
+import com.blankj.utilcode.pkg.feature.network.NetworkActivity
+import com.blankj.utilcode.pkg.feature.notification.NotificationActivity
+import com.blankj.utilcode.pkg.feature.path.PathActivity
+import com.blankj.utilcode.pkg.feature.permission.PermissionActivity
+import com.blankj.utilcode.pkg.feature.phone.PhoneActivity
+import com.blankj.utilcode.pkg.feature.process.ProcessActivity
+import com.blankj.utilcode.pkg.feature.reflect.ReflectActivity
+import com.blankj.utilcode.pkg.feature.resource.ResourceActivity
+import com.blankj.utilcode.pkg.feature.rom.RomActivity
+import com.blankj.utilcode.pkg.feature.screen.ScreenActivity
+import com.blankj.utilcode.pkg.feature.sdcard.SDCardActivity
+import com.blankj.utilcode.pkg.feature.shadow.ShadowActivity
+import com.blankj.utilcode.pkg.feature.snackbar.SnackbarActivity
+import com.blankj.utilcode.pkg.feature.spStatic.SPStaticActivity
+import com.blankj.utilcode.pkg.feature.span.SpanActivity
+import com.blankj.utilcode.pkg.feature.toast.ToastActivity
+import com.blankj.utilcode.pkg.feature.uiMessage.UiMessageActivity
+import com.blankj.utilcode.pkg.feature.vibrate.VibrateActivity
+import com.blankj.utilcode.pkg.feature.volume.VolumeActivity
+import com.blankj.utilcode.pkg.helper.DialogHelper
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.LogUtils
+import com.blankj.utilcode.util.ThreadUtils
+import com.blankj.utilcode.util.UtilsTransActivity
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/09/29
+ * desc :
+ * ```
+ */
+class CoreUtilActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, CoreUtilActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.core_util
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemClick(R.string.demo_activity, true) {
+ ActivityActivity.start(this)
+ ThreadUtils.runOnUiThreadDelayed(Runnable {
+
+ }, 2000)
+ },
+ CommonItemClick(R.string.demo_adapt_screen, true) {
+ AdaptScreenActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_api, true) {
+ ApiActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_app, true) {
+ AppActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_bar, true) {
+ BarActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_brightness, true) {
+ BrightnessActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_bus, true) {
+ BusActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_clean, true) {
+ CleanActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_click, true) {
+ ClickActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_clipboard, true) {
+ ClipboardActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_crash) {
+ throw NullPointerException("crash test")
+ },
+ CommonItemClick(R.string.demo_device, true) {
+ DeviceActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_file, true) {
+ FileActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_flashlight, true) {
+ FlashlightActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_fragment, true) {
+ FragmentActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_image, true) {
+ ImageActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_intent, true) {
+ IntentActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_keyboard, true) {
+ KeyboardActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_language, true) {
+ LanguageActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_log, true) {
+ LogActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_messenger, true) {
+ MessengerActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_meta_data, true) {
+ MetaDataActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_mvp, true) {
+ MvpActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_network, true) {
+ NetworkActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_notification, true) {
+ NotificationActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_path, true) {
+ PathActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_permission, true) {
+ PermissionActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_phone, true) {
+ PhoneActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_process, true) {
+ ProcessActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_reflect, true) {
+ ReflectActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_resource, true) {
+ ResourceActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_rom, true) {
+ RomActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_screen, true) {
+ ScreenActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_sdcard, true) {
+ SDCardActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_shadow, true) {
+ ShadowActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_snackbar, true) {
+ SnackbarActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_spStatic, true) {
+ SPStaticActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_span, true) {
+ SpanActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_toast, true) {
+ ToastActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_trans_activity, true) {
+ UtilsTransActivity.start(this, object : UtilsTransActivity.TransActivityDelegate() {
+ override fun onCreated(activity: UtilsTransActivity, savedInstanceState: Bundle?) {
+ super.onCreated(activity, savedInstanceState)
+ activity.setContentView(R.layout.common_dialog_loading)
+ activity.findViewById(R.id.utilActionLoadingMsgTv).text = "Trans Activity is showing..."
+ }
+ })
+ },
+ CommonItemClick(R.string.demo_uiMessage, true) {
+ UiMessageActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_vibrate, true) {
+ VibrateActivity.start(this)
+ },
+ CommonItemClick(R.string.demo_volume, true) {
+ VolumeActivity.start(this)
+ }
+ )
+ }
+
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ super.onActivityResult(requestCode, resultCode, data)
+ LogUtils.e(requestCode, requestCode)
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
new file mode 100644
index 0000000000..97023b94c2
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
@@ -0,0 +1,194 @@
+package com.blankj.utilcode.pkg.feature.activity
+
+import android.content.Context
+import android.content.Intent
+import android.graphics.drawable.BitmapDrawable
+import android.os.Bundle
+import android.widget.ImageView
+import androidx.core.app.ActivityOptionsCompat
+import com.blankj.base.rv.ItemViewHolder
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemImage
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.pkg.feature.CoreUtilActivity
+import com.blankj.utilcode.util.ActivityUtils
+import com.blankj.utilcode.util.AppUtils
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.StringUtils
+import java.util.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/13
+ * desc : demo about ActivityUtils
+ * ```
+ */
+class ActivityActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, ActivityActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_activity
+ }
+
+ override fun bindItems(): List> {
+ val elementItem = ActivityItem()
+ val intent = Intent(this, SubActivityActivity::class.java)
+ val intents = arrayOfNulls(2)
+ intents[0] = intent
+ intents[1] = Intent(this, SubActivityActivity::class.java)
+
+ return CollectionUtils.newArrayList(
+ elementItem,
+ CommonItemTitle("isActivityExists(${SubActivityActivity::class.java.name})", ActivityUtils.isActivityExists(AppUtils.getAppPackageName(), SubActivityActivity::class.java.name).toString()),
+ CommonItemTitle("getLauncherActivity", ActivityUtils.getLauncherActivity(AppUtils.getAppPackageName())),
+ CommonItemTitle("getMainActivities", ActivityUtils.getMainActivities().toString()),
+ CommonItemTitle("getActivityList", CollectionUtils.collect(ActivityUtils.getActivityList()) { input -> input.javaClass.simpleName }.toString()),
+ CommonItemTitle("getTopActivity", ActivityUtils.getTopActivity().toString()),
+ CommonItemTitle("isActivityExistsInStack", ActivityUtils.isActivityExistsInStack(CoreUtilActivity::class.java).toString()),
+ CommonItemImage("getActivityIcon") {
+ it.setImageDrawable(ActivityUtils.getActivityIcon(ActivityActivity::class.java))
+ },
+ CommonItemImage("getActivityLogo") {
+ it.setImageDrawable(ActivityUtils.getActivityLogo(ActivityActivity::class.java))
+ },
+
+ CommonItemClick(R.string.activity_clz, true) {
+ ActivityUtils.startActivity(SubActivityActivity::class.java)
+ },
+ CommonItemClick(R.string.activity_clz_opt, true) {
+ ActivityUtils.startActivity(SubActivityActivity::class.java, getOption(elementItem))
+ },
+ CommonItemClick(R.string.activity_clz_anim, true) {
+ ActivityUtils.startActivity(SubActivityActivity::class.java, R.anim.fade_in_1000, R.anim.fade_out_1000)
+ },
+ CommonItemClick(R.string.activity_act_clz, true) {
+ ActivityUtils.startActivity(this, SubActivityActivity::class.java)
+ },
+ CommonItemClick(R.string.activity_act_clz_shared_element, true) {
+ ActivityUtils.startActivity(this, SubActivityActivity::class.java, elementItem.element)
+ },
+ CommonItemClick(R.string.activity_act_clz_anim, true) {
+ ActivityUtils.startActivity(this, SubActivityActivity::class.java, R.anim.fade_in_1000, R.anim.fade_out_1000)
+ },
+ CommonItemClick(R.string.activity_pkg_cls, true) {
+ ActivityUtils.startActivity(this.packageName, SubActivityActivity::class.java.name)
+ },
+ CommonItemClick(R.string.activity_pkg_cls_opt, true) {
+ ActivityUtils.startActivity(this.packageName, SubActivityActivity::class.java.name, getOption(elementItem))
+ },
+ CommonItemClick(R.string.activity_pkg_cls_anim, true) {
+ ActivityUtils.startActivity(this.packageName, SubActivityActivity::class.java.name, R.anim.fade_in_1000, R.anim.fade_out_1000)
+ },
+ CommonItemClick(R.string.activity_act_pkg_cls, true) {
+ ActivityUtils.startActivity(this, this.packageName, SubActivityActivity::class.java.name)
+ },
+ CommonItemClick(R.string.activity_act_pkg_cls_opt, true) {
+ ActivityUtils.startActivity(this, this.packageName, SubActivityActivity::class.java.name, getOption(elementItem))
+ },
+ CommonItemClick(R.string.activity_act_pkg_cls_shared_element, true) {
+ ActivityUtils.startActivity(this, this.packageName, SubActivityActivity::class.java.name, elementItem.element)
+ },
+ CommonItemClick(R.string.activity_act_pkg_cls_anim, true) {
+ ActivityUtils.startActivity(this, this.packageName, SubActivityActivity::class.java.name, R.anim.fade_in_1000, R.anim.fade_out_1000)
+ },
+ CommonItemClick(R.string.activity_intent, true) {
+ ActivityUtils.startActivity(this, intent)
+ },
+ CommonItemClick(R.string.activity_intent_opt, true) {
+ ActivityUtils.startActivity(this, intent, getOption(elementItem))
+ },
+ CommonItemClick(R.string.activity_intent_shared_element, true) {
+ ActivityUtils.startActivity(this, intent, elementItem.element)
+ },
+ CommonItemClick(R.string.activity_intent_anim, true) {
+ ActivityUtils.startActivity(this, intent, R.anim.fade_in_1000, R.anim.fade_out_1000)
+ },
+ CommonItemClick(R.string.activity_intents, true) {
+ ActivityUtils.startActivities(intents)
+ },
+ CommonItemClick(R.string.activity_intents_opt, true) {
+ ActivityUtils.startActivities(intents, getOption(elementItem))
+ },
+ CommonItemClick(R.string.activity_intents_anim, true) {
+ ActivityUtils.startActivities(intents, R.anim.fade_in_1000, R.anim.fade_out_1000)
+ },
+ CommonItemClick(R.string.activity_act_intents, true) {
+ ActivityUtils.startActivities(this, intents, R.anim.fade_in_1000, R.anim.fade_out_1000)
+ },
+ CommonItemClick(R.string.activity_act_intents_opt, true) {
+ ActivityUtils.startActivities(this, intents, getOption(elementItem))
+ },
+ CommonItemClick(R.string.activity_act_intents_anim, true) {
+ ActivityUtils.startActivities(this, intents, R.anim.fade_in_1000, R.anim.fade_out_1000)
+ },
+ CommonItemClick(R.string.activity_start_home_activity, true) {
+ ActivityUtils.startHomeActivity()
+ },
+ CommonItemClick(R.string.activity_start_launcher_activity, true) {
+ ActivityUtils.startLauncherActivity()
+ },
+ CommonItemClick(R.string.activity_finish_activity, false) {
+ ActivityUtils.finishActivity(CoreUtilActivity::class.java)
+ },
+ CommonItemClick(R.string.activity_finish_to_activity, true) {
+ ActivityUtils.finishToActivity(CoreUtilActivity::class.java, false, true)
+ },
+ CommonItemClick(R.string.activity_finish_all_activities_except_newest, true) {
+ ActivityUtils.finishAllActivitiesExceptNewest()
+ },
+ CommonItemClick(R.string.activity_finish_all_activities, true) {
+ ActivityUtils.finishAllActivities()
+ }
+ )
+ }
+
+ private fun getOption(activityItem: ActivityItem): Bundle? {
+ when (Random().nextInt(5)) {
+ 0 -> return ActivityOptionsCompat.makeCustomAnimation(this,
+ R.anim.slide_right_in_1000,
+ R.anim.slide_left_out_1000)
+ .toBundle()
+ 1 -> return ActivityOptionsCompat.makeScaleUpAnimation(activityItem.element,
+ activityItem.element.width / 2,
+ activityItem.element.height / 2,
+ 0, 0)
+ .toBundle()
+ 2 -> return ActivityOptionsCompat.makeThumbnailScaleUpAnimation(activityItem.element,
+ (activityItem.element.drawable as BitmapDrawable).bitmap,
+ 0, 0)
+ .toBundle()
+ 3 -> return ActivityOptionsCompat.makeSceneTransitionAnimation(this,
+ activityItem.element,
+ StringUtils.getString(R.string.activity_shared_element))
+ .toBundle()
+ else -> return ActivityOptionsCompat.makeClipRevealAnimation(activityItem.element,
+ activityItem.element.width / 2,
+ activityItem.element.height / 2,
+ 0, 0)
+ .toBundle()
+ }
+ }
+}
+
+class ActivityItem : CommonItem {
+
+ lateinit var element: ImageView;
+
+ constructor() : super(R.layout.activity_item_shared_element_activity)
+
+ override fun bind(holder: ItemViewHolder, position: Int) {
+ super.bind(holder, position)
+ element = holder.findViewById(R.id.activityViewSharedElement)
+ }
+}
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
new file mode 100644
index 0000000000..3505709cd2
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
@@ -0,0 +1,47 @@
+package com.blankj.utilcode.pkg.feature.activity
+
+import android.app.Activity
+import android.content.Intent
+import android.os.Bundle
+import androidx.core.app.ActivityCompat
+import android.view.View
+import com.blankj.common.activity.CommonActivity
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.ColorUtils
+import kotlinx.android.synthetic.main.activity_sub_activity.*
+
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/13
+ * desc : demo about ActivityUtils
+ * ```
+ */
+class SubActivityActivity : CommonActivity() {
+
+ override fun bindLayout(): Int {
+ return R.layout.activity_sub_activity
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_activity
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ contentView?.setBackgroundColor(ColorUtils.getRandomColor(false))
+ activityViewSharedElement.setOnClickListener {
+ val result = Intent()
+ result.putExtra("data", "data")
+ this@SubActivityActivity.setResult(Activity.RESULT_OK, result)
+ this@SubActivityActivity.finish()
+ }
+ }
+
+ override fun onBackPressed() {
+ super.onBackPressed()
+ ActivityCompat.finishAfterTransition(this)
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptCloseActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptCloseActivity.kt
new file mode 100644
index 0000000000..007724289c
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptCloseActivity.kt
@@ -0,0 +1,34 @@
+package com.blankj.utilcode.pkg.feature.adaptScreen
+
+import android.content.Context
+import android.content.Intent
+import android.content.res.Resources
+import android.os.Bundle
+import android.view.View
+import android.view.WindowManager
+import com.blankj.common.activity.CommonActivity
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.AdaptScreenUtils
+
+class AdaptCloseActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, AdaptCloseActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.adaptscreen_close_activity
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
+ }
+
+ override fun getResources(): Resources {
+ return AdaptScreenUtils.closeAdapt(super.getResources())
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt
new file mode 100644
index 0000000000..f00eedc77c
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt
@@ -0,0 +1,41 @@
+package com.blankj.utilcode.pkg.feature.adaptScreen
+
+import android.content.Context
+import android.content.Intent
+import android.content.res.Resources
+import android.os.Bundle
+import android.view.View
+import android.view.WindowManager
+import com.blankj.common.activity.CommonActivity
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.AdaptScreenUtils
+import com.blankj.utilcode.util.BarUtils
+import com.blankj.utilcode.util.LogUtils
+
+class AdaptHeightActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, AdaptHeightActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.adaptscreen_height_activity
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
+ }
+
+ override fun onResume() {
+ super.onResume()
+ LogUtils.e(BarUtils.getStatusBarHeight())
+ }
+
+ override fun getResources(): Resources {
+ return AdaptScreenUtils.adaptHeight(super.getResources(), 1920)
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptScreenActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptScreenActivity.kt
new file mode 100644
index 0000000000..9219c75bb5
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptScreenActivity.kt
@@ -0,0 +1,37 @@
+package com.blankj.utilcode.pkg.feature.adaptScreen
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+
+class AdaptScreenActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, AdaptScreenActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_adapt_screen
+ }
+
+ override fun bindItems(): List> {
+ return CollectionUtils.newArrayList(
+ CommonItemClick(R.string.adaptScreen_adapt_width, true) {
+ AdaptWidthActivity.start(this)
+ },
+ CommonItemClick(R.string.adaptScreen_adapt_height, true) {
+ AdaptHeightActivity.start(this)
+ },
+ CommonItemClick(R.string.adaptScreen_adapt_close, true) {
+ AdaptCloseActivity.start(this)
+ }
+ )
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptWidthActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptWidthActivity.kt
new file mode 100644
index 0000000000..6ccd3f45a0
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptWidthActivity.kt
@@ -0,0 +1,37 @@
+package com.blankj.utilcode.pkg.feature.adaptScreen
+
+import android.content.Context
+import android.content.Intent
+import android.content.res.Resources
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import android.view.WindowManager
+import com.blankj.common.activity.CommonActivity
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.AdaptScreenUtils
+import kotlinx.android.synthetic.main.adaptscreen_width_activity.*
+
+class AdaptWidthActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, AdaptWidthActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.adaptscreen_width_activity
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
+ adaptScreenWidthWebView.setBackgroundColor(Color.parseColor("#f0d26d"))
+ }
+
+ override fun getResources(): Resources {
+ return AdaptScreenUtils.adaptWidth(super.getResources(), 1080)
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/ApiActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/ApiActivity.kt
new file mode 100644
index 0000000000..8e11495b09
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/ApiActivity.kt
@@ -0,0 +1,45 @@
+package com.blankj.utilcode.pkg.feature.api
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.pkg.feature.api.other.export.OtherModuleApi
+import com.blankj.utilcode.util.ApiUtils
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ToastUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/03/12
+ * desc : demo about ApiUtils
+ * ```
+ */
+class ApiActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, ApiActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_api
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemClick(R.string.api_invoke_with_params) {
+ ApiUtils.getApi(OtherModuleApi::class.java)?.invokeWithParams(OtherModuleApi.ApiBean("params"))
+ },
+ CommonItemClick(R.string.api_invoke_with_return_value) {
+ ToastUtils.showShort(ApiUtils.getApi(OtherModuleApi::class.java)?.invokeWithReturnValue()?.name)
+ }
+ );
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/export/OtherModuleApi.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/export/OtherModuleApi.java
new file mode 100644
index 0000000000..5879724b01
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/export/OtherModuleApi.java
@@ -0,0 +1,27 @@
+package com.blankj.utilcode.pkg.feature.api.other.export;
+
+import com.blankj.utilcode.util.ApiUtils;
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/07/10
+ * desc : demo about ApiUtils
+ *
+ */
+public abstract class OtherModuleApi extends ApiUtils.BaseApi {
+
+ public abstract void invokeWithParams(ApiBean bean);
+
+ public abstract ApiBean invokeWithReturnValue();
+
+ public static class ApiBean {
+
+ public String name;
+
+ public ApiBean(String name) {
+ this.name = name;
+ }
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/pkg/OtherPkgApiImpl.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/pkg/OtherPkgApiImpl.java
new file mode 100644
index 0000000000..b3efb7af7a
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/pkg/OtherPkgApiImpl.java
@@ -0,0 +1,28 @@
+package com.blankj.utilcode.pkg.feature.api.other.pkg;
+
+import com.blankj.utilcode.pkg.feature.api.other.export.OtherModuleApi;
+import com.blankj.utilcode.util.ApiUtils;
+import com.blankj.utilcode.util.ToastUtils;
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/07/10
+ * desc : demo about ApiUtils
+ *
+ */
+@ApiUtils.Api
+public class OtherPkgApiImpl extends OtherModuleApi {
+
+ @Override
+ public void invokeWithParams(ApiBean bean) {
+ ToastUtils.showShort(bean.name);
+ }
+
+ @Override
+ public ApiBean invokeWithReturnValue() {
+ String value = "value";
+ return new ApiBean(value);
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt
new file mode 100644
index 0000000000..21eb351146
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt
@@ -0,0 +1,162 @@
+package com.blankj.utilcode.pkg.feature.app
+
+import android.app.Activity
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.helper.PermissionHelper
+import com.blankj.common.item.*
+import com.blankj.utilcode.constant.PermissionConstants
+import com.blankj.utilcode.pkg.Config
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/13
+ * desc : demo about AppUtils
+ * ```
+ */
+class AppActivity : CommonActivity(), Utils.OnAppStatusChangedListener {
+
+ var isRegisterAppStatusChangedListener: Boolean = false
+
+ companion object {
+ fun start(context: Context) {
+ PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
+ override fun onGranted() {
+ val starter = Intent(context, AppActivity::class.java)
+ context.startActivity(starter)
+ }
+
+ override fun onDenied() {
+ }
+ }, PermissionConstants.STORAGE)
+ }
+ }
+
+ private val listener = object : OnReleasedListener {
+ override fun onReleased() {
+ return AppUtils.installApp(Config.TEST_APK_PATH)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_app
+ }
+
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ super.onActivityResult(requestCode, resultCode, data)
+ LogUtils.e(requestCode, resultCode)
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemSwitch(
+ "registerAppStatusChangedListener",
+ { isRegisterAppStatusChangedListener },
+ {
+ isRegisterAppStatusChangedListener = it
+ if (it) {
+ AppUtils.registerAppStatusChangedListener(this)
+ } else {
+ AppUtils.unregisterAppStatusChangedListener(this)
+ }
+ }),
+ CommonItemTitle("isAppRoot", AppUtils.isAppRoot().toString()),
+ CommonItemTitle("isAppDebug", AppUtils.isAppDebug().toString()),
+ CommonItemTitle("isAppSystem", AppUtils.isAppSystem().toString()),
+ CommonItemTitle(
+ "isAppForeground",
+ AppUtils.isAppForeground(AppUtils.getAppPackageName()).toString()
+ ),
+ CommonItemTitle(
+ "isAppRunning",
+ AppUtils.isAppRunning(AppUtils.getAppPackageName()).toString()
+ ),
+ CommonItemImage("getAppIcon") {
+ it.setImageDrawable(AppUtils.getAppIcon())
+ },
+ CommonItemTitle("getAppPackageName", AppUtils.getAppPackageName()),
+ CommonItemTitle("getAppName", AppUtils.getAppName()),
+ CommonItemTitle("getAppPath", AppUtils.getAppPath()),
+ CommonItemTitle("getAppVersionName", AppUtils.getAppVersionName()),
+ CommonItemTitle("getAppVersionCode", AppUtils.getAppVersionCode().toString()),
+ CommonItemTitle("getAppMinSdkVersion", AppUtils.getAppMinSdkVersion().toString()),
+ CommonItemTitle("getAppTargetSdkVersion", AppUtils.getAppTargetSdkVersion().toString()),
+ CommonItemTitle("getAppSignaturesSHA1", AppUtils.getAppSignaturesSHA1().toString()),
+ CommonItemTitle("getAppSignaturesSHA256", AppUtils.getAppSignaturesSHA256().toString()),
+ CommonItemTitle("getAppSignaturesMD5", AppUtils.getAppSignaturesMD5().toString()),
+ CommonItemTitle("getAppUid", AppUtils.getAppUid().toString()),
+ CommonItemTitle("getApkInfo", AppUtils.getApkInfo(AppUtils.getAppPath()).toString()),
+
+ CommonItemClick(R.string.app_install) {
+ if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
+ ToastUtils.showShort(R.string.app_install_tips)
+ } else {
+ if (!FileUtils.isFileExists(Config.TEST_APK_PATH)) {
+ ReleaseInstallApkTask(listener).execute()
+ } else {
+ listener.onReleased()
+ }
+ }
+ },
+ CommonItemClick(R.string.app_uninstall) {
+ if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
+ AppUtils.uninstallApp(Config.TEST_PKG)
+ } else {
+ ToastUtils.showShort(R.string.app_uninstall_tips)
+ }
+ },
+ CommonItemClick(R.string.app_launch) {
+ AppUtils.launchApp(this.packageName)
+ },
+ CommonItemClick(R.string.app_relaunch) {
+ AppUtils.relaunchApp()
+ },
+ CommonItemClick(R.string.app_launch_details_settings, true) {
+ AppUtils.launchAppDetailsSettings()
+ },
+ CommonItemClick(R.string.app_exit) {
+ AppUtils.exitApp()
+ }
+ )
+ }
+
+ override fun onForeground(activity: Activity) {
+ ToastUtils.showShort("onForeground\n${activity.javaClass.simpleName}")
+ }
+
+ override fun onBackground(activity: Activity) {
+ ToastUtils.showShort("onBackground\n${activity.javaClass.simpleName}")
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ if (isRegisterAppStatusChangedListener) {
+ AppUtils.unregisterAppStatusChangedListener(this)
+ }
+ }
+}
+
+class ReleaseInstallApkTask(private val mListener: OnReleasedListener) :
+ ThreadUtils.SimpleTask() {
+
+ override fun doInBackground() {
+ ResourceUtils.copyFileFromAssets("test_install", Config.TEST_APK_PATH)
+ }
+
+ override fun onSuccess(result: Unit) {
+ mListener.onReleased()
+ }
+
+ fun execute() {
+ ThreadUtils.executeByIo(this)
+ }
+}
+
+interface OnReleasedListener {
+ fun onReleased()
+}
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarActivity.kt
new file mode 100644
index 0000000000..26801106a0
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarActivity.kt
@@ -0,0 +1,71 @@
+package com.blankj.utilcode.pkg.feature.bar
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.pkg.feature.bar.nav.BarNavActivity
+import com.blankj.utilcode.pkg.feature.bar.notification.BarNotificationActivity
+import com.blankj.utilcode.pkg.feature.bar.status.*
+import com.blankj.utilcode.pkg.feature.bar.status.fragment.BarStatusFragmentActivity
+import com.blankj.utilcode.util.CollectionUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2017/05/27
+ * desc : demo about BarUtils
+ * ```
+ */
+class BarActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, BarActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_bar
+ }
+
+ override fun bindItems(): List> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle(R.string.bar_about_status_bar, true),
+ CommonItemClick(R.string.bar_status_about, true) {
+ BarStatusActivity.start(this)
+ },
+ CommonItemClick(R.string.bar_status_set_color, true) {
+ BarStatusActivityColor.start(this)
+ },
+ CommonItemClick(R.string.bar_status_set_alpha, true) {
+ BarStatusActivityAlpha.start(this)
+ },
+ CommonItemClick(R.string.bar_status_set_image_view, true) {
+ BarStatusActivityImageView.start(this)
+ },
+ CommonItemClick(R.string.bar_status_set_custom, true) {
+ BarStatusActivityCustom.start(this)
+ },
+ CommonItemClick(R.string.bar_status_set_fragment, true) {
+ BarStatusFragmentActivity.start(this)
+ },
+ CommonItemClick(R.string.bar_status_set_drawer, true) {
+ BarStatusActivityDrawer.start(this)
+ },
+ CommonItemTitle(R.string.bar_about_notification_bar, true),
+ CommonItemClick(R.string.bar_notification_about, true) {
+ BarNotificationActivity.start(this)
+ },
+ CommonItemTitle(R.string.bar_about_nav_bar, true),
+ CommonItemClick(R.string.bar_nav_about, true) {
+ BarNavActivity.start(this)
+ }
+ )
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt
new file mode 100644
index 0000000000..48a738ecd7
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt
@@ -0,0 +1,88 @@
+package com.blankj.utilcode.pkg.feature.bar.nav
+
+import android.content.Context
+import android.content.Intent
+import android.os.Build
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemSwitch
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.BarUtils
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ColorUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/13
+ * desc : demo about BarUtils
+ * ```
+ */
+class BarNavActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, BarNavActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_bar
+ }
+
+ override fun bindItems(): List> {
+ return CollectionUtils.newArrayList>().apply {
+ add(CommonItemTitle("navHeight", BarUtils.getNavBarHeight().toString()))
+ add(CommonItemTitle("isSupportNavBar", BarUtils.isSupportNavBar().toString()))
+ if (BarUtils.isSupportNavBar()) {
+ add(CommonItemSwitch(
+ R.string.bar_nav_visibility,
+ { BarUtils.isNavBarVisible(this@BarNavActivity) },
+ { BarUtils.setNavBarVisibility(this@BarNavActivity, it) }
+ ))
+
+ add(CommonItemSwitch(
+ R.string.bar_nav_light_mode,
+ { BarUtils.isNavBarLightMode(this@BarNavActivity) },
+ { BarUtils.setNavBarLightMode(this@BarNavActivity, it) }
+ ))
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ add(
+ CommonItemClick(
+ "getNavBarColor: ${
+ ColorUtils.int2ArgbString(
+ BarUtils.getNavBarColor(
+ this@BarNavActivity
+ )
+ )
+ }"
+ ).setOnItemClickListener() { _, item, _ ->
+ BarUtils.setNavBarColor(
+ this@BarNavActivity,
+ ColorUtils.getRandomColor()
+ )
+ itemsView.updateItems(bindItems())
+ item.title = "getNavBarColor: ${
+ ColorUtils.int2ArgbString(
+ BarUtils.getNavBarColor(this@BarNavActivity)
+ )
+ }"
+ })
+ }
+ add(CommonItemClick("transparentNavBar").setOnItemClickListener() { _, item, _ ->
+ BarUtils.transparentNavBar(this@BarNavActivity)
+ })
+ }
+ }
+ }
+
+ override fun onWindowFocusChanged(hasFocus: Boolean) {
+ super.onWindowFocusChanged(hasFocus)
+ itemsView.updateItems(bindItems())
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/notification/BarNotificationActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/notification/BarNotificationActivity.kt
new file mode 100644
index 0000000000..5504912ee6
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/notification/BarNotificationActivity.kt
@@ -0,0 +1,49 @@
+package com.blankj.utilcode.pkg.feature.bar.notification
+
+import android.content.Context
+import android.content.Intent
+import android.os.Handler
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.BarUtils
+import com.blankj.utilcode.util.CollectionUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/13
+ * desc : demo about BarUtils
+ * ```
+ */
+class BarNotificationActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, BarNotificationActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ private val mHandler = Handler()
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_bar
+ }
+
+ override fun bindItems(): List> {
+ return CollectionUtils.newArrayList(
+ CommonItemClick(R.string.bar_notification_show) {
+ BarUtils.setNotificationBarVisibility(true)
+ mHandler.postDelayed({ BarUtils.setNotificationBarVisibility(false) }, 2000)
+ }
+ )
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ mHandler.removeCallbacksAndMessages(null)
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt
new file mode 100644
index 0000000000..da20870e79
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt
@@ -0,0 +1,55 @@
+package com.blankj.utilcode.pkg.feature.bar.status
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemSwitch
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.BarUtils
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.Utils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/13
+ * desc : demo about BarUtils
+ * ```
+ */
+class BarStatusActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, BarStatusActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_bar
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("getStatusBarHeight", BarUtils.getStatusBarHeight().toString()),
+ CommonItemSwitch(
+ R.string.bar_status_visibility,
+ { BarUtils.isStatusBarVisible(this) },
+ { BarUtils.setStatusBarVisibility(this, it) }
+ ),
+ CommonItemSwitch(
+ R.string.bar_status_light_mode,
+ { BarUtils.isStatusBarLightMode(this) },
+ { BarUtils.setStatusBarLightMode(this, it) }
+ )
+ )
+ }
+
+ override fun onResume() {
+ super.onResume()
+ itemsView.updateItems(bindItems())
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt
new file mode 100644
index 0000000000..fa886e5be5
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt
@@ -0,0 +1,67 @@
+package com.blankj.utilcode.pkg.feature.bar.status
+
+import android.content.Context
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import android.widget.SeekBar
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemSeekBar
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.BarUtils
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ColorUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2017/05/27
+ * desc : demo about BarUtils
+ * ```
+ */
+class BarStatusActivityAlpha : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, BarStatusActivityAlpha::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ private var mAlpha: Int = 112
+
+ override fun bindLayout(): Int {
+ return R.layout.bar_status_alpha_activity
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ setCommonItems(findViewById(R.id.commonItemRv), getItems())
+ updateStatusBar()
+ }
+
+ private fun getItems(): List> {
+ return CollectionUtils.newArrayList>(
+ CommonItemSeekBar("Status Bar Alpha", 255, object : CommonItemSeekBar.ProgressListener() {
+ override fun getCurValue(): Int {
+ return mAlpha
+ }
+
+ override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
+ mAlpha = progress
+ updateStatusBar()
+ }
+ }).apply {
+ backgroundColor = ColorUtils.setAlphaComponent(backgroundColor, 0.5f)
+ }
+ )
+ }
+
+ private fun updateStatusBar() {
+ BarUtils.setStatusBarColor(this, Color.argb(mAlpha, 0, 0, 0))
+ BarUtils.addMarginTopEqualStatusBarHeight(findViewById(R.id.commonItemRv))// 其实这个只需要调用一次即可
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityColor.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityColor.kt
new file mode 100644
index 0000000000..74b6368e1b
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityColor.kt
@@ -0,0 +1,53 @@
+package com.blankj.utilcode.pkg.feature.bar.status
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.BarUtils
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ColorUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2017/05/27
+ * desc : demo about BarUtils
+ * ```
+ */
+class BarStatusActivityColor : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, BarStatusActivityColor::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ private var mColor: Int = ColorUtils.getColor(R.color.colorPrimary)
+
+ override fun bindItems(): List> {
+ return CollectionUtils.newArrayList>(
+ CommonItemClick(R.string.bar_status_random_color, ColorUtils.int2ArgbString(mColor)).setOnClickUpdateContentListener {
+ mColor = ColorUtils.getRandomColor()
+ updateStatusBar()
+ return@setOnClickUpdateContentListener ColorUtils.int2ArgbString(mColor)
+ }
+ )
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ updateStatusBar()
+ }
+
+ private fun updateStatusBar() {
+ BarUtils.setStatusBarColor(this, mColor)
+ BarUtils.addMarginTopEqualStatusBarHeight(findViewById(R.id.commonItemRv))// 其实这个只需要调用一次即可
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityCustom.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityCustom.kt
new file mode 100644
index 0000000000..0cea718cf9
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityCustom.kt
@@ -0,0 +1,34 @@
+package com.blankj.utilcode.pkg.feature.bar.status
+
+import android.content.Context
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import com.blankj.common.activity.CommonActivity
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.BarUtils
+
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/01/14
+ * desc : demo about BarUtils
+ * ```
+ */
+class BarStatusActivityCustom : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, BarStatusActivityCustom::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ BarUtils.setStatusBarColor(this, Color.TRANSPARENT).setBackgroundResource(R.drawable.bar_status_custom)
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt
new file mode 100644
index 0000000000..d8e092d466
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt
@@ -0,0 +1,116 @@
+package com.blankj.utilcode.pkg.feature.bar.status
+
+import android.content.Context
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import android.widget.SeekBar
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemSeekBar
+import com.blankj.common.item.CommonItemSwitch
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.BarUtils
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ColorUtils
+import kotlinx.android.synthetic.main.bar_status_drawer_activity.*
+
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2017/05/27
+ * desc : demo about BarUtils
+ * ```
+ */
+class BarStatusActivityDrawer : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, BarStatusActivityDrawer::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ private var mColor: Int = ColorUtils.getColor(R.color.colorPrimary)
+ private var mAlpha: Int = 112
+
+ private var mAlphaStatus: Boolean = false
+ private var mFrontStatus: Boolean = false
+
+ override fun isSwipeBack(): Boolean {
+ return false
+ }
+
+ override fun bindDrawer(): Boolean {
+ return true
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.bar_status_drawer_activity
+ }
+
+ private fun getItems(): MutableList> {
+ val randomColorItem = CommonItemClick(R.string.bar_status_random_color, ColorUtils.int2ArgbString(mColor)).setOnClickUpdateContentListener {
+ mColor = ColorUtils.getRandomColor()
+ updateStatusBar()
+ return@setOnClickUpdateContentListener ColorUtils.int2ArgbString(mColor)
+ }
+
+ val alphaItem: CommonItem<*> = CommonItemSeekBar("Status Bar Alpha", 255, object : CommonItemSeekBar.ProgressListener() {
+ override fun getCurValue(): Int {
+ return mAlpha
+ }
+
+ override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
+ mAlpha = progress
+ updateStatusBar()
+ }
+ })
+
+ return CollectionUtils.newArrayList(
+ CommonItemSwitch(
+ R.string.bar_status_title_alpha,
+ {
+ updateStatusBar()
+ mAlphaStatus
+ },
+ {
+ mAlphaStatus = it
+ if (mAlphaStatus) {
+ barStatusDrawerRootLl.setBackgroundResource(R.drawable.image_lena)
+ commonItemAdapter.replaceItem(2, alphaItem, true)
+ } else {
+ barStatusDrawerRootLl.setBackgroundColor(Color.TRANSPARENT)
+ commonItemAdapter.replaceItem(2, randomColorItem, true)
+ }
+ }
+ ),
+ CommonItemSwitch(
+ R.string.bar_status_is_front,
+ { mFrontStatus },
+ {
+ mFrontStatus = it
+ updateStatusBar()
+ }
+ ),
+ randomColorItem
+ )
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ setCommonItems(findViewById(R.id.commonItemRv), getItems())
+ }
+
+ private fun updateStatusBar() {
+ if (mAlphaStatus) {
+ BarUtils.setStatusBarColor4Drawer(drawerView.mBaseDrawerRootLayout, barStatusDrawerFakeStatusBar, Color.argb(mAlpha, 0, 0, 0), mFrontStatus)
+ } else {
+ BarUtils.setStatusBarColor4Drawer(drawerView.mBaseDrawerRootLayout, barStatusDrawerFakeStatusBar, mColor, mFrontStatus)
+ }
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt
new file mode 100644
index 0000000000..86542caec5
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt
@@ -0,0 +1,63 @@
+package com.blankj.utilcode.pkg.feature.bar.status
+
+import android.content.Context
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import android.widget.SeekBar
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemSeekBar
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.BarUtils
+import com.blankj.utilcode.util.CollectionUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2017/05/27
+ * desc : demo about BarUtils
+ * ```
+ */
+class BarStatusActivityImageView : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, BarStatusActivityImageView::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ private var mAlpha: Int = 112
+
+ override fun bindLayout(): Int {
+ return R.layout.bar_status_image_view_activity
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ setCommonItems(findViewById(R.id.commonItemRv), getItems())
+ updateStatusBar()
+ }
+
+ private fun getItems(): List> {
+ return CollectionUtils.newArrayList>(
+ CommonItemSeekBar("Status Bar Alpha", 255, object : CommonItemSeekBar.ProgressListener() {
+ override fun getCurValue(): Int {
+ return mAlpha
+ }
+
+ override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
+ mAlpha = progress
+ updateStatusBar()
+ }
+ })
+ )
+ }
+
+ private fun updateStatusBar() {
+ BarUtils.setStatusBarColor(this, Color.argb(mAlpha, 0, 0, 0), true)
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentActivity.kt
new file mode 100644
index 0000000000..6df145b5be
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentActivity.kt
@@ -0,0 +1,101 @@
+package com.blankj.utilcode.pkg.feature.bar.status.fragment
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentPagerAdapter
+import androidx.viewpager.widget.ViewPager
+import com.blankj.common.activity.CommonActivity
+import com.blankj.utilcode.pkg.R
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import kotlinx.android.synthetic.main.bar_status_fragment_activity.*
+import java.util.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2017/05/27
+ * desc : demo about BarUtils
+ * ```
+ */
+class BarStatusFragmentActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, BarStatusFragmentActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ private val itemIds = intArrayOf(
+ R.id.barStatusFragmentNavigationColor,
+ R.id.barStatusFragmentNavigationAlpha,
+ R.id.barStatusFragmentNavigationImageView,
+ R.id.barStatusFragmentNavigationCustom
+ )
+
+ private val mFragmentList = ArrayList()
+
+ private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener l@{ item ->
+ when (item.itemId) {
+ R.id.barStatusFragmentNavigationColor -> {
+ barStatusFragmentVp.currentItem = 0
+ return@l true
+ }
+ R.id.barStatusFragmentNavigationAlpha -> {
+ barStatusFragmentVp.currentItem = 1
+ return@l true
+ }
+ R.id.barStatusFragmentNavigationImageView -> {
+ barStatusFragmentVp.currentItem = 2
+ return@l true
+ }
+ R.id.barStatusFragmentNavigationCustom -> {
+ barStatusFragmentVp.currentItem = 3
+ return@l true
+ }
+ else -> false
+ }
+ }
+
+ override fun isSwipeBack(): Boolean {
+ return false
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.bar_status_fragment_activity
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ mFragmentList.add(BarStatusFragmentColor.newInstance())
+ mFragmentList.add(BarStatusFragmentAlpha.newInstance())
+ mFragmentList.add(BarStatusFragmentImageView.newInstance())
+ mFragmentList.add(BarStatusFragmentCustom.newInstance())
+
+ barStatusFragmentVp.offscreenPageLimit = mFragmentList.size - 1
+ barStatusFragmentVp.adapter = object : FragmentPagerAdapter(supportFragmentManager) {
+ override fun getItem(position: Int): Fragment {
+ return mFragmentList[position]
+ }
+
+ override fun getCount(): Int {
+ return mFragmentList.size
+ }
+ }
+ barStatusFragmentVp.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
+
+ override fun onPageSelected(position: Int) {
+ barStatusFragmentNav.selectedItemId = itemIds[position]
+ }
+
+ override fun onPageScrollStateChanged(state: Int) {}
+ })
+
+ barStatusFragmentNav.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt
new file mode 100644
index 0000000000..ab368c0295
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt
@@ -0,0 +1,68 @@
+package com.blankj.utilcode.pkg.feature.bar.status.fragment
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import android.widget.SeekBar
+import com.blankj.common.fragment.CommonFragment
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemSeekBar
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.BarUtils
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ColorUtils
+import kotlinx.android.synthetic.main.bar_status_alpha_fragment.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2017/07/01
+ * desc : demo about BarUtils
+ * ```
+ */
+class BarStatusFragmentAlpha : CommonFragment() {
+
+ companion object {
+ fun newInstance(): BarStatusFragmentAlpha {
+ return BarStatusFragmentAlpha()
+ }
+ }
+
+ override fun isLazy(): Boolean {
+ return true
+ }
+
+ private var mAlpha: Int = 112
+
+ override fun bindLayout(): Int {
+ return R.layout.bar_status_alpha_fragment
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ setCommonItems(findViewById(R.id.commonItemRv), getItems())
+ updateFakeStatusBar()
+ }
+
+ private fun getItems(): List> {
+ return CollectionUtils.newArrayList>(
+ CommonItemSeekBar("Status Bar Alpha", 255, object : CommonItemSeekBar.ProgressListener() {
+ override fun getCurValue(): Int {
+ return mAlpha
+ }
+
+ override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
+ mAlpha = progress
+ updateFakeStatusBar()
+ }
+ }).apply {
+ backgroundColor = ColorUtils.setAlphaComponent(backgroundColor, 0.5f)
+ }
+ )
+ }
+
+ fun updateFakeStatusBar() {
+ BarUtils.setStatusBarColor(barStatusAlphaFragmentFakeStatusBar, Color.argb(mAlpha, 0, 0, 0))
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentColor.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentColor.kt
new file mode 100644
index 0000000000..029523e59d
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentColor.kt
@@ -0,0 +1,59 @@
+package com.blankj.utilcode.pkg.feature.bar.status.fragment
+
+import android.os.Bundle
+import android.view.View
+import com.blankj.common.fragment.CommonFragment
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.BarUtils
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ColorUtils
+import kotlinx.android.synthetic.main.bar_status_color_fragment.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2017/07/01
+ * desc : demo about BarUtils
+ * ```
+ */
+class BarStatusFragmentColor : CommonFragment() {
+
+ companion object {
+ fun newInstance(): BarStatusFragmentColor {
+ return BarStatusFragmentColor()
+ }
+ }
+
+ private var mColor: Int = ColorUtils.getColor(R.color.colorPrimary)
+
+ override fun isLazy(): Boolean {
+ return true
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.bar_status_color_fragment
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ setCommonItems(findViewById(R.id.commonItemRv), getItems())
+ updateFakeStatusBar()
+ }
+
+ private fun getItems(): List> {
+ return CollectionUtils.newArrayList>(
+ CommonItemClick(R.string.bar_status_random_color, ColorUtils.int2ArgbString(mColor)).setOnClickUpdateContentListener {
+ mColor = ColorUtils.getRandomColor()
+ updateFakeStatusBar()
+ return@setOnClickUpdateContentListener ColorUtils.int2ArgbString(mColor)
+ }
+ )
+ }
+
+ private fun updateFakeStatusBar() {
+ BarUtils.setStatusBarColor(barStatusColorFragmentFakeStatusBar, mColor)
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentCustom.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentCustom.kt
new file mode 100644
index 0000000000..e8dbcd927c
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentCustom.kt
@@ -0,0 +1,38 @@
+package com.blankj.utilcode.pkg.feature.bar.status.fragment
+
+import android.os.Bundle
+import android.view.View
+import com.blankj.common.fragment.CommonFragment
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.BarUtils
+import kotlinx.android.synthetic.main.bar_status_custom_fragment.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2017/07/01
+ * desc : demo about BarUtils
+ * ```
+ */
+class BarStatusFragmentCustom : CommonFragment() {
+
+ companion object {
+ fun newInstance(): BarStatusFragmentCustom {
+ return BarStatusFragmentCustom()
+ }
+ }
+
+ override fun isLazy(): Boolean {
+ return true
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.bar_status_custom_fragment
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ BarUtils.setStatusBarCustom(barStatusCustomFragmentFakeStatusBar)
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt
new file mode 100644
index 0000000000..686e50995c
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt
@@ -0,0 +1,65 @@
+package com.blankj.utilcode.pkg.feature.bar.status.fragment
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import android.widget.SeekBar
+import com.blankj.common.fragment.CommonFragment
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemSeekBar
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.BarUtils
+import com.blankj.utilcode.util.CollectionUtils
+import kotlinx.android.synthetic.main.bar_status_image_view_fragment.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2017/07/01
+ * desc : demo about BarUtils
+ * ```
+ */
+class BarStatusFragmentImageView : CommonFragment() {
+
+ companion object {
+ fun newInstance(): BarStatusFragmentImageView {
+ return BarStatusFragmentImageView()
+ }
+ }
+
+ private var mAlpha: Int = 112
+
+ override fun isLazy(): Boolean {
+ return true
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.bar_status_image_view_fragment
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ setCommonItems(findViewById(R.id.commonItemRv), getItems())
+ updateFakeStatusBar()
+ }
+
+ private fun getItems(): List> {
+ return CollectionUtils.newArrayList>(
+ CommonItemSeekBar("Status Bar Alpha", 255, object : CommonItemSeekBar.ProgressListener() {
+ override fun getCurValue(): Int {
+ return mAlpha
+ }
+
+ override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
+ mAlpha = progress
+ updateFakeStatusBar()
+ }
+ })
+ )
+ }
+
+ fun updateFakeStatusBar() {
+ BarUtils.setStatusBarColor(barStatusImageViewFragmentFakeStatusBar, Color.argb(mAlpha, 0, 0, 0))
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/brightness/BrightnessActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/brightness/BrightnessActivity.kt
new file mode 100644
index 0000000000..435a1ecbed
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/brightness/BrightnessActivity.kt
@@ -0,0 +1,76 @@
+package com.blankj.utilcode.pkg.feature.brightness
+
+import android.content.Context
+import android.content.Intent
+import android.os.Build
+import android.widget.SeekBar
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemSeekBar
+import com.blankj.common.item.CommonItemSwitch
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2018/02/08
+ * desc : demo about BrightnessUtils
+ * ```
+ */
+class BrightnessActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ PermissionUtils.requestWriteSettings(object : PermissionUtils.SimpleCallback {
+ override fun onGranted() {
+ val starter = Intent(context, BrightnessActivity::class.java)
+ context.startActivity(starter)
+ }
+
+ override fun onDenied() {
+ ToastUtils.showLong("No permission of write settings.")
+ }
+ })
+ } else {
+ val starter = Intent(context, BrightnessActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+ }
+
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_brightness
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemSeekBar("getBrightness", 255, object : CommonItemSeekBar.ProgressListener() {
+ override fun getCurValue(): Int {
+ return BrightnessUtils.getBrightness()
+ }
+
+ override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
+ BrightnessUtils.setBrightness(progress)
+ }
+ }),
+ CommonItemSeekBar("getWindowBrightness", 255, object : CommonItemSeekBar.ProgressListener() {
+ override fun getCurValue(): Int {
+ return BrightnessUtils.getWindowBrightness(window)
+ }
+
+ override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
+ BrightnessUtils.setWindowBrightness(window, progress)
+ }
+ }),
+ CommonItemSwitch(
+ R.string.brightness_auto_brightness,
+ { BrightnessUtils.isAutoBrightnessEnabled() },
+ { BrightnessUtils.setAutoBrightnessEnabled(it) }
+ )
+ )
+ }
+}
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt
new file mode 100644
index 0000000000..9bd7c870d0
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt
@@ -0,0 +1,119 @@
+package com.blankj.utilcode.pkg.feature.bus
+
+import android.content.Context
+import android.content.Intent
+import androidx.annotation.Keep
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.BusUtils
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ThreadUtils
+import kotlin.random.Random
+
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/03/12
+ * desc : demo about BusUtils
+ * ```
+ */
+class BusActivity : CommonActivity() {
+
+ private val titleItem: CommonItemTitle = CommonItemTitle("", true);
+
+ @BusUtils.Bus(tag = TAG_BASIC_TYPE)
+ fun test(param: Int) {
+ titleItem.title = param.toString()
+ }
+
+ @BusUtils.Bus(tag = TAG_BUS, priority = 5)
+ fun test(param: String) {
+ titleItem.title = param
+ }
+
+ @BusUtils.Bus(tag = TAG_BUS, priority = 1)
+ fun testSameTag(param: String) {
+ if (titleItem.title.toString() == TAG_BUS) {
+ titleItem.title = "${titleItem.title} * 2"
+ }
+ }
+
+ @BusUtils.Bus(tag = TAG_STICKY_BUS, sticky = true)
+ fun testSticky(callback: Callback) {
+ titleItem.title = callback.call()
+ }
+
+ @BusUtils.Bus(tag = TAG_IO, threadMode = BusUtils.ThreadMode.IO)
+ fun testIo() {
+ val currentThread = Thread.currentThread().toString()
+ ThreadUtils.runOnUiThread(Runnable {
+ titleItem.title = currentThread
+ })
+ }
+
+ companion object {
+ const val TAG_BASIC_TYPE = "tag_basic_type"
+ const val TAG_BUS = "tag_bus"
+ const val TAG_STICKY_BUS = "tag_sticky_bus"
+ const val TAG_IO = "tag_io"
+
+ fun start(context: Context) {
+ val starter = Intent(context, BusActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_bus
+ }
+
+ override fun bindItems(): List> {
+ return CollectionUtils.newArrayList(
+ titleItem,
+ CommonItemClick(R.string.bus_register) {
+ BusUtils.register(this)
+ },
+ CommonItemClick(R.string.bus_unregister) {
+ BusUtils.unregister(this)
+ },
+ CommonItemClick(R.string.bus_post) {
+ BusUtils.post(TAG_BUS, TAG_BUS)
+ },
+ CommonItemClick(R.string.bus_post_basic_type) {
+ BusUtils.post(TAG_BASIC_TYPE, Random(System.currentTimeMillis()).nextInt())
+ },
+ CommonItemClick(R.string.bus_post_sticky) {
+ BusUtils.postSticky(TAG_STICKY_BUS, object : Callback {
+ override fun call(): String {
+ return TAG_STICKY_BUS
+ }
+ })
+ },
+ CommonItemClick(R.string.bus_post_to_io_thread) {
+ BusUtils.post(TAG_IO)
+ },
+ CommonItemClick(R.string.bus_remove_sticky) {
+ BusUtils.removeSticky(TAG_STICKY_BUS)
+ },
+ CommonItemClick(R.string.bus_start_compare, true) {
+ BusCompareActivity.start(this)
+ }
+ )
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ BusUtils.removeSticky(TAG_STICKY_BUS)
+ BusUtils.unregister(this)
+ }
+}
+
+@Keep
+interface Callback {
+ fun call(): String
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt
new file mode 100644
index 0000000000..3064666c41
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt
@@ -0,0 +1,281 @@
+package com.blankj.utilcode.pkg.feature.bus
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.BusUtils
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ThreadUtils
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import java.util.*
+import java.util.concurrent.CopyOnWriteArrayList
+
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/07/14
+ * desc : demo about BusUtils
+ * ```
+ */
+class BusCompareActivity : CommonActivity() {
+
+ private val titleItem: CommonItemTitle = CommonItemTitle("", true)
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, BusCompareActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_bus
+ }
+
+ override fun bindItems(): List> {
+ return CollectionUtils.newArrayList(
+ titleItem,
+ CommonItemClick(R.string.bus_compare_register_10000_times) {
+ compareRegister10000Times()
+ },
+ CommonItemClick(R.string.bus_compare_post_to_1_subscriber_1000000_times) {
+ comparePostTo1Subscriber1000000Times()
+ },
+ CommonItemClick(R.string.bus_compare_post_to_100_subscriber_100000_times) {
+ comparePostTo100Subscribers100000Times()
+ },
+ CommonItemClick(R.string.bus_compare_unregister_10000_times) {
+ compareUnregister10000Times()
+ }
+ )
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ ThreadUtils.cancel(ThreadUtils.getCpuPool())
+ }
+
+ /**
+ * 注册 10000 个订阅者,共执行 10 次取平均值
+ */
+ private fun compareRegister10000Times() {
+ val eventBusTests = CopyOnWriteArrayList()
+ val busUtilsTests = CopyOnWriteArrayList()
+
+ compareWithEventBus("Register 10000 times.", 10, 10000, object : CompareCallback {
+ override fun runEventBus() {
+ val test = BusEvent()
+ EventBus.getDefault().register(test)
+ eventBusTests.add(test)
+ }
+
+ override fun runBusUtils() {
+ val test = BusEvent()
+ BusUtils.register(test)
+ busUtilsTests.add(test)
+ }
+
+ override fun restState() {
+ for (test in eventBusTests) {
+ EventBus.getDefault().unregister(test)
+ }
+ eventBusTests.clear()
+
+ for (test in busUtilsTests) {
+ BusUtils.unregister(test)
+ }
+ busUtilsTests.clear()
+ }
+ }, object : OnFinishCallback {
+ override fun onFinish() {
+ for (test in eventBusTests) {
+ EventBus.getDefault().unregister(test)
+ }
+ eventBusTests.clear()
+
+ for (test in busUtilsTests) {
+ BusUtils.unregister(test)
+ }
+ busUtilsTests.clear()
+ }
+ })
+ }
+
+ /**
+ * 向 1 个订阅者发送 * 1000000 次,共执行 10 次取平均值
+ */
+ private fun comparePostTo1Subscriber1000000Times() {
+ comparePostTemplate("Post to 1 subscriber 1000000 times.", 1, 1000000)
+ }
+
+ /**
+ * 向 100 个订阅者发送 * 100000 次,共执行 10 次取平均值
+ */
+ private fun comparePostTo100Subscribers100000Times() {
+ comparePostTemplate("Post to 100 subscribers 100000 times.", 100, 100000)
+ }
+
+ private fun comparePostTemplate(name: String, subscribeNum: Int, postTimes: Int) {
+ val tests = java.util.ArrayList()
+ for (i in 0 until subscribeNum) {
+ val test = BusEvent()
+ EventBus.getDefault().register(test)
+ BusUtils.register(test)
+ tests.add(test)
+ }
+
+ compareWithEventBus(name, 10, postTimes, object : CompareCallback {
+ override fun runEventBus() {
+ EventBus.getDefault().post("EventBus")
+ }
+
+ override fun runBusUtils() {
+ BusUtils.post("busUtilsFun", "BusUtils")
+ }
+
+ override fun restState() {
+
+ }
+ }, object : OnFinishCallback {
+ override fun onFinish() {
+ for (test in tests) {
+ EventBus.getDefault().unregister(test)
+ BusUtils.unregister(test)
+ }
+ }
+ })
+ }
+
+ /**
+ * 注销 10000 个订阅者,共执行 10 次取平均值
+ */
+ private fun compareUnregister10000Times() {
+ showLoading()
+ ThreadUtils.executeBySingle(object : ThreadUtils.SimpleTask>() {
+ override fun doInBackground(): List {
+ val tests = ArrayList()
+ for (i in 0..9999) {
+ val test = BusEvent()
+ EventBus.getDefault().register(test)
+ BusUtils.register(test)
+ tests.add(test)
+ }
+ return tests
+ }
+
+ override fun onSuccess(tests: List) {
+ compareWithEventBus("Unregister 10000 times.", 10, 1, object : CompareCallback {
+ override fun runEventBus() {
+ for (test in tests) {
+ EventBus.getDefault().unregister(test)
+ }
+ }
+
+ override fun runBusUtils() {
+ for (test in tests) {
+ BusUtils.unregister(test)
+ }
+ }
+
+ override fun restState() {
+ for (test in tests) {
+ EventBus.getDefault().register(test)
+ BusUtils.register(test)
+ }
+ }
+ }, object : OnFinishCallback {
+ override fun onFinish() {
+ for (test in tests) {
+ EventBus.getDefault().unregister(test)
+ BusUtils.unregister(test)
+ }
+ }
+ })
+ }
+ })
+ }
+
+ /**
+ * @param name 传入的测试函数名
+ * @param sampleSize 样本数
+ * @param times 每次执行的次数
+ * @param callback 比较的回调函数
+ * @param onFinishCallback 执行结束的回调
+ */
+ private fun compareWithEventBus(name: String, sampleSize: Int, times: Int,
+ callback: CompareCallback, onFinishCallback: OnFinishCallback) {
+ showLoading()
+ ThreadUtils.executeByCpu(object : ThreadUtils.Task() {
+ override fun doInBackground(): String {
+ val dur = Array(2) { LongArray(sampleSize) }
+ for (i in 0 until sampleSize) {
+ var cur = System.currentTimeMillis()
+ for (j in 0 until times) {
+ callback.runEventBus()
+ }
+ dur[0][i] = System.currentTimeMillis() - cur
+ cur = System.currentTimeMillis()
+ for (j in 0 until times) {
+ callback.runBusUtils()
+ }
+ dur[1][i] = System.currentTimeMillis() - cur
+ callback.restState()
+ }
+ var eventBusAverageTime: Long = 0
+ var busUtilsAverageTime: Long = 0
+ for (i in 0 until sampleSize) {
+ eventBusAverageTime += dur[0][i]
+ busUtilsAverageTime += dur[1][i]
+ }
+ return name +
+ "\nEventBusCostTime: " + eventBusAverageTime / sampleSize +
+ "\nBusUtilsCostTime: " + busUtilsAverageTime / sampleSize;
+ }
+
+ override fun onSuccess(result: String?) {
+ onFinishCallback.onFinish()
+ dismissLoading()
+ titleItem?.title = result
+ }
+
+ override fun onCancel() {
+ onFinishCallback.onFinish()
+ dismissLoading()
+ }
+
+ override fun onFail(t: Throwable?) {
+ onFinishCallback.onFinish()
+ dismissLoading()
+ }
+ })
+ }
+}
+
+interface CompareCallback {
+ fun runEventBus()
+
+ fun runBusUtils()
+
+ fun restState()
+}
+
+interface OnFinishCallback {
+ fun onFinish()
+}
+
+class BusEvent {
+ @Subscribe
+ fun eventBusFun(param: String) {
+ }
+
+ @BusUtils.Bus(tag = "busUtilsFun")
+ fun busUtilsFun(param: String) {
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clean/CleanActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clean/CleanActivity.kt
new file mode 100644
index 0000000000..f0b8620eca
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clean/CleanActivity.kt
@@ -0,0 +1,76 @@
+package com.blankj.utilcode.pkg.feature.clean
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CleanUtils
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.SDCardUtils
+import com.blankj.utilcode.util.SnackbarUtils
+import java.io.File
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/09/29
+ * desc : demo about CleanUtils
+ * ```
+ */
+class CleanActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, CleanActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_clean
+ }
+
+ override fun bindItems(): List> {
+ return CollectionUtils.newArrayList>().apply {
+ add(CommonItemClick(R.string.clean_internal_cache) {
+ showSnackbar(CleanUtils.cleanInternalCache(), cacheDir.path)
+ })
+ add(CommonItemClick(R.string.clean_internal_files) {
+ showSnackbar(CleanUtils.cleanInternalFiles(), filesDir.path)
+ })
+ add(CommonItemClick(R.string.clean_internal_databases) {
+ showSnackbar(CleanUtils.cleanInternalDbs(), filesDir.parent + File.separator + "databases")
+ })
+ add(CommonItemClick(R.string.clean_internal_sp) {
+ showSnackbar(CleanUtils.cleanInternalSp(), filesDir.parent + File.separator + "shared_prefs")
+ })
+ if (SDCardUtils.isSDCardEnableByEnvironment()) {
+ add(CommonItemClick(R.string.clean_external_cache) {
+ showSnackbar(CleanUtils.cleanExternalCache(), externalCacheDir?.absolutePath)
+ })
+ }
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
+ add(CommonItemClick(R.string.clean_app_user_data) {
+ CleanUtils.cleanAppUserData()
+ })
+ }
+ }
+ }
+
+ private fun showSnackbar(isSuccess: Boolean, path: String?) {
+ SnackbarUtils.with(mContentView)
+ .setDuration(SnackbarUtils.LENGTH_LONG)
+ .apply {
+ if (isSuccess) {
+ setMessage("clean \"$path\" dir successful.")
+ showSuccess()
+ } else {
+ setMessage("clean \"$path\" dir failed.")
+ showError()
+ }
+ }
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt
new file mode 100644
index 0000000000..7a6a112c15
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt
@@ -0,0 +1,115 @@
+package com.blankj.utilcode.pkg.feature.click
+
+import android.content.Context
+import android.content.Intent
+import android.view.View
+import android.widget.TextView
+import androidx.annotation.StringRes
+import com.blankj.base.rv.ItemViewHolder
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/09/29
+ * desc : demo about ClickUtils
+ * ```
+ */
+class ClickActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, ClickActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_click
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ ClickItem(R.string.click_view_scale_default, Utils.Consumer {
+ ClickUtils.applyPressedViewScale(it)
+ }),
+ ClickItem(R.string.click_view_scale_half, Utils.Consumer {
+ ClickUtils.applyPressedViewScale(it, -0.5f)
+ }),
+ ClickItem(R.string.click_view_alpha_default, Utils.Consumer {
+ ClickUtils.applyPressedViewAlpha(it)
+ }),
+ ClickItem(R.string.click_bg_alpha_default, Utils.Consumer {
+ ClickUtils.applyPressedBgAlpha(it, 0.6f)
+ }),
+ ClickItem(R.string.click_bg_dark_default, Utils.Consumer {
+ ClickUtils.applyPressedBgDark(it)
+ }),
+ ClickItem(R.string.click_single_debouncing, Utils.Consumer {
+ ClickUtils.applyPressedBgDark(it)
+ ClickUtils.applySingleDebouncing(it, 5000) {
+ SnackbarUtils.with(mContentView)
+ .setMessage(StringUtils.getString(R.string.click_single_tip))
+ .setBgColor(ColorUtils.getRandomColor(false))
+ .setDuration(SnackbarUtils.LENGTH_LONG)
+ .show()
+ }
+ }),
+ ClickItem(R.string.click_global_debouncing, Utils.Consumer {
+ ClickUtils.applyPressedBgDark(it)
+ ClickUtils.applySingleDebouncing(it, 5000) {
+ SnackbarUtils.with(mContentView)
+ .setMessage(StringUtils.getString(R.string.click_global_tip))
+ .setBgColor(ColorUtils.getRandomColor(false))
+ .setDuration(SnackbarUtils.LENGTH_LONG)
+ .show()
+ }
+ }),
+ ClickItem(R.string.click_multi, Utils.Consumer {
+ ClickUtils.applyPressedBgDark(it)
+ it.setOnClickListener(object : ClickUtils.OnMultiClickListener(5) {
+ override fun onTriggerClick(v: View) {
+ ToastUtils.showShort("onTriggerClick")
+ }
+
+ override fun onBeforeTriggerClick(v: View, count: Int) {
+ ToastUtils.showShort(count)
+ }
+ })
+ })
+ )
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ SnackbarUtils.dismiss()
+ }
+}
+
+class ClickItem : CommonItem {
+
+ private val mConsumer: Utils.Consumer;
+ private val mTitle: String
+
+ constructor(@StringRes title: Int, consumer: Utils.Consumer) : super(R.layout.common_item_title_click) {
+ mConsumer = consumer
+ mTitle = StringUtils.getString(title)
+ }
+
+ override fun bind(holder: ItemViewHolder, position: Int) {
+ super.bind(holder, position)
+ holder.findViewById(R.id.commonItemTitleTv).text = mTitle
+ holder.itemView.setOnClickListener() {
+ SnackbarUtils.with(it)
+ .setMessage(mTitle)
+ .setBgColor(ColorUtils.getRandomColor(false))
+ .setDuration(SnackbarUtils.LENGTH_LONG)
+ .show()
+ }
+ mConsumer.accept(holder.itemView)
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clipboard/ClipboardActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clipboard/ClipboardActivity.kt
new file mode 100644
index 0000000000..824fdf02ca
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clipboard/ClipboardActivity.kt
@@ -0,0 +1,76 @@
+package com.blankj.utilcode.pkg.feature.clipboard
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemSwitch
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.ClipboardUtils
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ToastUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2020/09/11
+ * desc : demo about ClipboardUtils
+ * ```
+ */
+class ClipboardActivity : CommonActivity() {
+
+ private var index: Int = 0
+ private var isAddListener: Boolean = false
+ private var listener = {
+ ToastUtils.showShort(ClipboardUtils.getText())
+ }
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, ClipboardActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_clipboard
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("getText", ClipboardUtils.getText()),
+ CommonItemTitle("getLabel", ClipboardUtils.getLabel()),
+ CommonItemClick("copyText: value{$index}").setOnItemClickListener { _, _, _ ->
+ ClipboardUtils.copyText("value{${index++}}")
+ itemsView.updateItems(bindItems())
+ },
+ CommonItemClick("clear").setOnItemClickListener { _, _, _ ->
+ ClipboardUtils.clear()
+ itemsView.updateItems(bindItems())
+ },
+ CommonItemSwitch("clipChangeListener", { isAddListener }, {
+ isAddListener = it
+ if (isAddListener) {
+ ClipboardUtils.addChangedListener(listener)
+ } else {
+ ClipboardUtils.removeChangedListener(listener)
+ }
+ })
+ )
+ }
+
+ override fun onResume() {
+ super.onResume()
+ itemsView.updateItems(bindItems())
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ if (isAddListener) {
+ ClipboardUtils.removeChangedListener(listener)
+ }
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/device/DeviceActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/device/DeviceActivity.kt
new file mode 100644
index 0000000000..d70fe14e93
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/device/DeviceActivity.kt
@@ -0,0 +1,56 @@
+package com.blankj.utilcode.pkg.feature.device
+
+import android.content.Context
+import android.content.Intent
+import android.os.Build
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.DeviceUtils
+import java.util.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/09/27
+ * desc : demo about DeviceUtils
+ * ```
+ */
+class DeviceActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, DeviceActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_device
+ }
+
+ override fun bindItems(): List> {
+ return arrayListOf>().apply {
+ add(CommonItemTitle("isRoot", DeviceUtils.isDeviceRooted().toString()))
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+ add(CommonItemTitle("isAdbEnabled", DeviceUtils.isAdbEnabled().toString()))
+ }
+ add(CommonItemTitle("getSDKVersionName", DeviceUtils.getSDKVersionName()))
+ add(CommonItemTitle("getSDKVersionCode", DeviceUtils.getSDKVersionCode().toString()))
+ add(CommonItemTitle("getAndroidID", DeviceUtils.getAndroidID()))
+ add(CommonItemTitle("getMacAddress", DeviceUtils.getMacAddress()))
+ add(CommonItemTitle("getManufacturer", DeviceUtils.getManufacturer()))
+ add(CommonItemTitle("getModel", DeviceUtils.getModel()))
+ add(CommonItemTitle("getABIs", Arrays.asList(*DeviceUtils.getABIs()).toString()))
+ add(CommonItemTitle("isTablet", DeviceUtils.isTablet().toString()))
+ add(CommonItemTitle("isEmulator", DeviceUtils.isEmulator().toString()))
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
+ add(CommonItemTitle("isDevelopmentSettingsEnabled", DeviceUtils.isDevelopmentSettingsEnabled().toString()))
+ }
+ add(CommonItemTitle("getUniqueDeviceId", DeviceUtils.getUniqueDeviceId("util")))
+ add(CommonItemTitle("isSameDevice", DeviceUtils.isSameDevice(DeviceUtils.getUniqueDeviceId()).toString()))
+ }
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/file/FileActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/file/FileActivity.kt
new file mode 100644
index 0000000000..de8220dd18
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/file/FileActivity.kt
@@ -0,0 +1,59 @@
+package com.blankj.utilcode.pkg.feature.file
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.Config.CACHE_PATH
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.FileUtils
+import com.blankj.utilcode.util.PathUtils
+import com.blankj.utilcode.util.SnackbarUtils
+import java.io.File
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/09/29
+ * desc : demo about FileUtils
+ * ```
+ */
+class FileActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, FileActivity::class.java)
+ context.startActivity(starter)
+ }
+
+ val TEST_FILE_PATH: String = CACHE_PATH + "test_file.txt"
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_file
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("isFileExists: " + PathUtils.getInternalAppFilesPath(), "" + FileUtils.isFileExists(PathUtils.getInternalAppFilesPath())),
+ CommonItemTitle("isFileExists: " + PathUtils.getExternalAppFilesPath(), "" + FileUtils.isFileExists(PathUtils.getExternalAppFilesPath())),
+ CommonItemTitle("isFileExists: " + PathUtils.getExternalStoragePath(), "" + FileUtils.isFileExists(PathUtils.getExternalStoragePath())),
+ CommonItemTitle("isFileExists: " + PathUtils.getDownloadCachePath(), "" + FileUtils.isFileExists(PathUtils.getDownloadCachePath())),
+ CommonItemTitle("isFileExists: " + PathUtils.getExternalDownloadsPath(), "" + FileUtils.isFileExists(PathUtils.getExternalDownloadsPath())),
+
+ CommonItemTitle("isFileExists: " + PathUtils.getInternalAppFilesPath(), "" + FileUtils.isFileExists(File(PathUtils.getInternalAppFilesPath()))),
+ CommonItemTitle("isFileExists: " + PathUtils.getExternalAppFilesPath(), "" + FileUtils.isFileExists(File(PathUtils.getExternalAppFilesPath()))),
+ CommonItemTitle("isFileExists: " + PathUtils.getExternalStoragePath(), "" + FileUtils.isFileExists(File(PathUtils.getExternalStoragePath()))),
+ CommonItemTitle("isFileExists: " + PathUtils.getDownloadCachePath(), "" + FileUtils.isFileExists(File(PathUtils.getDownloadCachePath()))),
+ CommonItemTitle("isFileExists: " + PathUtils.getExternalDownloadsPath(), "" + FileUtils.isFileExists(File(PathUtils.getExternalDownloadsPath())))
+ )
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ SnackbarUtils.dismiss()
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/flashlight/FlashlightActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/flashlight/FlashlightActivity.kt
new file mode 100644
index 0000000000..c5f602b9e3
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/flashlight/FlashlightActivity.kt
@@ -0,0 +1,64 @@
+package com.blankj.utilcode.pkg.feature.flashlight
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.helper.PermissionHelper
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemSwitch
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.constant.PermissionConstants
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2018/04/27
+ * desc : demo about FlashlightUtils
+ * ```
+ */
+class FlashlightActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ if (!FlashlightUtils.isFlashlightEnable()) {
+ ToastUtils.showLong("Didn't support flashlight.")
+ return
+ }
+ PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
+ override fun onGranted() {
+ val starter = Intent(context, FlashlightActivity::class.java)
+ context.startActivity(starter)
+ }
+
+ override fun onDenied() {
+ LogUtils.e("permission denied")
+ }
+ }, PermissionConstants.CAMERA)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_flashlight
+ }
+
+ override fun bindItems(): List> {
+ return CollectionUtils.newArrayList>().apply {
+ add(CommonItemTitle("isFlashlightEnable", FlashlightUtils.isFlashlightEnable().toString()))
+ if (FlashlightUtils.isFlashlightEnable()) {
+ add(CommonItemSwitch(
+ R.string.flashlight_status,
+ { FlashlightUtils.isFlashlightOn() },
+ { FlashlightUtils.setFlashlightStatus(it) }
+ ))
+ }
+ }
+ }
+
+ override fun onDestroy() {
+ FlashlightUtils.destroy()
+ super.onDestroy()
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ChildFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ChildFragment.kt
new file mode 100644
index 0000000000..a4b1450de5
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ChildFragment.kt
@@ -0,0 +1,81 @@
+package com.blankj.utilcode.pkg.feature.fragment
+
+import android.os.Bundle
+import android.view.View
+import androidx.fragment.app.FragmentManager
+import com.blankj.common.fragment.CommonFragment
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.pkg.helper.DialogHelper
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ColorUtils
+import com.blankj.utilcode.util.FragmentUtils
+import com.blankj.utilcode.util.SpanUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 17/02/02
+ * desc : demo about FragmentUtils
+ * ```
+ */
+class ChildFragment : CommonFragment() {
+
+ companion object {
+ fun newInstance(): ChildFragment {
+ val args = Bundle()
+ val fragment = ChildFragment()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private lateinit var fm: FragmentManager
+ private val mBgColor = ColorUtils.getRandomColor(false)
+
+ override fun bindLayout(): Int {
+ return R.layout.fragment_child
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ FragmentUtils.setBackgroundColor(this, mBgColor)
+ fm = fragmentManager!!
+ setCommonItems(findViewById(R.id.commonItemRv), getItems())
+ }
+
+ private fun getItems(): MutableList> {
+ return CollectionUtils.newArrayList>(
+ CommonItemClick(R.string.fragment_show_stack) {
+ DialogHelper.showFragmentDialog(
+ SpanUtils().appendLine("top: " + FragmentUtils.getSimpleName(FragmentUtils.getTop(fm)))
+ .appendLine("topInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopInStack(fm)))
+ .appendLine("topShow: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShow(fm)))
+ .appendLine("topShowInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShowInStack(fm)))
+ .appendLine()
+ .appendLine("---all of fragments---")
+ .appendLine(FragmentUtils.getAllFragments(fm).toString())
+ .appendLine("----------------------")
+ .appendLine()
+ .appendLine("---stack top---")
+ .appendLine(FragmentUtils.getAllFragmentsInStack(fm).toString())
+ .appendLine("---stack bottom---")
+ .create()
+ )
+ },
+ CommonItemClick(R.string.fragment_pop) {
+ FragmentUtils.pop(fm)
+ },
+ CommonItemClick(R.string.fragment_remove) {
+ FragmentUtils.remove(this)
+ },
+ SharedElementItem()
+ ).apply {
+ for (ci: CommonItem<*> in this) {
+ ci.backgroundColor = mBgColor
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
new file mode 100644
index 0000000000..e21eb521fb
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
@@ -0,0 +1,178 @@
+package com.blankj.utilcode.pkg.feature.fragment
+
+import android.os.Build
+import android.os.Bundle
+import android.transition.*
+import android.view.View
+import android.widget.ImageView
+import androidx.annotation.RequiresApi
+import androidx.fragment.app.FragmentManager
+import com.blankj.base.rv.ItemViewHolder
+import com.blankj.common.fragment.CommonFragment
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.pkg.helper.DialogHelper
+import com.blankj.utilcode.util.*
+import java.util.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 17/02/02
+ * desc : demo about FragmentUtils
+ * ```
+ */
+class ContainerFragment : CommonFragment(), FragmentUtils.OnBackClickListener {
+
+ companion object {
+ fun newInstance(): ContainerFragment {
+ val args = Bundle()
+ val fragment = ContainerFragment()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private lateinit var fm: FragmentManager
+ private val mBgColor = ColorUtils.getRandomColor(false)
+
+ override fun bindLayout(): Int {
+ return R.layout.fragment_container
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ mContentView.setBackgroundColor(mBgColor)
+ fm = fragmentManager!!
+ setCommonItems(findViewById(R.id.commonItemRv), getItems())
+ }
+
+ private fun getItems(): ArrayList>? {
+ val item = SharedElementItem()
+ return CollectionUtils.newArrayList>(
+ CommonItemClick(R.string.fragment_show_stack) {
+ DialogHelper.showFragmentDialog(
+ SpanUtils().appendLine("top: " + FragmentUtils.getSimpleName(FragmentUtils.getTop(fm)))
+ .appendLine("topInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopInStack(fm)))
+ .appendLine("topShow: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShow(fm)))
+ .appendLine("topShowInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShowInStack(fm)))
+ .appendLine()
+ .appendLine("---all of fragments---")
+ .appendLine(FragmentUtils.getAllFragments(fm).toString())
+ .appendLine("----------------------")
+ .appendLine()
+ .appendLine("---stack top---")
+ .appendLine(FragmentUtils.getAllFragmentsInStack(fm).toString())
+ .appendLine("---stack bottom---")
+ .create()
+ )
+ },
+ CommonItemClick(R.string.fragment_add_child) {
+ FragmentUtils.add(
+ fm,
+ ChildFragment.newInstance(),
+ id
+ )
+ },
+ CommonItemClick(R.string.fragment_add_child_stack) {
+ FragmentUtils.add(
+ fm,
+ ChildFragment.newInstance(),
+ id,
+ false,
+ true
+ )
+ },
+ CommonItemClick(R.string.fragment_add_hide) {
+ FragmentUtils.add(
+ fm,
+ ChildFragment.newInstance(),
+ id,
+ true
+ )
+ },
+ CommonItemClick(R.string.fragment_add_hide_stack) {
+ FragmentUtils.add(
+ fm,
+ ChildFragment.newInstance(),
+ id,
+ true,
+ true
+ )
+ },
+ CommonItemClick(R.string.fragment_add_demo1_show) {
+ FragmentUtils.add(
+ fm,
+ addSharedElement(ChildFragment.newInstance()),
+ id,
+ false,
+ false
+ )
+ },
+ CommonItemClick(R.string.fragment_pop_to_root) {
+ FragmentUtils.popTo(
+ fm,
+ ChildFragment::class.java,
+ true
+ )
+ },
+ CommonItemClick(R.string.fragment_hide_demo0_show_demo1) {
+ val fragment1 = FragmentUtils.findFragment(fm, ChildFragment::class.java)
+ if (fragment1 != null) {
+ FragmentUtils.showHide(this, fragment1)
+ } else {
+ ToastUtils.showLong("please add demo1 first!")
+ }
+ },
+ CommonItemClick(R.string.fragment_replace) {
+ FragmentUtils.replace(
+ fm,
+ addSharedElement(ChildFragment.newInstance()),
+ id,
+ true,
+ item.element
+ )
+ },
+ item
+ ).apply {
+ for (ci: CommonItem<*> in this) {
+ ci.backgroundColor = mBgColor
+ }
+ }
+ }
+
+ private fun addSharedElement(fragment: androidx.fragment.app.Fragment): androidx.fragment.app.Fragment {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ fragment.sharedElementEnterTransition = DetailTransition()
+ fragment.enterTransition = Fade()
+ fragment.sharedElementReturnTransition = DetailTransition()
+ }
+ return fragment
+ }
+
+ override fun onBackClick(): Boolean {
+ return false
+ }
+}
+
+class SharedElementItem : CommonItem {
+
+ lateinit var element: ImageView;
+
+ constructor() : super(R.layout.fragment_item_shared_element)
+
+ override fun bind(holder: ItemViewHolder, position: Int) {
+ super.bind(holder, position)
+ element = holder.findViewById(R.id.fragmentRootSharedElementIv)
+ }
+}
+
+@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
+class DetailTransition() : TransitionSet() {
+ init {
+ ordering = ORDERING_TOGETHER
+ addTransition(ChangeBounds()).addTransition(ChangeTransform()).addTransition(ChangeImageTransform())
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
new file mode 100644
index 0000000000..5b337e48d5
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
@@ -0,0 +1,91 @@
+package com.blankj.utilcode.pkg.feature.fragment
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.os.PersistableBundle
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import androidx.fragment.app.Fragment
+import android.view.View
+import com.blankj.common.activity.CommonActivity
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.FragmentUtils
+import kotlinx.android.synthetic.main.fragment_activity.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 17/02/01
+ * desc : demo about FragmentUtils
+ * ```
+ */
+class FragmentActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, FragmentActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ private val mFragments = arrayListOf()
+ private var curIndex: Int = 0
+
+ private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
+ when (item.itemId) {
+ R.id.fragmentNavigation0 -> {
+ showCurrentFragment(0)
+ return@OnNavigationItemSelectedListener true
+ }
+ R.id.fragmentNavigation1 -> {
+ showCurrentFragment(1)
+ return@OnNavigationItemSelectedListener true
+ }
+ R.id.fragmentNavigation2 -> {
+ showCurrentFragment(2)
+ return@OnNavigationItemSelectedListener true
+ }
+ else -> false
+ }
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.fragment_activity
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ if (savedInstanceState != null) {
+ curIndex = savedInstanceState.getInt("curIndex")
+ }
+ fragmentNav.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
+
+ mFragments.add(RootFragment.newInstance())
+ mFragments.add(RootFragment.newInstance())
+ mFragments.add(RootFragment.newInstance())
+ FragmentUtils.add(
+ supportFragmentManager,
+ mFragments,
+ R.id.fragmentContainer,
+ arrayOf("RootFragment0", "RootFragment1", "RootFragment2"),
+ curIndex
+ )
+ }
+
+ override fun onBackPressed() {
+ if (!FragmentUtils.dispatchBackPress(mFragments[curIndex])) {
+ super.onBackPressed()
+ }
+ }
+
+ private fun showCurrentFragment(index: Int) {
+ curIndex = index
+ FragmentUtils.showHide(index, mFragments)
+ }
+
+ override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle) {
+ super.onSaveInstanceState(outState, outPersistentState)
+ outState.putInt("curIndex", curIndex)
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/RootFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/RootFragment.kt
new file mode 100644
index 0000000000..d2a9ac7bab
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/RootFragment.kt
@@ -0,0 +1,54 @@
+package com.blankj.utilcode.pkg.feature.fragment
+
+import android.os.Bundle
+import android.view.View
+import com.blankj.common.fragment.CommonFragment
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.BarUtils
+import com.blankj.utilcode.util.ColorUtils
+import com.blankj.utilcode.util.FragmentUtils
+import kotlinx.android.synthetic.main.fragment_root.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 17/02/02
+ * desc : demo about FragmentUtils
+ * ```
+ */
+class RootFragment : CommonFragment(), FragmentUtils.OnBackClickListener {
+
+ companion object {
+ fun newInstance(): RootFragment {
+ val args = Bundle()
+ val fragment = RootFragment()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.fragment_root
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ BarUtils.setStatusBarColor(rootFragmentFakeStatusBar, ColorUtils.getColor(R.color.colorPrimary))
+ FragmentUtils.add(
+ childFragmentManager,
+ ContainerFragment.newInstance(),
+ R.id.rootFragmentContainer
+ )
+ }
+
+ override fun onBackClick(): Boolean {
+ if (FragmentUtils.dispatchBackPress(childFragmentManager)) return true
+ return if (childFragmentManager.backStackEntryCount == 0) {
+ false
+ } else {
+ childFragmentManager.popBackStack()
+ true
+ }
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
new file mode 100644
index 0000000000..995bbb22c1
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
@@ -0,0 +1,206 @@
+package com.blankj.utilcode.pkg.feature.image
+
+import android.content.Context
+import android.content.Intent
+import android.graphics.Bitmap
+import android.graphics.Color
+import android.os.Build
+import android.os.Bundle
+import android.view.View
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.helper.PermissionHelper
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemImage
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.constant.PermissionConstants
+import com.blankj.utilcode.pkg.Config
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.*
+import java.io.File
+import java.util.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/09/26
+ * desc : demo about ImageUtils
+ * ```
+ */
+class ImageActivity : CommonActivity() {
+
+ private val savePath = Config.CACHE_PATH + "lena.jpg"
+ private val titleItem: CommonItemTitle = CommonItemTitle("isImage: $savePath", "");
+
+ companion object {
+ fun start(context: Context) {
+ PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
+ override fun onGranted() {
+ val starter = Intent(context, ImageActivity::class.java)
+ context.startActivity(starter)
+ }
+
+ override fun onDenied() {
+ }
+ }, PermissionConstants.STORAGE)
+ }
+ }
+
+ private val bgTask: ThreadUtils.SimpleTask>> = object : ThreadUtils.SimpleTask>>() {
+ override fun doInBackground(): List> {
+ return bindItems()
+ }
+
+ override fun onSuccess(result: List>) {
+ dismissLoading()
+ itemsView.updateItems(result)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_image
+ }
+
+ override fun bindItems(): ArrayList> {
+ if (ThreadUtils.isMainThread()) return arrayListOf()
+ val src = ImageUtils.getBitmap(R.drawable.image_lena)
+ val round = ImageUtils.getBitmap(R.drawable.common_avatar_round)
+ val watermark = ImageUtils.getBitmap(R.mipmap.ic_launcher)
+
+ val width = src.width
+ val height = src.height
+
+ titleItem.setContent(ImageUtils.isImage(savePath).toString())
+
+ return CollectionUtils.newArrayList>().apply {
+ add(titleItem)
+ add(CommonItemClick("Save to $savePath") {
+ ThreadUtils.executeBySingle(object : ThreadUtils.SimpleTask() {
+ override fun doInBackground(): Boolean {
+ return ImageUtils.save(src, savePath, Bitmap.CompressFormat.JPEG)
+ }
+
+ override fun onSuccess(result: Boolean) {
+ titleItem.setContent(ImageUtils.isImage(savePath).toString())
+ titleItem.update()
+ SnackbarUtils.with(mContentView)
+ .setDuration(SnackbarUtils.LENGTH_LONG)
+ .apply {
+ if (result) {
+ setMessage("save successful.")
+ .showSuccess(true)
+ } else {
+ setMessage("save failed.")
+ .showError(true)
+ }
+ }
+ }
+ })
+ })
+ add(CommonItemClick("Save to Album") {
+ ThreadUtils.executeBySingle(object : ThreadUtils.SimpleTask() {
+ override fun doInBackground(): File? {
+ return ImageUtils.save2Album(src, Bitmap.CompressFormat.JPEG)
+ }
+
+ override fun onSuccess(result: File?) {
+ SnackbarUtils.with(mContentView)
+ .setDuration(SnackbarUtils.LENGTH_LONG)
+ .apply {
+ if (result != null) {
+ setMessage("save successful.")
+ .showSuccess(true)
+ } else {
+ setMessage("save failed.")
+ .showError(true)
+ }
+ }
+ }
+ })
+ })
+ add(CommonItemImage(R.string.image_src) {
+ it.setImageBitmap(src)
+ })
+ add(CommonItemImage(R.string.image_add_color) {
+ it.setImageBitmap(ImageUtils.drawColor(src, Color.parseColor("#8000FF00")))
+ })
+ add(CommonItemImage(R.string.image_scale) {
+ it.setImageBitmap(ImageUtils.scale(src, width / 2, height / 2))
+ })
+ add(CommonItemImage(R.string.image_clip) {
+ it.setImageBitmap(ImageUtils.clip(src, 0, 0, width / 2, height / 2))
+ })
+ add(CommonItemImage(R.string.image_skew) {
+ it.setImageBitmap(ImageUtils.skew(src, 0.2f, 0.1f))
+ })
+ add(CommonItemImage(R.string.image_rotate) {
+ it.setImageBitmap(ImageUtils.rotate(src, 90, (width / 2).toFloat(), (height / 2).toFloat()))
+ })
+ add(CommonItemImage(R.string.image_to_round) {
+ it.setImageBitmap(ImageUtils.toRound(src))
+ })
+ add(CommonItemImage(R.string.image_to_round_border) {
+ it.setImageBitmap(ImageUtils.toRound(src, 16, Color.GREEN))
+ })
+ add(CommonItemImage(R.string.image_to_round_corner) {
+ it.setImageBitmap(ImageUtils.toRoundCorner(src, 80f))
+ })
+ add(CommonItemImage(R.string.image_to_round_corner_border) {
+ it.setImageBitmap(ImageUtils.toRoundCorner(src, 80f, 16f, Color.GREEN))
+ })
+ add(CommonItemImage(R.string.image_to_round_corner_border) {
+ it.setImageBitmap(ImageUtils.toRoundCorner(src, floatArrayOf(0f, 0f, 80f, 80f, 0f, 0f, 80f, 80f), 16f, Color.GREEN))
+ })
+ add(CommonItemImage(R.string.image_add_corner_border) {
+ it.setImageBitmap(ImageUtils.addCornerBorder(src, 16f, Color.GREEN, 80f))
+ })
+ add(CommonItemImage(R.string.image_add_corner_border) {
+ it.setImageBitmap(ImageUtils.addCornerBorder(src, 16f, Color.GREEN, floatArrayOf(0f, 0f, 80f, 80f, 0f, 0f, 80f, 80f)))
+ })
+ add(CommonItemImage(R.string.image_add_circle_border) {
+ it.setImageBitmap(ImageUtils.addCircleBorder(src, 16f, Color.GREEN))
+ })
+ add(CommonItemImage(R.string.image_add_reflection) {
+ it.setImageBitmap(ImageUtils.addReflection(src, 80))
+ })
+ add(CommonItemImage(R.string.image_add_text_watermark) {
+ it.setImageBitmap(ImageUtils.addTextWatermark(src, "blankj", 40, Color.GREEN, 0f, 0f))
+ })
+ add(CommonItemImage(R.string.image_add_image_watermark) {
+ it.setImageBitmap(ImageUtils.addImageWatermark(src, watermark, 0, 0, 0x88))
+ })
+ add(CommonItemImage(R.string.image_to_gray) {
+ it.setImageBitmap(ImageUtils.toGray(src))
+ })
+ add(CommonItemImage(R.string.image_fast_blur) {
+ it.setImageBitmap(ImageUtils.fastBlur(src, 0.1f, 5f))
+ })
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+ add(CommonItemImage(R.string.image_render_script_blur) {
+ it.setImageBitmap(ImageUtils.renderScriptBlur(src, 10f))
+ })
+ }
+ add(CommonItemImage(R.string.image_stack_blur) {
+ it.setImageBitmap(ImageUtils.stackBlur(src, 10))
+ })
+ add(CommonItemImage(R.string.image_compress_by_scale) {
+ it.setImageBitmap(ImageUtils.compressByScale(src, 0.5f, 0.5f))
+ })
+ add(CommonItemImage(R.string.image_compress_by_sample_size) {
+ it.setImageBitmap(ImageUtils.compressBySampleSize(src, 2))
+ })
+ }
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ showLoading()
+ ThreadUtils.executeByIo(bgTask)
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ ThreadUtils.cancel(bgTask)
+ }
+}
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/intent/IntentActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/intent/IntentActivity.kt
new file mode 100644
index 0000000000..06650d0b45
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/intent/IntentActivity.kt
@@ -0,0 +1,77 @@
+package com.blankj.utilcode.pkg.feature.intent
+
+import android.content.Context
+import android.content.Intent
+import android.graphics.Bitmap
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.utilcode.pkg.Config
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.*
+import java.util.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2020/05/29
+ * desc : demo about IntentUtils
+ * ```
+ */
+class IntentActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, IntentActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_intent
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemClick("LaunchApp") {
+ startActivity(IntentUtils.getLaunchAppIntent(packageName))
+ },
+ CommonItemClick("LaunchAppDetailsSettings") {
+ startActivityForResult(IntentUtils.getLaunchAppDetailsSettingsIntent(packageName), 1)
+ },
+ CommonItemClick("ShareText") {
+ startActivity(IntentUtils.getShareTextIntent("share content"))
+ },
+ CommonItemClick("ShareImage") {
+ startActivity(IntentUtils.getShareImageIntent(getShareImagePath()[0]));
+ },
+ CommonItemClick("ShareTextImage") {
+ startActivity(IntentUtils.getShareTextImageIntent("share content", getShareImagePath()[0]));
+ },
+ CommonItemClick("ShareImages") {
+ startActivity(IntentUtils.getShareImageIntent(getShareImagePath()));
+ },
+ CommonItemClick("ShareTextImages") {
+ startActivity(IntentUtils.getShareTextImageIntent("share content", getShareImagePath()));
+ }
+ )
+ }
+
+ private fun getShareImagePath(): LinkedList {
+ val shareImagePath0 = Config.CACHE_PATH + "share.jpg"
+ if (!FileUtils.isFile(shareImagePath0)) {
+ ImageUtils.save(ImageUtils.getBitmap(R.drawable.image_lena), shareImagePath0, Bitmap.CompressFormat.JPEG)
+ }
+ val shareImagePath1 = Config.CACHE_PATH + "cheetah.jpg"
+ if (!FileUtils.isFile(shareImagePath1)) {
+ ImageUtils.save(ImageUtils.getBitmap(R.drawable.span_cheetah), shareImagePath1, Bitmap.CompressFormat.JPEG)
+ }
+ return CollectionUtils.newLinkedList(shareImagePath0, shareImagePath1)
+ }
+
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ super.onActivityResult(requestCode, resultCode, data)
+ LogUtils.d("onActivityResult() called with: requestCode = $requestCode, resultCode = $resultCode, data = $data")
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt
new file mode 100644
index 0000000000..5ed25ae4fe
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt
@@ -0,0 +1,73 @@
+package com.blankj.utilcode.pkg.feature.keyboard
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.pkg.helper.DialogHelper
+import com.blankj.utilcode.util.*
+import kotlinx.android.synthetic.main.keyboard_activity.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/09/27
+ * desc : demo about KeyboardUtils
+ * ```
+ */
+class KeyboardActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, KeyboardActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ private var titleItem: CommonItemTitle = CommonItemTitle("", true)
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_keyboard
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.keyboard_activity
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ KeyboardUtils.fixAndroidBug5497(this)
+ setCommonItems(findViewById(R.id.commonItemRv), getItems())
+ KeyboardUtils.registerSoftInputChangedListener(this) { height ->
+ titleItem.title = "isSoftInputVisible: " + KeyboardUtils.isSoftInputVisible(this@KeyboardActivity) + "\nkeyboardHeight: $height"
+ if (height > 0) {
+ keyboardEt.requestFocus()
+ }
+ }
+ }
+
+ private fun getItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ titleItem,
+ CommonItemClick(R.string.keyboard_hide_soft_input) {
+ KeyboardUtils.hideSoftInput(this)
+ },
+ CommonItemClick(R.string.keyboard_show_soft_input) {
+ KeyboardUtils.showSoftInput(this)
+ },
+ CommonItemClick(R.string.keyboard_toggle_soft_input) {
+ KeyboardUtils.toggleSoftInput()
+ },
+ CommonItemClick(R.string.keyboard_show_dialog) {
+ keyboardEt.clearFocus()
+ DialogHelper.showKeyboardDialog(this)
+ }
+ )
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt
new file mode 100644
index 0000000000..c928da21fa
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt
@@ -0,0 +1,73 @@
+package com.blankj.utilcode.pkg.feature.language
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemSwitch
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.LanguageUtils
+import com.blankj.utilcode.util.SPStaticUtils
+import com.blankj.utilcode.util.StringUtils
+import java.util.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2018/12/29
+ * desc : demo about VibrateUtils
+ * ```
+ */
+class LanguageActivity : CommonActivity() {
+
+ companion object {
+
+ const val SP_KEY_IS_RELAUNCH_APP = "SP_KEY_IS_RELAUNCH_APP"
+
+ fun start(context: Context) {
+ val starter = Intent(context, LanguageActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_language
+ }
+
+ override fun bindItems(): List> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("isAppliedLanguage", LanguageUtils.isAppliedLanguage().toString()),
+ CommonItemTitle("isAppliedLanguage(SIMPLIFIED_CHINESE)", LanguageUtils.isAppliedLanguage(Locale.SIMPLIFIED_CHINESE).toString()),
+ CommonItemTitle("getAppliedLanguage", (LanguageUtils.getAppliedLanguage() ?: "null").toString()),
+ CommonItemTitle("getActivityContextLanguage", LanguageUtils.getContextLanguage(this).toString()),
+ CommonItemTitle("getAppContextLanguage", LanguageUtils.getAppContextLanguage().toString()),
+ CommonItemTitle("getSystemLanguage", LanguageUtils.getSystemLanguage().toString()),
+ CommonItemSwitch(
+ StringUtils.getString(R.string.language_relaunch_app),
+ { isRelaunchApp() },
+ { SPStaticUtils.put(SP_KEY_IS_RELAUNCH_APP, it) }
+ ),
+ CommonItemClick(R.string.language_apply_simple_chinese) {
+ LanguageUtils.applyLanguage(Locale.SIMPLIFIED_CHINESE, isRelaunchApp())
+ },
+ CommonItemClick(R.string.language_apply_american) {
+ LanguageUtils.applyLanguage(Locale.US, isRelaunchApp())
+ },
+ CommonItemClick(R.string.language_apply_english) {
+ LanguageUtils.applyLanguage(Locale.ENGLISH, isRelaunchApp())
+ },
+ CommonItemClick(R.string.language_apply_arabic) {
+ LanguageUtils.applyLanguage(Locale("ar"), isRelaunchApp())
+ },
+ CommonItemClick(R.string.language_apply_system) {
+ LanguageUtils.applySystemLanguage(isRelaunchApp())
+ }
+ )
+ }
+
+ private fun isRelaunchApp() = SPStaticUtils.getBoolean(SP_KEY_IS_RELAUNCH_APP)
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/log/LogActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/log/LogActivity.kt
new file mode 100644
index 0000000000..096df003e4
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/log/LogActivity.kt
@@ -0,0 +1,270 @@
+package com.blankj.utilcode.pkg.feature.log
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.util.Log
+import com.blankj.base.BaseApplication
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemSwitch
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.*
+import java.io.File
+import java.util.*
+
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2017/03/22
+ * desc : demo about LogUtils
+ * ```
+ */
+class LogActivity : CommonActivity() {
+
+ companion object {
+ private const val TAG = "CMJ"
+ private const val JSON = "{\"tools\": [{ \"name\":\"css format\" , \"site\":\"http://tools.w3cschool.cn/code/css\" },{ \"name\":\"JSON format\" , \"site\":\"http://tools.w3cschool.cn/code/JSON\" },{ \"name\":\"pwd check\" , \"site\":\"http://tools.w3cschool.cn/password/my_password_safe\" }]}"
+ private const val XML = "Jack Herrington PHP Hacks O'Reilly Jack Herrington Podcasting Hacks O'Reilly "
+ private val ONE_D_ARRAY = intArrayOf(1, 2, 3)
+ private val TWO_D_ARRAY = arrayOf(intArrayOf(1, 2, 3), intArrayOf(4, 5, 6), intArrayOf(7, 8, 9))
+ private val THROWABLE = NullPointerException()
+ private val BUNDLE = Bundle()
+ private val INTENT = Intent()
+ private val LIST = ArrayList()
+ private val MAP = HashMap()
+
+ private val LONG_STR: String
+
+ init {
+ val sb = StringBuilder()
+ sb.append("len = 10400\ncontent = \"")
+ for (i in 0..1024) {
+ sb.append("Hello world. ")
+ }
+ sb.append("\"")
+ LONG_STR = sb.toString()
+
+ BUNDLE.putByte("byte", (-1).toByte())
+ BUNDLE.putChar("char", 'c')
+ BUNDLE.putCharArray("charArray", charArrayOf('c', 'h', 'a', 'r', 'A', 'r', 'r', 'a', 'y'))
+ BUNDLE.putCharSequence("charSequence", "charSequence")
+ BUNDLE.putCharSequenceArray("charSequenceArray", arrayOf("char", "Sequence", "Array"))
+ BUNDLE.putBundle("bundle", BUNDLE)
+ BUNDLE.putBoolean("boolean", true)
+ BUNDLE.putInt("int", 1)
+ BUNDLE.putFloat("float", 1f)
+ BUNDLE.putLong("long", 1L)
+ BUNDLE.putShort("short", 1.toShort())
+
+ INTENT.action = "LogUtils action"
+ INTENT.addCategory("LogUtils category")
+ INTENT.data = Uri.parse("intent data")
+ INTENT.type = "intent type"
+ INTENT.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ INTENT.setPackage(AppUtils.getAppPackageName())
+ INTENT.component = ComponentName(AppUtils.getAppPackageName(), LogActivity::class.java.toString())
+ INTENT.putExtra("int", 1)
+ INTENT.putExtra("float", 1f)
+ INTENT.putExtra("char", 'c')
+ INTENT.putExtra("string", "string")
+ INTENT.putExtra("intArray", ONE_D_ARRAY)
+ val list = ArrayList()
+ list.add("ArrayList")
+ list.add("is")
+ list.add("serializable")
+ INTENT.putExtra("serializable", list)
+ INTENT.putExtra("bundle", BUNDLE)
+
+ LIST.add("hello")
+ LIST.add("log")
+ LIST.add("utils")
+
+ MAP["name"] = "AndroidUtilCode"
+ MAP["class"] = "LogUtils"
+ }
+
+ fun start(context: Context) {
+ val starter = Intent(context, LogActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ private val mConfig = LogUtils.getConfig()
+
+ private val mRunnable = Runnable {
+ LogUtils.v("verbose")
+ LogUtils.d("debug")
+ LogUtils.i("info")
+ LogUtils.w("warn")
+ LogUtils.e("error")
+ LogUtils.a("assert")
+ }
+
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_log
+ }
+
+ override fun bindItems(): List> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("getLogFiles", LogUtils.getLogFiles().toString()),
+ CommonItemSwitch(
+ R.string.log_switch,
+ { mConfig.isLogSwitch },
+ { mConfig.isLogSwitch = it }
+ ),
+ CommonItemSwitch(
+ R.string.log_console_switch,
+ { mConfig.isLog2ConsoleSwitch },
+ { mConfig.setConsoleSwitch(it) }
+ ),
+ CommonItemSwitch(
+ R.string.log_console_listener_switch,
+ { mConfig.haveSetOnConsoleOutputListener() },
+ { mConfig.setOnConsoleOutputListener { type, tag, content -> Log.println(type, tag, content) } }
+ ),
+ CommonItemClick("Global Tag", if (mConfig.globalTag == "") "null" else mConfig.globalTag).setOnClickUpdateContentListener {
+ if (StringUtils.isSpace(mConfig.globalTag)) {
+ mConfig.globalTag = TAG
+ } else {
+ mConfig.globalTag = ""
+ }
+ return@setOnClickUpdateContentListener if (mConfig.globalTag == "") "\"\"" else mConfig.globalTag
+ },
+ CommonItemSwitch(
+ R.string.log_head_switch,
+ { mConfig.isLogHeadSwitch },
+ { mConfig.isLogHeadSwitch = it }
+ ),
+ CommonItemSwitch(
+ R.string.log_file_switch,
+ { mConfig.isLog2FileSwitch },
+ { mConfig.isLog2FileSwitch = it }
+ ),
+ CommonItemSwitch(
+ R.string.log_file_listener_switch,
+ { mConfig.haveSetOnFileOutputListener() },
+ { mConfig.setOnFileOutputListener { filePath, content -> Log.d("LogActivity", filePath + "\n" + content) } }
+ ),
+ CommonItemClick("Dir", mConfig.dir).setOnClickUpdateContentListener {
+ if (mConfig.dir != mConfig.defaultDir) {
+ mConfig.dir = mConfig.defaultDir
+ } else {
+ mConfig.setDir(File(PathUtils.getExternalAppFilesPath(), "log"))
+ }
+ return@setOnClickUpdateContentListener mConfig.dir
+ },
+ CommonItemSwitch(
+ R.string.log_border_switch,
+ { mConfig.isLogBorderSwitch },
+ { mConfig.setBorderSwitch(it) }
+ ),
+ CommonItemSwitch(
+ R.string.log_single_tag_switch,
+ { mConfig.isSingleTagSwitch },
+ { mConfig.setSingleTagSwitch(it) }
+ ),
+ CommonItemSwitch(
+ R.string.log_single_tag_switch,
+ { mConfig.isSingleTagSwitch },
+ { mConfig.setSingleTagSwitch(it) }
+ ),
+ CommonItemClick("ConsoleFilter", mConfig.consoleFilter.toString()).setOnClickUpdateContentListener {
+ mConfig.setConsoleFilter(if (mConfig.consoleFilter == 'V') LogUtils.W else LogUtils.V)
+ return@setOnClickUpdateContentListener mConfig.consoleFilter.toString()
+ },
+ CommonItemClick("FileFilter", mConfig.fileFilter.toString()).setOnClickUpdateContentListener {
+ mConfig.setFileFilter(if (mConfig.fileFilter == 'V') LogUtils.W else LogUtils.V)
+ return@setOnClickUpdateContentListener mConfig.fileFilter.toString()
+ },
+ CommonItemClick(R.string.log_with_no_tag) {
+ LogUtils.v("verbose")
+ LogUtils.d("debug")
+ LogUtils.i("info")
+ LogUtils.w("warn")
+ LogUtils.e("error")
+ LogUtils.a("assert")
+ },
+ CommonItemClick(R.string.log_with_tag) {
+ LogUtils.vTag("customTag", "verbose")
+ LogUtils.dTag("customTag", "debug")
+ LogUtils.iTag("customTag", "info")
+ LogUtils.wTag("customTag", "warn")
+ LogUtils.eTag("customTag", "error")
+ LogUtils.aTag("customTag", "assert")
+ },
+ CommonItemClick(R.string.log_in_new_thread) {
+ val thread = Thread(mRunnable)
+ thread.start()
+ },
+ CommonItemClick(R.string.log_null) {
+ LogUtils.v(null)
+ LogUtils.d(null)
+ LogUtils.i(null)
+ LogUtils.w(null)
+ LogUtils.e(null)
+ LogUtils.a(null)
+ },
+ CommonItemClick(R.string.log_many_params) {
+ LogUtils.v("verbose0", "verbose1")
+ LogUtils.vTag("customTag", "verbose0", "verbose1")
+ LogUtils.d("debug0", "debug1")
+ LogUtils.dTag("customTag", "debug0", "debug1")
+ LogUtils.i("info0", "info1")
+ LogUtils.iTag("customTag", "info0", "info1")
+ LogUtils.w("warn0", "warn1")
+ LogUtils.wTag("customTag", "warn0", "warn1")
+ LogUtils.e("error0", "error1")
+ LogUtils.eTag("customTag", "error0", "error1")
+ LogUtils.a("assert0", "assert1")
+ LogUtils.aTag("customTag", "assert0", "assert1")
+ },
+ CommonItemClick(R.string.log_long_string) {
+ LogUtils.d(LONG_STR)
+ },
+ CommonItemClick(R.string.log_to_file) {
+ LogUtils.file("test0 log to file")
+ LogUtils.file(LogUtils.I, "test0 log to file")
+ },
+ CommonItemClick(R.string.log_json) {
+ LogUtils.json(JSON)
+ LogUtils.json(LogUtils.I, JSON)
+ },
+ CommonItemClick(R.string.log_xml) {
+ LogUtils.xml(XML)
+ LogUtils.xml(LogUtils.I, XML)
+ },
+ CommonItemClick(R.string.log_array) {
+ LogUtils.e(ONE_D_ARRAY)
+ LogUtils.e(TWO_D_ARRAY)
+ },
+ CommonItemClick(R.string.log_throwable) {
+ LogUtils.e(THROWABLE)
+ },
+ CommonItemClick(R.string.log_bundle) {
+ LogUtils.e(BUNDLE)
+ },
+ CommonItemClick(R.string.log_intent) {
+ LogUtils.e(INTENT)
+ },
+ CommonItemClick(R.string.log_array_list) {
+ LogUtils.e(LIST)
+ },
+ CommonItemClick(R.string.log_map) {
+ LogUtils.e(MAP)
+ }
+ )
+ }
+
+ override fun onDestroy() {
+ BaseApplication.getInstance().initLog()
+ super.onDestroy()
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/messenger/MessengerActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/messenger/MessengerActivity.kt
new file mode 100644
index 0000000000..3d00af0e1a
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/messenger/MessengerActivity.kt
@@ -0,0 +1,71 @@
+package com.blankj.utilcode.pkg.feature.messenger
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.activity.CommonActivityItemsView
+import com.blankj.common.activity.CommonActivityTitleView
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.MessengerUtils
+import com.blankj.utilcode.util.SnackbarUtils
+import com.blankj.utilcode.util.ToastUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/03/12
+ * desc : demo about MessengerUtils
+ * ```
+ */
+class MessengerActivity : CommonActivity() {
+
+ companion object {
+ const val MESSENGER_KEY = "MessengerActivity"
+
+ fun start(context: Context) {
+ val starter = Intent(context, MessengerActivity::class.java)
+ context.startActivity(starter)
+ MessengerUtils.register()
+ }
+
+ val BUNDLE = Bundle()
+
+ init {
+ BUNDLE.putString(MESSENGER_KEY, "MessengerActivity")
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_messenger
+ }
+
+ override fun bindItems(): List> {
+ return CollectionUtils.newArrayList(
+ CommonItemClick(R.string.messenger_post_to_main_server) {
+ MessengerUtils.post(MESSENGER_KEY, BUNDLE)
+ },
+ CommonItemClick(R.string.messenger_start_remote) {
+ MessengerRemoteActivity.start(this)
+ }
+ )
+ }
+
+ override fun doBusiness() {
+ MessengerUtils.subscribe(MESSENGER_KEY) { data ->
+ SnackbarUtils.with(mContentView)
+ .setMessage(data.getString(MESSENGER_KEY) ?: "")
+ .setDuration(SnackbarUtils.LENGTH_INDEFINITE)
+ .show()
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ MessengerUtils.unregister()
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/messenger/MessengerRemoteActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/messenger/MessengerRemoteActivity.kt
new file mode 100644
index 0000000000..acd6c58fde
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/messenger/MessengerRemoteActivity.kt
@@ -0,0 +1,76 @@
+package com.blankj.utilcode.pkg.feature.messenger
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.activity.CommonActivityItemsView
+import com.blankj.common.activity.CommonActivityTitleView
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.MessengerUtils
+import com.blankj.utilcode.util.SnackbarUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/03/12
+ * desc : demo about MessengerUtils
+ * ```
+ */
+class MessengerRemoteActivity : CommonActivity() {
+
+ companion object {
+ const val MESSENGER_KEY = "MessengerRemoteActivity"
+
+ fun start(context: Context) {
+ val starter = Intent(context, MessengerRemoteActivity::class.java)
+ context.startActivity(starter)
+ }
+
+ val BUNDLE = Bundle()
+
+ init {
+ BUNDLE.putString(MESSENGER_KEY, "MessengerRemoteActivity")
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_messenger
+ }
+
+ override fun bindItems(): List> {
+ return CollectionUtils.newArrayList(
+ CommonItemClick(R.string.messenger_register_remote_client) {
+ MessengerUtils.register()
+ },
+ CommonItemClick(R.string.messenger_unregister_remote_client) {
+ MessengerUtils.unregister()
+ },
+ CommonItemClick(R.string.messenger_post_to_self_client) {
+ MessengerUtils.post(MESSENGER_KEY, BUNDLE)
+ },
+ CommonItemClick(R.string.messenger_post_to_main_server) {
+ MessengerUtils.post(MessengerActivity.MESSENGER_KEY, MessengerActivity.BUNDLE)
+ }
+ )
+ }
+
+ override fun doBusiness() {
+ MessengerUtils.subscribe(MESSENGER_KEY) { data ->
+ SnackbarUtils.with(mContentView)
+ .setMessage(data.getString(MESSENGER_KEY) ?: "")
+ .setDuration(SnackbarUtils.LENGTH_INDEFINITE)
+ .show()
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ MessengerUtils.unsubscribe(MESSENGER_KEY)
+ MessengerUtils.unregister()
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/metaData/MetaDataActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/metaData/MetaDataActivity.kt
new file mode 100644
index 0000000000..77bb5f8e82
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/metaData/MetaDataActivity.kt
@@ -0,0 +1,39 @@
+package com.blankj.utilcode.pkg.feature.metaData
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.MetaDataUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2018/05/15
+ * desc : demo about MetaDataUtils
+ * ```
+ */
+class MetaDataActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, MetaDataActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_meta_data
+ }
+
+ override fun bindItems(): List> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("getMetaDataInApp", MetaDataUtils.getMetaDataInApp("app_meta_data")),
+ CommonItemTitle("getMetaDataInActivity", MetaDataUtils.getMetaDataInActivity(this, "activity_meta_data").substring(1))
+ )
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java
new file mode 100644
index 0000000000..7fff29f4a7
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java
@@ -0,0 +1,43 @@
+package com.blankj.utilcode.pkg.feature.mvp;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+
+import com.blankj.common.activity.CommonActivity;
+import com.blankj.utilcode.pkg.R;
+
+import androidx.annotation.Nullable;
+
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2019/11/09
+ * desc :
+ *
+ */
+public class MvpActivity extends CommonActivity {
+
+ public static void start(Context context) {
+ Intent starter = new Intent(context, MvpActivity.class);
+ context.startActivity(starter);
+ }
+
+ @Override
+ public int bindTitleRes() {
+ return R.string.demo_mvp;
+ }
+
+ @Override
+ public int bindLayout() {
+ return R.layout.mvp_activity;
+ }
+
+ @Override
+ public void initView(@Nullable Bundle savedInstanceState, @Nullable View contentView) {
+ super.initView(savedInstanceState, contentView);
+ new MvpView(this).addPresenter(new MvpPresenter());
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpModel.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpModel.java
new file mode 100644
index 0000000000..e16b4f1934
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpModel.java
@@ -0,0 +1,44 @@
+package com.blankj.utilcode.pkg.feature.mvp;
+
+import com.blankj.base.mvp.BaseModel;
+import com.blankj.utilcode.util.ThreadUtils;
+import com.blankj.utilcode.util.Utils;
+
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2019/11/26
+ * desc :
+ *
+ */
+public class MvpModel extends BaseModel implements MvpMvp.Model {
+
+ private int index;
+
+ @Override
+ public void onCreate() {
+ index = 0;
+ }
+
+ @Override
+ public void requestUpdateMsg(final Utils.Consumer consumer) {
+ ThreadUtils.executeByCached(new ThreadUtils.SimpleTask() {
+ @Override
+ public String doInBackground() throws Throwable {
+ Thread.sleep(2000);
+ return "msg: " + index++;
+ }
+
+ @Override
+ public void onSuccess(String result) {
+ consumer.accept(result);
+ }
+ });
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpMvp.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpMvp.java
new file mode 100644
index 0000000000..d0335ef203
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpMvp.java
@@ -0,0 +1,28 @@
+package com.blankj.utilcode.pkg.feature.mvp;
+
+import com.blankj.utilcode.util.Utils;
+
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2019/11/26
+ * desc :
+ *
+ */
+public interface MvpMvp {
+
+ interface View {
+ void setLoadingVisible(boolean visible);
+
+ void showMsg(CharSequence msg);
+ }
+
+ interface Presenter {
+ void updateMsg();
+ }
+
+ interface Model {
+ void requestUpdateMsg(final Utils.Consumer consumer);
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpPresenter.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpPresenter.java
new file mode 100644
index 0000000000..fcb68bd3ed
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpPresenter.java
@@ -0,0 +1,37 @@
+package com.blankj.utilcode.pkg.feature.mvp;
+
+import com.blankj.base.mvp.BasePresenter;
+import com.blankj.utilcode.util.LogUtils;
+import com.blankj.utilcode.util.Utils;
+
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2019/11/26
+ * desc :
+ *
+ */
+public class MvpPresenter extends BasePresenter
+ implements MvpMvp.Presenter {
+
+ @Override
+ public void onBindView() {
+ }
+
+ @Override
+ public void updateMsg() {
+ getView().setLoadingVisible(true);
+ getModel(MvpModel.class).requestUpdateMsg(new Utils.Consumer() {
+ @Override
+ public void accept(String s) {
+ if (isAlive()) {
+ getView().showMsg(s);
+ getView().setLoadingVisible(false);
+ } else {
+ LogUtils.iTag(MvpView.TAG, "destroyed");
+ }
+ }
+ });
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java
new file mode 100644
index 0000000000..e916398e48
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java
@@ -0,0 +1,78 @@
+package com.blankj.utilcode.pkg.feature.mvp;
+
+import android.text.Layout;
+import android.view.View;
+import android.widget.TextView;
+
+import com.blankj.base.mvp.BaseView;
+import com.blankj.utilcode.pkg.R;
+import com.blankj.utilcode.util.ClickUtils;
+import com.blankj.utilcode.util.LogUtils;
+import com.blankj.utilcode.util.SizeUtils;
+import com.blankj.utilcode.util.ThreadUtils;
+import com.blankj.utilcode.util.ToastUtils;
+
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2019/11/26
+ * desc :
+ *
+ */
+public class MvpView extends BaseView
+ implements MvpMvp.View {
+
+ private TextView mvpTv;
+ private TextView mvpMeasureWidthTv;
+ private int i = 0;
+
+ public MvpView(MvpActivity activity) {
+ super(activity);
+ mvpTv = activity.findViewById(R.id.mvpUpdateTv);
+ ClickUtils.applyPressedBgDark(mvpTv);
+ mvpTv.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getPresenter(MvpPresenter.class).updateMsg();
+ }
+ });
+
+ mvpMeasureWidthTv = activity.findViewById(R.id.mvpMeasureWidthTv);
+
+ measure();
+ }
+
+ private void measure() {
+ ThreadUtils.runOnUiThreadDelayed(new Runnable() {
+ @Override
+ public void run() {
+ float textWidth = Layout.getDesiredWidth(mvpMeasureWidthTv.getText(), mvpMeasureWidthTv.getPaint()) + SizeUtils.dp2px(16);
+ float textWidth2 = mvpMeasureWidthTv.getPaint().measureText(mvpMeasureWidthTv.getText().toString()) + SizeUtils.dp2px(16);
+ LogUtils.i(mvpMeasureWidthTv.getWidth(), textWidth, textWidth2);
+ mvpMeasureWidthTv.setText(mvpMeasureWidthTv.getText().toString() + i);
+ measure();
+ }
+ }, 1000);
+ }
+
+ @Override
+ public void setLoadingVisible(boolean visible) {
+ final MvpActivity activity = getActivity();
+ if (visible) {
+ activity.showLoading(new Runnable() {
+ @Override
+ public void run() {
+ activity.finish();
+ }
+ });
+ } else {
+ activity.dismissLoading();
+ }
+ }
+
+ @Override
+ public void showMsg(CharSequence msg) {
+ ToastUtils.showLong(msg);
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt
new file mode 100644
index 0000000000..452040376d
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt
@@ -0,0 +1,151 @@
+package com.blankj.utilcode.pkg.feature.network
+
+import android.content.Context
+import android.content.Intent
+import android.net.wifi.ScanResult
+import android.net.wifi.WifiManager
+import android.os.Bundle
+import android.view.View
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.helper.PermissionHelper
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemSwitch
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.constant.PermissionConstants
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/13
+ * desc : demo about NetworkUtils
+ * ```
+ */
+class NetworkActivity : CommonActivity(), NetworkUtils.OnNetworkStatusChangedListener {
+
+ companion object {
+ fun start(context: Context) {
+ PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
+ override fun onGranted() {
+ val starter = Intent(context, NetworkActivity::class.java)
+ context.startActivity(starter)
+ }
+
+ override fun onDenied() {
+ }
+ }, PermissionConstants.LOCATION)
+ }
+ }
+
+ private lateinit var itemsTask: ThreadUtils.SimpleTask>>
+ private lateinit var wifiScanResultItem: CommonItemTitle
+ private val consumer = Utils.Consumer { t ->
+ wifiScanResultItem.setContent(scanResults2String(t.filterResults))
+ wifiScanResultItem.update()
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_network
+ }
+
+ private fun getItemsTask(): ThreadUtils.SimpleTask>> {
+ itemsTask = object : ThreadUtils.SimpleTask>>() {
+ override fun doInBackground(): List> {
+ return bindItems()
+ }
+
+ override fun onSuccess(result: List>) {
+ dismissLoading()
+ itemsView.updateItems(result)
+ }
+ }
+ return itemsTask
+ }
+
+ override fun bindItems(): List> {
+ if (ThreadUtils.isMainThread()) return arrayListOf()
+ wifiScanResultItem = CommonItemTitle("getWifiScanResult", scanResults2String(NetworkUtils.getWifiScanResult().filterResults))
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("isConnected", NetworkUtils.isConnected().toString()),
+ CommonItemTitle("getMobileDataEnabled", NetworkUtils.getMobileDataEnabled().toString()),
+ CommonItemTitle("isMobileData", NetworkUtils.isMobileData().toString()),
+ CommonItemTitle("is4G", NetworkUtils.is4G().toString()),
+ CommonItemTitle("is5G", NetworkUtils.is5G().toString()),
+ CommonItemTitle("isWifiConnected", NetworkUtils.isWifiConnected().toString()),
+ CommonItemTitle("getNetworkOperatorName", NetworkUtils.getNetworkOperatorName()),
+ CommonItemTitle("getNetworkTypeName", NetworkUtils.getNetworkType().toString()),
+ CommonItemTitle("getBroadcastIpAddress", NetworkUtils.getBroadcastIpAddress()),
+ CommonItemTitle("getIpAddressByWifi", NetworkUtils.getIpAddressByWifi()),
+ CommonItemTitle("getGatewayByWifi", NetworkUtils.getGatewayByWifi()),
+ CommonItemTitle("getNetMaskByWifi", NetworkUtils.getNetMaskByWifi()),
+ CommonItemTitle("getServerAddressByWifi", NetworkUtils.getServerAddressByWifi()),
+ CommonItemTitle("getSSID", NetworkUtils.getSSID()),
+
+ CommonItemTitle("getIPv4Address", NetworkUtils.getIPAddress(true)),
+ CommonItemTitle("getIPv6Address", NetworkUtils.getIPAddress(false)),
+ CommonItemTitle("isWifiAvailable", NetworkUtils.isWifiAvailable().toString()),
+ CommonItemTitle("isAvailable", NetworkUtils.isAvailable().toString()),
+ CommonItemTitle("getBaiduDomainAddress", NetworkUtils.getDomainAddress("baidu.com")),
+ wifiScanResultItem,
+
+ CommonItemSwitch(
+ R.string.network_wifi_enabled,
+ {
+ val wifiEnabled = NetworkUtils.getWifiEnabled()
+ if (wifiEnabled) {
+ NetworkUtils.addOnWifiChangedConsumer(consumer)
+ } else {
+ NetworkUtils.removeOnWifiChangedConsumer(consumer)
+ }
+ wifiEnabled
+ },
+ {
+ NetworkUtils.setWifiEnabled(it)
+ ThreadUtils.executeByIo(getItemsTask())
+ }
+ ),
+ CommonItemClick(R.string.network_open_wireless_settings) {
+ NetworkUtils.openWirelessSettings()
+ }
+ )
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ NetworkUtils.registerNetworkStatusChangedListener(this)
+ updateItems()
+ }
+
+ override fun onDisconnected() {
+ ToastUtils.showLong("onDisconnected")
+ updateItems()
+ }
+
+ override fun onConnected(networkType: NetworkUtils.NetworkType) {
+ ToastUtils.showLong("onConnected: ${networkType.name}")
+ updateItems()
+ }
+
+ private fun updateItems() {
+ showLoading()
+ ThreadUtils.executeByIo(getItemsTask())
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ ThreadUtils.cancel(itemsTask)
+ NetworkUtils.unregisterNetworkStatusChangedListener(this)
+ NetworkUtils.removeOnWifiChangedConsumer(consumer)
+ }
+
+ private fun scanResults2String(results: List): String {
+ val sb: StringBuilder = StringBuilder()
+ for (result in results) {
+ sb.append(String.format("${result.SSID}, Level: ${WifiManager.calculateSignalLevel(result.level, 4)}\n"))
+ }
+ return sb.toString()
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/notification/NotificationActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/notification/NotificationActivity.kt
new file mode 100644
index 0000000000..d69c30b6cd
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/notification/NotificationActivity.kt
@@ -0,0 +1,69 @@
+package com.blankj.utilcode.pkg.feature.notification
+
+import android.app.PendingIntent
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.NotificationUtils
+import com.blankj.utilcode.util.ToastUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/10/22
+ * desc : demo about NotificationUtils
+ * ```
+ */
+class NotificationActivity : CommonActivity() {
+
+ private var id: Int = 0
+ private var cancelId: Int = 0
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, NotificationActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_notification
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("areNotificationsEnabled", NotificationUtils.areNotificationsEnabled().toString()),
+ CommonItemClick(R.string.notification_notify) {
+ NotificationUtils.notify(id++) { param ->
+ intent.putExtra("id", id);
+ param.setSmallIcon(R.mipmap.ic_launcher)
+ .setContentTitle("title")
+ .setContentText("content text: $id")
+ .setContentIntent(PendingIntent.getActivity(mActivity, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT))
+ .setAutoCancel(true)
+ null
+ }
+ },
+ CommonItemClick(R.string.notification_cancel) {
+ if (cancelId < id) {
+ NotificationUtils.cancel(cancelId++)
+ } else {
+ ToastUtils.showShort("No notification.")
+ }
+ },
+ CommonItemClick(R.string.notification_cancel_all) {
+ NotificationUtils.cancelAll()
+ cancelId = id;
+ },
+ CommonItemClick(R.string.notification_show) {
+ NotificationUtils.setNotificationBarVisibility(true)
+ }
+ )
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/path/PathActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/path/PathActivity.kt
new file mode 100644
index 0000000000..b5f657286d
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/path/PathActivity.kt
@@ -0,0 +1,76 @@
+package com.blankj.utilcode.pkg.feature.path
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.PathUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/13
+ * desc : demo about PathUtils
+ * ```
+ */
+class PathActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, PathActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_path
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("getRootPath", PathUtils.getRootPath()),
+ CommonItemTitle("getDataPath", PathUtils.getDataPath()),
+ CommonItemTitle("getDownloadCachePath", PathUtils.getDownloadCachePath()),
+
+ CommonItemTitle("getInternalAppDataPath", PathUtils.getInternalAppDataPath()),
+ CommonItemTitle("getInternalAppCodeCacheDir", PathUtils.getInternalAppCodeCacheDir()),
+ CommonItemTitle("getInternalAppCachePath", PathUtils.getInternalAppCachePath()),
+ CommonItemTitle("getInternalAppDbsPath", PathUtils.getInternalAppDbsPath()),
+ CommonItemTitle("getInternalAppDbPath", PathUtils.getInternalAppDbPath("demo")),
+ CommonItemTitle("getInternalAppFilesPath", PathUtils.getInternalAppFilesPath()),
+ CommonItemTitle("getInternalAppSpPath", PathUtils.getInternalAppSpPath()),
+ CommonItemTitle("getInternalAppNoBackupFilesPath", PathUtils.getInternalAppNoBackupFilesPath()),
+
+ CommonItemTitle("getExternalStoragePath", PathUtils.getExternalStoragePath()),
+ CommonItemTitle("getExternalMusicPath", PathUtils.getExternalMusicPath()),
+ CommonItemTitle("getExternalPodcastsPath", PathUtils.getExternalPodcastsPath()),
+ CommonItemTitle("getExternalRingtonesPath", PathUtils.getExternalRingtonesPath()),
+ CommonItemTitle("getExternalAlarmsPath", PathUtils.getExternalAlarmsPath()),
+ CommonItemTitle("getExternalNotificationsPath", PathUtils.getExternalNotificationsPath()),
+ CommonItemTitle("getExternalPicturesPath", PathUtils.getExternalPicturesPath()),
+ CommonItemTitle("getExternalMoviesPath", PathUtils.getExternalMoviesPath()),
+ CommonItemTitle("getExternalDownloadsPath", PathUtils.getExternalDownloadsPath()),
+ CommonItemTitle("getExternalDcimPath", PathUtils.getExternalDcimPath()),
+ CommonItemTitle("getExternalDocumentsPath", PathUtils.getExternalDocumentsPath()),
+
+ CommonItemTitle("getExternalAppDataPath", PathUtils.getExternalAppDataPath()),
+ CommonItemTitle("getExternalAppCachePath", PathUtils.getExternalAppCachePath()),
+ CommonItemTitle("getExternalAppFilesPath", PathUtils.getExternalAppFilesPath()),
+ CommonItemTitle("getExternalAppMusicPath", PathUtils.getExternalAppMusicPath()),
+ CommonItemTitle("getExternalAppPodcastsPath", PathUtils.getExternalAppPodcastsPath()),
+ CommonItemTitle("getExternalAppRingtonesPath", PathUtils.getExternalAppRingtonesPath()),
+ CommonItemTitle("getExternalAppAlarmsPath", PathUtils.getExternalAppAlarmsPath()),
+ CommonItemTitle("getExternalAppNotificationsPath", PathUtils.getExternalAppNotificationsPath()),
+ CommonItemTitle("getExternalAppPicturesPath", PathUtils.getExternalAppPicturesPath()),
+ CommonItemTitle("getExternalAppMoviesPath", PathUtils.getExternalAppMoviesPath()),
+ CommonItemTitle("getExternalAppDownloadPath", PathUtils.getExternalAppDownloadPath()),
+ CommonItemTitle("getExternalAppDcimPath", PathUtils.getExternalAppDcimPath()),
+ CommonItemTitle("getExternalAppDocumentsPath", PathUtils.getExternalAppDocumentsPath()),
+ CommonItemTitle("getExternalAppObbPath", PathUtils.getExternalAppObbPath())
+ )
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt
new file mode 100644
index 0000000000..c55d9c945b
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt
@@ -0,0 +1,200 @@
+package com.blankj.utilcode.pkg.feature.permission
+
+import android.Manifest.permission
+import android.content.Context
+import android.content.Intent
+import android.os.Build
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.helper.PermissionHelper
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemSwitch
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.constant.PermissionConstants
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2018/01/01
+ * desc : demo about PermissionUtils
+ * ```
+ */
+class PermissionActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, PermissionActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ private val permissions: String
+
+ init {
+ val permissionList = PermissionUtils.getPermissions()
+ if (permissionList.isEmpty()) {
+ permissions = ""
+ } else {
+ val sb = StringBuilder()
+ for (permission in permissionList) {
+ sb.append("\n").append(permission.substring(permission.lastIndexOf('.') + 1))
+ }
+ permissions = sb.deleteCharAt(0).toString()
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_permission
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList>().apply {
+ add(CommonItemTitle("Permissions", permissions))
+ add(CommonItemClick(R.string.permission_open_app_settings, true) { PermissionUtils.launchAppDetailsSettings() })
+ add(CommonItemSwitch(
+ R.string.permission_calendar_status,
+ { PermissionUtils.isGranted(PermissionConstants.CALENDAR) },
+ { requestCalendar() }
+ ))
+ add(CommonItemSwitch(
+ R.string.permission_record_audio_status,
+ { PermissionUtils.isGranted(PermissionConstants.MICROPHONE) },
+ { requestRecordAudio() }
+ ))
+ add(CommonItemSwitch(
+ R.string.permission_calendar_and_record_audio_status,
+ { PermissionUtils.isGranted(PermissionConstants.CALENDAR, PermissionConstants.MICROPHONE) },
+ { requestCalendarAndRecordAudio() }
+ ))
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ add(CommonItemSwitch(
+ R.string.permission_write_settings_status,
+ { PermissionUtils.isGrantedWriteSettings() },
+ { requestWriteSettings() }
+ ))
+ add(CommonItemSwitch(
+ R.string.permission_write_settings_status,
+ { PermissionUtils.isGrantedDrawOverlays() },
+ { requestDrawOverlays() }
+ ))
+ }
+ }
+ }
+
+ private fun requestCalendar() {
+ PermissionUtils.permissionGroup(PermissionConstants.CALENDAR)
+ .rationale { activity, shouldRequest -> PermissionHelper.showRationaleDialog(activity, shouldRequest) }
+ .callback(object : PermissionUtils.FullCallback {
+ override fun onGranted(permissionsGranted: List) {
+ LogUtils.d(permissionsGranted)
+ showSnackbar(true, "Calendar is granted")
+ itemsView.updateItems(bindItems())
+ }
+
+ override fun onDenied(permissionsDeniedForever: List,
+ permissionsDenied: List) {
+ LogUtils.d(permissionsDeniedForever, permissionsDenied)
+ if (permissionsDeniedForever.isNotEmpty()) {
+ showSnackbar(false, "Calendar is denied forever")
+ } else {
+ showSnackbar(false, "Calendar is denied")
+ }
+ itemsView.updateItems(bindItems())
+ }
+ })
+ .theme { activity -> ScreenUtils.setFullScreen(activity) }
+ .request()
+ }
+
+ private fun requestRecordAudio() {
+ PermissionUtils.permissionGroup(PermissionConstants.MICROPHONE)
+ .rationale { activity, shouldRequest -> PermissionHelper.showRationaleDialog(activity, shouldRequest) }
+ .callback(object : PermissionUtils.FullCallback {
+ override fun onGranted(permissionsGranted: List) {
+ LogUtils.d(permissionsGranted)
+ showSnackbar(true, "Microphone is granted")
+ itemsView.updateItems(bindItems())
+ }
+
+ override fun onDenied(permissionsDeniedForever: List,
+ permissionsDenied: List) {
+ LogUtils.d(permissionsDeniedForever, permissionsDenied)
+ if (permissionsDeniedForever.isNotEmpty()) {
+ showSnackbar(false, "Microphone is denied forever")
+ } else {
+ showSnackbar(false, "Microphone is denied")
+ }
+ itemsView.updateItems(bindItems())
+ }
+ })
+ .request()
+ }
+
+ private fun requestCalendarAndRecordAudio() {
+ PermissionUtils.permission(permission.READ_CALENDAR, permission.RECORD_AUDIO)
+ .explain { activity, denied, shouldRequest -> PermissionHelper.showExplainDialog(activity, denied, shouldRequest) }
+ .callback { isAllGranted, granted, deniedForever, denied ->
+ LogUtils.d(granted, deniedForever, denied)
+ itemsView.updateItems(bindItems())
+ if (isAllGranted) {
+ showSnackbar(true, "Calendar and Microphone are granted")
+ return@callback
+ }
+ if (deniedForever.isNotEmpty()) {
+ showSnackbar(false, "Calendar or Microphone is denied forever")
+ } else {
+ showSnackbar(false, "Calendar or Microphone is denied")
+ }
+ }
+ .request()
+ }
+
+ private fun requestWriteSettings() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ PermissionUtils.requestWriteSettings(object : PermissionUtils.SimpleCallback {
+ override fun onGranted() {
+ showSnackbar(true, "Write Settings is granted")
+ itemsView.updateItems(bindItems())
+ }
+
+ override fun onDenied() {
+ showSnackbar(false, "Write Settings is denied")
+ itemsView.updateItems(bindItems())
+ }
+ })
+ }
+ }
+
+ private fun requestDrawOverlays() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ PermissionUtils.requestDrawOverlays(object : PermissionUtils.SimpleCallback {
+ override fun onGranted() {
+ showSnackbar(true, "Draw Overlays is granted")
+ itemsView.updateItems(bindItems())
+ }
+
+ override fun onDenied() {
+ showSnackbar(false, "Draw Overlays is denied")
+ itemsView.updateItems(bindItems())
+ }
+ })
+ }
+ }
+
+
+ private fun showSnackbar(isSuccess: Boolean, msg: String) {
+ SnackbarUtils.with(mContentView)
+ .setDuration(SnackbarUtils.LENGTH_LONG)
+ .setMessage(msg)
+ .apply {
+ if (isSuccess) {
+ showSuccess()
+ } else {
+ showError()
+ }
+ }
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/phone/PhoneActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/phone/PhoneActivity.kt
new file mode 100644
index 0000000000..c9b748cdfa
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/phone/PhoneActivity.kt
@@ -0,0 +1,62 @@
+package com.blankj.utilcode.pkg.feature.phone
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.helper.PermissionHelper
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.constant.PermissionConstants
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.PermissionUtils
+import com.blankj.utilcode.util.PhoneUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/13
+ * desc : demo about PhoneUtils
+ * ```
+ */
+class PhoneActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
+ override fun onGranted() {
+ val starter = Intent(context, PhoneActivity::class.java)
+ context.startActivity(starter)
+ }
+
+ override fun onDenied() {
+ }
+ }, PermissionConstants.PHONE)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_phone
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("isPhone", PhoneUtils.isPhone().toString()),
+ CommonItemTitle("getDeviceId", PhoneUtils.getDeviceId()),
+ CommonItemTitle("getSerial", PhoneUtils.getSerial()),
+ CommonItemTitle("getIMEI", PhoneUtils.getIMEI()),
+ CommonItemTitle("getMEID", PhoneUtils.getMEID()),
+ CommonItemTitle("getIMSI", PhoneUtils.getIMSI()),
+ CommonItemTitle("getPhoneType", PhoneUtils.getPhoneType().toString()),
+ CommonItemTitle("isSimCardReady", PhoneUtils.isSimCardReady().toString()),
+ CommonItemTitle("getSimOperatorName", PhoneUtils.getSimOperatorName()),
+ CommonItemTitle("getSimOperatorByMnc", PhoneUtils.getSimOperatorByMnc()),
+
+ CommonItemClick(R.string.phone_dial) { PhoneUtils.dial("*10000#haha") },
+ CommonItemClick(R.string.phone_call) { PhoneUtils.call("*10000#haha") },
+ CommonItemClick(R.string.phone_send_sms) { PhoneUtils.sendSms("10000", "sendSms") }
+ )
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/process/ProcessActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/process/ProcessActivity.kt
new file mode 100644
index 0000000000..7753d2f47a
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/process/ProcessActivity.kt
@@ -0,0 +1,67 @@
+package com.blankj.utilcode.pkg.feature.process
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ProcessUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/13
+ * desc : demo about ProcessUtils
+ * ```
+ */
+class ProcessActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, ProcessActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_process
+ }
+
+ override fun bindItems(): MutableList> {
+ val set = ProcessUtils.getAllBackgroundProcesses()
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("getForegroundProcessName", ProcessUtils.getForegroundProcessName()!!),
+ CommonItemTitle("getAllBackgroundProcesses -> ${set.size}", getSetItems(set)),
+ CommonItemTitle("isMainProcess", ProcessUtils.isMainProcess().toString()),
+ CommonItemTitle("getCurrentProcessName", ProcessUtils.getCurrentProcessName()),
+
+ CommonItemClick(R.string.process_kill_all_background).setOnItemClickListener { _, item, _ ->
+ val bgSet = ProcessUtils.getAllBackgroundProcesses()
+ val killedSet = ProcessUtils.killAllBackgroundProcesses()
+ itemsView.updateItems(
+ CollectionUtils.newArrayList(
+ CommonItemTitle("getForegroundProcessName", ProcessUtils.getForegroundProcessName()),
+ CommonItemTitle("getAllBackgroundProcesses -> ${bgSet.size}", getSetItems(bgSet)),
+ CommonItemTitle("killAllBackgroundProcesses -> ${killedSet.size}", getSetItems(killedSet)),
+ CommonItemTitle("isMainProcess", ProcessUtils.isMainProcess().toString()),
+ CommonItemTitle("getCurrentProcessName", ProcessUtils.getCurrentProcessName()),
+ item
+ )
+ )
+ }
+ )
+ }
+
+ private fun getSetItems(set: Set): String {
+ val iterator = set.iterator()
+ val sb = StringBuilder()
+ while (iterator.hasNext()) {
+ sb.append("\n").append(iterator.next())
+ }
+ return if (sb.isNotEmpty()) sb.deleteCharAt(0).toString() else ""
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/ReflectActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/ReflectActivity.kt
new file mode 100644
index 0000000000..f445acf642
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/ReflectActivity.kt
@@ -0,0 +1,41 @@
+package com.blankj.utilcode.pkg.feature.reflect
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ReflectUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2018/01/29
+ * desc : demo about ReflectUtils
+ * ```
+ */
+class ReflectActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, ReflectActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_reflect
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("source value", TestPrivateStaticFinal.STR),
+ CommonItemTitle("reflect get", ReflectUtils.reflect(TestPrivateStaticFinal::class.java).field("STR").get()),
+ CommonItemTitle("after reflect get", ReflectUtils.reflect(TestPrivateStaticFinal::class.java).field("STR", "reflect success").field("STR").get()),
+ CommonItemTitle("source value", TestPrivateStaticFinal.STR)
+ )
+ }
+}
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java
new file mode 100644
index 0000000000..b7efb5f4d7
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java
@@ -0,0 +1,16 @@
+package com.blankj.utilcode.pkg.feature.reflect;
+
+import androidx.annotation.Keep;
+
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2019/09/09
+ * desc :
+ *
+ */
+@Keep
+public class TestPrivateStaticFinal {
+ public static final String STR = "str";
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/resource/ResourceActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/resource/ResourceActivity.kt
new file mode 100644
index 0000000000..cf56301068
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/resource/ResourceActivity.kt
@@ -0,0 +1,49 @@
+package com.blankj.utilcode.pkg.feature.resource
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.Config
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ResourceUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2018/05/07
+ * desc : demo about ResourceUtils
+ * ```
+ */
+class ResourceActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, ResourceActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_resource
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("readAssets2String", ResourceUtils.readAssets2String("test/test.txt")),
+ CommonItemTitle("readAssets2List", ResourceUtils.readAssets2List("test/test.txt").toString()),
+ CommonItemTitle("readRaw2List", ResourceUtils.readRaw2List(R.raw.test).toString()),
+
+ CommonItemClick(R.string.resource_copy_file_from_assets_2_cache) {
+ ResourceUtils.copyFileFromAssets("test", Config.CACHE_PATH + "assets/test")
+ },
+ CommonItemClick(R.string.resource_copy_file_from_raw_2_cache) {
+ ResourceUtils.copyFileFromRaw(R.raw.test, Config.CACHE_PATH + "raw/test.txt")
+ }
+ )
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/rom/RomActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/rom/RomActivity.kt
new file mode 100644
index 0000000000..e2b4a3c7bc
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/rom/RomActivity.kt
@@ -0,0 +1,40 @@
+package com.blankj.utilcode.pkg.feature.rom
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.RomUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/01/29
+ * desc : demo about RomUtils
+ * ```
+ */
+class RomActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, RomActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_rom
+ }
+
+ override fun bindItems(): MutableList> {
+ val romInfo = RomUtils.getRomInfo()
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("Rom Name", romInfo.name),
+ CommonItemTitle("Rom Version", romInfo.version)
+ )
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/screen/ScreenActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/screen/ScreenActivity.kt
new file mode 100644
index 0000000000..88286c4df5
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/screen/ScreenActivity.kt
@@ -0,0 +1,101 @@
+package com.blankj.utilcode.pkg.feature.screen
+
+import android.content.Context
+import android.content.Intent
+import android.os.Build
+import android.widget.ImageView
+import android.widget.TextView
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemSwitch
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.pkg.helper.DialogHelper
+import com.blankj.utilcode.util.*
+
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/01/29
+ * desc : demo about RomUtils
+ * ```
+ */
+class ScreenActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ PermissionUtils.requestWriteSettings(object : PermissionUtils.SimpleCallback {
+ override fun onGranted() {
+ val starter = Intent(context, ScreenActivity::class.java)
+ context.startActivity(starter)
+ }
+
+ override fun onDenied() {
+ ToastUtils.showLong("No permission of write settings.")
+ }
+ })
+ } else {
+ val starter = Intent(context, ScreenActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_screen
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("getScreenWidth", ScreenUtils.getScreenWidth().toString()),
+ CommonItemTitle("getScreenHeight", ScreenUtils.getScreenHeight().toString()),
+ CommonItemTitle("getAppScreenWidth", ScreenUtils.getAppScreenWidth().toString()),
+ CommonItemTitle("getAppScreenHeight", ScreenUtils.getAppScreenHeight().toString()),
+ CommonItemTitle("getScreenDensity", ScreenUtils.getScreenDensity().toString()),
+ CommonItemTitle("getScreenDensityDpi", ScreenUtils.getScreenDensityDpi().toString()),
+ CommonItemTitle("getScreenRotation", ScreenUtils.getScreenRotation(this).toString()),
+ CommonItemTitle("isScreenLock", ScreenUtils.isScreenLock().toString()),
+ CommonItemTitle("getSleepDuration", ScreenUtils.getSleepDuration().toString()),
+
+ CommonItemSwitch(
+ "isFullScreen",
+ { ScreenUtils.isFullScreen(this) },
+ {
+ if (it) {
+ ScreenUtils.setFullScreen(this)
+ BarUtils.setStatusBarVisibility(this, false)
+ } else {
+ ScreenUtils.setNonFullScreen(this)
+ BarUtils.setStatusBarVisibility(this, true)
+ }
+ }
+ ),
+ CommonItemSwitch(
+ "isLandscape",
+ { ScreenUtils.isLandscape() },
+ {
+ if (it) {
+ ScreenUtils.setLandscape(this)
+ } else {
+ ScreenUtils.setPortrait(this)
+ }
+ }
+ ),
+ CommonItemClick(R.string.screen_screenshot) {
+ val iv :ImageView = ImageView(this)
+ iv.setImageResource(R.mipmap.ic_launcher)
+
+ val tv: TextView = TextView(this)
+ tv.setText("wowowowwowo")
+
+ DialogHelper.showScreenshotDialog(ImageUtils.view2Bitmap(tv))
+
+// DialogHelper.showScreenshotDialog(ScreenUtils.screenShot(this))
+ }
+ )
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/sdcard/SDCardActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/sdcard/SDCardActivity.kt
new file mode 100644
index 0000000000..0c51475952
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/sdcard/SDCardActivity.kt
@@ -0,0 +1,46 @@
+package com.blankj.utilcode.pkg.feature.sdcard
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ConvertUtils
+import com.blankj.utilcode.util.SDCardUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/09/27
+ * desc : demo about SDCardUtils
+ * ```
+ */
+class SDCardActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, SDCardActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_sdcard
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("isSDCardEnableByEnvironment", SDCardUtils.isSDCardEnableByEnvironment().toString()),
+ CommonItemTitle("getSDCardPathByEnvironment", SDCardUtils.getSDCardPathByEnvironment()),
+ CommonItemTitle("getSDCardInfo", SDCardUtils.getSDCardInfo().toString()),
+ CommonItemTitle("getMountedSDCardPath", SDCardUtils.getMountedSDCardPath().toString()),
+ CommonItemTitle("getExternalTotalSize", ConvertUtils.byte2FitMemorySize(SDCardUtils.getExternalTotalSize(), 2)),
+ CommonItemTitle("getExternalAvailableSize", ConvertUtils.byte2FitMemorySize(SDCardUtils.getExternalAvailableSize(), 2)),
+ CommonItemTitle("getInternalTotalSize", ConvertUtils.byte2FitMemorySize(SDCardUtils.getInternalTotalSize(), 2)),
+ CommonItemTitle("getInternalAvailableSize", ConvertUtils.byte2FitMemorySize(SDCardUtils.getInternalAvailableSize(), 2))
+ )
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/shadow/ShadowActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/shadow/ShadowActivity.kt
new file mode 100644
index 0000000000..2ec21ad483
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/shadow/ShadowActivity.kt
@@ -0,0 +1,52 @@
+package com.blankj.utilcode.pkg.feature.shadow
+
+import android.content.Context
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import com.blankj.common.activity.CommonActivity
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.ShadowUtils
+import com.blankj.utilcode.util.ShadowUtils.Config
+import com.blankj.utilcode.util.SizeUtils
+import kotlinx.android.synthetic.main.shadow_activity.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/10/22
+ * desc : demo about ShadowUtils
+ * ```
+ */
+class ShadowActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, ShadowActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_shadow
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.shadow_activity
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ ShadowUtils.apply(shadowRectView, Config().setShadowColor(0x44000000, 0x55000000))
+ ShadowUtils.apply(shadowRoundRectView, Config().setShadowColor(0x44000000, 0x55000000).setShadowRadius(
+ SizeUtils.dp2px(16f).toFloat()))
+ ShadowUtils.apply(shadowCircleView, Config().setCircle().setShadowColor(0x44000000, 0x55000000))
+
+ ShadowUtils.apply(shadowRectView1, Config().setShadowColor(0x44000000, 0x55000000))
+ ShadowUtils.apply(shadowRoundRectView1, Config().setShadowColor(0x44000000, 0x55000000).setShadowRadius(
+ SizeUtils.dp2px(16f).toFloat()))
+ ShadowUtils.apply(shadowCircleView1, Config().setCircle().setShadowColor(0x44000000, 0x55000000))
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
new file mode 100644
index 0000000000..dcde367a5b
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
@@ -0,0 +1,159 @@
+package com.blankj.utilcode.pkg.feature.snackbar
+
+import android.content.Context
+import android.content.Intent
+import android.graphics.Color
+import android.text.SpannableStringBuilder
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.annotation.StringRes
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.SnackbarUtils
+import com.blankj.utilcode.util.SpanUtils
+import com.blankj.utilcode.util.ToastUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/17
+ * desc : demo about SnackbarUtils
+ * ```
+ */
+class SnackbarActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, SnackbarActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_snackbar
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemClick(R.string.snackbar_short) {
+ SnackbarUtils.with(mContentView)
+ .setMessage(getMsg(R.string.snackbar_short))
+ .setMessageColor(Color.WHITE)
+ .setBgResource(R.drawable.snackbar_custom_bg)
+ .show()
+ },
+ CommonItemClick(R.string.snackbar_short_top) {
+ SnackbarUtils.with(mContentView)
+ .setMessage(getMsg(R.string.snackbar_short_top))
+ .setMessageColor(Color.WHITE)
+ .setBgResource(R.drawable.snackbar_custom_bg)
+ .show(true)
+ },
+ CommonItemClick(R.string.snackbar_short_with_action) {
+ SnackbarUtils.with(mContentView)
+ .setMessage(getMsg(R.string.snackbar_short_with_action))
+ .setMessageColor(Color.WHITE)
+ .setBgResource(R.drawable.snackbar_custom_bg)
+ .setAction(getString(R.string.snackbar_click), Color.YELLOW) { ToastUtils.showShort(getString(R.string.snackbar_click)) }
+ .show()
+ },
+ CommonItemClick(R.string.snackbar_short_with_action_top) {
+ SnackbarUtils.with(mContentView)
+ .setMessage(getMsg(R.string.snackbar_short_with_action_top))
+ .setMessageColor(Color.WHITE)
+ .setBgResource(R.drawable.snackbar_custom_bg)
+ .setAction(getString(R.string.snackbar_click), Color.YELLOW) { ToastUtils.showShort(getString(R.string.snackbar_click)) }
+ .show(true)
+ },
+ CommonItemClick(R.string.snackbar_long) {
+ SnackbarUtils.with(mContentView)
+ .setMessage(getMsg(R.string.snackbar_long))
+ .setMessageColor(Color.WHITE)
+ .setDuration(SnackbarUtils.LENGTH_LONG)
+ .setBgResource(R.drawable.snackbar_custom_bg)
+ .show()
+ },
+ CommonItemClick(R.string.snackbar_long_with_action) {
+ SnackbarUtils.with(mContentView)
+ .setMessage(getMsg(R.string.snackbar_long_with_action))
+ .setMessageColor(Color.WHITE)
+ .setBgResource(R.drawable.snackbar_custom_bg)
+ .setDuration(SnackbarUtils.LENGTH_LONG)
+ .setAction(getString(R.string.snackbar_click), Color.YELLOW) { ToastUtils.showShort(getString(R.string.snackbar_click)) }
+ .show()
+ },
+ CommonItemClick(R.string.snackbar_indefinite) {
+ SnackbarUtils.with(mContentView)
+ .setMessage(getMsg(R.string.snackbar_indefinite))
+ .setMessageColor(Color.WHITE)
+ .setDuration(SnackbarUtils.LENGTH_INDEFINITE)
+ .setBgResource(R.drawable.snackbar_custom_bg)
+ .show()
+ },
+ CommonItemClick(R.string.snackbar_indefinite_with_action) {
+ SnackbarUtils.with(mContentView)
+ .setMessage(getMsg(R.string.snackbar_indefinite_with_action))
+ .setMessageColor(Color.WHITE)
+ .setDuration(SnackbarUtils.LENGTH_INDEFINITE)
+ .setBgResource(R.drawable.snackbar_custom_bg)
+ .setAction(getString(R.string.snackbar_click), Color.YELLOW) { ToastUtils.showShort(getString(R.string.snackbar_click)) }
+ .show()
+ },
+ CommonItemClick(R.string.snackbar_add_view) {
+ val params = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
+ SnackbarUtils.with(mContentView)
+ .setBgColor(Color.TRANSPARENT)
+ .setDuration(SnackbarUtils.LENGTH_INDEFINITE)
+ .show()
+ SnackbarUtils.addView(R.layout.snackbar_custom, params)
+ },
+ CommonItemClick(R.string.snackbar_add_view_with_action) {
+ val params: ViewGroup.LayoutParams = ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT
+ )
+ SnackbarUtils.with(mContentView)
+ .setBgColor(Color.TRANSPARENT)
+ .setDuration(SnackbarUtils.LENGTH_INDEFINITE)
+ .show()
+ SnackbarUtils.addView(R.layout.snackbar_custom, params)
+ val snackbarView = SnackbarUtils.getView()
+ if (snackbarView != null) {
+ val tvSnackbarCustom = snackbarView.findViewById(R.id.snackbarCustomTv)
+ tvSnackbarCustom.setText(R.string.snackbar_click_to_dismiss)
+ snackbarView.setOnClickListener { SnackbarUtils.dismiss() }
+ }
+ },
+ CommonItemClick(R.string.snackbar_success) {
+ SnackbarUtils.with(mContentView)
+ .setMessage(getMsg(R.string.snackbar_success))
+ .showSuccess()
+ },
+ CommonItemClick(R.string.snackbar_warning) {
+ SnackbarUtils.with(mContentView)
+ .setMessage(getMsg(R.string.snackbar_warning))
+ .showWarning()
+ },
+ CommonItemClick(R.string.snackbar_error) {
+ SnackbarUtils.with(mContentView)
+ .setMessage(getMsg(R.string.snackbar_error))
+ .showError()
+ },
+ CommonItemClick(R.string.snackbar_dismiss) {
+ SnackbarUtils.dismiss()
+ }
+ )
+ }
+
+ private fun getMsg(@StringRes resId: Int): SpannableStringBuilder {
+ return SpanUtils()
+ .appendImage(R.mipmap.ic_launcher, SpanUtils.ALIGN_CENTER)
+ .appendSpace(32)
+ .append(getString(resId)).setFontSize(24, true)
+ .create()
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/spStatic/SPStaticActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/spStatic/SPStaticActivity.kt
new file mode 100644
index 0000000000..f0e6abf871
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/spStatic/SPStaticActivity.kt
@@ -0,0 +1,82 @@
+package com.blankj.utilcode.pkg.feature.spStatic
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.SPStaticUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2018/01/08
+ * desc : demo about SPUtils
+ * ```
+ */
+class SPStaticActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, SPStaticActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_spStatic
+ }
+
+ override fun bindItems(): MutableList> {
+ val itemTitle = CommonItemTitle(sp2String(), true)
+ return CollectionUtils.newArrayList(
+ itemTitle,
+ CommonItemClick(R.string.sp_put_string) {
+ SPStaticUtils.put("STRING", "string")
+ itemTitle.title = sp2String()
+ },
+ CommonItemClick(R.string.sp_put_int) {
+ SPStaticUtils.put("INT", 21)
+ itemTitle.title = sp2String()
+ },
+ CommonItemClick(R.string.sp_put_long) {
+ SPStaticUtils.put("LONG", java.lang.Long.MAX_VALUE)
+ itemTitle.title = sp2String()
+ },
+ CommonItemClick(R.string.sp_put_float) {
+ SPStaticUtils.put("FLOAT", Math.PI.toFloat())
+ itemTitle.title = sp2String()
+ },
+ CommonItemClick(R.string.sp_put_boolean) {
+ SPStaticUtils.put("BOOLEAN", true)
+ itemTitle.title = sp2String()
+ },
+ CommonItemClick(R.string.sp_put_string_set) {
+ SPStaticUtils.put("SET", setOf("1", "2"))
+ itemTitle.title = sp2String()
+ },
+ CommonItemClick(R.string.sp_clear) {
+ SPStaticUtils.clear()
+ itemTitle.title = sp2String()
+ }
+ )
+ }
+
+ private fun sp2String(): String {
+ val sb = StringBuilder()
+ val map = SPStaticUtils.getAll()
+ if (map.isEmpty()) return ""
+ for ((key, value) in map) {
+ sb.append("\n")
+ .append(key)
+ .append(": ")
+ .append(value)
+
+ }
+ return sb.deleteCharAt(0).toString()
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
new file mode 100644
index 0000000000..84c9f868bb
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
@@ -0,0 +1,285 @@
+package com.blankj.utilcode.pkg.feature.span
+
+import android.animation.ValueAnimator
+import android.content.Context
+import android.content.Intent
+import android.graphics.*
+import android.os.Bundle
+import android.text.Layout
+import android.text.SpannableStringBuilder
+import android.text.TextPaint
+import android.text.style.CharacterStyle
+import android.text.style.ClickableSpan
+import android.text.style.UpdateAppearance
+import android.view.View
+import android.view.animation.LinearInterpolator
+import androidx.annotation.ColorInt
+import com.blankj.common.activity.CommonActivity
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.SpanUtils
+import com.blankj.utilcode.util.ToastUtils
+import kotlinx.android.synthetic.main.span_activity.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/09/27
+ * desc : demo about SpanUtils
+ * ```
+ */
+class SpanActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, SpanActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ private lateinit var mSpanUtils: SpanUtils
+ private lateinit var animSsb: SpannableStringBuilder
+
+ private var lineHeight: Int = 0
+ private var textSize: Float = 0f
+ private lateinit var valueAnimator: ValueAnimator
+ private lateinit var mShader: Shader
+ private var mShaderWidth: Float = 0f
+ private lateinit var matrix: Matrix
+ private lateinit var mBlurMaskFilterSpan: BlurMaskFilterSpan
+ private lateinit var mShadowSpan: ShadowSpan
+ private lateinit var mForegroundAlphaColorSpan: ForegroundAlphaColorSpan
+ private lateinit var mForegroundAlphaColorSpanGroup: ForegroundAlphaColorSpanGroup
+ private lateinit var mPrinterString: String
+ private var density: Float = 0f
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_span
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.span_activity
+ }
+
+ override fun initView(savedInstanceState: Bundle?, contentView: View?) {
+ super.initView(savedInstanceState, contentView)
+ val clickableSpan = object : ClickableSpan() {
+ override fun onClick(widget: View) {
+ ToastUtils.showShort("事件触发了")
+ }
+
+ override fun updateDrawState(ds: TextPaint) {
+ ds.color = Color.BLUE
+ ds.isUnderlineText = false
+ }
+ }
+
+ lineHeight = spanAboutTv.lineHeight
+ textSize = spanAboutTv.textSize
+ density = resources.displayMetrics.density
+
+ SpanUtils.with(spanAboutTv)
+ .appendLine("SpanUtils").setBackgroundColor(Color.LTGRAY).setBold().setForegroundColor(Color.YELLOW).setHorizontalAlign(Layout.Alignment.ALIGN_CENTER)
+ .appendLine("前景色").setForegroundColor(Color.GREEN)
+// .appendLine("测试哈哈").setForegroundColor(Color.RED).setBackgroundColor(Color.LTGRAY).setFontSize(10).setLineHeight(280, SpanUtils.ALIGN_BOTTOM)
+ .appendLine("背景色").setBackgroundColor(Color.LTGRAY)
+ .appendLine("行高居中对齐").setLineHeight(2 * lineHeight, SpanUtils.ALIGN_CENTER).setBackgroundColor(Color.LTGRAY)
+ .appendLine("行高底部对齐").setLineHeight(2 * lineHeight, SpanUtils.ALIGN_BOTTOM).setBackgroundColor(Color.GREEN)
+ .appendLine("测试段落缩,首行缩进两字,其他行不缩进").setLeadingMargin(textSize.toInt() * 2, 10).setBackgroundColor(Color.GREEN)
+ .appendLine("测试引用,后面的字是为了凑到两行的效果").setQuoteColor(Color.GREEN, 10, 10).setBackgroundColor(Color.LTGRAY)
+ .appendLine("测试列表项,后面的字是为了凑到两行的效果").setBullet(Color.GREEN, 20, 10).setBackgroundColor(Color.LTGRAY).setBackgroundColor(Color.GREEN)
+ .appendLine("32dp 字体").setFontSize(32, true)
+ .appendLine("2 倍字体").setFontProportion(2f)
+ .appendLine("横向 2 倍字体").setFontXProportion(1.5f)
+ .appendLine("删除线").setStrikethrough()
+ .appendLine("下划线").setUnderline()
+ .append("测试").appendLine("上标").setSuperscript()
+ .append("测试").appendLine("下标").setSubscript()
+ .appendLine("粗体").setBold()
+ .appendLine("斜体").setItalic()
+ .appendLine("粗斜体").setBoldItalic()
+ .appendLine("monospace 字体").setFontFamily("monospace")
+ .appendLine("自定义字体").setTypeface(Typeface.createFromAsset(assets, "fonts/dnmbhs.ttf"))
+ .appendLine("相反对齐").setHorizontalAlign(Layout.Alignment.ALIGN_OPPOSITE)
+ .appendLine("居中对齐").setHorizontalAlign(Layout.Alignment.ALIGN_CENTER)
+ .appendLine("正常对齐").setHorizontalAlign(Layout.Alignment.ALIGN_NORMAL)
+ .append("测试").appendLine("点击事件").setClickSpan(clickableSpan)
+ .append("测试").appendLine("Url").setUrl("https://github.com/Blankj/AndroidUtilCode")
+ .append("测试").appendLine("模糊").setBlur(3f, BlurMaskFilter.Blur.NORMAL)
+ .appendLine("颜色渐变").setShader(LinearGradient(0f, 0f, 64f * density * 4f, 0f, resources.getIntArray(R.array.rainbow), null, Shader.TileMode.REPEAT)).setFontSize(64, true)
+ .appendLine("图片着色").setFontSize(64, true).setShader(BitmapShader(BitmapFactory.decodeResource(resources, R.drawable.span_cheetah), Shader.TileMode.REPEAT, Shader.TileMode.REPEAT))
+ .appendLine("阴影效果").setFontSize(64, true).setBackgroundColor(Color.BLACK).setShadow(24f, 8f, 8f, Color.WHITE)
+
+ .append("小图").setBackgroundColor(Color.GREEN)
+ .appendImage(R.drawable.span_block_low, SpanUtils.ALIGN_TOP)
+ .append("顶部").setBackgroundColor(Color.GREEN)
+ .appendImage(R.drawable.span_block_low, SpanUtils.ALIGN_CENTER)
+ .append("居中").setBackgroundColor(Color.GREEN)
+ .appendImage(R.drawable.span_block_low, SpanUtils.ALIGN_BASELINE)
+ .append("底部").setBackgroundColor(Color.GREEN)
+ .appendImage(R.drawable.span_block_low, SpanUtils.ALIGN_BOTTOM)
+ .appendLine("对齐").setBackgroundColor(Color.GREEN)
+ .appendImage(R.drawable.span_block_high, SpanUtils.ALIGN_TOP)
+ .append("大图").setBackgroundColor(Color.LTGRAY)
+ .appendImage(R.drawable.span_block_high, SpanUtils.ALIGN_TOP)
+ .append("顶部").setBackgroundColor(Color.LTGRAY)
+ .appendImage(R.drawable.span_block_high, SpanUtils.ALIGN_TOP)
+ .appendLine("对齐").setBackgroundColor(Color.LTGRAY)
+
+ .appendImage(R.drawable.span_block_high, SpanUtils.ALIGN_CENTER)
+ .append("大图").setBackgroundColor(Color.GREEN)
+ .appendImage(R.drawable.span_block_high, SpanUtils.ALIGN_CENTER)
+ .append("居中").setBackgroundColor(Color.GREEN)
+ .appendImage(R.drawable.span_block_high, SpanUtils.ALIGN_CENTER)
+ .appendLine("对齐").setBackgroundColor(Color.GREEN)
+
+ .appendImage(R.drawable.span_block_high, SpanUtils.ALIGN_BOTTOM)
+ .append("大图").setBackgroundColor(Color.LTGRAY)
+ .appendImage(R.drawable.span_block_high, SpanUtils.ALIGN_BOTTOM)
+ .append("底部").setBackgroundColor(Color.LTGRAY)
+ .appendImage(R.drawable.span_block_high, SpanUtils.ALIGN_BOTTOM)
+ .appendLine("对齐").setBackgroundColor(Color.LTGRAY)
+
+ .append("测试空格").appendSpace(30, Color.LTGRAY).appendSpace(50, Color.GREEN).appendSpace(100).appendSpace(30, Color.LTGRAY).appendSpace(50, Color.GREEN)
+ .create()
+
+ // initAnimSpan();
+ // startAnim();
+ }
+
+ private fun initAnimSpan() {
+ mShaderWidth = 64f * density * 4f
+ mShader = LinearGradient(0f, 0f,
+ mShaderWidth, 0f,
+ resources.getIntArray(R.array.rainbow), null,
+ Shader.TileMode.REPEAT)
+ matrix = Matrix()
+
+ mBlurMaskFilterSpan = BlurMaskFilterSpan(25f)
+
+ mShadowSpan = ShadowSpan(8f, 8f, 8f, Color.WHITE)
+
+ mForegroundAlphaColorSpan = ForegroundAlphaColorSpan(Color.TRANSPARENT)
+
+ mForegroundAlphaColorSpanGroup = ForegroundAlphaColorSpanGroup(0f)
+
+ mPrinterString = "打印动画,后面的文字是为了测试打印效果..."
+
+ mSpanUtils = SpanUtils()
+ .appendLine("彩虹动画").setFontSize(64, true).setShader(mShader)
+ .appendLine("模糊动画").setFontSize(64, true).setSpans(mBlurMaskFilterSpan)
+ .appendLine("阴影动画").setFontSize(64, true).setBackgroundColor(Color.BLACK).setSpans(mShadowSpan)
+ .appendLine("透明动画").setFontSize(64, true).setSpans(mForegroundAlphaColorSpan)
+ var i = 0
+ val len = mPrinterString.length
+ while (i < len) {
+ val span = ForegroundAlphaColorSpan(Color.TRANSPARENT)
+ mSpanUtils.append(mPrinterString.substring(i, i + 1)).setSpans(span)
+ mForegroundAlphaColorSpanGroup.addSpan(span)
+ ++i
+ }
+ animSsb = mSpanUtils.create()
+ }
+
+ private fun startAnim() {
+ valueAnimator = ValueAnimator.ofFloat(0f, 1f)
+ valueAnimator.addUpdateListener { animation ->
+ // shader
+ matrix.reset()
+ matrix.setTranslate(animation.animatedValue as Float * mShaderWidth, 0f)
+ mShader.setLocalMatrix(matrix)
+
+ // blur
+ mBlurMaskFilterSpan.radius = 25 * (1.00001f - animation.animatedValue as Float)
+
+ // shadow
+ mShadowSpan.dx = 16 * (0.5f - animation.animatedValue as Float)
+ mShadowSpan.dy = 16 * (0.5f - animation.animatedValue as Float)
+
+ // alpha
+ mForegroundAlphaColorSpan.setAlpha((255 * animation.animatedValue as Float).toInt())
+
+ // printer
+ mForegroundAlphaColorSpanGroup.alpha = animation.animatedValue as Float
+
+ // showMsg
+ spanAboutAnimTv.text = animSsb
+ }
+
+ valueAnimator.interpolator = LinearInterpolator()
+ valueAnimator.duration = (600 * 3).toLong()
+ valueAnimator.repeatCount = ValueAnimator.INFINITE
+ valueAnimator.start()
+ }
+
+ override fun doBusiness() {}
+
+ override fun onDebouncingClick(view: View) {}
+
+// override fun onDestroy() {
+// if (valueAnimator.isRunning) {
+// valueAnimator.cancel()
+// }
+// super.onDestroy()
+// }
+}
+
+class BlurMaskFilterSpan(private var mRadius: Float) : CharacterStyle(), UpdateAppearance {
+ private var mFilter: MaskFilter? = null
+
+ var radius: Float
+ get() = mRadius
+ set(radius) {
+ mRadius = radius
+ mFilter = BlurMaskFilter(mRadius, BlurMaskFilter.Blur.NORMAL)
+ }
+
+ override fun updateDrawState(ds: TextPaint) {
+ ds.maskFilter = mFilter
+ }
+}
+
+class ForegroundAlphaColorSpan(@param:ColorInt private var mColor: Int) : CharacterStyle(), UpdateAppearance {
+
+ fun setAlpha(alpha: Int) {
+ mColor = Color.argb(alpha, Color.red(mColor), Color.green(mColor), Color.blue(mColor))
+ }
+
+ override fun updateDrawState(ds: TextPaint) {
+ ds.color = mColor
+ }
+}
+
+class ForegroundAlphaColorSpanGroup(private val mAlpha: Float) {
+
+ private val mSpans: ArrayList = ArrayList()
+
+ var alpha: Float
+ get() = mAlpha
+ set(alpha) {
+ val size = mSpans.size
+ var total = 1.0f * size.toFloat() * alpha
+ for (index in 0 until size) {
+ val span = mSpans[index]
+ if (total >= 1.0f) {
+ span.setAlpha(255)
+ total -= 1.0f
+ } else {
+ span.setAlpha((total * 255).toInt())
+ total = 0.0f
+ }
+ }
+ }
+
+ fun addSpan(span: ForegroundAlphaColorSpan) {
+ span.setAlpha((mAlpha * 255).toInt())
+ mSpans.add(span)
+ }
+}
+
+class ShadowSpan(private val radius: Float, var dx: Float, var dy: Float, private val shadowColor: Int) : CharacterStyle(), UpdateAppearance {
+
+ override fun updateDrawState(tp: TextPaint) {
+ tp.setShadowLayer(radius, dx, dy, shadowColor)
+ }
+}
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
new file mode 100644
index 0000000000..f0b6876ad4
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
@@ -0,0 +1,61 @@
+package com.blankj.utilcode.pkg.feature.toast
+
+import android.widget.TextView
+import androidx.annotation.StringRes
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.StringUtils
+import com.blankj.utilcode.util.ToastUtils
+import com.blankj.utilcode.util.ViewUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2017/08/31
+ * desc : demo about ToastUtils
+ * ```
+ */
+object CustomToast {
+
+ fun showShort(text: CharSequence) {
+ show(text, false)
+ }
+
+ fun showShort(@StringRes resId: Int) {
+ show(StringUtils.getString(resId), false)
+ }
+
+ fun showShort(@StringRes resId: Int, vararg args: Any) {
+ show(StringUtils.getString(resId, args), false)
+ }
+
+ fun showShort(format: String, vararg args: Any) {
+ show(StringUtils.format(format, args), false)
+ }
+
+ fun showLong(text: CharSequence) {
+ show(text, true)
+ }
+
+ fun showLong(@StringRes resId: Int) {
+ show(StringUtils.getString(resId), true)
+ }
+
+ fun showLong(@StringRes resId: Int, vararg args: Any) {
+ show(StringUtils.getString(resId, args), true)
+ }
+
+ fun showLong(format: String, vararg args: Any) {
+ show(StringUtils.format(format, args), true)
+ }
+
+ private fun show(text: CharSequence, isLong: Boolean) {
+ val textView = ViewUtils.layoutId2View(R.layout.toast_custom) as TextView
+ textView.text = text
+ ToastUtils.make().setDurationIsLong(isLong).show(textView)
+ }
+
+ fun cancel() {
+ ToastUtils.cancel()
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
new file mode 100644
index 0000000000..f4267ad3a9
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
@@ -0,0 +1,101 @@
+package com.blankj.utilcode.pkg.feature.toast
+
+import android.content.Context
+import android.content.Intent
+import android.graphics.Color
+import android.view.Gravity
+import androidx.core.content.ContextCompat
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.pkg.helper.DialogHelper
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ColorUtils
+import com.blankj.utilcode.util.SpanUtils
+import com.blankj.utilcode.util.ToastUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/09/29
+ * desc : demo about ToastUtils
+ * ```
+ */
+class ToastActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, ToastActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_toast
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemClick(R.string.toast_show_short) {
+ Thread(Runnable { ToastUtils.showShort(R.string.toast_short) }).start()
+ },
+ CommonItemClick(R.string.toast_show_long) {
+ Thread(Runnable { ToastUtils.showLong(R.string.toast_long) }).start()
+ },
+ CommonItemClick(R.string.toast_show_null) {
+ ToastUtils.showLong(null)
+ },
+ CommonItemClick(R.string.toast_show_empty) {
+ ToastUtils.showLong("")
+ },
+ CommonItemClick(R.string.toast_show_span) {
+ ToastUtils.showLong(
+ SpanUtils()
+ .appendImage(R.mipmap.ic_launcher, SpanUtils.ALIGN_CENTER)
+ .appendSpace(32)
+ .append(getString(R.string.toast_span)).setFontSize(24, true)
+ .create()
+ )
+ },
+ CommonItemClick(R.string.toast_show_long_string) {
+ ToastUtils.showLong(R.string.toast_long_string)
+ },
+ CommonItemClick(R.string.toast_show_green_font) {
+ ToastUtils.make().setTextColor(Color.GREEN).setDurationIsLong(true).show(R.string.toast_green_font)
+ },
+ CommonItemClick(R.string.toast_show_bg_color) {
+ ToastUtils.make().setBgColor(ColorUtils.getColor(R.color.colorAccent)).show(R.string.toast_bg_color)
+ },
+ CommonItemClick(R.string.toast_show_bg_resource) {
+ ToastUtils.make().setBgResource(R.drawable.toast_round_rect).show(R.string.toast_custom_bg)
+ },
+ CommonItemClick(R.string.toast_show_left_icon) {
+ ToastUtils.make().setLeftIcon(R.mipmap.ic_launcher).show(R.string.toast_show_left_icon)
+ },
+ CommonItemClick(R.string.toast_show_dark_mode) {
+ ToastUtils.make().setTopIcon(R.mipmap.ic_launcher).setMode(ToastUtils.MODE.DARK).show(R.string.toast_show_dark_mode)
+ },
+ CommonItemClick(R.string.toast_show_middle) {
+ ToastUtils.make().setGravity(Gravity.CENTER, 0, 0).show(R.string.toast_middle)
+ },
+ CommonItemClick(R.string.toast_show_top) {
+ ToastUtils.make().setGravity(Gravity.TOP or Gravity.CENTER_HORIZONTAL, 0, 0).show(R.string.toast_top)
+ },
+ CommonItemClick(R.string.toast_show_custom_view) {
+ Thread(Runnable { CustomToast.showLong(R.string.toast_custom_view) }).start()
+ },
+ CommonItemClick(R.string.toast_cancel) {
+ ToastUtils.cancel()
+ },
+ CommonItemClick(R.string.toast_show_toast_dialog) {
+ DialogHelper.showToastDialog()
+ },
+ CommonItemClick(R.string.toast_show_toast_when_start_activity) {
+ ToastUtils.showLong(R.string.toast_show_toast_when_start_activity)
+ start(this)
+ }
+ )
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/uiMessage/UiMessageActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/uiMessage/UiMessageActivity.kt
new file mode 100644
index 0000000000..a486645654
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/uiMessage/UiMessageActivity.kt
@@ -0,0 +1,78 @@
+package com.blankj.utilcode.pkg.feature.uiMessage
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.UiMessageUtils
+
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2020/04/14
+ * desc : demo about UiMessageUtils
+ * ```
+ */
+class UiMessageActivity : CommonActivity(), UiMessageUtils.UiMessageCallback {
+
+ private val titleItem: CommonItemTitle = CommonItemTitle("", true);
+ private var sendContent: String = ""
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, UiMessageActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_uiMessage
+ }
+
+ override fun bindItems(): List> {
+ return CollectionUtils.newArrayList(
+ titleItem,
+ CommonItemClick(R.string.uiMessage_add_listener_id) {
+ UiMessageUtils.getInstance().addListener(R.id.utilCodeUiMessageAddListenerId, this)
+ },
+ CommonItemClick(R.string.uiMessage_remove_all_id) {
+ UiMessageUtils.getInstance().removeListeners(R.id.utilCodeUiMessageAddListenerId)
+ },
+ CommonItemClick(R.string.uiMessage_add_listener) {
+ UiMessageUtils.getInstance().addListener(this)
+ },
+ CommonItemClick(R.string.uiMessage_remove_listener) {
+ UiMessageUtils.getInstance().removeListener(this)
+ },
+ CommonItemClick(R.string.uiMessage_send) {
+ sendContent = "send: UiMessageActivity#${UiMessageActivity.hashCode()}"
+ titleItem.title = ""
+ UiMessageUtils.getInstance().send(R.id.utilCodeUiMessageAddListenerId, UiMessageActivity)
+ }
+ )
+ }
+
+ override fun handleMessage(localMessage: UiMessageUtils.UiMessage) {
+ if (localMessage.id == R.id.utilCodeUiMessageAddListenerId) {
+ var content: String = sendContent
+ content += "\nreceive: UiMessageActivity#${localMessage.getObject().hashCode()}"
+ titleItem.title = if (titleItem.title.toString().isEmpty()) {
+ content
+ } else {
+ titleItem.title.toString() + "\n" + content
+ }
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ UiMessageUtils.getInstance().removeListeners(R.id.utilCodeUiMessageAddListenerId)
+ UiMessageUtils.getInstance().removeListener(this)
+ }
+}
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt
new file mode 100644
index 0000000000..5dc337bc5b
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt
@@ -0,0 +1,66 @@
+package com.blankj.utilcode.pkg.feature.vibrate
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.VibrateUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2018/12/29
+ * desc : demo about VibrateUtils
+ * ```
+ */
+class VibrateActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, VibrateActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_vibrate
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemClick(R.string.vibrate_1000ms) {
+ VibrateUtils.vibrate(1000)
+ },
+ CommonItemClick(R.string.vibrate_custom) {
+ VibrateUtils.vibrate(longArrayOf(0, 1000, 1000, 2000, 2000, 1000), 1)
+ },
+ CommonItemClick(R.string.vibrate_background) {
+ backHome()
+ mContentView.postDelayed({
+// VibrateUtils.vibrate(1000) -- can not vibrate in background
+ VibrateUtils.vibrateCompat(longArrayOf(0, 1000, 1000, 2000, 2000, 1000), 1)
+// VibrateUtils.vibrateCompat(1000)
+ }, 1000)
+ },
+ CommonItemClick(R.string.vibrate_cancel) {
+ VibrateUtils.cancel()
+ }
+ )
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ VibrateUtils.cancel()
+ }
+
+ private fun backHome() {
+ val intent = Intent(Intent.ACTION_MAIN).apply {
+ addCategory(Intent.CATEGORY_HOME)
+ }
+ startActivity(intent)
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/volume/VolumeActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/volume/VolumeActivity.kt
new file mode 100644
index 0000000000..26d67dda07
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/volume/VolumeActivity.kt
@@ -0,0 +1,63 @@
+package com.blankj.utilcode.pkg.feature.volume
+
+import android.content.Context
+import android.content.Intent
+import android.media.AudioManager
+import android.widget.SeekBar
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemSeekBar
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.VolumeUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2018/12/29
+ * desc : demo about VibrateUtils
+ * ```
+ */
+class VolumeActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, VolumeActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_volume
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ getItemSeekBar("Voice Call", AudioManager.STREAM_VOICE_CALL),
+ getItemSeekBar("System", AudioManager.STREAM_SYSTEM),
+ getItemSeekBar("Music", AudioManager.STREAM_MUSIC),
+ getItemSeekBar("Ring", AudioManager.STREAM_RING),
+ getItemSeekBar("Alarm", AudioManager.STREAM_ALARM),
+ getItemSeekBar("Notification", AudioManager.STREAM_NOTIFICATION),
+ getItemSeekBar("Dtmf", AudioManager.STREAM_DTMF)
+ )
+ }
+
+ private fun getItemSeekBar(title: CharSequence, streamType: Int): CommonItemSeekBar {
+ return CommonItemSeekBar(title, VolumeUtils.getMaxVolume(streamType), object : CommonItemSeekBar.ProgressListener() {
+ override fun getCurValue(): Int {
+ return VolumeUtils.getVolume(streamType)
+ }
+
+ override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
+ VolumeUtils.setVolume(streamType, progress, AudioManager.FLAG_SHOW_UI)
+ }
+ })
+ }
+
+ override fun onResume() {
+ super.onResume()
+ itemsView.updateItems(bindItems())
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
new file mode 100644
index 0000000000..7d38fda3ca
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
@@ -0,0 +1,158 @@
+package com.blankj.utilcode.pkg.helper
+
+import android.content.Context
+import android.content.DialogInterface
+import android.graphics.Bitmap
+import android.graphics.drawable.ColorDrawable
+import android.text.method.ScrollingMovementMethod
+import android.view.Gravity
+import android.view.View
+import android.view.Window
+import android.widget.Button
+import android.widget.EditText
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.fragment.app.FragmentActivity
+import com.blankj.base.dialog.BaseDialogFragment
+import com.blankj.base.dialog.DialogLayoutCallback
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.ActivityUtils
+import com.blankj.utilcode.util.KeyboardUtils
+import com.blankj.utilcode.util.ScreenUtils
+import com.blankj.utilcode.util.ToastUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2018/01/10
+ * desc : helper about dialog
+ * ```
+ */
+object DialogHelper {
+
+ fun showKeyboardDialog(context: Context) {
+ BaseDialogFragment().init(context, object : DialogLayoutCallback {
+ override fun bindTheme(): Int {
+ return View.NO_ID
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.keyboard_dialog
+ }
+
+ override fun initView(dialog: BaseDialogFragment, contentView: View) {
+ dialog.dialog.setCanceledOnTouchOutside(false)
+
+ val keyboardDialogEt = contentView.findViewById(R.id.keyboardDialogEt)
+ val listener = View.OnClickListener { v ->
+ when (v.id) {
+ R.id.keyboardDialogHideSoftInputBtn -> KeyboardUtils.hideSoftInput(keyboardDialogEt)
+ R.id.keyboardDialogShowSoftInputBtn -> KeyboardUtils.showSoftInput(keyboardDialogEt)
+ R.id.keyboardDialogToggleSoftInputBtn -> KeyboardUtils.toggleSoftInput()
+ R.id.keyboardDialogCloseBtn -> {
+ KeyboardUtils.hideSoftInput(keyboardDialogEt)
+ dialog.dismiss()
+ }
+ }
+ }
+ contentView.findViewById(R.id.keyboardDialogHideSoftInputBtn).setOnClickListener(listener)
+ contentView.findViewById(R.id.keyboardDialogShowSoftInputBtn).setOnClickListener(listener)
+ contentView.findViewById(R.id.keyboardDialogToggleSoftInputBtn).setOnClickListener(listener)
+ contentView.findViewById(R.id.keyboardDialogCloseBtn).setOnClickListener(listener)
+
+ dialog.dialog.setOnShowListener(DialogInterface.OnShowListener {
+ KeyboardUtils.fixAndroidBug5497(dialog.dialog.window!!)
+ KeyboardUtils.showSoftInput()
+ })
+ }
+
+ override fun setWindowStyle(window: Window) {
+ window.setBackgroundDrawable(ColorDrawable(0))
+ val attributes = window.attributes
+ attributes.gravity = Gravity.BOTTOM
+ attributes.width = ScreenUtils.getAppScreenWidth()
+ attributes.height = ScreenUtils.getAppScreenHeight() * 2 / 5
+ attributes.windowAnimations = R.style.BottomDialogAnimation
+ window.attributes = attributes
+ }
+
+ override fun onCancel(dialog: BaseDialogFragment) {}
+
+ override fun onDismiss(dialog: BaseDialogFragment) {}
+ }).show()
+ }
+
+ fun showFragmentDialog(info: CharSequence) {
+ val topActivity = ActivityUtils.getTopActivity() ?: return
+ BaseDialogFragment().init(topActivity as FragmentActivity, object : DialogLayoutCallback {
+ override fun bindTheme(): Int {
+ return R.style.CommonContentDialogStyle
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.fragment_dialog
+ }
+
+ override fun initView(dialog: BaseDialogFragment, contentView: View) {
+ val aboutTv = contentView.findViewById(R.id.fragmentDialogAboutTv)
+ aboutTv.movementMethod = ScrollingMovementMethod.getInstance()
+ aboutTv.text = info
+ }
+
+ override fun setWindowStyle(window: Window) {}
+
+ override fun onCancel(dialog: BaseDialogFragment) {}
+
+ override fun onDismiss(dialog: BaseDialogFragment) {}
+ }).show()
+ }
+
+ fun showScreenshotDialog(screenshot: Bitmap) {
+ val topActivity = ActivityUtils.getTopActivity() ?: return
+ BaseDialogFragment().init(topActivity as FragmentActivity, object : DialogLayoutCallback {
+ override fun bindTheme(): Int {
+ return R.style.CommonContentDialogStyle
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.screen_dialog
+ }
+
+ override fun initView(dialog: BaseDialogFragment, contentView: View) {
+ contentView.findViewById(R.id.screenDialogScreenshotIv)
+ .setImageBitmap(screenshot)
+ }
+
+ override fun setWindowStyle(window: Window) {}
+
+ override fun onCancel(dialog: BaseDialogFragment) {}
+
+ override fun onDismiss(dialog: BaseDialogFragment) {}
+ }).show()
+ }
+
+ fun showToastDialog() {
+ val topActivity = ActivityUtils.getTopActivity() ?: return
+ BaseDialogFragment().init(topActivity as FragmentActivity, object : DialogLayoutCallback {
+ override fun bindTheme(): Int {
+ return R.style.CommonContentDialogStyle
+ }
+
+ override fun bindLayout(): Int {
+ return R.layout.toast_dialog
+ }
+
+ override fun initView(dialog: BaseDialogFragment, contentView: View) {
+ contentView.findViewById(R.id.toastDialogShowShortToastBtn)
+ .setOnClickListener { ToastUtils.showShort("Short") }
+ }
+
+ override fun setWindowStyle(window: Window) {}
+
+ override fun onCancel(dialog: BaseDialogFragment) {}
+
+ override fun onDismiss(dialog: BaseDialogFragment) {}
+ }).show()
+ }
+}
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/anim/fade_in_1000.xml b/feature/utilcode/pkg/src/main/res/anim/fade_in_1000.xml
new file mode 100644
index 0000000000..644fafcbad
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/anim/fade_in_1000.xml
@@ -0,0 +1,6 @@
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/anim/fade_out_1000.xml b/feature/utilcode/pkg/src/main/res/anim/fade_out_1000.xml
new file mode 100644
index 0000000000..30b74cb723
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/anim/fade_out_1000.xml
@@ -0,0 +1,6 @@
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/anim/slide_bottom_in_200.xml b/feature/utilcode/pkg/src/main/res/anim/slide_bottom_in_200.xml
new file mode 100755
index 0000000000..a3012c2433
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/anim/slide_bottom_in_200.xml
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/anim/slide_bottom_out_200.xml b/feature/utilcode/pkg/src/main/res/anim/slide_bottom_out_200.xml
new file mode 100755
index 0000000000..758f8def70
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/anim/slide_bottom_out_200.xml
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res_core/anim/slide_out_left_1000.xml b/feature/utilcode/pkg/src/main/res/anim/slide_left_out_1000.xml
similarity index 100%
rename from app/src/main/res_core/anim/slide_out_left_1000.xml
rename to feature/utilcode/pkg/src/main/res/anim/slide_left_out_1000.xml
diff --git a/app/src/main/res_core/anim/slide_in_right_1000.xml b/feature/utilcode/pkg/src/main/res/anim/slide_right_in_1000.xml
similarity index 100%
rename from app/src/main/res_core/anim/slide_in_right_1000.xml
rename to feature/utilcode/pkg/src/main/res/anim/slide_right_in_1000.xml
diff --git a/app/src/main/res_core/animator/fragment_slide_left_enter.xml b/feature/utilcode/pkg/src/main/res/animator/fragment_slide_left_enter.xml
similarity index 100%
rename from app/src/main/res_core/animator/fragment_slide_left_enter.xml
rename to feature/utilcode/pkg/src/main/res/animator/fragment_slide_left_enter.xml
diff --git a/app/src/main/res_core/animator/fragment_slide_left_exit.xml b/feature/utilcode/pkg/src/main/res/animator/fragment_slide_left_exit.xml
similarity index 100%
rename from app/src/main/res_core/animator/fragment_slide_left_exit.xml
rename to feature/utilcode/pkg/src/main/res/animator/fragment_slide_left_exit.xml
diff --git a/app/src/main/res_core/animator/fragment_slide_right_enter.xml b/feature/utilcode/pkg/src/main/res/animator/fragment_slide_right_enter.xml
similarity index 100%
rename from app/src/main/res_core/animator/fragment_slide_right_enter.xml
rename to feature/utilcode/pkg/src/main/res/animator/fragment_slide_right_enter.xml
diff --git a/app/src/main/res_core/animator/fragment_slide_right_exit.xml b/feature/utilcode/pkg/src/main/res/animator/fragment_slide_right_exit.xml
similarity index 100%
rename from app/src/main/res_core/animator/fragment_slide_right_exit.xml
rename to feature/utilcode/pkg/src/main/res/animator/fragment_slide_right_exit.xml
diff --git a/app/src/main/res_core/drawable/ic_activity_icon.png b/feature/utilcode/pkg/src/main/res/drawable/activity_activity_icon.png
similarity index 100%
rename from app/src/main/res_core/drawable/ic_activity_icon.png
rename to feature/utilcode/pkg/src/main/res/drawable/activity_activity_icon.png
diff --git a/app/src/main/res_core/drawable/ic_activity_logo.png b/feature/utilcode/pkg/src/main/res/drawable/activity_activity_logo.png
similarity index 100%
rename from app/src/main/res_core/drawable/ic_activity_logo.png
rename to feature/utilcode/pkg/src/main/res/drawable/activity_activity_logo.png
diff --git a/feature/utilcode/pkg/src/main/res/drawable/bar_status_custom.xml b/feature/utilcode/pkg/src/main/res/drawable/bar_status_custom.xml
new file mode 100644
index 0000000000..50a4898a07
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/drawable/bar_status_custom.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res_core/drawable/ic_vector_alpha.xml b/feature/utilcode/pkg/src/main/res/drawable/bar_status_nav_alpha.xml
similarity index 97%
rename from app/src/main/res_core/drawable/ic_vector_alpha.xml
rename to feature/utilcode/pkg/src/main/res/drawable/bar_status_nav_alpha.xml
index bab250acf1..cd1aae4cd2 100644
--- a/app/src/main/res_core/drawable/ic_vector_alpha.xml
+++ b/feature/utilcode/pkg/src/main/res/drawable/bar_status_nav_alpha.xml
@@ -1,9 +1,9 @@
+ android:width="35dp"
+ android:height="24dp"
+ android:viewportHeight="1024"
+ android:viewportWidth="1502">
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportHeight="1024"
+ android:viewportWidth="1024">
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res_core/drawable/ic_vector_image.xml b/feature/utilcode/pkg/src/main/res/drawable/bar_status_nav_image.xml
similarity index 93%
rename from app/src/main/res_core/drawable/ic_vector_image.xml
rename to feature/utilcode/pkg/src/main/res/drawable/bar_status_nav_image.xml
index d76ba7c0ae..a14f3af0a4 100644
--- a/app/src/main/res_core/drawable/ic_vector_image.xml
+++ b/feature/utilcode/pkg/src/main/res/drawable/bar_status_nav_image.xml
@@ -1,9 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="1024"
+ android:viewportHeight="1024">
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="1024"
+ android:viewportHeight="1024">
+
+
+
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/drawable/shadow_circle.xml b/feature/utilcode/pkg/src/main/res/drawable/shadow_circle.xml
new file mode 100644
index 0000000000..7abb0e7159
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/drawable/shadow_circle.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/drawable/shadow_round_rect.xml b/feature/utilcode/pkg/src/main/res/drawable/shadow_round_rect.xml
new file mode 100644
index 0000000000..576688b254
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/drawable/shadow_round_rect.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res_core/drawable/shape_top_round_rect.xml b/feature/utilcode/pkg/src/main/res/drawable/snackbar_custom_bg.xml
similarity index 100%
rename from app/src/main/res_core/drawable/shape_top_round_rect.xml
rename to feature/utilcode/pkg/src/main/res/drawable/snackbar_custom_bg.xml
diff --git a/app/src/main/res_core/drawable/shape_spannable_block_high.xml b/feature/utilcode/pkg/src/main/res/drawable/span_block_high.xml
similarity index 100%
rename from app/src/main/res_core/drawable/shape_spannable_block_high.xml
rename to feature/utilcode/pkg/src/main/res/drawable/span_block_high.xml
diff --git a/app/src/main/res_core/drawable/shape_spannable_block_low.xml b/feature/utilcode/pkg/src/main/res/drawable/span_block_low.xml
similarity index 100%
rename from app/src/main/res_core/drawable/shape_spannable_block_low.xml
rename to feature/utilcode/pkg/src/main/res/drawable/span_block_low.xml
diff --git a/app/src/main/res_core/drawable/span_cheetah.png b/feature/utilcode/pkg/src/main/res/drawable/span_cheetah.png
similarity index 100%
rename from app/src/main/res_core/drawable/span_cheetah.png
rename to feature/utilcode/pkg/src/main/res/drawable/span_cheetah.png
diff --git a/app/src/main/res_core/drawable/shape_round_rect.xml b/feature/utilcode/pkg/src/main/res/drawable/toast_round_rect.xml
similarity index 100%
rename from app/src/main/res_core/drawable/shape_round_rect.xml
rename to feature/utilcode/pkg/src/main/res/drawable/toast_round_rect.xml
diff --git a/feature/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml b/feature/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
new file mode 100644
index 0000000000..278fe8c2c6
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/feature/utilcode/pkg/src/main/res/layout/activity_item_shared_element_activity.xml b/feature/utilcode/pkg/src/main/res/layout/activity_item_shared_element_activity.xml
new file mode 100644
index 0000000000..1ae0c3f964
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/activity_item_shared_element_activity.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res_core/layout/activity_activity_sub.xml b/feature/utilcode/pkg/src/main/res/layout/activity_sub_activity.xml
similarity index 66%
rename from app/src/main/res_core/layout/activity_activity_sub.xml
rename to feature/utilcode/pkg/src/main/res/layout/activity_sub_activity.xml
index 2065d5656a..96ad7a773d 100644
--- a/app/src/main/res_core/layout/activity_activity_sub.xml
+++ b/feature/utilcode/pkg/src/main/res/layout/activity_sub_activity.xml
@@ -1,17 +1,15 @@
-
diff --git a/feature/utilcode/pkg/src/main/res/layout/adaptscreen_close_activity.xml b/feature/utilcode/pkg/src/main/res/layout/adaptscreen_close_activity.xml
new file mode 100644
index 0000000000..2f8476a4a0
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/adaptscreen_close_activity.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/layout/adaptscreen_height_activity.xml b/feature/utilcode/pkg/src/main/res/layout/adaptscreen_height_activity.xml
new file mode 100644
index 0000000000..75fa87e8e5
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/adaptscreen_height_activity.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/layout/adaptscreen_width_activity.xml b/feature/utilcode/pkg/src/main/res/layout/adaptscreen_width_activity.xml
new file mode 100644
index 0000000000..b6bfdb2c80
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/adaptscreen_width_activity.xml
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/layout/bar_status_alpha_activity.xml b/feature/utilcode/pkg/src/main/res/layout/bar_status_alpha_activity.xml
new file mode 100644
index 0000000000..0e44e92e02
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/bar_status_alpha_activity.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/layout/bar_status_alpha_fragment.xml b/feature/utilcode/pkg/src/main/res/layout/bar_status_alpha_fragment.xml
new file mode 100644
index 0000000000..8ee1ca308c
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/bar_status_alpha_fragment.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
diff --git a/feature/utilcode/pkg/src/main/res/layout/bar_status_color_fragment.xml b/feature/utilcode/pkg/src/main/res/layout/bar_status_color_fragment.xml
new file mode 100644
index 0000000000..9a9ec8f3d8
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/bar_status_color_fragment.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/feature/utilcode/pkg/src/main/res/layout/bar_status_custom_fragment.xml b/feature/utilcode/pkg/src/main/res/layout/bar_status_custom_fragment.xml
new file mode 100644
index 0000000000..33a8f1e431
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/bar_status_custom_fragment.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/feature/utilcode/pkg/src/main/res/layout/bar_status_drawer_activity.xml b/feature/utilcode/pkg/src/main/res/layout/bar_status_drawer_activity.xml
new file mode 100644
index 0000000000..9f0324e6a0
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/bar_status_drawer_activity.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/activity_bar_status_fragment.xml b/feature/utilcode/pkg/src/main/res/layout/bar_status_fragment_activity.xml
similarity index 63%
rename from app/src/main/res_core/layout/activity_bar_status_fragment.xml
rename to feature/utilcode/pkg/src/main/res/layout/bar_status_fragment_activity.xml
index 13beb04e6f..16518fc22f 100644
--- a/app/src/main/res_core/layout/activity_bar_status_fragment.xml
+++ b/feature/utilcode/pkg/src/main/res/layout/bar_status_fragment_activity.xml
@@ -1,26 +1,24 @@
-
-
-
+ app:menu="@menu/status_bar_nav" />
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/layout/bar_status_image_view_activity.xml b/feature/utilcode/pkg/src/main/res/layout/bar_status_image_view_activity.xml
new file mode 100644
index 0000000000..deb777407e
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/bar_status_image_view_activity.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/layout/bar_status_image_view_fragment.xml b/feature/utilcode/pkg/src/main/res/layout/bar_status_image_view_fragment.xml
new file mode 100644
index 0000000000..f7cc6202c7
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/bar_status_image_view_fragment.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/activity_fragment.xml b/feature/utilcode/pkg/src/main/res/layout/fragment_activity.xml
similarity index 68%
rename from app/src/main/res_core/layout/activity_fragment.xml
rename to feature/utilcode/pkg/src/main/res/layout/fragment_activity.xml
index 4394d49af7..ab89e8e725 100644
--- a/app/src/main/res_core/layout/activity_fragment.xml
+++ b/feature/utilcode/pkg/src/main/res/layout/fragment_activity.xml
@@ -1,6 +1,5 @@
-
-
+ app:menu="@menu/fragment_nav" />
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/layout/fragment_child.xml b/feature/utilcode/pkg/src/main/res/layout/fragment_child.xml
new file mode 100644
index 0000000000..46d08d7b82
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/fragment_child.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/layout/fragment_container.xml b/feature/utilcode/pkg/src/main/res/layout/fragment_container.xml
new file mode 100644
index 0000000000..46d08d7b82
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/fragment_container.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/layout/fragment_dialog.xml b/feature/utilcode/pkg/src/main/res/layout/fragment_dialog.xml
new file mode 100644
index 0000000000..7e8aa92c9a
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/fragment_dialog.xml
@@ -0,0 +1,9 @@
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/layout/fragment_item_shared_element.xml b/feature/utilcode/pkg/src/main/res/layout/fragment_item_shared_element.xml
new file mode 100644
index 0000000000..bd06cf49d4
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/fragment_item_shared_element.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/feature/utilcode/pkg/src/main/res/layout/fragment_root.xml b/feature/utilcode/pkg/src/main/res/layout/fragment_root.xml
new file mode 100644
index 0000000000..1eabb1b936
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/fragment_root.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/layout/keyboard_activity.xml b/feature/utilcode/pkg/src/main/res/layout/keyboard_activity.xml
new file mode 100644
index 0000000000..947b981509
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/keyboard_activity.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/activity_keyboard.xml b/feature/utilcode/pkg/src/main/res/layout/keyboard_dialog.xml
similarity index 50%
rename from app/src/main/res_core/layout/activity_keyboard.xml
rename to feature/utilcode/pkg/src/main/res/layout/keyboard_dialog.xml
index 13fd53eedc..35493183f8 100644
--- a/app/src/main/res_core/layout/activity_keyboard.xml
+++ b/feature/utilcode/pkg/src/main/res/layout/keyboard_dialog.xml
@@ -2,56 +2,53 @@
+ android:background="@drawable/keyboard_dialog_bg"
+ android:fillViewport="true">
-
-
-
+ android:layout_below="@id/keyboardDialogToggleSoftInputBtn"
+ android:layout_marginTop="@dimen/spacing_6"
+ android:text="@string/keyboard_close_dialog" />
diff --git a/feature/utilcode/pkg/src/main/res/layout/mvp_activity.xml b/feature/utilcode/pkg/src/main/res/layout/mvp_activity.xml
new file mode 100644
index 0000000000..d594eb654d
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/mvp_activity.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/layout/screen_dialog.xml b/feature/utilcode/pkg/src/main/res/layout/screen_dialog.xml
new file mode 100644
index 0000000000..e5644ddac0
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/screen_dialog.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
diff --git a/feature/utilcode/pkg/src/main/res/layout/shadow_activity.xml b/feature/utilcode/pkg/src/main/res/layout/shadow_activity.xml
new file mode 100644
index 0000000000..c8fca04657
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/shadow_activity.xml
@@ -0,0 +1,182 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res_core/layout/snackbar_custom.xml b/feature/utilcode/pkg/src/main/res/layout/snackbar_custom.xml
similarity index 72%
rename from app/src/main/res_core/layout/snackbar_custom.xml
rename to feature/utilcode/pkg/src/main/res/layout/snackbar_custom.xml
index bc12d70a8a..10dbc26c7f 100644
--- a/app/src/main/res_core/layout/snackbar_custom.xml
+++ b/feature/utilcode/pkg/src/main/res/layout/snackbar_custom.xml
@@ -1,11 +1,10 @@
-
-
-
-
+ android:text="@string/toast_show_short" />
-
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/menu/fragment_nav.xml b/feature/utilcode/pkg/src/main/res/menu/fragment_nav.xml
new file mode 100644
index 0000000000..617a39bf0f
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/menu/fragment_nav.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/feature/utilcode/pkg/src/main/res/menu/status_bar_nav.xml b/feature/utilcode/pkg/src/main/res/menu/status_bar_nav.xml
new file mode 100644
index 0000000000..0dd52fbcf9
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/menu/status_bar_nav.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res_core/raw/test.txt b/feature/utilcode/pkg/src/main/res/raw/test.txt
similarity index 100%
rename from app/src/main/res_core/raw/test.txt
rename to feature/utilcode/pkg/src/main/res/raw/test.txt
diff --git a/app/src/main/res_core/transition/explode_1000.xml b/feature/utilcode/pkg/src/main/res/transition/explode_1000.xml
similarity index 75%
rename from app/src/main/res_core/transition/explode_1000.xml
rename to feature/utilcode/pkg/src/main/res/transition/explode_1000.xml
index 8086af432e..a87f4cb83c 100644
--- a/app/src/main/res_core/transition/explode_1000.xml
+++ b/feature/utilcode/pkg/src/main/res/transition/explode_1000.xml
@@ -1,3 +1,3 @@
\ No newline at end of file
+ android:duration="1000" />
\ No newline at end of file
diff --git a/app/src/main/res_core/transition/fade_1000.xml b/feature/utilcode/pkg/src/main/res/transition/fade_1000.xml
similarity index 75%
rename from app/src/main/res_core/transition/fade_1000.xml
rename to feature/utilcode/pkg/src/main/res/transition/fade_1000.xml
index 828cbb1818..81b43c210e 100644
--- a/app/src/main/res_core/transition/fade_1000.xml
+++ b/feature/utilcode/pkg/src/main/res/transition/fade_1000.xml
@@ -1,3 +1,3 @@
+ android:duration="1000" />
diff --git a/app/src/main/res_core/transition/slide_1000.xml b/feature/utilcode/pkg/src/main/res/transition/slide_1000.xml
similarity index 75%
rename from app/src/main/res_core/transition/slide_1000.xml
rename to feature/utilcode/pkg/src/main/res/transition/slide_1000.xml
index d2ece28775..ece4260af9 100644
--- a/app/src/main/res_core/transition/slide_1000.xml
+++ b/feature/utilcode/pkg/src/main/res/transition/slide_1000.xml
@@ -1,3 +1,3 @@
+ android:duration="1000" />
diff --git a/feature/utilcode/pkg/src/main/res/values-en-rUS/strings.xml b/feature/utilcode/pkg/src/main/res/values-en-rUS/strings.xml
new file mode 100644
index 0000000000..20efc6c063
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/values-en-rUS/strings.xml
@@ -0,0 +1,12 @@
+
+
+
+ Language Demo
+
+ Apply Simple Chinese
+ Apply American
+ Apply English
+ Apply Arabic
+ Apply System
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/values-zh-rCN/strings.xml b/feature/utilcode/pkg/src/main/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000000..e06759a6d0
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/values-zh-rCN/strings.xml
@@ -0,0 +1,12 @@
+
+
+
+ 语言例子
+
+ 设置简体中文
+ 设置美语
+ 设置英语
+ 设置阿拉伯语
+ 设置系统语言
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/values/ids.xml b/feature/utilcode/pkg/src/main/res/values/ids.xml
new file mode 100644
index 0000000000..00728ce459
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/values/ids.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res_core/values/strings.xml b/feature/utilcode/pkg/src/main/res/values/strings.xml
similarity index 56%
rename from app/src/main/res_core/values/strings.xml
rename to feature/utilcode/pkg/src/main/res/values/strings.xml
index 5292e3c2ec..551f9adbaf 100644
--- a/app/src/main/res_core/values/strings.xml
+++ b/feature/utilcode/pkg/src/main/res/values/strings.xml
@@ -1,29 +1,48 @@
-
+
ActivityUtils Demo
+ AdaptScreenUtils Demo
+ ApiUtils Demo
AppUtils Demo
BarUtils Demo
+ BrightnessUtils Demo
+ BusUtils Demo
CleanUtils Demo
+ ClickUtils Demo
+ ClipboardUtils Demo
CrashUtils Demo
DeviceUtils Demo
+ FileUtils Demo
+ FlashlightUtils Demo
FragmentUtils Demo
ImageUtils Demo
+ IntentUtils Demo
KeyboardUtils Demo
+ Language Demo
LogUtils Demo
- MetaData Demo
+ MessengerUtils Demo
+ MetaDataUtils Demo
+ Mvp Demo
NetworkUtils Demo
- Path Demo
+ PathUtils Demo
+ Notification Demo
PermissionUtils Demo
PhoneUtils Demo
ProcessUtils Demo
ReflectUtils Demo
ResourceUtils Demo
ScreenUtils Demo
+ RomUtils Demo
SDCardUtils Demo
- Snackbar Demo
- SP Demo
+ Shadow Demo
+ SnackbarUtils Demo
+ SPStaticUtils Demo
SpanUtils Demo
ToastUtils Demo
+ UiMessage Demo
+ TransActivity Demo
+ VibrateUtils Demo
+ VolumeUtils Demo
Shared Element
@@ -53,19 +72,24 @@
Act Intents Anim
Start Activities
Start Home Activity
- Finish MainActivity
- Finish To MainActivity
+ Start Launcher Activity
+ Finish CoreUtilActivity
+ Finish To CoreUtilActivity
+ Finish All Activities Except Newest
Finish All Activities
+
+ Invoke With Params
+ Invoke With Return Value
+ Post Bus
+
Install Test App
Test app have installed
- Install Test App Silently
Install successfully
Install unsuccessfully
Uninstall Test App
Please install test app first
- Uninstall App Silently
Uninstall successfully
Uninstall unsuccessfully
Launch App
@@ -73,21 +97,24 @@
Launch App Details Settings
Exit App
+
+ Adapt Width
+ Adapt Height
+ Close Adapt pt equals dp
+
About Status Bar
About Nav Bar
About Notification Bar
About Status
- Show Status
- Hide Status
- Light Mode Status
- Dark Mode Status
+ Status Visibility
+ Light Mode
Set Color
Set Alpha
Set Image View
+ Set Custom
Set Fragment
- Set Swipe Back
Set Drawer
Random Color
Set Transparent
@@ -95,42 +122,70 @@
Alpha
Front
Image
+ Custom
About Notification
Show Notification And Hide After 2s
About Nav
- Show Nav
- Hide Nav
- Immersive Nav
+ Nav Visibility
+ Light Mode
Set Nav Color Random
+
+ Auto Brightness
+
Clean Internal Cache
Clean Internal Files
Clean Internal Databases
Clean Internal SP
Clean External Cache
+ cleanAppUserData
+
+
+ Click View Scale Default
+ Click View Scale 50%
+ Click View Alpha Default
+ Click Bg Alpha Default
+ Click Bg Dark Default
+ Click Global Debouncing
+ Click Single Debouncing
+ Click Multi
+ The view does not respond to clicks within 5 seconds.
+ The views which set global debouncing does not respond to clicks within 5 seconds.
+
+
+
+ Register
+ Unregister
+ Post
+ Post Basic Type
+ Post Sticky
+ Post To IO Thread
+ Remove Sticky
+ Start BusUtils Vs EventBus
+ Compare Register 10000 Times
+ Compare Post To 1 Subscriber 1000000 Times
+ Compare Post To 100 Subscribers 100000 Times
+ Compare Unregister 10000 Times
-
- Shutdown
- Reboot
- Reboot To Recovery
- Reboot To Bootloader
+
+ Flashlight Status
Fragment0
Fragment1
Fragment2
Show Stack
- Add
+ Add Child
+ Add Child Stack
Add Hide
Add Hide Stack
Add Demo1 Show
- Add Child
Pop
+ Remove
Pop To Root
- Pop Add
Hide Demo0 Show Demo1
Hide Demo1 Show Demo0
Replace
@@ -156,7 +211,6 @@
Fast Blur
Render Script Blur
Stack Blur
- Save
Compress By Scale
Compress By Quality Half
Compress By Quality Max Size
@@ -165,8 +219,8 @@
Open Wireless Settings
- Set Data Enabled
- Set Wifi Enabled
+ Mobile Data Enabled
+ Wifi Enabled
Hide Soft Input
@@ -175,17 +229,23 @@
Show Dialog
Close Dialog
-
- Toggle Log
- Toggle Console
- Toggle Tag
- Toggle Head
- Toggle Border
- Toggle Single
- Toggle Console Filter
- Toggle File Filter
- Toggle File
- Toggle Dir
+
+ Relaunch App
+ Apply Simple Chinese
+ Apply American
+ Apply English
+ Apply Arabic
+ Apply System
+
+
+ Log Switch
+ Console Switch
+ Console Listener Switch
+ Head Switch
+ File Switch
+ File Listener Switch
+ Border Switch
+ Single Tag Switch
Log With No Tag
Log With Tag
Log In New Thread
@@ -200,62 +260,63 @@
Log Bundle
Log Intent
Log Array List
+ Log Map
+
+
+ Post To Main Server
+ Post To Self Client
+ Start Remote
+ Register Remote client
+ Unregister Remote Client
+
+
+ Notify
+ Cancel
+ Cancel All
+ Show
Open App Settings
- Request Calendar
- Request Record Audio
- Request Calendar And Record Audio
+ Calendar Status
+ Record Audio Status
+ Calendar And Record Audio Status
+ Write Settings Status
+ Draw Overlays Status
Dial
Call
Send SMS
- Send SMS Silent
Kill All Background Processes
- Test Assets
- Test Raw
+ Copy File From Assets to Cache
+ Copy File From Raw to Cache
- Set Fullscreen
- Set NonFullscreen
- Toggle Fullscreen
- Set Landscape
- Set Portrait
Screenshot
- Set Sleep Duration
- Test Adapt Screen
- System Toast
- Util Toast
- System Dialog
- System Dialog Without Adapt
- Show Short Snackbar
- Show Short Snackbar With Action
- Show Long Snackbar
- Show Long Snackbar With Action
- Show Indefinite Snackbar
- Show Indefinite Snackbar With Action
- Add View
- Add View With Action
- Show Success
- Show Warning
- Show Error
- Dismiss Snackbar
Short Snackbar
+ Short Snackbar Top
+ Short Snackbar With Action
+ Short Snackbar With Action Top
Long Snackbar
+ Long Snackbar With Action
Indefinite Snackbar
- Click
- Custom View
+ Indefinite Snackbar With Action
+ Add View
+ Add View With Action
Success
Warning
Error
+ Dismiss Snackbar
+ Click
+ Custom View
+ Click To Dismiss
Put String
@@ -263,20 +324,29 @@
Put Long
Put Float
Put Boolean
+ Put String Set
Clear
Show Short
Show Long
+ Show Null
+ Show Empty
Show Green Font
Show Bg Color
Show Bg Resource
Show Span
+ Show Left Icon
+ Show Dark Mode
+ Show Long String
+ A toast is a view containing a quick little message for the user. The ToastUtils class helps you create and show those.
Show Custom View
Custom View
Show Middle
+ Show Top
Cancel
-
+ Show Toast Dialog
+ Show Toast When Start Activity
Short
Long
Green Font
@@ -284,4 +354,18 @@
Custom Bg
Spannable String
Middle
+ Top
+
+
+ Add Listener Id
+ Remove All Id
+ Add Listener
+ Remove Listener
+ Send
+
+
+ Vibrate 1000ms
+ Vibrate Custom
+ Vibrate Background
+ Cancel
diff --git a/feature/utilcode/pkg/src/main/res/values/styles.xml b/feature/utilcode/pkg/src/main/res/values/styles.xml
new file mode 100644
index 0000000000..a92300c878
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/values/styles.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index 1d3591c8a4..b9d5f2bcbf 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,18 +1,26 @@
# Project-wide Gradle settings.
-
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
-
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
-
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
-
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
\ No newline at end of file
+# org.gradle.parallel=true
+#org.gradle.jvmargs=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
+
+android.enableJetifier=true
+android.useAndroidX=true
+
+org.gradle.jvmargs=-Xmx8192m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -XX:-UseGCOverheadLimit -Dfile.encoding=UTF-8
+org.gradle.daemon=true
+#org.gradle.configureondemand=true
+org.gradle.parallel=true
+org.gradle.caching=true
+
+#-Dorg.gradle.debug=true --no-daemon
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 13372aef5e..5c2d1cf016 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 35422079cc..1e0ae1a108 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Sat Mar 31 15:05:28 CST 2018
+#Mon May 06 10:07:23 CST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
diff --git a/gradlew b/gradlew
index 9d82f78915..b0d6d0ab5d 100755
--- a/gradlew
+++ b/gradlew
@@ -1,4 +1,20 @@
-#!/usr/bin/env bash
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
##############################################################################
##
@@ -6,20 +22,38 @@
##
##############################################################################
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
-warn ( ) {
+warn () {
echo "$*"
}
-die ( ) {
+die () {
echo
echo "$*"
echo
@@ -30,6 +64,7 @@ die ( ) {
cygwin=false
msys=false
darwin=false
+nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
@@ -40,26 +75,11 @@ case "`uname`" in
MINGW* )
msys=true
;;
+ NONSTOP* )
+ nonstop=true
+ ;;
esac
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
@@ -85,7 +105,7 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -150,11 +170,19 @@ if $cygwin ; then
esac
fi
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index 8a0b282aa6..15e1ee37a7 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -1,90 +1,100 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem http://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/lib/base/.gitignore b/lib/base/.gitignore
new file mode 100644
index 0000000000..796b96d1c4
--- /dev/null
+++ b/lib/base/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/lib/base/build.gradle b/lib/base/build.gradle
new file mode 100644
index 0000000000..b7eb9d588c
--- /dev/null
+++ b/lib/base/build.gradle
@@ -0,0 +1,14 @@
+dependencies {
+ api Config.modules.lib_subutil.dep
+ api Config.modules.lib_utilcode.dep
+
+ api Config.libs.androidx_appcompat.path
+ api Config.libs.androidx_material.path
+ api Config.libs.androidx_multidex.path
+ api Config.libs.androidx_constraint.path
+ api Config.libs.kotlin.path
+ api Config.libs.free_proguard.path
+ api Config.libs.swipe_panel.path
+ api Config.libs.eventbus_lib.path
+ compileOnly Config.modules.lib_utildebug_no_op.dep
+}
\ No newline at end of file
diff --git a/lib/base/proguard-rules.pro b/lib/base/proguard-rules.pro
new file mode 100644
index 0000000000..f1b424510d
--- /dev/null
+++ b/lib/base/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/lib/base/src/main/AndroidManifest.xml b/lib/base/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..3744b24f38
--- /dev/null
+++ b/lib/base/src/main/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/base/src/main/java/com/blankj/base/BaseActivity.java b/lib/base/src/main/java/com/blankj/base/BaseActivity.java
new file mode 100644
index 0000000000..c0348203f8
--- /dev/null
+++ b/lib/base/src/main/java/com/blankj/base/BaseActivity.java
@@ -0,0 +1,56 @@
+package com.blankj.base;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+
+import androidx.annotation.LayoutRes;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.blankj.utilcode.util.ClickUtils;
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/10/24
+ * desc : base about activity
+ *
+ */
+public abstract class BaseActivity extends AppCompatActivity
+ implements IBaseView {
+
+ private View.OnClickListener mClickListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onDebouncingClick(v);
+ }
+ };
+
+ public View mContentView;
+ public Activity mActivity;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ mActivity = this;
+ super.onCreate(savedInstanceState);
+ initData(getIntent().getExtras());
+ setContentView();
+ initView(savedInstanceState, mContentView);
+ doBusiness();
+ }
+
+ @Override
+ public void setContentView() {
+ if (bindLayout() <= 0) return;
+ mContentView = LayoutInflater.from(this).inflate(bindLayout(), null);
+ setContentView(mContentView);
+ }
+
+ public void applyDebouncingClickListener(View... views) {
+ ClickUtils.applyGlobalDebouncing(views, mClickListener);
+ ClickUtils.applyPressedViewScale(views);
+ }
+}
+
diff --git a/app/src/main/java/com/blankj/androidutilcode/UtilsApp.java b/lib/base/src/main/java/com/blankj/base/BaseApplication.java
similarity index 58%
rename from app/src/main/java/com/blankj/androidutilcode/UtilsApp.java
rename to lib/base/src/main/java/com/blankj/base/BaseApplication.java
index bebafe99a3..f1fd6186c0 100644
--- a/app/src/main/java/com/blankj/androidutilcode/UtilsApp.java
+++ b/lib/base/src/main/java/com/blankj/base/BaseApplication.java
@@ -1,14 +1,16 @@
-package com.blankj.androidutilcode;
+package com.blankj.base;
-import android.annotation.SuppressLint;
+import android.app.Application;
import android.content.Context;
-import com.blankj.androidutilcode.base.BaseApplication;
+import androidx.multidex.MultiDex;
+
import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.CrashUtils;
import com.blankj.utilcode.util.LogUtils;
-import com.blankj.utilcode.util.ToastUtils;
-import com.squareup.leakcanary.LeakCanary;
+import com.blankj.utilcode.util.ProcessUtils;
+import com.blankj.utildebug.DebugUtils;
+import com.blankj.utildebug.debug.IDebug;
import java.util.ArrayList;
@@ -16,54 +18,49 @@
*
* author: Blankj
* blog : http://blankj.com
- * time : 2016/10/12
- * desc : app about utils
+ * time : 2018/11/16
+ * desc : base about application
*
*/
-public class UtilsApp extends BaseApplication {
+public class BaseApplication extends Application {
- private static UtilsApp sInstance;
+ private static BaseApplication sInstance;
- public static UtilsApp getInstance() {
+ public static BaseApplication getInstance() {
return sInstance;
}
+ private Boolean isDebug;
+ private Boolean isMainProcess;
+
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
+ MultiDex.install(this);
}
@Override
public void onCreate() {
super.onCreate();
sInstance = this;
- initLeakCanary();
initLog();
initCrash();
- }
-
- private void initLeakCanary() {
- // 内存泄露检查工具
- if (LeakCanary.isInAnalyzerProcess(this)) {
- // This process is dedicated to LeakCanary for heap analysis.
- // You should not init your app in this process.
- return;
- }
- LeakCanary.install(this);
+ initDebugMenu();
}
// init it in ur application
public void initLog() {
- final LogUtils.Config config = LogUtils.getConfig()
- .setLogSwitch(BuildConfig.DEBUG)// 设置 log 总开关,包括输出到控制台和文件,默认开
- .setConsoleSwitch(BuildConfig.DEBUG)// 设置是否输出到控制台开关,默认开
+ LogUtils.Config config = LogUtils.getConfig()
+ .setLogSwitch(isDebug())// 设置 log 总开关,包括输出到控制台和文件,默认开
+ .setConsoleSwitch(isDebug())// 设置是否输出到控制台开关,默认开
.setGlobalTag(null)// 设置 log 全局标签,默认为空
// 当全局标签不为空时,我们输出的 log 全部为该 tag,
// 为空时,如果传入的 tag 为空那就显示类名,否则显示 tag
.setLogHeadSwitch(true)// 设置 log 头信息开关,默认为开
.setLog2FileSwitch(false)// 打印 log 时是否存到文件的开关,默认关
.setDir("")// 当自定义路径为空时,写入应用的/cache/log/目录中
- .setFilePrefix("")// 当文件前缀为空时,默认为"util",即写入文件为"util-yyyy-MM-dd.txt"
+ .setFilePrefix("")// 当文件前缀为空时,默认为"util",即写入文件为"util-yyyy-MM-dd$fileExtension"
+ .setFileExtension(".log")// 设置日志文件后缀
.setBorderSwitch(true)// 输出日志是否带边框开关,默认开
.setSingleTagSwitch(true)// 一条日志仅输出一条,默认开,为美化 AS 3.1 的 Logcat
.setConsoleFilter(LogUtils.V)// log 的控制台过滤器,和 logcat 过滤器同理,默认 Verbose
@@ -74,23 +71,36 @@ public void initLog() {
// 新增 ArrayList 格式化器,默认已支持 Array, Throwable, Bundle, Intent 的格式化输出
.addFormatter(new LogUtils.IFormatter() {
@Override
- public String format(ArrayList list) {
- return "LogUtils Formatter ArrayList { " + list.toString() + " }";
+ public String format(ArrayList arrayList) {
+ return "LogUtils Formatter ArrayList { " + arrayList.toString() + " }";
}
- });
- LogUtils.d(config.toString());
+ })
+ .addFileExtraHead("ExtraKey", "ExtraValue");
+ LogUtils.i(config.toString());
}
- @SuppressLint("MissingPermission")
private void initCrash() {
CrashUtils.init(new CrashUtils.OnCrashListener() {
@Override
- public void onCrash(String crashInfo, Throwable e) {
- LogUtils.e(crashInfo);
+ public void onCrash(CrashUtils.CrashInfo crashInfo) {
+ crashInfo.addExtraHead("extraKey", "extraValue");
+ LogUtils.e(crashInfo.toString());
AppUtils.relaunchApp();
}
});
}
-}
+ private void initDebugMenu() {
+ DebugUtils.addDebugs(new ArrayList());
+ }
+
+ private boolean isDebug() {
+ if (isDebug == null) isDebug = AppUtils.isAppDebug();
+ return isDebug;
+ }
+ public boolean isMainProcess() {
+ if (isMainProcess == null) isMainProcess = ProcessUtils.isMainProcess();
+ return isMainProcess;
+ }
+}
diff --git a/lib/base/src/main/java/com/blankj/base/BaseFragment.java b/lib/base/src/main/java/com/blankj/base/BaseFragment.java
new file mode 100644
index 0000000000..ab2b8877fe
--- /dev/null
+++ b/lib/base/src/main/java/com/blankj/base/BaseFragment.java
@@ -0,0 +1,176 @@
+package com.blankj.base;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.blankj.utilcode.util.AppUtils;
+import com.blankj.utilcode.util.ClickUtils;
+
+import androidx.annotation.IdRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2017/03/28
+ * desc : base about v4-fragment
+ *
+ */
+public abstract class BaseFragment extends Fragment
+ implements IBaseView {
+
+ private static Boolean isDebug;
+
+ private static final String STATE_SAVE_IS_HIDDEN = "STATE_SAVE_IS_HIDDEN";
+
+ private View.OnClickListener mClickListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onDebouncingClick(v);
+ }
+ };
+
+ protected AppCompatActivity mActivity;
+ protected LayoutInflater mInflater;
+ protected View mContentView;
+
+ protected boolean mIsVisibleToUser;
+ protected boolean mIsBusinessDone;
+ protected boolean mIsInPager;
+
+ /**
+ * @return true true {@link #doBusiness()} will lazy in view pager, false otherwise
+ */
+ public boolean isLazy() {
+ return false;
+ }
+
+ @Override
+ public void setUserVisibleHint(boolean isVisibleToUser) {
+ log("setUserVisibleHint: " + isVisibleToUser);
+ super.setUserVisibleHint(isVisibleToUser);
+ mIsInPager = true;
+ if (isVisibleToUser) mIsVisibleToUser = true;
+ if (isLazy()) {
+ if (!mIsBusinessDone && isVisibleToUser && mContentView != null) {
+ mIsBusinessDone = true;
+ doBusiness();
+ }
+ }
+ }
+
+ @Override
+ public void onAttach(Context context) {
+ log("onAttach");
+ super.onAttach(context);
+ mActivity = (AppCompatActivity) context;
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ log("onCreate");
+ super.onCreate(savedInstanceState);
+ FragmentManager fm = getFragmentManager();
+ if (fm == null) return;
+ if (savedInstanceState != null) {
+ boolean isSupportHidden = savedInstanceState.getBoolean(STATE_SAVE_IS_HIDDEN);
+ FragmentTransaction ft = fm.beginTransaction();
+ if (isSupportHidden) {
+ ft.hide(this);
+ } else {
+ ft.show(this);
+ }
+ ft.commitNowAllowingStateLoss();
+ }
+ Bundle bundle = getArguments();
+ initData(bundle);
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ log("onCreateView");
+ super.onCreateView(inflater, container, savedInstanceState);
+ mInflater = inflater;
+ setContentView();
+ return mContentView;
+ }
+
+ @Override
+ public void setContentView() {
+ if (bindLayout() <= 0) return;
+ mContentView = mInflater.inflate(bindLayout(), null);
+ }
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ log("onViewCreated");
+ super.onViewCreated(view, savedInstanceState);
+ }
+
+ @Override
+ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+ log("onActivityCreated");
+ super.onActivityCreated(savedInstanceState);
+ initView(savedInstanceState, mContentView);
+ if (!mIsInPager || !isLazy() || mIsVisibleToUser) {
+ mIsBusinessDone = true;
+ doBusiness();
+ }
+ }
+
+ @Override
+ public void onHiddenChanged(boolean hidden) {
+ log("onHiddenChanged: " + hidden);
+ super.onHiddenChanged(hidden);
+ }
+
+ @Override
+ public void onDestroyView() {
+ log("onDestroyView");
+ super.onDestroyView();
+ mIsVisibleToUser = false;
+ mIsBusinessDone = false;
+ }
+
+ @Override
+ public void onSaveInstanceState(@NonNull Bundle outState) {
+ log("onSaveInstanceState");
+ super.onSaveInstanceState(outState);
+ outState.putBoolean(STATE_SAVE_IS_HIDDEN, isHidden());
+ }
+
+ @Override
+ public void onDestroy() {
+ log("onDestroy");
+ super.onDestroy();
+ }
+
+ public void applyDebouncingClickListener(View... views) {
+ ClickUtils.applyGlobalDebouncing(views, mClickListener);
+ }
+
+ public T findViewById(@IdRes int id) {
+ if (mContentView == null) throw new NullPointerException("ContentView is null.");
+ return mContentView.findViewById(id);
+ }
+
+ protected void log(String msg) {
+ if (isDebug == null) {
+ isDebug = AppUtils.isAppDebug();
+ }
+ if (isDebug) {
+ Log.d("BaseFragment", getClass().getSimpleName() + ": " + msg);
+ }
+ }
+}
diff --git a/lib/base/src/main/java/com/blankj/base/IBaseView.java b/lib/base/src/main/java/com/blankj/base/IBaseView.java
new file mode 100644
index 0000000000..821cbf4399
--- /dev/null
+++ b/lib/base/src/main/java/com/blankj/base/IBaseView.java
@@ -0,0 +1,32 @@
+package com.blankj.base;
+
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2018/11/16
+ * desc :
+ *
+ */
+public interface IBaseView {
+
+ void initData(@Nullable Bundle bundle);
+
+ int bindLayout();
+
+ void setContentView();
+
+ void initView(@Nullable Bundle savedInstanceState, @Nullable View contentView);
+
+ void doBusiness();
+
+ void onDebouncingClick(@NonNull View view);
+}
diff --git a/lib/base/src/main/java/com/blankj/base/dialog/BaseDialog.java b/lib/base/src/main/java/com/blankj/base/dialog/BaseDialog.java
new file mode 100644
index 0000000000..1599d8becc
--- /dev/null
+++ b/lib/base/src/main/java/com/blankj/base/dialog/BaseDialog.java
@@ -0,0 +1,78 @@
+package com.blankj.base.dialog;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.View;
+import android.view.Window;
+
+import com.blankj.utilcode.util.ActivityUtils;
+import com.blankj.utilcode.util.ThreadUtils;
+
+import androidx.annotation.NonNull;
+
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2019/11/11
+ * desc :
+ *
+ */
+public abstract class BaseDialog extends Dialog {
+
+ protected Activity mActivity;
+
+ public abstract int bindLayout();
+
+ public abstract void initView(BaseDialog dialog, View contentView);
+
+ public abstract void setWindowStyle(Window window);
+
+ public BaseDialog(@NonNull Context context) {
+ this(context, 0);
+ }
+
+ public BaseDialog(@NonNull Context context, int themeResId) {
+ super(context, themeResId);
+ Activity activity = ActivityUtils.getActivityByContext(context);
+ if (activity == null) {
+ throw new IllegalArgumentException("context is not instance of Activity.");
+ }
+ mActivity = activity;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ View contentView = View.inflate(mActivity, bindLayout(), null);
+ setContentView(contentView);
+ initView(this, contentView);
+ setWindowStyle(getWindow());
+ }
+
+ @Override
+ public void show() {
+ ThreadUtils.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (ActivityUtils.isActivityAlive(getContext())) {
+ BaseDialog.super.show();
+ }
+ }
+ });
+ }
+
+ @Override
+ public void dismiss() {
+ ThreadUtils.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (ActivityUtils.isActivityAlive(getContext())) {
+ BaseDialog.super.dismiss();
+ }
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/lib/base/src/main/java/com/blankj/base/dialog/BaseDialogFragment.java b/lib/base/src/main/java/com/blankj/base/dialog/BaseDialogFragment.java
new file mode 100644
index 0000000000..e115e78878
--- /dev/null
+++ b/lib/base/src/main/java/com/blankj/base/dialog/BaseDialogFragment.java
@@ -0,0 +1,159 @@
+package com.blankj.base.dialog;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+
+import com.blankj.utilcode.util.ActivityUtils;
+import com.blankj.utilcode.util.LogUtils;
+import com.blankj.utilcode.util.ThreadUtils;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
+
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2019/11/11
+ * desc :
+ *
+ */
+public class BaseDialogFragment extends DialogFragment {
+
+ protected DialogLayoutCallback mDialogLayoutCallback;
+ protected DialogCallback mDialogCallback;
+
+ protected FragmentActivity mActivity;
+ protected View mContentView;
+
+ public BaseDialogFragment init(Context context, DialogLayoutCallback listener) {
+ mActivity = getFragmentActivity(context);
+ mDialogLayoutCallback = listener;
+ return this;
+ }
+
+ public BaseDialogFragment init(Context context, DialogCallback dialogCallback) {
+ mActivity = getFragmentActivity(context);
+ mDialogCallback = dialogCallback;
+ return this;
+ }
+
+ private FragmentActivity getFragmentActivity(Context context) {
+ Activity activity = ActivityUtils.getActivityByContext(context);
+ if (activity == null) return null;
+ if (activity instanceof FragmentActivity) {
+ return (FragmentActivity) activity;
+ }
+ LogUtils.w(context + "not instanceof FragmentActivity");
+ return null;
+ }
+
+ @Override
+ public int getTheme() {
+ if (mDialogLayoutCallback != null) {
+ int theme = mDialogLayoutCallback.bindTheme();
+ if (theme != View.NO_ID) {
+ return theme;
+ }
+ }
+ return super.getTheme();
+ }
+
+ @NonNull
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ Dialog dialog;
+ if (mDialogCallback != null) {
+ dialog = mDialogCallback.bindDialog(mActivity);
+ } else {
+ dialog = super.onCreateDialog(savedInstanceState);
+ }
+ Window window = dialog.getWindow();
+ if (mDialogCallback != null) {
+ mDialogCallback.setWindowStyle(window);
+ } else if (mDialogLayoutCallback != null) {
+ mDialogLayoutCallback.setWindowStyle(window);
+ }
+ return dialog;
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ if (mDialogLayoutCallback != null) {
+ return inflater.inflate(mDialogLayoutCallback.bindLayout(), container, false);
+ }
+ return super.onCreateView(inflater, container, savedInstanceState);
+ }
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ if (mDialogLayoutCallback != null) {
+ mDialogLayoutCallback.initView(this, view);
+ return;
+ }
+ super.onViewCreated(view, savedInstanceState);
+ }
+
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ super.onCancel(dialog);
+ if (mDialogLayoutCallback != null) {
+ mDialogLayoutCallback.onCancel(this);
+ }
+ }
+
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ super.onDismiss(dialog);
+ if (mDialogLayoutCallback != null) {
+ mDialogLayoutCallback.onDismiss(this);
+ }
+ }
+
+ public void show() {
+ show(getClass().getSimpleName());
+ }
+
+ public void show(final String tag) {
+ ThreadUtils.runOnUiThread(new Runnable() {
+ @SuppressLint("CommitTransaction")
+ @Override
+ public void run() {
+ if (ActivityUtils.isActivityAlive(mActivity)) {
+ FragmentManager fm = mActivity.getSupportFragmentManager();
+ Fragment prev = fm.findFragmentByTag(tag);
+ if (prev != null) {
+ fm.beginTransaction().remove(prev);
+ }
+ BaseDialogFragment.super.show(fm, tag);
+ }
+ }
+ });
+ }
+
+ @Override
+ public void dismiss() {
+ ThreadUtils.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (ActivityUtils.isActivityAlive(mActivity)) {
+ BaseDialogFragment.super.dismissAllowingStateLoss();
+ }
+ }
+ });
+ }
+}
+
+
diff --git a/lib/base/src/main/java/com/blankj/base/dialog/DialogCallback.java b/lib/base/src/main/java/com/blankj/base/dialog/DialogCallback.java
new file mode 100644
index 0000000000..defd34483f
--- /dev/null
+++ b/lib/base/src/main/java/com/blankj/base/dialog/DialogCallback.java
@@ -0,0 +1,22 @@
+package com.blankj.base.dialog;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.view.Window;
+
+import androidx.annotation.NonNull;
+
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2019/11/12
+ * desc :
+ *
+ */
+public interface DialogCallback {
+ @NonNull
+ Dialog bindDialog(Activity activity);
+
+ void setWindowStyle(Window window);
+}
diff --git a/lib/base/src/main/java/com/blankj/base/dialog/DialogLayoutCallback.java b/lib/base/src/main/java/com/blankj/base/dialog/DialogLayoutCallback.java
new file mode 100644
index 0000000000..ea5c9a77cf
--- /dev/null
+++ b/lib/base/src/main/java/com/blankj/base/dialog/DialogLayoutCallback.java
@@ -0,0 +1,26 @@
+package com.blankj.base.dialog;
+
+import android.view.View;
+import android.view.Window;
+
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2019/11/12
+ * desc :
+ *
+ */
+public interface DialogLayoutCallback {
+ int bindTheme();
+
+ int bindLayout();
+
+ void initView(BaseDialogFragment dialog, View contentView);
+
+ void setWindowStyle(Window window);
+
+ void onCancel(BaseDialogFragment dialog);
+
+ void onDismiss(BaseDialogFragment dialog);
+}
diff --git a/lib/base/src/main/java/com/blankj/base/mvp/BaseModel.java b/lib/base/src/main/java/com/blankj/base/mvp/BaseModel.java
new file mode 100644
index 0000000000..b48ed32f23
--- /dev/null
+++ b/lib/base/src/main/java/com/blankj/base/mvp/BaseModel.java
@@ -0,0 +1,25 @@
+package com.blankj.base.mvp;
+
+import android.util.Log;
+
+import androidx.annotation.CallSuper;
+
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2019/08/02
+ * desc :
+ *
+ */
+public abstract class BaseModel {
+
+ private static final String TAG = BaseView.TAG;
+
+ public abstract void onCreate();
+
+ @CallSuper
+ public void onDestroy() {
+ Log.i(TAG, "destroy model: " + getClass().getSimpleName());
+ }
+}
diff --git a/lib/base/src/main/java/com/blankj/base/mvp/BasePresenter.java b/lib/base/src/main/java/com/blankj/base/mvp/BasePresenter.java
new file mode 100644
index 0000000000..32e672417b
--- /dev/null
+++ b/lib/base/src/main/java/com/blankj/base/mvp/BasePresenter.java
@@ -0,0 +1,73 @@
+package com.blankj.base.mvp;
+
+import android.util.Log;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import androidx.annotation.CallSuper;
+import androidx.lifecycle.ViewModel;
+import androidx.lifecycle.ViewModelProvider;
+
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2019/08/02
+ * desc :
+ *
+ */
+public abstract class BasePresenter {
+
+ private static final String TAG = BaseView.TAG;
+
+ private V mView;
+ private Map, BaseModel> mModelMap = new HashMap<>();
+ private boolean isAlive = true;
+
+ public abstract void onBindView();
+
+ void bindView(V view) {
+ this.mView = view;
+ onBindView();
+ }
+
+ public V getView() {
+ return mView;
+ }
+
+ public M getModel(Class modelClass) {
+ BaseModel baseModel = mModelMap.get(modelClass);
+ if (baseModel != null) {
+ //noinspection unchecked
+ return (M) baseModel;
+ }
+ try {
+ M model = modelClass.newInstance();
+ mModelMap.put(modelClass, model);
+ model.onCreate();
+ return model;
+ } catch (IllegalAccessException e) {
+ Log.e("BasePresenter", "getModel", e);
+ } catch (InstantiationException e) {
+ Log.e("BasePresenter", "getModel", e);
+ }
+ return null;
+ }
+
+ @CallSuper
+ public void onDestroy() {
+ Log.i(TAG, "destroy presenter: " + getClass().getSimpleName());
+ isAlive = false;
+ for (BaseModel model : mModelMap.values()) {
+ if (model != null) {
+ model.onDestroy();
+ }
+ }
+ mModelMap.clear();
+ }
+
+ public boolean isAlive() {
+ return isAlive;
+ }
+}
diff --git a/lib/base/src/main/java/com/blankj/base/mvp/BaseView.java b/lib/base/src/main/java/com/blankj/base/mvp/BaseView.java
new file mode 100644
index 0000000000..a68909d01f
--- /dev/null
+++ b/lib/base/src/main/java/com/blankj/base/mvp/BaseView.java
@@ -0,0 +1,114 @@
+package com.blankj.base.mvp;
+
+import android.util.Log;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import androidx.annotation.CallSuper;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
+
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2019/08/02
+ * desc :
+ *
+ */
+public class BaseView implements LifecycleObserver {
+
+ public static final String TAG = "UtilsMVP";
+
+ private FragmentActivity mActivity;
+ private Fragment mFragment;
+ private Lifecycle mLifecycle;
+ private Map, BasePresenter> mPresenterMap = new HashMap<>();
+
+ public BaseView(Fragment fragment) {
+ mFragment = fragment;
+ mActivity = fragment.getActivity();
+ mLifecycle = mFragment.getLifecycle();
+ addLifecycle(this);
+ }
+
+ public BaseView(FragmentActivity activity) {
+ mActivity = activity;
+ mLifecycle = mActivity.getLifecycle();
+ addLifecycle(this);
+ }
+
+ public BaseView(Lifecycle lifecycle) {
+ mLifecycle = lifecycle;
+ addLifecycle(this);
+ }
+
+ public T getActivity() {
+ if (mActivity == null) {
+ return null;
+ }
+ //noinspection unchecked
+ return (T) mActivity;
+ }
+
+ public T getFragment() {
+ if (mFragment == null) {
+ return null;
+ }
+ //noinspection unchecked
+ return (T) mFragment;
+ }
+
+ public V addPresenter(BasePresenter presenter) {
+ if (presenter == null) return (V) this;
+ mPresenterMap.put(presenter.getClass(), presenter);
+ //noinspection unchecked
+ presenter.bindView((V) this);
+ return (V) this;
+ }
+
+ public > P getPresenter(Class
presenterClass) {
+ if (presenterClass == null) {
+ throw new IllegalArgumentException("presenterClass is null!");
+ }
+ BasePresenter basePresenter = mPresenterMap.get(presenterClass);
+ if (basePresenter == null) {
+ throw new IllegalArgumentException("presenter of <" + presenterClass.getSimpleName() + "> is not added!");
+ }
+ //noinspection unchecked
+ return (P) basePresenter;
+ }
+
+ @CallSuper
+ @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
+ public void onDestroy() {
+ Log.i(TAG, "destroy view: " + getClass().getSimpleName());
+ removeLifecycle(this);
+ for (BasePresenter presenter : mPresenterMap.values()) {
+ if (presenter != null) {
+ presenter.onDestroy();
+ }
+ }
+ mPresenterMap.clear();
+ }
+
+ private void addLifecycle(LifecycleObserver observer) {
+ if (mLifecycle == null) {
+ Log.w(TAG, "addLifecycle: mLifecycle is null");
+ return;
+ }
+ mLifecycle.addObserver(observer);
+ }
+
+ private void removeLifecycle(LifecycleObserver observer) {
+ if (mLifecycle == null) {
+ Log.w(TAG, "removeLifecycle: mLifecycle is null");
+ return;
+ }
+ mLifecycle.removeObserver(observer);
+ }
+}
diff --git a/lib/base/src/main/java/com/blankj/base/rv/BaseItem.java b/lib/base/src/main/java/com/blankj/base/rv/BaseItem.java
new file mode 100644
index 0000000000..b0d6de04fa
--- /dev/null
+++ b/lib/base/src/main/java/com/blankj/base/rv/BaseItem.java
@@ -0,0 +1,169 @@
+package com.blankj.base.rv;
+
+import android.util.SparseArray;
+import android.util.SparseIntArray;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.List;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2019/03/16
+ * desc :
+ *
+ */
+public abstract class BaseItem {
+
+ private static final SparseIntArray LAYOUT_SPARSE_ARRAY = new SparseIntArray();
+ private static final SparseArray VIEW_SPARSE_ARRAY = new SparseArray<>();
+ public boolean isBindViewHolder = false;
+
+ static ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ int layoutByType = LAYOUT_SPARSE_ARRAY.get(viewType, -1);
+ if (layoutByType != -1) {
+ return new ItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(layoutByType, parent, false));
+ }
+ View viewByType = VIEW_SPARSE_ARRAY.get(viewType);
+ if (viewByType != null) {
+ return new ItemViewHolder(viewByType);
+ }
+ throw new RuntimeException("onCreateViewHolder: get holder from view type failed.");
+ }
+
+ public abstract void bind(@NonNull final ItemViewHolder holder, final int position);
+
+ public void partialUpdate(List payloads) {
+ }
+
+ void bindViewHolder(@NonNull final ItemViewHolder holder, final int position) {
+ isBindViewHolder = true;
+ if (mOnItemClickListener != null) {
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mOnItemClickListener != null) {
+ //noinspection unchecked
+ mOnItemClickListener.onItemClick(holder, (T) BaseItem.this, getIndex());
+ }
+ }
+ });
+ } else {
+ holder.itemView.setOnClickListener(null);
+ }
+ if (mOnItemLongClickListener != null) {
+ holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ if (mOnItemLongClickListener != null) {
+ //noinspection unchecked
+ return mOnItemLongClickListener.onItemLongClick(holder, (T) BaseItem.this, getIndex());
+ }
+ return false;
+ }
+ });
+ } else {
+ holder.itemView.setOnLongClickListener(null);
+ }
+ bind(holder, position);
+ }
+
+ public void onViewRecycled(@NonNull final ItemViewHolder holder, final int position) {
+ isBindViewHolder = false;
+ }
+
+ public long getItemId() {
+ return RecyclerView.NO_ID;
+ }
+
+ private int viewType;
+ BaseItemAdapter mAdapter;
+ private OnItemClickListener mOnItemClickListener;
+ private OnItemLongClickListener mOnItemLongClickListener;
+
+ public BaseItem(@LayoutRes int layoutId) {
+ viewType = getViewTypeByLayoutId(layoutId);
+ LAYOUT_SPARSE_ARRAY.put(viewType, layoutId);
+ }
+
+ public BaseItem(@NonNull View view) {
+ viewType = getViewTypeByView(view);
+ VIEW_SPARSE_ARRAY.put(viewType, view);
+ }
+
+ public int getViewType() {
+ return viewType;
+ }
+
+ public BaseItemAdapter getAdapter() {
+ return mAdapter;
+ }
+
+ public boolean isViewType(@LayoutRes int layoutId) {
+ return viewType == getViewTypeByLayoutId(layoutId);
+ }
+
+ public boolean isViewType(@NonNull View view) {
+ return viewType == getViewTypeByView(view);
+ }
+
+ private int getViewTypeByLayoutId(@LayoutRes int layoutId) {
+ return layoutId + getClass().hashCode();
+ }
+
+ private int getViewTypeByView(@NonNull View view) {
+ return view.hashCode() + getClass().hashCode();
+ }
+
+ public void update() {
+ if (getAdapter() == null) return;
+ //noinspection unchecked
+ getAdapter().updateItem((T) this);
+ }
+
+ public List getItems() {
+ return getAdapter().getItems();
+ }
+
+ public int getCount() {
+ return getAdapter().getItemCount();
+ }
+
+ public int getIndex() {
+ //noinspection SuspiciousMethodCalls
+ return getAdapter().getItems().indexOf(this);
+ }
+
+ public OnItemClickListener getOnItemClickListener() {
+ return mOnItemClickListener;
+ }
+
+ public T setOnItemClickListener(OnItemClickListener onItemClickListener) {
+ mOnItemClickListener = onItemClickListener;
+ return (T) this;
+ }
+
+ public OnItemLongClickListener getOnItemLongClickListener() {
+ return mOnItemLongClickListener;
+ }
+
+ public T setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
+ mOnItemLongClickListener = onItemLongClickListener;
+ return (T) this;
+ }
+
+ public interface OnItemClickListener {
+ void onItemClick(ItemViewHolder holder, T item, int position);
+ }
+
+ public interface OnItemLongClickListener {
+ boolean onItemLongClick(ItemViewHolder holder, T item, int position);
+ }
+}
diff --git a/lib/base/src/main/java/com/blankj/base/rv/BaseItemAdapter.java b/lib/base/src/main/java/com/blankj/base/rv/BaseItemAdapter.java
new file mode 100644
index 0000000000..67d5902752
--- /dev/null
+++ b/lib/base/src/main/java/com/blankj/base/rv/BaseItemAdapter.java
@@ -0,0 +1,308 @@
+package com.blankj.base.rv;
+
+import android.view.ViewGroup;
+
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2017/08/22
+ * desc :
+ *
+ */
+public class BaseItemAdapter- extends RecyclerView.Adapter
{
+
+ public List- mItems;
+ private RecyclerView mRecyclerView;
+
+ public BaseItemAdapter() {
+ this(false);
+ }
+
+ public BaseItemAdapter(boolean hasStableIds) {
+ setHasStableIds(hasStableIds);
+ }
+
+ @Override
+ public final int getItemViewType(int position) {
+ Item item = mItems.get(position);
+ item.mAdapter = this;
+ return item.getViewType();
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return mItems.get(position).getItemId();
+ }
+
+ @NonNull
+ @Override
+ public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ return Item.onCreateViewHolder(parent, viewType);
+ }
+
+ @Override
+ public final void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
+ mItems.get(position).bindViewHolder(holder, position);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ItemViewHolder holder, int position, @NonNull List
payloads) {
+ if (payloads.isEmpty()) {
+ super.onBindViewHolder(holder, position, payloads);
+ return;
+ }
+ mItems.get(position).partialUpdate(payloads);
+ }
+
+ @Override
+ public int getItemCount() {
+ return mItems.size();
+ }
+
+ @Override
+ public void onViewRecycled(@NonNull ItemViewHolder holder) {
+ super.onViewRecycled(holder);
+ int position = holder.getAdapterPosition();
+ if (position < 0 || position >= mItems.size()) {
+ return;
+ }
+ mItems.get(position).onViewRecycled(holder, position);
+ }
+
+ @Override
+ public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
+ super.onAttachedToRecyclerView(recyclerView);
+ mRecyclerView = recyclerView;
+ }
+
+ public RecyclerView getRecyclerView() {
+ return mRecyclerView;
+ }
+
+ public void setItems(@NonNull final List- items) {
+ mItems = items;
+ }
+
+ public List
- getItems() {
+ return Collections.unmodifiableList(mItems);
+ }
+
+ public Item getItem(@IntRange(from = 0) final int position) {
+ return mItems.get(position);
+ }
+
+ public boolean isEmpty() {
+ return mItems.isEmpty();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // id
+ ///////////////////////////////////////////////////////////////////////////
+
+ public Item getItemById(final long id) {
+ int itemIndex = getItemIndexById(id);
+ if (itemIndex != -1) {
+ return mItems.get(itemIndex);
+ } else {
+ return null;
+ }
+ }
+
+ public int getItemIndexById(final long id) {
+ for (int i = 0; i < mItems.size(); i++) {
+ if (getItemId(i) == id) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public boolean hasItemWithId(final long id) {
+ return getItemIndexById(id) != -1;
+ }
+
+ public int replaceItemById(final long id, @NonNull final Item item) {
+ return replaceItemById(id, item, false);
+ }
+
+ public int replaceItemById(final long id, @NonNull final Item item, boolean notifyChanged) {
+ int itemIndex = getItemIndexById(id);
+ if (itemIndex != -1) {
+ replaceItem(itemIndex, item, notifyChanged);
+ }
+ return itemIndex;
+ }
+
+ public int removeItemById(final long id) {
+ return removeItemById(id, false);
+ }
+
+ public int removeItemById(final long id, boolean notifyRemoved) {
+ for (int i = 0; i < mItems.size(); i++) {
+ if (getItemId(i) == id) {
+ removeItem(i, notifyRemoved);
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // operate
+ ///////////////////////////////////////////////////////////////////////////
+
+ public void updateItem(@NonNull final Item item) {
+ updateItems(item, 1, null);
+ }
+
+ public void updateItem(@IntRange(from = 0) final int index) {
+ updateItems(index, 1, null);
+ }
+
+ public void updateItem(@NonNull final Item item, Object payload) {
+ updateItems(item, 1, payload);
+ }
+
+ public void updateItem(@IntRange(from = 0) final int index, Object payload) {
+ updateItems(index, 1, payload);
+ }
+
+ public void updateItems(@NonNull final Item item, int itemCount) {
+ int itemIndex = mItems.indexOf(item);
+ if (itemIndex != -1) {
+ updateItems(itemIndex, itemCount);
+ }
+ }
+
+ public void updateItems(@IntRange(from = 0) final int index, int itemCount) {
+ updateItems(index, itemCount, null);
+ }
+
+ public void updateItems(@NonNull final Item item, int itemCount, Object payload) {
+ int itemIndex = mItems.indexOf(item);
+ if (itemIndex != -1) {
+ updateItems(itemIndex, itemCount, payload);
+ }
+ }
+
+ public void updateItems(@IntRange(from = 0) final int index, int itemCount, Object payload) {
+ notifyItemRangeChanged(index, itemCount, payload);
+ }
+
+ public void addItem(@NonNull final Item item) {
+ addItem(item, false);
+ }
+
+ public void addItem(@NonNull final Item item, boolean notifyInserted) {
+ mItems.add(item);
+ if (notifyInserted) notifyItemInserted(mItems.size() - 1);
+ }
+
+ public void addItem(@IntRange(from = 0) final int index, @NonNull final Item item) {
+ addItem(index, item, false);
+ }
+
+ public void addItem(@IntRange(from = 0) final int index, @NonNull final Item item, boolean notifyInserted) {
+ mItems.add(index, item);
+ if (notifyInserted) notifyItemInserted(index);
+ }
+
+ public void addItems(@NonNull final List
- items) {
+ addItems(items, false);
+ }
+
+ public void addItems(@NonNull final List
- items, boolean notifyInserted) {
+ mItems.addAll(items);
+ if (notifyInserted) notifyItemRangeInserted(mItems.size() - items.size() - 1, items.size());
+ }
+
+ public void addItems(@IntRange(from = 0) final int index, @NonNull final List
- items) {
+ addItems(index, items, false);
+ }
+
+ public void addItems(@IntRange(from = 0) final int index, @NonNull final List
- items, boolean notifyInserted) {
+ mItems.addAll(index, items);
+ if (notifyInserted) notifyItemRangeInserted(index, items.size());
+ }
+
+ public void swapItem(@IntRange(from = 0) final int firstIndex, @IntRange(from = 0) final int secondIndex) {
+ swapItem(firstIndex, secondIndex, false);
+ }
+
+ public void swapItem(@IntRange(from = 0) final int firstIndex,
+ @IntRange(from = 0) final int secondIndex, boolean notifyMoved) {
+ Collections.swap(mItems, firstIndex, secondIndex);
+ if (notifyMoved) notifyItemMoved(firstIndex, secondIndex);
+ }
+
+ public Item replaceItem(@IntRange(from = 0) final int index, @NonNull final Item item) {
+ return replaceItem(index, item, false);
+ }
+
+ public Item replaceItem(@IntRange(from = 0) final int index, @NonNull final Item item, boolean notifyChanged) {
+ Item prevItem = mItems.set(index, item);
+ if (notifyChanged) notifyItemChanged(index);
+ return prevItem;
+ }
+
+ public boolean replaceItems(@NonNull final List
- items) {
+ return replaceItems(items, false);
+ }
+
+ public boolean replaceItems(@NonNull final List
- items, boolean notifyChanged) {
+ mItems.clear();
+ boolean added = mItems.addAll(items);
+ if (notifyChanged) notifyDataSetChanged();
+ return added;
+ }
+
+ public Item removeItem(@IntRange(from = 0) final int index) {
+ return removeItem(index, false);
+ }
+
+ public Item removeItem(@IntRange(from = 0) final int index, boolean notifyRemoved) {
+ Item removedItem = mItems.remove(index);
+ if (notifyRemoved) notifyItemRemoved(index);
+ return removedItem;
+ }
+
+ public int removeItem(@NonNull final Item item) {
+ return removeItem(item, false);
+ }
+
+ public int removeItem(@NonNull final Item item, boolean notifyRemoved) {
+ int itemIndex = mItems.indexOf(item);
+ if (itemIndex != -1) {
+ mItems.remove(itemIndex);
+ if (notifyRemoved) notifyItemRemoved(itemIndex);
+ }
+ return itemIndex;
+ }
+
+ public void clear() {
+ clear(false);
+ }
+
+ public void clear(boolean notifyDataSetChanged) {
+ mItems.clear();
+ if (notifyDataSetChanged) notifyDataSetChanged();
+ }
+
+ public void sortItems(@NonNull final Comparator
- comparator) {
+ sortItems(comparator, false);
+ }
+
+ public void sortItems(@NonNull final Comparator
- comparator, boolean notifyDataSetChanged) {
+ Collections.sort(mItems, comparator);
+ if (notifyDataSetChanged) notifyDataSetChanged();
+ }
+}
diff --git a/lib/base/src/main/java/com/blankj/base/rv/ItemViewHolder.java b/lib/base/src/main/java/com/blankj/base/rv/ItemViewHolder.java
new file mode 100644
index 0000000000..e2bf00dfd6
--- /dev/null
+++ b/lib/base/src/main/java/com/blankj/base/rv/ItemViewHolder.java
@@ -0,0 +1,43 @@
+package com.blankj.base.rv;
+
+import androidx.annotation.IdRes;
+import androidx.recyclerview.widget.RecyclerView;
+import android.util.SparseArray;
+import android.view.View;
+
+import java.util.List;
+
+/**
+ *