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/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 ff9841fba7..9d11f56a24 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,15 @@
*.iml
+__api__.json
+__bus__.json
.gradle
-/local.properties
+local.properties
.idea
.DS_Store
/build
/captures
-.externalNativeBuild
\ No newline at end of file
+.externalNativeBuild
+/apk
+*.phrof
+/mavenLocal
+/reports
+*/reports
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 73c02e40e7..0000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-language: android
-jdk: oraclejdk8
-sudo: false
-
-env:
- global:
- - COMPILE_SDK_VERSION = 25
- - BUILD_TOOLS_VERSION = 25.0.2
-
-android:
- components:
- - platform-tools
- - tools
- - build-tools-$BUILD_TOOLS_VERSION
- - android-$COMPILE_SDK_VERSION
-
- licenses:
- - android-sdk-license-.+
- - '.+'
-
- notifications:
- email: false
-
-before_install:
- - chmod +x gradlew
- - mkdir "$ANDROID_HOME/licenses" || true
- - echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license"
- - echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_HOME/licenses/android-sdk-preview-license"
-
-script:
- - ./gradlew build connectedCheck
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000000..73e8145bf1
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,522 @@
+* `22/10/15` [add] Fix some issue. Publish v1.31.1
+* `21/12/06` [add] Publish v1.31.0
+* `21/05/13` [add] Support publish mavenCentral.
+* `21/02/22` [add] Fix ToastUtils rtl bug. Publish v1.30.6.
+* `20/11/16` [add] Add ImageUtils#save2Album support param of dirName.
+* `20/11/13` [add] Fix MessengerUtils ANR. Add NetworkUtils#getWifiScanResult, [add|remove]OnWifiChangedConsumer. Publish v1.30.5.
+* `20/10/29` [add] Fix MessengerUtils startService IllegalStateException. Publish v1.30.4.
+* `20/10/28` [add] Fix BusUtils ConcurrentModificationException. Publish v1.30.3.
+* `20/10/27` [add] Fix AppUtils#getAppSignatures. Add DeviceUtils#isDevelopmentSettingsEnabled. Publish v1.30.2.
+* `20/10/26` [add] Fix AppUtils#isAppForeground. Publish v1.30.1.
+* `20/10/24` [add] Publish v1.30.0.
+* `20/10/23` [fix] LanguageUtils crash on some device.
+* `20/10/21` [add] LogUtils.Config#setOnConsoleOutputListener, setOnFileOutputListener, addFileExtraHead. LogUtils.getCurrentLogFilePath.
+* `20/10/20` [opt] ToastUtils.
+* `20/10/12` [add] PermissionUtils#explain.
+* `20/10/10` [add] ClipboardUtils.
+* `20/10/08` [add] VolumeUtils.
+* `20/09/06` [add] DebouncingUtils#isValid.
+* `20/09/04` [fix] ToastUtils adapt SDK 30.
+* `20/05/28` [fix] IntentUtils#getInstallAppIntent file exist wrong. Publish v1.29.0.
+* `20/05/23` [fix] BusUtils#postSticky times not right. Publish v1.28.6.
+* `20/05/22` [add] IntentUtils#getInstallAppIntent support Uri param.
+* `20/05/21` [add] Publish bus plugin v2.6. Publish api plugin v1.4. Publish. Publish v1.28.5.
+* `20/05/19` [fix] FileUtils#copyOrMoveDird NPE.
+* `20/05/18` [add] IntentUtils#getLaunchAppDetailsSettingsIntent support isNewTask.
+* `20/05/17` [add] ImageUtils#save2Album, NetworkUtils#getSSID, UtilsTransActivity4MainProcess.
+* `20/05/03` [add] Publish bus plugin v2.5. Publish api plugin v1.3. Publish. Publish v1.28.4.
+* `20/04/30` [add] BaseItem support partialUpdate.
+* `20/04/29` [add] Publish plugin lib com.blankj:base-transform:1.0.
+* `20/04/28` [fix] LanguageUtils#applyLanguage.
+* `20/04/27` [fix] BarUtils#isNavBarVisible.
+* `20/04/26` [fix] Utils#init fit tinker. Publish v1.28.3.
+* `20/04/25` [fix] UriUtils#uri2File Unknown URI. Publish 1.28.2.
+* `20/04/24` [add] SnackbarUtils support show on the top; UriUtils#uri2InputStream.
+* `20/04/23` [fix] UriUtils#uri2File not support HW; TransActivity crash below 21.
+* `20/04/23` [fix] PhoneUtils#getSerial, PhoneUtils#getSerial crash on Android 10.
+* `20/04/20` [fix] ImageUtils#isImage.
+* `20/04/18` [fix] PermissionUtils#callback. Publish v1.28.1.
+* `20/04/17` [fix] ImageUtils#view2Bitmap, ImageUtils.getBitmap(InputStream).
+* `20/04/16` [add] ConvertUtils#int2HexString, hexString2Int.
+* `20/04/15` [add] UiMessageUtils' demo.
+* `20/04/13` [add] NumberUtils. Publish v1.28.0.
+* `20/04/12` [opt] TimeUtils#SDF_THREAD_LOCAL.
+* `20/04/11` [add] SDCardUtils#getXxTotalSize, SDCardUtils#getXxAvailableSize. FileUtils#getFsTotalSize, FileUtils#getFsAvailableSize.
+* `20/04/10` [fix] FileUtils#isFileExists; FragmentUtils#getTop bug. Publish v1.27.6.
+* `20/04/09` [add] UriUtils#res2Uri, UriUtils#uri2File support QQBrowser; ThreadUtils#getMainHandler; PathUtils#getxxPathExternalFirst.
+* `20/04/08` [fix] ActivityUtils#finish bug. Publish v1.27.5.
+* `20/04/08` [fix] CleanUtils clean dir not work. FileUtils#isFileExists. Publish v1.27.4.
+* `20/04/08` [fix] CrashUtils DefaultUncaughtExceptionHandler is wrong; LogUtils write file failed; Utils#getApp failed run on remote process. Publish v1.27.3.
+* `20/04/07` [mdf] GsonUtils#getGson() method public.
+* `20/04/04` [fix] ShadowUtils bug running on lower version devices. Publish v1.27.2.
+* `20/04/03` [fix] UtilsActivityLifecycleImpl#HashMap#remove IllegalStateException bug.
+* `20/04/02` [fix] PathUtils sdcard enable state is wrong; ActivityUtils finish activity wrong; Publish v1.27.1.
+* `20/03/31` [add] Publish v1.27.0.
+* `20/03/30` [add] BatteryUtils in subutil.
+* `20/03/27` [add] publish.gradle.
+* `20/03/24` [add] UtilsBridge to clean the utils.
+* `20/03/22` [upd] GsonUtils support custom gson.
+* `20/03/20` [add] ActivityUtils#addActivityLifecycleCallbacks, ActivityUtils#removeActivityLifecycleCallbacks.
+* `20/01/17` [upd] Leak Canary to v2.1.
+* `20/01/06` [add] ClickUtils#expandClickArea, ClickUtils#back2HomeFriendly
+* `19/11/30` [add] Publish bus plugin v2.4. Publish api plugin v1.2.
+* `19/11/28` [add] Publish v1.26.0.
+* `19/11/27` [add] Shadow demo.
+* `19/11/26` [add] MVP demo.
+* `19/11/22` [fix] Adapt the project for Gradle version of 6.0.
+* `19/10/30` [add] Publish bus plugin v2.3. Publish api plugin v1.1.
+* `19/10/24` [upd] Demo's UI.
+* `19/10/22` [add] NotificationUtils and demo.
+* `19/10/20` [add] UiMessageUtils.
+* `19/09/20` [add] ShadowUtils.
+* `19/08/27` [add] DebugUtils.
+* `19/08/26` [fix] PermissionUtils NPE.
+* `19/08/25` [upd] ImageUtils#getImageType. [add] LogUtils#getLogFiles. Publish v1.25.9.
+* `19/08/24` [fix] PhoneUtils#getIMEI crash on SDK 29.
+* `19/08/23` [add] ViewUtils#isLayoutRtl.
+* `19/08/22` [add] LogUtils#getLogFiles.
+* `19/08/13` [add] MapUtils and MapUtilsTest. Publish v1.25.8.
+* `19/08/12` [add] CollectionUtils and CollectionUtilsTest.
+* `19/08/11` [add] ArrayUtils and ArrayUtilsTest.
+* `19/08/09` [fix] https://www.virustotal.com/gui/home/upload with ESET-NOD32. Publish v1.25.7.
+* `19/08/08` [add] BusUtils#post tag support one-to-many. Publish v1.25.6.
+* `19/08/04` [add] ThreadUtils#Task support timeout.
+* `19/08/01` [upd] EncryptUtils#rsa.
+* `19/07/31` [add] DeviceUtils#getUniqueDeviceId, DeviceUtils#isSameDevice. Publish v1.25.5.
+* `19/07/30` [fix] ThreadUtils's task can only be executed once. PhoneUtils#getIMEI wrong.
+* `19/07/29` [fix] BusUtils post father class useless. KeyboardUtils#hideSoft bug. Publish v1.25.4.
+* `19/07/28` [add] NetworkUtils#(un)registerNetworkStatusChangedListener. Publish v1.25.3.
+* `19/07/27` [fix] ThreadUtils memory leak.
+* `19/07/26` [add] ContainerUtils. Publish v1.25.2.
+* `19/07/25` [fix] PermissionUtils' NullPointException.
+* `19/07/24` [fix] ZipUtils#unzipFile.
+* `19/07/23` [fix] ThreadUtils of cache pool. Publish v1.25.1.
+* `19/07/18` [add] README of ApiUtils and BusUtils.
+* `19/07/15` [add] Publish v1.25.0.
+* `19/07/14` [upd] Bus plugin for use BusUtils. Publish bus plugin v2.0.
+* `19/07/13` [add] Api plugin for use ApiUtils. Publish api plugin v1.0.
+* `19/07/09` [upd] The frame of project.
+* `19/07/06` [upd] BusUtils which behave same as EventBus.
+* `19/07/03` [add] ApiUtils which decoupling modules.
+* `19/06/30` [add] LanguageUtils support activity's class name.
+* `19/06/29` [add] ClickUtils#OnMultiClickListener, and remove dangerous function. Publish v1.24.6.
+* `19/06/28` [add] LanguageUtils. Publish v1.24.5.
+* `19/06/20` [fix] BusUtils' permission. Publish v1.24.4.
+* `19/06/19` [fix] UriUtils. Publish v1.24.3.
+* `19/06/18` [add] ClickUtils, ViewUtils.
+* `19/06/07` [fix] LogUtils file name contains ':'. Publish v1.24.2.
+* `19/06/06` [fix] LogUtils write to file. Publish v1.24.1.
+* `19/06/03` [fix] Refactoring framework. Publish v1.24.0.
+* `19/04/25` [fix] LogUtils delete due log.
+* `19/04/24` [upd] The swipe panel.
+* `19/03/17` [fix] The ugly UI.
+* `19/03/14` [fix] AdaptScreenUtils didn't work on some HaWei tablet.
+* `19/03/09` [fix] UriUtils#uri2File.
+* `19/03/08` [add] LogUtils support multi process. Publish v1.23.7.
+* `19/03/02` [fix] LogUtils#file.
+* `19/02/28` [fix] ImageUtils#calculateInSampleSize. Publish v1.23.6.
+* `19/02/26` [fix] UriUtils#uri2File. Publish v1.23.5.
+* `19/01/31` [add] HttpUtils.
+* `19/01/30` [add] RomUtils. Publish v1.23.4.
+* `19/01/29` [fix] LogUtils format json when json not start with '{'. Publish v1.23.3.
+* `19/01/28` [fix] KeyboardUtils#fixSoftInputLeaks don't work on the device of HuaWei.
+* `19/01/26` [fix] NetworkUtils#getNetworkType.
+* `19/01/25` [add] CloneUtils, PermissionUtils support request permission of WRITE_SETTINGS and DRAW_OVERLAYS. Publish v1.23.2.
+* `19/01/24` [add] BrightnessUtils and FlashlightUtils.
+* `19/01/23` [add] Modify the demo of utilcode use kotlin. Publish v1.23.1.
+* `19/01/22` [fix] AppUtils#installApp.
+* `19/01/17` [fix] Publish v1.23.0.
+* `19/01/16` [fix] BarUtils get Activity from view and delete the function of set status bar alpha.
+* `19/01/15` [add] ColorUtils.
+* `19/01/04` [add] CacheDiskStaticUtils, CacheDoubleStaticUtils, CacheMemoryStaticUtils.
+* `19/01/03` [add] SPStaticUtils.
+* `19/01/02` [fix] LogUtils log object. Publish v1.22.10.
+* `19/01/01` [add] GsonUtils.
+* `18/12/29` [add] AntiShakeUtils and VibrateUtils. Publish v1.22.9.
+* `18/12/28` [fix] ToastUtils show behind the dialog when close notification.
+* `18/12/27` [fix] LogUtils print StringBuilder failed.
+* `18/12/24` [fix] Utils$ActivityLifecycleImpl.consumeOnActivityDestroyedListener ConcurrentModificationException. Publish v1.22.7.
+* `18/12/22` [fix] AdaptScreenUtils#pt2px don't work when start webview. Publish v1.22.6.
+* `18/12/21` [add] LogUtils support print Map, Collection and Object to String.
+* `18/12/19` [fix] AdaptScreenUtils don't work in MIUI on Android 5.1.1. Publish v1.22.5.
+* `18/12/18` [fix] ToastUtils multi show crash when run API 25. Publish v1.22.4.
+* `18/12/18` [fix] ImageUtils recycle ret equals src. Publish v1.22.3.
+* `18/12/17` [fix] Utils$FileProvider4UtilCode not found. Publish v1.22.3.
+* `18/12/17` [fix] ToastUtils leak. Publish v1.22.2.
+* `18/12/09` [add] Component for the project.
+* `18/12/04` [add] BusUtils. Publish v1.22.1.
+* `18/11/18` [fix] ToastUtils don't show in the devices grater than API 24 when close the permission of notification. Publish v1.22.0.
+* `18/11/17` [fix] AppUtils#isAppInstalled don't work in no launcher app.
+* `18/11/16` [fix] ThreadUtils#cancel block the main thread.
+* `18/11/15` [add] module of bus-gradle-plugin and change style of gradle.
+* `18/11/14` [add] BusUtils.
+* `18/11/13` [add] AdaptScreenUtils.
+* `18/11/12` [fix] SPUtils bug when use in multi threads.
+* `18/10/25` [fix] SpanUtils#setLineHeight bug of multi lines. Publish v1.21.2.
+* `18/10/24` [fix] SpanUtils#appendImage on VIVO. Publish v1.21.1.
+* `18/10/16` [add] BusUtils, DeviceUtils#isAdbEnabled. Publish v1.21.0.
+* `18/09/29` [fix] ToastUtils which causes crash in the some devices of Xiaomi. Publish v1.20.4.
+* `18/09/13` 修复 ToastUtils 在小米手机显示 Toast 带有 App 名,发布 1.20.3
+* `18/09/12` 修复 KeyBoardUtils#fixAndroidBug5497,完善 ToastUtils,发布 1.20.2
+* `18/09/11` 新增 BarUtils#isSupportNavBar,删除 BarUtils#setNavBarImmersive
+* `18/09/10` 修复 KeyboardUtils 中 getWindowVisibleDisplayFrame 空指针异常,更新 BarUtils#isNavBarVisible
+* `18/09/06` 新增 PathUtils,发布 1.20.1
+* `18/09/05` 新增 KeyboardUtils#showSoftInputUsingToggle 和 KeyboardUtils#hideSoftInputUsingToggle
+* `18/09/04` 修复 SHA 算法名
+* `18/09/03` 新增 MetaDataUtils,发布 1.20.0
+* `18/08/30` 修复 PermissionUtils$PermissionActivity 的 window 背景为黑色的问题,发布 1.19.4
+* `18/08/28` 新增 RegexUtils#isIDCard18Exact
+* `18/08/26` 新增 AppUtils#getAppSignatureSHA256 和 AppUtils#getAppSignatureMD5,发布 1.19.3
+* `18/08/24` 新增 ScreenUtils#restoreAdaptScreen,利用 FileProvider4UtilCode 不再需要初始化,发布 1.19.2
+* `18/08/23` 修复 适配后 ToastUtils 原生 Toast 尺寸发生改变的问题,修复 KeyboardUtils#fixSoftInputLeaks,发布 1.19.1
+* `18/08/10` 修复 ScreenUtils#adaptxx 导致获取状态栏和导航栏尺寸不对问题,发布 1.19.0
+* `18/08/09` 新增 IntentUtils#isIntentAvailable,ToastUtils 传入空显示 null,发布 1.18.6
+* `18/08/08` 修复 ScreenUtils#adaptxx 在第三方 SDK 会出现的问题,发布 1.18.5
+* `18/08/07` 修复 ScreenUtils#adaptxx 在 API 26 以下无效的 bug,发布 1.18.4
+* `18/08/06` 修复 ScreenUtils#screenShot 中 decorView.getDrawingCache() 为空的问题,发布 1.18.3
+* `18/08/05` 修复 1.18.0 版本删去 `if (activity.getClass() == PermissionUtils.PermissionActivity.class) return;` 造成 PermissionUtils 获取栈顶 Activity 问题,发布 1.18.2
+* `18/08/04` 新增 LogUtils#Config#setSaveDays,发布 1.18.1
+* `18/08/03` 新增 LogUtils#Config#addFormatter,并新增 Array, Throwable, Bundle, Intent 的格式化输出
+* `18/08/02` 修复 TimeUtils 中的 SimpleDateFormat 为 ThreadLocal 实现
+* `18/08/01` 删除 标记废弃的 CacheUtils, AppUtils#installApp, TimeUtils#getWeekIndex,发布 1.18.0
+* `18/07/30` 替换 ScreenUtils#adaptPortraitScreen 和 ScreenUtils#adaptLandscapeScreen,为 ScreenUtils#adaptScreen4VerticalSlide 和 ScreenUtils#adaptScreen4HorizontalSlide
+* `18/07/28` 修复 NetworkUtils#getIPAddress
+* `18/07/16` 新增 ScreenUtils#adaptPortraitScreen 和 ScreenUtils#adaptLandscapeScreen,发布 1.17.3
+* `18/07/13` 修复 IntentUtils 分享图片判断逻辑,CacheDiskUtils 可放入 byte[0]
+* `18/06/29` 修复 FragmentUtils 中 getFragmentManager 空指针错误,发布 1.17.2
+* `18/06/27` 新增 UriUtils#uri2File
+* `18/06/25` 新增 KeyboardUtils#fixAndroidBug5497,发布 1.17.1 版本
+* `18/06/21` 修复 FragmentUtils#add 死循环的 BUG
+* `18/06/14` 替换 CacheUtils 为 CacheDiskUtils,CacheUtils 标记 deprecated,发布 1.17.0 版本
+* `18/06/13` 新增 CacheMemoryUtils 和 CacheDoubleUtils
+* `18/06/12` 完善 FragmentUtils#add 和 replace 新增 tag
+* `18/05/30` 完善 DeviceUtils#getMacAddress,发布 1.16.4 版本
+* `18/05/30` 修复 ToastUtils 在 targetSdkVersion 为 27 在 api 25 机器快速 show 两次崩溃的异常,发布 1.16.3 版本
+* `18/05/29` 完善 TimeUtils 的 timeSpan 带符号位,ToastUtils 去除弱引用,发布 1.16.2 版本
+* `18/05/25` 新增 AppUtils#registerAppStatusChangedListener 和 AppUtils#unregisterAppStatusChangedListener,发布 1.16.1 版本
+* `18/05/22` 新增 ThreadUtils,发布 1.16.0 版本
+* `18/05/15` 新增 MetaDataUtils 和 ActivityUtils#startActivityForResult,发布 1.15.1 版本
+* `18/05/08` 新增 ResourceUtils,发布 1.15.0 版本
+* `18/05/07` 修复 ZipUtils 漏洞,发布 1.14.4 版本
+* `18/05/03` 修复 ToastUtils 默认字体大小问题,发布 1.14.3 版本
+* `18/05/02` 修复 PermissionUtils 空异常,发布 1.14.2 版本
+* `18/04/28` 新增 FlashlightUtils,发布 1.14.1 版本
+* `18/04/26` 修复 KeyboardUtils 全屏 NO_LIMIT 的 bug
+* `18/04/25` 修复 多个空异常
+* `18/04/24` 修复 多 FileProvider 带来的问题,发布 1.14.0 版本
+* `18/04/23` 新增 RSA 加解密,发布 1.13.16 版本
+* `18/04/22` 新增 LogUtils 设置栈偏移
+* `18/04/21` 新增 AppUtils#relaunchApp、DeviceUtils#getABIs,发布 1.13.15 版本
+* `18/04/20` 新增 BarUtils#setNavBarColor、BarUtils#getNavBarColor
+* `18/04/19` 新增 Process#isMainProcess、Process#getCurrentProcessName,发布 1.13.14 版本
+* `18/04/18` 修复 LogUtils 头部空指针异常,SPUtils、CacheUtils 存储空值异常,发布 1.13.13 版本
+* `18/04/17` 修复 ToastUtils 内存泄漏问题,感谢 [LambertCoding](https://github.com/LambertCoding),发布 1.13.12 版本
+* `18/04/16` 完善 AppUtils#installAppSilent 路径包含空格问题,发布 1.13.11 版本
+* `18/04/10` 完善 OnCrashListener 回调崩溃信息,发布 1.13.10 版本
+* `18/04/09` 修复 静默安装重载错误,发布 1.13.9 版本
+* `18/04/08` 修复 获取栈顶 Activity 链表为空的异常,获取栈顶 Activity 放到 Utils 中,发布 1.13.8 版本
+* `18/04/06` 新增 GsonUtils 及单元测试
+* `18/04/05` 完善 README 文档
+* `18/04/03` 修复 LogUtils 在 Android Studio 3.1 版本日志丑陋的问题,发布 1.13.7 版本
+* `18/03/29` 兼容 Utils 的初始化传入 application,发布 1.13.6 版本
+* `18/03/20` 修复 PermissionUtils 子进程的问题,发布 1.13.5 版本
+* `18/03/16` 新增 gradle 插件来格式化 README
+* `18/03/14` 修复 KeyboardUtils#getContentViewInvisibleHeight,发布 1.13.4 版本
+* `18/03/10` 完善 AppUtils#installAppSilent 和 DeviceUtils#getMacAddress,发布 1.13.3 版本
+* `18/03/09` 完善 ActivityUtils#getTopActivity
+* `18/03/08` 新增 反射获取栈顶 Activity 的方法,发布 1.13.2 版本
+* `18/03/07` 修复 PermissionUtils 请求权限为 0 的 崩溃
+* `18/03/05` 修复 Library Source does not match the bytecode for class LogUtils 问题,发布 1.13.1 版本
+* `18/03/04` 完善 Javadoc 中文版为英文版,发布 1.13.0 版本
+* `18/03/04` 完善 Javadoc 中文版为英文版
+* `18/03/03` 完善 Javadoc 中文版为英文版
+* `18/03/02` 完善 Javadoc 中文版为英文版
+* `18/03/01` 完善 Javadoc 中文版为英文版
+* `18/02/28` 完善 Javadoc 中文版为英文版
+* `18/02/27` 完善 Javadoc 中文版为英文版
+* `18/02/26` 完善 Javadoc 中文版为英文版
+* `18/02/25` 完善 Javadoc 中文版为英文版
+* `18/02/24` 完善 Javadoc 中文版为英文版
+* `18/02/23` 完善 Javadoc 中文版为英文版
+* `18/02/22` 完善 Javadoc 中文版为英文版
+* `18/02/21` 完善 Javadoc 中文版为英文版
+* `18/02/10` 完善 Javadoc 中文版为英文版
+* `18/02/09` 完善 非空转换插件 traute 的使用方式
+* `18/02/08` 修复 ActivityUtils option 低版本为空的异常
+* `18/01/31` 修复 default 相关的逻辑错误,发布 1.12.4,修复 ToastUtils 在 kotlin 中转义失败,发布 1.12.5
+* `18/01/28` 修复 ToastUtils 默认样式问题,发布 1.12.2,新增 DeviceUtils#getSDKVersionName,发布 1.12.3
+* `18/01/27` 修复 PermissionUtils 某些机型闪烁问题,发布 1.12.1
+* `18/01/17` 完善 ReflectUtils 及单元测试,发布 1.12.0 版本
+* `18/01/16` 完善 ReflectUtils 及单元测试
+* `18/01/15` 完善 ReflectUtils 及单元测试
+* `18/01/14` 完善 ReflectUtils 及单元测试
+* `18/01/13` 完善 ReflectUtils 及单元测试
+* `18/01/12` 完善 ReflectUtils 及单元测试
+* `18/01/11` 修复 ImageUtils 的 fastBlur radius 为 1 recycle 的 bug,新增 CrashUtils 初始化崩溃监听事件,发布 1.11.1 版本
+* `18/01/10` 完善 PermissionUtils 及 readme,发布 1.11.0 版本
+* `18/01/09` 完善 demo 动态权限适配
+* `18/01/08` 新增 SPActivity,删除 SPUtils 的单元测试
+* `18/01/08` 修复 ToastUtils 在 SDK 为 18 的自定义 toast 崩溃问题
+* `18/01/07` 新增 PermissionUtils 的 Demo
+* `18/01/06` 修复 权限相关工具类内存泄漏问题
+* `18/01/05` 新增 获取 Activity icon 和 logo
+* `18/01/04` 完善 6.0 动态权限相关工具类
+* `18/01/03` 完善 6.0 动态权限相关工具类
+* `18/01/02` 完善 6.0 动态权限相关工具类
+* `18/01/01` 新增 6.0 动态权限相关工具类
+* `17/12/30` 删除 SpanUtils 中设置图标
+* `17/12/29` 完善 SpanUtils 的 appendImage 对齐方式
+* `17/12/28` 完善 ScreenUtils 设置全屏的方式,发布 1.10.0
+* `17/12/26` 新增 状态栏、导航栏设置是否可见和判断是否可见
+* `17/12/22` 新增 注册软键盘改变监听器、注册导航栏改变监听器方法
+* `17/12/21` 完善 获取屏幕宽高,修复行宽度大于 100 字符
+* `17/12/20` 修复 SpanUtils 图标的 bug,不高于 6.0 的版本不支持居中和底部对齐
+* `17/12/19` 修复 SpanUtils 多图的 bug
+* `17/12/15` 新增 ReflectUtils
+* `17/12/14` 完善 手机号(精确)正则,发布 1.9.12
+* `17/12/12` 完善 LogUtils,当最终日志长度为 0 时,输出 log nothing
+* `17/12/11` 完善 ActivityUtils 的 finish 系列,发布 1.9.11
+* `17/12/04` 完善 LogUtils 边框改为单线清爽型
+* `17/11/30` 修复 ToastUtils 背景问题,发布 1.9.10
+* `17/11/30` 修复 ToastUtils 获取背景为空,发布 1.9.9
+* `17/11/28` 修复 EmptyUtils 对 CharSequence 的判断,感谢 jiezigg
+* `17/11/24` 新增 readme 格式化的 gradle 脚本
+* `17/11/15` 完善 资源分包位置,使其更合理
+* `17/11/10` 完善 LogUtils 新增日志头部,感谢 Kanade
+* `17/11/07` 完善 LogUtils 无 tag 的多参数
+* `17/11/06` 修复 LogUtils 多参数打印失败的问题
+* `17/11/01` 完善 ShellUtil 的 Msg 换行,感谢香脆的大鸡排
+* `17/10/30` 完善 README
+* `17/10/29` 修复 6.0 内部存储安装失败问题
+* `17/10/28` 完善 compile 为 implementation, provided 为 compileOnly
+* `17/10/27` 修复 兼容 AS3.0
+* `17/10/27` 修复 LogUtils 在 kotlin 中使用的问题
+* `17/10/25` 修复 LogUtils 边框,修复 getBitmap 从流获取
+* `17/09/30` 完善 FragmentUtils,发布 1.9.2
+* `17/09/29` 完善 FragmentUtils 和 isInstallApp
+* `17/09/28` 完善 FragmentUtils
+* `17/09/27` 完善 FragmentUtils
+* `17/09/26` 完善 ActivityUtils 及 Demo,发布 1.9.1
+* `17/09/25` 完善 ActivityUtils 及 Demo
+* `17/09/24` 完善 ActivityUtils 及 Demo
+* `17/09/23` 完善 FragmentUtils
+* `17/09/19` 修复 CrashUtils 自定义路径错误
+* `17/09/18` 完善 ImageUtils 的 Demo
+* `17/09/17` 完善 ImageUtils 的 compress
+* `17/09/13` 完善 ImageUtils 的 addBorder
+* `17/09/13` 完善 ImageUtils 的 toRound
+* `17/09/13` 完善 ImageUtils 和 LogUtils
+* `17/09/12` 完善 ImageUtils
+* `17/09/10` 完善 单元测试
+* `17/09/08` 完善 单元测试
+* `17/09/06` 完善 SDCardUtils 获取 SD 卡路径,完善 SPUtils 新增 commit
+* `17/09/05` 完善 LogUtils,发布版本 1.9.0
+* `17/09/04` 完善 ToastUtils,去除相关 safe 函数,都改为 safe 实现,新增 CustomToast 的 Demo
+* `17/09/02` 完善 ToastUtils,去除引入 view 带来的问题,发布版本 1.8.6
+* `17/08/30` 修复 ToastUtils 弱引用带来的问题,修复 CacheUtils 异步问题,发布版本 1.8.5
+* `17/08/28` 修复 ToastUtils 内存泄露,新增 toast 可根据系统字体显示不同字体,发布版本 1.8.4
+* `17/08/20` 新增 监听 Activity 生命周期,退出 App,发布版本 1.8.3
+* `17/08/11` 完善 LogUtils 的 Builder 改为 Config,发布版本 1.8.2
+* `17/08/10` 完善 FileUtils 的 deleteFilesInDir 和 listFilesInDir
+* `17/08/08` 新增 反射工具类 ReflectUtils
+* `17/08/06` 完善 为按功能分包,增加 subutil 的 Demo
+* `17/07/31` 修复 NetworkUtils 的 isAvailableByPing 循环递归,发布 1.8.1
+* `17/07/31` 完善 BarUtils,发布 1.8.0
+* `17/07/31` 完善 BarUtils
+* `17/07/30` 完善 BarUtils
+* `17/07/29` 完善 BarUtils
+* `17/07/28` 完善 BarUtils
+* `17/07/27` 完善 BarUtils
+* `17/07/26` 完善 ActivityUtils
+* `17/07/25` 完善 BarUtils,更新布局文件
+* `17/07/24` 完善 BarUtils
+* `17/07/23` 完善 BarUtils
+* `17/07/22` 完善 BarUtils
+* `17/07/21` 完善 xml 文件的格式化
+* `17/07/17` 完善 NetworkUtils 的 isAvailableByPing 函数新增 ip 参数
+* `17/07/14` 修复 FragmentUtils 的 FragmentNode 为 public
+* `17/07/11` 完善 将不常用的工具类放在 subutil 中
+* `17/07/10` 新增 subutil 库
+* `17/07/07` 修复 TimeUtils 中获取当天零点的 bug
+* `17/07/02` 完善 BarUtils 的 Demo
+* `17/07/01` 完善 BarUtils 的 Demo
+* `17/06/30` 完善 BarUtils 的 Demo
+* `17/06/29` 新增 README logo
+* `17/06/28` 新增 返回键及右划返回
+* `17/06/27` 新增 Toolbar
+* `17/06/26` 新增 final 参数
+* `17/06/23` 完善 Demo 主页
+* `17/06/20` 完善 ToastUtil, SnackbarUtils 新增设置底边距
+* `17/06/17` 删除 HandlerUtils
+* `17/06/16` 新增 insight.io 的 bandage
+* `17/06/14` 完善 LogUtils 回退栈,发布 1.7.1 版本
+* `17/06/13` 完善 Snackbar 和 Toast 的 Demo
+* `17/06/12` 完善 Snackbar 为建造者模式
+* `17/06/11` 完善 SpanUtils,发布版本 1.7.0
+* `17/06/08` 完善 SpanUtils
+* `17/06/07` 完善 SpannableStringUtils 改名为 SpanUtils,即将完工
+* `17/06/06` 完善 SpannableStringUtils
+* `17/06/05` 完善 SpannableStringUtils
+* `17/06/04` 完善 SpannableStringUtils
+* `17/06/03` 完善 SpannableStringUtils
+* `17/06/02` 完善 SpannableStringUtils
+* `17/06/01` 完善 KeyBoardUtils 及 Demo
+* `17/05/30` 完善 CrashUtils,发布 1.6.4
+* `17/05/28` 修复 CacheUtils 的 bug,发布 1.6.3
+* `17/05/27` 修复 CacheUtils 的 bug,发布 1.6.2
+* `17/05/26` 完善 CacheUtils,发布 1.6.0 和 1.6.1
+* `17/05/25` 完善 FileIOUtils 和 CacheUtils
+* `17/05/23` 新增 读取文件到字符数组中两种方式
+* `17/05/19` 新增 LogUtils 文件过滤和控制台开关
+* `17/05/16` 新增 ActivityUtils 动画
+* `17/05/12` 新增 base 系列
+* `17/05/11` 修复 SpannableStringUtils 的 setDrawable 的 bug,发布 1.5.1
+* `17/05/10` 完善 7.0 安装 App,完善 AppActivity
+* `17/05/09` 完善 TimeUtils 单元测试
+* `17/05/08` 更新 BarUtils, LogUtils 新增配置文件,TimeUtils 将 pattern 改为 format,发布 1.5.0
+* `17/05/04` 新增 签名
+* `17/05/03` 修复 对齐头部日期
+* `17/05/02` 完善 Demo 的 string 字符串变更,完善 ToastUtils 和 SnackbarUtils
+* `17/04/27` 新增 Travis CI,使用 shields,发布 1.4.1
+* `17/04/26` 完善 HandlerUtils 使用 Handler#CallBack 的回调接口及 SpannableStringUtils 图片对齐
+* `17/04/24` 修复 拼写错误,修复 StringUtils 的 equalsIgnoreCase
+* `17/04/23` 完善 README
+* `17/04/21` 完善 TimeUtils,发布 1.4.0
+* `17/04/20` 新增 SpannableStringUtils 设置字体尺寸
+* `17/03/29` 修改 README
+* `17/03/27` 更新 LogUtils
+* `17/03/26` 更新 LogUtils
+* `17/03/25` 更新 LogUtils
+* `17/03/24` 完善 StringUtils
+* `17/03/20` 修复 链接错误
+* `17/03/19` 新增 LogUtils 栈回溯
+* `17/03/14` 新增 常量包
+* `17/02/14` 完善 FragmentUtils 中,Demo 测试中
+* `17/02/13` 完善 FragmentUtils 中
+* `17/02/12` 完善 FragmentUtils 中
+* `17/02/11` 完善 FragmentUtils 中
+* `17/02/10` 完善 FragmentUtils 中,LogUtils 对长度进行分割
+* `17/02/09` 完善 FragmentUtils 中
+* `17/02/08` 完善 FragmentUtils 中
+* `17/02/07` 完善 FragmentUtils 中
+* `17/02/06` 完善 FragmentUtils 中,炸断肠
+* `17/02/05` 完善 FragmentUtils 中
+* `17/02/04` 完善 FragmentUtils 中
+* `17/02/03` 完善 FragmentUtils 中
+* `17/02/02` 完善 FragmentUtils 中
+* `17/02/01` 完善 FragmentUtils 中
+* `17/01/24` 完善 并发布版本 1.3.6
+* `17/01/16` 新增 LogUtils 打印类名函数名及所在行
+* `17/12/26` 新增 阴历相关工具类
+* `17/12/21` 完善 SpannableStringUtils
+* `16/12/19` 完善 SpannableStringUtils
+* `16/12/18` 完善 SpannableStringUtils,采用构造者模式
+* `16/12/17` 完善 SpannableStringUtils
+* `16/12/16` 完善 拼音工具类
+* `16/12/15` 完善 拼音工具类
+* `16/12/14` 新增 不低于 7.0 的 Html 解码
+* `16/12/13` 新增 获取文件最后修改时间
+* `16/12/12` 新增 Utils 来做初始化 context
+* `16/12/10` 完善 权限中
+* `16/12/09` 新增 6.0 以上权限判断
+* `16/12/07` 修复升级到 6.0 bug 中
+* `16/12/06` 完善 FlashlightUtils 中
+* `16/12/05` 完善 FlashlightUtils 兼容 Api21 之后
+* `16/12/04` 新增 FlashlightUtils
+* `16/12/03` 完善 时间工具类
+* `16/12/02` 新增 获取合适型时间差
+* `16/12/01` 新增 获取生肖和星座
+* `16/11/30` 新增 获取友好型时间差
+* `16/11/23` 完善 LocationUtils 测试,发布 1.3.4
+* `16/11/22` 修复 LocationActivity 内存泄漏
+* `16/11/21` 完善 README
+* `16/11/20` 完善 LocationUtils
+* `16/11/19` 完善 SizeUtils
+* `16/11/18` 完善 LocationUtils
+* `16/11/17` 完善 LocationUtils
+* `16/11/16` 新增 拼音工具类,单独拎出来做了整理
+* `16/11/15` 完善 正则工具类
+* `16/11/14` 新增 启动服务
+* `16/11/13` 新增 判断 sim 卡是否准备好
+* `16/11/12` 新增 重启到 recovery 和 bootloader,新增获取 launcher activity,最近一直在博客搬家,所以更得有点少
+* `16/11/04` 修复 README 的缺少 process 的 bug
+* `16/11/03` 修复 SnackbarUtils 中 Snackbar 持有弱引用来消除内存泄漏
+* `16/11/02` 修复 内存泄漏中
+* `16/11/01` 完善 发布版本 1.3.3 内存泄漏检测中
+* `16/10/31` 完善 发布版本 1.3.1 和 1.3.2
+* `16/10/30` 修复 获取 IpAddress 对于小米手机的 Bug
+* `16/10/29` 新增 文件重命名和完善 root
+* `16/10/23` 完善 测试中
+* `16/10/22` 完善 测试中
+* `16/10/21` 完善 测试中
+* `16/10/20` 完善 测试中
+* `16/10/19` 修复 判断网络是否可用
+* `16/10/18` 完善 是否前台应用,完善网络状态
+* `16/10/17` 修复 获取签名,完善是否前台应用,完善网络状态
+* `16/10/16` 新增 SnackbarUtils
+* `16/10/15` 完善 AppUtils 的 isAppForeground
+* `16/10/14` 完善 README-CN 排版(强迫症一定要对齐)
+* `16/10/13` 完善 测试
+* `16/10/12` 新增 LogUtils 建造者模式,新增获取星期,发布版本 1.3.0,cheer
+* `16/10/11` 新增 EncryptUtils 的 Hmac 系列加密
+* `16/10/10` 完善 LogUtils
+* `16/10/09` 完善 ToastUtils
+* `16/10/08` 新增 AppUtils 静默安装和静默卸载
+* `16/10/07` 完善 EmptyUtils,新增很多判空
+* `16/10/05` 完善 Happy Wedding!
+* `16/10/04` 完善 Readme
+* `16/10/03` 修复 ConvertUtils
+* `16/10/02` 完善 CrashUtils 完毕
+* `16/10/01` 完善 Happy National Day!
+* `16/09/30` 完善 CrashUtils
+* `16/09/29` 完善 CleanUtils 测试完毕
+* `16/09/28` 新增 EmptyUtils,完善 AppUtils 完毕
+* `16/09/27` 新增 CleanUtils,完善 AppUtils
+* `16/09/26` 新增 根据域名获取 ip 地址(在此感谢 jp1017),新增 ClipboardUtils 单元测试,对 ImageUtils 进行了 bug 修复
+* `16/09/25` 新增 ClipboardUtils
+* `16/09/24` 完善 AppUtils
+* `16/09/23` 完善 工具类,新增 ActivityUtils、BarUtils、IntentUtils
+* `16/09/22` 完善 LogUtils 中
+* `16/09/21` 新增 LogUtils
+* `16/09/20` 完善 昨天的单元测试
+* `16/09/19` 新增 CameraUtils,新增获取中文首字母
+* `16/09/18` 修复 少许代码,发布 1.2.1
+* `16/09/15` 完善 Happy Mid-Autumn Festival!
+* `16/09/14` 完善 ImageUtils 完毕,完善了 6.0 及以上版本安装 App 的问题,发布版本 1.2.0
+* `16/09/13` 新增 英文版 README
+* `16/09/12` 完善 ZipUtils 及单元测试完美谢幕(支持空文件夹)
+* `16/09/11` 完善 不断更
+* `16/09/10` 完善 ZipUtils 和单元测试中
+* `16/09/09` 新增 字符串反转,ImageUtils 单元测试卡住中,暂时换为真机测试
+* `16/09/08` 修复 NetworkUtils 报空,ImageUtils 单元测试卡住中
+* `16/08/31` 完善 ImageUtils 单元测试中,之后 7 天鸡儿岭放假,停更
+* `16/08/30` 完善 ImageUtils 单元测试(获取保存图片有问题,卡卡卡住了)
+* `16/08/29` 完善 ImageUtils,新增 stack 模糊算法和快速模糊
+* `16/08/28` 完善 ImageUtils
+* `16/08/27` 完善 ConvertUtils,新增 ZipUtils
+* `16/08/26` 完善 ThreadPoolUtils 线程池相关工具类
+* `16/08/25` 完善 ConstUtils 时间和存储相关常量新增枚举,传参改为枚举更为友好,新增 ThreadPoolUtils 线程池相关工具类
+* `16/08/24` 新增 ConvertUtils 的 InputStream 与 byte[]和 String 相互转换,应用在 FileUtils 中读文件
+* `16/08/23` 修复 bug,接下来完善 SDCardUtils 和 ImageUtils
+* `16/08/22` 完善 SPUtils 将 commit 改为 apply 提高效率,将 SPUtils 改为构造函数法创建,FileUtils 新增查找函数,规范 JavaDoc
+* `16/08/21` 完善 FileUtils 单元测试,修复 FileUtils 的 bug,发布版本 1.1.2
+* `16/08/20` 完善 目录、FileUtils 单元测试,发布版本 1.1.1
+* `16/08/19` 完善 FileUtils 及单元测试,及其他小修小补(在此感谢 vpop 的三次 Pr)
+* `16/08/18` 完善 FileUtils 及单元测试,完善 ImageUtils
+* `16/08/17` 完善 FileUtils
+* `16/08/16` 新增 StringUtils 及单元测试,完善正则工具类,版本更新 1.1.0
+* `16/08/15` 新增 3DES 和 AES 加密及单元检测,加密解密工具类基本完善,目录更新
+* `16/08/14` 新增 DES 加密及单元检测
+* `16/08/13` 新增 MD2,SHA224,SHA256,SHA384,SHA512 加密及单元测试,正折腾 DES 加密
+* `16/08/12` 新增 Base64 和 Html 编码解码及他们的单元测试,新增 TimeUtils 单元测试,更新 md
+* `16/08/11` 新增 SDCardUtils, UnitUtils,单元测试慢慢完善中
+* `16/08/09` 修复 目录排版,新增 Download, Proguard 和 License
+* `16/08/08` 新增 Shell 工具类,已传 jcenter 遇到好多坑,javaDoc 惹的祸,注释一定要规范
+* `16/08/07` 新增 6.0 获取 Mac 地址方法,新增对 HTML 转义,新增编码解码工具类,新增 SP 工具类
+* `16/08/06` 完善 名包名,新增加密相关的单元测试,MD5 加密新增文件加密重载
+* `16/08/05` 新增 MD5 盐加密,完善 NetworkUtils,新增判断状态栏是否存在(在此感谢 tiandawu)
+* `16/08/04` 新增 时间工具类(在此感谢 yi520000 给的补充),手机正则分简单和精确(在此感谢 MIkeeJY),新增判断是否锁屏,注释分段落,目录按首字母排序
+* `16/08/03` 修复 onCreate 中获取 view 尺寸的 bug, MD5 和 SHA 的 Bug 修复完成(在此感谢 ssyijiu)
+* `16/08/02` 修复 wifi 设置界面 bug,注释排版还在修改,获取 mac 地址增加判空,新增 QQ群:74721490,欢迎加入,新增隐藏状态栏,注释更加全面,工具类已封装,写的时候真的是一个一个测试过去的,宝宝心里苦
+* `16/08/01` 新增 获取 SD 卡路径,手机和设备进行分类,代码 bug 修改部分,小修排版,正在封装类,新增目录中显示方法名,新增获取当前 App 版本 Code
+* `16/07/31` 新增 点击屏幕空白区域隐藏软键盘,未能成功增加本页目录跳转功能(不支持)
diff --git a/LICENSE b/LICENSE
index 8dada3edaf..99d8833477 100644
--- a/LICENSE
+++ b/LICENSE
@@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
- Copyright {yyyy} {name of copyright owner}
+ Copyright 2017 Blankj
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
diff --git a/README-CN.md b/README-CN.md
index 0f8e1c90c3..5c85dca1fe 100644
--- a/README-CN.md
+++ b/README-CN.md
@@ -1,816 +1,87 @@
-![logo][logo]
-
-[![auc][aucsvg]][auc] [![api][apisvg]][api] [![build][buildsvg]][build] [![Insight][insightsvg]][insight] [![License][licensesvg]][license]
-
-## [README of English][readme.md]
-
-## API
-
-* ### Activity相关→[ActivityUtils.java][activity.java]→[Demo][activity.demo]
-```
-isActivityExists : 判断是否存在Activity
-startActivity : 打开Activity
-getLauncherActivity: 获取入口activity
-getTopActivity : 获取栈顶Activity
-```
-
-* ### App相关→[AppUtils.java][app.java]→[Demo][app.demo]
-```
-isInstallApp : 判断App是否安装
-installApp : 安装App(支持7.0)
-installAppSilent : 静默安装App
-uninstallApp : 卸载App
-uninstallAppSilent : 静默卸载App
-isAppRoot : 判断App是否有root权限
-launchApp : 打开App
-getAppPackageName : 获取App包名
-getAppDetailsSettings: 获取App具体设置
-getAppName : 获取App名称
-getAppIcon : 获取App图标
-getAppPath : 获取App路径
-getAppVersionName : 获取App版本号
-getAppVersionCode : 获取App版本码
-isSystemApp : 判断App是否是系统应用
-isAppDebug : 判断App是否是Debug版本
-getAppSignature : 获取App签名
-getAppSignatureSHA1 : 获取应用签名的的SHA1值
-isAppForeground : 判断App是否处于前台
-getForegroundApp : 获取前台应用包名
-getAppInfo : 获取App信息
-getAppsInfo : 获取所有已安装App信息
-cleanAppData : 清除App所有数据
-```
-
-* ### 栏相关→[BarUtils.java][bar.java]
-```
-setStatusBarColor : 设置状态栏颜色
-setStatusBarAlpha : 设置状态栏透明度
-setTransparentStatusBar: 设置透明状态栏(api大于19方可使用)
-hideStatusBar : 隐藏状态栏
-getStatusBarHeight : 获取状态栏高度
-isStatusBarExists : 判断状态栏是否存在
-getActionBarHeight : 获取ActionBar高度
-showNotificationBar : 显示通知栏
-hideNotificationBar : 隐藏通知栏
-```
-
-* ### 缓存相关→[CacheUtils.java][cache.java]→[Test][cache.test]
-```
-getInstance : 获取缓存实例
-put : 缓存中写入数据
-getBytes : 缓存中读取字节数组
-getString : 缓存中读取String
-getJSONObject : 缓存中读取JSONObject
-getJSONArray : 缓存中读取JSONArray
-getBitmap : 缓存中读取Bitmap
-getDrawable : 缓存中读取Drawable
-getParcelable : 缓存中读取Parcelable
-getSerializable: 缓存中读取Serializable
-getCacheSize : 获取缓存大小
-getCacheCount : 获取缓存个数
-remove : 根据键值移除缓存
-clear : 清除所有缓存
-```
-
-* ### 清除相关→[CleanUtils.java][clean.java]→[Demo][clean.demo]
-```
-cleanInternalCache : 清除内部缓存
-cleanInternalFiles : 清除内部文件
-cleanInternalDbs : 清除内部数据库
-cleanInternalDbByName: 根据名称清除数据库
-cleanInternalSP : 清除内部SP
-cleanExternalCache : 清除外部缓存
-cleanCustomCache : 清除自定义目录下的文件
-```
-
-* ### 剪贴板相关→[ClipboardUtils.java][clipboard.java]
-```
-copyText : 复制文本到剪贴板
-getText : 获取剪贴板的文本
-copyUri : 复制uri到剪贴板
-getUri : 获取剪贴板的uri
-copyIntent: 复制意图到剪贴板
-getIntent : 获取剪贴板的意图
-```
-
-* ### 关闭相关→[CloseUtils.java][close.java]
-```
-closeIO : 关闭IO
-closeIOQuietly: 安静关闭IO
-```
-
-* ### 转换相关→[ConvertUtils.java][convert.java]→[Test][convert.test]
-```
-bytes2HexString, hexString2Bytes : byteArr与hexString互转
-chars2Bytes, bytes2Chars : charArr与byteArr互转
-memorySize2Byte, byte2MemorySize : 以unit为单位的内存大小与字节数互转
-byte2FitMemorySize : 字节数转合适内存大小
-timeSpan2Millis, millis2TimeSpan : 以unit为单位的时间长度与毫秒时间戳互转
-millis2FitTimeSpan : 毫秒时间戳转合适时间长度
-bytes2Bits, bits2Bytes : bytes与bits互转
-input2OutputStream, output2InputStream : inputStream与outputStream互转
-inputStream2Bytes, bytes2InputStream : inputStream与byteArr互转
-outputStream2Bytes, bytes2OutputStream : outputStream与byteArr互转
-inputStream2String, string2InputStream : inputStream与string按编码互转
-outputStream2String, string2OutputStream: outputStream与string按编码互转
-bitmap2Bytes, bytes2Bitmap : bitmap与byteArr互转
-drawable2Bitmap, bitmap2Drawable : drawable与bitmap互转
-drawable2Bytes, bytes2Drawable : drawable与byteArr互转
-view2Bitmap : view转Bitmap
-dp2px, px2dp : dp与px互转
-sp2px, px2sp : sp与px互转
-```
-
-* ### 崩溃相关→[CrashUtils.java][crash.java]
-```
-init: 初始化
-```
-
-* ### 设备相关→[DeviceUtils.java][device.java]→[Demo][device.demo]
-```
-isDeviceRooted : 判断设备是否rooted
-getSDKVersion : 获取设备系统版本号
-getAndroidID : 获取设备AndroidID
-getMacAddress : 获取设备MAC地址
-getManufacturer : 获取设备厂商
-getModel : 获取设备型号
-shutdown : 关机
-reboot : 重启
-reboot2Recovery : 重启到recovery
-reboot2Bootloader: 重启到bootloader
-```
-
-* ### 判空相关→[EmptyUtils.java][empty.java]→[Test][empty.test]
-```
-isEmpty : 判断对象是否为空
-isNotEmpty: 判断对象是否非空
-```
-
-* ### 编码解码相关→[EncodeUtils.java][encode.java]→[Test][encode.test]
-```
-urlEncode : URL编码
-urlDecode : URL解码
-base64Encode : Base64编码
-base64Encode2String: Base64编码
-base64Decode : Base64解码
-base64UrlSafeEncode: Base64URL安全编码
-htmlEncode : Html编码
-htmlDecode : Html解码
-```
-
-* ### 加密解密相关→[EncryptUtils.java][encrypt.java]→[Test][encrypt.test]
-```
-encryptMD2, encryptMD2ToString : MD2加密
-encryptMD5, encryptMD5ToString : MD5加密
-encryptMD5File, encryptMD5File2String : MD5加密文件
-encryptSHA1, encryptSHA1ToString : SHA1加密
-encryptSHA224, encryptSHA224ToString : SHA224加密
-encryptSHA256, encryptSHA256ToString : SHA256加密
-encryptSHA384, encryptSHA384ToString : SHA384加密
-encryptSHA512, encryptSHA512ToString : SHA512加密
-encryptHmacMD5, encryptHmacMD5ToString : HmacMD5加密
-encryptHmacSHA1, encryptHmacSHA1ToString : HmacSHA1加密
-encryptHmacSHA224, encryptHmacSHA224ToString : HmacSHA224加密
-encryptHmacSHA256, encryptHmacSHA256ToString : HmacSHA256加密
-encryptHmacSHA384, encryptHmacSHA384ToString : HmacSHA384加密
-encryptHmacSHA512, encryptHmacSHA512ToString : HmacSHA512加密
-encryptDES, encryptDES2HexString, encryptDES2Base64 : DES加密
-decryptDES, decryptHexStringDES, decryptBase64DES : DES解密
-encrypt3DES, encrypt3DES2HexString, encrypt3DES2Base64: 3DES加密
-decrypt3DES, decryptHexString3DES, decryptBase64_3DES : 3DES解密
-encryptAES, encryptAES2HexString, encryptAES2Base64 : AES加密
-decryptAES, decryptHexStringAES, decryptBase64AES : AES解密
-```
-
-* ### 文件相关→[FileIOUtils.java][fileio.java]→[Test][fileio.test]
-```
-writeFileFromIS : 将输入流写入文件
-writeFileFromBytesByStream : 将字节数组写入文件
-writeFileFromBytesByChannel: 将字节数组写入文件
-writeFileFromBytesByMap : 将字节数组写入文件
-writeFileFromString : 将字符串写入文件
-readFile2List : 读取文件到字符串链表中
-readFile2String : 读取文件到字符串中
-readFile2BytesByStream : 读取文件到字节数组中
-readFile2BytesByChannel : 读取文件到字节数组中
-readFile2BytesByMap : 读取文件到字节数组中
-setBufferSize : 设置缓冲区尺寸
-```
-
-* ### 文件相关→[FileUtils.java][file.java]→[Test][file.test]
-```
-getFileByPath : 根据文件路径获取文件
-isFileExists : 判断文件是否存在
-rename : 重命名文件
-isDir : 判断是否是目录
-isFile : 判断是否是文件
-createOrExistsDir : 判断目录是否存在,不存在则判断是否创建成功
-createOrExistsFile : 判断文件是否存在,不存在则判断是否创建成功
-createFileByDeleteOldFile: 判断文件是否存在,存在则在创建之前删除
-copyDir : 复制目录
-copyFile : 复制文件
-moveDir : 移动目录
-moveFile : 移动文件
-deleteDir : 删除目录
-deleteFile : 删除文件
-listFilesInDir : 获取目录下所有文件
-listFilesInDir : 获取目录下所有文件包括子目录
-listFilesInDirWithFilter : 获取目录下所有后缀名为suffix的文件
-listFilesInDirWithFilter : 获取目录下所有后缀名为suffix的文件包括子目录
-listFilesInDirWithFilter : 获取目录下所有符合filter的文件
-listFilesInDirWithFilter : 获取目录下所有符合filter的文件包括子目录
-searchFileInDir : 获取目录下指定文件名的文件包括子目录
-getFileLastModified : 获取文件最后修改的毫秒时间戳
-getFileCharsetSimple : 简单获取文件编码格式
-getFileLines : 获取文件行数
-getDirSize : 获取目录大小
-getFileSize : 获取文件大小
-getDirLength : 获取目录长度
-getFileLength : 获取文件长度
-getFileMD5 : 获取文件的MD5校验码
-getFileMD5ToString : 获取文件的MD5校验码
-getDirName : 根据全路径获取最长目录
-getFileName : 根据全路径获取文件名
-getFileNameNoExtension : 根据全路径获取文件名不带拓展名
-getFileExtension : 根据全路径获取文件拓展名
-```
-
-* ### Fragment相关→[FragmentUtils.java][fragment.java]→[Demo][fragment.demo]
-```
-addFragment : 新增fragment
-hideAddFragment : 先隐藏后新增fragment
-addFragments : 新增多个fragment
-removeFragment : 移除fragment
-removeToFragment : 移除到指定fragment
-removeFragments : 移除同级别fragment
-removeAllFragments : 移除所有fragment
-replaceFragment : 替换fragment
-popFragment : 出栈fragment
-popToFragment : 出栈到指定fragment
-popFragments : 出栈同级别fragment
-popAllFragments : 出栈所有fragment
-popAddFragment : 先出栈后新增fragment
-hideFragment : 隐藏fragment
-hideFragments : 隐藏同级别fragment
-showFragment : 显示fragment
-hideShowFragment : 先隐藏后显示fragment
-getLastAddFragment : 获取同级别最后加入的fragment
-getLastAddFragmentInStack: 获取栈中同级别最后加入的fragment
-getTopShowFragment : 获取顶层可见fragment
-getTopShowFragmentInStack: 获取栈中顶层可见fragment
-getFragments : 获取同级别fragment
-getFragmentsInStack : 获取栈中同级别fragment
-getAllFragments : 获取所有fragment
-getAllFragmentsInStack : 获取栈中所有fragment
-getPreFragment : 获取目标fragment的前一个fragment
-findFragment : 查找fragment
-dispatchBackPress : 处理fragment回退键
-setBackgroundColor : 设置背景色
-setBackgroundResource : 设置背景资源
-setBackground : 设置背景
-```
-
-* ### 图片相关→[ImageUtils.java][image.java]→[Demo][image.demo]
-```
-bitmap2Bytes, bytes2Bitmap : bitmap与byteArr互转
-drawable2Bitmap, bitmap2Drawable: drawable与bitmap互转
-drawable2Bytes, bytes2Drawable : drawable与byteArr互转
-getBitmap : 获取bitmap
-scale : 缩放图片
-clip : 裁剪图片
-skew : 倾斜图片
-rotate : 旋转图片
-getRotateDegree : 获取图片旋转角度
-toRound : 转为圆形图片
-toRoundCorner : 转为圆角图片
-fastBlur : 快速模糊
-renderScriptBlur : renderScript模糊图片
-stackBlur : stack模糊图片
-addFrame : 添加颜色边框
-addReflection : 添加倒影
-addTextWatermark : 添加文字水印
-addImageWatermark : 添加图片水印
-toAlpha : 转为alpha位图
-toGray : 转为灰度图片
-save : 保存图片
-isImage : 根据文件名判断文件是否为图片
-getImageType : 获取图片类型
-compressByScale : 按缩放压缩
-compressByQuality : 按质量压缩
-compressBySampleSize : 按采样大小压缩
-```
-
-* ### 意图相关→[IntentUtils.java][intent.java]
-```
-getInstallAppIntent : 获取安装App(支持6.0)的意图
-getUninstallAppIntent : 获取卸载App的意图
-getLaunchAppIntent : 获取打开App的意图
-getAppDetailsSettingsIntent: 获取App具体设置的意图
-getShareTextIntent : 获取分享文本的意图
-getShareImageIntent : 获取分享图片的意图
-getComponentIntent : 获取其他应用组件的意图
-getShutdownIntent : 获取关机的意图
-getCaptureIntent : 获取拍照的意图
-```
-
-* ### 键盘相关→[KeyboardUtils.java][keyboard.java]→[Demo][keyboard.demo]
-```
-showSoftInput : 动态显示软键盘
-hideSoftInput : 动态隐藏软键盘
-toggleSoftInput : 切换键盘显示与否状态
-clickBlankArea2HideSoftInput: 点击屏幕空白区域隐藏软键盘
-```
-
-* ### 日志相关→[LogUtils.java][log.java]→[Demo][log.demo]
-```
-Builder.setLogSwitch : 设置log总开关
-Builder.setConsoleSwitch : 设置log控制台开关
-Builder.setGlobalTag : 设置log全局tag
-Builder.setLogHeadSwitch : 设置log头部信息开关
-Builder.setLog2FileSwitch: 设置log文件开关
-Builder.setDir : 设置log文件存储目录
-Builder.setBorderSwitch : 设置log边框开关
-Builder.setConsoleFilter : 设置log控制台过滤器
-Builder.setFileFilter : 设置log文件过滤器
-v : Verbose日志
-d : Debug日志
-i : Info日志
-w : Warn日志
-e : Error日志
-a : Assert日志
-file : log到文件
-json : log字符串之json
-xml : log字符串之xml
-```
-
-* ### 网络相关→[NetworkUtils.java][network.java]→[Demo][network.demo]
-```
-openWirelessSettings : 打开网络设置界面
-isConnected : 判断网络是否连接
-isAvailableByPing : 判断网络是否可用
-getDataEnabled : 判断移动数据是否打开
-setDataEnabled : 打开或关闭移动数据
-is4G : 判断网络是否是4G
-getWifiEnabled : 判断wifi是否打开
-setWifiEnabled : 打开或关闭wifi
-isWifiConnected : 判断wifi是否连接状态
-isWifiAvailable : 判断wifi数据是否可用
-getNetworkOperatorName: 获取移动网络运营商名称
-getNetworkType : 获取当前网络类型
-getIPAddress : 获取IP地址
-getDomainAddress : 获取域名ip地址
-```
-
-* ### 手机相关→[PhoneUtils.java][phone.java]→[Demo][phone.demo]
-```
-isPhone : 判断设备是否是手机
-getIMEI : 获取IMEI码
-getIMSI : 获取IMSI码
-getPhoneType : 获取移动终端类型
-isSimCardReady : 判断sim卡是否准备好
-getSimOperatorName : 获取Sim卡运营商名称
-getSimOperatorByMnc: 获取Sim卡运营商名称
-getPhoneStatus : 获取手机状态信息
-dial : 跳至拨号界面
-call : 拨打phoneNumber
-sendSms : 跳至发送短信界面
-sendSmsSilent : 发送短信
-getAllContactInfo : 获取手机联系人
-getContactNum : 打开手机联系人界面点击联系人后便获取该号码
-getAllSMS : 获取手机短信并保存到xml中
-```
-
-* ### 拼音相关→[PinyinUtils.java][pinyin.java]→[Test][pinyin.test]
-```
-ccs2Pinyin : 汉字转拼音
-ccs2Pinyin : 汉字转拼音
-getPinyinFirstLetter : 获取第一个汉字首字母
-getPinyinFirstLetters: 获取所有汉字的首字母
-getSurnamePinyin : 根据名字获取姓氏的拼音
-getSurnameFirstLetter: 根据名字获取姓氏的首字母
-```
-
-* ### 进程相关→[ProcessUtils.java][process.java]→[Demo][process.demo]
-```
-getForegroundProcessName : 获取前台线程包名
-killAllBackgroundProcesses: 杀死所有的后台服务进程
-killBackgroundProcesses : 杀死后台服务进程
-```
-
-* ### 正则相关→[RegexUtils.java][regex.java]→[Test][regex.test]
-```
-isMobileSimple : 验证手机号(简单)
-isMobileExact : 验证手机号(精确)
-isTel : 验证电话号码
-isIDCard15 : 验证身份证号码15位
-isIDCard18 : 验证身份证号码18位
-isEmail : 验证邮箱
-isURL : 验证URL
-isZh : 验证汉字
-isUsername : 验证用户名
-isDate : 验证yyyy-MM-dd格式的日期校验,已考虑平闰年
-isIP : 验证IP地址
-isMatch : 判断是否匹配正则
-getMatches : 获取正则匹配的部分
-getSplits : 获取正则匹配分组
-getReplaceFirst: 替换正则匹配的第一部分
-getReplaceAll : 替换所有正则匹配的部分
-```
-
-* ### 屏幕相关→[ScreenUtils.java][screen.java]
-```
-getScreenWidth : 获取屏幕的宽度(单位:px)
-getScreenHeight : 获取屏幕的高度(单位:px)
-setLandscape : 设置屏幕为横屏
-setPortrait : 设置屏幕为竖屏
-isLandscape : 判断是否横屏
-isPortrait : 判断是否竖屏
-getScreenRotation : 获取屏幕旋转角度
-captureWithStatusBar : 获取当前屏幕截图,包含状态栏
-captureWithoutStatusBar: 获取当前屏幕截图,不包含状态栏
-isScreenLock : 判断是否锁屏
-```
-
-* ### SD卡相关→[SDCardUtils.java][sdcard.java]→[Demo][sdcard.demo]
-```
-isSDCardEnable: 判断SD卡是否可用
-getSDCardPath : 获取SD卡路径
-getDataPath : 获取SD卡Data路径
-getFreeSpace : 计算SD卡的剩余空间
-getSDCardInfo : 获取SD卡信息
-```
-
-* ### 服务相关→[ServiceUtils.java][service.java]
-```
-getAllRunningService: 获取所有运行的服务
-startService : 启动服务
-stopService : 停止服务
-bindService : 绑定服务
-unbindService : 解绑服务
-isServiceRunning : 判断服务是否运行
-```
-
-* ### Shell相关→[ShellUtils.java][shell.java]
-```
-execCmd: 是否是在root下执行命令
-```
-
-* ### 尺寸相关→[SizeUtils.java][size.java]
-```
-dp2px, px2dp : dp与px转换
-sp2px, px2sp : sp与px转换
-applyDimension : 各种单位转换
-forceGetViewSize : 在onCreate中获取视图的尺寸
-measureView : 测量视图尺寸
-getMeasuredWidth : 获取测量视图宽度
-getMeasuredHeight: 获取测量视图高度
-```
-
-* ### Snackbar相关→[SnackbarUtils.java][snackbar.java]→[Demo][snackbar.demo]
-```
-with : 设置snackbar依赖view
-setMessage : 设置消息
-setMessageColor: 设置消息颜色
-setBgColor : 设置背景色
-setBgResource : 设置背景资源
-setDuration : 设置显示时长
-setAction : 设置行为
-setBottomMargin: 设置底边距
-show : 显示snackbar
-showSuccess : 显示预设成功的snackbar
-showWarning : 显示预设警告的snackbar
-showError : 显示预设错误的snackbar
-dismiss : 消失snackbar
-getView : 获取snackbar视图
-addView : 添加snackbar视图
-```
-
-* ### SpannableString相关→[SpanUtils.java][span.java]→[Demo][span.demo]
-```
-setFlag : 设置标识
-setForegroundColor: 设置前景色
-setBackgroundColor: 设置背景色
-setLineHeight : 设置行高
-setQuoteColor : 设置引用线的颜色
-setLeadingMargin : 设置缩进
-setBullet : 设置列表标记
-setIconMargin : 设置图标
-setFontSize : 设置字体尺寸
-setFontProportion : 设置字体比例
-setFontXProportion: 设置字体横向比例
-setStrikethrough : 设置删除线
-setUnderline : 设置下划线
-setSuperscript : 设置上标
-setSubscript : 设置下标
-setBold : 设置粗体
-setItalic : 设置斜体
-setBoldItalic : 设置粗斜体
-setFontFamily : 设置字体系列
-setTypeface : 设置字体
-setAlign : 设置对齐
-setClickSpan : 设置点击事件
-setUrl : 设置超链接
-setBlur : 设置模糊
-setShader : 设置着色器
-setShadow : 设置阴影
-setSpans : 设置样式
-append : 追加样式字符串
-appendLine : 追加一行样式字符串
-appendImage : 追加图片
-appendSpace : 追加空白
-create : 创建样式字符串
-```
-
-* ### SP相关→[SPUtils.java][sp.java]→[Test][sp.test]
-```
-getInstance: 获取SP实例
-put : SP中写入数据
-getString : SP中读取String
-getInt : SP中读取int
-getLong : SP中读取long
-getFloat : SP中读取float
-getBoolean : SP中读取boolean
-getAll : SP中获取所有键值对
-contains : SP中是否存在该key
-remove : SP中移除该key
-clear : SP中清除所有数据
-```
-
-* ### 字符串相关→[StringUtils.java][string.java]→[Test][string.test]
-```
-isEmpty : 判断字符串是否为null或长度为0
-isTrimEmpty : 判断字符串是否为null或全为空格
-isSpace : 判断字符串是否为null或全为空白字符
-equals : 判断两字符串是否相等
-equalsIgnoreCase: 判断两字符串忽略大小写是否相等
-null2Length0 : null转为长度为0的字符串
-length : 返回字符串长度
-upperFirstLetter: 首字母大写
-lowerFirstLetter: 首字母小写
-reverse : 反转字符串
-toDBC : 转化为半角字符
-toSBC : 转化为全角字符
-```
-
-* ### 线程池相关→[ThreadPoolUtils.java][thread_pool.java]
-```
-ThreadPoolUtils : ThreadPoolUtils构造函数
-execute : 在未来某个时间执行给定的命令
-execute : 在未来某个时间执行给定的命令链表
-shutDown : 待以前提交的任务执行完毕后关闭线程池
-shutDownNow : 试图停止所有正在执行的活动任务
-isShutDown : 判断线程池是否已关闭
-isTerminated : 关闭线程池后判断所有任务是否都已完成
-awaitTermination : 请求关闭、发生超时或者当前线程中断
-submit : 提交一个Callable任务用于执行
-submit : 提交一个Runnable任务用于执行
-invokeAll, invokeAny : 执行给定的任务
-schedule : 延迟执行Runnable命令
-schedule : 延迟执行Callable命令
-scheduleWithFixedRate : 延迟并循环执行命令
-scheduleWithFixedDelay: 延迟并以固定休息时间循环执行命令
-```
-
-* ### 时间相关→[TimeUtils.java][time.java]→[Test][time.test]
-```
-millis2String : 将时间戳转为时间字符串
-string2Millis : 将时间字符串转为时间戳
-string2Date : 将时间字符串转为Date类型
-date2String : 将Date类型转为时间字符串
-date2Millis : 将Date类型转为时间戳
-millis2Date : 将时间戳转为Date类型
-getTimeSpan : 获取两个时间差(单位:unit)
-getFitTimeSpan : 获取合适型两个时间差
-getNowMills : 获取当前毫秒时间戳
-getNowString : 获取当前时间字符串
-getNowDate : 获取当前Date
-getTimeSpanByNow : 获取与当前时间的差(单位:unit)
-getFitTimeSpanByNow : 获取合适型与当前时间的差
-getFriendlyTimeSpanByNow: 获取友好型与当前时间的差
-getMillis : 获取与给定时间等于时间差的时间戳
-getString : 获取与给定时间等于时间差的时间字符串
-getDate : 获取与给定时间等于时间差的Date
-getMillisByNow : 获取与当前时间等于时间差的时间戳
-getStringByNow : 获取与当前时间等于时间差的时间字符串
-getDateByNow : 获取与当前时间等于时间差的Date
-isToday : 判断是否今天
-isLeapYear : 判断是否闰年
-getChineseWeek : 获取中式星期
-getUSWeek : 获取美式式星期
-getWeekIndex : 获取星期索引
-getWeekOfMonth : 获取月份中的第几周
-getWeekOfYear : 获取年份中的第几周
-getChineseZodiac : 获取生肖
-getZodiac : 获取星座
-```
-
-* ### 吐司相关→[ToastUtils.java][toast.java]→[Demo][toast.demo]
-```
-setGravity : 设置吐司位置
-setView : 设置吐司view
-getView : 获取吐司view
-setBgColor : 设置背景颜色
-setBgResource : 设置背景资源
-setMessageColor : 设置消息颜色
-showShortSafe : 安全地显示短时吐司
-showLongSafe : 安全地显示长时吐司
-showShort : 显示短时吐司
-showLong : 显示长时吐司
-showCustomShortSafe: 安全地显示短时自定义吐司
-showCustomLongSafe : 安全地显示长时自定义吐司
-showCustomShort : 显示短时自定义吐司
-showCustomLong : 显示长时自定义吐司
-cancel : 取消吐司显示
-```
-
-* ### 压缩相关→[ZipUtils.java][zip.java]→[Test][zip.test]
-```
-zipFiles : 批量压缩文件
-zipFile : 压缩文件
-unzipFiles : 批量解压文件
-unzipFile : 解压文件
-unzipFileByKeyword: 解压带有关键字的文件
-getFilesPath : 获取压缩文件中的文件路径链表
-getComments : 获取压缩文件中的注释链表
-getEntries : 获取压缩文件中的文件对象
-```
-
-* ### 更新Log→[update_log.md][update_log.md]
-
-***
+[![logo][logo]](https://github.com/Blankj/AndroidUtilCode)
-## About
-
-* [![jianshu][jianshusvg]][jianshu] [![weibo][weibosvg]][weibo] [![Blog][blogsvg]][blog] [![QQ0Group][qq0groupsvg]][qq0group] [![QQ1Group][qq1groupsvg]][qq1group]
-
-* 做这份整理是想把它作为Android开发的小字典,当遇到一些琐碎问题时,不用再面向百度或者谷歌查询API的使用,费时费力,这里有的话,大家尽管撸走;同时也希望它能逐日壮大起来,期待大家的Star和完善,当然我也会一直更新发布版本和日志,为了方便大家导入,现已上传jcenter;其中很多代码也是汇四方之精华,谢谢前辈们的提供,当然最终还是要通过单元测试的,如有错误,请及时告之。
-
-
-## Download
-
-Gradle:
-``` groovy
-compile 'com.blankj:utilcode:1.7.1'
-```
-
-
-## How to use
-
-```
-// init it in the function of onCreate in ur Application
-Utils.init(context);
-```
-
-
-## Proguard
+[![frame][frame]](https://github.com/Blankj/AucFrameTemplate)
-```
--keep class com.blankj.utilcode.** { *; }
--keepclassmembers class com.blankj.utilcode.** { *; }
--dontwarn com.blankj.utilcode.**
-```
+[![auc][aucSvg]][auc] [![result][apiSvg]][result] [![build][buildSvg]][build] [![License][licenseSvg]][license]
+## [README of English][readme]
-[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png
-
-[aucsvg]: https://img.shields.io/badge/AndroidUtilCode-v1.7.1-brightgreen.svg
-[auc]: https://github.com/Blankj/AndroidUtilCode
-
-[apisvg]: https://img.shields.io/badge/API-15+-brightgreen.svg
-[api]: https://android-arsenal.com/api?level=15
-
-[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
-
-[jianshusvg]: https://img.shields.io/badge/简书-Blankj-34a48e.svg
-[jianshu]: http://www.jianshu.com/u/46702d5c6978
-
-[weibosvg]: https://img.shields.io/badge/weibo-__Blankj-34a48e.svg
-[weibo]: http://weibo.com/3076228982
-
-[blogsvg]: https://img.shields.io/badge/Blog-Blankj-34a48e.svg
-[blog]: http://blankj.com
-
-[qq0groupsvg]: https://img.shields.io/badge/QQ0群(满)-74721490-ff73a3.svg
-[qq0group]: https://shang.qq.com/wpa/qunwpa?idkey=62baf2c3ec6b0863155b0c7a10c71bba2608cb0b6532fc18515835e54c69bdd3
-
-[qq1groupsvg]: https://img.shields.io/badge/QQ1群-25206533-ff73a3.svg
-[qq1group]: https://shang.qq.com/wpa/qunwpa?idkey=d906789f84484465e2736f7b524366b4c23afeda38733d5c7b10fc3f6e406e9b
-
-[readme.md]: https://github.com/Blankj/AndroidUtilCode
-[readme-cn.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md
-
-[activity.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
-[activity.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ActivityActivity.java
-
-[app.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java
-[app.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/AppActivity.java
-
-[bar.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
-
-[cache.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CacheUtils.java
-[cache.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/CacheUtilsTest.java
+## About
-[clean.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CleanUtils.java
-[clean.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/CleanActivity.java
+**[AndroidUtilCode][readme]** :fire: 是一个强大易用的安卓工具类库,它合理地封装了安卓开发中常用的函数,具有完善的 Demo 和单元测试,利用其封装好的 APIs 可以大大提高开发效率,如今它主要包括两部分模块,其一是主工具类模块:**[utilcode][utilcode-cn]**,其中的工具类是开发中常用到的;其二是子工具类模块:**[subutil][subutil-cn]**,它包含的工具类并不是很常用,它的出现是为了防止主工具类的臃肿。 :fire:
-[clipboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ClipboardUtils.java
-[close.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CloseUtils.java
+## Documentation
-[convert.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ConvertUtils.java
-[convert.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/ConvertUtilsTest.java
+### utilcode
-[crash.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java
+* [README of English][utilcode]
+* [README of Chinese][utilcode-cn]
-[device.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
-[device.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/DeviceActivity.java
-[empty.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EmptyUtils.java
-[empty.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EmptyUtilsTest.java
+### subutil
-[encode.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EncodeUtils.java
-[encode.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EncodeUtilsTest.java
+* [README of English][subutil]
+* [README of Chinese][subutil-cn]
-[encrypt.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java
-[encrypt.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EncryptUtilsTest.java
-[fileio.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/FileIOUtils.java
-[fileio.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/FileIOUtilsTest.java
+## Donations
-[file.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/FileUtils.java
-[file.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/FileUtilsTest.java
+如果它对你帮助很大,并且你很想支持库的后续开发和维护,那么你可以扫下方二维码随意打赏我,就当是请我喝杯咖啡或是啤酒,我将不胜感激 :-)
-[fragment.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
-[fragment.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/FragmentActivity.java
+![donate][donate]
-[image.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java
-[image.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ImageActivity.java
-[intent.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/IntentUtils.java
+## Contact
-[keyboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
-[keyboard.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/KeyboardActivity.java
+[![Blog][blogSvg]][blog] [![jianshu][jianshuSvg]][jianshu] [![weibo][weiboSvg]][weibo] [![QQGroup][qqgroupSvg]][qqgroup]
-[log.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/LogUtils.java
-[log.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/LogActivity.java
-[network.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
-[network.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/NetworkActivity.java
+## [Change Log][changeLog.md]
-[phone.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
-[phone.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/PhoneActivity.java
-[pinyin.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/PinyinUtils.java
-[pinyin.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/PinyinUtilsTest.java
+## 打个小广告
-[process.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
-[process.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ProcessActivity.java
+欢迎加入我的小专栏「**[基你太美](https://xiaozhuanlan.com/Blankj)**」一起学习。
-[regex.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/RegexUtils.java
-[regex.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/RegexUtilsTest.java
-[screen.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
+[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png
-[sdcard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SDCardUtils.java
-[sdcard.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SDCardActivity.java
+[frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame_cn.png
-[service.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ServiceUtils.java
+[aucSvg]: https://github.com/Blankj/AndroidUtilCode/workflows/Android%20CI/badge.svg?branch=master
+[auc]: https://github.com/Blankj/AndroidUtilCode
-[shell.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ShellUtils.java
+[apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
+[result]: https://android-arsenal.com/result?level=14
-[size.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SizeUtils.java
+[buildSvg]: https://travis-ci.org/Blankj/AndroidUtilCode.svg?branch=master
+[build]: https://travis-ci.org/Blankj/AndroidUtilCode
-[snackbar.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
-[snackbar.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SnackbarActivity.java
+[licenseSvg]: https://img.shields.io/badge/License-Apache--2.0-brightgreen.svg
+[license]: https://github.com/Blankj/AndroidUtilCode/blob/master/LICENSE
-[span.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SpanUtils.java
-[span.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SpanActivity.java
+[readme]: https://github.com/Blankj/AndroidUtilCode
+[readme-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md
-[sp.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SPUtils.java
-[sp.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/SPUtilsTest.java
+[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
-[string.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/StringUtils.java
-[string.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/StringUtilsTest.java
+[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
-[thread_pool.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ThreadPoolUtils.java
+[changeLog.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/CHANGELOG.md
-[time.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/TimeUtils.java
-[time.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java
+[donate]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/donate.png
-[toast.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ToastUtils.java
-[toast.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ToastActivity.java
+[blogSvg]: https://img.shields.io/badge/Blog-@Blankj-34a48e.svg
+[blog]: http://blankj.com
-[zip.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ZipUtils.java
-[zip.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/ZipUtilsTest.java
+[jianshuSvg]: https://img.shields.io/badge/简书-@Blankj-34a48e.svg
+[jianshu]: http://www.jianshu.com/u/46702d5c6978
-[update_log.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/update_log.md
+[weiboSvg]: https://img.shields.io/badge/weibo-@__Blankj-34a48e.svg
+[weibo]: http://weibo.com/3076228982
-[group]: http://www.jianshu.com/p/8938015df951
-[weibo]: http://weibo.com/blankcmj
+[qqgroupSvg]: https://img.shields.io/badge/QQ群-25206533-34a48e.svg
+[qqgroup]: https://shang.qq.com/wpa/qunwpa?idkey=d906789f84484465e2736f7b524366b4c23afeda38733d5c7b10fc3f6e406e9b
diff --git a/README.md b/README.md
index 2b929f89e4..9ae668e26e 100644
--- a/README.md
+++ b/README.md
@@ -1,816 +1,87 @@
-![logo][logo]
-
-[![auc][aucsvg]][auc] [![api][apisvg]][api] [![build][buildsvg]][build] [![Insight][insightsvg]][insight] [![License][licensesvg]][license]
-
-## [README of Chinese][readme-cn.md]
-
-## API
-
-* ### About Activity→[ActivityUtils.java][activity.java]→[Demo][activity.demo]
-```
-isActivityExists
-startActivity
-getLauncherActivity
-getTopActivity
-```
-
-* ### About App→[AppUtils.java][app.java]→[Demo][app.demo]
-```
-isInstallApp
-installApp
-installAppSilent
-uninstallApp
-uninstallAppSilent
-isAppRoot
-launchApp
-getAppPackageName
-getAppDetailsSettings
-getAppName
-getAppIcon
-getAppPath
-getAppVersionName
-getAppVersionCode
-isSystemApp
-isAppDebug
-getAppSignature
-getAppSignatureSHA1
-isAppForeground
-getForegroundApp
-getAppInfo
-getAppsInfo
-cleanAppData
-```
-
-* ### About Bar→[BarUtils.java][bar.java]
-```
-setStatusBarColor
-setStatusBarAlpha
-setTransparentStatusBar
-hideStatusBar
-getStatusBarHeight
-isStatusBarExists
-getActionBarHeight
-showNotificationBar
-hideNotificationBar
-```
-
-* ### About Cache→[CacheUtils.java][cache.java]→[Test][cache.test]
-```
-getInstance
-put
-getBytes
-getString
-getJSONObject
-getJSONArray
-getBitmap
-getDrawable
-getParcelable
-getSerializable
-getCacheSize
-getCacheCount
-remove
-clear
-```
-
-* ### About Clean→[CleanUtils.java][clean.java]→[Demo][clean.demo]
-```
-cleanInternalCache
-cleanInternalFiles
-cleanInternalDbs
-cleanInternalDbByName
-cleanInternalSP
-cleanExternalCache
-cleanCustomCache
-```
-
-* ### About Clipboard→[ClipboardUtils.java][clipboard.java]
-```
-copyText
-getText
-copyUri
-getUri
-copyIntent
-getIntent
-```
-
-* ### About Close→[CloseUtils.java][close.java]
-```
-closeIO
-closeIOQuietly
-```
-
-* ### About Convert→[ConvertUtils.java][convert.java]→[Test][convert.test]
-```
-bytes2HexString, hexString2Bytes
-chars2Bytes, bytes2Chars
-memorySize2Byte, byte2MemorySize
-byte2FitMemorySize
-timeSpan2Millis, millis2TimeSpan
-millis2FitTimeSpan
-bytes2Bits, bits2Bytes
-input2OutputStream, output2InputStream
-inputStream2Bytes, bytes2InputStream
-outputStream2Bytes, bytes2OutputStream
-inputStream2String, string2InputStream
-outputStream2String, string2OutputStream
-bitmap2Bytes, bytes2Bitmap
-drawable2Bitmap, bitmap2Drawable
-drawable2Bytes, bytes2Drawable
-view2Bitmap
-dp2px, px2dp
-sp2px, px2sp
-```
-
-* ### About Crash→[CrashUtils.java][crash.java]
-```
-init
-```
-
-* ### About Device→[DeviceUtils.java][device.java]→[Demo][device.demo]
-```
-isDeviceRooted
-getSDKVersion
-getAndroidID
-getMacAddress
-getManufacturer
-getModel
-shutdown
-reboot
-reboot2Recovery
-reboot2Bootloader
-```
-
-* ### About Empty→[EmptyUtils.java][empty.java]→[Test][empty.test]
-```
-isEmpty
-isNotEmpty
-```
-
-* ### About Encode→[EncodeUtils.java][encode.java]→[Test][encode.test]
-```
-urlEncode
-urlDecode
-base64Encode
-base64Encode2String
-base64Decode
-base64UrlSafeEncode
-htmlEncode
-htmlDecode
-```
-
-* ### About Encrypt→[EncryptUtils.java][encrypt.java]→[Test][encrypt.test]
-```
-encryptMD2, encryptMD2ToString
-encryptMD5, encryptMD5ToString
-encryptMD5File, encryptMD5File2String
-encryptSHA1, encryptSHA1ToString
-encryptSHA224, encryptSHA224ToString
-encryptSHA256, encryptSHA256ToString
-encryptSHA384, encryptSHA384ToString
-encryptSHA512, encryptSHA512ToString
-encryptHmacMD5, encryptHmacMD5ToString
-encryptHmacSHA1, encryptHmacSHA1ToString
-encryptHmacSHA224, encryptHmacSHA224ToString
-encryptHmacSHA256, encryptHmacSHA256ToString
-encryptHmacSHA384, encryptHmacSHA384ToString
-encryptHmacSHA512, encryptHmacSHA512ToString
-encryptDES, encryptDES2HexString, encryptDES2Base64
-decryptDES, decryptHexStringDES, decryptBase64DES
-encrypt3DES, encrypt3DES2HexString, encrypt3DES2Base64
-decrypt3DES, decryptHexString3DES, decryptBase64_3DES
-encryptAES, encryptAES2HexString, encryptAES2Base64
-decryptAES, decryptHexStringAES, decryptBase64AES
-```
-
-* ### About FileIO→[FileIOUtils.java][fileio.java]→[Test][fileio.test]
-```
-writeFileFromIS
-writeFileFromBytesByStream
-writeFileFromBytesByChannel
-writeFileFromBytesByMap
-writeFileFromString
-readFile2List
-readFile2String
-readFile2BytesByStream
-readFile2BytesByChannel
-readFile2BytesByMap
-setBufferSize
-```
-
-* ### About File→[FileUtils.java][file.java]→[Test][file.test]
-```
-getFileByPath
-isFileExists
-rename
-isDir
-isFile
-createOrExistsDir
-createOrExistsFile
-createFileByDeleteOldFile
-copyDir
-copyFile
-moveDir
-moveFile
-deleteDir
-deleteFile
-listFilesInDir
-listFilesInDir
-listFilesInDirWithFilter
-listFilesInDirWithFilter
-listFilesInDirWithFilter
-listFilesInDirWithFilter
-searchFileInDir
-getFileLastModified
-getFileCharsetSimple
-getFileLines
-getDirSize
-getFileSize
-getDirLength
-getFileLength
-getFileMD5
-getFileMD5ToString
-getDirName
-getFileName
-getFileNameNoExtension
-getFileExtension
-```
-
-* ### About Fragment→[FragmentUtils.java][fragment.java]→[Demo][fragment.demo]
-```
-addFragment
-hideAddFragment
-addFragments
-removeFragment
-removeToFragment
-removeFragments
-removeAllFragments
-replaceFragment
-popFragment
-popToFragment
-popFragments
-popAllFragments
-popAddFragment
-hideFragment
-hideFragments
-showFragment
-hideShowFragment
-getLastAddFragment
-getLastAddFragmentInStack
-getTopShowFragment
-getTopShowFragmentInStack
-getFragments
-getFragmentsInStack
-getAllFragments
-getAllFragmentsInStack
-getPreFragment
-findFragment
-dispatchBackPress
-setBackgroundColor
-setBackgroundResource
-setBackground
-```
-
-* ### About Image→[ImageUtils.java][image.java]→[Demo][image.demo]
-```
-bitmap2Bytes, bytes2Bitmap
-drawable2Bitmap, bitmap2Drawable
-drawable2Bytes, bytes2Drawable
-getBitmap
-scale
-clip
-skew
-rotate
-getRotateDegree
-toRound
-toRoundCorner
-fastBlur
-renderScriptBlur
-stackBlur
-addFrame
-addReflection
-addTextWatermark
-addImageWatermark
-toAlpha
-toGray
-save
-isImage
-getImageType
-compressByScale
-compressByQuality
-compressBySampleSize
-```
-
-* ### About Intent→[IntentUtils.java][intent.java]
-```
-getInstallAppIntent
-getUninstallAppIntent
-getLaunchAppIntent
-getAppDetailsSettingsIntent
-getShareTextIntent
-getShareImageIntent
-getComponentIntent
-getShutdownIntent
-getCaptureIntent
-```
-
-* ### About Keyboard→[KeyboardUtils.java][keyboard.java]→[Demo][keyboard.demo]
-```
-showSoftInput
-hideSoftInput
-toggleSoftInput
-clickBlankArea2HideSoftInput
-```
-
-* ### About Log→[LogUtils.java][log.java]→[Demo][log.demo]
-```
-Builder.setLogSwitch
-Builder.setConsoleSwitch
-Builder.setGlobalTag
-Builder.setLogHeadSwitch
-Builder.setLog2FileSwitch
-Builder.setDir
-Builder.setBorderSwitch
-Builder.setConsoleFilter
-Builder.setFileFilter
-v
-d
-i
-w
-e
-a
-file
-json
-xml
-```
-
-* ### About Network→[NetworkUtils.java][network.java]→[Demo][network.demo]
-```
-openWirelessSettings
-isConnected
-isAvailableByPing
-getDataEnabled
-setDataEnabled
-is4G
-getWifiEnabled
-setWifiEnabled
-isWifiConnected
-isWifiAvailable
-getNetworkOperatorName
-getNetworkType
-getIPAddress
-getDomainAddress
-```
-
-* ### About Phone→[PhoneUtils.java][phone.java]→[Demo][phone.demo]
-```
-isPhone
-getIMEI
-getIMSI
-getPhoneType
-isSimCardReady
-getSimOperatorName
-getSimOperatorByMnc
-getPhoneStatus
-dial
-call
-sendSms
-sendSmsSilent
-getAllContactInfo
-getContactNum
-getAllSMS
-```
-
-* ### About Pinyin→[PinyinUtils.java][pinyin.java]→[Test][pinyin.test]
-```
-ccs2Pinyin
-ccs2Pinyin
-getPinyinFirstLetter
-getPinyinFirstLetters
-getSurnamePinyin
-getSurnameFirstLetter
-```
-
-* ### About Process→[ProcessUtils.java][process.java]→[Demo][process.demo]
-```
-getForegroundProcessName
-killAllBackgroundProcesses
-killBackgroundProcesses
-```
-
-* ### About Regex→[RegexUtils.java][regex.java]→[Test][regex.test]
-```
-isMobileSimple
-isMobileExact
-isTel
-isIDCard15
-isIDCard18
-isEmail
-isURL
-isZh
-isUsername
-isDate
-isIP
-isMatch
-getMatches
-getSplits
-getReplaceFirst
-getReplaceAll
-```
-
-* ### About Screen→[ScreenUtils.java][screen.java]
-```
-getScreenWidth
-getScreenHeight
-setLandscape
-setPortrait
-isLandscape
-isPortrait
-getScreenRotation
-captureWithStatusBar
-captureWithoutStatusBar
-isScreenLock
-```
-
-* ### About SDCard→[SDCardUtils.java][sdcard.java]→[Demo][sdcard.demo]
-```
-isSDCardEnable
-getSDCardPath
-getDataPath
-getFreeSpace
-getSDCardInfo
-```
-
-* ### About Service→[ServiceUtils.java][service.java]
-```
-getAllRunningService
-startService
-stopService
-bindService
-unbindService
-isServiceRunning
-```
-
-* ### About Shell→[ShellUtils.java][shell.java]
-```
-execCmd
-```
-
-* ### About Size→[SizeUtils.java][size.java]
-```
-dp2px, px2dp
-sp2px, px2sp
-applyDimension
-forceGetViewSize
-measureView
-getMeasuredWidth
-getMeasuredHeight
-```
-
-* ### About Snackbar→[SnackbarUtils.java][snackbar.java]→[Demo][snackbar.demo]
-```
-with
-setMessage
-setMessageColor
-setBgColor
-setBgResource
-setDuration
-setAction
-setBottomMargin
-show
-showSuccess
-showWarning
-showError
-dismiss
-getView
-addView
-```
-
-* ### About Span→[SpanUtils.java][span.java]→[Demo][span.demo]
-```
-setFlag
-setForegroundColor
-setBackgroundColor
-setLineHeight
-setQuoteColor
-setLeadingMargin
-setBullet
-setIconMargin
-setFontSize
-setFontProportion
-setFontXProportion
-setStrikethrough
-setUnderline
-setSuperscript
-setSubscript
-setBold
-setItalic
-setBoldItalic
-setFontFamily
-setTypeface
-setAlign
-setClickSpan
-setUrl
-setBlur
-setShader
-setShadow
-setSpans
-append
-appendLine
-appendImage
-appendSpace
-create
-```
-
-* ### About SP→[SPUtils.java][sp.java]→[Test][sp.test]
-```
-getInstance
-put
-getString
-getInt
-getLong
-getFloat
-getBoolean
-getAll
-contains
-remove
-clear
-```
-
-* ### About String→[StringUtils.java][string.java]→[Test][string.test]
-```
-isEmpty
-isTrimEmpty
-isSpace
-equals
-equalsIgnoreCase
-null2Length0
-length
-upperFirstLetter
-lowerFirstLetter
-reverse
-toDBC
-toSBC
-```
-
-* ### About ThreadPool→[ThreadPoolUtils.java][thread_pool.java]
-```
-ThreadPoolUtils
-execute
-execute
-shutDown
-shutDownNow
-isShutDown
-isTerminated
-awaitTermination
-submit
-submit
-invokeAll, invokeAny
-schedule
-schedule
-scheduleWithFixedRate
-scheduleWithFixedDelay
-```
-
-* ### About Time→[TimeUtils.java][time.java]→[Test][time.test]
-```
-millis2String
-string2Millis
-string2Date
-date2String
-date2Millis
-millis2Date
-getTimeSpan
-getFitTimeSpan
-getNowMills
-getNowString
-getNowDate
-getTimeSpanByNow
-getFitTimeSpanByNow
-getFriendlyTimeSpanByNow
-getMillis
-getString
-getDate
-getMillisByNow
-getStringByNow
-getDateByNow
-isToday
-isLeapYear
-getChineseWeek
-getUSWeek
-getWeekIndex
-getWeekOfMonth
-getWeekOfYear
-getChineseZodiac
-getZodiac
-```
-
-* ### About Toast→[ToastUtils.java][toast.java]→[Demo][toast.demo]
-```
-setGravity
-setView
-getView
-setBgColor
-setBgResource
-setMessageColor
-showShortSafe
-showLongSafe
-showShort
-showLong
-showCustomShortSafe
-showCustomLongSafe
-showCustomShort
-showCustomLong
-cancel
-```
-
-* ### About Zip→[ZipUtils.java][zip.java]→[Test][zip.test]
-```
-zipFiles
-zipFile
-unzipFiles
-unzipFile
-unzipFileByKeyword
-getFilesPath
-getComments
-getEntries
-```
-
-* ### About Log→[update_log.md][update_log.md]
-
-***
+[![logo][logo]](https://github.com/Blankj/AndroidUtilCode)
-## About
-
-* [![jianshu][jianshusvg]][jianshu] [![weibo][weibosvg]][weibo] [![Blog][blogsvg]][blog] [![QQ0Group][qq0groupsvg]][qq0group] [![QQ1Group][qq1groupsvg]][qq1group]
-
-* **I'm so sorry for that the code is annotated with Chinese.**
-
-
-## Download
-
-Gradle:
-``` groovy
-compile 'com.blankj:utilcode:1.7.1'
-```
-
-
-## How to use
-
-```
-// init it in the function of onCreate in ur Application
-Utils.init(context);
-```
-
-
-## Proguard
+[![frame][frame]](https://github.com/Blankj/AucFrameTemplate)
-```
--keep class com.blankj.utilcode.** { *; }
--keepclassmembers class com.blankj.utilcode.** { *; }
--dontwarn com.blankj.utilcode.**
-```
+[![auc][aucSvg]][auc] [![result][apiSvg]][result] [![build][buildSvg]][build] [![License][licenseSvg]][license]
+## [README of Chinese][readme-cn]
-[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png
-
-[aucsvg]: https://img.shields.io/badge/AndroidUtilCode-v1.7.1-brightgreen.svg
-[auc]: https://github.com/Blankj/AndroidUtilCode
-
-[apisvg]: https://img.shields.io/badge/API-15+-brightgreen.svg
-[api]: https://android-arsenal.com/api?level=15
-
-[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
-
-[jianshusvg]: https://img.shields.io/badge/简书-Blankj-34a48e.svg
-[jianshu]: http://www.jianshu.com/u/46702d5c6978
-
-[weibosvg]: https://img.shields.io/badge/weibo-__Blankj-34a48e.svg
-[weibo]: http://weibo.com/3076228982
-
-[blogsvg]: https://img.shields.io/badge/Blog-Blankj-34a48e.svg
-[blog]: http://blankj.com
-
-[qq0groupsvg]: https://img.shields.io/badge/QQ0群(满)-74721490-ff73a3.svg
-[qq0group]: https://shang.qq.com/wpa/qunwpa?idkey=62baf2c3ec6b0863155b0c7a10c71bba2608cb0b6532fc18515835e54c69bdd3
-
-[qq1groupsvg]: https://img.shields.io/badge/QQ1群-25206533-ff73a3.svg
-[qq1group]: https://shang.qq.com/wpa/qunwpa?idkey=d906789f84484465e2736f7b524366b4c23afeda38733d5c7b10fc3f6e406e9b
-
-[readme.md]: https://github.com/Blankj/AndroidUtilCode
-[readme-cn.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md
-
-[activity.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
-[activity.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ActivityActivity.java
-
-[app.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java
-[app.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/AppActivity.java
-
-[bar.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
-
-[cache.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CacheUtils.java
-[cache.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/CacheUtilsTest.java
+## About
-[clean.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CleanUtils.java
-[clean.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/CleanActivity.java
+**[AndroidUtilCode][readme]** :fire: is a powerful & easy to use library for Android. This library encapsulates the functions that commonly used in Android development which have complete demo and unit test. By using it's encapsulated APIs, you can greatly improve the development efficiency. The program mainly consists of two modules which is **[utilcode][utilcode-cn]**, which is commonly used in development, and **[subutil][subutil-cn]** which is rarely used in development, but the utils can be beneficial to simplify the main module. :fire:
-[clipboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ClipboardUtils.java
-[close.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CloseUtils.java
+## Documentation
-[convert.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ConvertUtils.java
-[convert.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/ConvertUtilsTest.java
+### utilcode
-[crash.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java
+* [README of English][utilcode]
+* [README of Chinese][utilcode-cn]
-[device.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
-[device.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/DeviceActivity.java
-[empty.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EmptyUtils.java
-[empty.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EmptyUtilsTest.java
+### subutil
-[encode.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EncodeUtils.java
-[encode.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EncodeUtilsTest.java
+* [README of English][subutil]
+* [README of Chinese][subutil-cn]
-[encrypt.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java
-[encrypt.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EncryptUtilsTest.java
-[fileio.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/FileIOUtils.java
-[fileio.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/FileIOUtilsTest.java
+## Donations
-[file.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/FileUtils.java
-[file.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/FileUtilsTest.java
+If this project helps you a lot and you want to support the project's development and maintenance of this project, feel free to scan the following QR code for donation. Your donation is highly appreciated. Thank you!
-[fragment.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
-[fragment.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/FragmentActivity.java
+![donate][donate]
-[image.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java
-[image.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ImageActivity.java
-[intent.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/IntentUtils.java
+## Contact
-[keyboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
-[keyboard.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/KeyboardActivity.java
+[![Blog][blogSvg]][blog] [![jianshu][jianshuSvg]][jianshu] [![weibo][weiboSvg]][weibo] [![QQGroup][qqgroupSvg]][qqgroup]
-[log.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/LogUtils.java
-[log.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/LogActivity.java
-[network.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
-[network.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/NetworkActivity.java
+## [Change Log][changeLog.md]
-[phone.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
-[phone.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/PhoneActivity.java
-[pinyin.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/PinyinUtils.java
-[pinyin.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/PinyinUtilsTest.java
+## 打个小广告
-[process.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
-[process.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ProcessActivity.java
+欢迎加入我的小专栏「**[基你太美](https://xiaozhuanlan.com/Blankj)**」一起学习。
-[regex.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/RegexUtils.java
-[regex.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/RegexUtilsTest.java
-[screen.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
+[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png
-[sdcard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SDCardUtils.java
-[sdcard.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SDCardActivity.java
+[frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png
-[service.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ServiceUtils.java
+[aucSvg]: https://github.com/Blankj/AndroidUtilCode/workflows/Android%20CI/badge.svg?branch=master
+[auc]: https://github.com/Blankj/AndroidUtilCode
-[shell.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ShellUtils.java
+[apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
+[result]: https://android-arsenal.com/result?level=14
-[size.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SizeUtils.java
+[buildSvg]: https://travis-ci.org/Blankj/AndroidUtilCode.svg?branch=master
+[build]: https://travis-ci.org/Blankj/AndroidUtilCode
-[snackbar.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
-[snackbar.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SnackbarActivity.java
+[licenseSvg]: https://img.shields.io/badge/License-Apache--2.0-brightgreen.svg
+[license]: https://github.com/Blankj/AndroidUtilCode/blob/master/LICENSE
-[span.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SpanUtils.java
-[span.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SpanActivity.java
+[readme]: https://github.com/Blankj/AndroidUtilCode
+[readme-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md
-[sp.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SPUtils.java
-[sp.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/SPUtilsTest.java
+[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
-[string.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/StringUtils.java
-[string.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/StringUtilsTest.java
+[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
-[thread_pool.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ThreadPoolUtils.java
+[changeLog.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/CHANGELOG.md
-[time.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/TimeUtils.java
-[time.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java
+[donate]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/donate.png
-[toast.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ToastUtils.java
-[toast.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ToastActivity.java
+[blogSvg]: https://img.shields.io/badge/Blog-@Blankj-34a48e.svg
+[blog]: http://blankj.com
-[zip.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ZipUtils.java
-[zip.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/ZipUtilsTest.java
+[jianshuSvg]: https://img.shields.io/badge/简书-@Blankj-34a48e.svg
+[jianshu]: http://www.jianshu.com/u/46702d5c6978
-[update_log.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/update_log.md
+[weiboSvg]: https://img.shields.io/badge/weibo-@__Blankj-34a48e.svg
+[weibo]: http://weibo.com/3076228982
-[group]: http://www.jianshu.com/p/8938015df951
-[weibo]: http://weibo.com/blankcmj
+[qqgroupSvg]: https://img.shields.io/badge/QQ群-25206533-34a48e.svg
+[qqgroup]: https://shang.qq.com/wpa/qunwpa?idkey=d906789f84484465e2736f7b524366b4c23afeda38733d5c7b10fc3f6e406e9b
diff --git a/_config.yml b/_config.yml
deleted file mode 100644
index c4192631f2..0000000000
--- a/_config.yml
+++ /dev/null
@@ -1 +0,0 @@
-theme: jekyll-theme-cayman
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
deleted file mode 100644
index e7fd472b6a..0000000000
--- a/app/build.gradle
+++ /dev/null
@@ -1,69 +0,0 @@
-apply plugin: 'com.android.application'
-
-File signPropertiesFile = rootProject.file('sign/keystore.properties')
-
-android {
- compileSdkVersion 25
- buildToolsVersion "25.0.3"
-
- defaultConfig {
- applicationId "com.blankj.androidutilcode"
- minSdkVersion 14
- targetSdkVersion 25
- versionCode 41
- versionName "1.7.1"
- }
-
- if (signPropertiesFile.exists()) {
- Properties properties = new Properties()
- properties.load(new FileInputStream(signPropertiesFile))
- signingConfigs {
- release {
- storeFile rootProject.file(properties['keystore'])
- storePassword properties['storePassword']
- keyAlias properties['keyAlias']
- keyPassword properties['keyPassword']
- }
- }
- }
-
- buildTypes {
- debug {
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- release {
- minifyEnabled true
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- if (signPropertiesFile.exists()) {
- signingConfig signingConfigs.release
- }
- }
- }
-
- lintOptions {
- abortOnError false
- }
-}
-
-dependencies {
- compile fileTree(include: ['*.jar'], dir: 'libs')
- final SUPPORT_VERSION = '25.3.1'
- final LEAKCANARY_VERSION = '1.5';
-
- def leakCanary = "com.squareup.leakcanary:leakcanary-android-no-op:$LEAKCANARY_VERSION"
-
- compile project(':utilcode')
- compile project(':subutil')
- compile "com.android.support:appcompat-v7:$SUPPORT_VERSION"
- compile "com.android.support:support-v4:$SUPPORT_VERSION"
- compile "com.android.support:design:$SUPPORT_VERSION"
-
- compile 'com.r0adkll:slidableactivity:2.0.5'
-
- // LeakCanary
- debugCompile "com.squareup.leakcanary:leakcanary-android:$LEAKCANARY_VERSION"
- releaseCompile leakCanary
- testCompile leakCanary
-}
-
-
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
deleted file mode 100644
index 8937028cb6..0000000000
--- a/app/proguard-rules.pro
+++ /dev/null
@@ -1,18 +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 *;
-#}
-
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
deleted file mode 100644
index 0d0d3797d0..0000000000
--- a/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
- * author: Blankj - * blog : http://blankj.com - * time : 2017/05/10 - * desc : - *- */ -public class Config { - public static final String PKG = "com.blankj.androidutilcode"; - public static final String TEST_PKG = "com.blankj.testinstall"; - private static String testApkPath; - - public static String getTestApkPath() { - if (testApkPath == null) - testApkPath = Utils.getContext().getCacheDir().getAbsolutePath() + File.separatorChar + "apk" + File.separatorChar + "test_install.apk"; - return testApkPath; - } -} \ No newline at end of file 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 fd529c0164..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/UtilsApp.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.blankj.androidutilcode; - -import com.blankj.androidutilcode.base.BaseApplication; -import com.blankj.utilcode.util.CrashUtils; -import com.blankj.utilcode.util.FileIOUtils; -import com.blankj.utilcode.util.FileUtils; -import com.blankj.utilcode.util.LogUtils; -import com.blankj.utilcode.util.Utils; -import com.squareup.leakcanary.LeakCanary; - -import java.io.IOException; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2016/10/12 - * desc : 工具类测试App - *- */ -public class UtilsApp extends BaseApplication { - - @Override - public void onCreate() { - super.onCreate(); - // 内存泄露检查工具 - 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); - Utils.init(this); - initLog(); - initCrash(); - initAssets(); - } - - public static void initLog() { - LogUtils.Builder builder = new LogUtils.Builder() - .setLogSwitch(BuildConfig.DEBUG)// 设置log总开关,包括输出到控制台和文件,默认开 - .setConsoleSwitch(BuildConfig.DEBUG)// 设置是否输出到控制台开关,默认开 - .setGlobalTag(null)// 设置log全局标签,默认为空 - // 当全局标签不为空时,我们输出的log全部为该tag, - // 为空时,如果传入的tag为空那就显示类名,否则显示tag - .setLogHeadSwitch(true)// 设置log头信息开关,默认为开 - .setLog2FileSwitch(false)// 打印log时是否存到文件的开关,默认关 - .setDir("")// 当自定义路径为空时,写入应用的/cache/log/目录中 - .setBorderSwitch(true)// 输出日志是否带边框开关,默认开 - .setConsoleFilter(LogUtils.V)// log的控制台过滤器,和logcat过滤器同理,默认Verbose - .setFileFilter(LogUtils.V);// log文件过滤器,和logcat过滤器同理,默认Verbose - LogUtils.d(builder.toString()); - } - - private void initCrash() { - CrashUtils.init(); - } - - private void initAssets() { - if (!FileUtils.isFileExists(Config.getTestApkPath())) { - try { - FileIOUtils.writeFileFromIS(Config.getTestApkPath(), getAssets().open("test_install"), false); - } catch (IOException e) { - e.printStackTrace(); - } - } - } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/ActivityActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/ActivityActivity.java deleted file mode 100644 index 6880658f9a..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/ActivityActivity.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.content.Context; -import android.os.Bundle; -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.ActivityUtils; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2016/10/13 - * desc : Activity工具类Demo - *- */ -public class ActivityActivity extends BaseBackActivity { - - private String imageActivityClassName; - - @Override - public void initData(Bundle bundle) { - imageActivityClassName = Config.PKG + ".activity.ImageActivity"; - } - - @Override - public int bindLayout() { - return R.layout.activity_activity; - } - - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().setTitle(getString(R.string.demo_activity)); - - findViewById(R.id.btn_launch_image_activity).setOnClickListener(this); - TextView tvAboutActivity = (TextView) findViewById(R.id.tv_about_activity); - tvAboutActivity.setText("Is ImageActivity Exists: " + ActivityUtils.isActivityExists(Config.PKG, imageActivityClassName) - + "\ngetLauncherActivity: " + ActivityUtils.getLauncherActivity(Config.PKG) - + "\ngetTopActivity: " + ActivityUtils.getTopActivity() - ); - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - switch (view.getId()) { - case R.id.btn_launch_image_activity: - ActivityUtils.startActivity(Config.PKG, imageActivityClassName); - break; - default: - break; - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/AppActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/AppActivity.java deleted file mode 100644 index 9d57534645..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/AppActivity.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.content.Context; -import android.os.Bundle; -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.AppUtils; -import com.blankj.utilcode.util.SpanUtils; -import com.blankj.utilcode.util.ToastUtils; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2016/10/13 - * desc : App工具类Demo - *- */ - -public class AppActivity extends BaseBackActivity { - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_app; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().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_get_app_details_settings).setOnClickListener(this); - TextView tvAboutApp = (TextView) findViewById(R.id.tv_about_app); - tvAboutApp.setText( - new SpanUtils() - .appendLine("app icon: ").appendImage(AppUtils.getAppIcon(), SpanUtils.ALIGN_CENTER) - .appendLine(AppUtils.getAppInfo().toString()) - .appendLine("isAppRoot: " + AppUtils.isAppRoot()) - .appendLine("isAppDebug: " + AppUtils.isAppDebug()) - .appendLine("AppSignatureSHA1: " + AppUtils.getAppSignatureSHA1()) - .append("isAppForeground: " + AppUtils.isAppForeground()) - .create()); - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - switch (view.getId()) { - case R.id.btn_install_app: - if (AppUtils.isInstallApp(Config.TEST_PKG)) { - ToastUtils.showShort(R.string.app_install_tips); - } else { - AppUtils.installApp(Config.getTestApkPath(), "com.blankj.androidutilcode.provider"); - } - break; - case R.id.btn_install_app_silent: - new Thread(new Runnable() { - @Override - public void run() { - if (AppUtils.isInstallApp(Config.TEST_PKG)) { - ToastUtils.showShortSafe(R.string.app_install_tips); - } else { - if (AppUtils.installAppSilent(Config.getTestApkPath())) { - ToastUtils.showShortSafe(R.string.install_successfully); - } else { - ToastUtils.showShortSafe(R.string.install_unsuccessfully); - } - } - } - }).start(); - break; - case R.id.btn_uninstall_app: - if (AppUtils.isInstallApp(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.isInstallApp(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_get_app_details_settings: - AppUtils.getAppDetailsSettings(); - break; - } - } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/BarActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/BarActivity.java deleted file mode 100644 index 76f3ddfe2c..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/BarActivity.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.blankj.androidutilcode.activity; - -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; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2017/05/27 - * desc : Bar工具类Demo - *- */ -public class BarActivity extends BaseBackActivity { - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_bar; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().setTitle(getString(R.string.demo_bar)); - - 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); - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - switch (view.getId()) { - case R.id.btn_status_bar_color: - startActivity(new Intent(this, StatusBarColorActivity.class)); - break; - case R.id.btn_status_bar_alpha: - startActivity(new Intent(this, StatusBarAlphaActivity.class)); - break; - case R.id.btn_status_bar_image_view: - startActivity(new Intent(this, StatusBarImageViewActivity.class)); - break; - case R.id.btn_status_bar_fragment: - startActivity(new Intent(this, StatusBarFragmentActivity.class)); - break; - } - } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/CleanActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/CleanActivity.java deleted file mode 100644 index 4278e22ce5..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/CleanActivity.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.content.Context; -import android.os.Bundle; -import android.view.View; -import android.widget.Button; - -import com.blankj.androidutilcode.R; -import com.blankj.androidutilcode.base.BaseBackActivity; -import com.blankj.utilcode.util.CleanUtils; -import com.blankj.utilcode.util.ToastUtils; - -import java.io.File; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2016/09/29 - * desc : Clean工具类Demo - *- */ -public class CleanActivity extends BaseBackActivity { - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_clean; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().setTitle(getString(R.string.demo_clean)); - - Button btnCleanInternalCache = (Button) findViewById(R.id.btn_clean_internal_cache); - Button btnCleanInternalFiles = (Button) findViewById(R.id.btn_clean_internal_files); - Button btnCleanInternalDbs = (Button) findViewById(R.id.btn_clean_internal_databases); - Button btnCleanInternalSP = (Button) findViewById(R.id.btn_clean_internal_sp); - Button btnCleanExternalCache = (Button) findViewById(R.id.btn_clean_external_cache); - btnCleanInternalCache.setOnClickListener(this); - btnCleanInternalFiles.setOnClickListener(this); - btnCleanInternalDbs.setOnClickListener(this); - btnCleanInternalSP.setOnClickListener(this); - btnCleanExternalCache.setOnClickListener(this); - - btnCleanInternalCache.setText(getCacheDir().getPath()); - btnCleanInternalFiles.setText(getFilesDir().getPath()); - btnCleanInternalDbs.setText(getFilesDir().getParent() + File.separator + "databases"); - btnCleanInternalSP.setText(getFilesDir().getParent() + File.separator + "shared_prefs"); - - if (getExternalCacheDir() != null) { - btnCleanExternalCache.setText(getExternalCacheDir().getAbsolutePath()); - } - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - switch (view.getId()) { - case R.id.btn_clean_internal_cache: - ToastUtils.showShort("cleanInternalCache" + CleanUtils.cleanInternalCache()); - break; - case R.id.btn_clean_internal_files: - ToastUtils.showShort("cleanInternalFiles" + CleanUtils.cleanInternalFiles()); - break; - case R.id.btn_clean_internal_databases: - ToastUtils.showShort("cleanInternalDbs" + CleanUtils.cleanInternalDbs()); - break; - case R.id.btn_clean_internal_sp: - ToastUtils.showShort("cleanInternalSP" + CleanUtils.cleanInternalSP()); - break; - case R.id.btn_clean_external_cache: - ToastUtils.showShort("cleanExternalCache" + CleanUtils.cleanExternalCache()); - break; - } - } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/DeviceActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/DeviceActivity.java deleted file mode 100644 index d8bc1f5702..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/DeviceActivity.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.content.Context; -import android.os.Bundle; -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; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2016/09/27 - * desc : Device工具类Demo - *- */ -public class DeviceActivity extends BaseBackActivity { - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_device; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().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 = (TextView) findViewById(R.id.tv_about_device); - tvAboutDevice.setText("isRoot: " + DeviceUtils.isDeviceRooted() - + "\ngetSDKVersion: " + DeviceUtils.getSDKVersion() - + "\ngetAndroidID: " + DeviceUtils.getAndroidID() - + "\ngetMacAddress: " + DeviceUtils.getMacAddress() - + "\ngetManufacturer: " + DeviceUtils.getManufacturer() - + "\ngetModel: " + DeviceUtils.getModel() - ); - } - - @Override - public void doBusiness(Context context) { - - } - - @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; - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/FragmentActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/FragmentActivity.java deleted file mode 100644 index 036dfa40bb..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/FragmentActivity.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.content.Context; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.view.View; - -import com.blankj.androidutilcode.R; -import com.blankj.androidutilcode.base.BaseBackActivity; -import com.blankj.androidutilcode.fragment.Demo0Fragment; -import com.blankj.utilcode.util.FragmentUtils; - -import java.util.ArrayList; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 17/02/01 - * desc : Fragment工具类Demo - *- */ -public class FragmentActivity extends BaseBackActivity { - - public Fragment rootFragment; - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_fragment; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().setTitle(getString(R.string.demo_fragment)); - } - - @Override - public void doBusiness(Context context) { - ArrayList
- * author: Blankj - * blog : http://blankj.com - * time : 2016/09/26 - * desc : Image工具类Demo - *- */ -public class ImageActivity extends BaseBackActivity { - - private ImageView ivSrc; - private ImageView ivView2Bitmap; - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_image; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().setTitle(getString(R.string.demo_image)); - - ivSrc = (ImageView) findViewById(R.id.iv_src); - ivView2Bitmap = (ImageView) findViewById(R.id.iv_view2Bitmap); - ImageView ivRound = (ImageView) findViewById(R.id.iv_round); - ImageView ivRoundCorner = (ImageView) findViewById(R.id.iv_round_corner); - ImageView ivFastBlur = (ImageView) findViewById(R.id.iv_fast_blur); - ImageView ivRenderScriptBlur = (ImageView) findViewById(R.id.iv_render_script_blur); - ImageView ivStackBlur = (ImageView) findViewById(R.id.iv_stack_blur); - ImageView ivAddFrame = (ImageView) findViewById(R.id.iv_add_frame); - ImageView ivAddReflection = (ImageView) findViewById(R.id.iv_add_reflection); - ImageView ivAddTextWatermark = (ImageView) findViewById(R.id.iv_add_text_watermark); - ImageView ivAddImageWatermark = (ImageView) findViewById(R.id.iv_add_image_watermark); - ImageView ivGray = (ImageView) findViewById(R.id.iv_gray); - - Bitmap src = ImageUtils.getBitmap(R.drawable.lena); - Bitmap watermark = ImageUtils.getBitmap(R.mipmap.ic_launcher); - - SizeUtils.forceGetViewSize(ivSrc, new SizeUtils.onGetSizeListener() { - @Override - public void onGetSize(View view) { - ivView2Bitmap.setImageBitmap(ImageUtils.view2Bitmap(ivSrc)); - } - }); - ivRound.setImageBitmap(ImageUtils.toRound(src)); - ivRoundCorner.setImageBitmap(ImageUtils.toRoundCorner(src, 60)); - ivFastBlur.setImageBitmap(ImageUtils.fastBlur(src, 0.1f, 5)); - ivRenderScriptBlur.setImageBitmap(ImageUtils.renderScriptBlur(src, 10)); - src = ImageUtils.getBitmap(R.drawable.lena); - ivStackBlur.setImageBitmap(ImageUtils.stackBlur(src, 10, false)); - ivAddFrame.setImageBitmap(ImageUtils.addFrame(src, 16, Color.GREEN)); - ivAddReflection.setImageBitmap(ImageUtils.addReflection(src, 80)); - ivAddTextWatermark.setImageBitmap(ImageUtils.addTextWatermark(src, "blankj", 40, 0x8800ff00, 0, 0)); - ivAddImageWatermark.setImageBitmap(ImageUtils.addImageWatermark(src, watermark, 0, 0, 0x88)); - ivGray.setImageBitmap(ImageUtils.toGray(src)); - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/KeyboardActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/KeyboardActivity.java deleted file mode 100644 index 313b1a8584..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/KeyboardActivity.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.content.Context; -import android.graphics.Rect; -import android.os.Bundle; -import android.support.v7.app.AlertDialog; -import android.util.DisplayMetrics; -import android.view.MotionEvent; -import android.view.View; -import android.view.inputmethod.InputMethodManager; -import android.widget.EditText; -import android.widget.TextView; - -import com.blankj.androidutilcode.R; -import com.blankj.androidutilcode.base.BaseBackActivity; -import com.blankj.androidutilcode.dialog.KeyboardDialog; -import com.blankj.utilcode.util.KeyboardUtils; -import com.blankj.utilcode.util.LogUtils; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2016/09/27 - * desc : Keyboard工具类Demo - *- */ -public class KeyboardActivity extends BaseBackActivity { - - TextView tvAboutKeyboard; - EditText etInput; - private AlertDialog dialog; - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_keyboard; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().setTitle(getString(R.string.demo_keyboard)); - etInput = (EditText) 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 = (TextView) findViewById(R.id.tv_about_keyboard); - } - - @Override - public void doBusiness(Context context) { - - } - - @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: - KeyboardUtils.hideSoftInput(this); - new KeyboardDialog(this).show(); - 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); - 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; - } - - private boolean isKeyboardShown(View rootView) { - final int softKeyboardHeight = 100; - Rect frame = new Rect(); - rootView.getWindowVisibleDisplayFrame(frame); - DisplayMetrics dm = rootView.getResources().getDisplayMetrics(); - int heightDiff = rootView.getBottom() - frame.bottom; - LogUtils.d("" + rootView.getBottom() + ", " + frame.bottom + ", " + heightDiff); - return heightDiff > softKeyboardHeight * dm.density; - } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/LogActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/LogActivity.java deleted file mode 100644 index 9b754a344a..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/LogActivity.java +++ /dev/null @@ -1,262 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.content.Context; -import android.os.Bundle; -import android.os.Environment; -import android.view.View; -import android.widget.TextView; - -import com.blankj.androidutilcode.R; -import com.blankj.androidutilcode.UtilsApp; -import com.blankj.androidutilcode.base.BaseBackActivity; -import com.blankj.utilcode.util.LogUtils; - - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2017/03/22 - * desc : Log工具类Demo - *- */ - -public class LogActivity extends BaseBackActivity { - - private static final String TAG = "CMJ"; - - private TextView tvAboutLog; - - private LogUtils.Builder mBuilder = new LogUtils.Builder(); - - 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 int consoleFilter = LogUtils.V; - private int fileFilter = LogUtils.V; - - 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_CONSOLE_FILTER = 0x01 << 7; - private static final int UPDATE_FILE_FILTER = 0x01 << 8; - - 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"); - } - }; - - private static final String longStr; - - static { - StringBuilder sb = new StringBuilder(); - sb.append("len = 10400\ncontent = \""); - for (int i = 0; i < 800; ++i) { - sb.append("Hello world. "); - } - sb.append("\""); - longStr = sb.toString(); - } - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_log; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().setTitle(getString(R.string.demo_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_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); - tvAboutLog = (TextView) findViewById(R.id.tv_about_log); - updateAbout(0); - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - switch (view.getId()) { - case R.id.btn_toggle_log: - updateAbout(UPDATE_LOG); - break; - case R.id.btn_toggle_console: - updateAbout(UPDATE_CONSOLE); - break; - case R.id.btn_toggle_tag: - updateAbout(UPDATE_TAG); - break; - case R.id.btn_toggle_head: - updateAbout(UPDATE_HEAD); - break; - case R.id.btn_toggle_file: - updateAbout(UPDATE_FILE); - break; - case R.id.btn_toggle_dir: - updateAbout(UPDATE_DIR); - break; - case R.id.btn_toggle_border: - updateAbout(UPDATE_BORDER); - break; - case R.id.btn_toggle_conole_filter: - updateAbout(UPDATE_CONSOLE_FILTER); - break; - case R.id.btn_toggle_file_filter: - updateAbout(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.v("customTag", "verbose"); - LogUtils.d("customTag", "debug"); - LogUtils.i("customTag", "info"); - LogUtils.w("customTag", "warn"); - LogUtils.e("customTag", "error"); - LogUtils.a("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(null); - LogUtils.d(null); - LogUtils.i(null); - LogUtils.w(null); - LogUtils.e(null); - LogUtils.a(null); - break; - case R.id.btn_log_many_params: - LogUtils.v("customTag", "verbose0", "verbose1"); - LogUtils.d("customTag", "debug0", "debug1"); - LogUtils.i("customTag", "info0", "info1"); - LogUtils.w("customTag", "warn0", "warn1"); - LogUtils.e("customTag", "error0", "error1"); - LogUtils.a("customTag", "assert0", "assert1"); - break; - case R.id.btn_log_long: - LogUtils.d(longStr); - 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: - 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/" }]}"; - LogUtils.json(json); - LogUtils.json(LogUtils.I, json); - break; - case R.id.btn_log_xml: - String xml = "
- * author: Blankj - * blog : http://blankj.com - * time : 2016/09/29 - * desc : MainActivity - *- */ -public class MainActivity extends BaseActivity { - - NavigationView.OnNavigationItemSelectedListener mListener = new NavigationView.OnNavigationItemSelectedListener() { - @Override - public boolean onNavigationItemSelected(@NonNull MenuItem item) { - switch (item.getItemId()) { - case R.id.action_git_hub: - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/Blankj/AndroidUtilCode"))); - break; - case R.id.action_blog: - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.jianshu.com/u/46702d5c6978"))); - break; - } - return false; - } - }; - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_main; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); - setSupportActionBar(toolbar); - ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); - mDrawerLayout.addDrawerListener(toggle); - toggle.syncState(); - navigationView.setNavigationItemSelectedListener(mListener); - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - - } - - public void activityClick(View view) { - startActivity(new Intent(this, ActivityActivity.class)); - } - - public void appClick(View view) { - startActivity(new Intent(this, AppActivity.class)); - } - - public void barClick(View view) { - startActivity(new Intent(this, BarActivity.class)); - } - - public void cleanClick(View view) { - startActivity(new Intent(this, CleanActivity.class)); - } - - public void crashClick(View view) { - throw new NullPointerException("crash test"); - } - - public void deviceClick(View view) { - startActivity(new Intent(this, DeviceActivity.class)); - } - - public void fragmentClick(View view) { - startActivity(new Intent(this, FragmentActivity.class)); - } - -// public void flashlightClick(View view) { -// startActivity(new Intent(this, FlashlightActivity.class)); -// } - - public void imageClick(View view) { - startActivity(new Intent(this, ImageActivity.class)); - } - - public void keyboardClick(View view) { - startActivity(new Intent(this, KeyboardActivity.class)); - } - - public void logClick(View view) { - startActivity(new Intent(this, LogActivity.class)); - } - - public void networkClick(View view) { - startActivity(new Intent(this, NetworkActivity.class)); - } - -// public void permissionClick(View view) { -// startActivity(new Intent(this, PermissionActivity.class)); -// } - - public void phoneClick(View view) { - startActivity(new Intent(this, PhoneActivity.class)); - } - - public void pinyinClick(View view) { - startActivity(new Intent(this, PinyinActivity.class)); - } - - public void processClick(View view) { - startActivity(new Intent(this, ProcessActivity.class)); - } - - public void sdcardClick(View view) { - startActivity(new Intent(this, SDCardActivity.class)); - } - - public void snackbarClick(View view) { - startActivity(new Intent(this, SnackbarActivity.class)); - } - - public void spannableClick(View view) { - startActivity(new Intent(this, SpanActivity.class)); - } - - public void toastClick(View view) { - startActivity(new Intent(this, ToastActivity.class)); - } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/NetworkActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/NetworkActivity.java deleted file mode 100644 index 6d0d709376..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/NetworkActivity.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.content.Context; -import android.os.Bundle; -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; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2016/10/13 - * desc : Network工具类Demo - *- */ -public class NetworkActivity extends BaseBackActivity { - - private TextView tvAboutNetwork; - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_network; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().setTitle(getString(R.string.demo_network)); - - tvAboutNetwork = (TextView) findViewById(R.id.tv_about_network); - findViewById(R.id.btn_open_wireless_settings).setOnClickListener(this); - findViewById(R.id.btn_set_wifi_enabled).setOnClickListener(this); - setAboutNetwork(); - } - - @Override - public void doBusiness(Context context) { - - } - - @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.setDataEnabled(!NetworkUtils.getDataEnabled()); - break; - case R.id.btn_set_wifi_enabled: - NetworkUtils.setWifiEnabled(!NetworkUtils.getWifiEnabled()); - break; - } - setAboutNetwork(); - } - - private void setAboutNetwork() { - tvAboutNetwork.setText("isConnected: " + NetworkUtils.isConnected() - + "\nisAvailableByPing: " + NetworkUtils.isAvailableByPing() - + "\ngetDataEnabled: " + NetworkUtils.getDataEnabled() - + "\nis4G: " + NetworkUtils.is4G() - + "\ngetWifiEnabled: " + NetworkUtils.getWifiEnabled() - + "\nisWifiConnected: " + NetworkUtils.isWifiConnected() - + "\nisWifiAvailable: " + NetworkUtils.isWifiAvailable() - + "\nisAvailableByPing: " + NetworkUtils.isAvailableByPing() - + "\ngetNetworkOperatorName: " + NetworkUtils.getNetworkOperatorName() - + "\ngetNetworkTypeName: " + NetworkUtils.getNetworkType() - + "\ngetIPAddress: " + NetworkUtils.getIPAddress(true) -// + "\ngetDomainAddress: " + NetworkUtils.getDomainAddress("baidu.com") - ); - } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/PhoneActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/PhoneActivity.java deleted file mode 100644 index fa1c42ba50..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/PhoneActivity.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.content.Context; -import android.os.Bundle; -import android.view.View; -import android.widget.TextView; - -import com.blankj.androidutilcode.R; -import com.blankj.androidutilcode.base.BaseBackActivity; -import com.blankj.utilcode.util.PhoneUtils; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2016/10/13 - * desc : Phone工具类Demo - *- */ -public class PhoneActivity extends BaseBackActivity { - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_phone; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().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); - TextView tvAboutPhone = (TextView) findViewById(R.id.tv_about_phone); - tvAboutPhone.setText("isPhone: " + PhoneUtils.isPhone() - + "\ngetIMEI: " + PhoneUtils.getIMEI() - + "\ngetIMSI: " + PhoneUtils.getIMSI() - + "\ngetPhoneType: " + PhoneUtils.getPhoneType() - + "\nisSimCardReady: " + PhoneUtils.isSimCardReady() - + "\ngetSimOperatorName: " + PhoneUtils.getSimOperatorName() - + "\ngetSimOperatorByMnc: " + PhoneUtils.getSimOperatorByMnc() - + "\n获取手机状态信息: " + PhoneUtils.getPhoneStatus() - ); - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - switch (view.getId()) { - case R.id.btn_dial: - PhoneUtils.dial("10000"); - break; - case R.id.btn_call: - PhoneUtils.call("10000"); - break; - case R.id.btn_send_sms: - PhoneUtils.sendSms("10000", "test"); - break; - case R.id.btn_send_sms_silent: - PhoneUtils.sendSmsSilent("10000", "test"); - break; - } - } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/PinyinActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/PinyinActivity.java deleted file mode 100644 index 833ad94db5..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/PinyinActivity.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.content.Context; -import android.os.Bundle; -import android.view.View; -import android.widget.TextView; - -import com.blankj.androidutilcode.R; -import com.blankj.androidutilcode.base.BaseBackActivity; -import com.blankj.utilcode.util.PinyinUtils; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 17/02/01 - * desc : Pinyin工具类Demo - *- */ -public class PinyinActivity extends BaseBackActivity { - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_pinyin; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().setTitle(getString(R.string.demo_pinyin)); - - TextView tvAboutPinyin = (TextView) findViewById(R.id.tv_about_pinyin); - tvAboutPinyin.setText("测试拼音工具类" - + "\n转拼音: " + PinyinUtils.ccs2Pinyin("测试拼音工具类", " ") - + "\n获取首字母: " + PinyinUtils.getPinyinFirstLetters("测试拼音工具类", " ") - + "\n澹台: " + PinyinUtils.getSurnamePinyin("澹台")); - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - - } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/ProcessActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/ProcessActivity.java deleted file mode 100644 index 3445f7e395..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/ProcessActivity.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.content.Context; -import android.os.Bundle; -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 java.util.Iterator; -import java.util.Set; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2016/10/13 - * desc : Process工具类Demo - *- */ -public class ProcessActivity extends BaseBackActivity { - - private TextView tvAboutProcess; - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_process; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().setTitle(getString(R.string.demo_process)); - - findViewById(R.id.btn_kill_all_background_processes).setOnClickListener(this); - tvAboutProcess = (TextView) findViewById(R.id.tv_about_process); - Set
- * author: Blankj - * blog : http://blankj.com - * time : 2016/09/27 - * desc : SDCard工具类Demo - *- */ -public class SDCardActivity extends BaseBackActivity { - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_sdcard; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().setTitle(getString(R.string.demo_sdcard)); - - TextView tvAboutSdcard = (TextView) findViewById(R.id.tv_about_sdcard); - tvAboutSdcard.setText("isSDCardEnable: " + SDCardUtils.isSDCardEnable() - + "\ngetDataPath: " + SDCardUtils.getDataPath() - + "\ngetSDCardPath: " + SDCardUtils.getSDCardPath() - + "\ngetFreeSpace: " + SDCardUtils.getFreeSpace() - + "\ngetSDCardInfo: " + SDCardUtils.getSDCardInfo() - ); - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - - } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/SnackbarActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/SnackbarActivity.java deleted file mode 100644 index 4030536ad0..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/SnackbarActivity.java +++ /dev/null @@ -1,198 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.content.Context; -import android.graphics.Color; -import android.os.Bundle; -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 : Snackbar工具类Demo - *- */ -public class SnackbarActivity extends BaseBackActivity { - - private View snackBarRootView; - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_snackbar; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().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(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - switch (view.getId()) { - case R.id.btn_short_snackbar: - SnackbarUtils.with(snackBarRootView) - .setMessage(getMsg(R.string.snackbar_short)) - .setMessageColor(Color.WHITE) - .setBgResource(R.drawable.shape_top_round_rect) - .show(); - break; - - case R.id.btn_short_snackbar_with_action: - SnackbarUtils.with(snackBarRootView) - .setMessage(getMsg(R.string.snackbar_short)) - .setMessageColor(Color.WHITE) - .setBgResource(R.drawable.shape_top_round_rect) - .setAction(getString(R.string.snackbar_click), Color.YELLOW, new View.OnClickListener() { - @Override - public void onClick(View v) { - ToastUtils.showShort(getString(R.string.snackbar_click)); - } - }) - .show(); - break; - - case R.id.btn_long_snackbar: - SnackbarUtils.with(snackBarRootView) - .setMessage(getMsg(R.string.snackbar_long)) - .setMessageColor(Color.WHITE) - .setDuration(SnackbarUtils.LENGTH_LONG) - .setBgResource(R.drawable.shape_top_round_rect) - .show(); - break; - - case R.id.btn_long_snackbar_with_action: - SnackbarUtils.with(snackBarRootView) - .setMessage(getMsg(R.string.snackbar_long)) - .setMessageColor(Color.WHITE) - .setBgResource(R.drawable.shape_top_round_rect) - .setDuration(SnackbarUtils.LENGTH_LONG) - .setAction(getString(R.string.snackbar_click), Color.YELLOW, new View.OnClickListener() { - @Override - public void onClick(View v) { - ToastUtils.showShort(getString(R.string.snackbar_click)); - } - }) - .show(); - break; - - case R.id.btn_indefinite_snackbar: - SnackbarUtils.with(snackBarRootView) - .setMessage(getMsg(R.string.snackbar_indefinite)) - .setMessageColor(Color.WHITE) - .setDuration(SnackbarUtils.LENGTH_INDEFINITE) - .setBgResource(R.drawable.shape_top_round_rect) - .show(); - break; - - case R.id.btn_indefinite_snackbar_with_action: - SnackbarUtils.with(snackBarRootView) - .setMessage(getMsg(R.string.snackbar_indefinite)) - .setMessageColor(Color.WHITE) - .setDuration(SnackbarUtils.LENGTH_INDEFINITE) - .setBgResource(R.drawable.shape_top_round_rect) - .setAction(getString(R.string.snackbar_click), Color.YELLOW, new View.OnClickListener() { - @Override - public void onClick(View v) { - ToastUtils.showShort(getString(R.string.snackbar_click)); - } - }) - .show(); - break; - - case R.id.btn_add_view: - SnackbarUtils.with(snackBarRootView) - .setBgColor(Color.TRANSPARENT) - .setDuration(SnackbarUtils.LENGTH_INDEFINITE) - .show(); - ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - 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 = (TextView) 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() - .appendLine(getString(resId)) - .setFontSize(24, true) - .setIconMargin(R.mipmap.ic_launcher, 32, SpanUtils.ALIGN_CENTER) - .append(" ").setFontSize(0) - .create(); - } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/SpanActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/SpanActivity.java deleted file mode 100644 index 03b75bc329..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/SpanActivity.java +++ /dev/null @@ -1,257 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.animation.ValueAnimator; -import android.content.Context; -import android.graphics.BitmapFactory; -import android.graphics.BitmapShader; -import android.graphics.BlurMaskFilter; -import android.graphics.Color; -import android.graphics.LinearGradient; -import android.graphics.Matrix; -import android.graphics.Shader; -import android.graphics.Typeface; -import android.os.Bundle; -import android.support.v4.content.ContextCompat; -import android.text.Layout; -import android.text.SpannableStringBuilder; -import android.text.TextPaint; -import android.text.method.LinkMovementMethod; -import android.text.style.ClickableSpan; -import android.view.View; -import android.view.animation.LinearInterpolator; -import android.widget.TextView; - -import com.blankj.androidutilcode.R; -import com.blankj.androidutilcode.base.BaseBackActivity; -import com.blankj.androidutilcode.span.BlurMaskFilterSpan; -import com.blankj.androidutilcode.span.ForegroundAlphaColorSpan; -import com.blankj.androidutilcode.span.ForegroundAlphaColorSpanGroup; -import com.blankj.androidutilcode.span.ShadowSpan; -import com.blankj.utilcode.util.SpanUtils; -import com.blankj.utilcode.util.ToastUtils; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2016/09/27 - * desc : Span工具类Demo - *- */ -public class SpanActivity extends BaseBackActivity { - - SpanUtils mSpanUtils; - SpannableStringBuilder animSsb; - - int lineHeight; - float textSize; - ValueAnimator valueAnimator; - Shader mShader; - float mShaderWidth; - Matrix matrix; - - BlurMaskFilterSpan mBlurMaskFilterSpan; - - ShadowSpan mShadowSpan; - - ForegroundAlphaColorSpan mForegroundAlphaColorSpan; - - ForegroundAlphaColorSpanGroup mForegroundAlphaColorSpanGroup; - String mPrinterString; - - - float density; - TextView tvAboutSpan; - TextView tvAboutAnimRainbow; - TextView tvAboutAnimBlur; - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_span; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().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 = (TextView) findViewById(R.id.tv_about_span); - tvAboutAnimRainbow = (TextView) 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; - - tvAboutSpan.setText(new SpanUtils() - .appendLine("SpanUtils").setBackgroundColor(Color.LTGRAY).setBold().setForegroundColor(Color.YELLOW).setAlign(Layout.Alignment.ALIGN_CENTER) - .appendLine("前景色").setForegroundColor(Color.GREEN) - .appendLine("背景色").setBackgroundColor(Color.LTGRAY) - .appendLine("行高顶部对齐").setLineHeight(2 * lineHeight, SpanUtils.ALIGN_TOP).setBackgroundColor(Color.GREEN) - .appendLine("行高居中对齐").setLineHeight(2 * lineHeight, SpanUtils.ALIGN_CENTER).setBackgroundColor(Color.LTGRAY) - .appendLine("行高底部对齐").setLineHeight(2 * lineHeight, SpanUtils.ALIGN_BOTTOM).setBackgroundColor(Color.GREEN) - .appendLine("测试段落缩,首行缩进两字,其他行不缩进").setLeadingMargin((int) textSize * 2, 10).setBackgroundColor(Color.GREEN) - .appendLine("测试引用,后面的字是为了凑到两行的效果").setQuoteColor(Color.GREEN, 10, 10).setBackgroundColor(Color.LTGRAY) - .appendLine("测试列表项,后面的字是为了凑到两行的效果").setBullet(Color.GREEN, 20, 10).setBackgroundColor(Color.LTGRAY).setBackgroundColor(Color.GREEN) - .appendLine("测试图标文字顶部对齐,后面的字是为了凑到两行的效果").setIconMargin(R.drawable.shape_spannable_block_high, 20, SpanUtils.ALIGN_TOP).setBackgroundColor(Color.LTGRAY) - .appendLine("测试图标文字居中对齐,后面的字是为了凑到两行的效果").setIconMargin(R.drawable.shape_spannable_block_high, 20, SpanUtils.ALIGN_CENTER).setBackgroundColor(Color.GREEN) - .appendLine("测试图标文字底部对齐,后面的字是为了凑到两行的效果").setIconMargin(R.drawable.shape_spannable_block_high, 20, SpanUtils.ALIGN_BOTTOM).setBackgroundColor(Color.LTGRAY) - .appendLine("测试图标顶部对齐,后面的字是为了凑到两行的效果").setIconMargin(R.drawable.shape_spannable_block_low, 20, SpanUtils.ALIGN_TOP).setBackgroundColor(Color.GREEN) - .appendLine("测试图标居中对齐,后面的字是为了凑到两行的效果").setIconMargin(R.drawable.shape_spannable_block_low, 20, SpanUtils.ALIGN_CENTER).setBackgroundColor(Color.LTGRAY) - .appendLine("测试图标底部对齐,后面的字是为了凑到两行的效果").setIconMargin(R.drawable.shape_spannable_block_low, 20, SpanUtils.ALIGN_BOTTOM).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.cheetah), - Shader.TileMode.REPEAT, - Shader.TileMode.REPEAT)) - .appendLine("阴影效果").setFontSize(64, true).setBackgroundColor(Color.BLACK).setShadow(24, 8, 8, Color.WHITE) - - .append("测试小图对齐").setBackgroundColor(Color.LTGRAY) - .appendImage(R.drawable.shape_spannable_block_low, SpanUtils.ALIGN_TOP) - .appendImage(R.drawable.shape_spannable_block_low, SpanUtils.ALIGN_CENTER) - .appendImage(R.drawable.shape_spannable_block_low, SpanUtils.ALIGN_BASELINE) - .appendImage(R.drawable.shape_spannable_block_low, SpanUtils.ALIGN_BOTTOM) - .appendLine("end").setBackgroundColor(Color.LTGRAY) - - .append("测试大图字体顶部对齐").setBackgroundColor(Color.GREEN) - .appendImage(R.drawable.shape_spannable_block_high, SpanUtils.ALIGN_TOP) - .appendLine() - - .append("测试大图字体居中对齐").setBackgroundColor(Color.LTGRAY) - .appendImage(R.drawable.shape_spannable_block_high, SpanUtils.ALIGN_CENTER) - .appendLine() - - .append("测试大图字体底部对齐").setBackgroundColor(Color.GREEN) - .appendImage(R.drawable.shape_spannable_block_high, SpanUtils.ALIGN_BOTTOM) - .appendLine() - - .append("测试空格").appendSpace(30, Color.LTGRAY).appendSpace(50, Color.GREEN).appendSpace(100).appendSpace(30, Color.LTGRAY).appendSpace(50, Color.GREEN) - .create()); - - initAnimSpan(); - startAnim(); - } - - private void initAnimSpan() { - mShaderWidth = 64 * density * 4; - mShader = new LinearGradient(0, 0, - mShaderWidth, 0, - getResources().getIntArray(R.array.rainbow), - null, - Shader.TileMode.REPEAT); - matrix = new Matrix(); - - mBlurMaskFilterSpan = new BlurMaskFilterSpan(25); - - mShadowSpan = new ShadowSpan(8, 8, 8, Color.WHITE); - - mForegroundAlphaColorSpan = new ForegroundAlphaColorSpan(Color.TRANSPARENT); - - mForegroundAlphaColorSpanGroup = new ForegroundAlphaColorSpanGroup(0); - - mPrinterString = "打印动画,后面的文字是为了测试打印效果..."; - - mSpanUtils = new SpanUtils() - .appendLine("彩虹动画").setFontSize(64, true).setShader(mShader) - .appendLine("模糊动画").setFontSize(64, true).setSpans(mBlurMaskFilterSpan) - .appendLine("阴影动画").setFontSize(64, true).setBackgroundColor(Color.BLACK).setSpans(mShadowSpan) - .appendLine("透明动画").setFontSize(64, true).setSpans(mForegroundAlphaColorSpan); - for (int i = 0, len = mPrinterString.length(); i < len; ++i) { - ForegroundAlphaColorSpan span = new ForegroundAlphaColorSpan(Color.TRANSPARENT); - mSpanUtils.append(mPrinterString.substring(i, i + 1)).setSpans(span); - mForegroundAlphaColorSpanGroup.addSpan(span); - } - animSsb = mSpanUtils.create(); - } - - private void startAnim() { - valueAnimator = ValueAnimator.ofFloat(0, 1); - valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - // shader - matrix.reset(); - matrix.setTranslate((Float) animation.getAnimatedValue() * mShaderWidth, 0); - mShader.setLocalMatrix(matrix); - - // blur - mBlurMaskFilterSpan.setRadius(25 * (1.00001f - (Float) animation.getAnimatedValue())); - - // shadow - mShadowSpan.setDx(16 * (0.5f - (Float) animation.getAnimatedValue())); - mShadowSpan.setDy(16 * (0.5f - (Float) animation.getAnimatedValue())); - - // alpha - mForegroundAlphaColorSpan.setAlpha((int) (255 * (Float) animation.getAnimatedValue())); - - // printer - mForegroundAlphaColorSpanGroup.setAlpha((Float) animation.getAnimatedValue()); - - // update - tvAboutAnimRainbow.setText(animSsb); - } - }); - - valueAnimator.setInterpolator(new LinearInterpolator()); - valueAnimator.setDuration(600 * 3); - valueAnimator.setRepeatCount(ValueAnimator.INFINITE); - valueAnimator.start(); - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - - } - - @Override - protected void onDestroy() { - valueAnimator.cancel(); - super.onDestroy(); - } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/StatusBarAlphaActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/StatusBarAlphaActivity.java deleted file mode 100644 index e4011b8b09..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/StatusBarAlphaActivity.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.content.Context; -import android.os.Bundle; -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 : Bar工具类Demo - *- */ -public class StatusBarAlphaActivity extends BaseActivity { - - private int mAlpha; - private TextView mTvStatusAlpha; - private SeekBar sbChangeAlpha; - - @Override - public void initData(Bundle bundle) { - mAlpha = 112; - } - - @Override - public int bindLayout() { - return R.layout.fragment_status_bar_alpha; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - findViewById(R.id.btn_set_transparent).setOnClickListener(this); - mTvStatusAlpha = (TextView) findViewById(R.id.tv_status_alpha); - sbChangeAlpha = (SeekBar) findViewById(R.id.sb_change_alpha); - sbChangeAlpha.setOnSeekBarChangeListener(translucentListener); - sbChangeAlpha.setProgress(mAlpha); - } - - @Override - public void doBusiness(Context context) { - - } - - @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; - BarUtils.setStatusBar4Bg(StatusBarAlphaActivity.this, mAlpha); - mTvStatusAlpha.setText(String.valueOf(mAlpha)); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - - } - }; -} diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/StatusBarColorActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/StatusBarColorActivity.java deleted file mode 100644 index a1e0bd5a65..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/StatusBarColorActivity.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.content.Context; -import android.os.Bundle; -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.base.BaseBackActivity; -import com.blankj.utilcode.util.BarUtils; - -import java.util.Random; - - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2017/05/27 - * desc : Bar工具类Demo分支 - *- */ -public class StatusBarColorActivity extends BaseBackActivity { - - private Random mRandom; - private int mColor; - private int mAlpha; - private TextView mTvStatusAlpha; - private SeekBar sbChangeAlpha; - - @Override - public void initData(Bundle bundle) { - mRandom = new Random(); - mColor = ContextCompat.getColor(this, R.color.colorPrimary); - mAlpha = 112; - } - - @Override - public int bindLayout() { - return R.layout.activity_status_bar_color; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().setTitle(getString(R.string.demo_bar)); - - findViewById(R.id.btn_random_color).setOnClickListener(this); - findViewById(R.id.btn_set_transparent).setOnClickListener(this); - mTvStatusAlpha = (TextView) findViewById(R.id.tv_status_alpha); - sbChangeAlpha = (SeekBar) findViewById(R.id.sb_change_alpha); - sbChangeAlpha.setOnSeekBarChangeListener(colorListener); - sbChangeAlpha.setProgress(mAlpha); - updateColorBar(); - } - - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - switch (view.getId()) { - case R.id.btn_random_color: - mColor = 0xff000000 | mRandom.nextInt(0xffffff); - updateColorBar(); - break; - case R.id.btn_set_transparent: - sbChangeAlpha.setProgress(0); - break; - } - } - - private void updateColorBar() { - mToolbar.setBackgroundColor(mColor); - BarUtils.setStatusBarColor(this, mColor, mAlpha); - } - - private SeekBar.OnSeekBarChangeListener colorListener = new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - mAlpha = progress; - BarUtils.setStatusBarColor(StatusBarColorActivity.this, mColor, mAlpha); - mTvStatusAlpha.setText(String.valueOf(mAlpha)); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - - } - }; -} diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/StatusBarFragmentActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/StatusBarFragmentActivity.java deleted file mode 100644 index d1dc389eec..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/StatusBarFragmentActivity.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.content.Context; -import android.os.Bundle; -import android.support.annotation.NonNull; -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 com.blankj.androidutilcode.fragment.StatusBarAlphaFragment; -import com.blankj.androidutilcode.fragment.StatusBarColorFragment; -import com.blankj.androidutilcode.fragment.StatusBarImageViewFragment; -import com.blankj.utilcode.util.BarUtils; - -import java.util.ArrayList; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2017/05/27 - * desc : Bar工具类Demo - *- */ -public class StatusBarFragmentActivity extends BaseActivity { - - private ViewPager mVpHome; - private BottomNavigationView navigation; - private ArrayList
- * author: Blankj - * blog : http://blankj.com - * time : 2017/05/27 - * desc : Bar工具类Demo - *- */ -public class StatusBarImageViewActivity extends BaseActivity { - - private int mAlpha; - private TextView mTvStatusAlpha; - private SeekBar sbChangeAlpha; - - @Override - public void initData(Bundle bundle) { - mAlpha = 112; - } - - @Override - public int bindLayout() { - return R.layout.activity_status_bar_image_view; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - findViewById(R.id.btn_set_transparent).setOnClickListener(this); - mTvStatusAlpha = (TextView) findViewById(R.id.tv_status_alpha); - sbChangeAlpha = (SeekBar) findViewById(R.id.sb_change_alpha); - sbChangeAlpha.setOnSeekBarChangeListener(translucentListener); - sbChangeAlpha.setProgress(mAlpha); - } - - @Override - public void doBusiness(Context context) { - - } - - @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; - BarUtils.setStatusBar4ImageView(StatusBarImageViewActivity.this, mAlpha, null); - mTvStatusAlpha.setText(String.valueOf(mAlpha)); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - - } - }; -} diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/ToastActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/ToastActivity.java deleted file mode 100644 index 8dacd48ba8..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/activity/ToastActivity.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.blankj.androidutilcode.activity; - -import android.content.Context; -import android.graphics.Color; -import android.os.Bundle; -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 : Toast工具类Demo - *- */ -public class ToastActivity extends BaseBackActivity { - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.activity_toast; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - getSupportActionBar().setTitle(getString(R.string.demo_toast)); - - view.findViewById(R.id.btn_show_short_toast_safe).setOnClickListener(this); - view.findViewById(R.id.btn_show_short_toast).setOnClickListener(this); - view.findViewById(R.id.btn_show_long_toast_safe).setOnClickListener(this); - view.findViewById(R.id.btn_show_long_toast).setOnClickListener(this); - view.findViewById(R.id.btn_show_green_font).setOnClickListener(this); - view.findViewById(R.id.btn_show_custom_bg).setOnClickListener(this); - view.findViewById(R.id.btn_show_span).setOnClickListener(this); - view.findViewById(R.id.btn_show_custom_view).setOnClickListener(this); - view.findViewById(R.id.btn_show_middle).setOnClickListener(this); - view.findViewById(R.id.btn_cancel_toast).setOnClickListener(this); - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - resetToast(); - switch (view.getId()) { - case R.id.btn_show_short_toast_safe: - new Thread(new Runnable() { - @Override - public void run() { - ToastUtils.showShortSafe(R.string.toast_short_safe); - } - }).start(); - break; - case R.id.btn_show_short_toast: - ToastUtils.showShort(R.string.toast_short); - break; - case R.id.btn_show_long_toast_safe: - new Thread(new Runnable() { - @Override - public void run() { - ToastUtils.showLongSafe(R.string.toast_long_safe); - } - }).start(); - break; - case R.id.btn_show_long_toast: - ToastUtils.showLong(R.string.toast_long); - break; - case R.id.btn_show_green_font: - ToastUtils.setMessageColor(Color.GREEN); - ToastUtils.showLong(R.string.toast_green_font); - break; - case R.id.btn_show_custom_bg: - ToastUtils.setBgResource(R.drawable.shape_round_rect); - ToastUtils.showLong(R.string.toast_custom_bg); - break; - case R.id.btn_show_span: - ToastUtils.showLong(new SpanUtils() - .appendLine(getString(R.string.toast_span)) - .setFontSize(24, true) - .setIconMargin(R.mipmap.ic_launcher, 32, SpanUtils.ALIGN_CENTER) - .append(" ").setFontSize(0) - .create()); - break; - case R.id.btn_show_custom_view: - ToastUtils.showCustomLong(R.layout.toast_custom); - 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.setMessageColor(0x12000000); - ToastUtils.setBgResource(-1); - ToastUtils.setView(null); - ToastUtils.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, getResources().getDimensionPixelSize(R.dimen.offset_64)); - } -} 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 5c6e992283..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/base/BaseActivity.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.blankj.androidutilcode.base; - -import android.os.Bundle; -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 : Activity基类 - *- */ -public abstract class BaseActivity extends AppCompatActivity - implements IBaseView, View.OnClickListener { - - /** - * 当前Activity渲染的视图View - */ - protected View contentView; - /** - * 上次点击时间 - */ - private long lastClick = 0; - - protected BaseActivity mActivity; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - mActivity = this; - Bundle bundle = getIntent().getExtras(); - initData(bundle); - setBaseView(); - initView(savedInstanceState, contentView); - doBusiness(this); - } - - protected void setBaseView() { - setContentView(contentView = LayoutInflater.from(this).inflate(bindLayout(), null)); - } - - /** - * 判断是否快速点击 - * - * @return {@code true}: 是
- * author: Blankj - * blog : http://blankj.com - * time : 2017/03/30 - * desc : 基类App - *- */ -public class BaseApplication extends Application { - - private static final String TAG = "BaseApplication"; - - private static BaseApplication sInstance; - - public static Context 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 57663a42bc..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/base/BaseBackActivity.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.blankj.androidutilcode.base; - -import android.graphics.Color; -import android.support.v7.widget.Toolbar; -import android.view.LayoutInflater; -import android.view.MenuItem; -import android.widget.FrameLayout; - -import com.blankj.androidutilcode.R; -import com.r0adkll.slidr.Slidr; - - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2017/06/27 - * desc : DrawerActivity基类 - *- */ -public abstract class BaseBackActivity extends BaseActivity { - - protected Toolbar mToolbar; - - @Override - protected void setBaseView() { - Slidr.attach(this); - contentView = LayoutInflater.from(this).inflate(R.layout.activity_back, null); - setContentView(contentView); - FrameLayout frameLayout = (FrameLayout) findViewById(R.id.content_view); - frameLayout.addView(LayoutInflater.from(this).inflate(bindLayout(), frameLayout, false)); - mToolbar = (Toolbar) findViewById(R.id.toolbar); - setSupportActionBar(mToolbar); - if (getSupportActionBar() != null) { - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } - contentView.setBackgroundColor(Color.WHITE); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == android.R.id.home) { - finish(); - } - return super.onOptionsItemSelected(item); - } -} 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 05e4b68bb9..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/base/BaseDrawerActivity.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.blankj.androidutilcode.base; - -import android.content.Intent; -import android.net.Uri; -import android.support.annotation.NonNull; -import android.support.design.widget.NavigationView; -import android.support.v4.widget.DrawerLayout; -import android.support.v7.app.ActionBarDrawerToggle; -import android.support.v7.widget.Toolbar; -import android.view.LayoutInflater; -import android.view.MenuItem; -import android.widget.FrameLayout; - -import com.blankj.androidutilcode.R; - - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2017/06/27 - * desc : DrawerActivity基类 - *- */ -public abstract class BaseDrawerActivity extends BaseActivity { - - protected Toolbar mToolbar; - - NavigationView.OnNavigationItemSelectedListener mListener = new NavigationView.OnNavigationItemSelectedListener() { - @Override - public boolean onNavigationItemSelected(@NonNull MenuItem item) { - switch (item.getItemId()) { - case R.id.action_git_hub: - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/Blankj/AndroidUtilCode"))); - break; - case R.id.action_blog: - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.jianshu.com/u/46702d5c6978"))); - break; - } - return false; - } - }; - - @Override - protected void setBaseView() { - contentView = LayoutInflater.from(this).inflate(R.layout.activity_drawer, null); - setContentView(contentView); - FrameLayout frameLayout = (FrameLayout) findViewById(R.id.content_view); - frameLayout.addView(LayoutInflater.from(this).inflate(bindLayout(), frameLayout, false)); - DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); - mToolbar = (Toolbar) findViewById(R.id.toolbar); - NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); - setSupportActionBar(mToolbar); - ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); - mDrawerLayout.addDrawerListener(toggle); - toggle.syncState(); - 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 265ce48029..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/base/BaseFragment.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.blankj.androidutilcode.base; - -import android.os.Bundle; -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 : Fragment-v4基类 - *- */ -public abstract class BaseFragment extends Fragment - implements IBaseView, View.OnClickListener { - - private static final String TAG = "BaseFragment"; - - private static final String STATE_SAVE_IS_HIDDEN = "STATE_SAVE_IS_HIDDEN"; - /** - * 当前Activity渲染的视图View - */ - protected View contentView; - /** - * 上次点击时间 - */ - private long lastClick = 0; - - protected BaseActivity mActivity; - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - 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.commit(); - } - Log.d(TAG, "onCreate: "); - } - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - setRetainInstance(true); - contentView = inflater.inflate(bindLayout(), null); - Log.d(TAG, "onCreateView: "); - return contentView; - } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - Bundle bundle = getArguments(); - initData(bundle); - initView(savedInstanceState, contentView); - Log.d(TAG, "onViewCreated: "); - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - mActivity = (BaseActivity) getActivity(); - doBusiness(mActivity); - Log.d(TAG, "onActivityCreated: "); - } - - /** - * 判断是否快速点击 - * - * @return {@code true}: 是
- * author: Blankj - * blog : http://blankj.com - * time : 2017/06/27 - * desc : - *- */ -interface IBaseView { - - /** - * 初始化数据 - * - * @param bundle 传递过来的bundle - */ - void initData(final Bundle bundle); - - /** - * 绑定布局 - * - * @return 布局Id - */ - int bindLayout(); - - /** - * 初始化view - */ - void initView(final Bundle savedInstanceState, final View view); - - /** - * 业务操作 - * - * @param context 上下文 - */ - void doBusiness(final Context context); - - /** - * 视图点击事件 - * - * @param view 视图 - */ - void onWidgetClick(final View view); -} diff --git a/app/src/main/java/com/blankj/androidutilcode/dialog/KeyboardDialog.java b/app/src/main/java/com/blankj/androidutilcode/dialog/KeyboardDialog.java deleted file mode 100644 index 5b2093b1ea..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/dialog/KeyboardDialog.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.blankj.androidutilcode.dialog; - -import android.app.Activity; -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.KeyboardUtils; - -import java.lang.ref.WeakReference; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2017/06/01 - * desc : - *- */ -public class KeyboardDialog implements View.OnClickListener { - - private WeakReference
- * author: Blankj - * blog : http://blankj.com - * time : 17/02/02 - * desc : - *- */ -public class Demo0Fragment extends BaseFragment - implements FragmentUtils.OnBackClickListener { - - private Demo0Fragment demo0Fragment; - private FragmentUtils.SharedElement sharedElement; - Button btnShowAboutFragment; - ImageView ivSharedElement; - TextView tvAboutFragment; - - public static Demo0Fragment newInstance() { - Bundle args = new Bundle(); - Demo0Fragment fragment = new Demo0Fragment(); - fragment.setArguments(args); - return fragment; - } - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.fragment_demo0; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - Random random = new Random(); - FragmentUtils.setBackgroundColor(this, Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256))); - btnShowAboutFragment = (Button) view.findViewById(R.id.btn_show_about_fragment); - btnShowAboutFragment.setOnClickListener(this); - view.findViewById(R.id.btn_add_hide).setOnClickListener(this); - view.findViewById(R.id.btn_add_show).setOnClickListener(this); - view.findViewById(R.id.btn_add_child).setOnClickListener(this); - view.findViewById(R.id.btn_pop_to_root).setOnClickListener(this); - view.findViewById(R.id.btn_pop_add).setOnClickListener(this); - view.findViewById(R.id.btn_hide_show).setOnClickListener(this); - view.findViewById(R.id.btn_replace).setOnClickListener(this); - ivSharedElement = (ImageView) view.findViewById(R.id.iv_shared_element); - tvAboutFragment = (TextView) view.findViewById(R.id.tv_about_fragment); - demo0Fragment = this; - sharedElement = new FragmentUtils.SharedElement(ivSharedElement, getString(R.string.fragment_transition)); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - setExitTransition(new Fade()); - } - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - tvAboutFragment.setText(""); - switch (view.getId()) { - case R.id.btn_show_about_fragment: - tvAboutFragment.setText("lastAdd: " + FragmentUtils.getLastAddFragment(getFragmentManager()).getClass().getSimpleName() - + "\nlastAddInStack: " + (FragmentUtils.getLastAddFragmentInStack(getFragmentManager()) != null ? FragmentUtils.getLastAddFragmentInStack(getFragmentManager()).getClass().getSimpleName() : "null") - + "\ntopShow: " + (FragmentUtils.getTopShowFragment(getFragmentManager()) != null ? FragmentUtils.getTopShowFragment(getFragmentManager()).getClass().getSimpleName() : "null") - + "\ntopShowInStack: " + (FragmentUtils.getTopShowFragmentInStack(getFragmentManager()) != null ? FragmentUtils.getTopShowFragmentInStack(getFragmentManager()).getClass().getSimpleName() : "null") - + "\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_hide: - FragmentUtils.hideAddFragment(getFragmentManager(), - demo0Fragment, - addSharedElement(Demo1Fragment.newInstance()), - R.id.fragment_container, - false, - true, - sharedElement); - break; - case R.id.btn_add_show: - FragmentUtils.addFragment(getFragmentManager(), - addSharedElement(Demo1Fragment.newInstance()), - R.id.fragment_container, - false, - false, - sharedElement); - break; - case R.id.btn_add_child: - FragmentUtils.addFragment(getChildFragmentManager(), - Demo2Fragment.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(Demo2Fragment.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.hideShowFragment(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/fragment/Demo1Fragment.java b/app/src/main/java/com/blankj/androidutilcode/fragment/Demo1Fragment.java deleted file mode 100644 index e1b99a3b13..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/fragment/Demo1Fragment.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.blankj.androidutilcode.fragment; - -import android.content.Context; -import android.graphics.Color; -import android.os.Bundle; -import android.view.View; -import android.widget.TextView; - -import com.blankj.androidutilcode.R; -import com.blankj.androidutilcode.activity.FragmentActivity; -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 : - *- */ -public class Demo1Fragment extends BaseFragment { - - public static Demo1Fragment newInstance() { - Bundle args = new Bundle(); - Demo1Fragment fragment = new Demo1Fragment(); - fragment.setArguments(args); - return fragment; - } - - private TextView tvAboutFragment; - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.fragment_demo1; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - Random random = new Random(); - FragmentUtils.setBackgroundColor(this, Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256))); - view.findViewById(R.id.btn_show_about_fragment).setOnClickListener(this); - view.findViewById(R.id.btn_hide_show).setOnClickListener(this); - tvAboutFragment = (TextView) view.findViewById(R.id.tv_about_fragment); - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - tvAboutFragment.setText(""); - switch (view.getId()) { - case R.id.btn_show_about_fragment: - tvAboutFragment.setText("lastAdd: " + FragmentUtils.getLastAddFragment(getFragmentManager()).getClass().getSimpleName() - + "\nlastAddInStack: " + (FragmentUtils.getLastAddFragmentInStack(getFragmentManager()) != null ? FragmentUtils.getLastAddFragmentInStack(getFragmentManager()).getClass().getSimpleName() : "null") - + "\ntopShow: " + FragmentUtils.getTopShowFragment(getFragmentManager()).getClass().getSimpleName() - + "\ntopShowInStack: " + (FragmentUtils.getTopShowFragmentInStack(getFragmentManager()) != null ? FragmentUtils.getTopShowFragmentInStack(getFragmentManager()).getClass().getSimpleName() : "null") - + "\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_hide_show: - FragmentUtils.hideAllShowFragment(((FragmentActivity) getActivity()).rootFragment); - break; - } - } - -// @Override -// public boolean onBackClick() { -// LogUtils.d("onBackClick"); -// FragmentUtils.showFragment(((FragmentActivity) getActivity()).rootFragment); -// FragmentUtils.popFragment(getFragmentManager()); -// return true; -// } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/fragment/Demo2Fragment.java b/app/src/main/java/com/blankj/androidutilcode/fragment/Demo2Fragment.java deleted file mode 100644 index 5bed2eab6c..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/fragment/Demo2Fragment.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.blankj.androidutilcode.fragment; - -import android.content.Context; -import android.graphics.Color; -import android.os.Bundle; -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 : - *- */ -public class Demo2Fragment extends BaseFragment - implements FragmentUtils.OnBackClickListener{ - - private TextView tvAboutFragment; - - public static Demo2Fragment newInstance() { - Bundle args = new Bundle(); - Demo2Fragment fragment = new Demo2Fragment(); - fragment.setArguments(args); - return fragment; - } - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.fragment_demo2; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - Random random = new Random(); - FragmentUtils.setBackgroundColor(this, Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256))); - view.findViewById(R.id.btn_show_about_fragment).setOnClickListener(this); - view.findViewById(R.id.btn_pop).setOnClickListener(this); - tvAboutFragment = (TextView) view.findViewById(R.id.tv_about_fragment); - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - tvAboutFragment.setText(""); - switch (view.getId()) { - case R.id.btn_show_about_fragment: - tvAboutFragment.setText("lastAdd: " + FragmentUtils.getLastAddFragment(getFragmentManager()).getClass().getSimpleName() - + "\nlastAddInStack: " + (FragmentUtils.getLastAddFragmentInStack(getFragmentManager()) != null ? FragmentUtils.getLastAddFragmentInStack(getFragmentManager()).getClass().getSimpleName() : "null") - + "\ntopShow: " + FragmentUtils.getTopShowFragment(getFragmentManager()).getClass().getSimpleName() - + "\ntopShowInStack: " + (FragmentUtils.getTopShowFragmentInStack(getFragmentManager()) != null ? FragmentUtils.getTopShowFragmentInStack(getFragmentManager()).getClass().getSimpleName() : "null") - + "\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/fragment/Demo3Fragment.java b/app/src/main/java/com/blankj/androidutilcode/fragment/Demo3Fragment.java deleted file mode 100644 index 3a3a61dd8e..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/fragment/Demo3Fragment.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.blankj.androidutilcode.fragment; - -import android.content.Context; -import android.graphics.Color; -import android.os.Build; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.transition.Fade; -import android.view.View; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.TextView; - -import com.blankj.androidutilcode.R; -import com.blankj.androidutilcode.activity.FragmentActivity; -import com.blankj.androidutilcode.base.BaseFragment; -import com.blankj.androidutilcode.transition.DetailTransition; -import com.blankj.utilcode.util.FragmentUtils; -import com.blankj.utilcode.util.ToastUtils; - -import java.util.Random; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 17/02/02 - * desc : - *- */ -public class Demo3Fragment extends BaseFragment - implements View.OnClickListener, FragmentUtils.OnBackClickListener { - - private Button btnShowAboutFragment; - private ImageView ivSharedElement; - private TextView tvAboutFragment; - - public static Demo3Fragment newInstance() { - Bundle args = new Bundle(); - Demo3Fragment fragment = new Demo3Fragment(); - fragment.setArguments(args); - return fragment; - } - - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.fragment_demo3; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - Random random = new Random(); - FragmentUtils.setBackgroundColor(this, Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256))); - btnShowAboutFragment = (Button) view.findViewById(R.id.btn_show_about_fragment); - btnShowAboutFragment.setOnClickListener(this); - view.findViewById(R.id.btn_add_hide).setOnClickListener(this); - view.findViewById(R.id.btn_add_show).setOnClickListener(this); - view.findViewById(R.id.btn_add_child).setOnClickListener(this); - view.findViewById(R.id.btn_pop_to_root).setOnClickListener(this); - view.findViewById(R.id.btn_pop_add).setOnClickListener(this); - view.findViewById(R.id.btn_hide_show).setOnClickListener(this); - view.findViewById(R.id.btn_replace).setOnClickListener(this); - ivSharedElement = (ImageView) view.findViewById(R.id.iv_shared_element); - tvAboutFragment = (TextView) view.findViewById(R.id.tv_about_fragment); - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - tvAboutFragment.setText(""); - switch (view.getId()) { - case R.id.btn_show_about_fragment: - tvAboutFragment.setText("lastAdd: " + FragmentUtils.getLastAddFragment(getFragmentManager()).getClass().getSimpleName() - + "\nlastAddInStack: " + (FragmentUtils.getLastAddFragmentInStack(getFragmentManager()) != null ? FragmentUtils.getLastAddFragmentInStack(getFragmentManager()).getClass().getSimpleName() : "null") - + "\ntopShow: " + FragmentUtils.getTopShowFragment(getFragmentManager()).getClass().getSimpleName() - + "\ntopShowInStack: " + (FragmentUtils.getTopShowFragmentInStack(getFragmentManager()) != null ? FragmentUtils.getTopShowFragmentInStack(getFragmentManager()).getClass().getSimpleName() : "null") - + "\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_hide: - FragmentUtils.addFragment(getFragmentManager(), Demo1Fragment.newInstance(), R.id.fragment_container, true, true); - break; - case R.id.btn_add_show: - FragmentUtils.addFragment(getFragmentManager(), Demo1Fragment.newInstance(), R.id.fragment_container, false, true); - break; - case R.id.btn_add_child: - FragmentUtils.addFragment(getChildFragmentManager(), Demo2Fragment.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(), Demo2Fragment.newInstance(), R.id.fragment_container, true, new FragmentUtils.SharedElement(this.btnShowAboutFragment, "btnShowAboutFragment")); - break; - case R.id.btn_hide_show: - Fragment fragment1 = FragmentUtils.findFragment(getFragmentManager(), Demo1Fragment.class); - if (fragment1 != null) { - FragmentUtils.hideShowFragment(this, fragment1); - } else { - ToastUtils.showLong("please add demo1 first!"); - } - break; - case R.id.btn_replace: - Demo0Fragment demo0Fragment = Demo0Fragment.newInstance(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - demo0Fragment.setSharedElementEnterTransition(new DetailTransition()); - setExitTransition(new Fade()); - demo0Fragment.setEnterTransition(new Fade()); - demo0Fragment.setSharedElementReturnTransition(new DetailTransition()); - } - ((FragmentActivity) getActivity()).rootFragment = FragmentUtils.replaceFragment(this, demo0Fragment, false, new FragmentUtils.SharedElement(ivSharedElement, getString(R.string.fragment_transition))); - break; - } - } - - @Override - public boolean onBackClick() { -// FragmentUtils.popToFragment(getFragmentManager(), Demo1Fragment.class, true); - return false; - } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/fragment/StatusBarAlphaFragment.java b/app/src/main/java/com/blankj/androidutilcode/fragment/StatusBarAlphaFragment.java deleted file mode 100644 index 77b1a2ecfd..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/fragment/StatusBarAlphaFragment.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.blankj.androidutilcode.fragment; - -import android.content.Context; -import android.os.Bundle; -import android.view.View; - -import com.blankj.androidutilcode.R; -import com.blankj.androidutilcode.base.BaseFragment; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2017/07/01 - * desc : - *- */ -public class StatusBarAlphaFragment extends BaseFragment { - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.fragment_status_bar_alpha; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - - } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/fragment/StatusBarColorFragment.java b/app/src/main/java/com/blankj/androidutilcode/fragment/StatusBarColorFragment.java deleted file mode 100644 index 2612697372..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/fragment/StatusBarColorFragment.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.blankj.androidutilcode.fragment; - -import android.content.Context; -import android.os.Bundle; -import android.view.View; - -import com.blankj.androidutilcode.R; -import com.blankj.androidutilcode.base.BaseFragment; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2017/07/01 - * desc : - *- */ -public class StatusBarColorFragment extends BaseFragment { - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.fragment_status_bar_color; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - - } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/fragment/StatusBarImageViewFragment.java b/app/src/main/java/com/blankj/androidutilcode/fragment/StatusBarImageViewFragment.java deleted file mode 100644 index b658f2064e..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/fragment/StatusBarImageViewFragment.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.blankj.androidutilcode.fragment; - -import android.content.Context; -import android.os.Bundle; -import android.view.View; - -import com.blankj.androidutilcode.R; -import com.blankj.androidutilcode.base.BaseFragment; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2017/07/01 - * desc : - *- */ -public class StatusBarImageViewFragment extends BaseFragment { - @Override - public void initData(Bundle bundle) { - - } - - @Override - public int bindLayout() { - return R.layout.fragment_status_bar_image_view; - } - - @Override - public void initView(Bundle savedInstanceState, View view) { - - } - - @Override - public void doBusiness(Context context) { - - } - - @Override - public void onWidgetClick(View view) { - - } -} diff --git a/app/src/main/java/com/blankj/androidutilcode/span/BlurMaskFilterSpan.java b/app/src/main/java/com/blankj/androidutilcode/span/BlurMaskFilterSpan.java deleted file mode 100644 index 01b57ebd5a..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/span/BlurMaskFilterSpan.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.blankj.androidutilcode.span; - -import android.graphics.BlurMaskFilter; -import android.graphics.MaskFilter; -import android.text.TextPaint; -import android.text.style.CharacterStyle; -import android.text.style.UpdateAppearance; - -public class BlurMaskFilterSpan extends CharacterStyle implements UpdateAppearance { - - private static final String TAG = "MutableBlurMaskFilterSpan"; - 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); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/blankj/androidutilcode/span/ForegroundAlphaColorSpan.java b/app/src/main/java/com/blankj/androidutilcode/span/ForegroundAlphaColorSpan.java deleted file mode 100644 index 8db630603f..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/span/ForegroundAlphaColorSpan.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.blankj.androidutilcode.span; - -import android.graphics.Color; -import android.support.annotation.ColorInt; -import android.text.TextPaint; -import android.text.style.CharacterStyle; -import android.text.style.UpdateAppearance; - -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/span/ForegroundAlphaColorSpanGroup.java b/app/src/main/java/com/blankj/androidutilcode/span/ForegroundAlphaColorSpanGroup.java deleted file mode 100644 index 88fd6a3f12..0000000000 --- a/app/src/main/java/com/blankj/androidutilcode/span/ForegroundAlphaColorSpanGroup.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.blankj.androidutilcode.span; - -import java.util.ArrayList; - -/** - *
- * author: Blankj - * blog : http://blankj.com - * time : 2017/06/11 - * desc : - *- */ -public class ForegroundAlphaColorSpanGroup { - - private final float mAlpha; - - private final ArrayList
- * author: Blankj - * blog : http://blankj.com - * time : 17/02/21 - * desc : - *- */ -@TargetApi(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/res/drawable/bg_bar.png b/app/src/main/res/drawable/bg_bar.png deleted file mode 100644 index ab8065f49a..0000000000 Binary files a/app/src/main/res/drawable/bg_bar.png and /dev/null differ diff --git a/app/src/main/res/drawable/ic_dashboard_black_24dp.xml b/app/src/main/res/drawable/ic_dashboard_black_24dp.xml deleted file mode 100644 index 4d27062d08..0000000000 --- a/app/src/main/res/drawable/ic_dashboard_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ -
+ * 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
+ * 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
+ * author: blankj + * blog : http://blankj.com + * time : 2019/11/22 + * desc : + *+ */ +class TaskDurationUtils { + + static List
+ * 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/feature/main/app/.gitignore b/feature/main/app/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/feature/main/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/feature/main/app/build.gradle b/feature/main/app/build.gradle new file mode 100644 index 0000000000..e69de29bb2 diff --git a/feature/main/app/proguard-rules.pro b/feature/main/app/proguard-rules.pro new file mode 100644 index 0000000000..f1b424510d --- /dev/null +++ b/feature/main/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/feature/main/app/src/main/AndroidManifest.xml b/feature/main/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..bb8c3398d4 --- /dev/null +++ b/feature/main/app/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + +
+ * author: Blankj + * blog : http://blankj.com + * time : 2016/10/12 + * desc : + *+ */ +public class MainApp extends CommonApplication { + + private static MainApp sInstance; + + public static MainApp getInstance() { + return sInstance; + } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + } + + @Override + public void onCreate() { + super.onCreate(); + sInstance = this; + } +} + + diff --git a/feature/main/pkg/.gitignore b/feature/main/pkg/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/feature/main/pkg/.gitignore @@ -0,0 +1 @@ +/build diff --git a/feature/main/pkg/build.gradle b/feature/main/pkg/build.gradle new file mode 100644 index 0000000000..e69de29bb2 diff --git a/feature/main/pkg/proguard-rules.pro b/feature/main/pkg/proguard-rules.pro new file mode 100644 index 0000000000..f1b424510d --- /dev/null +++ b/feature/main/pkg/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/feature/main/pkg/src/main/AndroidManifest.xml b/feature/main/pkg/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..1cfdba8f69 --- /dev/null +++ b/feature/main/pkg/src/main/AndroidManifest.xml @@ -0,0 +1,13 @@ +
+ * author: Blankj + * blog : http://blankj.com + * time : 2019/07/10 + * desc : + *+ */ +@ApiUtils.Api(isMock = true) +public class SubUtilApiMock extends SubUtilApi { + + @Override + public void startSubUtilActivity(Context context) { + ToastUtils.showShort("startSubUtilActivity"); + } + +} diff --git a/feature/mock/src/main/java/com/blankj/mock/utilcode/UtilCodeApiMock.java b/feature/mock/src/main/java/com/blankj/mock/utilcode/UtilCodeApiMock.java new file mode 100644 index 0000000000..df22cbf92a --- /dev/null +++ b/feature/mock/src/main/java/com/blankj/mock/utilcode/UtilCodeApiMock.java @@ -0,0 +1,32 @@ +package com.blankj.mock.utilcode; + +import android.content.Context; + +import com.blankj.utilcode.export.api.UtilCodeApi; +import com.blankj.utilcode.util.ApiUtils; +import com.blankj.utilcode.util.ToastUtils; + +/** + *
+ * author: Blankj + * blog : http://blankj.com + * time : 2019/07/10 + * desc : + *+ */ +@ApiUtils.Api(isMock = true) +public class UtilCodeApiMock extends UtilCodeApi { + + @Override + public void startUtilCodeActivity(Context context) { + ToastUtils.showShort("startUtilCodeActivity"); + } + + @Override + public void testCallback(Callback callback) { + if (callback != null) { + callback.call(); + } + } + +} diff --git a/feature/subutil/app/.gitignore b/feature/subutil/app/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/feature/subutil/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/feature/subutil/app/build.gradle b/feature/subutil/app/build.gradle new file mode 100644 index 0000000000..e69de29bb2 diff --git a/feature/subutil/app/proguard-rules.pro b/feature/subutil/app/proguard-rules.pro new file mode 100644 index 0000000000..f1b424510d --- /dev/null +++ b/feature/subutil/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/feature/subutil/app/src/main/AndroidManifest.xml b/feature/subutil/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..2989dbfebf --- /dev/null +++ b/feature/subutil/app/src/main/AndroidManifest.xml @@ -0,0 +1,27 @@ + +
+ * author: Blankj + * blog : http://blankj.com + * time : 2019/06/09 + * desc : + *+ */ +public abstract class SubUtilApi extends ApiUtils.BaseApi { + + public abstract void startSubUtilActivity(Context context); + +} diff --git a/feature/subutil/pkg/.gitignore b/feature/subutil/pkg/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/feature/subutil/pkg/.gitignore @@ -0,0 +1 @@ +/build diff --git a/feature/subutil/pkg/build.gradle b/feature/subutil/pkg/build.gradle new file mode 100644 index 0000000000..e69de29bb2 diff --git a/feature/subutil/pkg/proguard-rules.pro b/feature/subutil/pkg/proguard-rules.pro new file mode 100644 index 0000000000..f1b424510d --- /dev/null +++ b/feature/subutil/pkg/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/feature/subutil/pkg/src/main/AndroidManifest.xml b/feature/subutil/pkg/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..198eb5c31b --- /dev/null +++ b/feature/subutil/pkg/src/main/AndroidManifest.xml @@ -0,0 +1,55 @@ +
+ * 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
+ * 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 @@ +
+ * 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
+ * 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
+ * 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
+ * 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
+ * author: blankj + * blog : http://blankj.com + * time : 2019/11/26 + * desc : + *+ */ +public class MvpPresenter extends BasePresenter
+ * author: blankj + * blog : http://blankj.com + * time : 2019/11/26 + * desc : + *+ */ +public class MvpView extends BaseView
+ * 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