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.md
deleted file mode 100644
index daea781567..0000000000
--- a/.github/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,44 +0,0 @@
-## Describe the bug
-
-A clear and concise description of what the bug is.
-
-- The version of utilcode:
-- The device:
-- The version of device:
-
-## The code of bug
-
-
-```
-put your code here
-```
-
-## The stack of crash
-
-
-
-```
-put the stack of crash here
-```
-
-## Screenshots
-
-If applicable, add screenshots to help explain your problem.
-
-
-Please delete the current line and the followings.
-
-Thank you for supporting [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode).
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000000..e29c2e45b6
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,52 @@
+---
+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 AndroidUtilCode:
+- The device:
+- The version of device:
+
+## The code of bug
+
+
+```
+put your code here
+```
+
+## The stack of crash
+
+
+
+```
+put the stack of crash here
+```
+
+## Screenshots
+
+If applicable, add screenshots to help explain your problem.
+
+
+## Please delete the current line and the following.
+
+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 faabe23a8b..9d11f56a24 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,15 @@
*.iml
+__api__.json
+__bus__.json
.gradle
-/local.properties
+local.properties
.idea
.DS_Store
/build
/captures
.externalNativeBuild
/apk
-/maven
\ No newline at end of file
+*.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/CHANGELOG.md b/CHANGELOG.md
index fe9c7f0787..73e8145bf1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,150 @@
+* `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.
diff --git a/README-CN.md b/README-CN.md
index 7fc7dc13ff..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]
@@ -35,35 +37,38 @@
[![Blog][blogSvg]][blog] [![jianshu][jianshuSvg]][jianshu] [![weibo][weiboSvg]][weibo] [![QQGroup][qqgroupSvg]][qqgroup]
-## [Update Log][updateLog.md]
+## [Change Log][changeLog.md]
+
+
+## 打个小广告
+欢迎加入我的小专栏「**[基你太美](https://xiaozhuanlan.com/Blankj)**」一起学习。
[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png
-[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.22.0-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
+[result]: https://android-arsenal.com/result?level=14
[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
[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
[changeLog.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/CHANGELOG.md
diff --git a/README.md b/README.md
index 926a16500d..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]
@@ -35,35 +37,38 @@ If this project helps you a lot and you want to support the project's developmen
[![Blog][blogSvg]][blog] [![jianshu][jianshuSvg]][jianshu] [![weibo][weiboSvg]][weibo] [![QQGroup][qqgroupSvg]][qqgroup]
-## [Update Log][update_log.md]
+## [Change Log][changeLog.md]
+
+
+## 打个小广告
+欢迎加入我的小专栏「**[基你太美](https://xiaozhuanlan.com/Blankj)**」一起学习。
[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png
-[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.22.0-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
+[result]: https://android-arsenal.com/result?level=14
[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
[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
[changeLog.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/CHANGELOG.md
diff --git a/app/__bus__.json b/app/__bus__.json
deleted file mode 100644
index 6acb0ff268..0000000000
--- a/app/__bus__.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "CloseAdaptActivity#start": "void com.blankj.androidutilcode.feature.core.adaptScreen.CloseAdaptActivity.start(android.content.Context)"
-}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
deleted file mode 100644
index 303a07b527..0000000000
--- a/app/build.gradle
+++ /dev/null
@@ -1,25 +0,0 @@
-plugins {
- id "com.android.application"
- id 'kotlin-android'
- id 'kotlin-android-extensions'
- id "com.blankj.bus"
-}
-// in config.gradle
-configAndroidDomain project
-
-dependencies {
- implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation project(':utilcode-lib')
- implementation project(':subutil-lib')
-
- implementation dep.support.appcompat_v7
- implementation dep.support.design
- implementation dep.constraint
- implementation dep.kotlin
- implementation dep.free_proguard
- implementation 'com.r0adkll:slidableactivity:2.0.5'
- // LeakCanary
- debugImplementation dep.leakcanary.android
- releaseImplementation dep.leakcanary.android_no_op
-// implementation 'com.blankj:utilcode:1.22.0'
-}
\ No newline at end of file
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 aeaecd9d35..0000000000
--- a/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,221 +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 fcbad1dba2..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/Config.java
+++ /dev/null
@@ -1,37 +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 8cd21dfecd..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/MainActivity.java
+++ /dev/null
@@ -1,72 +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;
-
-/**
- *
- * 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/UtilsApp.java b/app/src/main/java/com/blankj/androidutilcode/UtilsApp.java
deleted file mode 100644
index 4f4951d2a9..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/UtilsApp.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package com.blankj.androidutilcode;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-
-import com.blankj.androidutilcode.base.BaseApplication;
-import com.blankj.utilcode.util.AppUtils;
-import com.blankj.utilcode.util.CrashUtils;
-import com.blankj.utilcode.util.LogUtils;
-import com.squareup.leakcanary.LeakCanary;
-
-import java.util.ArrayList;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/10/12
- * desc : app about utils
- *
- */
-public class UtilsApp extends BaseApplication {
-
- private static UtilsApp sInstance;
-
- public static UtilsApp getInstance() {
- return sInstance;
- }
-
- @Override
- protected void attachBaseContext(Context base) {
- super.attachBaseContext(base);
- }
-
- @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);
- }
-
- // init it in ur application
- public void initLog() {
- final LogUtils.Config config = LogUtils.getConfig()
- .setLogSwitch(BuildConfig.DEBUG)// 设置 log 总开关,包括输出到控制台和文件,默认开
- .setConsoleSwitch(BuildConfig.DEBUG)// 设置是否输出到控制台开关,默认开
- .setGlobalTag(null)// 设置 log 全局标签,默认为空
- // 当全局标签不为空时,我们输出的 log 全部为该 tag,
- // 为空时,如果传入的 tag 为空那就显示类名,否则显示 tag
- .setLogHeadSwitch(true)// 设置 log 头信息开关,默认为开
- .setLog2FileSwitch(false)// 打印 log 时是否存到文件的开关,默认关
- .setDir("")// 当自定义路径为空时,写入应用的/cache/log/目录中
- .setFilePrefix("")// 当文件前缀为空时,默认为"util",即写入文件为"util-yyyy-MM-dd.txt"
- .setBorderSwitch(true)// 输出日志是否带边框开关,默认开
- .setSingleTagSwitch(true)// 一条日志仅输出一条,默认开,为美化 AS 3.1 的 Logcat
- .setConsoleFilter(LogUtils.V)// log 的控制台过滤器,和 logcat 过滤器同理,默认 Verbose
- .setFileFilter(LogUtils.V)// log 文件过滤器,和 logcat 过滤器同理,默认 Verbose
- .setStackDeep(1)// log 栈深度,默认为 1
- .setStackOffset(0)// 设置栈偏移,比如二次封装的话就需要设置,默认为 0
- .setSaveDays(3)// 设置日志可保留天数,默认为 -1 表示无限时长
- // 新增 ArrayList 格式化器,默认已支持 Array, Throwable, Bundle, Intent 的格式化输出
- .addFormatter(new LogUtils.IFormatter() {
- @Override
- public String format(ArrayList list) {
- return "LogUtils Formatter ArrayList { " + list.toString() + " }";
- }
- });
- LogUtils.d(config.toString());
- }
-
- @SuppressLint("MissingPermission")
- private void initCrash() {
- CrashUtils.init(new CrashUtils.OnCrashListener() {
- @Override
- public void onCrash(String crashInfo, Throwable e) {
- LogUtils.e(crashInfo);
- AppUtils.relaunchApp();
- }
- });
- }
-}
-
-
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 42f16d9fa8..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/base/BaseActivity.java
+++ /dev/null
@@ -1,65 +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;
-
-/**
- *
- * 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) {
- 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 197f9065c3..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/base/BaseBackActivity.java
+++ /dev/null
@@ -1,57 +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.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) {
- LayoutInflater.from(this).inflate(layoutId, flActivityContainer);
- }
- setSupportActionBar(mToolbar);
- getToolBar().setDisplayHomeAsUpEnabled(true);
-
- BarUtils.setStatusBarColor(this, ContextCompat.getColor(UtilsApp.getInstance(), R.color.colorPrimary), 0);
- BarUtils.addMarginTopEqualStatusBarHeight(rootLayout);
- }
-
- 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 7e44330965..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/base/BaseDrawerActivity.java
+++ /dev/null
@@ -1,56 +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;
-import com.blankj.utilcode.util.ActivityUtils;
-
-
-/**
- *
- * 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:
- ActivityUtils.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Config.GITHUB)));
- break;
- case R.id.action_blog:
- ActivityUtils.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 490d2aba87..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/base/BaseFragment.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package com.blankj.androidutilcode.base;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.support.annotation.IdRes;
-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: ");
- setRootLayout(bindLayout());
- return mContentView;
- }
-
- protected void setRootLayout(int layoutId) {
- if (layoutId <= 0) return;
- mContentView = mActivity.getLayoutInflater().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 ce17ad7f4b..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/CoreUtilActivity.java
+++ /dev/null
@@ -1,177 +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.metaData.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.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.BusUtils;
-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 adaptScreenClick(View view) {
- BusUtils.post("AdaptScreenActivity#start", this);
-// AdaptScreenActivity.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 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 0e44bd818e..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 c1869269c4..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/adaptScreen/AdaptScreenActivity.kt b/app/src/main/java/com/blankj/androidutilcode/feature/core/adaptScreen/AdaptScreenActivity.kt
deleted file mode 100644
index def91c520d..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/adaptScreen/AdaptScreenActivity.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.blankj.androidutilcode.feature.core.adaptScreen
-
-import android.content.Context
-import android.content.Intent
-import android.os.Bundle
-import android.view.View
-import com.blankj.androidutilcode.R
-import com.blankj.androidutilcode.base.BaseBackActivity
-import com.blankj.utilcode.util.BusUtils
-import kotlinx.android.synthetic.main.activity_adapt_screen.*
-
-class AdaptScreenActivity : BaseBackActivity() {
-
- companion object {
- @BusUtils.Subscribe(name = "AdaptScreenActivity#start")
- fun start(context: Context) {
- val starter = Intent(context, AdaptScreenActivity::class.java)
- context.startActivity(starter)
- }
- }
-
- override fun initData(bundle: Bundle?) {}
-
- override fun bindLayout(): Int {
- return R.layout.activity_adapt_screen;
- }
-
- override fun initView(savedInstanceState: Bundle?, contentView: View?) {
- adaptWidthBtn.setOnClickListener { WidthActivity.start(this) }
- adaptHeightBtn.setOnClickListener { HeightActivity.start(this) }
- closeAdaptBtn.setOnClickListener {
- BusUtils.post("CloseAdaptActivity#start", this)
-// CloseAdaptActivity.start(this)
- }
- }
-
- override fun doBusiness() {}
-
- override fun onWidgetClick(view: View?) {}
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/adaptScreen/CloseAdaptActivity.kt b/app/src/main/java/com/blankj/androidutilcode/feature/core/adaptScreen/CloseAdaptActivity.kt
deleted file mode 100644
index 3afc855b87..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/adaptScreen/CloseAdaptActivity.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.blankj.androidutilcode.feature.core.adaptScreen
-
-import android.content.Context
-import android.content.Intent
-import android.content.res.Resources
-import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
-import android.view.WindowManager
-import com.blankj.androidutilcode.R
-import com.blankj.utilcode.util.AdaptScreenUtils
-import com.blankj.utilcode.util.BusUtils
-
-class CloseAdaptActivity : AppCompatActivity() {
-
- companion object Instance {
- @JvmStatic
- @BusUtils.Subscribe(name = "CloseAdaptActivity#start")
- fun start(context: Context) {
- val starter = Intent(context, CloseAdaptActivity::class.java)
- context.startActivity(starter)
- }
- }
-
- override fun onCreate(savedInstanceState: Bundle?) {
- window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_adapt_close)
- }
-
- override fun getResources(): Resources {
- return AdaptScreenUtils.closeAdapt(super.getResources())
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/adaptScreen/HeightActivity.kt b/app/src/main/java/com/blankj/androidutilcode/feature/core/adaptScreen/HeightActivity.kt
deleted file mode 100644
index dc38d45f18..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/adaptScreen/HeightActivity.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.blankj.androidutilcode.feature.core.adaptScreen
-
-import android.content.Context
-import android.content.Intent
-import android.content.res.Resources
-import android.graphics.Color
-import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
-import android.view.WindowManager
-import com.blankj.androidutilcode.R
-import com.blankj.utilcode.util.AdaptScreenUtils
-import kotlinx.android.synthetic.main.activity_adapt_height.*
-
-class HeightActivity : AppCompatActivity() {
-
- companion object {
- fun start(context: Context) {
- val starter = Intent(context, HeightActivity::class.java)
- context.startActivity(starter)
- }
- }
-
- override fun onCreate(savedInstanceState: Bundle?) {
- window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_adapt_height)
-
- heightVebView.setBackgroundColor(Color.parseColor("#f0d26d"))
- }
-
- override fun getResources(): Resources {
- return AdaptScreenUtils.adaptHeight(super.getResources(), 1920)
- }
-}
diff --git a/app/src/main/java/com/blankj/androidutilcode/feature/core/adaptScreen/WidthActivity.kt b/app/src/main/java/com/blankj/androidutilcode/feature/core/adaptScreen/WidthActivity.kt
deleted file mode 100644
index 38ce3edb07..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/adaptScreen/WidthActivity.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.blankj.androidutilcode.feature.core.adaptScreen
-
-import android.content.Context
-import android.content.Intent
-import android.content.res.Resources
-import android.graphics.Color
-import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
-import android.view.WindowManager
-import com.blankj.androidutilcode.R
-import com.blankj.utilcode.util.AdaptScreenUtils
-import kotlinx.android.synthetic.main.activity_adapt_width.*
-
-class WidthActivity : AppCompatActivity() {
-
- companion object {
- fun start(context: Context) {
- val starter = Intent(context, WidthActivity::class.java)
- context.startActivity(starter)
- }
- }
-
- override fun onCreate(savedInstanceState: Bundle?) {
- window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_adapt_width)
-
- widthVebView.setBackgroundColor(Color.parseColor("#f0d26d"))
- }
-
- override fun getResources(): Resources {
- return AdaptScreenUtils.adaptWidth(super.getResources(), 1080)
- }
-}
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 1ac209da61..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarNavActivity.java
+++ /dev/null
@@ -1,114 +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.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;
-
-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/BarStatusCustomFragment.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusCustomFragment.java
deleted file mode 100644
index 0d4b58cfc2..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusCustomFragment.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.blankj.androidutilcode.feature.core.bar;
-
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.View;
-
-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 BarStatusCustomFragment extends BaseLazyFragment {
-
- private View fakeStatusBar;
-
-
- public static BarStatusCustomFragment newInstance() {
- return new BarStatusCustomFragment();
- }
-
- @Override
- public void initData(@Nullable Bundle bundle) {
-
- }
-
- @Override
- public int bindLayout() {
- return R.layout.fragment_bar_status_custom;
- }
-
- @Override
- public void initView(Bundle savedInstanceState, View contentView) {
- BarUtils.setStatusBarCustom(findViewById(R.id.fake_status_bar));
- }
-
- @Override
- public void doLazyBusiness() {
- LogUtils.d("doLazyBusiness() called");
- }
-
- @Override
- public void onWidgetClick(View view) {
-
- }
-}
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 5061099277..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.bar_status_alpha_bg);
- } 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 4d4285697d..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/bar/BarStatusFragmentActivity.java
+++ /dev/null
@@ -1,136 +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,
- R.id.navigation_custom
- };
-
- 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());
- mFragmentList.add(BarStatusCustomFragment.newInstance());
-
- mVpStatusBar.setOffscreenPageLimit(3);
- 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;
- case R.id.navigation_custom:
- mVpStatusBar.setCurrentItem(3);
- 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 df95f8f26d..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.bar_status_alpha_bg);
- } 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 7525db7bb6..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/device/DeviceActivity.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package com.blankj.androidutilcode.feature.core.device;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Build;
-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);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
- tvAboutDevice.setText(new SpanUtils()
- .appendLine("isRoot: " + DeviceUtils.isDeviceRooted())
- .appendLine("isAdbEnabled: " + DeviceUtils.isAdbEnabled())
- .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()
- );
- } else {
- 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 ec1c1a0349..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 acb8e8a251..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.BaseActivity;
-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 BaseActivity {
-
- 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.image_lena);
- Bitmap round = ImageUtils.getBitmap(R.drawable.main_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_image1));
- 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;
- }
- }
-}
\ No newline at end of file
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 bc7e8bb6b0..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 HerringtonPHP HacksO'ReillyJack HerringtonPodcasting HacksO'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/metaData/MetaDataActivity.java b/app/src/main/java/com/blankj/androidutilcode/feature/core/metaData/MetaDataActivity.java
deleted file mode 100644
index 7ada61d055..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/metaData/MetaDataActivity.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.blankj.androidutilcode.feature.core.metaData;
-
-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 232d8333c1..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/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 080ae85b5e..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.snackbar_custom_bg)
- .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.snackbar_custom_bg)
- .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.snackbar_custom_bg)
- .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.snackbar_custom_bg)
- .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.snackbar_custom_bg)
- .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.snackbar_custom_bg)
- .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 833659d2a4..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/span/SpanActivity.java
+++ /dev/null
@@ -1,268 +0,0 @@
-package com.blankj.androidutilcode.feature.core.span;
-
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Color;
-import android.graphics.LinearGradient;
-import android.graphics.Matrix;
-import android.graphics.Shader;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.content.ContextCompat;
-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 tvAboutAnimSpan;
-
- 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);
- tvAboutAnimSpan = 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()
-// .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)
-//
-// .appendLine("SpanUtils").setBackgroundColor(Color.LTGRAY).setBold().setForegroundColor(Color.YELLOW).setAlign(Layout.Alignment.ALIGN_CENTER)
-// .appendLine("前景色").setForegroundColor(Color.GREEN)
-// .appendLine("背景色").setBackgroundColor(Color.LTGRAY)
- .append("行高顶部对齐").setLineHeight(3 * lineHeight, SpanUtils.ALIGN_TOP).setFontSize(20).setBackgroundColor(Color.GREEN)
- .append("行高").setLineHeight(3 * lineHeight, SpanUtils.ALIGN_CENTER).setFontSize(40).setBackgroundColor(Color.LTGRAY)
- .appendLine("行高顶部").setLineHeight(3 * lineHeight, SpanUtils.ALIGN_BOTTOM).setFontSize(60).setBackgroundColor(Color.LTGRAY)
- .append("行高").setFontSize(100).setBackgroundColor(Color.GREEN)
- .append("行高").setFontSize(20).setBackgroundColor(Color.LTGRAY).setUnderline().setVerticalAlign(SpanUtils.ALIGN_CENTER)
-// .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)
-//
-// .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
- tvAboutAnimSpan.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() {
- if (valueAnimator != null && valueAnimator.isRunning()) {
- 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 cef8ded48f..0000000000
--- a/app/src/main/java/com/blankj/androidutilcode/feature/core/toast/ToastActivity.java
+++ /dev/null
@@ -1,135 +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 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/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.toast_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 6d4636addb..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 fd4549f72e..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-core/drawable/bar_status_alpha_bg.png b/app/src/main/res-core/drawable/bar_status_alpha_bg.png
deleted file mode 100644
index ab8065f49a..0000000000
Binary files a/app/src/main/res-core/drawable/bar_status_alpha_bg.png and /dev/null differ
diff --git a/app/src/main/res-core/drawable/bar_status_custom.xml b/app/src/main/res-core/drawable/bar_status_custom.xml
deleted file mode 100644
index 16e56b7144..0000000000
--- a/app/src/main/res-core/drawable/bar_status_custom.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res-core/drawable/bar_status_nav_custom.xml b/app/src/main/res-core/drawable/bar_status_nav_custom.xml
deleted file mode 100644
index be01a22d9b..0000000000
--- a/app/src/main/res-core/drawable/bar_status_nav_custom.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res-core/drawable/image_lena.png b/app/src/main/res-core/drawable/image_lena.png
deleted file mode 100644
index fa49ea640b..0000000000
Binary files a/app/src/main/res-core/drawable/image_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 8cdb4055fd..0000000000
--- a/app/src/main/res-core/layout-land/activity_screen_adapt.xml
+++ /dev/null
@@ -1,34 +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 95992c8c97..0000000000
--- a/app/src/main/res-core/layout-port/activity_screen_adapt.xml
+++ /dev/null
@@ -1,70 +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 8057bdf6db..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_activity_sub.xml b/app/src/main/res-core/layout/activity_activity_sub.xml
deleted file mode 100644
index fe518ab2d0..0000000000
--- a/app/src/main/res-core/layout/activity_activity_sub.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/main/res-core/layout/activity_adapt_close.xml b/app/src/main/res-core/layout/activity_adapt_close.xml
deleted file mode 100644
index c33fa1c293..0000000000
--- a/app/src/main/res-core/layout/activity_adapt_close.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res-core/layout/activity_adapt_height.xml b/app/src/main/res-core/layout/activity_adapt_height.xml
deleted file mode 100644
index 1e234a46c2..0000000000
--- a/app/src/main/res-core/layout/activity_adapt_height.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res-core/layout/activity_adapt_screen.xml b/app/src/main/res-core/layout/activity_adapt_screen.xml
deleted file mode 100644
index 162c6eda6b..0000000000
--- a/app/src/main/res-core/layout/activity_adapt_screen.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res-core/layout/activity_adapt_width.xml b/app/src/main/res-core/layout/activity_adapt_width.xml
deleted file mode 100644
index 38c81a9acb..0000000000
--- a/app/src/main/res-core/layout/activity_adapt_width.xml
+++ /dev/null
@@ -1,153 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
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 0fff66ca6e..0000000000
--- a/app/src/main/res-core/layout/activity_bar_nav.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res-core/layout/activity_bar_notification.xml b/app/src/main/res-core/layout/activity_bar_notification.xml
deleted file mode 100644
index 29db9299da..0000000000
--- a/app/src/main/res-core/layout/activity_bar_notification.xml
+++ /dev/null
@@ -1,17 +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 9198fa9bc8..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_fragment.xml b/app/src/main/res-core/layout/activity_bar_status_fragment.xml
deleted file mode 100644
index 13beb04e6f..0000000000
--- a/app/src/main/res-core/layout/activity_bar_status_fragment.xml
+++ /dev/null
@@ -1,26 +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 9f6a49eaa7..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 d612206149..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_fragment.xml b/app/src/main/res-core/layout/activity_fragment.xml
deleted file mode 100644
index 4394d49af7..0000000000
--- a/app/src/main/res-core/layout/activity_fragment.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
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 cdf27b357d..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_keyboard.xml b/app/src/main/res-core/layout/activity_keyboard.xml
deleted file mode 100644
index 13fd53eedc..0000000000
--- a/app/src/main/res-core/layout/activity_keyboard.xml
+++ /dev/null
@@ -1,59 +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_span.xml b/app/src/main/res-core/layout/activity_span.xml
deleted file mode 100644
index 8b9755af76..0000000000
--- a/app/src/main/res-core/layout/activity_span.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
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 0889b514a8..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 70107ef6f0..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_custom.xml b/app/src/main/res-core/layout/fragment_bar_status_custom.xml
deleted file mode 100644
index f5d0dbd147..0000000000
--- a/app/src/main/res-core/layout/fragment_bar_status_custom.xml
+++ /dev/null
@@ -1,14 +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 44c2694576..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 f63d429a20..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 31e5e420c2..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-core/layout/item_image1.xml b/app/src/main/res-core/layout/item_image1.xml
deleted file mode 100644
index a430afdb36..0000000000
--- a/app/src/main/res-core/layout/item_image1.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res-core/layout/snackbar_custom.xml b/app/src/main/res-core/layout/snackbar_custom.xml
deleted file mode 100644
index 86f3216820..0000000000
--- a/app/src/main/res-core/layout/snackbar_custom.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res-core/layout/toast_custom.xml b/app/src/main/res-core/layout/toast_custom.xml
deleted file mode 100644
index e384592ff2..0000000000
--- a/app/src/main/res-core/layout/toast_custom.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res-core/menu/navigation_fragment.xml b/app/src/main/res-core/menu/navigation_fragment.xml
deleted file mode 100644
index c16b5f96d7..0000000000
--- a/app/src/main/res-core/menu/navigation_fragment.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
diff --git a/app/src/main/res-core/menu/navigation_status_bar.xml b/app/src/main/res-core/menu/navigation_status_bar.xml
deleted file mode 100644
index 17526f33e8..0000000000
--- a/app/src/main/res-core/menu/navigation_status_bar.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
diff --git a/app/src/main/res-core/values/strings.xml b/app/src/main/res-core/values/strings.xml
deleted file mode 100644
index 31820cab5b..0000000000
--- a/app/src/main/res-core/values/strings.xml
+++ /dev/null
@@ -1,289 +0,0 @@
-
-
- ActivityUtils Demo
- AdaptScreenUtils Demo
- AppUtils Demo
- BarUtils Demo
- CleanUtils Demo
- CrashUtils Demo
- DeviceUtils Demo
- FragmentUtils Demo
- ImageUtils Demo
- KeyboardUtils Demo
- LogUtils Demo
- MetaData Demo
- NetworkUtils Demo
- Path Demo
- PermissionUtils Demo
- PhoneUtils Demo
- ProcessUtils Demo
- ReflectUtils Demo
- ResourceUtils Demo
- ScreenUtils Demo
- SDCardUtils Demo
- Snackbar Demo
- SP Demo
- SpanUtils Demo
- ToastUtils Demo
-
-
- Shared Element
- Clz
- Clz Opt
- Clz Anim
- Act Clz
- Act Clz Opt
- Act Clz Shared Element
- Act Clz Anim
- Pkg Cls
- Pkg Cls Opt
- Pkg Cls Anim
- Act Pkg Cls
- Act Pkg Cls Opt
- Act Pkg Cls Shared Element
- Act Pkg Cls Anim
- Intent
- Intent Opt
- Intent Shared Element
- Intent Anim
- Intents
- Intents Opt
- Intents Anim
- Act Intents
- Act Intents Opt
- Act Intents Anim
- Start Activities
- Start Home Activity
- Finish MainActivity
- Finish To MainActivity
- Finish All Activities
-
-
- 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
- Relaunch App
- Launch App Details Settings
- Exit App
-
-
- About Status Bar
- About Nav Bar
- About Notification Bar
-
- About Status
- Show Status
- Hide Status
- Light Mode Status
- Dark Mode Status
- Set Color
- Set Alpha
- Set Image View
- Set Fragment
- Set Swipe Back
- Set Drawer
- Random Color
- Set Transparent
- Color
- Alpha
- Front
- Image
- Custom
-
- About Notification
- Show Notification And Hide After 2s
-
- About Nav
- Show Nav
- Hide Nav
- Immersive Nav
- Set Nav Color Random
-
-
- Clean Internal Cache
- Clean Internal Files
- Clean Internal Databases
- Clean Internal SP
- Clean External Cache
-
-
- Shutdown
- Reboot
- Reboot To Recovery
- Reboot To Bootloader
-
-
- Fragment0
- Fragment1
- Fragment2
- Show Stack
- Add
- Add Hide
- Add Hide Stack
- Add Demo1 Show
- Add Child
- Pop
- Pop To Root
- Pop Add
- Hide Demo0 Show Demo1
- Hide Demo1 Show Demo0
- Replace
- Transition
-
-
- Src
- Add Color
- Scale
- Clip
- Skew
- Rotate
- To Round
- To Round Border
- To Round Corner
- To Round Corner Border
- Add Corner Border
- Add Circle Border
- Add Reflection
- Add Text Watermark
- Add Image Watermark
- Gray
- Fast Blur
- Render Script Blur
- Stack Blur
- Save
- Compress By Scale
- Compress By Quality Half
- Compress By Quality Max Size
- Compress By Sample Size
-
-
-
- Open Wireless Settings
- Set Data Enabled
- Set Wifi Enabled
-
-
- Hide Soft Input
- Show Soft Input
- Toggle Soft Input
- 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
- Log With No Tag
- Log With Tag
- Log In New Thread
- Log Null
- Log Many Params
- Log Long String
- Log To File
- Log Json
- Log Xml
- Log Array
- Log Throwable
- Log Bundle
- Log Intent
- Log Array List
-
-
- Open App Settings
- Request Calendar
- Request Record Audio
- Request Calendar And Record Audio
-
-
-
- Dial
- Call
- Send SMS
- Send SMS Silent
-
-
- Kill All Background Processes
-
-
- Test Assets
- Test Raw
-
-
- 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
- Long Snackbar
- Indefinite Snackbar
- Click
- Custom View
- Success
- Warning
- Error
-
-
- Put String
- Put Int
- Put Long
- Put Float
- Put Boolean
- Clear
-
-
- Show Short
- Show Long
- Show Green Font
- Show Bg Color
- Show Bg Resource
- Show Span
- Show Custom View
- Custom View
- Show Middle
- Cancel
-
- Short
- Long
- Green Font
- Bg Color
- Custom Bg
- Spannable String
- Middle
-
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/app/src/main/res/anim/slide_in_right.xml b/app/src/main/res/anim/slide_in_right.xml
deleted file mode 100755
index 0284446a46..0000000000
--- a/app/src/main/res/anim/slide_in_right.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable/main_bg_header.jpeg b/app/src/main/res/drawable/main_bg_header.jpeg
deleted file mode 100644
index 875fc58c21..0000000000
Binary files a/app/src/main/res/drawable/main_bg_header.jpeg and /dev/null differ
diff --git a/app/src/main/res/layout/activity_back.xml b/app/src/main/res/layout/activity_back.xml
deleted file mode 100644
index 6e3b6ce8b3..0000000000
--- a/app/src/main/res/layout/activity_back.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/activity_drawer.xml b/app/src/main/res/layout/activity_drawer.xml
deleted file mode 100644
index 16b1fe3728..0000000000
--- a/app/src/main/res/layout/activity_drawer.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/activity_drawer_nav_header.xml b/app/src/main/res/layout/activity_drawer_nav_header.xml
deleted file mode 100755
index 93d5d641df..0000000000
--- a/app/src/main/res/layout/activity_drawer_nav_header.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
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 9a879e2789..0000000000
--- a/app/src/main/res/menu/main_drawer.xml
+++ /dev/null
@@ -1,12 +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 60201b597e..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 4c19777add..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 78d296b974..0000000000
--- a/app/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
- #3F51B5
- #303F9F
- #FF4081
-
- #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/dimens.xml b/app/src/main/res/values/dimens.xml
deleted file mode 100644
index d470c5e816..0000000000
--- a/app/src/main/res/values/dimens.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
- 16dp
-
- 8dp
- 16dp
- 24dp
- 128dp
-
- 40dp
- 160dp
-
- 16sp
- 20sp
- 24sp
- 40sp
-
- 40dp
- 8dp
- 196dp
-
- 64dp
-
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
deleted file mode 100644
index 5ea9595328..0000000000
--- a/app/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
- Core Util
- Sub Util
-
- Blankj
- Demo of AndroidUtilCode
-
- navigation_drawer_open
- navigation_drawer_close
-
- GitHub
- Blog
-
- You have rejected us to apply for authorization, please agree to authorization, otherwise the function can\'t be used normally!
- We need some of the permissions you rejected or the system failed to apply failed, please manually set to the page authorize, otherwise the function can\'t be used normally!
-
- The application crashes, does it need to be restarted?
-
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
deleted file mode 100644
index 4c19777add..0000000000
--- a/app/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
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/art/logo_static_bus.png b/art/logo_static_bus.png
deleted file mode 100755
index 4f5308a13a..0000000000
Binary files a/art/logo_static_bus.png and /dev/null differ
diff --git a/build.gradle b/build.gradle
index 1c675d6443..e0f0f36c87 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,30 +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 {
- if (bus.isDebug) {
- maven() {
- url uri(new File(project.rootDir, "maven"))
- }
- }
+ mavenLocal()
google()
+ mavenCentral()
jcenter()
}
dependencies {
- classpath dep.gradle
- classpath dep.kotlin_gradle_plugin
-
- classpath dep.android_maven_gradle_plugin
- classpath dep.gradle_bintray_plugin
-
- classpath dep.bus_gradle_plugin
+ for (def entrySet : ConfigUtils.getApplyPlugins().entrySet()) {
+ classpath entrySet.value.path
+ }
}
}
allprojects {
repositories {
+ mavenLocal()
+ maven { url "https://jitpack.io/" }
google()
+ mavenCentral()
jcenter()
}
@@ -32,9 +28,9 @@ allprojects {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
resolutionStrategy.eachDependency {
- if (it.requested.group == 'com.android.support'
- && !it.requested.name.contains('multidex')) {
- it.useVersion support_version
+ if (it.requested.group == 'com.android.support' && !it.requested.name.contains(
+ 'multidex')) {
+ it.useVersion Config.supportVersion
}
}
}
@@ -42,4 +38,4 @@ allprojects {
task clean(type: Delete) {
delete rootProject.buildDir
-}
+}
\ No newline at end of file
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 eaa0a0fc0d..349aed4fec 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -1,23 +1,37 @@
-plugins {
- id 'groovy'
- id 'java-gradle-plugin'
+repositories {
+ google()
+ jcenter()
+}
+
+apply {
+ plugin 'groovy'
+ plugin 'java-gradle-plugin'
}
gradlePlugin {
plugins {
readmeCore {
id = 'readme-core'
- implementationClass = 'com.blankj.plugin.ReadmeCorePlugin'
+ implementationClass = 'com.blankj.plugin.readme.ReadmeCorePlugin'
}
readmeSub {
id = 'readme-sub'
- implementationClass = 'com.blankj.plugin.ReadmeSubPlugin'
+ 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/ReadmeCorePlugin.groovy b/buildSrc/src/main/groovy/com/blankj/plugin/ReadmeCorePlugin.groovy
deleted file mode 100644
index af86a19c6e..0000000000
--- a/buildSrc/src/main/groovy/com/blankj/plugin/ReadmeCorePlugin.groovy
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.blankj.plugin
-
-import org.gradle.api.Plugin
-import org.gradle.api.Project
-
-class ReadmeCorePlugin implements Plugin {
-
- @Override
- void apply(Project project) {
- project.extensions.create('readme', ReadmeExtension)
-
- project.task('readmeTask') {
- doLast {
- println "readmeTask start..."
-
- def ext = project['readme'] as ReadmeExtension
- def readmeCN = ext.readmeCnFile
- def readmeEng = ext.readmeFile
-
- readmeOfUtilCode2Eng(readmeCN, readmeEng)
-
- println "readmeTask finished."
- }
- }
- }
-
- static def readmeOfUtilCode2Eng(File readmeCN, File readmeEng) {
- FormatUtils.format(readmeCN)
- def lines = readmeCN.readLines("UTF-8")
- 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(" -> ")))
- } else if (line.contains(": ") && !line.contains("[")) {
- sb.append(line.substring(0, line.indexOf(':')).trim())
- } else {
- sb.append(line)
- }
- sb.append(FormatUtils.LINE_SEP)
- }
- readmeEng.write(sb.toString(), "UTF-8")
- }
-}
-
-
diff --git a/buildSrc/src/main/groovy/com/blankj/plugin/ReadmeExtension.groovy b/buildSrc/src/main/groovy/com/blankj/plugin/ReadmeExtension.groovy
deleted file mode 100644
index 91ca50af95..0000000000
--- a/buildSrc/src/main/groovy/com/blankj/plugin/ReadmeExtension.groovy
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.blankj.plugin
-
-class ReadmeExtension {
-
- File readmeFile
- File readmeCnFile
-
-}
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/java/com/blankj/plugin/readme/ReadmeCorePlugin.groovy b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeCorePlugin.groovy
new file mode 100644
index 0000000000..8f3cf47780
--- /dev/null
+++ b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeCorePlugin.groovy
@@ -0,0 +1,52 @@
+package com.blankj.plugin.readme
+
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+
+class ReadmeCorePlugin implements Plugin {
+
+ @Override
+ void apply(Project project) {
+ project.extensions.create('readme', ReadmeExtension)
+
+ project.task('readmeTask') {
+ doLast {
+ println "readmeTask start..."
+
+ def ext = project['readme'] as ReadmeExtension
+ def readmeCN = ext.readmeCnFile
+ def readmeEng = ext.readmeFile
+
+ readmeOfUtilCode2Eng(readmeCN, readmeEng)
+
+ println "readmeTask finished."
+ }
+ }
+ }
+
+ static def readmeOfUtilCode2Eng(File readmeCN, File readmeEng) {
+ FormatUtils.format(readmeCN)
+ def lines = readmeCN.readLines("UTF-8")
+ def sb = new StringBuilder()
+ readmeCN.eachLine { line ->
+ if (line.contains("* ###")) {
+ 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)
+ }
+ sb.append(FormatUtils.LINE_SEP)
+ }
+ readmeEng.write(sb.toString(), "UTF-8")
+ }
+}
+
+
diff --git a/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeExtension.groovy b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeExtension.groovy
new file mode 100644
index 0000000000..789e683c80
--- /dev/null
+++ b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeExtension.groovy
@@ -0,0 +1,8 @@
+package com.blankj.plugin.readme
+
+class ReadmeExtension {
+
+ File readmeFile
+ File readmeCnFile
+
+}
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 85%
rename from buildSrc/src/main/groovy/com/blankj/plugin/ReadmeSubPlugin.groovy
rename to buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeSubPlugin.groovy
index 84f688f312..bade51bbf4 100644
--- a/buildSrc/src/main/groovy/com/blankj/plugin/ReadmeSubPlugin.groovy
+++ b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeSubPlugin.groovy
@@ -1,11 +1,8 @@
-package com.blankj.plugin
+package com.blankj.plugin.readme
import org.gradle.api.Plugin
import org.gradle.api.Project
-import static FormatUtils.LINE_SEP;
-
-
class ReadmeSubPlugin implements Plugin {
@Override
@@ -30,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) {
@@ -45,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/bus-gradle-plugin/.gitignore b/bus-gradle-plugin/.gitignore
deleted file mode 100755
index 4f1e170e06..0000000000
--- a/bus-gradle-plugin/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/build
-local.properties
\ No newline at end of file
diff --git a/bus-gradle-plugin/build.gradle b/bus-gradle-plugin/build.gradle
deleted file mode 100755
index 33d6dd4120..0000000000
--- a/bus-gradle-plugin/build.gradle
+++ /dev/null
@@ -1,56 +0,0 @@
-plugins {
- id 'groovy'
- id 'java-gradle-plugin' // for gradlePlugin DSL
- id 'com.gradle.plugin-publish' version "0.10.0" //for pluginPublish.gradle
-}
-
-apply {
- from "../gradle/pluginPublish.gradle"
- if (bus.isDebug) {
- plugin 'maven'
- from "../gradle/localMavenUpload.gradle"
- } else {
- plugin 'com.github.dcendents.android-maven'
- plugin 'com.jfrog.bintray'
- from "../gradle/bintrayUploadJava.gradle"
- }
-}
-
-gradlePlugin {
- plugins {
- busPlugin {
- id = 'com.blankj.bus'
- implementationClass = 'com.blankj.bus.BusPlugin'
- }
- }
-}
-
-dependencies {
- implementation dep.gradle
- implementation dep.javassist
- implementation dep.commons_io
- implementation gradleApi()
- implementation localGroovy()
-
- testImplementation dep.junit
-}
-
-sourceSets {
- main {
- groovy {
- srcDirs += 'src/main/java'
- }
- }
-
- test {
- groovy {
- srcDirs += 'src/test/java'
- }
- }
-}
-
-group = bus.group
-version = bus.version
-
-//./gradlew bus-gradle-plugin:bintrayUpload
-//./gradlew publishPlugins
diff --git a/bus-gradle-plugin/project.properties b/bus-gradle-plugin/project.properties
deleted file mode 100755
index 23eb9a7453..0000000000
--- a/bus-gradle-plugin/project.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-project.name=StaticBusPlugin
-project.siteUrl=https://github.com/Blankj/StaticBus
-project.gitUrl=https://github.com/Blankj/StaticBus.git
-
-#javadoc
-javadoc.name=StaticBus
\ No newline at end of file
diff --git a/bus-gradle-plugin/src/main/java/com/blankj/bus/BusExtension.groovy b/bus-gradle-plugin/src/main/java/com/blankj/bus/BusExtension.groovy
deleted file mode 100755
index 407a671996..0000000000
--- a/bus-gradle-plugin/src/main/java/com/blankj/bus/BusExtension.groovy
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.blankj.bus
-
-class BusExtension {
-
-}
diff --git a/bus-gradle-plugin/src/main/java/com/blankj/bus/BusInject.groovy b/bus-gradle-plugin/src/main/java/com/blankj/bus/BusInject.groovy
deleted file mode 100755
index 6192e51a60..0000000000
--- a/bus-gradle-plugin/src/main/java/com/blankj/bus/BusInject.groovy
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.blankj.bus
-
-import com.blankj.util.JavassistUtils
-import com.blankj.util.ZipUtils
-import javassist.CtClass
-import javassist.CtMethod
-import org.apache.commons.io.FileUtils
-
-class BusInject {
-
- static void start(HashMap bus, File busJar) {
- String jarPath = busJar.getAbsolutePath()
- String decompressedJarPath = jarPath.substring(0, jarPath.length() - 4);
- File decompressedJar = new File(decompressedJarPath)
- ZipUtils.unzipFile(busJar, decompressedJar)
-
- CtClass busUtils = JavassistUtils.getPool().get(Config.CLASS_BUS_UTILS)
- CtMethod callMethod = busUtils.getDeclaredMethod("post");
- callMethod.insertAfter(getInsertContent(bus));
- busUtils.writeFile(decompressedJarPath)
- busUtils.defrost();
- FileUtils.forceDelete(busJar)
- ZipUtils.zipFile(decompressedJar, busJar)
- FileUtils.forceDelete(decompressedJar)
- }
-
- private static String getInsertContent(HashMap bus) {
- StringBuilder sb = new StringBuilder();
- bus.each { String key, String val ->
- String name = key
- String[] method = val.split(' ')
- String returnType = method[0]
- String methodName = method[1]
-
- sb.append('if ("').append(name).append('".equals($1)) {\n')
-
- int st = methodName.indexOf('(')
- int end = methodName.length()
- String params = methodName.substring(st + 1, end - 1);
- if (params != '') {
- String[] paramArr = params.split(",")
-
- StringBuilder args = new StringBuilder()
- for (int i = 0; i < paramArr.length; i++) {
- if (paramArr[i] == 'char') {
- args.append(',$2[').append(i).append('].toString().charAt(0)')
- } else if (paramArr[i] == 'boolean') {
- args.append(',Boolean.parseBoolean($2[').append(i).append('].toString())')
- } else if (paramArr[i] == 'byte') {
- args.append(',Byte.parseByte($2[').append(i).append('].toString())')
- } else if (paramArr[i] == 'short') {
- args.append(',Short.parseShort($2[').append(i).append('].toString())')
- } else if (paramArr[i] == 'int') {
- args.append(',Integer.parseInt($2[').append(i).append('].toString())')
- } else if (paramArr[i] == 'long') {
- args.append(',Long.parseLong($2[').append(i).append('].toString())')
- } else if (paramArr[i] == 'float') {
- args.append(',Float.parseFloat($2[').append(i).append('].toString())')
- } else if (paramArr[i] == 'double') {
- args.append(',Double.parseDouble($2[').append(i).append('].toString())')
- } else {
- args.append(',(').append(paramArr[i]).append(')$2[').append(i).append(']')
- }
- }
- methodName = methodName.substring(0, st + 1) + args.substring(1) + ")"
- }
-
- if (returnType.equals('void')) {
- sb.append(methodName).append(';\n').append('return null;\n')
- } else {
- sb.append('return ($w)').append(methodName).append(';\n')
- }
- sb.append("}")
- }
- sb.append('android.util.Log.e("BusUtils", "bus of <" + $1 + "> didn\'t exist.");')
- return sb.toString()
- }
-}
\ No newline at end of file
diff --git a/bus-gradle-plugin/src/main/java/com/blankj/bus/BusPlugin.groovy b/bus-gradle-plugin/src/main/java/com/blankj/bus/BusPlugin.groovy
deleted file mode 100755
index 72584b9037..0000000000
--- a/bus-gradle-plugin/src/main/java/com/blankj/bus/BusPlugin.groovy
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.blankj.bus
-
-import com.android.build.gradle.AppExtension
-import com.android.build.gradle.AppPlugin
-import com.blankj.util.LogUtils
-
-import org.gradle.api.Plugin
-import org.gradle.api.Project
-
-class BusPlugin implements Plugin {
-
- @Override
- void apply(Project project) {
- if (project.plugins.hasPlugin(AppPlugin)) {
- LogUtils.init(project)
- LogUtils.l('project(' + project.name + ') apply bus gradle plugin!')
-
- project.extensions.create(Config.EXT_NAME, BusExtension)
- def android = project.extensions.getByType(AppExtension)
- android.registerTransform(new BusTransform(project))
- project.afterEvaluate {
- def ext = project[Config.EXT_NAME] as BusExtension
- }
- }
- }
-}
\ No newline at end of file
diff --git a/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy b/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy
deleted file mode 100755
index 25fab30522..0000000000
--- a/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.blankj.bus
-
-import com.blankj.util.JavassistUtils
-import com.blankj.util.LogUtils
-import com.blankj.util.ZipUtils
-import com.blankj.utilcode.util.BusUtils
-import groovy.io.FileType
-import javassist.CtClass
-import javassist.CtMethod
-import org.apache.commons.io.FileUtils
-
-import java.lang.reflect.Modifier
-
-class BusScan {
-
- HashMap busMap
- List scans
- File busJar
-
- BusScan() {
- busMap = [:]
- scans = []
- }
-
- void scanJar(File jar) {
- File tmp = new File(jar.getParent(), "temp_" + jar.getName())
- List unzipFile = ZipUtils.unzipFile(jar, tmp)
- if (unzipFile != null && unzipFile.size() > 0) {
- scanDir(tmp)
- FileUtils.forceDelete(tmp)
- }
- }
-
- void scanDir(File root) {
- String rootPath = root.getAbsolutePath()
- if (!rootPath.endsWith(Config.FILE_SEP)) {
- rootPath += Config.FILE_SEP
- }
-
- if (root.isDirectory()) {
- root.eachFileRecurse(FileType.FILES) { File file ->
- def fileName = file.name
- if (!fileName.endsWith('.class')
- || fileName.startsWith('R$')
- || fileName == 'R.class'
- || fileName == 'BuildConfig.class') {
- return
- }
-
- def filePath = file.absolutePath
- def packagePath = filePath.replace(rootPath, '')
- def className = packagePath.replace(Config.FILE_SEP, ".")
- // delete .class
- className = className.substring(0, className.length() - 6)
-
- CtClass ctClass = JavassistUtils.getPool().get(className)
-
- CtMethod[] methods = ctClass.getDeclaredMethods();
- for (CtMethod method : methods) {
- if (method.hasAnnotation(BusUtils.Subscribe)) {
- if (Modifier.isStatic(method.getModifiers())) {
- String name = method.getAnnotation(BusUtils.Subscribe).name()
- String sign = method.getReturnType().getName() + ' ' + method.getLongName()
- busMap.put(name, sign)
- } else {
- LogUtils.l(method.getLongName() + "is not static")
- }
- }
- }
- }
- }
- }
-}
diff --git a/bus-gradle-plugin/src/main/java/com/blankj/bus/BusTransform.groovy b/bus-gradle-plugin/src/main/java/com/blankj/bus/BusTransform.groovy
deleted file mode 100755
index 0e970d7530..0000000000
--- a/bus-gradle-plugin/src/main/java/com/blankj/bus/BusTransform.groovy
+++ /dev/null
@@ -1,129 +0,0 @@
-package com.blankj.bus
-
-import com.android.build.api.transform.*
-import com.android.build.gradle.internal.pipeline.TransformManager
-import com.blankj.util.JavassistUtils
-import com.blankj.util.JsonUtils
-import com.blankj.util.LogUtils
-
-import org.apache.commons.io.FileUtils
-import org.gradle.api.Project
-
-class BusTransform extends Transform {
-
- Project mProject;
-
- BusTransform(Project project) {
- mProject = project
- }
-
- @Override
- String getName() {
- return "busTransform"
- }
-
- @Override
- Set getInputTypes() {
- return TransformManager.CONTENT_CLASS
- }
-
- @Override
- Set super QualifiedContent.Scope> getScopes() {
- return TransformManager.SCOPE_FULL_PROJECT
- }
-
- @Override
- boolean isIncremental() {
- return false
- }
-
- @Override
- void transform(TransformInvocation transformInvocation)
- throws TransformException, InterruptedException, IOException {
- super.transform(transformInvocation)
- JavassistUtils.init(mProject)
- LogUtils.l(getName() + " started")
-
- long stTime = System.currentTimeMillis();
-
- def inputs = transformInvocation.getInputs()
- def referencedInputs = transformInvocation.getReferencedInputs()
- def outputProvider = transformInvocation.getOutputProvider()
- def isIncremental = transformInvocation.isIncremental()
-
- outputProvider.deleteAll()
-
- BusScan busScan = new BusScan()
-
- inputs.each { TransformInput input ->
- input.directoryInputs.each { DirectoryInput dirInput ->// 遍历文件夹
- File dir = dirInput.file
- JavassistUtils.getPool().appendClassPath(dir.absolutePath)
-
- def dest = outputProvider.getContentLocation(
- dirInput.name,
- dirInput.contentTypes,
- dirInput.scopes,
- Format.DIRECTORY
- )
- FileUtils.copyDirectory(dir, dest)
-
- LogUtils.l("scan dir: " + dirInput.name)
-
- busScan.scanDir(dir)
- }
-
- input.jarInputs.each { JarInput jarInput ->// 遍历 jar 文件
- File jar = jarInput.file
- JavassistUtils.getPool().appendClassPath(jarInput.file.absolutePath)
-
- def jarName = jarInput.name
- def dest = outputProvider.getContentLocation(
- jarName,
- jarInput.contentTypes,
- jarInput.scopes,
- Format.JAR
- )
- FileUtils.copyFile(jar, dest)
-
- if (jumpScan(jarName)) {
- LogUtils.l("jump jar: " + jarName)
- return
- }
-
- if (jarName.startsWith("com.blankj:utilcode:")
- || jarName.contains("utilcode-lib")) {
- busScan.busJar = dest
- LogUtils.l("bus jar: " + jarName)
- return
- }
-
- LogUtils.l("scan jar: " + jarName)
- busScan.scanJar(jar)
- }
- }
-
- if (busScan.busJar != null) {
- File jsonFile = new File(mProject.projectDir.getAbsolutePath(), "__bus__.json")
- String busJson = JsonUtils.getFormatJson(busScan.busMap)
- LogUtils.l(jsonFile.toString() + ": " + busJson)
- FileUtils.write(jsonFile, busJson)
- BusInject.start(busScan.busMap, busScan.busJar)
- } else {
- LogUtils.l('u should ')
- }
-
- LogUtils.l(getName() + " finished: " + (System.currentTimeMillis() - stTime) + "ms")
- }
-
- private static boolean jumpScan(String jarName) {
- boolean isExcept = false
- for (String except : Config.EXCEPTS) {
- if (jarName.startsWith(except)) {
- isExcept = true
- break
- }
- }
- isExcept
- }
-}
\ No newline at end of file
diff --git a/bus-gradle-plugin/src/main/java/com/blankj/bus/Config.groovy b/bus-gradle-plugin/src/main/java/com/blankj/bus/Config.groovy
deleted file mode 100755
index 2e318fc359..0000000000
--- a/bus-gradle-plugin/src/main/java/com/blankj/bus/Config.groovy
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.blankj.bus
-
-class Config {
-
- public static final String EXT_NAME = 'bus'
-
- public static final List EXCEPTS = [
- 'com.android.support:',
- 'com.android.support.constraint:',
- 'android.arch.',
- 'com.blankj:'
- ]
-
- public static final String FILE_SEP = System.getProperty("file.separator")
-
- public static final String CLASS_BUS_UTILS = 'com.blankj.utilcode.util.BusUtils'
-}
diff --git a/bus-gradle-plugin/src/main/java/com/blankj/util/JavassistUtils.groovy b/bus-gradle-plugin/src/main/java/com/blankj/util/JavassistUtils.groovy
deleted file mode 100644
index b2cf28e4d9..0000000000
--- a/bus-gradle-plugin/src/main/java/com/blankj/util/JavassistUtils.groovy
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.blankj.util
-
-import javassist.ClassPool
-import org.gradle.api.Project;
-
-/**
- *
- * author: blankj
- * blog : http://blankj.com
- * time : 2018/11/25
- * desc :
- *
- */
-class JavassistUtils {
-
- public static ClassPool sPool
-
- static void init(Project project) {
- sPool = new ClassPool(null)
- sPool.appendSystemPath()
- // 加入本地 android 包
- sPool.appendClassPath(project.android.bootClasspath[0].toString())
- }
-
- static ClassPool getPool() {
- return sPool
- }
-}
diff --git a/bus-gradle-plugin/src/main/java/com/blankj/util/JsonUtils.groovy b/bus-gradle-plugin/src/main/java/com/blankj/util/JsonUtils.groovy
deleted file mode 100755
index 614adce21a..0000000000
--- a/bus-gradle-plugin/src/main/java/com/blankj/util/JsonUtils.groovy
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.blankj.util
-
-import com.google.gson.Gson
-import com.google.gson.GsonBuilder
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2018/10/08
- * desc :
- *
- */
-final class JsonUtils {
-
- static String getFormatJson(Object object) {
- Gson gson = new GsonBuilder().setPrettyPrinting().create()
- return gson.toJson(object)
- }
-}
diff --git a/bus-gradle-plugin/src/main/java/com/blankj/util/LogUtils.groovy b/bus-gradle-plugin/src/main/java/com/blankj/util/LogUtils.groovy
deleted file mode 100755
index c51d161ea2..0000000000
--- a/bus-gradle-plugin/src/main/java/com/blankj/util/LogUtils.groovy
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.blankj.util
-
-import org.gradle.api.Project
-import org.gradle.api.logging.Logger
-
-final class LogUtils {
-
- private static Logger sLogger
- private static String PREFIX = "PLUGIN-BUS >>> "
-
- static void init(Project project) {
- sLogger = project.getLogger()
- }
-
- static void l(Object content) {
- sLogger.lifecycle(PREFIX + content)
- }
-
- static void d(Object content) {
- sLogger.debug(PREFIX + content)
- }
-
- static void i(Object content) {
- sLogger.info(PREFIX + content)
- }
-
- static void w(Object content) {
- sLogger.warn(PREFIX + content)
- }
-
- static void e(Object content) {
- sLogger.error(PREFIX + content)
- }
-}
\ No newline at end of file
diff --git a/bus-gradle-plugin/src/main/java/com/blankj/util/ZipUtils.java b/bus-gradle-plugin/src/main/java/com/blankj/util/ZipUtils.java
deleted file mode 100755
index d96eb864cb..0000000000
--- a/bus-gradle-plugin/src/main/java/com/blankj/util/ZipUtils.java
+++ /dev/null
@@ -1,436 +0,0 @@
-package com.blankj.util;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-import java.util.zip.ZipOutputStream;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/08/27
- * desc : utils about zip or jar
- *
- */
-public final class ZipUtils {
-
- private static final int BUFFER_LEN = 8192;
-
- private ZipUtils() {
- throw new UnsupportedOperationException("u can't instantiate me...");
- }
-
- /**
- * Zip the files.
- *
- * @param srcFiles The source of files.
- * @param zipFilePath The path of ZIP file.
- * @return {@code true}: success
{@code false}: fail
- * @throws IOException if an I/O error has occurred
- */
- public static boolean zipFiles(final Collection srcFiles,
- final String zipFilePath)
- throws IOException {
- return zipFiles(srcFiles, zipFilePath, null);
- }
-
- /**
- * Zip the files.
- *
- * @param srcFilePaths The paths of source files.
- * @param zipFilePath The path of ZIP file.
- * @param comment The comment.
- * @return {@code true}: success
{@code false}: fail
- * @throws IOException if an I/O error has occurred
- */
- public static boolean zipFiles(final Collection srcFilePaths,
- final String zipFilePath,
- final String comment)
- throws IOException {
- if (srcFilePaths == null || zipFilePath == null) return false;
- ZipOutputStream zos = null;
- try {
- zos = new ZipOutputStream(new FileOutputStream(zipFilePath));
- for (String srcFile : srcFilePaths) {
- if (!zipFile(getFileByPath(srcFile), "", zos, comment)) return false;
- }
- return true;
- } finally {
- if (zos != null) {
- zos.finish();
- zos.close();
- }
- }
- }
-
- /**
- * Zip the files.
- *
- * @param srcFiles The source of files.
- * @param zipFile The ZIP file.
- * @return {@code true}: success
{@code false}: fail
- * @throws IOException if an I/O error has occurred
- */
- public static boolean zipFiles(final Collection srcFiles, final File zipFile)
- throws IOException {
- return zipFiles(srcFiles, zipFile, null);
- }
-
- /**
- * Zip the files.
- *
- * @param srcFiles The source of files.
- * @param zipFile The ZIP file.
- * @param comment The comment.
- * @return {@code true}: success
{@code false}: fail
- * @throws IOException if an I/O error has occurred
- */
- public static boolean zipFiles(final Collection srcFiles,
- final File zipFile,
- final String comment)
- throws IOException {
- if (srcFiles == null || zipFile == null) return false;
- ZipOutputStream zos = null;
- try {
- zos = new ZipOutputStream(new FileOutputStream(zipFile));
- for (File srcFile : srcFiles) {
- if (!zipFile(srcFile, "", zos, comment)) return false;
- }
- return true;
- } finally {
- if (zos != null) {
- zos.finish();
- zos.close();
- }
- }
- }
-
- /**
- * Zip the file.
- *
- * @param srcFilePath The path of source file.
- * @param zipFilePath The path of ZIP file.
- * @return {@code true}: success
{@code false}: fail
- * @throws IOException if an I/O error has occurred
- */
- public static boolean zipFile(final String srcFilePath,
- final String zipFilePath)
- throws IOException {
- return zipFile(getFileByPath(srcFilePath), getFileByPath(zipFilePath), null);
- }
-
- /**
- * Zip the file.
- *
- * @param srcFilePath The path of source file.
- * @param zipFilePath The path of ZIP file.
- * @param comment The comment.
- * @return {@code true}: success
{@code false}: fail
- * @throws IOException if an I/O error has occurred
- */
- public static boolean zipFile(final String srcFilePath,
- final String zipFilePath,
- final String comment)
- throws IOException {
- return zipFile(getFileByPath(srcFilePath), getFileByPath(zipFilePath), comment);
- }
-
- /**
- * Zip the file.
- *
- * @param srcFile The source of file.
- * @param zipFile The ZIP file.
- * @return {@code true}: success
{@code false}: fail
- * @throws IOException if an I/O error has occurred
- */
- public static boolean zipFile(final File srcFile,
- final File zipFile)
- throws IOException {
- return zipFile(srcFile, zipFile, null);
- }
-
- /**
- * Zip the file.
- *
- * @param srcFile The source of file.
- * @param zipFile The ZIP file.
- * @param comment The comment.
- * @return {@code true}: success
{@code false}: fail
- * @throws IOException if an I/O error has occurred
- */
- public static boolean zipFile(final File srcFile,
- final File zipFile,
- final String comment)
- throws IOException {
- if (srcFile == null || zipFile == null) return false;
- ZipOutputStream zos = null;
- try {
- zos = new ZipOutputStream(new FileOutputStream(zipFile));
- return zipFile(srcFile, "", zos, comment);
- } finally {
- if (zos != null) {
- zos.close();
- }
- }
- }
-
- private static boolean zipFile(final File srcFile,
- String rootPath,
- final ZipOutputStream zos,
- final String comment)
- throws IOException {
- rootPath = rootPath + (isSpace(rootPath) ? "" : File.separator) + srcFile.getName();
- if (srcFile.isDirectory()) {
- File[] fileList = srcFile.listFiles();
- if (fileList == null || fileList.length <= 0) {
- ZipEntry entry = new ZipEntry(rootPath + '/');
- entry.setComment(comment);
- zos.putNextEntry(entry);
- zos.closeEntry();
- } else {
- for (File file : fileList) {
- if (!zipFile(file, rootPath, zos, comment)) return false;
- }
- }
- } else {
- InputStream is = null;
- try {
- is = new BufferedInputStream(new FileInputStream(srcFile));
- ZipEntry entry = new ZipEntry(rootPath);
- entry.setComment(comment);
- zos.putNextEntry(entry);
- byte buffer[] = new byte[BUFFER_LEN];
- int len;
- while ((len = is.read(buffer, 0, BUFFER_LEN)) != -1) {
- zos.write(buffer, 0, len);
- }
- zos.closeEntry();
- } finally {
- if (is != null) {
- is.close();
- }
- }
- }
- return true;
- }
-
- /**
- * Unzip the file.
- *
- * @param zipFilePath The path of ZIP file.
- * @param destDirPath The path of destination directory.
- * @return the unzipped files
- * @throws IOException if unzip unsuccessfully
- */
- public static List unzipFile(final String zipFilePath,
- final String destDirPath)
- throws IOException {
- return unzipFileByKeyword(zipFilePath, destDirPath, null);
- }
-
- /**
- * Unzip the file.
- *
- * @param zipFile The ZIP file.
- * @param destDir The destination directory.
- * @return the unzipped files
- * @throws IOException if unzip unsuccessfully
- */
- public static List unzipFile(final File zipFile,
- final File destDir)
- throws IOException {
- return unzipFileByKeyword(zipFile, destDir, null);
- }
-
- /**
- * Unzip the file by keyword.
- *
- * @param zipFilePath The path of ZIP file.
- * @param destDirPath The path of destination directory.
- * @param keyword The keyboard.
- * @return the unzipped files
- * @throws IOException if unzip unsuccessfully
- */
- public static List unzipFileByKeyword(final String zipFilePath,
- final String destDirPath,
- final String keyword)
- throws IOException {
- return unzipFileByKeyword(getFileByPath(zipFilePath), getFileByPath(destDirPath), keyword);
- }
-
- /**
- * Unzip the file by keyword.
- *
- * @param zipFile The ZIP file.
- * @param destDir The destination directory.
- * @param keyword The keyboard.
- * @return the unzipped files
- * @throws IOException if unzip unsuccessfully
- */
- public static List unzipFileByKeyword(final File zipFile,
- final File destDir,
- final String keyword)
- throws IOException {
- if (zipFile == null || destDir == null) return null;
- List files = new ArrayList<>();
- ZipFile zip = new ZipFile(zipFile);
- Enumeration> entries = zip.entries();
- try {
- if (isSpace(keyword)) {
- while (entries.hasMoreElements()) {
- ZipEntry entry = ((ZipEntry) entries.nextElement());
- if (!unzipChildFile(destDir, files, zip, entry)) return files;
- }
- } else {
- while (entries.hasMoreElements()) {
- ZipEntry entry = ((ZipEntry) entries.nextElement());
- if (entry.getName().contains(keyword)) {
- if (!unzipChildFile(destDir, files, zip, entry)) return files;
- }
- }
- }
- } finally {
- zip.close();
- }
- return files;
- }
-
- private static boolean unzipChildFile(final File destDir,
- final List files,
- final ZipFile zip,
- final ZipEntry entry) throws IOException {
- File file = new File(destDir, entry.getName());
- files.add(file);
- if (entry.isDirectory()) {
- return createOrExistsDir(file);
- } else {
- if (!createOrExistsFile(file)) return false;
- InputStream in = null;
- OutputStream out = null;
- try {
- in = new BufferedInputStream(zip.getInputStream(entry));
- out = new BufferedOutputStream(new FileOutputStream(file));
- byte buffer[] = new byte[BUFFER_LEN];
- int len;
- while ((len = in.read(buffer)) != -1) {
- out.write(buffer, 0, len);
- }
- } finally {
- if (in != null) {
- in.close();
- }
- if (out != null) {
- out.close();
- }
- }
- }
- return true;
- }
-
- /**
- * Return the files' path in ZIP file.
- *
- * @param zipFilePath The path of ZIP file.
- * @return the files' path in ZIP file
- * @throws IOException if an I/O error has occurred
- */
- public static List getFilesPath(final String zipFilePath)
- throws IOException {
- return getFilesPath(getFileByPath(zipFilePath));
- }
-
- /**
- * Return the files' path in ZIP file.
- *
- * @param zipFile The ZIP file.
- * @return the files' path in ZIP file
- * @throws IOException if an I/O error has occurred
- */
- public static List getFilesPath(final File zipFile)
- throws IOException {
- if (zipFile == null) return null;
- List paths = new ArrayList<>();
- ZipFile zip = new ZipFile(zipFile);
- Enumeration> entries = zip.entries();
- while (entries.hasMoreElements()) {
- paths.add(((ZipEntry) entries.nextElement()).getName());
- }
- zip.close();
- return paths;
- }
-
- /**
- * Return the files' comment in ZIP file.
- *
- * @param zipFilePath The path of ZIP file.
- * @return the files' comment in ZIP file
- * @throws IOException if an I/O error has occurred
- */
- public static List getComments(final String zipFilePath)
- throws IOException {
- return getComments(getFileByPath(zipFilePath));
- }
-
- /**
- * Return the files' comment in ZIP file.
- *
- * @param zipFile The ZIP file.
- * @return the files' comment in ZIP file
- * @throws IOException if an I/O error has occurred
- */
- public static List getComments(final File zipFile)
- throws IOException {
- if (zipFile == null) return null;
- List comments = new ArrayList<>();
- ZipFile zip = new ZipFile(zipFile);
- Enumeration> entries = zip.entries();
- while (entries.hasMoreElements()) {
- ZipEntry entry = ((ZipEntry) entries.nextElement());
- comments.add(entry.getComment());
- }
- zip.close();
- return comments;
- }
-
- private static boolean createOrExistsDir(final File file) {
- return file != null && (file.exists() ? file.isDirectory() : file.mkdirs());
- }
-
- private static boolean createOrExistsFile(final File file) {
- if (file == null) return false;
- if (file.exists()) return file.isFile();
- if (!createOrExistsDir(file.getParentFile())) return false;
- try {
- return file.createNewFile();
- } catch (IOException e) {
- e.printStackTrace();
- return false;
- }
- }
-
- private static File getFileByPath(final String filePath) {
- return isSpace(filePath) ? null : new File(filePath);
- }
-
- private static boolean isSpace(final String s) {
- if (s == null) return true;
- for (int i = 0, len = s.length(); i < len; ++i) {
- if (!Character.isWhitespace(s.charAt(i))) {
- return false;
- }
- }
- return true;
- }
-}
diff --git a/bus-gradle-plugin/src/main/java/com/blankj/utilcode/util/BusUtils.java b/bus-gradle-plugin/src/main/java/com/blankj/utilcode/util/BusUtils.java
deleted file mode 100755
index 507919ff49..0000000000
--- a/bus-gradle-plugin/src/main/java/com/blankj/utilcode/util/BusUtils.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.blankj.utilcode.util;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-public final class BusUtils {
-
- @Target({ElementType.METHOD})
- @Retention(RetentionPolicy.CLASS)
- public @interface Subscribe {
- String name() default "";
- }
-}
\ No newline at end of file
diff --git a/bus-gradle-plugin/src/test/java/com/blankj/bus/BusTest.java b/bus-gradle-plugin/src/test/java/com/blankj/bus/BusTest.java
deleted file mode 100755
index 69931ca902..0000000000
--- a/bus-gradle-plugin/src/test/java/com/blankj/bus/BusTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.blankj.bus;
-
-
-import com.blankj.utilcode.util.BusUtils;
-
-import org.apache.commons.io.FileUtils;
-import org.junit.Test;
-
-import java.io.File;
-import java.util.Collection;
-
-import javassist.ClassPool;
-import javassist.CtClass;
-import javassist.CtMethod;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2018/09/21
- * desc :
- *
- */
-public class BusTest {
-
- @Test
- public void test() throws Exception {
- String rootPath = "/Users/blankj/Repo/AndroidUtilCode/app/build/intermediates/transforms/busTransform/debug/43/";
- File root = new File(rootPath);
- ClassPool mPool = new ClassPool(null);
- mPool.appendSystemPath();
- mPool.appendClassPath(rootPath);
- if (root.isDirectory()) {
- Collection files = FileUtils.listFiles(root, new String[]{"class"}, true);
-
- for (File file : files) {
- String fileName = file.getName();
-
- String filePath = file.getCanonicalPath();
- String packagePath = filePath.replace(rootPath, "");
- String className = packagePath.replace(System.getProperty("file.separator"), ".");
- // delete .class
- className = className.substring(0, className.length() - 6);
-
- CtClass ctClass = mPool.get(className);
-
- CtMethod[] methods = ctClass.getDeclaredMethods();
- for (CtMethod method : methods) {
- if (method.hasAnnotation(BusUtils.Subscribe.class)) {
- String name = ((BusUtils.Subscribe) method.getAnnotation(BusUtils.Subscribe.class)).name();
- String sign = method.getReturnType().getName() + ' ' + method.getLongName();
- System.out.println(name + ": " + sign);
- }
- }
- }
- }
- }
-}
diff --git a/config.gradle b/config.gradle
deleted file mode 100644
index 34f01c0bb8..0000000000
--- a/config.gradle
+++ /dev/null
@@ -1,178 +0,0 @@
-ext {
- applicationId = 'com.blankj.androidutilcode'
- appName = 'Util'
-
- compileSdkVersion = 27
- minSdkVersion = 14
- targetSdkVersion = 27
- versionCode = 1_022_000
- versionName = '1.22.0'// E.g. 1.9.72 => 1,009,072
-
- bus = [
- isDebug: true,
- version: '1.3',
- group : 'com.blankj'
- ]
-
- // lib version
- kotlin_version = '1.3.0'
- support_version = '27.1.1'
- leakcanary_version = '1.5.4'
-
- dep = [
- // plugin
- gradle : "com.android.tools.build:gradle:3.2.1",
- kotlin_gradle_plugin : "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version",
- android_maven_gradle_plugin: "com.github.dcendents:android-maven-gradle-plugin:2.1",
- gradle_bintray_plugin : "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4",
- bus_gradle_plugin : "com.blankj:bus-gradle-plugin:$bus.version",
-
- // lib
- support : [
- appcompat_v7: "com.android.support:appcompat-v7:$support_version",
- design : "com.android.support:design:$support_version",
- multidex : "com.android.support:multidex:1.0.2",
- ],
- constraint : "com.android.support.constraint:constraint-layout:1.1.3",
- kotlin : "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version",
- leakcanary : [
- android : "com.squareup.leakcanary:leakcanary-android:$leakcanary_version",
- android_no_op: "com.squareup.leakcanary:leakcanary-android-no-op:$leakcanary_version",
- ],
- free_proguard : "com.blankj:free-proguard:0.0.9",
- bus : "com.blankj:bus:1.0",
- adapt_screen : "com.blankj:adapt-screen:0.0.3",
-
- gson : "com.google.code.gson:gson:2.8.2",
- glide : "com.github.bumptech.glide:glide:4.7.1",
- retrofit : "com.squareup.retrofit2:retrofit:2.4.0",
- javassist : "org.javassist:javassist:3.23.1-GA",
- commons_io : "commons-io:commons-io:2.5",
-
- junit : "junit:junit:4.12",
- robolectric : "org.robolectric:robolectric:3.1.2",
- ]
-
- configAndroidDomain = this.&configAndroidDomain
- configAppDependencies = this.&configAppDependencies
-}
-
-def configAndroidDomain(Project pro) {
- configCommon(pro)
- if (pro.plugins.hasPlugin("com.android.application")) {
- configAppAndroidDomain(pro)
- } else {
- configLibAndroidDomain(pro)
- }
-}
-
-def configCommon(Project pro) {
- pro.android {
- compileSdkVersion rootProject.compileSdkVersion
- defaultConfig {
- minSdkVersion rootProject.minSdkVersion
- versionCode rootProject.versionCode
- versionName rootProject.versionName
- }
-
- lintOptions {
- abortOnError false
- }
-
- testOptions.unitTests.all {
- testLogging {
- events 'passed', 'skipped', 'failed', 'standardOut', 'standardError'
- }
- }
- }
-}
-
-
-def configAppAndroidDomain(Project pro) {
- configSigning(pro)
- configApkName(pro)
- String suffix = getSuffix(pro)
- pro.android {
- defaultConfig {
- applicationId rootProject.applicationId + suffix
- targetSdkVersion rootProject.targetSdkVersion
- multiDexEnabled true
- resValue "string", "app_name", rootProject.appName + suffix
- }
-
- 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'
- }
- }
-
- pro.dependencies {
- // LeakCanary
- debugImplementation dep.leakcanary.android
- releaseImplementation dep.leakcanary.android_no_op
- }
-}
-
-private static String getSuffix(Project pro) {
- String[] splits = pro.name.split("-")
- String suffix = ""
- if (splits.length == 2) {
- suffix = "." + splits[0]
- }
- return suffix
-}
-
-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 {
- buildTypes {
- release {
- minifyEnabled false
- consumerProguardFiles 'proguard-rules.pro'
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
-
- afterEvaluate {
- generateReleaseBuildConfig.enabled = false
- generateDebugBuildConfig.enabled = false
- }
- }
-}
-
-//./gradlew clean utilcode-lib: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/launcher/app/proguard-rules.pro b/feature/launcher/app/proguard-rules.pro
similarity index 100%
rename from launcher/app/proguard-rules.pro
rename to feature/launcher/app/proguard-rules.pro
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/launcher/app/.gitignore b/feature/main/app/.gitignore
similarity index 100%
rename from launcher/app/.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/launcher/pkg/proguard-rules.pro b/feature/main/app/proguard-rules.pro
similarity index 100%
rename from launcher/pkg/proguard-rules.pro
rename to feature/main/app/proguard-rules.pro
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/launcher/pkg/.gitignore b/feature/main/pkg/.gitignore
similarity index 100%
rename from launcher/pkg/.gitignore
rename to feature/main/pkg/.gitignore
diff --git a/feature/main/pkg/build.gradle b/feature/main/pkg/build.gradle
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/lib/resource/proguard-rules.pro b/feature/main/pkg/proguard-rules.pro
similarity index 100%
rename from lib/resource/proguard-rules.pro
rename to feature/main/pkg/proguard-rules.pro
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/lib/resource/.gitignore b/feature/mock/.gitignore
similarity index 100%
rename from lib/resource/.gitignore
rename to feature/mock/.gitignore
diff --git a/feature/mock/build.gradle b/feature/mock/build.gradle
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/subutil/pkg/proguard-rules.pro b/feature/mock/proguard-rules.pro
similarity index 100%
rename from subutil/pkg/proguard-rules.pro
rename to feature/mock/proguard-rules.pro
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/subutil/lib/.gitignore b/feature/subutil/app/.gitignore
similarity index 100%
rename from subutil/lib/.gitignore
rename to feature/subutil/app/.gitignore
diff --git a/feature/subutil/app/build.gradle b/feature/subutil/app/build.gradle
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/utilcode/pkg/proguard-rules.pro b/feature/subutil/app/proguard-rules.pro
similarity index 100%
rename from utilcode/pkg/proguard-rules.pro
rename to feature/subutil/app/proguard-rules.pro
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/subutil/pkg/.gitignore b/feature/subutil/export/.gitignore
similarity index 100%
rename from subutil/pkg/.gitignore
rename to feature/subutil/export/.gitignore
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/utilcode/pkg/.gitignore b/feature/subutil/pkg/.gitignore
similarity index 100%
rename from utilcode/pkg/.gitignore
rename to feature/subutil/pkg/.gitignore
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 HerringtonPHP HacksO'ReillyJack HerringtonPodcasting HacksO'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