Full Code of Blankj/AndroidUtilCode for AI

master 7b4caf9e5440 cached
661 files
3.0 MB
817.9k tokens
5093 symbols
1 requests
Download .txt
Showing preview only (3,270K chars total). Download the full file or copy to clipboard to get everything.
Repository: Blankj/AndroidUtilCode
Branch: master
Commit: 7b4caf9e5440
Files: 661
Total size: 3.0 MB

Directory structure:
gitextract_m5v2g_mv/

├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── bug_report_cn.md
│   │   ├── feature-request.md
│   │   └── feature-request_cn.md
│   └── workflows/
│       └── android.yml
├── .gitignore
├── CHANGELOG.md
├── LICENSE
├── README-CN.md
├── README.md
├── build.gradle
├── buildApp.gradle
├── buildCommon.gradle
├── buildLib.gradle
├── buildSrc/
│   ├── .gitignore
│   ├── build.gradle
│   ├── settings.gradle
│   └── src/
│       └── main/
│           ├── groovy/
│           │   ├── Config.groovy
│           │   ├── ConfigUtils.groovy
│           │   ├── GLog.groovy
│           │   ├── LibConfig.groovy
│           │   ├── ModuleConfig.groovy
│           │   ├── PluginConfig.groovy
│           │   └── TaskDurationUtils.groovy
│           └── java/
│               └── com/
│                   └── blankj/
│                       └── plugin/
│                           └── readme/
│                               ├── FormatUtils.groovy
│                               ├── ReadmeCorePlugin.groovy
│                               ├── ReadmeExtension.groovy
│                               └── ReadmeSubPlugin.groovy
├── config/
│   ├── flavor.gradle
│   └── publish.gradle
├── feature/
│   ├── launcher/
│   │   └── app/
│   │       ├── .gitignore
│   │       ├── build.gradle
│   │       ├── proguard-rules.pro
│   │       └── src/
│   │           └── main/
│   │               ├── AndroidManifest.xml
│   │               └── java/
│   │                   └── com/
│   │                       └── blankj/
│   │                           └── launcher/
│   │                               └── app/
│   │                                   └── LauncherApp.java
│   ├── main/
│   │   ├── app/
│   │   │   ├── .gitignore
│   │   │   ├── build.gradle
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           └── java/
│   │   │               └── com/
│   │   │                   └── blankj/
│   │   │                       └── main/
│   │   │                           └── app/
│   │   │                               └── MainApp.java
│   │   └── pkg/
│   │       ├── .gitignore
│   │       ├── build.gradle
│   │       ├── proguard-rules.pro
│   │       └── src/
│   │           └── main/
│   │               ├── AndroidManifest.xml
│   │               ├── java/
│   │               │   └── com/
│   │               │       └── blankj/
│   │               │           └── main/
│   │               │               └── pkg/
│   │               │                   ├── MainActivity.kt
│   │               │                   └── SplashActivity.kt
│   │               └── res/
│   │                   ├── layout/
│   │                   │   └── activity_main.xml
│   │                   └── values/
│   │                       └── strings.xml
│   ├── mock/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           └── java/
│   │               └── com/
│   │                   └── blankj/
│   │                       └── mock/
│   │                           ├── subutil/
│   │                           │   └── SubUtilApiMock.java
│   │                           └── utilcode/
│   │                               └── UtilCodeApiMock.java
│   ├── subutil/
│   │   ├── app/
│   │   │   ├── .gitignore
│   │   │   ├── build.gradle
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           └── java/
│   │   │               └── com/
│   │   │                   └── blankj/
│   │   │                       └── subutil/
│   │   │                           └── app/
│   │   │                               └── SubUtilApp.kt
│   │   ├── export/
│   │   │   ├── .gitignore
│   │   │   ├── build.gradle
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           └── java/
│   │   │               └── com/
│   │   │                   └── blankj/
│   │   │                       └── subutil/
│   │   │                           └── export/
│   │   │                               └── api/
│   │   │                                   └── SubUtilApi.java
│   │   └── pkg/
│   │       ├── .gitignore
│   │       ├── build.gradle
│   │       ├── proguard-rules.pro
│   │       └── src/
│   │           └── main/
│   │               ├── AndroidManifest.xml
│   │               ├── java/
│   │               │   └── com/
│   │               │       └── blankj/
│   │               │           └── subutil/
│   │               │               └── pkg/
│   │               │                   ├── Config.kt
│   │               │                   ├── SubUtilApiImpl.java
│   │               │                   └── feature/
│   │               │                       ├── SubUtilActivity.kt
│   │               │                       ├── appStore/
│   │               │                       │   └── AppStoreActivity.kt
│   │               │                       ├── battery/
│   │               │                       │   └── BatteryActivity.kt
│   │               │                       ├── country/
│   │               │                       │   └── CountryActivity.kt
│   │               │                       ├── dangerous/
│   │               │                       │   └── DangerousActivity.kt
│   │               │                       ├── location/
│   │               │                       │   ├── LocationActivity.kt
│   │               │                       │   └── LocationService.kt
│   │               │                       └── pinyin/
│   │               │                           └── PinyinActivity.kt
│   │               └── res/
│   │                   └── values/
│   │                       └── strings.xml
│   └── utilcode/
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       └── main/
│       │           ├── AndroidManifest.xml
│       │           └── java/
│       │               └── com/
│       │                   └── blankj/
│       │                       └── utilcode/
│       │                           └── app/
│       │                               └── UtilCodeApp.kt
│       ├── export/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       └── main/
│       │           ├── AndroidManifest.xml
│       │           └── java/
│       │               └── com/
│       │                   └── blankj/
│       │                       └── utilcode/
│       │                           └── export/
│       │                               └── api/
│       │                                   └── UtilCodeApi.java
│       └── pkg/
│           ├── .gitignore
│           ├── build.gradle
│           ├── proguard-rules.pro
│           └── src/
│               └── main/
│                   ├── AndroidManifest.xml
│                   ├── assets/
│                   │   └── test/
│                   │       ├── sub/
│                   │       │   └── test.txt
│                   │       └── test.txt
│                   ├── java/
│                   │   └── com/
│                   │       └── blankj/
│                   │           └── utilcode/
│                   │               └── pkg/
│                   │                   ├── Config.kt
│                   │                   ├── UtilCodeApiImpl.java
│                   │                   ├── feature/
│                   │                   │   ├── CoreUtilActivity.kt
│                   │                   │   ├── activity/
│                   │                   │   │   ├── ActivityActivity.kt
│                   │                   │   │   └── SubActivityActivity.kt
│                   │                   │   ├── adaptScreen/
│                   │                   │   │   ├── AdaptCloseActivity.kt
│                   │                   │   │   ├── AdaptHeightActivity.kt
│                   │                   │   │   ├── AdaptScreenActivity.kt
│                   │                   │   │   └── AdaptWidthActivity.kt
│                   │                   │   ├── api/
│                   │                   │   │   ├── ApiActivity.kt
│                   │                   │   │   └── other/
│                   │                   │   │       ├── export/
│                   │                   │   │       │   └── OtherModuleApi.java
│                   │                   │   │       └── pkg/
│                   │                   │   │           └── OtherPkgApiImpl.java
│                   │                   │   ├── app/
│                   │                   │   │   └── AppActivity.kt
│                   │                   │   ├── bar/
│                   │                   │   │   ├── BarActivity.kt
│                   │                   │   │   ├── nav/
│                   │                   │   │   │   └── BarNavActivity.kt
│                   │                   │   │   ├── notification/
│                   │                   │   │   │   └── BarNotificationActivity.kt
│                   │                   │   │   └── status/
│                   │                   │   │       ├── BarStatusActivity.kt
│                   │                   │   │       ├── BarStatusActivityAlpha.kt
│                   │                   │   │       ├── BarStatusActivityColor.kt
│                   │                   │   │       ├── BarStatusActivityCustom.kt
│                   │                   │   │       ├── BarStatusActivityDrawer.kt
│                   │                   │   │       ├── BarStatusActivityImageView.kt
│                   │                   │   │       └── fragment/
│                   │                   │   │           ├── BarStatusFragmentActivity.kt
│                   │                   │   │           ├── BarStatusFragmentAlpha.kt
│                   │                   │   │           ├── BarStatusFragmentColor.kt
│                   │                   │   │           ├── BarStatusFragmentCustom.kt
│                   │                   │   │           └── BarStatusFragmentImageView.kt
│                   │                   │   ├── brightness/
│                   │                   │   │   └── BrightnessActivity.kt
│                   │                   │   ├── bus/
│                   │                   │   │   ├── BusActivity.kt
│                   │                   │   │   └── BusCompareActivity.kt
│                   │                   │   ├── clean/
│                   │                   │   │   └── CleanActivity.kt
│                   │                   │   ├── click/
│                   │                   │   │   └── ClickActivity.kt
│                   │                   │   ├── clipboard/
│                   │                   │   │   └── ClipboardActivity.kt
│                   │                   │   ├── device/
│                   │                   │   │   └── DeviceActivity.kt
│                   │                   │   ├── file/
│                   │                   │   │   └── FileActivity.kt
│                   │                   │   ├── flashlight/
│                   │                   │   │   └── FlashlightActivity.kt
│                   │                   │   ├── fragment/
│                   │                   │   │   ├── ChildFragment.kt
│                   │                   │   │   ├── ContainerFragment.kt
│                   │                   │   │   ├── FragmentActivity.kt
│                   │                   │   │   └── RootFragment.kt
│                   │                   │   ├── image/
│                   │                   │   │   └── ImageActivity.kt
│                   │                   │   ├── intent/
│                   │                   │   │   └── IntentActivity.kt
│                   │                   │   ├── keyboard/
│                   │                   │   │   └── KeyboardActivity.kt
│                   │                   │   ├── language/
│                   │                   │   │   └── LanguageActivity.kt
│                   │                   │   ├── log/
│                   │                   │   │   └── LogActivity.kt
│                   │                   │   ├── messenger/
│                   │                   │   │   ├── MessengerActivity.kt
│                   │                   │   │   └── MessengerRemoteActivity.kt
│                   │                   │   ├── metaData/
│                   │                   │   │   └── MetaDataActivity.kt
│                   │                   │   ├── mvp/
│                   │                   │   │   ├── MvpActivity.java
│                   │                   │   │   ├── MvpModel.java
│                   │                   │   │   ├── MvpMvp.java
│                   │                   │   │   ├── MvpPresenter.java
│                   │                   │   │   └── MvpView.java
│                   │                   │   ├── network/
│                   │                   │   │   └── NetworkActivity.kt
│                   │                   │   ├── notification/
│                   │                   │   │   └── NotificationActivity.kt
│                   │                   │   ├── path/
│                   │                   │   │   └── PathActivity.kt
│                   │                   │   ├── permission/
│                   │                   │   │   └── PermissionActivity.kt
│                   │                   │   ├── phone/
│                   │                   │   │   └── PhoneActivity.kt
│                   │                   │   ├── process/
│                   │                   │   │   └── ProcessActivity.kt
│                   │                   │   ├── reflect/
│                   │                   │   │   ├── ReflectActivity.kt
│                   │                   │   │   └── TestPrivateStaticFinal.java
│                   │                   │   ├── resource/
│                   │                   │   │   └── ResourceActivity.kt
│                   │                   │   ├── rom/
│                   │                   │   │   └── RomActivity.kt
│                   │                   │   ├── screen/
│                   │                   │   │   └── ScreenActivity.kt
│                   │                   │   ├── sdcard/
│                   │                   │   │   └── SDCardActivity.kt
│                   │                   │   ├── shadow/
│                   │                   │   │   └── ShadowActivity.kt
│                   │                   │   ├── snackbar/
│                   │                   │   │   └── SnackbarActivity.kt
│                   │                   │   ├── spStatic/
│                   │                   │   │   └── SPStaticActivity.kt
│                   │                   │   ├── span/
│                   │                   │   │   └── SpanActivity.kt
│                   │                   │   ├── toast/
│                   │                   │   │   ├── CustomToast.kt
│                   │                   │   │   └── ToastActivity.kt
│                   │                   │   ├── uiMessage/
│                   │                   │   │   └── UiMessageActivity.kt
│                   │                   │   ├── vibrate/
│                   │                   │   │   └── VibrateActivity.kt
│                   │                   │   └── volume/
│                   │                   │       └── VolumeActivity.kt
│                   │                   └── helper/
│                   │                       └── DialogHelper.kt
│                   └── res/
│                       ├── anim/
│                       │   ├── fade_in_1000.xml
│                       │   ├── fade_out_1000.xml
│                       │   ├── slide_bottom_in_200.xml
│                       │   ├── slide_bottom_out_200.xml
│                       │   ├── slide_left_out_1000.xml
│                       │   └── slide_right_in_1000.xml
│                       ├── animator/
│                       │   ├── fragment_slide_left_enter.xml
│                       │   ├── fragment_slide_left_exit.xml
│                       │   ├── fragment_slide_right_enter.xml
│                       │   └── fragment_slide_right_exit.xml
│                       ├── drawable/
│                       │   ├── bar_status_custom.xml
│                       │   ├── bar_status_nav_alpha.xml
│                       │   ├── bar_status_nav_color.xml
│                       │   ├── bar_status_nav_custom.xml
│                       │   ├── bar_status_nav_image.xml
│                       │   ├── fragment_nav.xml
│                       │   ├── keyboard_dialog_bg.xml
│                       │   ├── shadow_circle.xml
│                       │   ├── shadow_round_rect.xml
│                       │   ├── snackbar_custom_bg.xml
│                       │   ├── span_block_high.xml
│                       │   ├── span_block_low.xml
│                       │   └── toast_round_rect.xml
│                       ├── layout/
│                       │   ├── activity_adaptscreen.xml
│                       │   ├── activity_item_shared_element_activity.xml
│                       │   ├── activity_sub_activity.xml
│                       │   ├── adaptscreen_close_activity.xml
│                       │   ├── adaptscreen_height_activity.xml
│                       │   ├── adaptscreen_width_activity.xml
│                       │   ├── bar_status_alpha_activity.xml
│                       │   ├── bar_status_alpha_fragment.xml
│                       │   ├── bar_status_color_fragment.xml
│                       │   ├── bar_status_custom_fragment.xml
│                       │   ├── bar_status_drawer_activity.xml
│                       │   ├── bar_status_fragment_activity.xml
│                       │   ├── bar_status_image_view_activity.xml
│                       │   ├── bar_status_image_view_fragment.xml
│                       │   ├── fragment_activity.xml
│                       │   ├── fragment_child.xml
│                       │   ├── fragment_container.xml
│                       │   ├── fragment_dialog.xml
│                       │   ├── fragment_item_shared_element.xml
│                       │   ├── fragment_root.xml
│                       │   ├── keyboard_activity.xml
│                       │   ├── keyboard_dialog.xml
│                       │   ├── mvp_activity.xml
│                       │   ├── screen_dialog.xml
│                       │   ├── shadow_activity.xml
│                       │   ├── snackbar_custom.xml
│                       │   ├── span_activity.xml
│                       │   ├── toast_custom.xml
│                       │   └── toast_dialog.xml
│                       ├── menu/
│                       │   ├── fragment_nav.xml
│                       │   └── status_bar_nav.xml
│                       ├── raw/
│                       │   └── test.txt
│                       ├── transition/
│                       │   ├── explode_1000.xml
│                       │   ├── fade_1000.xml
│                       │   └── slide_1000.xml
│                       ├── values/
│                       │   ├── ids.xml
│                       │   ├── strings.xml
│                       │   └── styles.xml
│                       ├── values-en-rUS/
│                       │   └── strings.xml
│                       └── values-zh-rCN/
│                           └── strings.xml
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── lib/
│   ├── base/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── blankj/
│   │           │           └── base/
│   │           │               ├── BaseActivity.java
│   │           │               ├── BaseApplication.java
│   │           │               ├── BaseFragment.java
│   │           │               ├── IBaseView.java
│   │           │               ├── dialog/
│   │           │               │   ├── BaseDialog.java
│   │           │               │   ├── BaseDialogFragment.java
│   │           │               │   ├── DialogCallback.java
│   │           │               │   └── DialogLayoutCallback.java
│   │           │               ├── mvp/
│   │           │               │   ├── BaseModel.java
│   │           │               │   ├── BasePresenter.java
│   │           │               │   └── BaseView.java
│   │           │               ├── rv/
│   │           │               │   ├── BaseItem.java
│   │           │               │   ├── BaseItemAdapter.java
│   │           │               │   ├── ItemViewHolder.java
│   │           │               │   └── RecycleViewDivider.java
│   │           │               └── view/
│   │           │                   └── EmptyGoneTextView.java
│   │           └── res/
│   │               └── layout/
│   │                   ├── activity_back.xml
│   │                   └── fragment_lazy.xml
│   ├── common/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── assets/
│   │           │   └── test_install
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── blankj/
│   │           │           └── common/
│   │           │               ├── CommonApplication.java
│   │           │               ├── activity/
│   │           │               │   ├── CommonActivity.java
│   │           │               │   ├── CommonActivityDrawerView.java
│   │           │               │   ├── CommonActivityItemsView.java
│   │           │               │   └── CommonActivityTitleView.java
│   │           │               ├── dialog/
│   │           │               │   ├── CommonDialogContent.java
│   │           │               │   └── CommonDialogLoading.java
│   │           │               ├── fragment/
│   │           │               │   └── CommonFragment.java
│   │           │               ├── helper/
│   │           │               │   └── PermissionHelper.kt
│   │           │               ├── item/
│   │           │               │   ├── CommonItem.java
│   │           │               │   ├── CommonItemClick.java
│   │           │               │   ├── CommonItemImage.java
│   │           │               │   ├── CommonItemSeekBar.java
│   │           │               │   ├── CommonItemSwitch.java
│   │           │               │   └── CommonItemTitle.java
│   │           │               └── view/
│   │           │                   └── RotateView.java
│   │           └── res/
│   │               ├── anim/
│   │               │   ├── slide_in_left.xml
│   │               │   ├── slide_in_right.xml
│   │               │   ├── slide_out_left.xml
│   │               │   └── slide_out_right.xml
│   │               ├── drawable/
│   │               │   ├── common_button_bg.xml
│   │               │   ├── common_button_txt_color.xml
│   │               │   ├── common_content_dialog_bg.xml
│   │               │   ├── common_content_dialog_btn_bg.xml
│   │               │   ├── common_item_divider.xml
│   │               │   ├── common_loading_bg.xml
│   │               │   ├── common_rotate_loading.xml
│   │               │   ├── common_scrollbar_thumb.xml
│   │               │   ├── common_seekbar_progress.xml
│   │               │   ├── common_seekbar_thumb.xml
│   │               │   ├── common_splash.xml
│   │               │   ├── main_menu_blog.xml
│   │               │   └── main_menu_github.xml
│   │               ├── drawable-xxhdpi/
│   │               │   ├── common_switch_thumb.xml
│   │               │   └── common_switch_track.xml
│   │               ├── layout/
│   │               │   ├── common_activity_drawer.xml
│   │               │   ├── common_activity_drawer_nav_header.xml
│   │               │   ├── common_activity_title.xml
│   │               │   ├── common_activity_title_stub_no_scroll.xml
│   │               │   ├── common_activity_title_stub_scroll.xml
│   │               │   ├── common_dialog_content.xml
│   │               │   ├── common_dialog_loading.xml
│   │               │   ├── common_item.xml
│   │               │   ├── common_item_title_click.xml
│   │               │   ├── common_item_title_content.xml
│   │               │   ├── common_item_title_image.xml
│   │               │   ├── common_item_title_seekbar.xml
│   │               │   └── common_item_title_switch.xml
│   │               ├── menu/
│   │               │   └── common_drawer.xml
│   │               └── values/
│   │                   ├── colors.xml
│   │                   ├── dimens.xml
│   │                   ├── strings.xml
│   │                   └── styles.xml
│   ├── subutil/
│   │   ├── .gitignore
│   │   ├── README-CN.md
│   │   ├── README.md
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── blankj/
│   │       │               └── subutil/
│   │       │                   └── util/
│   │       │                       ├── AppStoreUtils.java
│   │       │                       ├── BatteryUtils.java
│   │       │                       ├── BitUtils.java
│   │       │                       ├── CameraUtils.java
│   │       │                       ├── CoordinateUtils.java
│   │       │                       ├── CountryUtils.java
│   │       │                       ├── DangerousUtils.java
│   │       │                       ├── GlideUtils.java
│   │       │                       ├── HttpsUtil.java
│   │       │                       ├── LocationUtils.java
│   │       │                       ├── LunarUtils.java
│   │       │                       ├── PinyinUtils.java
│   │       │                       ├── RetrofitUtils.java
│   │       │                       ├── TemperatureUtils.java
│   │       │                       ├── Utils.java
│   │       │                       └── http/
│   │       │                           ├── Chain.java
│   │       │                           ├── ExecutorFactory.java
│   │       │                           ├── Headers.java
│   │       │                           ├── HttpUtils.java
│   │       │                           ├── Interceptor.java
│   │       │                           ├── Request.java
│   │       │                           ├── Response.java
│   │       │                           ├── ResponseCallback.java
│   │       │                           └── SSLConfig.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── blankj/
│   │                       └── subutil/
│   │                           └── util/
│   │                               ├── BaseTest.java
│   │                               ├── CoordinateUtilsTest.java
│   │                               ├── LunarUtilsTest.java
│   │                               ├── TemperatureUtilsTest.java
│   │                               ├── TestConfig.java
│   │                               └── http/
│   │                                   ├── HttpUtilsTest.java
│   │                                   └── UserBean.java
│   ├── utilcode/
│   │   ├── .gitignore
│   │   ├── README-CN.md
│   │   ├── README.md
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── blankj/
│   │       │   │           └── utilcode/
│   │       │   │               ├── constant/
│   │       │   │               │   ├── CacheConstants.java
│   │       │   │               │   ├── MemoryConstants.java
│   │       │   │               │   ├── PermissionConstants.java
│   │       │   │               │   ├── RegexConstants.java
│   │       │   │               │   └── TimeConstants.java
│   │       │   │               └── util/
│   │       │   │                   ├── ActivityUtils.java
│   │       │   │                   ├── AdaptScreenUtils.java
│   │       │   │                   ├── ApiUtils.java
│   │       │   │                   ├── AppUtils.java
│   │       │   │                   ├── ArrayUtils.java
│   │       │   │                   ├── BarUtils.java
│   │       │   │                   ├── BrightnessUtils.java
│   │       │   │                   ├── BusUtils.java
│   │       │   │                   ├── CacheDiskStaticUtils.java
│   │       │   │                   ├── CacheDiskUtils.java
│   │       │   │                   ├── CacheDoubleStaticUtils.java
│   │       │   │                   ├── CacheDoubleUtils.java
│   │       │   │                   ├── CacheMemoryStaticUtils.java
│   │       │   │                   ├── CacheMemoryUtils.java
│   │       │   │                   ├── CleanUtils.java
│   │       │   │                   ├── ClickUtils.java
│   │       │   │                   ├── ClipboardUtils.java
│   │       │   │                   ├── CloneUtils.java
│   │       │   │                   ├── CloseUtils.java
│   │       │   │                   ├── CollectionUtils.java
│   │       │   │                   ├── ColorUtils.java
│   │       │   │                   ├── ConvertUtils.java
│   │       │   │                   ├── CrashUtils.java
│   │       │   │                   ├── DebouncingUtils.java
│   │       │   │                   ├── DeviceUtils.java
│   │       │   │                   ├── DialogUtils.java
│   │       │   │                   ├── EncodeUtils.java
│   │       │   │                   ├── EncryptUtils.java
│   │       │   │                   ├── FileIOUtils.java
│   │       │   │                   ├── FileUtils.java
│   │       │   │                   ├── FlashlightUtils.java
│   │       │   │                   ├── FragmentUtils.java
│   │       │   │                   ├── GsonUtils.java
│   │       │   │                   ├── ImageUtils.java
│   │       │   │                   ├── IntentUtils.java
│   │       │   │                   ├── JsonUtils.java
│   │       │   │                   ├── KeyboardUtils.java
│   │       │   │                   ├── LanguageUtils.java
│   │       │   │                   ├── LogUtils.java
│   │       │   │                   ├── MapUtils.java
│   │       │   │                   ├── MessengerUtils.java
│   │       │   │                   ├── MetaDataUtils.java
│   │       │   │                   ├── NetworkUtils.java
│   │       │   │                   ├── NotificationUtils.java
│   │       │   │                   ├── NumberUtils.java
│   │       │   │                   ├── ObjectUtils.java
│   │       │   │                   ├── PathUtils.java
│   │       │   │                   ├── PermissionUtils.java
│   │       │   │                   ├── PhoneUtils.java
│   │       │   │                   ├── ProcessUtils.java
│   │       │   │                   ├── ReflectUtils.java
│   │       │   │                   ├── RegexUtils.java
│   │       │   │                   ├── ResourceUtils.java
│   │       │   │                   ├── RomUtils.java
│   │       │   │                   ├── SDCardUtils.java
│   │       │   │                   ├── SPStaticUtils.java
│   │       │   │                   ├── SPUtils.java
│   │       │   │                   ├── ScreenUtils.java
│   │       │   │                   ├── ServiceUtils.java
│   │       │   │                   ├── ShadowUtils.java
│   │       │   │                   ├── ShellUtils.java
│   │       │   │                   ├── SizeUtils.java
│   │       │   │                   ├── SnackbarUtils.java
│   │       │   │                   ├── SpanUtils.java
│   │       │   │                   ├── StringUtils.java
│   │       │   │                   ├── ThreadUtils.java
│   │       │   │                   ├── ThrowableUtils.java
│   │       │   │                   ├── TimeUtils.java
│   │       │   │                   ├── ToastUtils.java
│   │       │   │                   ├── TouchUtils.java
│   │       │   │                   ├── UiMessageUtils.java
│   │       │   │                   ├── UriUtils.java
│   │       │   │                   ├── Utils.java
│   │       │   │                   ├── UtilsActivityLifecycleImpl.java
│   │       │   │                   ├── UtilsBridge.java
│   │       │   │                   ├── UtilsFileProvider.java
│   │       │   │                   ├── UtilsTransActivity.java
│   │       │   │                   ├── UtilsTransActivity4MainProcess.java
│   │       │   │                   ├── VibrateUtils.java
│   │       │   │                   ├── ViewUtils.java
│   │       │   │                   ├── VolumeUtils.java
│   │       │   │                   └── ZipUtils.java
│   │       │   └── res/
│   │       │       ├── drawable/
│   │       │       │   └── utils_toast_bg.xml
│   │       │       ├── layout/
│   │       │       │   └── utils_toast_view.xml
│   │       │       ├── values/
│   │       │       │   └── styles.xml
│   │       │       ├── values-v21/
│   │       │       │   └── styles.xml
│   │       │       └── xml/
│   │       │           └── util_code_provider_paths.xml
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── blankj/
│   │           │           └── utilcode/
│   │           │               └── util/
│   │           │                   ├── ApiUtilsTest.java
│   │           │                   ├── ArrayUtilsTest.java
│   │           │                   ├── BaseTest.java
│   │           │                   ├── BusUtilsTest.java
│   │           │                   ├── BusUtilsVsEventBusTest.java
│   │           │                   ├── CacheDiskStaticUtilsTest.java
│   │           │                   ├── CacheDiskUtilsTest.java
│   │           │                   ├── CacheDoubleStaticUtilsTest.java
│   │           │                   ├── CacheDoubleUtilsTest.java
│   │           │                   ├── CacheMemoryStaticUtilsTest.java
│   │           │                   ├── CacheMemoryUtilsTest.java
│   │           │                   ├── CloneUtilsTest.java
│   │           │                   ├── CollectionUtilsTest.java
│   │           │                   ├── ColorUtilsTest.java
│   │           │                   ├── ConvertUtilsTest.java
│   │           │                   ├── EncodeUtilsTest.java
│   │           │                   ├── EncryptUtilsTest.java
│   │           │                   ├── FileIOUtilsTest.java
│   │           │                   ├── FileUtilsTest.java
│   │           │                   ├── GsonUtilsTest.java
│   │           │                   ├── ImageUtilsTest.java
│   │           │                   ├── LogUtilsTest.java
│   │           │                   ├── MapUtilsTest.java
│   │           │                   ├── NumberUtilsTest.java
│   │           │                   ├── ObjectUtilsTest.java
│   │           │                   ├── PathUtilsTest.java
│   │           │                   ├── RegexUtilsTest.java
│   │           │                   ├── StringUtilsTest.java
│   │           │                   ├── TestConfig.java
│   │           │                   ├── ThreadUtilsTest.java
│   │           │                   ├── TimeUtilsTest.java
│   │           │                   ├── UiMessageUtilsTest.java
│   │           │                   ├── ZipUtilsTest.java
│   │           │                   └── reflect/
│   │           │                       ├── PrivateConstructors.java
│   │           │                       ├── ReflectUtilsTest.java
│   │           │                       ├── Test1.java
│   │           │                       ├── Test10.java
│   │           │                       ├── Test2.java
│   │           │                       ├── Test3.java
│   │           │                       ├── Test4.java
│   │           │                       ├── Test5.java
│   │           │                       ├── Test6.java
│   │           │                       ├── Test7.java
│   │           │                       ├── Test8.java
│   │           │                       ├── Test9.java
│   │           │                       ├── TestHierarchicalMethodsBase.java
│   │           │                       ├── TestHierarchicalMethodsSubclass.java
│   │           │                       └── TestPrivateStaticFinal.java
│   │           └── res/
│   │               ├── encrypt/
│   │               │   └── MD5.txt
│   │               ├── file/
│   │               │   ├── GBK.txt
│   │               │   ├── UTF16BE.txt
│   │               │   ├── UTF8.txt
│   │               │   ├── Unicode.txt
│   │               │   └── recuresive/
│   │               │       └── UTF8.txt
│   │               ├── image/
│   │               │   └── ic_launcher.tif
│   │               └── zip/
│   │                   ├── test.txt
│   │                   ├── testDir/
│   │                   │   └── test.txt
│   │                   ├── 测试.txt
│   │                   └── 测试文件夹/
│   │                       └── 测试.txt
│   ├── utildebug/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── blankj/
│   │           │           └── utildebug/
│   │           │               ├── DebugUtils.java
│   │           │               ├── base/
│   │           │               │   ├── drawable/
│   │           │               │   │   └── PolygonDrawable.java
│   │           │               │   ├── rv/
│   │           │               │   │   ├── BaseItem.java
│   │           │               │   │   ├── BaseItemAdapter.java
│   │           │               │   │   ├── ItemViewHolder.java
│   │           │               │   │   └── RecycleViewDivider.java
│   │           │               │   └── view/
│   │           │               │       ├── BaseContentFloatView.java
│   │           │               │       ├── BaseContentView.java
│   │           │               │       ├── BaseFloatView.java
│   │           │               │       ├── EmptyGoneTextView.java
│   │           │               │       ├── FloatEditText.java
│   │           │               │       ├── FloatToast.java
│   │           │               │       ├── FloatViewManager.java
│   │           │               │       ├── SearchEditText.java
│   │           │               │       ├── SwipeRightMenu.java
│   │           │               │       └── listener/
│   │           │               │           ├── OnBackListener.java
│   │           │               │           └── OnRefreshListener.java
│   │           │               ├── config/
│   │           │               │   └── DebugConfig.java
│   │           │               ├── debug/
│   │           │               │   ├── IDebug.java
│   │           │               │   └── tool/
│   │           │               │       ├── AbsToolDebug.java
│   │           │               │       ├── appInfo/
│   │           │               │       │   ├── AppInfoDebug.java
│   │           │               │       │   ├── AppInfoFloatView.java
│   │           │               │       │   └── AppInfoItem.java
│   │           │               │       ├── clearCache/
│   │           │               │       │   └── ClearCacheDebug.java
│   │           │               │       ├── clearStorage/
│   │           │               │       │   └── ClearStorageDebug.java
│   │           │               │       ├── deviceInfo/
│   │           │               │       │   ├── DeviceInfoDebug.java
│   │           │               │       │   ├── DeviceInfoFloatView.java
│   │           │               │       │   └── DeviceInfoItem.java
│   │           │               │       ├── fileExplorer/
│   │           │               │       │   ├── FileContentView.java
│   │           │               │       │   ├── FileExplorerDebug.java
│   │           │               │       │   ├── FileExplorerFloatView.java
│   │           │               │       │   ├── FileItem.java
│   │           │               │       │   ├── image/
│   │           │               │       │   │   └── ImageViewer.java
│   │           │               │       │   ├── sp/
│   │           │               │       │   │   ├── SpItem.java
│   │           │               │       │   │   ├── SpModifyContentView.java
│   │           │               │       │   │   └── SpViewerContentView.java
│   │           │               │       │   └── text/
│   │           │               │       │       └── TextViewer.java
│   │           │               │       ├── logcat/
│   │           │               │       │   └── LogcatDebug.java
│   │           │               │       └── restartApp/
│   │           │               │           └── RestartAppDebug.java
│   │           │               ├── helper/
│   │           │               │   ├── FileHelper.java
│   │           │               │   ├── ImageLoader.java
│   │           │               │   ├── ShadowHelper.java
│   │           │               │   ├── SpHelper.java
│   │           │               │   └── WindowHelper.java
│   │           │               ├── icon/
│   │           │               │   └── DebugIcon.java
│   │           │               └── menu/
│   │           │                   ├── DebugItem.java
│   │           │                   ├── DebugMenu.java
│   │           │                   ├── DebugMenuItem.java
│   │           │                   └── ReminderView.java
│   │           └── res/
│   │               ├── anim/
│   │               │   ├── float_in.xml
│   │               │   └── float_out.xml
│   │               ├── drawable/
│   │               │   ├── du_rotate_refresh.xml
│   │               │   ├── du_sel_et_bg.xml
│   │               │   ├── du_shape_base_float_bg.xml
│   │               │   ├── du_shape_base_float_title_adjust_bg.xml
│   │               │   ├── du_shape_base_float_title_bg.xml
│   │               │   ├── du_shape_base_float_title_close_bg.xml
│   │               │   ├── du_shape_btn.xml
│   │               │   ├── du_shape_divider.xml
│   │               │   ├── du_shape_file_divider.xml
│   │               │   ├── du_shape_input_bg.xml
│   │               │   ├── du_shape_item_menu_bg.xml
│   │               │   ├── du_shape_positive_btn.xml
│   │               │   ├── du_shape_shadow.xml
│   │               │   ├── du_shape_toast.xml
│   │               │   ├── du_switch_thumb.xml
│   │               │   └── du_switch_track.xml
│   │               ├── layout/
│   │               │   ├── du_base_content_float.xml
│   │               │   ├── du_debug_app_info.xml
│   │               │   ├── du_debug_device_info.xml
│   │               │   ├── du_debug_file_explorer.xml
│   │               │   ├── du_debug_file_explorer_image.xml
│   │               │   ├── du_debug_file_explorer_sp.xml
│   │               │   ├── du_debug_file_explorer_sp_modify.xml
│   │               │   ├── du_debug_icon.xml
│   │               │   ├── du_debug_menu.xml
│   │               │   ├── du_float_toast.xml
│   │               │   ├── du_item_base_info.xml
│   │               │   ├── du_item_empty.xml
│   │               │   ├── du_item_file.xml
│   │               │   ├── du_item_menu.xml
│   │               │   ├── du_item_menu_item.xml
│   │               │   ├── du_item_sp.xml
│   │               │   └── du_reminder_view.xml
│   │               ├── values/
│   │               │   ├── colors.xml
│   │               │   ├── dimens.xml
│   │               │   ├── ids.xml
│   │               │   ├── strings.xml
│   │               │   └── styles.xml
│   │               └── values-zh-rCN/
│   │                   └── strings.xml
│   └── utildebug-no-op/
│       ├── .gitignore
│       ├── build.gradle
│       ├── proguard-rules.pro
│       └── src/
│           └── main/
│               ├── AndroidManifest.xml
│               └── java/
│                   └── com/
│                       └── blankj/
│                           └── utildebug/
│                               ├── DebugUtils.java
│                               └── debug/
│                                   └── IDebug.java
├── module_config.gradle
├── module_config.json
├── plugin/
│   ├── api-gradle-plugin/
│   │   ├── .gitignore
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── build.gradle
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── blankj/
│   │       │               └── api/
│   │       │                   ├── ApiClassVisitor.java
│   │       │                   ├── ApiExtension.groovy
│   │       │                   ├── ApiInfo.java
│   │       │                   ├── ApiInject.groovy
│   │       │                   ├── ApiPlugin.groovy
│   │       │                   ├── ApiUtilsClassVisitor.java
│   │       │                   └── Config.groovy
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── blankj/
│   │                       └── api/
│   │                           ├── ApiTest.java
│   │                           └── ApiUtils.java
│   ├── buildSrc-plugin/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── blankj/
│   │                       └── buildSrc/
│   │                           ├── BuildSrcPlugin.groovy
│   │                           └── ModuleCfg.groovy
│   ├── bus-gradle-plugin/
│   │   ├── .gitignore
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── build.gradle
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── blankj/
│   │       │               └── bus/
│   │       │                   ├── BusClassVisitor.java
│   │       │                   ├── BusExtension.groovy
│   │       │                   ├── BusInfo.java
│   │       │                   ├── BusInject.groovy
│   │       │                   ├── BusPlugin.groovy
│   │       │                   ├── BusUtilsClassVisitor.java
│   │       │                   └── Config.groovy
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── blankj/
│   │                       └── bus/
│   │                           ├── BusTest.java
│   │                           └── BusUtils.java
│   └── lib/
│       └── base-transform/
│           ├── .gitignore
│           ├── CHANGELOG.md
│           ├── README.md
│           ├── build.gradle
│           └── src/
│               └── main/
│                   └── java/
│                       └── com/
│                           └── blankj/
│                               └── base_transform/
│                                   ├── BaseTransformCallback.groovy
│                                   ├── BaseTransformConfig.groovy
│                                   ├── BaseTransformPlugin.groovy
│                                   └── util/
│                                       ├── JsonUtils.groovy
│                                       ├── LogUtils.groovy
│                                       └── ZipUtils.java
├── script/
│   ├── gitHelp.sh
│   ├── runDevDebug.sh
│   └── runProductionRelease.sh
├── settings.gradle
└── sign/
    ├── keystore.jks
    └── keystore.properties

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/FUNDING.yml
================================================
# 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


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
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: <!-- e.g. utilcode:1.16.3 or utilcodex:1.16.3 -->
- The device: <!-- e.g. Nexus 5X -->
- The version of device: <!-- API 27 -->

## The code of bug

<!-- e.g. 
```java
CrashUtils.init();
```
-->
```
put your code here
```

## The stack of crash

<!-- e.g. 
```
Caused by: java.lang.NullPointerException: u should init first
   at com.blankj.utilcode.util.Utils.getApp(Utils.java:98)
   at com.blankj.utilcode.util.CrashUtils.<clinit>(CrashUtils.java:55)
   at com.blankj.utilcode.util.CrashUtils.init(CrashUtils.java:168) 
   at com.blankj.androidutilcode.UtilsApp.initCrash(UtilsApp.java:71) 
   at com.blankj.androidutilcode.UtilsApp.onCreate(UtilsApp.java:33) 
```
-->

```
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).


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report_cn.md
================================================
---
name: 提交 Bug
about: 让工具类更完美!
labels: bug
assignees: Blankj

---

## 描述 Bug

简洁地描述下 Bug。

- AndroidUtilCode 的版本:<!-- 例如 utilcode:1.16.3 或 utilcodex:1.16.3(这里面是注释,内容需要放在外面) -->
- 出现 Bug 的设备型号:<!-- 例如 Nexus 5X -->
- 设备的 Android 版本:<!-- 例如 API 27 -->

## 相关代码

<!-- 例如
```java
CrashUtils.init();
```
-->
```
put your code here
```

## 异常堆栈

<!-- 例如
```
Caused by: java.lang.NullPointerException: u should init first
   at com.blankj.utilcode.util.Utils.getApp(Utils.java:98)
   at com.blankj.utilcode.util.CrashUtils.<clinit>(CrashUtils.java:55)
   at com.blankj.utilcode.util.CrashUtils.init(CrashUtils.java:168) 
   at com.blankj.androidutilcode.UtilsApp.initCrash(UtilsApp.java:71) 
   at com.blankj.androidutilcode.UtilsApp.onCreate(UtilsApp.java:33) 
```
-->

```
put the stack of crash here
```

## 截图

如果有的话请添加屏幕截图以帮助解释问题。


## 请删除当前行及以下内容

感谢支持 [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode).


================================================
FILE: .github/ISSUE_TEMPLATE/feature-request.md
================================================
---
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).


================================================
FILE: .github/ISSUE_TEMPLATE/feature-request_cn.md
================================================
---
name: 提交需求
about: 让工具类更健全!
labels: help wanted
assignees: Blankj

---

## 描述需求

简洁地描述下需求。


## 可借鉴的

如果有的话,可以给出一些参考文章、链接、代码


## 请删除当前行及以下内容

感谢支持 [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode).


================================================
FILE: .github/workflows/android.yml
================================================
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


================================================
FILE: .gitignore
================================================
*.iml
__api__.json
__bus__.json
.gradle
local.properties
.idea
.DS_Store
/build
/captures
.externalNativeBuild
/apk
*.phrof
/mavenLocal
/reports
*/reports

================================================
FILE: CHANGELOG.md
================================================
* `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` 新增 点击屏幕空白区域隐藏软键盘,未能成功增加本页目录跳转功能(不支持)


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   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.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: README-CN.md
================================================
[![logo][logo]](https://github.com/Blankj/AndroidUtilCode)

[![frame][frame]](https://github.com/Blankj/AucFrameTemplate)

[![auc][aucSvg]][auc] [![result][apiSvg]][result] [![build][buildSvg]][build] [![License][licenseSvg]][license]

## [README of English][readme]

## About

**[AndroidUtilCode][readme]** :fire: 是一个强大易用的安卓工具类库,它合理地封装了安卓开发中常用的函数,具有完善的 Demo 和单元测试,利用其封装好的 APIs 可以大大提高开发效率,如今它主要包括两部分模块,其一是主工具类模块:**[utilcode][utilcode-cn]**,其中的工具类是开发中常用到的;其二是子工具类模块:**[subutil][subutil-cn]**,它包含的工具类并不是很常用,它的出现是为了防止主工具类的臃肿。 :fire:


## Documentation

### utilcode

* [README of English][utilcode]
* [README of Chinese][utilcode-cn]


### subutil

* [README of English][subutil]
* [README of Chinese][subutil-cn]


## Donations

如果它对你帮助很大,并且你很想支持库的后续开发和维护,那么你可以扫下方二维码随意打赏我,就当是请我喝杯咖啡或是啤酒,我将不胜感激 :-)

![donate][donate]


## Contact

[![Blog][blogSvg]][blog] [![jianshu][jianshuSvg]][jianshu] [![weibo][weiboSvg]][weibo] [![QQGroup][qqgroupSvg]][qqgroup]


## [Change Log][changeLog.md]


## 打个小广告

欢迎加入我的小专栏「**[基你太美](https://xiaozhuanlan.com/Blankj)**」一起学习。


[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png

[frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame_cn.png

[aucSvg]: https://github.com/Blankj/AndroidUtilCode/workflows/Android%20CI/badge.svg?branch=master
[auc]: https://github.com/Blankj/AndroidUtilCode

[apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
[result]: https://android-arsenal.com/result?level=14

[buildSvg]: https://travis-ci.org/Blankj/AndroidUtilCode.svg?branch=master
[build]: https://travis-ci.org/Blankj/AndroidUtilCode

[licenseSvg]: https://img.shields.io/badge/License-Apache--2.0-brightgreen.svg
[license]: https://github.com/Blankj/AndroidUtilCode/blob/master/LICENSE

[readme]: https://github.com/Blankj/AndroidUtilCode
[readme-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md

[utilcode]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README.md
[utilcode-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README-CN.md

[subutil]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/README.md
[subutil-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/README-CN.md

[changeLog.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/CHANGELOG.md

[donate]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/donate.png

[blogSvg]: https://img.shields.io/badge/Blog-@Blankj-34a48e.svg
[blog]: http://blankj.com

[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

[qqgroupSvg]: https://img.shields.io/badge/QQ群-25206533-34a48e.svg
[qqgroup]: https://shang.qq.com/wpa/qunwpa?idkey=d906789f84484465e2736f7b524366b4c23afeda38733d5c7b10fc3f6e406e9b


================================================
FILE: README.md
================================================
[![logo][logo]](https://github.com/Blankj/AndroidUtilCode)

[![frame][frame]](https://github.com/Blankj/AucFrameTemplate)

[![auc][aucSvg]][auc] [![result][apiSvg]][result] [![build][buildSvg]][build] [![License][licenseSvg]][license]

## [README of Chinese][readme-cn]

## About

**[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:


## Documentation

### utilcode

* [README of English][utilcode]
* [README of Chinese][utilcode-cn]


### subutil

* [README of English][subutil]
* [README of Chinese][subutil-cn]


## Donations

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!

![donate][donate]


## Contact

[![Blog][blogSvg]][blog] [![jianshu][jianshuSvg]][jianshu] [![weibo][weiboSvg]][weibo] [![QQGroup][qqgroupSvg]][qqgroup]


## [Change Log][changeLog.md]


## 打个小广告

欢迎加入我的小专栏「**[基你太美](https://xiaozhuanlan.com/Blankj)**」一起学习。


[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png

[frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png

[aucSvg]: https://github.com/Blankj/AndroidUtilCode/workflows/Android%20CI/badge.svg?branch=master
[auc]: https://github.com/Blankj/AndroidUtilCode

[apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
[result]: https://android-arsenal.com/result?level=14

[buildSvg]: https://travis-ci.org/Blankj/AndroidUtilCode.svg?branch=master
[build]: https://travis-ci.org/Blankj/AndroidUtilCode

[licenseSvg]: https://img.shields.io/badge/License-Apache--2.0-brightgreen.svg
[license]: https://github.com/Blankj/AndroidUtilCode/blob/master/LICENSE

[readme]: https://github.com/Blankj/AndroidUtilCode
[readme-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md

[utilcode]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README.md
[utilcode-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README-CN.md

[subutil]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/README.md
[subutil-cn]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/README-CN.md

[changeLog.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/CHANGELOG.md

[donate]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/donate.png

[blogSvg]: https://img.shields.io/badge/Blog-@Blankj-34a48e.svg
[blog]: http://blankj.com

[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

[qqgroupSvg]: https://img.shields.io/badge/QQ群-25206533-34a48e.svg
[qqgroup]: https://shang.qq.com/wpa/qunwpa?idkey=d906789f84484465e2736f7b524366b4c23afeda38733d5c7b10fc3f6e406e9b


================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    ConfigUtils.init(gradle)
    repositories {
        mavenLocal()
        google()
        mavenCentral()
        jcenter()
    }

    dependencies {
        for (def entrySet : ConfigUtils.getApplyPlugins().entrySet()) {
            classpath entrySet.value.path
        }
    }
}

allprojects {
    repositories {
        mavenLocal()
        maven { url "https://jitpack.io" }
        google()
        mavenCentral()
        jcenter()
    }

    configurations.all {
        resolutionStrategy.cacheChangingModulesFor 0, 'seconds'

        resolutionStrategy.eachDependency {
            if (it.requested.group == 'com.android.support' && !it.requested.name.contains(
                    'multidex')) {
                it.useVersion Config.supportVersion
            }
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

================================================
FILE: buildApp.gradle
================================================
apply plugin: "com.android.application"

apply {
    from "${rootDir.path}/buildCommon.gradle"
    from "${rootDir.path}/config/flavor.gradle"
    if (Config.plugins.plugin_api.isApply) {
        plugin Config.plugins.plugin_api.id
    }
    if (Config.plugins.plugin_bus.isApply) {
        plugin Config.plugins.plugin_bus.id
    }
}

configSigning()
configApkName()

//if (PluginConfig.plugin_bus.isApply) {
//    bus {
//        onlyScanLibRegex = '^([:]|(com\\.blankj)).+$'
//    }
//}
//
//if (PluginConfig.plugin_api.isApply) {
//    api {
//        onlyScanLibRegex = '^([:]|(com\\.blankj)).+$'
//    }
//}

android {
    defaultConfig {
        applicationId Config.applicationId + suffix
        targetSdkVersion Config.targetSdkVersion
        multiDexEnabled true
    }

    buildTypes {
        debug {}

        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    packagingOptions {
        exclude 'META-INF/*'
    }

    dexOptions {
        preDexLibraries true
        javaMaxHeapSize "8g"
        maxProcessCount 8
        dexInProcess = true
    }

    productFlavors {
        dev {
            applicationIdSuffix ".dev"
            versionNameSuffix "-dev"
            resValue "string", "app_name", Config.appName + suffix + "-dev"
        }

        production {
            resValue "string", "app_name", Config.appName + suffix
        }
    }
}

dependencies {
    // LeakCanary
    debugImplementation Config.libs.leakcanary.path

    debugImplementation Config.modules.lib_utildebug.dep
    releaseImplementation Config.modules.lib_utildebug_no_op.dep

    // 根据 Config.pkgConfig 来依赖所有 pkg
    for (def entrySet : ConfigUtils.getApplyPkgs().entrySet()) {
        api entrySet.value.dep
    }

    if (Config.modules.feature_mock.isApply) {
        api ModuleConfig.modules.feature_mock.dep
    }
}

def getSuffix() {
    if (project.name == "feature_launcher_app") return ""
    return "." + project.
        name.
        substring("feature_".length(), project.name.length() - "_app".length())
}

def configSigning() {

    File signPropertiesFile = file("${rootDir.path}/sign/keystore.properties")
    if (!signPropertiesFile.exists()) return

    GLog.d("${project.toString()} sign start...")
    project.android {
        Properties properties = new Properties()
        properties.load(new FileInputStream(signPropertiesFile))
        signingConfigs {
            release {
                storeFile new File(signPropertiesFile.getParent(), properties['keystore'])
                storePassword properties['storePassword']
                keyAlias properties['keyAlias']
                keyPassword properties['keyPassword']
            }
        }
        buildTypes.release.signingConfig signingConfigs.release
    }
    GLog.d("${project.toString()} sign end...")
}

def configApkName() {
    project.android.applicationVariants.all { variant ->
        if (variant.buildType.name != "debug") {
            def artifact = variant.getPackageApplicationProvider().get()
            artifact.outputDirectory = new File("${rootDir.path}/apk")
            variant.outputs.each {
                it.outputFileName = "util" + suffix +
                    (variant.flavorName == "" ? "" : ("_" + variant.flavorName)) +
                    "_" +
                    variant.versionName.replace(".", "_") +
                    "_" +
                    variant.buildType.name +
                    ".apk"
            }
        }
    }
}

================================================
FILE: buildCommon.gradle
================================================
apply {
    plugin "kotlin-android"
    plugin "kotlin-android-extensions"
}

android {
    compileSdkVersion Config.compileSdkVersion
    defaultConfig {
        minSdkVersion Config.minSdkVersion
        versionCode Config.versionCode
        versionName Config.versionName
        consumerProguardFiles 'proguard-rules.pro'
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    lintOptions {
        abortOnError false
    }
}

================================================
FILE: buildLib.gradle
================================================
apply plugin: "com.android.library"
apply from: "${rootDir.path}/buildCommon.gradle"

dependencies {
    if (project.name.endsWith("_pkg") || project.name.endsWith("_mock")) {
        // if module's name equals 'pkg', api all of export
        for (def entrySet : ConfigUtils.getApplyExports().entrySet()) {
            api entrySet.value.dep
        }
    } else if (project.name.endsWith("_export")) {
        api Config.modules.lib_common.dep
    }
}

================================================
FILE: buildSrc/.gitignore
================================================
/build


================================================
FILE: buildSrc/build.gradle
================================================
repositories {
    google()
    jcenter()
}

apply {
    plugin 'groovy'
    plugin 'java-gradle-plugin'
}

gradlePlugin {
    plugins {
        readmeCore {
            id = 'readme-core'
            implementationClass = 'com.blankj.plugin.readme.ReadmeCorePlugin'
        }

        readmeSub {
            id = 'readme-sub'
            implementationClass = 'com.blankj.plugin.readme.ReadmeSubPlugin'
        }
    }
}

dependencies {
    implementation gradleApi()
    implementation localGroovy()
    implementation "commons-io:commons-io:2.6"
}

sourceSets {
    main {
        groovy {
            srcDirs += 'src/main/java'
        }
    }
}

================================================
FILE: buildSrc/settings.gradle
================================================
//dependencyResolutionManagement {
//    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
//    repositories {
//        google()
//        mavenCentral()
//        jcenter() // Warning: this repository is going to shut down soon
//    }
//}

================================================
FILE: buildSrc/src/main/groovy/Config.groovy
================================================
class Config {

    static applicationId = 'com.blankj.androidutilcode'
    static appName = 'Util'

    static compileSdkVersion = 29
    static minSdkVersion = 14
    static targetSdkVersion = 29
    static versionCode = 1_031_001
    static versionName = '1.31.1'// E.g. 1.9.72 => 1,009,072

    // lib version
    static gradlePluginVersion = '4.1.0'
    static kotlinVersion = '1.3.72'
    static androidxVersion = '1.0.0'

    static modules = [
            /*Don't delete this line*/
            /*Generated by "module_config.json"*/
            plugin_api_gradle_plugin   : new ModuleConfig(isApply: true , useLocal: true , localPath: "./plugin/api-gradle-plugin"),
            plugin_bus_gradle_plugin   : new ModuleConfig(isApply: true , useLocal: true , localPath: "./plugin/bus-gradle-plugin"),
            plugin_lib_base_transform  : new ModuleConfig(isApply: true , useLocal: true , localPath: "./plugin/lib/base-transform", remotePath: "com.blankj:base-transform:1.0"),
            plugin_buildSrc_plugin     : new ModuleConfig(isApply: true , useLocal: true , localPath: "./plugin/buildSrc-plugin"),
            feature_mock               : new ModuleConfig(isApply: false, useLocal: true , localPath: "./feature/mock"),
            feature_launcher_app       : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/launcher/app"),
            feature_main_app           : new ModuleConfig(isApply: false, useLocal: true , localPath: "./feature/main/app"),
            feature_main_pkg           : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/main/pkg"),
            feature_subutil_app        : new ModuleConfig(isApply: false, useLocal: true , localPath: "./feature/subutil/app"),
            feature_subutil_pkg        : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/subutil/pkg"),
            feature_subutil_export     : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/subutil/export"),
            feature_utilcode_app       : new ModuleConfig(isApply: false, useLocal: true , localPath: "./feature/utilcode/app"),
            feature_utilcode_pkg       : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/utilcode/pkg"),
            feature_utilcode_export    : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/utilcode/export", remotePath: "com.blankj:utilcode-export:1.1"),
            lib_base                   : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/base"),
            lib_common                 : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/common"),
            lib_subutil                : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/subutil"),
            lib_utilcode               : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/utilcode", remotePath: "com.blankj:utilcodex:$Config.versionName"),
            lib_utildebug              : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/utildebug"),
            lib_utildebug_no_op        : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/utildebug-no-op"),
            /*Don't delete this line*/
    ]

    static plugins = [
            plugin_gradle  : new PluginConfig(path: "com.android.tools.build:gradle:$gradlePluginVersion"),
            plugin_kotlin  : new PluginConfig(path: "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"),
            // 上传到 maven
            plugin_maven   : new PluginConfig(path: "com.github.dcendents:android-maven-gradle-plugin:2.1", id: "com.github.dcendents.android-maven"),

            // 上传新版本插件更新 path 中的版本号,并设置 isApply = false
            // 通过 mavenLocal 上传本地版本,设置 isApply = true 即可应用插件来调试,最后通过 bintrayUpload 来发布插件
            plugin_api     : new PluginConfig(isApply: true, useLocal: false, path: "com.blankj:api-gradle-plugin:1.5", id: "com.blankj.api"),
            //./gradlew clean :plugin_api-gradle-plugin:mavenLocal     // 上传到本地 mavenLocal
            //./gradlew clean :plugin_api-gradle-plugin:bintrayUpload  // 上传到 jcenter
            plugin_bus     : new PluginConfig(isApply: true, useLocal: false, path: "com.blankj:bus-gradle-plugin:2.6", id: "com.blankj.bus"),
            //./gradlew clean :plugin_bus-gradle-plugin:mavenLocal     // 上传到本地 mavenLocal
            //./gradlew clean :plugin_bus-gradle-plugin:bintrayUpload  // 上传到 jcenter
            plugin_buildSrc: new PluginConfig(isApply: false, useLocal: false, path: "com.blankj:buildSrc-plugin:1.0", id: "com.blankj.buildSrc"),
            //./gradlew clean :plugin_bus-gradle-plugin:mavenLocal     // 上传到本地 mavenLocal
            //./gradlew clean :plugin_bus-gradle-plugin:bintrayUpload  // 上传到 jcenter
    ]

    static libs = [
            androidx_appcompat : new LibConfig(path: "androidx.appcompat:appcompat:$androidxVersion"),
            androidx_material  : new LibConfig(path: "com.google.android.material:material:$androidxVersion"),
            androidx_multidex  : new LibConfig(path: "androidx.multidex:multidex:2.0.0"),
            androidx_constraint: new LibConfig(path: "androidx.constraintlayout:constraintlayout:1.1.3"),

            kotlin             : new LibConfig(path: "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"),

            leakcanary         : new LibConfig(path: "com.squareup.leakcanary:leakcanary-android:2.1"),

            free_proguard      : new LibConfig(path: "com.blankj:free-proguard:1.0.2"),
            swipe_panel        : new LibConfig(path: "com.blankj:swipe-panel:1.2"),

            gson               : new LibConfig(path: "com.google.code.gson:gson:2.8.5"),
            glide              : new LibConfig(path: "com.github.bumptech.glide:glide:4.7.1"),
            retrofit           : new LibConfig(path: "com.squareup.retrofit2:retrofit:2.4.0"),
            commons_io         : new LibConfig(path: "commons-io:commons-io:2.6"),

            eventbus_lib       : new LibConfig(path: "org.greenrobot:eventbus:3.1.1"),
            eventbus_processor : new LibConfig(path: "org.greenrobot:eventbus-annotation-processor:3.0.1"),

            photo_view         : new LibConfig(path: "com.github.chrisbanes:PhotoView:2.0.0"),

            test_junit         : new LibConfig(path: "junit:junit:4.12"),
            test_robolectric   : new LibConfig(path: "org.robolectric:robolectric:4.3.1"),
    ]
}
//./gradlew clean :lib_utilcode:bintrayUpload

================================================
FILE: buildSrc/src/main/groovy/ConfigUtils.groovy
================================================
import org.gradle.api.Project
import org.gradle.api.ProjectEvaluationListener
import org.gradle.api.ProjectState
import org.gradle.api.invocation.Gradle

/**
 * <pre>
 *     author: blankj
 *     blog  : http://blankj.com
 *     time  : 2019/07/13
 *     desc  :
 * </pre>
 */
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<String, ModuleConfig> entry : Config.modules.entrySet()) {
            def (name, config) = [entry.key, entry.value]
            if (config.useLocal) {
                config.dep = gradle.rootProject.findProject(name)
            } else {
                config.dep = config.remotePath
            }
            configs.put(name, config)
        }
        GLog.l("generateDep = ${GLog.object2String(configs)}")
    }

    private static addCommonGradle(Gradle gradle) {
        gradle.addProjectEvaluationListener(new ProjectEvaluationListener() {
            @Override
            void beforeEvaluate(Project project) {
                // 在 project 的 build.gradle 前 do sth.
                if (project.name.contains("plugin")) {
                    return
                }
                if (project.name.endsWith("_app")) {
                    GLog.l(project.toString() + " applies buildApp.gradle")
                    project.apply {
                        from "${project.rootDir.path}/buildApp.gradle"
                    }
                } else {
                    GLog.l(project.toString() + " applies buildLib.gradle")
                    project.apply {
                        from "${project.rootDir.path}/buildLib.gradle"
                    }
                }
            }

            @Override
            void afterEvaluate(Project project, ProjectState state) {
                // 在 project 的 build.gradle 末 do sth.
            }
        })
    }

    static getApplyPlugins() {
        def plugins = [:]
        for (Map.Entry<String, PluginConfig> entry : Config.plugins.entrySet()) {
            if (entry.value.isApply) {
                plugins.put(entry.key, entry.value)
            }
        }
        GLog.d("getApplyPlugins = ${GLog.object2String(plugins)}")
        return plugins
    }

    static getApplyPkgs() {
        def pkgs = [:]
        for (Map.Entry<String, ModuleConfig> entry : Config.modules.entrySet()) {
            if (entry.value.isApply && entry.key.endsWith("_pkg")) {
                pkgs.put(entry.key, entry.value)
            }
        }
        GLog.d("getApplyPkgs = ${GLog.object2String(pkgs)}")
        return pkgs
    }

    static getApplyExports() {
        def exports = [:]
        for (Map.Entry<String, ModuleConfig> entry : Config.modules.entrySet()) {
            if (entry.value.isApply && entry.key.endsWith("_export")) {
                exports.put(entry.key, entry.value)
            }
        }
        GLog.d("getApplyExports = ${GLog.object2String(exports)}")
        return exports
    }
}


================================================
FILE: buildSrc/src/main/groovy/GLog.groovy
================================================
/**
 * <pre>
 *     author: blankj
 *     blog  : http://blankj.com
 *     time  : 2019/07/13
 *     desc  :
 * </pre>
 */
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<Throwable> throwableList = new ArrayList<>();
            while (throwable != null && !throwableList.contains(throwable)) {
                throwableList.add(throwable);
                throwable = throwable.getCause();
            }
            final int size = throwableList.size();
            final List<String> frames = new ArrayList<>();
            List<String> nextTrace = getStackFrameList(throwableList.get(size - 1));
            for (int i = size; --i >= 0;) {
                final List<String> trace = nextTrace;
                if (i != 0) {
                    nextTrace = getStackFrameList(throwableList.get(i - 1));
                    removeCommonFrames(trace, nextTrace);
                }
                if (i == size - 1) {
                    frames.add(throwableList.get(i).toString());
                } else {
                    frames.add(" Caused by: " + throwableList.get(i).toString());
                }
                frames.addAll(trace);
            }
            StringBuilder sb = new StringBuilder();
            for (final String element : frames) {
                sb.append(element).append(LogConst.LINE_SEP);
            }
            return sb.toString();
        }

        private static List<String> getStackFrameList(final Throwable throwable) {
            final StringWriter sw = new StringWriter();
            final PrintWriter pw = new PrintWriter(sw, true);
            throwable.printStackTrace(pw);
            final String stackTrace = sw.toString();
            final StringTokenizer frames = new StringTokenizer(stackTrace, LogConst.LINE_SEP);
            final List<String> list = new ArrayList<>();
            boolean traceStarted = false;
            while (frames.hasMoreTokens()) {
                final String token = frames.nextToken();
                // Determine if the line starts with <whitespace>at
                final int at = token.indexOf("at");
                if (at != -1 && token.substring(0, at).trim().isEmpty()) {
                    traceStarted = true;
                    list.add(token);
                } else if (traceStarted) {
                    break;
                }
            }
            return list;
        }

        private static void removeCommonFrames(final List<String> causeFrames, final List<String> wrapperFrames) {
            int causeFrameIndex = causeFrames.size() - 1;
            int wrapperFrameIndex = wrapperFrames.size() - 1;
            while (causeFrameIndex >= 0 && wrapperFrameIndex >= 0) {
                // Remove the frame from the cause trace if it is the same
                // as in the wrapper trace
                final String causeFrame = causeFrames.get(causeFrameIndex);
                final String wrapperFrame = wrapperFrames.get(wrapperFrameIndex);
                if (causeFrame.equals(wrapperFrame)) {
                    causeFrames.remove(causeFrameIndex);
                }
                causeFrameIndex--;
                wrapperFrameIndex--;
            }
        }
    }

    static class LogConst {
        static LINE_SEP = System.getProperty("line.separator");
        static BORDER_TOP = "┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────" + LINE_SEP
        static BORDER_LFT = "│ ";
        static BORDER_BTM = "└────────────────────────────────────────────────────────────────────────────────────────────────────────────────" + LINE_SEP

        static final NOTHING = "log nothing";
        static final NULL = "null";
    }
}


================================================
FILE: buildSrc/src/main/groovy/LibConfig.groovy
================================================
class LibConfig {

    String path

    String getGroupId() {
        String[] splits = path.split(":")
        return splits.length == 3 ? splits[0] : null
    }

    String getArtifactId() {
        String[] splits = path.split(":")
        return splits.length == 3 ? splits[1] : null
    }

    String getVersion() {
        String[] splits = path.split(":")
        return splits.length == 3 ? splits[2] : null
    }

    @Override
    String toString() {
        return "LibConfig { path = $path }"
    }

    static String getFlag(boolean b) {
        return b ? "✅" : "❌"
    }
}



================================================
FILE: buildSrc/src/main/groovy/ModuleConfig.groovy
================================================
class ModuleConfig {

    boolean isApply   // 是否应用
    boolean useLocal  // 是否使用本地的
    String localPath  // 本地路径
    String remotePath // 远程路径
    def dep          // 根据条件生成项目最终的依赖项

    String getGroupId() {
        String[] splits = remotePath.split(":")
        return splits.length == 3 ? splits[0] : null
    }

    String getArtifactId() {
        String[] splits = remotePath.split(":")
        return splits.length == 3 ? splits[1] : null
    }

    String getVersion() {
        String[] splits = remotePath.split(":")
        return splits.length == 3 ? splits[2] : null
    }

    @Override
    String toString() {
        return "ModuleConfig { isApply = ${getFlag(isApply)}" +
                ", dep = " + dep +
                " }"
    }

    static String getFlag(boolean b) {
        return b ? "✅" : "❌"
    }
}



================================================
FILE: buildSrc/src/main/groovy/PluginConfig.groovy
================================================
final class PluginConfig {

    boolean isApply = true  // 是否应用
    boolean useLocal        // 是否使用本地的
    String path             // 插件路径
    String id               // 插件 ID

    String getGroupId() {
        String[] splits = path.split(":")
        return splits.length == 3 ? splits[0] : null
    }

    String getArtifactId() {
        String[] splits = path.split(":")
        return splits.length == 3 ? splits[1] : null
    }

    String getVersion() {
        String[] splits = path.split(":")
        return splits.length == 3 ? splits[2] : null
    }

    @Override
    String toString() {
        return "PluginConfig { isApply = ${getFlag(isApply)}" +
                ", useLocal = ${getFlag(useLocal)}" +
                ", path = " + path +
                ", id = " + id +
                " }"
    }

    static String getFlag(boolean b) {
        return b ? "✅" : "❌"
    }
}

================================================
FILE: buildSrc/src/main/groovy/TaskDurationUtils.groovy
================================================
import org.gradle.BuildListener
import org.gradle.BuildResult
import org.gradle.api.Task
import org.gradle.api.execution.TaskExecutionListener
import org.gradle.api.initialization.Settings
import org.gradle.api.invocation.Gradle
import org.gradle.api.tasks.TaskState

import java.text.SimpleDateFormat

/**
 * <pre>
 *     author: blankj
 *     blog  : http://blankj.com
 *     time  : 2019/11/22
 *     desc  :
 * </pre>
 */
class TaskDurationUtils {

    static List<TaskInfo> taskInfoList = []
    static long startMillis

    static init(Gradle grd) {
        startMillis = System.currentTimeMillis()
        grd.addListener(new TaskExecutionListener() {
            @Override
            void beforeExecute(Task task) {
                task.ext.startTime = System.currentTimeMillis()
            }

            @Override
            void afterExecute(Task task, TaskState state) {
                def exeDuration = System.currentTimeMillis() - task.ext.startTime
                if (exeDuration >= 500) {
                    taskInfoList.add(new TaskInfo(task: task, exeDuration: exeDuration))
                }
            }
        })
        grd.addBuildListener(new BuildListener() {
            @Override
            void beforeSettings(Settings settings) {
                super.beforeSettings(settings)
            }

            @Override
            void buildStarted(Gradle gradle) {}

            @Override
            void settingsEvaluated(Settings settings) {}

            @Override
            void projectsLoaded(Gradle gradle) {}

            @Override
            void projectsEvaluated(Gradle gradle) {}

            @Override
            void buildFinished(BuildResult buildResult) {
                if (!taskInfoList.isEmpty()) {
                    Collections.sort(taskInfoList, new Comparator<TaskInfo>() {
                        @Override
                        int compare(TaskInfo t, TaskInfo t1) {
                            return t1.exeDuration - t.exeDuration
                        }
                    })
                    StringBuilder sb = new StringBuilder()
                    int buildSec = (System.currentTimeMillis() - startMillis) / 1000;
                    int m = buildSec / 60;
                    int s = buildSec % 60;
                    def timeInfo = (m == 0 ? "${s}s" : "${m}m ${s}s (${buildSec}s)")
                    sb.append("BUILD FINISHED in $timeInfo\n")
                    taskInfoList.each {
                        sb.append(String.format("%7sms %s\n", it.exeDuration, it.task.path))
                    }
                    def content = sb.toString()
                    GLog.d(content)
                    File file = new File(grd.rootProject.buildDir.getAbsolutePath(),
                            "build_time_records_" + new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + ".txt")
                    file.getParentFile().mkdirs()
                    file.write(content)
                }
            }
        })
    }

    private static class TaskInfo {
        Task task
        long exeDuration
    }
}


================================================
FILE: buildSrc/src/main/java/com/blankj/plugin/readme/FormatUtils.groovy
================================================
package com.blankj.plugin.readme

class FormatUtils {

    static def LINE_SEP = System.getProperty("line.separator")
    static def LONG_SPACE = "                                                                  "

    static def format(File readmeCN) {
        def sb = new StringBuilder(),
            lines = readmeCN.readLines("UTF-8"),
            i = 0,
            size = lines.size()
        for (; i < size; ++i) {
            String line = lines.get(i)
            if (line.contains("* ###")) {
                sb.append(line).append(LINE_SEP)
                        .append("```").append(LINE_SEP)
                def maxLen = 0
                line = lines.get(i += 2)
                // get the max length of space
                for (def j = i; !line.equals("```"); line = lines.get(++j)) {
                    maxLen = Math.max(maxLen, line.replace(" ", "").replace(",", ", ").indexOf(':'))
                }
                line = lines.get(i)
                for (; !line.equals("```"); line = lines.get(++i)) {
                    def noSpaceLine = line.replace(" ", "")
                    def spaceLen = maxLen - line.replace(" ", "").replace(",", ", ").indexOf(':')
                    sb.append(noSpaceLine.substring(0, noSpaceLine.indexOf(':')).replace(",", ", "))
                            .append(LONG_SPACE.substring(0, spaceLen))// add the space
                            .append(': ')
                            .append(line.substring(line.indexOf(':') + 1).trim())
                            .append(LINE_SEP)
                }
                sb.append("```")
            } else {
                sb.append(line)
            }
            sb.append(LINE_SEP)
        }
        readmeCN.write(sb.toString(), "UTF-8")
    }
}


================================================
FILE: buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeCorePlugin.groovy
================================================
package com.blankj.plugin.readme

import org.gradle.api.Plugin
import org.gradle.api.Project

class ReadmeCorePlugin implements Plugin<Project> {

    @Override
    void apply(Project project) {
        project.extensions.create('readme', ReadmeExtension)

        project.task('readmeTask') {
            doLast {
                println "readmeTask start..."

                def ext = project['readme'] as ReadmeExtension
                def readmeCN = ext.readmeCnFile
                def readmeEng = ext.readmeFile

                readmeOfUtilCode2Eng(readmeCN, readmeEng)

                println "readmeTask finished."
            }
        }
    }

    static def readmeOfUtilCode2Eng(File readmeCN, File readmeEng) {
        FormatUtils.format(readmeCN)
        def lines = readmeCN.readLines("UTF-8")
        def sb = new StringBuilder()
        readmeCN.eachLine { line ->
            if (line.contains("* ###")) {
                if (line.contains("UtilsTransActivity")) {
                    sb.append(line)
                } else {
                    String utilsName = line.substring(line.indexOf("[") + 1, line.indexOf("Utils"))
                    sb.append("* ### About ").append(utilsName).append(line.substring(line.indexOf(" -> ")))
                }
            } else if (line.contains(": ") && !line.contains("[")) {
                sb.append(line.substring(0, line.indexOf(':')).trim())
            } else if (line.contains("打个小广告") || line.contains("基你太美")) {
                return
            } else {
                sb.append(line)
            }
            sb.append(FormatUtils.LINE_SEP)
        }
        readmeEng.write(sb.toString(), "UTF-8")
    }
}




================================================
FILE: buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeExtension.groovy
================================================
package com.blankj.plugin.readme

class ReadmeExtension {

    File readmeFile
    File readmeCnFile

}


================================================
FILE: buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeSubPlugin.groovy
================================================
package com.blankj.plugin.readme

import org.gradle.api.Plugin
import org.gradle.api.Project

class ReadmeSubPlugin implements Plugin<Project> {

    @Override
    void apply(Project project) {
        project.extensions.create('readme', ReadmeExtension)

        project.task('readmeTask') {
            doLast {
                println "readmeTask start..."

                def ext = project['readme'] as ReadmeExtension
                def readmeCN = ext.readmeCnFile
                def readmeEng = ext.readmeFile

                readmeOfSubUtil2Eng(readmeCN, readmeEng)

                println "readmeTask finished."
            }
        }
    }

    static def readmeOfSubUtil2Eng(File readmeCN, File readmeEng) {
        FormatUtils.format(readmeCN)
        def lines = readmeCN.readLines("UTF-8"),
            sb = new StringBuilder("## How to use" + FormatUtils.LINE_SEP
                    + FormatUtils.LINE_SEP +
                    "You should copy the following classes which you want to use in your project." + FormatUtils.LINE_SEP),
            i = 3,
            size = lines.size()
        for (; i < size; ++i) {
            String line = lines.get(i)
            if (line.contains("* ###")) {
                String utilsName = line.substring(line.indexOf("[") + 1, line.indexOf("Utils"))
                sb.append("* ### About ").append(utilsName).append(line.substring(line.indexOf(" -> ")))
            } else if (line.contains(": ") && !line.contains("[")) {
                sb.append(line.substring(0, line.indexOf(':')).trim())
            } else {
                sb.append(line)
            }
            sb.append(FormatUtils.LINE_SEP)
        }
        readmeEng.write(sb.toString(), "UTF-8")
    }
}


================================================
FILE: config/flavor.gradle
================================================
android {
    flavorDimensions "env"
    productFlavors {
        dev {
            dimension "env"
        }

        production {
            dimension "env"
        }
    }

    variantFilter { variant ->
        def flavorNames = variant.flavors*.name
        def buildTypeName = variant.buildType.name

        // production 包不允许 debug 构建
        if (flavorNames.contains("production") && buildTypeName.contains("debug")) {
            variant.setIgnore(true)
        }
    }
}

================================================
FILE: config/publish.gradle
================================================
/*
 1. add
    signing.keyId=xx
    signing.password=xx
    signing.secretKeyRingFile=/Users/xx/secring.gpg
    ossrhUsername=xx
    ossrhPassword=xx
    in root local.properties

 2. copy the file to the directory of gradle, and apply the file in the module
 ext {
    groupId = Config.modules.lib_utilcode.groupId
    artifactId = Config.modules.lib_utilcode.artifactId
    version = Config.modules.lib_utilcode.version
    website = "https://github.com/Blankj/AndroidUtilCode"
}
 apply from: "${rootDir.path}/config/publish.gradle"

 3. execute following command to publish
 ./gradlew :xxmodule:publish2Local  -> upload to mavenLocal
 ./gradlew :xxmodule:publish2Remote -> upload to mavenCentral
*/

apply plugin: 'maven-publish'
apply plugin: 'signing'

ext.multiPublishMode = true

File localPropertiesFile = project.rootProject.file("local.properties");
if (!localPropertiesFile.exists()) {
    return
}

Properties properties = new Properties()
properties.load(new FileInputStream(localPropertiesFile))
properties.each { name, value -> ext[name] = value }

afterEvaluate {
    def ext = project.ext
    publishing {
        publications {
            release(MavenPublication) {
                groupId ext.groupId
                artifactId ext.artifactId
                version ext.version

                if (isAndroidEnv(project)) {
                    if (project.ext.multiPublishMode) {
                        artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
                        artifact sourcesJar
                    } else {
                        from project.components.release
                    }
                } else {
                    from project.components.java
                }

                pom {
                    name = ext.artifactId
                    description = ext.artifactId
                    url = ext.website

                    licenses {
                        license {
                            name = 'The Apache Software License, Version 2.0'
                            url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        }
                    }
                    developers {
                        developer {
                            id = ext.ossrhUsername
                            name = ext.ossrhUsername
                        }
                    }
                    scm {
                        url = ext.website
                        connection = ext.website
                        developerConnection = ext.website + ".git"
                    }

                    if (project.ext.multiPublishMode) {
                        withXml {
                            def dependenciesNode = asNode().getAt('dependencies')[0] ?:
                                    asNode().appendNode('dependencies')

                            configurations.api.getDependencies().each {
                                dep -> addDependency(project, dependenciesNode, dep, "compile")
                            }
                            configurations.implementation.getDependencies().each {
                                dep -> addDependency(project, dependenciesNode, dep, "runtime")
                            }
                        }
                    }
                }
            }
        }

        repositories {
            maven {
                // s01 is newest
                def releasesUrl = "https://s01.oss.sonatype.org/content/repositories/releases/"
                def snapshotUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
                url = version.toUpperCase().endsWith('SNAPSHOT') ? snapshotUrl : releasesUrl

                credentials {
                    username ossrhUsername
                    password ossrhPassword
                }
            }
        }
    }

    signing {
        sign publishing.publications
    }
}

private void addDependency(Project project, def dependenciesNode, Dependency dep, String scope) {
    if (dep.group == null || dep.version == null || dep.name == null || dep.name == "unspecified") {
        return
    }

    final dependencyNode = dependenciesNode.appendNode('dependency')
    dependencyNode.appendNode('scope', scope)

    if (dep.version == 'unspecified') {
        // 检测 module 中的 dependencies 是否有源码依赖
        // 如果是源码依赖,而且没有在 config 中配置 remotePath,
        // 那么发布到仓库,其他地方依赖该库时会找不到源码的那个库
        println "publish -> module(unspecified) <${dep.group}:${dep.name}:${dep.version}>"
        if (project.ext.groupId || project.ext.version) {
            throw new GradleException("The module of <" + dep.name + "> should set groupId & version.")
        }
        // 源码依赖,但配置了 remotePath,让 pom 中写入 remotePath
        println("publish -> module(wrapped) <${project.ext.groupId}:${name}:${project.ext.version}>")

        dependencyNode.appendNode('groupId', project.ext.pomGroupID)
        dependencyNode.appendNode('artifactId', dep.name)
        dependencyNode.appendNode('version', project.ext.pomVersion)
    } else {
        dependencyNode.appendNode('groupId', dep.group)
        dependencyNode.appendNode('artifactId', dep.name)
        dependencyNode.appendNode('version', dep.version)
        println("publish -> library <${dep.group}:${dep.name}:${dep.version}>")
    }

    if (!dep.transitive) {
        // In case of non transitive dependency,
        // all its dependencies should be force excluded from them POM file
        final exclusionNode = dependencyNode.appendNode('exclusions').appendNode('exclusion')
        exclusionNode.appendNode('groupId', '*')
        exclusionNode.appendNode('artifactId', '*')
    } else if (!dep.properties.excludeRules.empty) {
        // For transitive with exclusions, all exclude rules should be added to the POM file
        final exclusions = dependencyNode.appendNode('exclusions')
        dep.properties.excludeRules.each { ExcludeRule rule ->
            final exclusionNode = exclusions.appendNode('exclusion')
            exclusionNode.appendNode('groupId', rule.group ?: '*')
            exclusionNode.appendNode('artifactId', rule.module ?: '*')
        }
    }
}

if (isAndroidEnv(project)) {
    // This generates sources.jar
    task sourcesJar(type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.source
    }

    task javadoc(type: Javadoc) {
        source = android.sourceSets.main.java.source
        classpath += configurations.compile
        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    }

    task javadocJar(type: Jar, dependsOn: javadoc) {
        classifier = 'javadoc'
        from javadoc.destinationDir
    }
} else {
    task sourcesJar(type: Jar, dependsOn: classes) {
        classifier = 'sources'
        from sourceSets.main.allSource
    }

    task javadocJar(type: Jar, dependsOn: javadoc) {
        classifier = 'javadoc'
        from javadoc.destinationDir
    }
}

if (project.hasProperty("kotlin")) {
    // Disable creating javadocs
    project.tasks.withType(Javadoc) {
        enabled = false
    }
}

javadoc {
    options {
        encoding "UTF-8"
        charSet 'UTF-8'
        author true
        version project.ext.version
        links "http://docs.oracle.com/javase/7/docs/api"
        title "${project.ext.artifactId} ${project.ext.version}"
    }
}

artifacts {
    archives javadocJar
    archives sourcesJar
}

static def isAndroidEnv(Project project) {
    return project.getPlugins().hasPlugin('com.android.application') || project.getPlugins().hasPlugin('com.android.library')
}

task publish2Local(type: GradleBuild) {
    tasks = ['assemble', 'publishReleasePublicationToMavenLocal']
}

task publish2Remote(type: GradleBuild) {
    tasks = ['assemble', 'publishReleasePublicationToMavenRepository']
}

================================================
FILE: feature/launcher/app/.gitignore
================================================
/build


================================================
FILE: feature/launcher/app/build.gradle
================================================
apply plugin: 'kotlin-kapt'

dependencies {
    kapt Config.libs.eventbus_processor.path
}

================================================
FILE: feature/launcher/app/proguard-rules.pro
================================================
# 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


================================================
FILE: feature/launcher/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.blankj.launcher.app">

    <application
        android:name=".LauncherApp"
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity
            android:name="com.blankj.main.pkg.MainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="user"
            android:theme="@style/SplashTheme"
            android:windowSoftInputMode="stateHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

================================================
FILE: feature/launcher/app/src/main/java/com/blankj/launcher/app/LauncherApp.java
================================================
package com.blankj.launcher.app;

import com.blankj.common.CommonApplication;

/**
 * <pre>
 *     author: Blankj
 *     blog  : http://blankj.com
 *     time  : 2016/10/12
 *     desc  :
 * </pre>
 */
public class LauncherApp extends CommonApplication {

    private static LauncherApp sInstance;

    public static LauncherApp getInstance() {
        return sInstance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        sInstance = this;
    }
}




================================================
FILE: feature/main/app/.gitignore
================================================
/build


================================================
FILE: feature/main/app/build.gradle
================================================


================================================
FILE: feature/main/app/proguard-rules.pro
================================================
# 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


================================================
FILE: feature/main/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.blankj.main.app">

    <application
        android:name="com.blankj.main.app.MainApp"
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <activity
            android:name="com.blankj.main.pkg.MainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="user"
            android:theme="@style/SplashTheme"
            android:windowSoftInputMode="stateHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

================================================
FILE: feature/main/app/src/main/java/com/blankj/main/app/MainApp.java
================================================
package com.blankj.main.app;

import android.content.Context;

import com.blankj.common.CommonApplication;

/**
 * <pre>
 *     author: Blankj
 *     blog  : http://blankj.com
 *     time  : 2016/10/12
 *     desc  :
 * </pre>
 */
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;
    }
}




================================================
FILE: feature/main/pkg/.gitignore
================================================
/build


================================================
FILE: feature/main/pkg/build.gradle
================================================


================================================
FILE: feature/main/pkg/proguard-rules.pro
================================================
# 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


================================================
FILE: feature/main/pkg/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.blankj.main.pkg">

    <application>
        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="user"
            android:theme="@style/SplashTheme"
            android:windowSoftInputMode="stateHidden" />
    </application>

</manifest>


================================================
FILE: feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt
================================================
package com.blankj.main.pkg

import android.graphics.Color
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.ActionBarDrawerToggle
import com.blankj.common.activity.CommonActivity
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
import com.blankj.subutil.export.api.SubUtilApi
import com.blankj.utilcode.export.api.UtilCodeApi
import com.blankj.utilcode.util.ApiUtils
import com.blankj.utilcode.util.BarUtils
import com.blankj.utilcode.util.ClickUtils
import com.blankj.utilcode.util.CollectionUtils
import kotlinx.android.synthetic.main.activity_main.*


/**
 * ```
 * author: Blankj
 * blog  : http://blankj.com
 * time  : 2016/09/29
 * desc  : MainActivity
 * ```
 */
class MainActivity : CommonActivity() {

    override fun isSwipeBack(): Boolean {
        return false
    }

    override fun bindDrawer(): Boolean {
        return true
    }

    override fun bindLayout(): Int {
        return R.layout.activity_main
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        window.setBackgroundDrawable(null)
        super.onCreate(savedInstanceState)
    }

    override fun initView(savedInstanceState: Bundle?, contentView: View?) {
        super.initView(savedInstanceState, contentView)
        setCommonItems(mainRv, CollectionUtils.newArrayList<CommonItem<*>>(
                CommonItemClick(R.string.core_util, true) {
                    ApiUtils.getApi(UtilCodeApi::class.java)?.startUtilCodeActivity(this)
                },
                CommonItemClick(R.string.sub_util, true) {
                    ApiUtils.getApi(SubUtilApi::class.java)?.startSubUtilActivity(this)
                }
        ))

        launcherMainCtl.setExpandedTitleColor(Color.TRANSPARENT)
        setSupportActionBar(launcherMainToolbar)
        val toggle = ActionBarDrawerToggle(this,
                drawerView.mBaseDrawerRootLayout,
                launcherMainToolbar,
                R.string.navigation_drawer_open,
                R.string.navigation_drawer_close)
        drawerView.mBaseDrawerRootLayout.addDrawerListener(toggle)
        toggle.syncState()

        BarUtils.setStatusBarColor4Drawer(drawerView.mBaseDrawerRootLayout, launcherMainFakeStatusBar, Color.TRANSPARENT, false)
        BarUtils.addMarginTopEqualStatusBarHeight(launcherMainToolbar)
    }

    override fun onBackPressed() {
        ClickUtils.back2HomeFriendly("Press again to exit.")
    }
}


================================================
FILE: feature/main/pkg/src/main/java/com/blankj/main/pkg/SplashActivity.kt
================================================
package com.blankj.main.pkg

import com.blankj.common.activity.CommonActivity

class SplashActivity : CommonActivity() {

}

================================================
FILE: feature/main/pkg/src/main/res/layout/activity_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="192dp"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:id="@+id/launcherMainCtl"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="@color/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:padding="@dimen/spacing_16"
                android:scaleType="fitCenter"
                android:src="@mipmap/ic_launcher"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.6" />

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/launcherMainToolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin" />

        </com.google.android.material.appbar.CollapsingToolbarLayout>
    </com.google.android.material.appbar.AppBarLayout>

    <View
        android:id="@+id/launcherMainFakeStatusBar"
        android:layout_width="match_parent"
        android:layout_height="0dp" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/mainRv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>


================================================
FILE: feature/main/pkg/src/main/res/values/strings.xml
================================================
<resources></resources>


================================================
FILE: feature/mock/.gitignore
================================================
/build


================================================
FILE: feature/mock/build.gradle
================================================


================================================
FILE: feature/mock/proguard-rules.pro
================================================
# 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


================================================
FILE: feature/mock/src/main/AndroidManifest.xml
================================================
<manifest package="com.blankj.mock" />

================================================
FILE: feature/mock/src/main/java/com/blankj/mock/subutil/SubUtilApiMock.java
================================================
package com.blankj.mock.subutil;

import android.content.Context;

import com.blankj.subutil.export.api.SubUtilApi;
import com.blankj.utilcode.util.ApiUtils;
import com.blankj.utilcode.util.ToastUtils;

/**
 * <pre>
 *     author: Blankj
 *     blog  : http://blankj.com
 *     time  : 2019/07/10
 *     desc  :
 * </pre>
 */
@ApiUtils.Api(isMock = true)
public class SubUtilApiMock extends SubUtilApi {

    @Override
    public void startSubUtilActivity(Context context) {
        ToastUtils.showShort("startSubUtilActivity");
    }

}


================================================
FILE: feature/mock/src/main/java/com/blankj/mock/utilcode/UtilCodeApiMock.java
================================================
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;

/**
 * <pre>
 *     author: Blankj
 *     blog  : http://blankj.com
 *     time  : 2019/07/10
 *     desc  :
 * </pre>
 */
@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();
        }
    }

}


================================================
FILE: feature/subutil/app/.gitignore
================================================
/build


================================================
FILE: feature/subutil/app/build.gradle
================================================


================================================
FILE: feature/subutil/app/proguard-rules.pro
================================================
# 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


================================================
FILE: feature/subutil/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.blankj.subutil.app">

    <application
        android:name=".SubUtilApp"
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <activity
            android:name="com.blankj.subutil.pkg.feature.SubUtilActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="user"
            android:windowSoftInputMode="stateHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

================================================
FILE: feature/subutil/app/src/main/java/com/blankj/subutil/app/SubUtilApp.kt
================================================
package com.blankj.subutil.app

import android.content.Context
import com.blankj.common.CommonApplication


/**
 * ```
 * author: Blankj
 * blog  : http://blankj.com
 * time  : 2016/10/12
 * desc  : app about utils
 * ```
 */
class SubUtilApp : CommonApplication() {

    companion object {
        var instance: SubUtilApp? = null
            private set
    }

    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(base)
    }

    override fun onCreate() {
        super.onCreate()
        instance = this
    }
}




================================================
FILE: feature/subutil/export/.gitignore
================================================
/build


================================================
FILE: feature/subutil/export/build.gradle
================================================


================================================
FILE: feature/subutil/export/proguard-rules.pro
================================================
# 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


================================================
FILE: feature/subutil/export/src/main/AndroidManifest.xml
================================================
<manifest package="com.blankj.subutil.export" />


================================================
FILE: feature/subutil/export/src/main/java/com/blankj/subutil/export/api/SubUtilApi.java
================================================
package com.blankj.subutil.export.api;

import android.content.Context;

import com.blankj.utilcode.util.ApiUtils;


/**
 * <pre>
 *     author: Blankj
 *     blog  : http://blankj.com
 *     time  : 2019/06/09
 *     desc  :
 * </pre>
 */
public abstract class SubUtilApi extends ApiUtils.BaseApi {

    public abstract void startSubUtilActivity(Context context);

}


================================================
FILE: feature/subutil/pkg/.gitignore
================================================
/build


================================================
FILE: feature/subutil/pkg/build.gradle
================================================


================================================
FILE: feature/subutil/pkg/proguard-rules.pro
================================================
# 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


================================================
FILE: feature/subutil/pkg/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.blankj.subutil.pkg"
    android:sharedUserId="android.uid.shell">

    <!--dangerous-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.SEND_SMS" />

    <uses-permission android:name="android.permission.INSTALL_PACKAGES" /><!--installAppSilent-->
    <uses-permission android:name="android.permission.DELETE_PACKAGES" /><!--uninstallAppSilent-->
    <uses-permission android:name="android.permission.SHUTDOWN" /><!--shutdown-->
    <uses-permission android:name="android.permission.REBOOT" /><!--reboot-->
    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /><!--setMobileDataEnabled-->

    <!-- location -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <application>

        <activity
            android:name=".feature.SubUtilActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.appStore.AppStoreActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.battery.BatteryActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.country.CountryActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.dangerous.DangerousActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.location.LocationActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />

        <service android:name=".feature.location.LocationService" />
        <activity
            android:name=".feature.pinyin.PinyinActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
    </application>

</manifest>


================================================
FILE: feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/Config.kt
================================================
package com.blankj.subutil.pkg

import android.os.Environment
import com.blankj.utilcode.util.Utils

/**
 * ```
 * author: Blankj
 * blog  : http://blankj.com
 * time  : 2017/05/10
 * desc  : config about constants
 * ```
 */
object Config {

    val FILE_SEP = System.getProperty("file.separator")
    val LINE_SEP = System.getProperty("line.separator")
    const val TEST_PKG = "com.blankj.testinstall"
    private val CACHE_PATH: String
    val TEST_APK_PATH: String

    init {
        val cacheDir = Utils.getApp().externalCacheDir
        CACHE_PATH = if (cacheDir != null) {
            cacheDir.absolutePath
        } else {
            Environment.getExternalStorageDirectory().absolutePath
        } + FILE_SEP
        TEST_APK_PATH = CACHE_PATH + "test_install.apk"
    }
}


================================================
FILE: feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/SubUtilApiImpl.java
================================================
package com.blankj.subutil.pkg;

import android.content.Context;

import com.blankj.subutil.export.api.SubUtilApi;
import com.blankj.subutil.pkg.feature.SubUtilActivity;
import com.blankj.utilcode.util.ApiUtils;

/**
 * <pre>
 *     author: Blankj
 *     blog  : http://blankj.com
 *     time  : 2019/07/02
 *     desc  :
 * </pre>
 */
@ApiUtils.Api
public class SubUtilApiImpl extends SubUtilApi {

    @Override
    public void startSubUtilActivity(Context context) {
        SubUtilActivity.Companion.start(context);
    }

}


================================================
FILE: feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/SubUtilActivity.kt
================================================
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<CommonItem<*>> {
        return CollectionUtils.newArrayList(
                CommonItemClick(R.string.demo_app_store, true) {
                    AppStoreActivity.start(this)
                },
                CommonItemClick(R.string.demo_battery, true) {
                    BatteryActivity.start(this)
                },
                CommonItemClick(R.string.demo_country, true) {
                    CountryActivity.start(this)
                },
                CommonItemClick(R.string.demo_dangerous, true) {
                    DangerousActivity.start(this)
                },
                CommonItemClick(R.string.demo_location, true) {
                    LocationActivity.start(this)
                },
                CommonItemClick(R.string.demo_pinyin, true) {
                    PinyinActivity.start(this)
                }
        )
    }
}


================================================
FILE: feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/appStore/AppStoreActivity.kt
================================================
package com.blankj.subutil.pkg.feature.appStore

import android.content.Context
import android.content.Intent
import com.blankj.common.activity.CommonActivity
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
import com.blankj.subutil.pkg.R
import com.blankj.subutil.util.AppStoreUtils
import com.blankj.utilcode.util.ActivityUtils
import com.blankj.utilcode.util.CollectionUtils

/**
 * ```
 * author: Blankj
 * blog  : http://blankj.com
 * time  : 17/02/01
 * desc  : demo about AppStore
 * ```
 */
class AppStoreActivity : CommonActivity() {

    companion object {
        fun start(context: Context) {
            val starter = Intent(context, AppStoreActivity::class.java)
            context.startActivity(starter)
        }
    }

    override fun bindTitleRes(): Int {
        return R.string.demo_app_store
    }

    override fun bindItems(): MutableList<CommonItem<*>> {
        return CollectionUtils.newArrayList(
                CommonItemClick(R.string.app_store_system, true) {
                    AppStoreUtils.getAppStoreIntent("com.tencent.mm").apply {
                        ActivityUtils.startActivity(this)
                    }
                }
        )
    }
}


================================================
FILE: feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/battery/BatteryActivity.kt
================================================
package com.blankj.subutil.pkg.feature.battery

import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.View
import com.blankj.common.activity.CommonActivity
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemTitle
import com.blankj.subutil.pkg.R
import com.blankj.subutil.util.BatteryUtils
import com.blankj.utilcode.util.CollectionUtils
import com.blankj.utilcode.util.ToastUtils

/**
 * ```
 * author: Blankj
 * blog  : http://blankj.com
 * time  : 20/03/31
 * desc  : demo about Battery
 * ```
 */
class BatteryActivity : CommonActivity(), BatteryUtils.OnBatteryStatusChangedListener {

    private val titleItem: CommonItemTitle = CommonItemTitle("", true);

    companion object {
        fun start(context: Context) {
            val starter = Intent(context, BatteryActivity::class.java)
            context.startActivity(starter)
        }
    }

    override fun bindTitleRes(): Int {
        return R.string.demo_battery
    }

    override fun bindItems(): MutableList<CommonItem<*>> {
        return CollectionUtils.newArrayList(titleItem)
    }

    override fun initView(savedInstanceState: Bundle?, contentView: View?) {
        super.initView(savedInstanceState, contentView)
        BatteryUtils.registerBatteryStatusChangedListener(this)
    }

    override fun onBatteryStatusChanged(status: BatteryUtils.Status) {
        titleItem.title = status.toString()
        ToastUtils.showShort(status.toString())
    }

    override fun onDestroy() {
        super.onDestroy()
        BatteryUtils.unregisterBatteryStatusChangedListener(this)
    }
}


================================================
FILE: feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/country/CountryActivity.kt
================================================
package com.blankj.subutil.pkg.feature.country

import android.content.Context
import android.content.Intent
import com.blankj.common.activity.CommonActivity
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemTitle
import com.blankj.subutil.pkg.R
import com.blankj.subutil.util.CountryUtils
import com.blankj.utilcode.util.CollectionUtils

/**
 * ```
 * author: Blankj
 * blog  : http://blankj.com
 * time  : 17/02/01
 * desc  : demo about Country
 * ```
 */
class CountryActivity : CommonActivity() {

    companion object {
        fun start(context: Context) {
            val starter = Intent(context, CountryActivity::class.java)
            context.startActivity(starter)
        }
    }

    override fun bindTitleRes(): Int {
        return R.string.demo_country
    }

    override fun bindItems(): MutableList<CommonItem<*>> {
        return CollectionUtils.newArrayList(
                CommonItemTitle("getCountryCodeBySim", CountryUtils.getCountryCodeBySim("Default")),
                CommonItemTitle("getCountryCodeByLanguage", CountryUtils.getCountryCodeByLanguage("Default")),
                CommonItemTitle("getCountryBySim", CountryUtils.getCountryBySim()),
                CommonItemTitle("getCountryByLanguage", CountryUtils.getCountryByLanguage())
        )
    }
}


================================================
FILE: feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/dangerous/DangerousActivity.kt
================================================
package com.blankj.subutil.pkg.feature.dangerous

import android.content.Context
import android.content.Intent
import com.blankj.common.activity.CommonActivity
import com.blankj.common.helper.PermissionHelper
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
import com.blankj.common.item.CommonItemSwitch
import com.blankj.subutil.pkg.Config
import com.blankj.subutil.pkg.R
import com.blankj.subutil.util.DangerousUtils
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.util.*

/**
 * ```
 * author: Blankj
 * blog  : http://blankj.com
 * time  : 17/02/01
 * desc  : demo about dangerous
 * ```
 */
class DangerousActivity : CommonActivity() {

    companion object {
        fun start(context: Context) {
            PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
                override fun onGranted() {
                    val starter = Intent(context, DangerousActivity::class.java)
                    context.startActivity(starter)
                }

                override fun onDenied() {
                }
            }, PermissionConstants.STORAGE, PermissionConstants.SMS)
        }
    }

    private val listener = object : OnReleasedListener {
        override fun onReleased() {
            if (DangerousUtils.installAppSilent(Config.TEST_APK_PATH)) {
                ToastUtils.showShort(R.string.dangerous_install_successfully)
            } else {
                ToastUtils.showShort(R.string.dangerous_install_unsuccessfully)
            }
        }
    }

    override fun bindTitleRes(): Int {
        return R.string.demo_dangerous
    }

    override fun bindItems(): MutableList<CommonItem<*>> {
        return CollectionUtils.newArrayList(
                CommonItemClick(R.string.dangerous_install_silent) {
                    if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
                        ToastUtils.showShort(R.string.dangerous_app_install_tips)
                    } else {
                        if (!FileUtils.isFileExists(Config.TEST_APK_PATH)) {
                            ReleaseInstallApkTask(listener).execute()
                        } else {
                            listener.onReleased()
                        }
                    }
                },
                CommonItemClick(R.string.dangerous_uninstall_silent) {
                    if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
                        if (DangerousUtils.uninstallAppSilent(Config.TEST_PKG, false)) {
                            ToastUtils.showShort(R.string.dangerous_uninstall_successfully)
                        } else {
                            ToastUtils.showShort(R.string.dangerous_uninstall_unsuccessfully)
                        }
                    } else {
                        ToastUtils.showShort(R.string.dangerous_app_uninstall_tips)
                    }
                },
                CommonItemClick(R.string.dangerous_shutdown) {
                    ToastUtils.showShort(DangerousUtils.shutdown().toString())
                },
                CommonItemClick(R.string.dangerous_reboot) {
                    ToastUtils.showShort(DangerousUtils.reboot().toString())
                },
                CommonItemClick(R.string.dangerous_reboot_to_recovery) {
                    ToastUtils.showShort(DangerousUtils.reboot2Recovery().toString())
                },
                CommonItemClick(R.string.dangerous_reboot_to_bootloader) {
                    ToastUtils.showShort(DangerousUtils.reboot2Bootloader().toString())
                },
                CommonItemSwitch(
                        R.string.dangerous_data_enabled,
                        { NetworkUtils.getMobileDataEnabled() },
                        {
                            if (AppUtils.isAppSystem()) {
                                DangerousUtils.setMobileDataEnabled(it)
                            }
                        }
                ),
                CommonItemClick(R.string.dangerous_send_sms_silent) {
                    DangerousUtils.sendSmsSilent("10000", "sendSmsSilent")
                }
        )
    }
}

class ReleaseInstallApkTask(private val mListener: OnReleasedListener) : ThreadUtils.SimpleTask<Unit>() {

    override fun doInBackground() {
        ResourceUtils.copyFileFromAssets("test_install", Config.TEST_APK_PATH)
    }

    override fun onSuccess(result: Unit) {
        mListener.onReleased()
    }

    fun execute() {
        ThreadUtils.executeByIo(this)
    }
}

interface OnReleasedListener {
    fun onReleased()
}

================================================
FILE: feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationActivity.kt
================================================
package com.blankj.subutil.pkg.feature.location

import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
import android.os.IBinder
import com.blankj.common.activity.CommonActivity
import com.blankj.common.helper.PermissionHelper
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemTitle
import com.blankj.subutil.pkg.R
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.util.CollectionUtils
import com.blankj.utilcode.util.PermissionUtils

/**
 * ```
 * author: Blankj
 * blog  : http://blankj.com
 * time  : 2016/10/13
 * desc  : demo about LocationUtils
 * ```
 */
class LocationActivity : CommonActivity() {

    private var lastLatitude: String = "unknown"
    private var lastLongitude: String = "unknown"
    private var latitude: String = "unknown"
    private var longitude: String = "unknown"
    private var country: String = "unknown"
    private var locality: String = "unknown"
    private var street: String = "unknown"

    companion object {
        fun start(context: Context) {
            PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
                override fun onGranted() {
                    val starter = Intent(context, LocationActivity::class.java)
                    context.startActivity(starter)
                }

                override fun onDenied() {
                }
            }, PermissionConstants.LOCATION)
        }
    }

    private lateinit var mLocationService: LocationService

    private var conn: ServiceConnection = object : ServiceConnection {
        override fun onServiceDisconnected(name: ComponentName) {}

        override fun onServiceConnected(name: ComponentName, service: IBinder) {
            mLocationService = (service as LocationService.LocationBinder).service
            mLocationService.setOnGetLocationListener(object : LocationService.OnGetLocationListener {
                override fun getLocation(lastLatitude: String, lastLongitude: String, latitude: String,
                                         longitude: String, country: String, locality: String, street: String) {
                    this@LocationActivity.apply {
                        this.lastLatitude = lastLatitude
                        this.lastLongitude = lastLongitude
                        this.latitude = latitude
                        this.longitude = longitude
                        this.country = country
                        this.locality = locality
                        this.street = street
                    }
                    runOnUiThread {
                        itemsView.updateItems(bindItems())
                    }
                }
            })
        }
    }

    override fun bindTitleRes(): Int {
        return R.string.demo_location
    }

    override fun bindItems(): MutableList<CommonItem<*>> {
        return CollectionUtils.newArrayList(
                CommonItemTitle("lastLatitude", lastLatitude),
                CommonItemTitle("lastLongitude", lastLongitude),
                CommonItemTitle("latitude", latitude),
                CommonItemTitle("longitude", longitude),
                CommonItemTitle("getCountryName", country),
                CommonItemTitle("getLocality", locality),
                CommonItemTitle("getStreet", street)
        )
    }

    override fun doBusiness() {
        bindService(Intent(this, LocationService::class.java), conn, Context.BIND_AUTO_CREATE)
    }

    override fun onDestroy() {
        unbindService(conn)
        super.onDestroy()
    }
}


================================================
FILE: feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationService.kt
================================================
package com.blankj.subutil.pkg.feature.location

import android.app.Service
import android.content.Intent
import android.location.Location
import android.os.Binder
import android.os.Bundle
import android.os.IBinder
import android.os.Looper

import com.blankj.subutil.util.LocationUtils
import com.blankj.utilcode.util.ToastUtils

/**
 * ```
 * author: Blankj
 * blog  : http://blankj.com
 * time  : 2016/11/21
 * desc  : demo about LocationUtils
 * ```
 */
class LocationService : Service() {

    private var isSuccess: Boolean = false
    private var lastLatitude = "loading..."
    private var lastLongitude = "loading..."
    private var latitude = "loading..."
    private var longitude = "loading..."
    private var country = "loading..."
    private var locality = "loading..."
    private var street = "loading..."

    private var mOnGetLocationListener: OnGetLocationListener? = null

    private val mOnLocationChangeListener = object : LocationUtils.OnLocationChangeListener {
        override fun getLastKnownLocation(location: Location) {
            lastLatitude = location.latitude.toString()
            lastLongitude = location.longitude.toString()
            mOnGetLocationListener?.getLocation(lastLatitude, lastLongitude, latitude, longitude, country, locality, street)
        }

        override fun onLocationChanged(location: Location) {
            latitude = location.latitude.toString()
            longitude = location.longitude.toString()
            mOnGetLocationListener?.getLocation(lastLatitude, lastLongitude, latitude, longitude, country, locality, street)
            country = LocationUtils.getCountryName(java.lang.Double.parseDouble(latitude), java.lang.Double.parseDouble(longitude))
            locality = LocationUtils.getLocality(java.lang.Double.parseDouble(latitude), java.lang.Double.parseDouble(longitude))
            street = LocationUtils.getStreet(java.lang.Double.parseDouble(latitude), java.lang.Double.parseDouble(longitude))
            mOnGetLocationListener?.getLocation(lastLatitude, lastLongitude, latitude, longitude, country, locality, street)
        }

        override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {}
    }

    fun setOnGetLocationListener(onGetLocationListener: OnGetLocationListener) {
        mOnGetLocationListener = onGetLocationListener
    }

    override fun onCreate() {
        super.onCreate()
        Thread(Runnable {
            Looper.prepare()
            isSuccess = LocationUtils.register(0, 0, mOnLocationChangeListener)
            if (isSuccess) ToastUtils.showShort("init success")
            Looper.loop()
        }).start()
    }

    override fun onBind(intent: Intent): IBinder? {
        return LocationBinder()
    }

    inner class LocationBinder : Binder() {
        val service: LocationService
            get() = this@LocationService
    }

    override fun onDestroy() {
        LocationUtils.unregister()
        // 一定要制空,否则内存泄漏
        mOnGetLocationListener = null
        super.onDestroy()
    }

    /**
     * 获取位置监听器
     */
    interface OnGetLocationListener {
        fun getLocation(
                lastLatitude: String, lastLongitude: String,
                latitude: String, longitude: String,
                country: String, locality: String, street: String
        )
    }
}


================================================
FILE: feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/pinyin/PinyinActivity.kt
================================================
package com.blankj.subutil.pkg.feature.pinyin

import android.content.Context
import android.content.Intent
import com.blankj.common.activity.CommonActivity
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemTitle
import com.blankj.subutil.pkg.R
import com.blankj.subutil.util.PinyinUtils
import com.blankj.utilcode.util.CollectionUtils

/**
 * ```
 * author: Blankj
 * blog  : http://blankj.com
 * time  : 17/02/01
 * desc  : demo about PinyinUtils
 * ```
 */
class PinyinActivity : CommonActivity() {

    companion object {
        fun start(context: Context) {
            val starter = Intent(context, PinyinActivity::class.java)
            context.startActivity(starter)
        }
    }

    override fun bindTitleRes(): Int {
        return R.string.demo_pinyin
    }

    override fun bindItems(): MutableList<CommonItem<*>> {
        val surnames = "乐乘乜仇会便区单参句召员宓弗折曾朴查洗盖祭种秘繁缪能蕃覃解谌适都阿难黑"
        val size = surnames.length
        val sb = StringBuilder("澹台: " + PinyinUtils.getSurnamePinyin("澹台")
                + "\n尉迟: " + PinyinUtils.getSurnamePinyin("尉迟")
                + "\n万俟: " + PinyinUtils.getSurnamePinyin("万俟")
                + "\n单于: " + PinyinUtils.getSurnamePinyin("单于"))
        for (i in 0 until size) {
            val surname = surnames[i].toString()
            sb.append(String.format(
                    "\n%s 正确: %-8s 错误: %-8s",
                    surname,
                    PinyinUtils.getSurnamePinyin(surname),
                    PinyinUtils.ccs2Pinyin(surname)
            ))
        }
        return CollectionUtils.newArrayList(
                CommonItemTitle("汉字转拼音", PinyinUtils.ccs2Pinyin("汉字转拼音", " ")),
                CommonItemTitle("获取首字母", PinyinUtils.getPinyinFirstLetters("获取首字母", " ")),
                CommonItemTitle("测试姓氏", sb.toString())

        )
    }
}

================================================
FILE: feature/subutil/pkg/src/main/res/values/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="demo_app_store">App Store Demo</string>
    <string name="demo_battery">Battery Demo</string>
    <string name="demo_country">Country Demo</string>
    <string name="demo_dangerous">Dangerous Demo</string>
    <string name="demo_location">LocationUtils Demo</string>
    <string name="demo_pinyin">PinyinUtils Demo</string>

    <!--App Store 相关-->
    <string name="app_store_system">Go System App Store In WeChat Page</string>

    <string name="dangerous_install_silent">Install Test App Silently</string>
    <string name="dangerous_uninstall_silent">Uninstall App Silently</string>
    <string name="dangerous_app_install_tips">Test app have installed</string>
    <string name="dangerous_install_successfully">Install successfully</string>
    <string name="dangerous_install_unsuccessfully">Install unsuccessfully</string>
    <string name="dangerous_app_uninstall_tips">Please install test app first</string>
    <string name="dangerous_uninstall_successfully">Uninstall successfully</string>
    <string name="dangerous_uninstall_unsuccessfully">Uninstall unsuccessfully</string>
    <string name="dangerous_shutdown">Shutdown</string>
    <string name="dangerous_reboot">Reboot</string>
    <string name="dangerous_reboot_to_recovery">Reboot To Recovery</string>
    <string name="dangerous_reboot_to_bootloader">Reboot To Bootloader</string>
    <string name="dangerous_send_sms_silent">Send SMS Silent</string>
    <string name="dangerous_data_enabled">Mobile Data Enabled</string>


</resources>

================================================
FILE: feature/utilcode/app/.gitignore
================================================
/build


================================================
FILE: feature/utilcode/app/build.gradle
================================================


================================================
FILE: feature/utilcode/app/proguard-rules.pro
================================================
# 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


================================================
FILE: feature/utilcode/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.blankj.utilcode.app">

    <application
        android:name=".UtilCodeApp"
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <activity
            android:name="com.blankj.utilcode.pkg.feature.CoreUtilActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

================================================
FILE: feature/utilcode/app/src/main/java/com/blankj/utilcode/app/UtilCodeApp.kt
================================================
package com.blankj.utilcode.app

import com.blankj.common.CommonApplication
import com.blankj.utilcode.util.Utils


/**
 * ```
 * author: Blankj
 * blog  : http://blankj.com
 * time  : 2016/10/12
 * desc  : app about utils
 * ```
 */
class UtilCodeApp : CommonApplication() {

    companion object {
        lateinit var instance: UtilCodeApp
            private set
    }

    override fun onCreate() {
        Utils.init(this)
        super.onCreate()
        instance = this
//        BusUtils.register("com.blankj.androidutilcode")
    }
}




================================================
FILE: feature/utilcode/export/.gitignore
================================================
/build


================================================
FILE: feature/utilcode/export/build.gradle
================================================
ext {
    groupId = Config.modules.feature_utilcode_export.groupId
    artifactId = Config.modules.feature_utilcode_export.artifactId
    version = Config.modules.feature_utilcode_export.version
    website = "https://github.com/Blankj/AndroidUtilCode"
}
//apply from: "${rootDir.path}/config/publish.gradle"
//./gradlew :feature_utilcode_export:mavenLocal   // 上传到本地 mavenLocal

================================================
FILE: feature/utilcode/export/proguard-rules.pro
================================================
# 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


================================================
FILE: feature/utilcode/export/src/main/AndroidManifest.xml
================================================
<manifest package="com.blankj.utilcode.export" />


================================================
FILE: feature/utilcode/export/src/main/java/com/blankj/utilcode/export/api/UtilCodeApi.java
================================================
package com.blankj.utilcode.export.api;

import android.content.Context;

import com.blankj.utilcode.util.ApiUtils;


/**
 * <pre>
 *     author: Blankj
 *     blog  : http://blankj.com
 *     time  : 2019/07/01
 *     desc  :
 * </pre>
 */
public abstract class UtilCodeApi extends ApiUtils.BaseApi {

    public abstract void startUtilCodeActivity(Context context);

    public abstract void testCallback(Callback callback);

    public interface Callback {
        void call();
    }

}

================================================
FILE: feature/utilcode/pkg/.gitignore
================================================
/build


================================================
FILE: feature/utilcode/pkg/build.gradle
================================================


================================================
FILE: feature/utilcode/pkg/proguard-rules.pro
================================================
# 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


================================================
FILE: feature/utilcode/pkg/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.blankj.utilcode.pkg">

    <!-- app -->
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />

    <!-- bar -->
    <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

    <!-- 读写内存 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <!-- flashlight -->
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />

    <!-- network -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />

    <!-- permission -->
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

    <!-- phone -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />

    <!-- process -->
    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

    <!-- vibrate -->
    <uses-permission android:name="android.permission.VIBRATE" />

    <application>
        <activity
            android:name=".feature.CoreUtilActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />

        <activity
            android:name=".feature.activity.ActivityActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:icon="@drawable/activity_activity_icon"
            android:launchMode="singleTop"
            android:logo="@drawable/activity_activity_logo" />
        <activity
            android:name=".feature.activity.SubActivityActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.adaptScreen.AdaptScreenActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.adaptScreen.AdaptCloseActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.adaptScreen.AdaptHeightActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.adaptScreen.AdaptWidthActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.api.ApiActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.app.AppActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.bar.BarActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.bar.nav.BarNavActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.bar.notification.BarNotificationActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.bar.status.BarStatusActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.bar.status.BarStatusActivityAlpha"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.bar.status.BarStatusActivityColor"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.bar.status.BarStatusActivityCustom"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.bar.status.BarStatusActivityDrawer"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.bar.status.fragment.BarStatusFragmentActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.bar.status.BarStatusActivityImageView"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.brightness.BrightnessActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.bus.BusActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.bus.BusCompareActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.clean.CleanActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.click.ClickActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.clipboard.ClipboardActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.device.DeviceActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.file.FileActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.flashlight.FlashlightActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.fragment.FragmentActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.image.ImageActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.intent.IntentActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.keyboard.KeyboardActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.language.LanguageActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.log.LogActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.messenger.MessengerActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.messenger.MessengerRemoteActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop"
            android:process=":remote" />
        <activity
            android:name=".feature.metaData.MetaDataActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop">
            <meta-data
                android:name="activity_meta_data"
                android:value="D1234567890123456789012345678901234567890" />
        </activity>
        <activity
            android:name=".feature.mvp.MvpActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.network.NetworkActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.notification.NotificationActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.path.PathActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.permission.PermissionActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.phone.PhoneActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.process.ProcessActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.reflect.ReflectActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.resource.ResourceActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.rom.RomActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.screen.ScreenActivity"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.sdcard.SDCardActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.shadow.ShadowActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.snackbar.SnackbarActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.spStatic.SPStaticActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.span.SpanActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.toast.ToastActivity"
            android:configChanges="orientation|keyboardHidden|screenSize" />
        <activity
            android:name=".feature.uiMessage.UiMessageActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.vibrate.VibrateActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".feature.volume.VolumeActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:launchMode="singleTop" />

        <meta-data
            android:name="app_meta_data"
            android:value="AppMetaData" />
    </application>

</manifest>


================================================
FILE: feature/utilcode/pkg/src/main/assets/test/sub/test.txt
================================================
1st line
2nd line

================================================
FILE: feature/utilcode/pkg/src/main/assets/test/test.txt
================================================
1st line
2nd line

================================================
FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/Config.kt
================================================
package com.blankj.utilcode.pkg

import com.blankj.utilcode.util.PathUtils

/**
 * ```
 * author: Blankj
 * blog  : http://blankj.com
 * time  : 2017/05/10
 * desc  : config about constants
 * ```
 */
object Config {
    val FILE_SEP = System.getProperty("file.separator")
    val LINE_SEP = System.getProperty("line.separator")
    const val TEST_PKG = "com.blankj.testinstall"
    val CACHE_PATH = PathUtils.getCachePathExternalFirst() + FILE_SEP
    val TEST_APK_PATH: String = CACHE_PATH + "test_install.apk"
}


================================================
FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/UtilCodeApiImpl.java
================================================
package com.blankj.utilcode.pkg;

import android.content.Context;

import com.blankj.utilcode.export.api.UtilCodeApi;
import com.blankj.utilcode.pkg.feature.CoreUtilActivity;
import com.blankj.utilcode.util.ApiUtils;

/**
 * <pre>
 *     author: Blankj
 *     blog  : http://blankj.com
 *     time  : 2019/07/01
 *     desc  :
 * </pre>
 */
@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();
        }
    }
}


================================================
FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/CoreUtilActivity.kt
================================================
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<CommonItem<*>> {
        return CollectionUtils.newArrayList(
                CommonItemClick(R.string.demo_activity, true) {
                    ActivityActivity.start(this)
                    ThreadUtils.runOnUiThreadDelayed(Runnable {

                    }, 2000)
                },
                CommonItemClick(R.string.demo_adapt_screen, true) {
                    AdaptScreenActivity.start(this)
                },
                CommonItemClick(R.string.demo_api, true) {
                    ApiActivity.start(this)
                },
                CommonItemClick(R.string.demo_app, true) {
                    AppActivity.start(this)
                },
                CommonItemClick(R.string.demo_bar, true) {
                    BarActivity.start(this)
                },
                CommonItemClick(R.string.demo_brightness, true) {
                    BrightnessActivity.start(this)
                },
                CommonItemClick(R.string.demo_bus, true) {
                    BusActivity.start(this)
                },
                CommonItemClick(R.string.demo_clean, true) {
                    CleanActivity.start(this)
                },
                CommonItemClick(R.string.demo_click, true) {
                    ClickActivity.start(this)
                },
                CommonItemClick(R.string.demo_clipboard, true) {
                    ClipboardActivity.start(this)
                },
                CommonItemClick(R.string.demo_crash) {
                    throw NullPointerException("crash test")
                },
                CommonItemClick(R.string.demo_device, true) {
                    DeviceActivity.start(this)
                },
                CommonItemClick(R.string.demo_file, true) {
                    FileActivity.start(this)
                },
                CommonItemClick(R.string.demo_flashlight, true) {
                    FlashlightActivity.start(this)
                },
                CommonItemClick(R.string.demo_fragment, true) {
                    FragmentActivity.start(this)
                },
                CommonItemClick(R.string.demo_image, true) {
                    ImageActivity.start(this)
                },
                CommonItemClick(R.string.demo_intent, true) {
                    IntentActivity.start(this)
                },
                CommonItemClick(R.string.demo_keyboard, true) {
                    KeyboardActivity.start(this)
                },
                CommonItemClick(R.string.demo_language, true) {
                    LanguageActivity.start(this)
                },
                CommonItemClick(R.string.demo_log, true) {
                    LogActivity.start(this)
                },
                CommonItemClick(R.string.demo_messenger, true) {
                    MessengerActivity.start(this)
                },
                CommonItemClick(R.string.demo_meta_data, true) {
                    MetaDataActivity.start(this)
                },
                CommonItemClick(R.string.demo_mvp, true) {
                    MvpActivity.start(this)
                },
                CommonItemClick(R.string.demo_network, true) {
                    NetworkActivity.start(this)
                },
                CommonItemClick(R.string.demo_notification, true) {
                    NotificationActivity.start(this)
                },
                CommonItemClick(R.string.demo_path, true) {
                    PathActivity.start(this)
                },
                CommonItemClick(R.string.demo_permission, true) {
                    PermissionActivity.start(this)
                },
                CommonItemClick(R.string.demo_phone, true) {
                    PhoneActivity.start(this)
                },
                CommonItemClick(R.string.demo_process, true) {
                    ProcessActivity.start(this)
                },
                CommonItemClick(R.string.demo_reflect, true) {
                    ReflectActivity.start(this)
                },
                CommonItemClick(R.string.demo_resource, true) {
                    ResourceActivity.start(this)
                },
                CommonItemClick(R.string.demo_rom, true) {
                    RomActivity.start(this)
                },
                CommonItemClick(R.string.demo_screen, true) {
                    ScreenActivity.start(this)
                },
                CommonItemClick(R.string.demo_sdcard, true) {
                    SDCardActivity.start(this)
                },
                CommonItemClick(R.string.demo_shadow, true) {
                    ShadowActivity.start(this)
                },
                CommonItemClick(R.string.demo_snackbar, true) {
                    SnackbarActivity.start(this)
                },
                CommonItemClick(R.string.demo_spStatic, true) {
                    SPStaticActivity.start(this)
                },
                CommonItemClick(R.string.demo_span, true) {
                    SpanActivity.start(this)
                },
                CommonItemClick(R.string.demo_toast, true) {
                    ToastActivity.start(this)
                },
                CommonItemClick(R.string.demo_trans_activity, true) {
                    UtilsTransActivity.start(this, object : UtilsTransActivity.TransActivityDelegate() {
                        override fun onCreated(activity: UtilsTransActivity, savedInstanceState: Bundle?) {
                            super.onCreated(activity, savedInstanceState)
                            activity.setContentView(R.layout.common_dialog_loading)
                            activity.findViewById<TextView>(R.id.utilActionLoadingMsgTv).text = "Trans Activity is showing..."
                        }
                    })
                },
                CommonItemClick(R.string.demo_uiMessage, true) {
                    UiMessageActivity.start(this)
                },
                CommonItemClick(R.string.demo_vibrate, true) {
                    VibrateActivity.start(this)
                },
                CommonItemClick(R.string.demo_volume, true) {
                    VolumeActivity.start(this)
                }
        )
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        LogUtils.e(requestCode, requestCode)
    }
}


================================================
FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
================================================
package com.blankj.utilcode.pkg.feature.activity

import android.content.Context
import android.content.Intent
import android.graphics.drawable.BitmapDrawable
import android.os.Bundle
import android.widget.ImageView
import androidx.core.app.ActivityOptionsCompat
import com.blankj.base.rv.ItemViewHolder
import com.blankj.common.activity.CommonActivity
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
import com.blankj.common.item.CommonItemImage
import com.blankj.common.item.CommonItemTitle
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.pkg.feature.CoreUtilActivity
import com.blankj.utilcode.util.ActivityUtils
import com.blankj.utilcode.util.AppUtils
import com.blankj.utilcode.util.CollectionUtils
import com.blankj.utilcode.util.StringUtils
import java.util.*

/**
 * ```
 * author: Blankj
 * blog  : http://blankj.com
 * time  : 2016/10/13
 * desc  : demo about ActivityUtils
 * ```
 */
class ActivityActivity : CommonActivity() {

    companion object {
        fun start(context: Context) {
            val starter = Intent(context, ActivityActivity::class.java)
            context.startActivity(starter)
        }
    }

    override fun bindTitleRes(): Int {
        return R.string.demo_activity
    }

    override fun bindItems(): List<CommonItem<*>> {
        val elementItem = ActivityItem()
        val intent = Intent(this, SubActivityActivity::class.java)
        val intents = arrayOfNulls<Intent>(2)
        intents[0] = intent
        intents[1] = Intent(this, SubActivityActivity::class.java)

        return CollectionUtils.newArrayList(
                elementItem,
                CommonItemTitle("isActivityExists(${SubActivityActivity::class.java.name})", ActivityUtils.isActivityExists(AppUtils.getAppPackageName(), SubActivityActivity::class.java.name).toString()),
                CommonItemTitle("getLauncherActivity", ActivityUtils.getLauncherActivity(AppUtils.getAppPackageName())),
                CommonItemTitle("getMainActivities", ActivityUtils.getMainActivities().toString()),
                CommonItemTitle("getActivityList", CollectionUtils.collect(ActivityUtils.getActivityList()) { input -> input.javaClass.simpleName }.toString()),
                CommonItemTitle("getTopActivity", ActivityUtils.getTopActivity().toString()),
                CommonItemTitle("isActivityExistsInStack", ActivityUtils.isActivityExistsInStack(CoreUtilActivity::class.java).toString()),
                CommonItemImage("getActivityIcon") {
                    it.setImageDrawable(ActivityUtils.getActivityIcon(ActivityActivity::class.java))
                },
                CommonItemImage("getActivityLogo") {
                    it.setImageDrawable(ActivityUtils.getActivityLogo(ActivityActivity::class.java))
                },

                CommonItemClick(R.string.activity_clz, true) {
                    ActivityUtils.startActivity(SubActivityActivity::class.java)
                },
                CommonItemClick(R.string.activity_clz_opt, true) {
                    ActivityUtils.startActivity(SubActivityActivity::class.java, getOption(elementItem))
                },
                CommonItemClick(R.string.activity_clz_anim, true) {
                    ActivityUtils.startActivity(SubActivityActivity::class.java, R.anim.fade_in_1000, R.anim.fade_out_1000)
                },
                CommonItemClick(R.string.activity_act_clz, true) {
                    ActivityUtils.startActivity(this, SubActivityActivity::class.java)
                },
                CommonItemClick(R.string.activity_act_clz_shared_element, true) {
                    ActivityUtils.startActivity(this, SubActivityActivity::class.java, elementItem.element)
                },
                CommonItemClick(R.string.activity_act_clz_anim, true) {
                    ActivityUtils.startActivity(this, SubActivityActivity::class.java, R.anim.fade_in_1000, R.anim.fade_out_1000)
                },
                CommonItemClick(R.string.activity_pkg_cls, true) {
                    ActivityUtils.startActivity(this.packageName, SubActivityActivity::class.java.name)
                },
                CommonItemClick(R.string.activity_pkg_cls_opt, true) {
                    ActivityUtils.startActivity(this.packageName, SubActivityActivity::class.java.name, getOption(elementItem))
                },
                CommonItemClick(R.string.activity_pkg_cls_anim, true) {
                    ActivityUtils.startActivity(this.packageName, SubActivityActivity::class.java.name, R.anim.fade_in_1000, R.anim.fade_out_1000)
                },
                CommonItemClick(R.string.activity_act_pkg_cls, true) {
                    ActivityUtils.startActivity(this, this.packageName, SubActivityActivity::class.java.name)
                },
                CommonItemClick(R.string.activity_act_pkg_cls_opt, true) {
                    ActivityUtils.startActivity(this, this.packageName, SubActivityActivity::class.java.name, getOption(elementItem))
                },
                CommonItemClick(R.string.activity_act_pkg_cls_shared_element, true) {
                    ActivityUtils.startActivity(this, this.packageName, SubActivityActivity::class.java.name, elementItem.element)
                },
                CommonItemClick(R.string.activity_act_pkg_cls_anim, true) {
                    ActivityUtils.startActivity(this, this.packageName, SubActivityActivity::class.java.name, R.anim.fade_in_1000, R.anim.fade_out_1000)
                },
                CommonItemClick(R.string.activity_intent, true) {
                    ActivityUtils.startActivity(this, intent)
                },
                CommonItemClick(R.string.activity_intent_opt, true) {
                    ActivityUtils.startActivity(this, intent, getOption(elementItem))
                },
                CommonItemClick(R.string.activity_intent_shared_element, true) {
                    ActivityUtils.startActivity(this, intent, elementItem.element)
                },
                CommonItemClick(R.string.activity_intent_anim, true) {
                    ActivityUtils.startActivity(this, intent, R.anim.fade_in_1000, R.anim.fade_out_1000)
                },
                CommonItemClick(R.string.activity_intents, true) {
                    ActivityUtils.startActivities(intents)
                },
                CommonItemClick(R.string.activity_intents_opt, true) {
                    ActivityUtils.startActivities(intents, getOption(elementItem))
                },
                CommonItemClick(R.string.activity_intents_anim, true) {
                    ActivityUtils.startActivities(intents, R.anim.fade_in_1000, R.anim.fade_out_1000)
                },
                CommonItemClick(R.string.activity_act_intents, true) {
                    ActivityUtils.startActivities(this, intents, R.anim.fade_in_1000, R.anim.fade_out_1000)
                },
                CommonItemClick(R.string.activity_act_intents_opt, true) {
                    ActivityUtils.startActivities(this, intents, getOption(elementItem))
                },
                CommonItemClick(R.string.activity_act_intents_anim, true) {
                    ActivityUtils.startActivities(this, intents, R.anim.fade_in_1000, R.anim.fade_out_1000)
                },
                CommonItemClick(R.string.activity_start_home_activity, true) {
                    ActivityUtils.startHomeActivity()
                },
                CommonItemClick(R.string.activity_start_launcher_activity, true) {
                    ActivityUtils.startLauncherActivity()
                },
                CommonItemClick(R.string.activity_finish_activity, false) {
                    ActivityUtils.finishActivity(CoreUtilActivity::class.java)
                },
                CommonItemClick(R.string.activity_finish_to_activity, true) {
                    ActivityUtils.finishToActivity(CoreUtilActivity::class.java, false, true)
                },
                CommonItemClick(R.string.activity_finish_all_activities_except_newest, true) {
                    ActivityUtils.finishAllActivitiesExceptNewest()
                },
                CommonItemClick(R.string.activity_finish_all_activities, true) {
                    ActivityUtils.finishAllActivities()
                }
        )
    }

    private fun getOption(activityItem: ActivityItem): Bundle? {
        when (Random().nextInt(5)) {
            0 -> return ActivityOptionsCompat.makeCustomAnimation(this,
                    R.anim.slide_right_in_1000,
                    R.anim.slide_left_out_1000)
                    .toBundle()
            1 -> return ActivityOptionsCompat.makeScaleUpAnimation(activityItem.element,
                    activityItem.element.width / 2,
                    activityItem.element.height / 2,
                    0, 0)
                    .toBundle()
            2 -> return ActivityOptionsCompat.makeThumbnailScaleUpAnimation(activityItem.element,
                    (activityItem.element.drawable as BitmapDrawable).bitmap,
                    0, 0)
                    .toBundle()
            3 -> return ActivityOptionsCompat.makeSceneTransitionAnimation(this,
                    activityItem.element,
                    StringUtils.getString(R.string.activity_shared_element))
                    .toBundle()
            else -> return ActivityOptionsCompat.makeClipRevealAnimation(activityItem.element,
                    activityItem.element.width / 2,
                    activityItem.element.height / 2,
                    0, 0)
                    .toBundle()
        }
    }
}

class ActivityItem : CommonItem<ActivityItem> {

    lateinit var element: ImageView;

    constructor() : super(R.layout.activity_item_shared_element_activity)

    override fun bind(holder: ItemViewHolder, position: Int) {
        super.bind(holder, position)
        element = holder.findViewById(R.id.activityViewSharedElement)
    }
}

================================================
FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
================================================
package com.blankj.utilcode.pkg.feature.activity

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import androidx.core.app.ActivityCompat
import android.view.View
import com.blankj.common.activity.CommonActivity
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.util.ColorUtils
import kotlinx.android.synthetic.main.activity_sub_activity.*


/**
 * ```
 * author: Blankj
 * blog  : http://blankj.com
 * time  : 2016/10/13
 * desc  : demo about ActivityUtils
 * ```
 */
class SubActivityActivity : CommonActivity() {

    override fun bindLayout(): Int {
        return R.layout.activity_sub_activity
    }

    override fun bindTitleRes(): Int {
        return R.string.demo_activity
    }

    override fun initView(savedInstanceState: Bundle?, contentView: View?) {
        super.initView(savedInstanceState, contentView)
        contentView?.setBackgroundColor(ColorUtils.getRandomColor(false))
        activityViewSharedElement.setOnClickListener {
            val result = Intent()
            result.putExtra("data", "data")
            this@SubActivityActivity.setResult(Activity.RESULT_OK, result)
            this@SubActivityActivity.finish()
        }
    }

    override fun onBackPressed() {
        super.onBackPressed()
        ActivityCompat.finishAfterTransition(this)
    }
}


================================================
FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptCloseActivity.kt
================================================
package com.blankj.utilcode.pkg.feature.adaptScreen

import android.content.Context
import android.content.Intent
import android.content.res.Resources
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import com.blankj.common.activity.CommonActivity
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.util.AdaptScreenUtils

class AdaptCloseActivity : CommonActivity() {

    companion object {
        fun start(context: Context) {
            val starter = Intent(context, AdaptCloseActivity::class.java)
            context.startActivity(starter)
        }
    }

    override fun bindLayout(): Int {
        return R.layout.adaptscreen_close_activity
    }

    override fun initView(savedInstanceState: Bundle?, contentView: View?) {
        super.initView(savedInstanceState, contentView)
        window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
    }

    override fun getResources(): Resources {
        return AdaptScreenUtils.closeAdapt(super.getResources())
    }
}


================================================
FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt
================================================
package com.blankj.utilcode.pkg.feature.adaptScreen

import android.content.Context
import android.content.Intent
import android.content.res.Resources
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import com.blankj.common.activity.CommonActivity
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.util.AdaptScreenUtils
import com.blankj.utilcode.util.BarUtils
import com.blankj.utilcode.util.LogUtils

class AdaptHeightActivity : CommonActivity() {

    companion object {
        fun start(context: Context) {
            val starter = Intent(context, AdaptHeightActivity::class.java)
            context.startActivity(starter)
        }
    }

    override fun bindLayout(): Int {
        return R.layout.adaptscreen_height_activity
    }

    override fun initView(savedInstanceState: Bundle?, contentView: View?) {
        super.initView(savedInstanceState, contentView)
        window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
    }

    override fun onResume() {
        super.onResume()
        LogUtils.e(BarUtils.getStatusBarHeight())
    }

    override fun getResources(): Resources {
        return AdaptScreenUtils.adaptHeight(super.getResources(), 1920)
    }
}


================================================
FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptScreenActivity.kt
================================================
package com.blankj.utilcode.pkg.feature.adaptScreen

import android.content.Context
import android.content.Intent
import com.blankj.common.activity.CommonActivity
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.util.CollectionUtils

class AdaptScreenActivity : CommonActivity() {

    companion object {
        fun start(context: Context) {
            val starter = Intent(context, AdaptScreenActivity::class.java)
            context.startActivity(starter)
        }
    }

    override fun bindTitleRes(): Int {
        return R.string.demo_adapt_screen
    }

    override fun bindItems(): List<CommonItem<*>> {
        return CollectionUtils.newArrayList(
                CommonItemClick(R.string.adaptScreen_adapt_width, true) {
                    AdaptWidthActivity.start(this)
                },
                CommonItemClick(R.string.adaptScreen_adapt_height, true) {
                    AdaptHeightActivity.start(this)
                },
                CommonItemClick(R.string.adaptScreen_adapt_close, true) {
                    AdaptCloseActivity.start(this)
                }
        )
    }
}


================================================
FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptWidthActivity.kt
================================================
package com.blankj.utilcode.pkg.feature.adaptScreen

import android.content.Context
import android.content.Intent
import android.content.res.Resources
import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import com.blankj.common.activity.CommonActivity
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.util.AdaptScreenUtils
import kotlinx.android.synthetic.main.adaptscreen_width_activity.*

class AdaptWidthActivity : CommonActivity() {

    companion object {
        fun start(context: Context) {
            val starter = Intent(context, AdaptWidthActivity::class.java)
            context.startActivity(starter)
        }
    }

    override fun bindLayout(): Int {
        return R.layout.adaptscreen_width_activity
    }

    override fun initView(savedInstanceState: Bundle?, contentView: View?) {
        super.initView(savedInstanceState, contentView)
        window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
        adaptScreenWidthWebView.setBackgroundColor(Color.parseColor("#f0d26d"))
    }

    override fun getResources(): Resources {
        return AdaptScreenUtils.adaptWidth(super.getResources(), 1080)
    }
}


================================================
FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/ApiActivity.kt
================================================
package com.blankj.utilcode.pkg.feature.api

import android.content.Context
import android.content.Intent
import com.blankj.common.activity.CommonActivity
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.pkg.feature.api.other.export.OtherModuleApi
import com.blankj.utilcode.util.ApiUtils
import com.blankj.utilcode.util.CollectionUtils
import com.blankj.utilcode.util.ToastUtils

/**
 * ```
 * author: Blankj
 * blog  : http://blankj.com
 * time  : 2019/03/12
 * desc  : demo about ApiUtils
 * ```
 */
class ApiActivity : CommonActivity() {

    companion object {
        fun start(context: Context) {
            val starter = Intent(context, ApiActivity::class.java)
            context.startActivity(starter)
        }
    }

    override fun bindTitleRes(): Int {
        return R.string.demo_api
    }

    override fun bindItems(): MutableList<CommonItem<*>> {
        return CollectionUtils.newArrayList(
                CommonItemClick(R.string.api_invoke_with_params) {
                    ApiUtils.getApi(OtherModuleApi::class.java)?.invokeWithParams(OtherModuleApi.ApiBean("params"))
                },
                CommonItemClick(R.string.api_invoke_with_return_value) {
                    ToastUtils.showShort(ApiUtils.getApi(OtherModuleApi::class.java)?.invokeWithReturnValue()?.name)
                }
        );
    }
}


================================================
FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/export/OtherModuleApi.java
================================================
package com.blankj.utilcode.pkg.feature.api.other.export;

import com.blankj.utilcode.util.ApiUtils;

/**
 * <pre>
 *     author: Blankj
 *     blog  : http://blankj.com
 *     time  : 2019/07/10
 *     desc  : demo about ApiUtils
 * </pre>
 */
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;
        }
    }
}


================================================
FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/pkg/OtherPkgApiImpl.java
================================================
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;

/**
 * <pre>
 *     author: Blankj
 *     blog  : http://blankj.com
 *     time  : 2019/07/10
 *     desc  : demo about ApiUtils
 * </pre>
 */
@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);
    }
}


================================================
FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt
================================================
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 : Permiss
Download .txt
gitextract_m5v2g_mv/

├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── bug_report_cn.md
│   │   ├── feature-request.md
│   │   └── feature-request_cn.md
│   └── workflows/
│       └── android.yml
├── .gitignore
├── CHANGELOG.md
├── LICENSE
├── README-CN.md
├── README.md
├── build.gradle
├── buildApp.gradle
├── buildCommon.gradle
├── buildLib.gradle
├── buildSrc/
│   ├── .gitignore
│   ├── build.gradle
│   ├── settings.gradle
│   └── src/
│       └── main/
│           ├── groovy/
│           │   ├── Config.groovy
│           │   ├── ConfigUtils.groovy
│           │   ├── GLog.groovy
│           │   ├── LibConfig.groovy
│           │   ├── ModuleConfig.groovy
│           │   ├── PluginConfig.groovy
│           │   └── TaskDurationUtils.groovy
│           └── java/
│               └── com/
│                   └── blankj/
│                       └── plugin/
│                           └── readme/
│                               ├── FormatUtils.groovy
│                               ├── ReadmeCorePlugin.groovy
│                               ├── ReadmeExtension.groovy
│                               └── ReadmeSubPlugin.groovy
├── config/
│   ├── flavor.gradle
│   └── publish.gradle
├── feature/
│   ├── launcher/
│   │   └── app/
│   │       ├── .gitignore
│   │       ├── build.gradle
│   │       ├── proguard-rules.pro
│   │       └── src/
│   │           └── main/
│   │               ├── AndroidManifest.xml
│   │               └── java/
│   │                   └── com/
│   │                       └── blankj/
│   │                           └── launcher/
│   │                               └── app/
│   │                                   └── LauncherApp.java
│   ├── main/
│   │   ├── app/
│   │   │   ├── .gitignore
│   │   │   ├── build.gradle
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           └── java/
│   │   │               └── com/
│   │   │                   └── blankj/
│   │   │                       └── main/
│   │   │                           └── app/
│   │   │                               └── MainApp.java
│   │   └── pkg/
│   │       ├── .gitignore
│   │       ├── build.gradle
│   │       ├── proguard-rules.pro
│   │       └── src/
│   │           └── main/
│   │               ├── AndroidManifest.xml
│   │               ├── java/
│   │               │   └── com/
│   │               │       └── blankj/
│   │               │           └── main/
│   │               │               └── pkg/
│   │               │                   ├── MainActivity.kt
│   │               │                   └── SplashActivity.kt
│   │               └── res/
│   │                   ├── layout/
│   │                   │   └── activity_main.xml
│   │                   └── values/
│   │                       └── strings.xml
│   ├── mock/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           └── java/
│   │               └── com/
│   │                   └── blankj/
│   │                       └── mock/
│   │                           ├── subutil/
│   │                           │   └── SubUtilApiMock.java
│   │                           └── utilcode/
│   │                               └── UtilCodeApiMock.java
│   ├── subutil/
│   │   ├── app/
│   │   │   ├── .gitignore
│   │   │   ├── build.gradle
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           └── java/
│   │   │               └── com/
│   │   │                   └── blankj/
│   │   │                       └── subutil/
│   │   │                           └── app/
│   │   │                               └── SubUtilApp.kt
│   │   ├── export/
│   │   │   ├── .gitignore
│   │   │   ├── build.gradle
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           └── java/
│   │   │               └── com/
│   │   │                   └── blankj/
│   │   │                       └── subutil/
│   │   │                           └── export/
│   │   │                               └── api/
│   │   │                                   └── SubUtilApi.java
│   │   └── pkg/
│   │       ├── .gitignore
│   │       ├── build.gradle
│   │       ├── proguard-rules.pro
│   │       └── src/
│   │           └── main/
│   │               ├── AndroidManifest.xml
│   │               ├── java/
│   │               │   └── com/
│   │               │       └── blankj/
│   │               │           └── subutil/
│   │               │               └── pkg/
│   │               │                   ├── Config.kt
│   │               │                   ├── SubUtilApiImpl.java
│   │               │                   └── feature/
│   │               │                       ├── SubUtilActivity.kt
│   │               │                       ├── appStore/
│   │               │                       │   └── AppStoreActivity.kt
│   │               │                       ├── battery/
│   │               │                       │   └── BatteryActivity.kt
│   │               │                       ├── country/
│   │               │                       │   └── CountryActivity.kt
│   │               │                       ├── dangerous/
│   │               │                       │   └── DangerousActivity.kt
│   │               │                       ├── location/
│   │               │                       │   ├── LocationActivity.kt
│   │               │                       │   └── LocationService.kt
│   │               │                       └── pinyin/
│   │               │                           └── PinyinActivity.kt
│   │               └── res/
│   │                   └── values/
│   │                       └── strings.xml
│   └── utilcode/
│       ├── app/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       └── main/
│       │           ├── AndroidManifest.xml
│       │           └── java/
│       │               └── com/
│       │                   └── blankj/
│       │                       └── utilcode/
│       │                           └── app/
│       │                               └── UtilCodeApp.kt
│       ├── export/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       └── main/
│       │           ├── AndroidManifest.xml
│       │           └── java/
│       │               └── com/
│       │                   └── blankj/
│       │                       └── utilcode/
│       │                           └── export/
│       │                               └── api/
│       │                                   └── UtilCodeApi.java
│       └── pkg/
│           ├── .gitignore
│           ├── build.gradle
│           ├── proguard-rules.pro
│           └── src/
│               └── main/
│                   ├── AndroidManifest.xml
│                   ├── assets/
│                   │   └── test/
│                   │       ├── sub/
│                   │       │   └── test.txt
│                   │       └── test.txt
│                   ├── java/
│                   │   └── com/
│                   │       └── blankj/
│                   │           └── utilcode/
│                   │               └── pkg/
│                   │                   ├── Config.kt
│                   │                   ├── UtilCodeApiImpl.java
│                   │                   ├── feature/
│                   │                   │   ├── CoreUtilActivity.kt
│                   │                   │   ├── activity/
│                   │                   │   │   ├── ActivityActivity.kt
│                   │                   │   │   └── SubActivityActivity.kt
│                   │                   │   ├── adaptScreen/
│                   │                   │   │   ├── AdaptCloseActivity.kt
│                   │                   │   │   ├── AdaptHeightActivity.kt
│                   │                   │   │   ├── AdaptScreenActivity.kt
│                   │                   │   │   └── AdaptWidthActivity.kt
│                   │                   │   ├── api/
│                   │                   │   │   ├── ApiActivity.kt
│                   │                   │   │   └── other/
│                   │                   │   │       ├── export/
│                   │                   │   │       │   └── OtherModuleApi.java
│                   │                   │   │       └── pkg/
│                   │                   │   │           └── OtherPkgApiImpl.java
│                   │                   │   ├── app/
│                   │                   │   │   └── AppActivity.kt
│                   │                   │   ├── bar/
│                   │                   │   │   ├── BarActivity.kt
│                   │                   │   │   ├── nav/
│                   │                   │   │   │   └── BarNavActivity.kt
│                   │                   │   │   ├── notification/
│                   │                   │   │   │   └── BarNotificationActivity.kt
│                   │                   │   │   └── status/
│                   │                   │   │       ├── BarStatusActivity.kt
│                   │                   │   │       ├── BarStatusActivityAlpha.kt
│                   │                   │   │       ├── BarStatusActivityColor.kt
│                   │                   │   │       ├── BarStatusActivityCustom.kt
│                   │                   │   │       ├── BarStatusActivityDrawer.kt
│                   │                   │   │       ├── BarStatusActivityImageView.kt
│                   │                   │   │       └── fragment/
│                   │                   │   │           ├── BarStatusFragmentActivity.kt
│                   │                   │   │           ├── BarStatusFragmentAlpha.kt
│                   │                   │   │           ├── BarStatusFragmentColor.kt
│                   │                   │   │           ├── BarStatusFragmentCustom.kt
│                   │                   │   │           └── BarStatusFragmentImageView.kt
│                   │                   │   ├── brightness/
│                   │                   │   │   └── BrightnessActivity.kt
│                   │                   │   ├── bus/
│                   │                   │   │   ├── BusActivity.kt
│                   │                   │   │   └── BusCompareActivity.kt
│                   │                   │   ├── clean/
│                   │                   │   │   └── CleanActivity.kt
│                   │                   │   ├── click/
│                   │                   │   │   └── ClickActivity.kt
│                   │                   │   ├── clipboard/
│                   │                   │   │   └── ClipboardActivity.kt
│                   │                   │   ├── device/
│                   │                   │   │   └── DeviceActivity.kt
│                   │                   │   ├── file/
│                   │                   │   │   └── FileActivity.kt
│                   │                   │   ├── flashlight/
│                   │                   │   │   └── FlashlightActivity.kt
│                   │                   │   ├── fragment/
│                   │                   │   │   ├── ChildFragment.kt
│                   │                   │   │   ├── ContainerFragment.kt
│                   │                   │   │   ├── FragmentActivity.kt
│                   │                   │   │   └── RootFragment.kt
│                   │                   │   ├── image/
│                   │                   │   │   └── ImageActivity.kt
│                   │                   │   ├── intent/
│                   │                   │   │   └── IntentActivity.kt
│                   │                   │   ├── keyboard/
│                   │                   │   │   └── KeyboardActivity.kt
│                   │                   │   ├── language/
│                   │                   │   │   └── LanguageActivity.kt
│                   │                   │   ├── log/
│                   │                   │   │   └── LogActivity.kt
│                   │                   │   ├── messenger/
│                   │                   │   │   ├── MessengerActivity.kt
│                   │                   │   │   └── MessengerRemoteActivity.kt
│                   │                   │   ├── metaData/
│                   │                   │   │   └── MetaDataActivity.kt
│                   │                   │   ├── mvp/
│                   │                   │   │   ├── MvpActivity.java
│                   │                   │   │   ├── MvpModel.java
│                   │                   │   │   ├── MvpMvp.java
│                   │                   │   │   ├── MvpPresenter.java
│                   │                   │   │   └── MvpView.java
│                   │                   │   ├── network/
│                   │                   │   │   └── NetworkActivity.kt
│                   │                   │   ├── notification/
│                   │                   │   │   └── NotificationActivity.kt
│                   │                   │   ├── path/
│                   │                   │   │   └── PathActivity.kt
│                   │                   │   ├── permission/
│                   │                   │   │   └── PermissionActivity.kt
│                   │                   │   ├── phone/
│                   │                   │   │   └── PhoneActivity.kt
│                   │                   │   ├── process/
│                   │                   │   │   └── ProcessActivity.kt
│                   │                   │   ├── reflect/
│                   │                   │   │   ├── ReflectActivity.kt
│                   │                   │   │   └── TestPrivateStaticFinal.java
│                   │                   │   ├── resource/
│                   │                   │   │   └── ResourceActivity.kt
│                   │                   │   ├── rom/
│                   │                   │   │   └── RomActivity.kt
│                   │                   │   ├── screen/
│                   │                   │   │   └── ScreenActivity.kt
│                   │                   │   ├── sdcard/
│                   │                   │   │   └── SDCardActivity.kt
│                   │                   │   ├── shadow/
│                   │                   │   │   └── ShadowActivity.kt
│                   │                   │   ├── snackbar/
│                   │                   │   │   └── SnackbarActivity.kt
│                   │                   │   ├── spStatic/
│                   │                   │   │   └── SPStaticActivity.kt
│                   │                   │   ├── span/
│                   │                   │   │   └── SpanActivity.kt
│                   │                   │   ├── toast/
│                   │                   │   │   ├── CustomToast.kt
│                   │                   │   │   └── ToastActivity.kt
│                   │                   │   ├── uiMessage/
│                   │                   │   │   └── UiMessageActivity.kt
│                   │                   │   ├── vibrate/
│                   │                   │   │   └── VibrateActivity.kt
│                   │                   │   └── volume/
│                   │                   │       └── VolumeActivity.kt
│                   │                   └── helper/
│                   │                       └── DialogHelper.kt
│                   └── res/
│                       ├── anim/
│                       │   ├── fade_in_1000.xml
│                       │   ├── fade_out_1000.xml
│                       │   ├── slide_bottom_in_200.xml
│                       │   ├── slide_bottom_out_200.xml
│                       │   ├── slide_left_out_1000.xml
│                       │   └── slide_right_in_1000.xml
│                       ├── animator/
│                       │   ├── fragment_slide_left_enter.xml
│                       │   ├── fragment_slide_left_exit.xml
│                       │   ├── fragment_slide_right_enter.xml
│                       │   └── fragment_slide_right_exit.xml
│                       ├── drawable/
│                       │   ├── bar_status_custom.xml
│                       │   ├── bar_status_nav_alpha.xml
│                       │   ├── bar_status_nav_color.xml
│                       │   ├── bar_status_nav_custom.xml
│                       │   ├── bar_status_nav_image.xml
│                       │   ├── fragment_nav.xml
│                       │   ├── keyboard_dialog_bg.xml
│                       │   ├── shadow_circle.xml
│                       │   ├── shadow_round_rect.xml
│                       │   ├── snackbar_custom_bg.xml
│                       │   ├── span_block_high.xml
│                       │   ├── span_block_low.xml
│                       │   └── toast_round_rect.xml
│                       ├── layout/
│                       │   ├── activity_adaptscreen.xml
│                       │   ├── activity_item_shared_element_activity.xml
│                       │   ├── activity_sub_activity.xml
│                       │   ├── adaptscreen_close_activity.xml
│                       │   ├── adaptscreen_height_activity.xml
│                       │   ├── adaptscreen_width_activity.xml
│                       │   ├── bar_status_alpha_activity.xml
│                       │   ├── bar_status_alpha_fragment.xml
│                       │   ├── bar_status_color_fragment.xml
│                       │   ├── bar_status_custom_fragment.xml
│                       │   ├── bar_status_drawer_activity.xml
│                       │   ├── bar_status_fragment_activity.xml
│                       │   ├── bar_status_image_view_activity.xml
│                       │   ├── bar_status_image_view_fragment.xml
│                       │   ├── fragment_activity.xml
│                       │   ├── fragment_child.xml
│                       │   ├── fragment_container.xml
│                       │   ├── fragment_dialog.xml
│                       │   ├── fragment_item_shared_element.xml
│                       │   ├── fragment_root.xml
│                       │   ├── keyboard_activity.xml
│                       │   ├── keyboard_dialog.xml
│                       │   ├── mvp_activity.xml
│                       │   ├── screen_dialog.xml
│                       │   ├── shadow_activity.xml
│                       │   ├── snackbar_custom.xml
│                       │   ├── span_activity.xml
│                       │   ├── toast_custom.xml
│                       │   └── toast_dialog.xml
│                       ├── menu/
│                       │   ├── fragment_nav.xml
│                       │   └── status_bar_nav.xml
│                       ├── raw/
│                       │   └── test.txt
│                       ├── transition/
│                       │   ├── explode_1000.xml
│                       │   ├── fade_1000.xml
│                       │   └── slide_1000.xml
│                       ├── values/
│                       │   ├── ids.xml
│                       │   ├── strings.xml
│                       │   └── styles.xml
│                       ├── values-en-rUS/
│                       │   └── strings.xml
│                       └── values-zh-rCN/
│                           └── strings.xml
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── lib/
│   ├── base/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── blankj/
│   │           │           └── base/
│   │           │               ├── BaseActivity.java
│   │           │               ├── BaseApplication.java
│   │           │               ├── BaseFragment.java
│   │           │               ├── IBaseView.java
│   │           │               ├── dialog/
│   │           │               │   ├── BaseDialog.java
│   │           │               │   ├── BaseDialogFragment.java
│   │           │               │   ├── DialogCallback.java
│   │           │               │   └── DialogLayoutCallback.java
│   │           │               ├── mvp/
│   │           │               │   ├── BaseModel.java
│   │           │               │   ├── BasePresenter.java
│   │           │               │   └── BaseView.java
│   │           │               ├── rv/
│   │           │               │   ├── BaseItem.java
│   │           │               │   ├── BaseItemAdapter.java
│   │           │               │   ├── ItemViewHolder.java
│   │           │               │   └── RecycleViewDivider.java
│   │           │               └── view/
│   │           │                   └── EmptyGoneTextView.java
│   │           └── res/
│   │               └── layout/
│   │                   ├── activity_back.xml
│   │                   └── fragment_lazy.xml
│   ├── common/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── assets/
│   │           │   └── test_install
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── blankj/
│   │           │           └── common/
│   │           │               ├── CommonApplication.java
│   │           │               ├── activity/
│   │           │               │   ├── CommonActivity.java
│   │           │               │   ├── CommonActivityDrawerView.java
│   │           │               │   ├── CommonActivityItemsView.java
│   │           │               │   └── CommonActivityTitleView.java
│   │           │               ├── dialog/
│   │           │               │   ├── CommonDialogContent.java
│   │           │               │   └── CommonDialogLoading.java
│   │           │               ├── fragment/
│   │           │               │   └── CommonFragment.java
│   │           │               ├── helper/
│   │           │               │   └── PermissionHelper.kt
│   │           │               ├── item/
│   │           │               │   ├── CommonItem.java
│   │           │               │   ├── CommonItemClick.java
│   │           │               │   ├── CommonItemImage.java
│   │           │               │   ├── CommonItemSeekBar.java
│   │           │               │   ├── CommonItemSwitch.java
│   │           │               │   └── CommonItemTitle.java
│   │           │               └── view/
│   │           │                   └── RotateView.java
│   │           └── res/
│   │               ├── anim/
│   │               │   ├── slide_in_left.xml
│   │               │   ├── slide_in_right.xml
│   │               │   ├── slide_out_left.xml
│   │               │   └── slide_out_right.xml
│   │               ├── drawable/
│   │               │   ├── common_button_bg.xml
│   │               │   ├── common_button_txt_color.xml
│   │               │   ├── common_content_dialog_bg.xml
│   │               │   ├── common_content_dialog_btn_bg.xml
│   │               │   ├── common_item_divider.xml
│   │               │   ├── common_loading_bg.xml
│   │               │   ├── common_rotate_loading.xml
│   │               │   ├── common_scrollbar_thumb.xml
│   │               │   ├── common_seekbar_progress.xml
│   │               │   ├── common_seekbar_thumb.xml
│   │               │   ├── common_splash.xml
│   │               │   ├── main_menu_blog.xml
│   │               │   └── main_menu_github.xml
│   │               ├── drawable-xxhdpi/
│   │               │   ├── common_switch_thumb.xml
│   │               │   └── common_switch_track.xml
│   │               ├── layout/
│   │               │   ├── common_activity_drawer.xml
│   │               │   ├── common_activity_drawer_nav_header.xml
│   │               │   ├── common_activity_title.xml
│   │               │   ├── common_activity_title_stub_no_scroll.xml
│   │               │   ├── common_activity_title_stub_scroll.xml
│   │               │   ├── common_dialog_content.xml
│   │               │   ├── common_dialog_loading.xml
│   │               │   ├── common_item.xml
│   │               │   ├── common_item_title_click.xml
│   │               │   ├── common_item_title_content.xml
│   │               │   ├── common_item_title_image.xml
│   │               │   ├── common_item_title_seekbar.xml
│   │               │   └── common_item_title_switch.xml
│   │               ├── menu/
│   │               │   └── common_drawer.xml
│   │               └── values/
│   │                   ├── colors.xml
│   │                   ├── dimens.xml
│   │                   ├── strings.xml
│   │                   └── styles.xml
│   ├── subutil/
│   │   ├── .gitignore
│   │   ├── README-CN.md
│   │   ├── README.md
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── blankj/
│   │       │               └── subutil/
│   │       │                   └── util/
│   │       │                       ├── AppStoreUtils.java
│   │       │                       ├── BatteryUtils.java
│   │       │                       ├── BitUtils.java
│   │       │                       ├── CameraUtils.java
│   │       │                       ├── CoordinateUtils.java
│   │       │                       ├── CountryUtils.java
│   │       │                       ├── DangerousUtils.java
│   │       │                       ├── GlideUtils.java
│   │       │                       ├── HttpsUtil.java
│   │       │                       ├── LocationUtils.java
│   │       │                       ├── LunarUtils.java
│   │       │                       ├── PinyinUtils.java
│   │       │                       ├── RetrofitUtils.java
│   │       │                       ├── TemperatureUtils.java
│   │       │                       ├── Utils.java
│   │       │                       └── http/
│   │       │                           ├── Chain.java
│   │       │                           ├── ExecutorFactory.java
│   │       │                           ├── Headers.java
│   │       │                           ├── HttpUtils.java
│   │       │                           ├── Interceptor.java
│   │       │                           ├── Request.java
│   │       │                           ├── Response.java
│   │       │                           ├── ResponseCallback.java
│   │       │                           └── SSLConfig.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── blankj/
│   │                       └── subutil/
│   │                           └── util/
│   │                               ├── BaseTest.java
│   │                               ├── CoordinateUtilsTest.java
│   │                               ├── LunarUtilsTest.java
│   │                               ├── TemperatureUtilsTest.java
│   │                               ├── TestConfig.java
│   │                               └── http/
│   │                                   ├── HttpUtilsTest.java
│   │                                   └── UserBean.java
│   ├── utilcode/
│   │   ├── .gitignore
│   │   ├── README-CN.md
│   │   ├── README.md
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── blankj/
│   │       │   │           └── utilcode/
│   │       │   │               ├── constant/
│   │       │   │               │   ├── CacheConstants.java
│   │       │   │               │   ├── MemoryConstants.java
│   │       │   │               │   ├── PermissionConstants.java
│   │       │   │               │   ├── RegexConstants.java
│   │       │   │               │   └── TimeConstants.java
│   │       │   │               └── util/
│   │       │   │                   ├── ActivityUtils.java
│   │       │   │                   ├── AdaptScreenUtils.java
│   │       │   │                   ├── ApiUtils.java
│   │       │   │                   ├── AppUtils.java
│   │       │   │                   ├── ArrayUtils.java
│   │       │   │                   ├── BarUtils.java
│   │       │   │                   ├── BrightnessUtils.java
│   │       │   │                   ├── BusUtils.java
│   │       │   │                   ├── CacheDiskStaticUtils.java
│   │       │   │                   ├── CacheDiskUtils.java
│   │       │   │                   ├── CacheDoubleStaticUtils.java
│   │       │   │                   ├── CacheDoubleUtils.java
│   │       │   │                   ├── CacheMemoryStaticUtils.java
│   │       │   │                   ├── CacheMemoryUtils.java
│   │       │   │                   ├── CleanUtils.java
│   │       │   │                   ├── ClickUtils.java
│   │       │   │                   ├── ClipboardUtils.java
│   │       │   │                   ├── CloneUtils.java
│   │       │   │                   ├── CloseUtils.java
│   │       │   │                   ├── CollectionUtils.java
│   │       │   │                   ├── ColorUtils.java
│   │       │   │                   ├── ConvertUtils.java
│   │       │   │                   ├── CrashUtils.java
│   │       │   │                   ├── DebouncingUtils.java
│   │       │   │                   ├── DeviceUtils.java
│   │       │   │                   ├── DialogUtils.java
│   │       │   │                   ├── EncodeUtils.java
│   │       │   │                   ├── EncryptUtils.java
│   │       │   │                   ├── FileIOUtils.java
│   │       │   │                   ├── FileUtils.java
│   │       │   │                   ├── FlashlightUtils.java
│   │       │   │                   ├── FragmentUtils.java
│   │       │   │                   ├── GsonUtils.java
│   │       │   │                   ├── ImageUtils.java
│   │       │   │                   ├── IntentUtils.java
│   │       │   │                   ├── JsonUtils.java
│   │       │   │                   ├── KeyboardUtils.java
│   │       │   │                   ├── LanguageUtils.java
│   │       │   │                   ├── LogUtils.java
│   │       │   │                   ├── MapUtils.java
│   │       │   │                   ├── MessengerUtils.java
│   │       │   │                   ├── MetaDataUtils.java
│   │       │   │                   ├── NetworkUtils.java
│   │       │   │                   ├── NotificationUtils.java
│   │       │   │                   ├── NumberUtils.java
│   │       │   │                   ├── ObjectUtils.java
│   │       │   │                   ├── PathUtils.java
│   │       │   │                   ├── PermissionUtils.java
│   │       │   │                   ├── PhoneUtils.java
│   │       │   │                   ├── ProcessUtils.java
│   │       │   │                   ├── ReflectUtils.java
│   │       │   │                   ├── RegexUtils.java
│   │       │   │                   ├── ResourceUtils.java
│   │       │   │                   ├── RomUtils.java
│   │       │   │                   ├── SDCardUtils.java
│   │       │   │                   ├── SPStaticUtils.java
│   │       │   │                   ├── SPUtils.java
│   │       │   │                   ├── ScreenUtils.java
│   │       │   │                   ├── ServiceUtils.java
│   │       │   │                   ├── ShadowUtils.java
│   │       │   │                   ├── ShellUtils.java
│   │       │   │                   ├── SizeUtils.java
│   │       │   │                   ├── SnackbarUtils.java
│   │       │   │                   ├── SpanUtils.java
│   │       │   │                   ├── StringUtils.java
│   │       │   │                   ├── ThreadUtils.java
│   │       │   │                   ├── ThrowableUtils.java
│   │       │   │                   ├── TimeUtils.java
│   │       │   │                   ├── ToastUtils.java
│   │       │   │                   ├── TouchUtils.java
│   │       │   │                   ├── UiMessageUtils.java
│   │       │   │                   ├── UriUtils.java
│   │       │   │                   ├── Utils.java
│   │       │   │                   ├── UtilsActivityLifecycleImpl.java
│   │       │   │                   ├── UtilsBridge.java
│   │       │   │                   ├── UtilsFileProvider.java
│   │       │   │                   ├── UtilsTransActivity.java
│   │       │   │                   ├── UtilsTransActivity4MainProcess.java
│   │       │   │                   ├── VibrateUtils.java
│   │       │   │                   ├── ViewUtils.java
│   │       │   │                   ├── VolumeUtils.java
│   │       │   │                   └── ZipUtils.java
│   │       │   └── res/
│   │       │       ├── drawable/
│   │       │       │   └── utils_toast_bg.xml
│   │       │       ├── layout/
│   │       │       │   └── utils_toast_view.xml
│   │       │       ├── values/
│   │       │       │   └── styles.xml
│   │       │       ├── values-v21/
│   │       │       │   └── styles.xml
│   │       │       └── xml/
│   │       │           └── util_code_provider_paths.xml
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── blankj/
│   │           │           └── utilcode/
│   │           │               └── util/
│   │           │                   ├── ApiUtilsTest.java
│   │           │                   ├── ArrayUtilsTest.java
│   │           │                   ├── BaseTest.java
│   │           │                   ├── BusUtilsTest.java
│   │           │                   ├── BusUtilsVsEventBusTest.java
│   │           │                   ├── CacheDiskStaticUtilsTest.java
│   │           │                   ├── CacheDiskUtilsTest.java
│   │           │                   ├── CacheDoubleStaticUtilsTest.java
│   │           │                   ├── CacheDoubleUtilsTest.java
│   │           │                   ├── CacheMemoryStaticUtilsTest.java
│   │           │                   ├── CacheMemoryUtilsTest.java
│   │           │                   ├── CloneUtilsTest.java
│   │           │                   ├── CollectionUtilsTest.java
│   │           │                   ├── ColorUtilsTest.java
│   │           │                   ├── ConvertUtilsTest.java
│   │           │                   ├── EncodeUtilsTest.java
│   │           │                   ├── EncryptUtilsTest.java
│   │           │                   ├── FileIOUtilsTest.java
│   │           │                   ├── FileUtilsTest.java
│   │           │                   ├── GsonUtilsTest.java
│   │           │                   ├── ImageUtilsTest.java
│   │           │                   ├── LogUtilsTest.java
│   │           │                   ├── MapUtilsTest.java
│   │           │                   ├── NumberUtilsTest.java
│   │           │                   ├── ObjectUtilsTest.java
│   │           │                   ├── PathUtilsTest.java
│   │           │                   ├── RegexUtilsTest.java
│   │           │                   ├── StringUtilsTest.java
│   │           │                   ├── TestConfig.java
│   │           │                   ├── ThreadUtilsTest.java
│   │           │                   ├── TimeUtilsTest.java
│   │           │                   ├── UiMessageUtilsTest.java
│   │           │                   ├── ZipUtilsTest.java
│   │           │                   └── reflect/
│   │           │                       ├── PrivateConstructors.java
│   │           │                       ├── ReflectUtilsTest.java
│   │           │                       ├── Test1.java
│   │           │                       ├── Test10.java
│   │           │                       ├── Test2.java
│   │           │                       ├── Test3.java
│   │           │                       ├── Test4.java
│   │           │                       ├── Test5.java
│   │           │                       ├── Test6.java
│   │           │                       ├── Test7.java
│   │           │                       ├── Test8.java
│   │           │                       ├── Test9.java
│   │           │                       ├── TestHierarchicalMethodsBase.java
│   │           │                       ├── TestHierarchicalMethodsSubclass.java
│   │           │                       └── TestPrivateStaticFinal.java
│   │           └── res/
│   │               ├── encrypt/
│   │               │   └── MD5.txt
│   │               ├── file/
│   │               │   ├── GBK.txt
│   │               │   ├── UTF16BE.txt
│   │               │   ├── UTF8.txt
│   │               │   ├── Unicode.txt
│   │               │   └── recuresive/
│   │               │       └── UTF8.txt
│   │               ├── image/
│   │               │   └── ic_launcher.tif
│   │               └── zip/
│   │                   ├── test.txt
│   │                   ├── testDir/
│   │                   │   └── test.txt
│   │                   ├── 测试.txt
│   │                   └── 测试文件夹/
│   │                       └── 测试.txt
│   ├── utildebug/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── blankj/
│   │           │           └── utildebug/
│   │           │               ├── DebugUtils.java
│   │           │               ├── base/
│   │           │               │   ├── drawable/
│   │           │               │   │   └── PolygonDrawable.java
│   │           │               │   ├── rv/
│   │           │               │   │   ├── BaseItem.java
│   │           │               │   │   ├── BaseItemAdapter.java
│   │           │               │   │   ├── ItemViewHolder.java
│   │           │               │   │   └── RecycleViewDivider.java
│   │           │               │   └── view/
│   │           │               │       ├── BaseContentFloatView.java
│   │           │               │       ├── BaseContentView.java
│   │           │               │       ├── BaseFloatView.java
│   │           │               │       ├── EmptyGoneTextView.java
│   │           │               │       ├── FloatEditText.java
│   │           │               │       ├── FloatToast.java
│   │           │               │       ├── FloatViewManager.java
│   │           │               │       ├── SearchEditText.java
│   │           │               │       ├── SwipeRightMenu.java
│   │           │               │       └── listener/
│   │           │               │           ├── OnBackListener.java
│   │           │               │           └── OnRefreshListener.java
│   │           │               ├── config/
│   │           │               │   └── DebugConfig.java
│   │           │               ├── debug/
│   │           │               │   ├── IDebug.java
│   │           │               │   └── tool/
│   │           │               │       ├── AbsToolDebug.java
│   │           │               │       ├── appInfo/
│   │           │               │       │   ├── AppInfoDebug.java
│   │           │               │       │   ├── AppInfoFloatView.java
│   │           │               │       │   └── AppInfoItem.java
│   │           │               │       ├── clearCache/
│   │           │               │       │   └── ClearCacheDebug.java
│   │           │               │       ├── clearStorage/
│   │           │               │       │   └── ClearStorageDebug.java
│   │           │               │       ├── deviceInfo/
│   │           │               │       │   ├── DeviceInfoDebug.java
│   │           │               │       │   ├── DeviceInfoFloatView.java
│   │           │               │       │   └── DeviceInfoItem.java
│   │           │               │       ├── fileExplorer/
│   │           │               │       │   ├── FileContentView.java
│   │           │               │       │   ├── FileExplorerDebug.java
│   │           │               │       │   ├── FileExplorerFloatView.java
│   │           │               │       │   ├── FileItem.java
│   │           │               │       │   ├── image/
│   │           │               │       │   │   └── ImageViewer.java
│   │           │               │       │   ├── sp/
│   │           │               │       │   │   ├── SpItem.java
│   │           │               │       │   │   ├── SpModifyContentView.java
│   │           │               │       │   │   └── SpViewerContentView.java
│   │           │               │       │   └── text/
│   │           │               │       │       └── TextViewer.java
│   │           │               │       ├── logcat/
│   │           │               │       │   └── LogcatDebug.java
│   │           │               │       └── restartApp/
│   │           │               │           └── RestartAppDebug.java
│   │           │               ├── helper/
│   │           │               │   ├── FileHelper.java
│   │           │               │   ├── ImageLoader.java
│   │           │               │   ├── ShadowHelper.java
│   │           │               │   ├── SpHelper.java
│   │           │               │   └── WindowHelper.java
│   │           │               ├── icon/
│   │           │               │   └── DebugIcon.java
│   │           │               └── menu/
│   │           │                   ├── DebugItem.java
│   │           │                   ├── DebugMenu.java
│   │           │                   ├── DebugMenuItem.java
│   │           │                   └── ReminderView.java
│   │           └── res/
│   │               ├── anim/
│   │               │   ├── float_in.xml
│   │               │   └── float_out.xml
│   │               ├── drawable/
│   │               │   ├── du_rotate_refresh.xml
│   │               │   ├── du_sel_et_bg.xml
│   │               │   ├── du_shape_base_float_bg.xml
│   │               │   ├── du_shape_base_float_title_adjust_bg.xml
│   │               │   ├── du_shape_base_float_title_bg.xml
│   │               │   ├── du_shape_base_float_title_close_bg.xml
│   │               │   ├── du_shape_btn.xml
│   │               │   ├── du_shape_divider.xml
│   │               │   ├── du_shape_file_divider.xml
│   │               │   ├── du_shape_input_bg.xml
│   │               │   ├── du_shape_item_menu_bg.xml
│   │               │   ├── du_shape_positive_btn.xml
│   │               │   ├── du_shape_shadow.xml
│   │               │   ├── du_shape_toast.xml
│   │               │   ├── du_switch_thumb.xml
│   │               │   └── du_switch_track.xml
│   │               ├── layout/
│   │               │   ├── du_base_content_float.xml
│   │               │   ├── du_debug_app_info.xml
│   │               │   ├── du_debug_device_info.xml
│   │               │   ├── du_debug_file_explorer.xml
│   │               │   ├── du_debug_file_explorer_image.xml
│   │               │   ├── du_debug_file_explorer_sp.xml
│   │               │   ├── du_debug_file_explorer_sp_modify.xml
│   │               │   ├── du_debug_icon.xml
│   │               │   ├── du_debug_menu.xml
│   │               │   ├── du_float_toast.xml
│   │               │   ├── du_item_base_info.xml
│   │               │   ├── du_item_empty.xml
│   │               │   ├── du_item_file.xml
│   │               │   ├── du_item_menu.xml
│   │               │   ├── du_item_menu_item.xml
│   │               │   ├── du_item_sp.xml
│   │               │   └── du_reminder_view.xml
│   │               ├── values/
│   │               │   ├── colors.xml
│   │               │   ├── dimens.xml
│   │               │   ├── ids.xml
│   │               │   ├── strings.xml
│   │               │   └── styles.xml
│   │               └── values-zh-rCN/
│   │                   └── strings.xml
│   └── utildebug-no-op/
│       ├── .gitignore
│       ├── build.gradle
│       ├── proguard-rules.pro
│       └── src/
│           └── main/
│               ├── AndroidManifest.xml
│               └── java/
│                   └── com/
│                       └── blankj/
│                           └── utildebug/
│                               ├── DebugUtils.java
│                               └── debug/
│                                   └── IDebug.java
├── module_config.gradle
├── module_config.json
├── plugin/
│   ├── api-gradle-plugin/
│   │   ├── .gitignore
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── build.gradle
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── blankj/
│   │       │               └── api/
│   │       │                   ├── ApiClassVisitor.java
│   │       │                   ├── ApiExtension.groovy
│   │       │                   ├── ApiInfo.java
│   │       │                   ├── ApiInject.groovy
│   │       │                   ├── ApiPlugin.groovy
│   │       │                   ├── ApiUtilsClassVisitor.java
│   │       │                   └── Config.groovy
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── blankj/
│   │                       └── api/
│   │                           ├── ApiTest.java
│   │                           └── ApiUtils.java
│   ├── buildSrc-plugin/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── blankj/
│   │                       └── buildSrc/
│   │                           ├── BuildSrcPlugin.groovy
│   │                           └── ModuleCfg.groovy
│   ├── bus-gradle-plugin/
│   │   ├── .gitignore
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── build.gradle
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── blankj/
│   │       │               └── bus/
│   │       │                   ├── BusClassVisitor.java
│   │       │                   ├── BusExtension.groovy
│   │       │                   ├── BusInfo.java
│   │       │                   ├── BusInject.groovy
│   │       │                   ├── BusPlugin.groovy
│   │       │                   ├── BusUtilsClassVisitor.java
│   │       │                   └── Config.groovy
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── blankj/
│   │                       └── bus/
│   │                           ├── BusTest.java
│   │                           └── BusUtils.java
│   └── lib/
│       └── base-transform/
│           ├── .gitignore
│           ├── CHANGELOG.md
│           ├── README.md
│           ├── build.gradle
│           └── src/
│               └── main/
│                   └── java/
│                       └── com/
│                           └── blankj/
│                               └── base_transform/
│                                   ├── BaseTransformCallback.groovy
│                                   ├── BaseTransformConfig.groovy
│                                   ├── BaseTransformPlugin.groovy
│                                   └── util/
│                                       ├── JsonUtils.groovy
│                                       ├── LogUtils.groovy
│                                       └── ZipUtils.java
├── script/
│   ├── gitHelp.sh
│   ├── runDevDebug.sh
│   └── runProductionRelease.sh
├── settings.gradle
└── sign/
    ├── keystore.jks
    └── keystore.properties
Download .txt
Showing preview only (442K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5093 symbols across 273 files)

FILE: feature/launcher/app/src/main/java/com/blankj/launcher/app/LauncherApp.java
  class LauncherApp (line 13) | public class LauncherApp extends CommonApplication {
    method getInstance (line 17) | public static LauncherApp getInstance() {
    method onCreate (line 21) | @Override

FILE: feature/main/app/src/main/java/com/blankj/main/app/MainApp.java
  class MainApp (line 15) | public class MainApp extends CommonApplication {
    method getInstance (line 19) | public static MainApp getInstance() {
    method attachBaseContext (line 23) | @Override
    method onCreate (line 28) | @Override

FILE: feature/mock/src/main/java/com/blankj/mock/subutil/SubUtilApiMock.java
  class SubUtilApiMock (line 17) | @ApiUtils.Api(isMock = true)
    method startSubUtilActivity (line 20) | @Override

FILE: feature/mock/src/main/java/com/blankj/mock/utilcode/UtilCodeApiMock.java
  class UtilCodeApiMock (line 17) | @ApiUtils.Api(isMock = true)
    method startUtilCodeActivity (line 20) | @Override
    method testCallback (line 25) | @Override

FILE: feature/subutil/export/src/main/java/com/blankj/subutil/export/api/SubUtilApi.java
  class SubUtilApi (line 16) | public abstract class SubUtilApi extends ApiUtils.BaseApi {
    method startSubUtilActivity (line 18) | public abstract void startSubUtilActivity(Context context);

FILE: feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/SubUtilApiImpl.java
  class SubUtilApiImpl (line 17) | @ApiUtils.Api
    method startSubUtilActivity (line 20) | @Override

FILE: feature/utilcode/export/src/main/java/com/blankj/utilcode/export/api/UtilCodeApi.java
  class UtilCodeApi (line 16) | public abstract class UtilCodeApi extends ApiUtils.BaseApi {
    method startUtilCodeActivity (line 18) | public abstract void startUtilCodeActivity(Context context);
    method testCallback (line 20) | public abstract void testCallback(Callback callback);
    type Callback (line 22) | public interface Callback {
      method call (line 23) | void call();

FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/UtilCodeApiImpl.java
  class UtilCodeApiImpl (line 17) | @ApiUtils.Api
    method startUtilCodeActivity (line 20) | @Override
    method testCallback (line 25) | @Override

FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/export/OtherModuleApi.java
  class OtherModuleApi (line 13) | public abstract class OtherModuleApi extends ApiUtils.BaseApi {
    method invokeWithParams (line 15) | public abstract void invokeWithParams(ApiBean bean);
    method invokeWithReturnValue (line 17) | public abstract ApiBean invokeWithReturnValue();
    class ApiBean (line 19) | public static class ApiBean {
      method ApiBean (line 23) | public ApiBean(String name) {

FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/pkg/OtherPkgApiImpl.java
  class OtherPkgApiImpl (line 15) | @ApiUtils.Api
    method invokeWithParams (line 18) | @Override
    method invokeWithReturnValue (line 23) | @Override

FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java
  class MvpActivity (line 21) | public class MvpActivity extends CommonActivity {
    method start (line 23) | public static void start(Context context) {
    method bindTitleRes (line 28) | @Override
    method bindLayout (line 33) | @Override
    method initView (line 38) | @Override

FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpModel.java
  class MvpModel (line 15) | public class MvpModel extends BaseModel implements MvpMvp.Model {
    method onCreate (line 19) | @Override
    method requestUpdateMsg (line 24) | @Override
    method onDestroy (line 40) | @Override

FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpMvp.java
  type MvpMvp (line 13) | public interface MvpMvp {
    type View (line 15) | interface View {
      method setLoadingVisible (line 16) | void setLoadingVisible(boolean visible);
      method showMsg (line 18) | void showMsg(CharSequence msg);
    type Presenter (line 21) | interface Presenter {
      method updateMsg (line 22) | void updateMsg();
    type Model (line 25) | interface Model {
      method requestUpdateMsg (line 26) | void requestUpdateMsg(final Utils.Consumer<String> consumer);

FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpPresenter.java
  class MvpPresenter (line 15) | public class MvpPresenter extends BasePresenter<MvpView>
    method onBindView (line 18) | @Override
    method updateMsg (line 22) | @Override

FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java
  class MvpView (line 23) | public class MvpView extends BaseView<MvpView>
    method MvpView (line 30) | public MvpView(MvpActivity activity) {
    method measure (line 46) | private void measure() {
    method setLoadingVisible (line 59) | @Override
    method showMsg (line 74) | @Override

FILE: feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java
  class TestPrivateStaticFinal (line 13) | @Keep

FILE: lib/base/src/main/java/com/blankj/base/BaseActivity.java
  class BaseActivity (line 21) | public abstract class BaseActivity extends AppCompatActivity
    method onClick (line 25) | @Override
    method onCreate (line 34) | @Override
    method setContentView (line 44) | @Override
    method applyDebouncingClickListener (line 51) | public void applyDebouncingClickListener(View... views) {

FILE: lib/base/src/main/java/com/blankj/base/BaseApplication.java
  class BaseApplication (line 25) | public class BaseApplication extends Application {
    method getInstance (line 29) | public static BaseApplication getInstance() {
    method attachBaseContext (line 36) | @Override
    method onCreate (line 42) | @Override
    method initLog (line 52) | public void initLog() {
    method initCrash (line 82) | private void initCrash() {
    method initDebugMenu (line 93) | private void initDebugMenu() {
    method isDebug (line 97) | private boolean isDebug() {
    method isMainProcess (line 102) | public boolean isMainProcess() {

FILE: lib/base/src/main/java/com/blankj/base/BaseFragment.java
  class BaseFragment (line 29) | public abstract class BaseFragment extends Fragment
    method onClick (line 37) | @Override
    method isLazy (line 54) | public boolean isLazy() {
    method setUserVisibleHint (line 58) | @Override
    method onAttach (line 72) | @Override
    method onCreate (line 79) | @Override
    method onCreateView (line 99) | @Nullable
    method setContentView (line 109) | @Override
    method onViewCreated (line 115) | @Override
    method onActivityCreated (line 121) | @Override
    method onHiddenChanged (line 132) | @Override
    method onDestroyView (line 138) | @Override
    method onSaveInstanceState (line 146) | @Override
    method onDestroy (line 153) | @Override
    method applyDebouncingClickListener (line 159) | public void applyDebouncingClickListener(View... views) {
    method findViewById (line 163) | public <T extends View> T findViewById(@IdRes int id) {
    method log (line 168) | protected void log(String msg) {

FILE: lib/base/src/main/java/com/blankj/base/IBaseView.java
  type IBaseView (line 19) | public interface IBaseView {
    method initData (line 21) | void initData(@Nullable Bundle bundle);
    method bindLayout (line 23) | int bindLayout();
    method setContentView (line 25) | void setContentView();
    method initView (line 27) | void initView(@Nullable Bundle savedInstanceState, @Nullable View cont...
    method doBusiness (line 29) | void doBusiness();
    method onDebouncingClick (line 31) | void onDebouncingClick(@NonNull View view);

FILE: lib/base/src/main/java/com/blankj/base/dialog/BaseDialog.java
  class BaseDialog (line 23) | public abstract class BaseDialog extends Dialog {
    method bindLayout (line 27) | public abstract int bindLayout();
    method initView (line 29) | public abstract void initView(BaseDialog dialog, View contentView);
    method setWindowStyle (line 31) | public abstract void setWindowStyle(Window window);
    method BaseDialog (line 33) | public BaseDialog(@NonNull Context context) {
    method BaseDialog (line 37) | public BaseDialog(@NonNull Context context, int themeResId) {
    method onCreate (line 46) | @Override
    method show (line 55) | @Override
    method dismiss (line 67) | @Override

FILE: lib/base/src/main/java/com/blankj/base/dialog/BaseDialogFragment.java
  class BaseDialogFragment (line 33) | public class BaseDialogFragment extends DialogFragment {
    method init (line 41) | public BaseDialogFragment init(Context context, DialogLayoutCallback l...
    method init (line 47) | public BaseDialogFragment init(Context context, DialogCallback dialogC...
    method getFragmentActivity (line 53) | private FragmentActivity getFragmentActivity(Context context) {
    method getTheme (line 63) | @Override
    method onCreateDialog (line 74) | @NonNull
    method onCreateView (line 91) | @Nullable
    method onViewCreated (line 100) | @Override
    method onCancel (line 109) | @Override
    method onDismiss (line 117) | @Override
    method show (line 125) | public void show() {
    method show (line 129) | public void show(final String tag) {
    method dismiss (line 146) | @Override

FILE: lib/base/src/main/java/com/blankj/base/dialog/DialogCallback.java
  type DialogCallback (line 17) | public interface DialogCallback {
    method bindDialog (line 18) | @NonNull
    method setWindowStyle (line 21) | void setWindowStyle(Window window);

FILE: lib/base/src/main/java/com/blankj/base/dialog/DialogLayoutCallback.java
  type DialogLayoutCallback (line 14) | public interface DialogLayoutCallback {
    method bindTheme (line 15) | int bindTheme();
    method bindLayout (line 17) | int bindLayout();
    method initView (line 19) | void initView(BaseDialogFragment dialog, View contentView);
    method setWindowStyle (line 21) | void setWindowStyle(Window window);
    method onCancel (line 23) | void onCancel(BaseDialogFragment dialog);
    method onDismiss (line 25) | void onDismiss(BaseDialogFragment dialog);

FILE: lib/base/src/main/java/com/blankj/base/mvp/BaseModel.java
  class BaseModel (line 15) | public abstract class BaseModel {
    method onCreate (line 19) | public abstract void onCreate();
    method onDestroy (line 21) | @CallSuper

FILE: lib/base/src/main/java/com/blankj/base/mvp/BasePresenter.java
  class BasePresenter (line 20) | public abstract class BasePresenter<V extends BaseView> {
    method onBindView (line 28) | public abstract void onBindView();
    method bindView (line 30) | void bindView(V view) {
    method getView (line 35) | public V getView() {
    method getModel (line 39) | public <M extends BaseModel> M getModel(Class<M> modelClass) {
    method onDestroy (line 58) | @CallSuper
    method isAlive (line 70) | public boolean isAlive() {

FILE: lib/base/src/main/java/com/blankj/base/mvp/BaseView.java
  class BaseView (line 23) | public class BaseView<V extends BaseView> implements LifecycleObserver {
    method BaseView (line 32) | public BaseView(Fragment fragment) {
    method BaseView (line 39) | public BaseView(FragmentActivity activity) {
    method BaseView (line 45) | public BaseView(Lifecycle lifecycle) {
    method getActivity (line 50) | public <T extends FragmentActivity> T getActivity() {
    method getFragment (line 58) | public <T extends Fragment> T getFragment() {
    method addPresenter (line 66) | public V addPresenter(BasePresenter<V> presenter) {
    method getPresenter (line 74) | public <P extends BasePresenter<V>> P getPresenter(Class<P> presenterC...
    method onDestroy (line 86) | @CallSuper
    method addLifecycle (line 99) | private void addLifecycle(LifecycleObserver observer) {
    method removeLifecycle (line 107) | private void removeLifecycle(LifecycleObserver observer) {

FILE: lib/base/src/main/java/com/blankj/base/rv/BaseItem.java
  class BaseItem (line 23) | public abstract class BaseItem<T extends BaseItem> {
    method onCreateViewHolder (line 29) | static ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, in...
    method bind (line 41) | public abstract void bind(@NonNull final ItemViewHolder holder, final ...
    method partialUpdate (line 43) | public void partialUpdate(List<Object> payloads) {
    method bindViewHolder (line 46) | void bindViewHolder(@NonNull final ItemViewHolder holder, final int po...
    method onViewRecycled (line 78) | public void onViewRecycled(@NonNull final ItemViewHolder holder, final...
    method getItemId (line 82) | public long getItemId() {
    method BaseItem (line 91) | public BaseItem(@LayoutRes int layoutId) {
    method BaseItem (line 96) | public BaseItem(@NonNull View view) {
    method getViewType (line 101) | public int getViewType() {
    method getAdapter (line 105) | public BaseItemAdapter<T> getAdapter() {
    method isViewType (line 109) | public boolean isViewType(@LayoutRes int layoutId) {
    method isViewType (line 113) | public boolean isViewType(@NonNull View view) {
    method getViewTypeByLayoutId (line 117) | private int getViewTypeByLayoutId(@LayoutRes int layoutId) {
    method getViewTypeByView (line 121) | private int getViewTypeByView(@NonNull View view) {
    method update (line 125) | public void update() {
    method getItems (line 131) | public List<T> getItems() {
    method getCount (line 135) | public int getCount() {
    method getIndex (line 139) | public int getIndex() {
    method getOnItemClickListener (line 144) | public OnItemClickListener<T> getOnItemClickListener() {
    method setOnItemClickListener (line 148) | public T setOnItemClickListener(OnItemClickListener<T> onItemClickList...
    method getOnItemLongClickListener (line 153) | public OnItemLongClickListener<T> getOnItemLongClickListener() {
    method setOnItemLongClickListener (line 157) | public T setOnItemLongClickListener(OnItemLongClickListener<T> onItemL...
    type OnItemClickListener (line 162) | public interface OnItemClickListener<T> {
      method onItemClick (line 163) | void onItemClick(ItemViewHolder holder, T item, int position);
    type OnItemLongClickListener (line 166) | public interface OnItemLongClickListener<T> {
      method onItemLongClick (line 167) | boolean onItemLongClick(ItemViewHolder holder, T item, int position);

FILE: lib/base/src/main/java/com/blankj/base/rv/BaseItemAdapter.java
  class BaseItemAdapter (line 21) | public class BaseItemAdapter<Item extends BaseItem> extends RecyclerView...
    method BaseItemAdapter (line 26) | public BaseItemAdapter() {
    method BaseItemAdapter (line 30) | public BaseItemAdapter(boolean hasStableIds) {
    method getItemViewType (line 34) | @Override
    method getItemId (line 41) | @Override
    method onCreateViewHolder (line 46) | @NonNull
    method onBindViewHolder (line 52) | @Override
    method onBindViewHolder (line 57) | @Override
    method getItemCount (line 66) | @Override
    method onViewRecycled (line 71) | @Override
    method onAttachedToRecyclerView (line 81) | @Override
    method getRecyclerView (line 87) | public RecyclerView getRecyclerView() {
    method setItems (line 91) | public void setItems(@NonNull final List<Item> items) {
    method getItems (line 95) | public List<Item> getItems() {
    method getItem (line 99) | public Item getItem(@IntRange(from = 0) final int position) {
    method isEmpty (line 103) | public boolean isEmpty() {
    method getItemById (line 111) | public Item getItemById(final long id) {
    method getItemIndexById (line 120) | public int getItemIndexById(final long id) {
    method hasItemWithId (line 129) | public boolean hasItemWithId(final long id) {
    method replaceItemById (line 133) | public int replaceItemById(final long id, @NonNull final Item item) {
    method replaceItemById (line 137) | public int replaceItemById(final long id, @NonNull final Item item, bo...
    method removeItemById (line 145) | public int removeItemById(final long id) {
    method removeItemById (line 149) | public int removeItemById(final long id, boolean notifyRemoved) {
    method updateItem (line 163) | public void updateItem(@NonNull final Item item) {
    method updateItem (line 167) | public void updateItem(@IntRange(from = 0) final int index) {
    method updateItem (line 171) | public void updateItem(@NonNull final Item item, Object payload) {
    method updateItem (line 175) | public void updateItem(@IntRange(from = 0) final int index, Object pay...
    method updateItems (line 179) | public void updateItems(@NonNull final Item item, int itemCount) {
    method updateItems (line 186) | public void updateItems(@IntRange(from = 0) final int index, int itemC...
    method updateItems (line 190) | public void updateItems(@NonNull final Item item, int itemCount, Objec...
    method updateItems (line 197) | public void updateItems(@IntRange(from = 0) final int index, int itemC...
    method addItem (line 201) | public void addItem(@NonNull final Item item) {
    method addItem (line 205) | public void addItem(@NonNull final Item item, boolean notifyInserted) {
    method addItem (line 210) | public void addItem(@IntRange(from = 0) final int index, @NonNull fina...
    method addItem (line 214) | public void addItem(@IntRange(from = 0) final int index, @NonNull fina...
    method addItems (line 219) | public void addItems(@NonNull final List<Item> items) {
    method addItems (line 223) | public void addItems(@NonNull final List<Item> items, boolean notifyIn...
    method addItems (line 228) | public void addItems(@IntRange(from = 0) final int index, @NonNull fin...
    method addItems (line 232) | public void addItems(@IntRange(from = 0) final int index, @NonNull fin...
    method swapItem (line 237) | public void swapItem(@IntRange(from = 0) final int firstIndex, @IntRan...
    method swapItem (line 241) | public void swapItem(@IntRange(from = 0) final int firstIndex,
    method replaceItem (line 247) | public Item replaceItem(@IntRange(from = 0) final int index, @NonNull ...
    method replaceItem (line 251) | public Item replaceItem(@IntRange(from = 0) final int index, @NonNull ...
    method replaceItems (line 257) | public boolean replaceItems(@NonNull final List<Item> items) {
    method replaceItems (line 261) | public boolean replaceItems(@NonNull final List<Item> items, boolean n...
    method removeItem (line 268) | public Item removeItem(@IntRange(from = 0) final int index) {
    method removeItem (line 272) | public Item removeItem(@IntRange(from = 0) final int index, boolean no...
    method removeItem (line 278) | public int removeItem(@NonNull final Item item) {
    method removeItem (line 282) | public int removeItem(@NonNull final Item item, boolean notifyRemoved) {
    method clear (line 291) | public void clear() {
    method clear (line 295) | public void clear(boolean notifyDataSetChanged) {
    method sortItems (line 300) | public void sortItems(@NonNull final Comparator<Item> comparator) {
    method sortItems (line 304) | public void sortItems(@NonNull final Comparator<Item> comparator, bool...

FILE: lib/base/src/main/java/com/blankj/base/rv/ItemViewHolder.java
  class ItemViewHolder (line 18) | public class ItemViewHolder extends RecyclerView.ViewHolder {
    method ItemViewHolder (line 22) | public ItemViewHolder(View itemView) {
    method findViewById (line 26) | @SuppressWarnings("unchecked")
    method setOnClickListener (line 36) | public void setOnClickListener(@IdRes final int viewId, View.OnClickLi...
    method setOnLongClickListener (line 40) | public void setOnLongClickListener(@IdRes final int viewId, View.OnLon...

FILE: lib/base/src/main/java/com/blankj/base/rv/RecycleViewDivider.java
  class RecycleViewDivider (line 24) | public class RecycleViewDivider extends RecyclerView.ItemDecoration {
    method RecycleViewDivider (line 36) | public RecycleViewDivider(Context context, int orientation, @DrawableR...
    method RecycleViewDivider (line 40) | public RecycleViewDivider(Context context, int orientation, @NonNull D...
    method RecycleViewDivider (line 44) | public RecycleViewDivider(Context context, int orientation, @DrawableR...
    method RecycleViewDivider (line 48) | public RecycleViewDivider(Context context, int orientation, @NonNull D...
    method setOrientation (line 54) | private void setOrientation(int orientation) {
    method onDraw (line 62) | @Override
    method drawVertical (line 74) | @SuppressLint("NewApi")
    method drawHorizontal (line 102) | @SuppressLint("NewApi")
    method getItemOffsets (line 130) | @Override

FILE: lib/base/src/main/java/com/blankj/base/view/EmptyGoneTextView.java
  class EmptyGoneTextView (line 20) | @SuppressLint("AppCompatCustomView")
    method EmptyGoneTextView (line 23) | public EmptyGoneTextView(Context context) {
    method EmptyGoneTextView (line 27) | public EmptyGoneTextView(Context context, @Nullable AttributeSet attrs) {
    method onTextChanged (line 32) | @Override

FILE: lib/common/src/main/java/com/blankj/common/CommonApplication.java
  class CommonApplication (line 13) | public class CommonApplication extends BaseApplication {
    method onCreate (line 15) | @Override

FILE: lib/common/src/main/java/com/blankj/common/activity/CommonActivity.java
  class CommonActivity (line 38) | public abstract class CommonActivity extends BaseActivity {
    method isSwipeBack (line 56) | public boolean isSwipeBack() {
    method bindTitleRes (line 60) | @StringRes
    method bindTitle (line 65) | public CharSequence bindTitle() {
    method isSupportScroll (line 69) | public boolean isSupportScroll() {
    method bindTitleView (line 73) | public CommonActivityTitleView bindTitleView() {
    method bindItemsView (line 80) | public CommonActivityItemsView bindItemsView() {
    method bindItems (line 84) | public List<CommonItem> bindItems() {
    method bindDrawerView (line 91) | public CommonActivityDrawerView bindDrawerView() {
    method bindDrawer (line 95) | public boolean bindDrawer() {
    method initData (line 99) | @CallSuper
    method bindLayout (line 138) | @Override
    method setContentView (line 143) | @Override
    method initSwipeBack (line 173) | private void initSwipeBack() {
    method initView (line 190) | @CallSuper
    method doBusiness (line 198) | @Override
    method onDebouncingClick (line 202) | @Override
    method onOptionsItemSelected (line 206) | @Override
    method showLoading (line 214) | public void showLoading() {
    method showLoading (line 218) | public void showLoading(Runnable listener) {
    method dismissLoading (line 226) | public void dismissLoading() {
    method getItemsView (line 233) | public CommonActivityItemsView getItemsView() {
    method getTitleView (line 237) | public CommonActivityTitleView getTitleView() {
    method getDrawerView (line 241) | public CommonActivityDrawerView getDrawerView() {
    method setCommonItems (line 247) | public void setCommonItems(RecyclerView rv, List<CommonItem> items) {
    method updateCommonItems (line 255) | public void updateCommonItems(List<CommonItem> data) {
    method updateCommonItem (line 260) | public void updateCommonItem(int position) {
    method getCommonItemAdapter (line 264) | public BaseItemAdapter<CommonItem> getCommonItemAdapter() {

FILE: lib/common/src/main/java/com/blankj/common/activity/CommonActivityDrawerView.java
  class CommonActivityDrawerView (line 27) | public class CommonActivityDrawerView {
    method onNavigationItemSelected (line 34) | @Override
    method CommonActivityDrawerView (line 46) | public CommonActivityDrawerView(@NonNull AppCompatActivity activity) {
    method bindLayout (line 50) | public int bindLayout() {
    method getContentView (line 54) | public View getContentView() {
    method goWeb (line 62) | private boolean goWeb(@StringRes int id) {

FILE: lib/common/src/main/java/com/blankj/common/activity/CommonActivityItemsView.java
  class CommonActivityItemsView (line 24) | public class CommonActivityItemsView {
    method CommonActivityItemsView (line 31) | public CommonActivityItemsView(@NonNull AppCompatActivity activity, @N...
    method bindLayout (line 36) | public int bindLayout() {
    method initView (line 40) | public void initView() {
    method updateItems (line 49) | public void updateItems(List<CommonItem> data) {
    method updateItem (line 54) | public void updateItem(int position) {

FILE: lib/common/src/main/java/com/blankj/common/activity/CommonActivityTitleView.java
  class CommonActivityTitleView (line 27) | public class CommonActivityTitleView {
    method CommonActivityTitleView (line 37) | public CommonActivityTitleView(@NonNull AppCompatActivity activity, @S...
    method CommonActivityTitleView (line 41) | public CommonActivityTitleView(@NonNull AppCompatActivity activity, @N...
    method CommonActivityTitleView (line 45) | public CommonActivityTitleView(@NonNull AppCompatActivity activity, @S...
    method CommonActivityTitleView (line 49) | public CommonActivityTitleView(@NonNull AppCompatActivity activity, @N...
    method setIsSupportScroll (line 55) | public void setIsSupportScroll(boolean isSupportScroll) {
    method bindLayout (line 59) | public int bindLayout() {
    method getContentView (line 63) | public View getContentView() {
    method setTitleBar (line 79) | private void setTitleBar() {
    method onOptionsItemSelected (line 88) | public boolean onOptionsItemSelected(MenuItem item) {

FILE: lib/common/src/main/java/com/blankj/common/dialog/CommonDialogContent.java
  class CommonDialogContent (line 24) | public class CommonDialogContent extends BaseDialogFragment {
    method init (line 34) | public CommonDialogContent init(Context context, final CharSequence ti...

FILE: lib/common/src/main/java/com/blankj/common/dialog/CommonDialogLoading.java
  class CommonDialogLoading (line 22) | public class CommonDialogLoading extends BaseDialogFragment {
    method init (line 24) | public CommonDialogLoading init(Context context, final Runnable onCanc...

FILE: lib/common/src/main/java/com/blankj/common/fragment/CommonFragment.java
  class CommonFragment (line 29) | public class CommonFragment extends BaseFragment {
    method bindItemsView (line 36) | public CommonActivityItemsView bindItemsView() {
    method bindItems (line 40) | public List<CommonItem> bindItems() {
    method initData (line 44) | @CallSuper
    method bindLayout (line 56) | @Override
    method setContentView (line 61) | @Override
    method initView (line 70) | @CallSuper
    method doBusiness (line 78) | @Override
    method onDebouncingClick (line 83) | @Override
    method getItemsView (line 88) | public CommonActivityItemsView getItemsView() {
    method setCommonItems (line 94) | public void setCommonItems(RecyclerView rv, List<CommonItem> items) {
    method updateCommonItems (line 102) | public void updateCommonItems(List<CommonItem> data) {
    method updateCommonItem (line 107) | public void updateCommonItem(int position) {
    method getCommonItemAdapter (line 111) | public BaseItemAdapter<CommonItem> getCommonItemAdapter() {

FILE: lib/common/src/main/java/com/blankj/common/item/CommonItem.java
  class CommonItem (line 19) | public class CommonItem<T extends BaseItem> extends BaseItem<T> {
    method CommonItem (line 23) | public CommonItem(int layoutId) {
    method bind (line 27) | @CallSuper
    method setBackgroundColor (line 33) | public CommonItem<T> setBackgroundColor(int backgroundColor) {
    method getBackgroundColor (line 38) | public int getBackgroundColor() {

FILE: lib/common/src/main/java/com/blankj/common/item/CommonItemClick.java
  class CommonItemClick (line 23) | public class CommonItemClick extends CommonItem<CommonItemClick> {
    method CommonItemClick (line 29) | public CommonItemClick(@StringRes int title) {
    method CommonItemClick (line 33) | public CommonItemClick(@NonNull CharSequence title) {
    method CommonItemClick (line 37) | public CommonItemClick(@StringRes int title, boolean isJump) {
    method CommonItemClick (line 41) | public CommonItemClick(@NonNull CharSequence title, boolean isJump) {
    method CommonItemClick (line 45) | public CommonItemClick(@StringRes int title, CharSequence content) {
    method CommonItemClick (line 49) | public CommonItemClick(@NonNull CharSequence title, CharSequence conte...
    method CommonItemClick (line 53) | public CommonItemClick(@StringRes int title, CharSequence content, boo...
    method CommonItemClick (line 57) | public CommonItemClick(@NonNull CharSequence title, CharSequence conte...
    method CommonItemClick (line 61) | public CommonItemClick(@StringRes int title, final Runnable simpleClic...
    method CommonItemClick (line 65) | public CommonItemClick(@NonNull CharSequence title, final Runnable sim...
    method CommonItemClick (line 69) | public CommonItemClick(@StringRes int title, boolean isJump, final Run...
    method CommonItemClick (line 73) | public CommonItemClick(@NonNull CharSequence title, boolean isJump, fi...
    method CommonItemClick (line 77) | public CommonItemClick(@StringRes int title, CharSequence content, fin...
    method CommonItemClick (line 81) | public CommonItemClick(@NonNull CharSequence title, CharSequence conte...
    method CommonItemClick (line 85) | public CommonItemClick(@StringRes int title, CharSequence content, boo...
    method CommonItemClick (line 89) | public CommonItemClick(@NonNull CharSequence title, CharSequence conte...
    method setOnClickUpdateContentListener (line 105) | public CommonItemClick setOnClickUpdateContentListener(@NonNull final ...
    method bind (line 116) | @Override
    method setTitle (line 129) | public void setTitle(CharSequence title) {
    method getTitle (line 134) | public CharSequence getTitle() {

FILE: lib/common/src/main/java/com/blankj/common/item/CommonItemImage.java
  class CommonItemImage (line 22) | public class CommonItemImage extends CommonItem {
    method CommonItemImage (line 27) | public CommonItemImage(@StringRes int title, @NonNull Utils.Consumer<I...
    method CommonItemImage (line 31) | public CommonItemImage(@NonNull CharSequence title, @NonNull Utils.Con...
    method bind (line 37) | @Override

FILE: lib/common/src/main/java/com/blankj/common/item/CommonItemSeekBar.java
  class CommonItemSeekBar (line 23) | public class CommonItemSeekBar extends CommonItem {
    method CommonItemSeekBar (line 31) | public CommonItemSeekBar(@StringRes int title, int maxProgress, @NonNu...
    method CommonItemSeekBar (line 35) | public CommonItemSeekBar(@NonNull CharSequence title, int maxProgress,...
    method bind (line 45) | @Override
    method setTitle (line 85) | public void setTitle(CharSequence title) {
    method getTitle (line 90) | public CharSequence getTitle() {
    class ProgressListener (line 94) | public static abstract class ProgressListener implements SeekBar.OnSee...
      method getCurValue (line 96) | public abstract int getCurValue();
      method onStartTrackingTouch (line 98) | @Override
      method onStopTrackingTouch (line 102) | @Override

FILE: lib/common/src/main/java/com/blankj/common/item/CommonItemSwitch.java
  class CommonItemSwitch (line 26) | public class CommonItemSwitch extends CommonItem {
    method CommonItemSwitch (line 35) | public CommonItemSwitch(@StringRes int title, @NonNull Utils.Supplier<...
    method CommonItemSwitch (line 39) | public CommonItemSwitch(@NonNull CharSequence title, @NonNull Utils.Su...
    method bind (line 48) | @SuppressLint("ClickableViewAccessibility")
    method setTitle (line 79) | public void setTitle(CharSequence title) {
    method getTitle (line 84) | public CharSequence getTitle() {

FILE: lib/common/src/main/java/com/blankj/common/item/CommonItemTitle.java
  class CommonItemTitle (line 23) | public class CommonItemTitle extends CommonItem {
    method CommonItemTitle (line 30) | public CommonItemTitle(@NonNull Utils.Supplier<CharSequence> getTitleS...
    method CommonItemTitle (line 37) | public CommonItemTitle(@StringRes int title, boolean isTitleCenter) {
    method CommonItemTitle (line 41) | public CommonItemTitle(@NonNull CharSequence title, boolean isTitleCen...
    method CommonItemTitle (line 47) | public CommonItemTitle(@NonNull CharSequence title, CharSequence conte...
    method bind (line 53) | @Override
    method setTitle (line 77) | public void setTitle(CharSequence title) {
    method setContent (line 81) | public void setContent(CharSequence content) {
    method setTitle (line 85) | public void setTitle(CharSequence title, boolean isUpdate) {
    method setContent (line 92) | public void setContent(CharSequence content, boolean isUpdate) {
    method getTitle (line 99) | public CharSequence getTitle() {

FILE: lib/common/src/main/java/com/blankj/common/view/RotateView.java
  class RotateView (line 20) | public class RotateView extends View {
    method RotateView (line 24) | public RotateView(Context context) {
    method RotateView (line 28) | public RotateView(Context context, @Nullable AttributeSet attrs) {
    method RotateView (line 32) | public RotateView(Context context, @Nullable AttributeSet attrs, int d...
    method onVisibilityChanged (line 36) | @Override
    method initAnimator (line 49) | private void initAnimator() {

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/AppStoreUtils.java
  class AppStoreUtils (line 23) | public final class AppStoreUtils {
    method getAppStoreIntent (line 34) | public static Intent getAppStoreIntent() {
    method getAppStoreIntent (line 44) | public static Intent getAppStoreIntent(boolean isIncludeGooglePlayStor...
    method getAppStoreIntent (line 54) | public static Intent getAppStoreIntent(final String packageName) {
    method getAppStoreIntent (line 66) | public static Intent getAppStoreIntent(final String packageName, boole...
    method getSamsungAppStoreIntent (line 107) | private static Intent getSamsungAppStoreIntent(final String packageNam...
    method getLeecoAppStoreIntent (line 118) | private static Intent getLeecoAppStoreIntent(final String packageName) {
    method getAvailableIntentSize (line 130) | private static int getAvailableIntentSize(final Intent intent) {

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/BatteryUtils.java
  class BatteryUtils (line 30) | public final class BatteryUtils {
    method isIgnoringBatteryOptimizations (line 48) | @RequiresApi(api = Build.VERSION_CODES.M)
    method isIgnoringBatteryOptimizations (line 58) | @RequiresApi(api = Build.VERSION_CODES.M)
    method registerBatteryStatusChangedListener (line 74) | public static void registerBatteryStatusChangedListener(final OnBatter...
    method isRegistered (line 84) | public static boolean isRegistered(final OnBatteryStatusChangedListene...
    method unregisterBatteryStatusChangedListener (line 93) | public static void unregisterBatteryStatusChangedListener(final OnBatt...
    class BatteryChangedReceiver (line 97) | public static final class BatteryChangedReceiver extends BroadcastRece...
      method getInstance (line 99) | private static BatteryChangedReceiver getInstance() {
      method registerListener (line 105) | void registerListener(final OnBatteryStatusChangedListener listener) {
      method isRegistered (line 121) | boolean isRegistered(final OnBatteryStatusChangedListener listener) {
      method unregisterListener (line 126) | void unregisterListener(final OnBatteryStatusChangedListener listene...
      method onReceive (line 140) | @Override
      class LazyHolder (line 156) | private static class LazyHolder {
    type OnBatteryStatusChangedListener (line 161) | public interface OnBatteryStatusChangedListener {
      method onBatteryStatusChanged (line 162) | void onBatteryStatusChanged(Status status);
    class Status (line 165) | public static final class Status {
      method Status (line 170) | Status(int level, int status) {
      method getLevel (line 175) | public int getLevel() {
      method setLevel (line 179) | public void setLevel(int level) {
      method getStatus (line 183) | @BatteryStatus
      method setStatus (line 188) | public void setStatus(int status) {
      method toString (line 192) | @Override
      method batteryStatus2String (line 197) | public static String batteryStatus2String(@BatteryStatus int status) {

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/BitUtils.java
  class BitUtils (line 13) | public final class BitUtils {
    method BitUtils (line 15) | private BitUtils() {
    method getBitValue (line 27) | public static byte getBitValue(byte source, int pos) {
    method setBitValue (line 42) | public static byte setBitValue(byte source, int pos, byte value) {
    method reverseBitValue (line 64) | public static byte reverseBitValue(byte source, int pos) {
    method checkBitValue (line 78) | public static boolean checkBitValue(byte source, int pos) {
    method main (line 91) | public static void main(String[] args) {

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/CameraUtils.java
  class CameraUtils (line 11) | public final class CameraUtils {

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/CoordinateUtils.java
  class CoordinateUtils (line 13) | public final class CoordinateUtils {
    method bd09ToGcj02 (line 26) | public static double[] bd09ToGcj02(double lng, double lat) {
    method gcj02ToBd09 (line 43) | public static double[] gcj02ToBd09(double lng, double lat) {
    method gcj02ToWGS84 (line 58) | public static double[] gcj02ToWGS84(double lng, double lat) {
    method wgs84ToGcj02 (line 82) | public static double[] wgs84ToGcj02(double lng, double lat) {
    method bd09ToWGS84 (line 106) | public static double[] bd09ToWGS84(double lng, double lat) {
    method wgs84ToBd09 (line 119) | public static double[] wgs84ToBd09(double lng, double lat) {
    method mercatorToWGS84 (line 131) | public static double[] mercatorToWGS84(double lng, double lat) {
    method wgs84ToMercator (line 145) | public static double[] wgs84ToMercator(double lng, double lat) {
    method transformLat (line 152) | private static double transformLat(double lng, double lat) {
    method transformLng (line 160) | private static double transformLng(double lng, double lat) {
    method outOfChina (line 168) | private static boolean outOfChina(double lng, double lat) {

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/CountryUtils.java
  class CountryUtils (line 19) | public class CountryUtils {
    method getCountryCodeBySim (line 29) | public static String getCountryCodeBySim(String defaultValue) {
    method getCountryCodeByLanguage (line 43) | public static String getCountryCodeByLanguage(String defaultValue) {
    method getCountryBySim (line 56) | public static String getCountryBySim() {
    method getCountryByLanguage (line 69) | public static String getCountryByLanguage() {
    method getCountryCodeFromMap (line 73) | private static HashMap<String, String> getCountryCodeFromMap() {

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/DangerousUtils.java
  class DangerousUtils (line 34) | public class DangerousUtils {
    method DangerousUtils (line 36) | private DangerousUtils() {
    method installAppSilent (line 53) | public static boolean installAppSilent(final String filePath) {
    method installAppSilent (line 66) | public static boolean installAppSilent(final File file) {
    method installAppSilent (line 81) | public static boolean installAppSilent(final String filePath, final St...
    method installAppSilent (line 95) | public static boolean installAppSilent(final File file, final String p...
    method installAppSilent (line 110) | public static boolean installAppSilent(final File file,
    method uninstallAppSilent (line 138) | public static boolean uninstallAppSilent(final String packageName) {
    method uninstallAppSilent (line 152) | public static boolean uninstallAppSilent(final String packageName, fin...
    method uninstallAppSilent (line 167) | public static boolean uninstallAppSilent(final String packageName,
    method isFileExists (line 185) | private static boolean isFileExists(final File file) {
    method getFileByPath (line 189) | private static File getFileByPath(final String filePath) {
    method isSpace (line 193) | private static boolean isSpace(final String s) {
    method isDeviceRooted (line 203) | private static boolean isDeviceRooted() {
    method shutdown (line 230) | public static boolean shutdown() {
    method reboot (line 248) | public static boolean reboot() {
    method reboot (line 273) | public static boolean reboot(final String reason) {
    method reboot2Recovery (line 289) | public static boolean reboot2Recovery() {
    method reboot2Bootloader (line 300) | public static boolean reboot2Bootloader() {
    method setMobileDataEnabled (line 314) | @RequiresPermission(MODIFY_PHONE_STATE)
    method sendSmsSilent (line 341) | @RequiresPermission(SEND_SMS)

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/HttpsUtil.java
  class HttpsUtil (line 17) | public final class HttpsUtil {
    method postJson (line 30) | public static String postJson(String data, String url) {
    method postForm (line 42) | public static String postForm(String data, String url) {
    method getJson (line 54) | public static String getJson(String data, String url) {
    method getForm (line 66) | public static String getForm(String data, String url) {
    method doHttpAction (line 70) | private static String doHttpAction(String data, boolean json, boolean ...

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/LocationUtils.java
  class LocationUtils (line 34) | public final class LocationUtils {
    method LocationUtils (line 42) | private LocationUtils() {
    method isGpsEnabled (line 117) | public static boolean isGpsEnabled() {
    method isLocationEnabled (line 127) | public static boolean isLocationEnabled() {
    method openGpsSettings (line 136) | public static void openGpsSettings() {
    method register (line 156) | @RequiresPermission(ACCESS_FINE_LOCATION)
    method unregister (line 177) | @RequiresPermission(ACCESS_COARSE_LOCATION)
    method getCriteria (line 196) | private static Criteria getCriteria() {
    method getAddress (line 220) | public static Address getAddress(double latitude, double longitude) {
    method getCountryName (line 238) | public static String getCountryName(double latitude, double longitude) {
    method getLocality (line 250) | public static String getLocality(double latitude, double longitude) {
    method getStreet (line 262) | public static String getStreet(double latitude, double longitude) {
    method isBetterLocation (line 274) | public static boolean isBetterLocation(Location newLocation, Location ...
    method isSameProvider (line 322) | public static boolean isSameProvider(String provider0, String provider...
    class MyLocationListener (line 329) | private static class MyLocationListener
      method onLocationChanged (line 336) | @Override
      method onStatusChanged (line 350) | @Override
      method onProviderEnabled (line 371) | @Override
      method onProviderDisabled (line 378) | @Override
    type OnLocationChangeListener (line 383) | public interface OnLocationChangeListener {
      method getLastKnownLocation (line 390) | void getLastKnownLocation(Location location);
      method onLocationChanged (line 397) | void onLocationChanged(Location location);
      method onStatusChanged (line 406) | void onStatusChanged(String provider, int status, Bundle extras);

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/LunarUtils.java
  class LunarUtils (line 11) | public final class LunarUtils {
    method LunarUtils (line 13) | private LunarUtils() {
    method getBitInt (line 60) | private static int getBitInt(final int data, final int length, final i...
    method lunarYear2GanZhi (line 71) | public static String lunarYear2GanZhi(final int lunarYear) {
    method lunar2Solar (line 83) | public static Solar lunar2Solar(final Lunar lunar) {
    method solar2Lunar (line 115) | public static Lunar solar2Lunar(final Solar solar) {
    method solarFromInt (line 160) | private static Solar solarFromInt(final long g) {
    method solarToInt (line 178) | private static long solarToInt(int y, int m, final int d) {
    class Lunar (line 184) | public static class Lunar {
      method Lunar (line 191) | Lunar() {
      method Lunar (line 194) | public Lunar(int lunarYear, int lunarMonth, int lunarDay, boolean is...
      method toString (line 201) | @Override
    class Solar (line 207) | public static class Solar {
      method Solar (line 213) | Solar() {
      method Solar (line 216) | public Solar(int solarYear, int solarMonth, int solarDay) {
      method toString (line 222) | @Override

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/PinyinUtils.java
  class PinyinUtils (line 13) | public final class PinyinUtils {
    method PinyinUtils (line 15) | private PinyinUtils() {
    method ccs2Pinyin (line 25) | public static String ccs2Pinyin(final CharSequence ccs) {
    method ccs2Pinyin (line 36) | public static String ccs2Pinyin(final CharSequence ccs, final CharSequ...
    method getPinyinFirstLetter (line 58) | public static String getPinyinFirstLetter(final CharSequence ccs) {
    method getPinyinFirstLetters (line 69) | public static String getPinyinFirstLetters(final CharSequence ccs) {
    method getPinyinFirstLetters (line 80) | public static String getPinyinFirstLetters(final CharSequence ccs, fin...
    method getSurnamePinyin (line 96) | public static String getSurnamePinyin(final CharSequence name) {
    method getSurnameFirstLetter (line 123) | public static String getSurnameFirstLetter(final CharSequence name) {

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/RetrofitUtils.java
  class RetrofitUtils (line 11) | public final class RetrofitUtils {

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/TemperatureUtils.java
  class TemperatureUtils (line 13) | public final class TemperatureUtils {
    method cToF (line 15) | public static float cToF(float temp) {
    method cToK (line 19) | public static float cToK(float temp) {
    method fToC (line 24) | public static float fToC(float temp) {
    method fToK (line 28) | public static float fToK(float temp) {
    method kToC (line 33) | public static float kToC(float temp) {
    method kToF (line 37) | public static float kToF(float temp) {

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/Utils.java
  class Utils (line 34) | public final class Utils {
    method Utils (line 39) | private Utils() {
    method init (line 49) | public static void init(final Context context) {
    method init (line 63) | public static void init(final Application app) {
    method getApp (line 78) | public static Application getApp() {
    method getApplicationByReflect (line 83) | private static Application getApplicationByReflect() {
    class ContentProvider4SubUtil (line 107) | public static final class ContentProvider4SubUtil extends ContentProvi...
      method onCreate (line 109) | @Override
      method query (line 115) | @Nullable
      method getType (line 121) | @Nullable
      method insert (line 127) | @Nullable
      method delete (line 133) | @Override
      method update (line 138) | @Override

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/http/Chain.java
  type Chain (line 3) | public interface Chain {

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/http/ExecutorFactory.java
  class ExecutorFactory (line 15) | public final class ExecutorFactory {
    method newThread (line 26) | public Thread newThread(@NonNull Runnable r) {
    method execute (line 35) | @Override
    method getDefaultWorkExecutor (line 41) | public static Executor getDefaultWorkExecutor() {
    method getDefaultMainExecutor (line 45) | public static Executor getDefaultMainExecutor() {

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/http/Headers.java
  class Headers (line 7) | public class Headers {

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/http/HttpUtils.java
  class HttpUtils (line 30) | public final class HttpUtils {
    method HttpUtils (line 45) | private HttpUtils(@NonNull Config config) {
    method getInstance (line 49) | public static HttpUtils getInstance(@NonNull Config config) {
    method call (line 58) | public static void call(@NonNull final Request request, @NonNull final...
    method getConnection (line 62) | private static HttpURLConnection getConnection(final Request request) ...
    method addBody (line 77) | private static void addBody(HttpURLConnection conn, Request.Body body)...
    method addHeader (line 100) | private static void addHeader(final HttpURLConnection conn, final Map<...
    method isSpace (line 108) | private static boolean isSpace(final String s) {
    method is2String (line 118) | static String is2String(final InputStream is, final String charset) {
    method writeFileFromIS (line 138) | static boolean writeFileFromIS(final File file,
    method createOrExistsFile (line 168) | private static boolean createOrExistsFile(final File file) {
    method createOrExistsDir (line 180) | private static boolean createOrExistsDir(final File file) {
    class Config (line 184) | public static class Config {
    class Call (line 197) | static class Call implements Runnable {
      method Call (line 202) | public Call(Request request, ResponseCallback callback) {
      method run (line 207) | @Override

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/http/Interceptor.java
  type Interceptor (line 5) | public interface Interceptor {
    method intercept (line 7) | Response intercept(Chain chain) throws IOException;

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/http/Request.java
  class Request (line 24) | public final class Request {
    method withUrl (line 30) | public static Request withUrl(@NonNull final String url) {
    method Request (line 34) | private Request(final String url) {
    method addHeader (line 42) | public Request addHeader(@NonNull final String name, @NonNull final St...
    method addHeader (line 50) | public Request addHeader(@NonNull final Map<String, String> header) {
    method post (line 58) | public Request post(@NonNull final Body body) {
    class Body (line 63) | public static class Body {
      method Body (line 68) | private Body(final String mediaType, final byte[] body) {
      method Body (line 74) | private Body(final String mediaType, final InputStream body) {
      method getCharsetFromMediaType (line 84) | private static String getCharsetFromMediaType(String mediaType) {
      method create (line 110) | public static Body create(@NonNull String mediaType, @NonNull byte[]...
      method form (line 114) | public static Body form(@NonNull final Map<String, String> form) {
      method form (line 118) | public static Body form(@NonNull final Map<String, String> form, Str...
      method json (line 133) | public static Body json(@NonNull final String json) {
      method json (line 137) | public static Body json(@NonNull final String json, String charset) {
    method checkCharset (line 154) | private static String checkCharset(final String charset) {

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/http/Response.java
  class Response (line 19) | public class Response {
    method Response (line 23) | public Response(Map<String, List<String>> headers, InputStream body) {
    method getHeaders (line 28) | public Map<String, List<String>> getHeaders() {
    method getBody (line 32) | public InputStream getBody() {
    method getString (line 36) | public String getString() {
    method getString (line 40) | public String getString(final String charset) {
    method getJson (line 44) | public <T> T getJson(final Type type) {
    method getJson (line 48) | public <T> T getJson(final Type type, final String charset) {
    method downloadFile (line 52) | public boolean downloadFile(final File file) {

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/http/ResponseCallback.java
  class ResponseCallback (line 10) | public abstract class ResponseCallback {
    method onResponse (line 11) | public abstract void onResponse(Response response);
    method onFailed (line 13) | public abstract void onFailed(Exception e);

FILE: lib/subutil/src/main/java/com/blankj/subutil/util/http/SSLConfig.java
  class SSLConfig (line 32) | public final class SSLConfig {
    method SSLConfig (line 37) | public SSLConfig(@NonNull SSLSocketFactory factory, @NonNull HostnameV...
    method verify (line 43) | public boolean verify(String hostname, SSLSession session) {
    class DefaultSSLSocketFactory (line 51) | private static class DefaultSSLSocketFactory extends SSLSocketFactory {
      method checkClientTrusted (line 68) | @SuppressLint("TrustAllX509TrustManager")
      method checkServerTrusted (line 72) | @SuppressLint("TrustAllX509TrustManager")
      method getAcceptedIssuers (line 76) | @Override
      method checkClientTrusted (line 81) | @SuppressLint("TrustAllX509TrustManager")
      method checkServerTrusted (line 85) | @SuppressLint("TrustAllX509TrustManager")
      method checkClientTrusted (line 89) | @SuppressLint("TrustAllX509TrustManager")
      method checkServerTrusted (line 93) | @SuppressLint("TrustAllX509TrustManager")
      method checkClientTrusted (line 101) | @SuppressLint("TrustAllX509TrustManager")
      method checkServerTrusted (line 105) | @SuppressLint("TrustAllX509TrustManager")
      method getAcceptedIssuers (line 109) | @Override
      method DefaultSSLSocketFactory (line 121) | DefaultSSLSocketFactory() {
      method getDefaultCipherSuites (line 131) | @Override
      method getSupportedCipherSuites (line 136) | @Override
      method createSocket (line 141) | @Override
      method createSocket (line 148) | @Override
      method createSocket (line 155) | @Override
      method createSocket (line 162) | @Override
      method createSocket (line 169) | @Override
      method createSocket (line 176) | @Override
      method setSupportProtocolAndCipherSuites (line 183) | private void setSupportProtocolAndCipherSuites(Socket socket) {

FILE: lib/subutil/src/test/java/com/blankj/subutil/util/BaseTest.java
  class BaseTest (line 22) | @RunWith(RobolectricTestRunner.class)
    method BaseTest (line 26) | public BaseTest() {
    method test (line 31) | @Test

FILE: lib/subutil/src/test/java/com/blankj/subutil/util/CoordinateUtilsTest.java
  class CoordinateUtilsTest (line 16) | public class CoordinateUtilsTest {
    method gcj2BD09 (line 26) | @Test
    method bd092GCJ (line 34) | @Test
    method bd092WGS (line 42) | @Test
    method wgs2BD09 (line 50) | @Test
    method wgs2GCJ (line 58) | @Test
    method gcj2WGS (line 66) | @Test
    method gcj2WGSExactly (line 74) | @Test
    method distance (line 82) | public static double distance(double lngA, double latA, double lngB, d...

FILE: lib/subutil/src/test/java/com/blankj/subutil/util/LunarUtilsTest.java
  class LunarUtilsTest (line 13) | public class LunarUtilsTest {
    method lunarYear2GanZhi (line 15) | @Test
    method lunar2Solar (line 20) | @Test
    method solar2Lunar (line 25) | @Test

FILE: lib/subutil/src/test/java/com/blankj/subutil/util/TemperatureUtilsTest.java
  class TemperatureUtilsTest (line 17) | @RunWith(JUnit4.class)
    method cToF (line 22) | @Test
    method cToK (line 27) | @Test
    method fToC (line 33) | @Test
    method fToK (line 38) | @Test
    method kToC (line 44) | @Test
    method kToF (line 49) | @Test

FILE: lib/subutil/src/test/java/com/blankj/subutil/util/TestConfig.java
  class TestConfig (line 11) | public class TestConfig {

FILE: lib/subutil/src/test/java/com/blankj/subutil/util/http/HttpUtilsTest.java
  class HttpUtilsTest (line 23) | public class HttpUtilsTest extends BaseTest {

FILE: lib/subutil/src/test/java/com/blankj/subutil/util/http/UserBean.java
  class UserBean (line 11) | class UserBean {
    method getName (line 18) | public String getName() {
    method setName (line 22) | public void setName(String name) {
    method getPassword (line 26) | public String getPassword() {
    method setPassword (line 30) | public void setPassword(String password) {
    method getProfession (line 34) | public String getProfession() {
    method setProfession (line 38) | public void setProfession(String profession) {
    method getId (line 42) | public int getId() {
    method setId (line 46) | public void setId(int id) {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/constant/CacheConstants.java
  type CacheConstants (line 11) | public interface CacheConstants {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
  class MemoryConstants (line 16) | public final class MemoryConstants {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
  class PermissionConstants (line 20) | @SuppressLint("InlinedApi")
    method getPermissions (line 78) | public static String[] getPermissions(@PermissionGroup final String pe...

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/constant/RegexConstants.java
  class RegexConstants (line 11) | public final class RegexConstants {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
  class TimeConstants (line 16) | public final class TimeConstants {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
  class ActivityUtils (line 37) | public final class ActivityUtils {
    method ActivityUtils (line 39) | private ActivityUtils() {
    method addActivityLifecycleCallbacks (line 48) | public static void addActivityLifecycleCallbacks(@Nullable final Utils...
    method addActivityLifecycleCallbacks (line 58) | public static void addActivityLifecycleCallbacks(@Nullable final Activ...
    method removeActivityLifecycleCallbacks (line 68) | public static void removeActivityLifecycleCallbacks(@Nullable final Ut...
    method removeActivityLifecycleCallbacks (line 77) | public static void removeActivityLifecycleCallbacks(@Nullable final Ac...
    method removeActivityLifecycleCallbacks (line 87) | public static void removeActivityLifecycleCallbacks(@Nullable final Ac...
    method getActivityByContext (line 98) | @Nullable
    method getActivityByContextInner (line 106) | @Nullable
    method getActivityFromDecorContext (line 129) | @Nullable
    method isActivityExists (line 151) | public static boolean isActivityExists(@NonNull final String pkg,
    method startActivity (line 166) | public static void startActivity(@NonNull final Class<? extends Activi...
    method startActivity (line 177) | public static void startActivity(@NonNull final Class<? extends Activi...
    method startActivity (line 192) | public static void startActivity(@NonNull final Class<? extends Activi...
    method startActivity (line 209) | public static void startActivity(@NonNull final Activity activity,
    method startActivity (line 221) | public static void startActivity(@NonNull final Activity activity,
    method startActivity (line 235) | public static void startActivity(@NonNull final Activity activity,
    method startActivity (line 252) | public static void startActivity(@NonNull final Activity activity,
    method startActivity (line 269) | public static void startActivity(@NonNull final Bundle extras,
    method startActivity (line 282) | public static void startActivity(@NonNull final Bundle extras,
    method startActivity (line 299) | public static void startActivity(@NonNull final Bundle extras,
    method startActivity (line 318) | public static void startActivity(@NonNull final Bundle extras,
    method startActivity (line 332) | public static void startActivity(@NonNull final Bundle extras,
    method startActivity (line 348) | public static void startActivity(@NonNull final Bundle extras,
    method startActivity (line 367) | public static void startActivity(@NonNull final Bundle extras,
    method startActivity (line 385) | public static void startActivity(@NonNull final String pkg,
    method startActivity (line 397) | public static void startActivity(@NonNull final String pkg,
    method startActivity (line 413) | public static void startActivity(@NonNull final String pkg,
    method startActivity (line 431) | public static void startActivity(@NonNull final Activity activity,
    method startActivity (line 445) | public static void startActivity(@NonNull final Activity activity,
    method startActivity (line 461) | public static void startActivity(@NonNull final Activity activity,
    method startActivity (line 479) | public static void startActivity(@NonNull final Activity activity,
    method startActivity (line 497) | public static void startActivity(@NonNull final Bundle extras,
    method startActivity (line 511) | public static void startActivity(@NonNull final Bundle extras,
    method startActivity (line 529) | public static void startActivity(@NonNull final Bundle extras,
    method startActivity (line 549) | public static void startActivity(@NonNull final Bundle extras,
    method startActivity (line 565) | public static void startActivity(@NonNull final Bundle extras,
    method startActivity (line 583) | public static void startActivity(@NonNull final Bundle extras,
    method startActivity (line 602) | public static void startActivity(@NonNull final Bundle extras,
    method startActivity (line 620) | public static boolean startActivity(@NonNull final Intent intent) {
    method startActivity (line 631) | public static boolean startActivity(@NonNull final Intent intent,
    method startActivity (line 646) | public static boolean startActivity(@NonNull final Intent intent,
    method startActivity (line 665) | public static void startActivity(@NonNull final Activity activity,
    method startActivity (line 677) | public static void startActivity(@NonNull final Activity activity,
    method startActivity (line 691) | public static void startActivity(@NonNull final Activity activity,
    method startActivity (line 707) | public static void startActivity(@NonNull final Activity activity,
    method startActivityForResult (line 725) | public static void startActivityForResult(@NonNull final Activity acti...
    method startActivityForResult (line 741) | public static void startActivityForResult(@NonNull final Activity acti...
    method startActivityForResult (line 759) | public static void startActivityForResult(@NonNull final Activity acti...
    method startActivityForResult (line 779) | public static void startActivityForResult(@NonNull final Activity acti...
    method startActivityForResult (line 800) | public static void startActivityForResult(@NonNull final Bundle extras,
    method startActivityForResult (line 818) | public static void startActivityForResult(@NonNull final Bundle extras,
    method startActivityForResult (line 838) | public static void startActivityForResult(@NonNull final Bundle extras,
    method startActivityForResult (line 860) | public static void startActivityForResult(@NonNull final Bundle extras,
    method startActivityForResult (line 883) | public static void startActivityForResult(@NonNull final Bundle extras,
    method startActivityForResult (line 902) | public static void startActivityForResult(@NonNull final Bundle extras,
    method startActivityForResult (line 923) | public static void startActivityForResult(@NonNull final Bundle extras,
    method startActivityForResult (line 946) | public static void startActivityForResult(@NonNull final Bundle extras,
    method startActivityForResult (line 968) | public static void startActivityForResult(@NonNull final Activity acti...
    method startActivityForResult (line 983) | public static void startActivityForResult(@NonNull final Activity acti...
    method startActivityForResult (line 1000) | public static void startActivityForResult(@NonNull final Activity acti...
    method startActivityForResult (line 1020) | public static void startActivityForResult(@NonNull final Activity acti...
    method startActivityForResult (line 1040) | public static void startActivityForResult(@NonNull final Fragment frag...
    method startActivityForResult (line 1056) | public static void startActivityForResult(@NonNull final Fragment frag...
    method startActivityForResult (line 1074) | public static void startActivityForResult(@NonNull final Fragment frag...
    method startActivityForResult (line 1094) | public static void startActivityForResult(@NonNull final Fragment frag...
    method startActivityForResult (line 1112) | public static void startActivityForResult(@NonNull final Bundle extras,
    method startActivityForResult (line 1130) | public static void startActivityForResult(@NonNull final Bundle extras,
    method startActivityForResult (line 1150) | public static void startActivityForResult(@NonNull final Bundle extras,
    method startActivityForResult (line 1172) | public static void startActivityForResult(@NonNull final Bundle extras,
    method startActivityForResult (line 1192) | public static void startActivityForResult(@NonNull final Bundle extras,
    method startActivityForResult (line 1211) | public static void startActivityForResult(@NonNull final Bundle extras,
    method startActivityForResult (line 1232) | public static void startActivityForResult(@NonNull final Bundle extras,
    method startActivityForResult (line 1255) | public static void startActivityForResult(@NonNull final Bundle extras,
    method startActivityForResult (line 1274) | public static void startActivityForResult(@NonNull final Fragment frag...
    method startActivityForResult (line 1289) | public static void startActivityForResult(@NonNull final Fragment frag...
    method startActivityForResult (line 1306) | public static void startActivityForResult(@NonNull final Fragment frag...
    method startActivityForResult (line 1326) | public static void startActivityForResult(@NonNull final Fragment frag...
    method startActivities (line 1340) | public static void startActivities(@NonNull final Intent[] intents) {
    method startActivities (line 1350) | public static void startActivities(@NonNull final Intent[] intents,
    method startActivities (line 1364) | public static void startActivities(@NonNull final Intent[] intents,
    method startActivities (line 1380) | public static void startActivities(@NonNull final Activity activity,
    method startActivities (line 1392) | public static void startActivities(@NonNull final Activity activity,
    method startActivities (line 1408) | public static void startActivities(@NonNull final Activity activity,
    method startHomeActivity (line 1421) | public static void startHomeActivity() {
    method startLauncherActivity (line 1431) | public static void startLauncherActivity() {
    method startLauncherActivity (line 1440) | public static void startLauncherActivity(@NonNull final String pkg) {
    method getActivityList (line 1451) | public static List<Activity> getActivityList() {
    method getLauncherActivity (line 1460) | public static String getLauncherActivity() {
    method getLauncherActivity (line 1470) | public static String getLauncherActivity(@NonNull final String pkg) {
    method getMainActivities (line 1488) | public static List<String> getMainActivities() {
    method getMainActivities (line 1498) | public static List<String> getMainActivities(@NonNull final String pkg) {
    method getTopActivity (line 1520) | public static Activity getTopActivity() {
    method isActivityAlive (line 1530) | public static boolean isActivityAlive(final Context context) {
    method isActivityAlive (line 1540) | public static boolean isActivityAlive(final Activity activity) {
    method isActivityExistsInStack (line 1551) | public static boolean isActivityExistsInStack(@NonNull final Activity ...
    method isActivityExistsInStack (line 1567) | public static boolean isActivityExistsInStack(@NonNull final Class<? e...
    method finishActivity (line 1582) | public static void finishActivity(@NonNull final Activity activity) {
    method finishActivity (line 1592) | public static void finishActivity(@NonNull final Activity activity, fi...
    method finishActivity (line 1608) | public static void finishActivity(@NonNull final Activity activity,
    method finishActivity (line 1620) | public static void finishActivity(@NonNull final Class<? extends Activ...
    method finishActivity (line 1630) | public static void finishActivity(@NonNull final Class<? extends Activ...
    method finishActivity (line 1652) | public static void finishActivity(@NonNull final Class<? extends Activ...
    method finishToActivity (line 1670) | public static boolean finishToActivity(@NonNull final Activity activity,
    method finishToActivity (line 1682) | public static boolean finishToActivity(@NonNull final Activity activity,
    method finishToActivity (line 1708) | public static boolean finishToActivity(@NonNull final Activity activity,
    method finishToActivity (line 1731) | public static boolean finishToActivity(@NonNull final Class<? extends ...
    method finishToActivity (line 1743) | public static boolean finishToActivity(@NonNull final Class<? extends ...
    method finishToActivity (line 1769) | public static boolean finishToActivity(@NonNull final Class<? extends ...
    method finishOtherActivities (line 1791) | public static void finishOtherActivities(@NonNull final Class<? extend...
    method finishOtherActivities (line 1802) | public static void finishOtherActivities(@NonNull final Class<? extend...
    method finishOtherActivities (line 1821) | public static void finishOtherActivities(@NonNull final Class<? extend...
    method finishAllActivities (line 1835) | public static void finishAllActivities() {
    method finishAllActivities (line 1844) | public static void finishAllActivities(final boolean isLoadAnim) {
    method finishAllActivities (line 1863) | public static void finishAllActivities(@AnimRes final int enterAnim,
    method finishAllActivitiesExceptNewest (line 1876) | public static void finishAllActivitiesExceptNewest() {
    method finishAllActivitiesExceptNewest (line 1885) | public static void finishAllActivitiesExceptNewest(final boolean isLoa...
    method finishAllActivitiesExceptNewest (line 1900) | public static void finishAllActivitiesExceptNewest(@AnimRes final int ...
    method getActivityIcon (line 1914) | @Nullable
    method getActivityIcon (line 1925) | @Nullable
    method getActivityIcon (line 1936) | @Nullable
    method getActivityLogo (line 1953) | @Nullable
    method getActivityLogo (line 1964) | @Nullable
    method getActivityLogo (line 1975) | @Nullable
    method startActivity (line 1986) | private static void startActivity(final Context context,
    method startActivity (line 1997) | private static boolean startActivity(final Intent intent,
    method startActivityForResult (line 2016) | private static boolean startActivityForResult(final Activity activity,
    method startActivityForResult (line 2028) | private static boolean startActivityForResult(final Intent intent,
    method startActivities (line 2045) | private static void startActivities(final Intent[] intents,
    method startActivityForResult (line 2060) | private static boolean startActivityForResult(final Fragment fragment,
    method startActivityForResult (line 2072) | private static boolean startActivityForResult(final Intent intent,
    method getOptionsBundle (line 2093) | private static Bundle getOptionsBundle(final Fragment fragment,
    method getOptionsBundle (line 2101) | private static Bundle getOptionsBundle(final Context context,
    method getOptionsBundle (line 2107) | private static Bundle getOptionsBundle(final Fragment fragment,
    method getOptionsBundle (line 2114) | private static Bundle getOptionsBundle(final Activity activity,
    method getTopActivityOrApp (line 2128) | private static Context getTopActivityOrApp() {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/AdaptScreenUtils.java
  class AdaptScreenUtils (line 20) | public final class AdaptScreenUtils {
    method AdaptScreenUtils (line 24) | private AdaptScreenUtils() {
    method adaptWidth (line 31) | @NonNull
    method adaptHeight (line 41) | @NonNull
    method adaptHeight (line 49) | @NonNull
    method getNavBarHeight (line 58) | private static int getNavBarHeight(@NonNull final Resources resources) {
    method closeAdapt (line 71) | @NonNull
    method pt2Px (line 84) | public static int pt2Px(final float ptValue) {
    method px2Pt (line 95) | public static int px2Pt(final float pxValue) {
    method applyDisplayMetrics (line 100) | private static void applyDisplayMetrics(@NonNull final Resources resou...
    method getPreLoadRunnable (line 106) | static Runnable getPreLoadRunnable() {
    method preLoad (line 115) | private static void preLoad() {
    method applyOtherDisplayMetrics (line 119) | private static void applyOtherDisplayMetrics(final Resources resources...
    method applyMetricsFields (line 147) | private static void applyMetricsFields(final Resources resources, fina...
    method getMetricsFromField (line 158) | private static DisplayMetrics getMetricsFromField(final Resources reso...

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/ApiUtils.java
  class ApiUtils (line 24) | public final class ApiUtils {
    method ApiUtils (line 31) | private ApiUtils() {
    method init (line 39) | private void init() {/*inject*/}
    method registerImpl (line 41) | private void registerImpl(Class implClass) {
    method getApi (line 52) | @Nullable
    method register (line 57) | public static void register(@Nullable Class<? extends BaseApi> implCla...
    method toString_ (line 62) | @NonNull
    method toString (line 67) | @Override
    method getInstance (line 72) | private static ApiUtils getInstance() {
    method getApiInner (line 76) | private <Result> Result getApiInner(Class apiClass) {
    class LazyHolder (line 103) | private static class LazyHolder {
    class BaseApi (line 113) | public static class BaseApi {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java
  class AppUtils (line 32) | public final class AppUtils {
    method AppUtils (line 34) | private AppUtils() {
    method registerAppStatusChangedListener (line 43) | public static void registerAppStatusChangedListener(@NonNull final Uti...
    method unregisterAppStatusChangedListener (line 52) | public static void unregisterAppStatusChangedListener(@NonNull final U...
    method installApp (line 63) | public static void installApp(final String filePath) {
    method installApp (line 74) | public static void installApp(final File file) {
    method installApp (line 87) | public static void installApp(final Uri uri) {
    method uninstallApp (line 100) | public static void uninstallApp(final String packageName) {
    method isAppInstalled (line 111) | public static boolean isAppInstalled(final String pkgName) {
    method isAppRoot (line 126) | public static boolean isAppRoot() {
    method isAppDebug (line 136) | public static boolean isAppDebug() {
    method isAppDebug (line 146) | public static boolean isAppDebug(final String packageName) {
    method isAppSystem (line 163) | public static boolean isAppSystem() {
    method isAppSystem (line 173) | public static boolean isAppSystem(final String packageName) {
    method isAppForeground (line 190) | public static boolean isAppForeground() {
    method isAppForeground (line 202) | public static boolean isAppForeground(@NonNull final String pkgName) {
    method isAppRunning (line 212) | public static boolean isAppRunning(final String pkgName) {
    method launchApp (line 243) | public static void launchApp(final String packageName) {
    method relaunchApp (line 256) | public static void relaunchApp() {
    method relaunchApp (line 265) | public static void relaunchApp(final boolean isKillProcess) {
    method launchAppDetailsSettings (line 284) | public static void launchAppDetailsSettings() {
    method launchAppDetailsSettings (line 293) | public static void launchAppDetailsSettings(final String pkgName) {
    method launchAppDetailsSettings (line 306) | public static void launchAppDetailsSettings(final Activity activity, f...
    method launchAppDetailsSettings (line 317) | public static void launchAppDetailsSettings(final Activity activity, f...
    method exitApp (line 327) | public static void exitApp() {
    method getAppIcon (line 337) | @Nullable
    method getAppIcon (line 348) | @Nullable
    method getAppIconId (line 366) | public static int getAppIconId() {
    method getAppIconId (line 376) | public static int getAppIconId(final String packageName) {
    method isFirstTimeInstall (line 394) | public static boolean isFirstTimeInstall() {
    method isAppUpgraded (line 409) | public static boolean isAppUpgraded() {
    method getAppPackageName (line 425) | @NonNull
    method getAppName (line 435) | @NonNull
    method getAppName (line 446) | @NonNull
    method getAppPath (line 464) | @NonNull
    method getAppPath (line 475) | @NonNull
    method getAppVersionName (line 493) | @NonNull
    method getAppVersionName (line 504) | @NonNull
    method getAppVersionCode (line 522) | public static int getAppVersionCode() {
    method getAppVersionCode (line 532) | public static int getAppVersionCode(final String packageName) {
    method getAppMinSdkVersion (line 549) | public static int getAppMinSdkVersion() {
    method getAppMinSdkVersion (line 559) | public static int getAppMinSdkVersion(final String packageName) {
    method getAppTargetSdkVersion (line 579) | public static int getAppTargetSdkVersion() {
    method getAppTargetSdkVersion (line 589) | public static int getAppTargetSdkVersion(final String packageName) {
    method getAppSignatures (line 608) | @Nullable
    method getAppSignatures (line 619) | @Nullable
    method getAppSignatures (line 652) | @Nullable
    method getAppSignaturesSHA1 (line 679) | @NonNull
    method getAppSignaturesSHA1 (line 690) | @NonNull
    method getAppSignaturesSHA256 (line 700) | @NonNull
    method getAppSignaturesSHA256 (line 711) | @NonNull
    method getAppSignaturesMD5 (line 721) | @NonNull
    method getAppSignaturesMD5 (line 732) | @NonNull
    method getAppUid (line 742) | public static int getAppUid() {
    method getAppUid (line 752) | public static int getAppUid(String pkgName) {
    method getAppSignaturesHash (line 761) | private static List<String> getAppSignaturesHash(final String packageN...
    method getAppInfo (line 790) | @Nullable
    method getAppInfo (line 812) | @Nullable
    method getAppsInfo (line 829) | @NonNull
    method getApkInfo (line 848) | @Nullable
    method getApkInfo (line 859) | @Nullable
    method isFirstTimeInstalled (line 878) | public static boolean isFirstTimeInstalled() {
    method getBean (line 888) | private static AppInfo getBean(final PackageManager pm, final PackageI...
    class AppInfo (line 912) | public static class AppInfo {
      method getIcon (line 924) | public Drawable getIcon() {
      method setIcon (line 928) | public void setIcon(final Drawable icon) {
      method isSystem (line 932) | public boolean isSystem() {
      method setSystem (line 936) | public void setSystem(final boolean isSystem) {
      method getPackageName (line 940) | public String getPackageName() {
      method setPackageName (line 944) | public void setPackageName(final String packageName) {
      method getName (line 948) | public String getName() {
      method setName (line 952) | public void setName(final String name) {
      method getPackagePath (line 956) | public String getPackagePath() {
      method setPackagePath (line 960) | public void setPackagePath(final String packagePath) {
      method getVersionCode (line 964) | public int getVersionCode() {
      method setVersionCode (line 968) | public void setVersionCode(final int versionCode) {
      method getVersionName (line 972) | public String getVersionName() {
      method setVersionName (line 976) | public void setVersionName(final String versionName) {
      method getMinSdkVersion (line 980) | public int getMinSdkVersion() {
      method setMinSdkVersion (line 984) | public void setMinSdkVersion(int minSdkVersion) {
      method getTargetSdkVersion (line 988) | public int getTargetSdkVersion() {
      method setTargetSdkVersion (line 992) | public void setTargetSdkVersion(int targetSdkVersion) {
      method AppInfo (line 996) | public AppInfo(String packageName, String name, Drawable icon, Strin...
      method toString (line 1008) | @Override

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/ArrayUtils.java
  class ArrayUtils (line 22) | public class ArrayUtils {
    method ArrayUtils (line 26) | private ArrayUtils() {
    method newArray (line 36) | @NonNull
    method newLongArray (line 41) | @NonNull
    method newIntArray (line 46) | @NonNull
    method newShortArray (line 51) | @NonNull
    method newCharArray (line 56) | @NonNull
    method newByteArray (line 61) | @NonNull
    method newDoubleArray (line 66) | @NonNull
    method newFloatArray (line 71) | @NonNull
    method newBooleanArray (line 76) | @NonNull
    method isEmpty (line 87) | public static boolean isEmpty(@Nullable Object array) {
    method getLength (line 97) | public static int getLength(@Nullable Object array) {
    method isSameLength (line 102) | public static boolean isSameLength(@Nullable Object array1, @Nullable ...
    method get (line 113) | @Nullable
    method get (line 126) | @Nullable
    method set (line 143) | public static void set(@Nullable Object array, int index, @Nullable Ob...
    method equals (line 155) | public static boolean equals(@Nullable Object[] a, @Nullable Object[] ...
    method equals (line 159) | public static boolean equals(boolean[] a, boolean[] a2) {
    method equals (line 163) | public static boolean equals(byte[] a, byte[] a2) {
    method equals (line 167) | public static boolean equals(char[] a, char[] a2) {
    method equals (line 171) | public static boolean equals(double[] a, double[] a2) {
    method equals (line 175) | public static boolean equals(float[] a, float[] a2) {
    method equals (line 179) | public static boolean equals(int[] a, int[] a2) {
    method equals (line 183) | public static boolean equals(short[] a, short[] a2) {
    method reverse (line 200) | public static <T> void reverse(T[] array) {
    method reverse (line 216) | public static void reverse(long[] array) {
    method reverse (line 232) | public static void reverse(int[] array) {
    method reverse (line 248) | public static void reverse(short[] array) {
    method reverse (line 264) | public static void reverse(char[] array) {
    method reverse (line 280) | public static void reverse(byte[] array) {
    method reverse (line 296) | public static void reverse(double[] array) {
    method reverse (line 312) | public static void reverse(float[] array) {
    method reverse (line 328) | public static void reverse(boolean[] array) {
    method copy (line 360) | @Nullable
    method copy (line 366) | @Nullable
    method copy (line 372) | @Nullable
    method copy (line 378) | @Nullable
    method copy (line 384) | @Nullable
    method copy (line 390) | @Nullable
    method copy (line 396) | @Nullable
    method copy (line 402) | @Nullable
    method copy (line 408) | @Nullable
    method realCopy (line 414) | @Nullable
    method subArray (line 424) | @Nullable
    method subArray (line 430) | @Nullable
    method subArray (line 435) | @Nullable
    method subArray (line 440) | @Nullable
    method subArray (line 445) | @Nullable
    method subArray (line 450) | @Nullable
    method subArray (line 455) | @Nullable
    method subArray (line 460) | @Nullable
    method subArray (line 465) | @Nullable
    method realSubArray (line 470) | @Nullable
    method add (line 518) | @NonNull
    method add (line 524) | @NonNull
    method add (line 529) | @NonNull
    method add (line 534) | @NonNull
    method add (line 539) | @NonNull
    method add (line 544) | @NonNull
    method add (line 549) | @NonNull
    method add (line 554) | @NonNull
    method add (line 559) | @NonNull
    method realAddOne (line 564) | @NonNull
    method add (line 599) | @Nullable
    method add (line 604) | @Nullable
    method add (line 609) | @Nullable
    method add (line 614) | @Nullable
    method add (line 619) | @Nullable
    method add (line 624) | @Nullable
    method add (line 629) | @Nullable
    method add (line 634) | @Nullable
    method add (line 639) | @Nullable
    method realAddArr (line 644) | private static Object realAddArr(@Nullable Object array1, @Nullable Ob...
    method add (line 688) | @Nullable
    method add (line 701) | @Nullable
    method add (line 708) | public static char[] add(@Nullable char[] array1, int index, @Nullable...
    method add (line 714) | @Nullable
    method add (line 721) | @Nullable
    method add (line 728) | @Nullable
    method add (line 735) | @Nullable
    method add (line 742) | @Nullable
    method add (line 749) | @Nullable
    method realAddArr (line 756) | @Nullable
    method add (line 816) | @NonNull
    method add (line 829) | @NonNull
    method add (line 834) | @NonNull
    method add (line 839) | @NonNull
    method add (line 844) | @NonNull
    method add (line 849) | @NonNull
    method add (line 854) | @NonNull
    method add (line 859) | @NonNull
    method add (line 864) | @NonNull
    method realAdd (line 869) | @NonNull
    method remove (line 923) | @Nullable
    method removeElement (line 953) | @Nullable
    method remove (line 962) | @Nullable
    method removeElement (line 968) | @Nullable
    method remove (line 977) | @Nullable
    method removeElement (line 983) | @Nullable
    method remove (line 992) | @Nullable
    method removeElement (line 998) | @Nullable
    method remove (line 1007) | @Nullable
    method removeElement (line 1013) | @Nullable
    method remove (line 1023) | @Nullable
    method removeElement (line 1029) | @Nullable
    method remove (line 1038) | @Nullable
    method removeElement (line 1044) | @Nullable
    method remove (line 1053) | @Nullable
    method removeElement (line 1059) | @Nullable
    method remove (line 1068) | @Nullable
    method removeElement (line 1074) | @Nullable
    method remove (line 1083) | @NonNull
    method indexOf (line 1103) | public static int indexOf(@Nullable Object[] array, @Nullable Object o...
    method indexOf (line 1107) | public static int indexOf(@Nullable Object[] array, @Nullable final Ob...
    method lastIndexOf (line 1130) | public static int lastIndexOf(@Nullable Object[] array, @Nullable Obje...
    method lastIndexOf (line 1134) | public static int lastIndexOf(@Nullable Object[] array, @Nullable Obje...
    method contains (line 1159) | public static boolean contains(@Nullable Object[] array, @Nullable Obj...
    method indexOf (line 1167) | public static int indexOf(@Nullable long[] array, long valueToFind) {
    method indexOf (line 1171) | public static int indexOf(@Nullable long[] array, long valueToFind, in...
    method lastIndexOf (line 1186) | public static int lastIndexOf(@Nullable long[] array, long valueToFind) {
    method lastIndexOf (line 1190) | public static int lastIndexOf(@Nullable long[] array, long valueToFind...
    method contains (line 1207) | public static boolean contains(@Nullable long[] array, long valueToFin...
    method indexOf (line 1215) | public static int indexOf(@Nullable int[] array, int valueToFind) {
    method indexOf (line 1219) | public static int indexOf(@Nullable int[] array, int valueToFind, int ...
    method lastIndexOf (line 1234) | public static int lastIndexOf(@Nullable int[] array, int valueToFind) {
    method lastIndexOf (line 1238) | public static int lastIndexOf(@Nullable int[] array, int valueToFind, ...
    method contains (line 1255) | public static boolean contains(@Nullable int[] array, int valueToFind) {
    method indexOf (line 1263) | public static int indexOf(@Nullable short[] array, short valueToFind) {
    method indexOf (line 1267) | public static int indexOf(@Nullable short[] array, short valueToFind, ...
    method lastIndexOf (line 1282) | public static int lastIndexOf(@Nullable short[] array, short valueToFi...
    method lastIndexOf (line 1286) | public static int lastIndexOf(@Nullable short[] array, short valueToFi...
    method contains (line 1303) | public static boolean contains(@Nullable short[] array, short valueToF...
    method indexOf (line 1311) | public static int indexOf(@Nullable char[] array, char valueToFind) {
    method indexOf (line 1315) | public static int indexOf(@Nullable char[] array, char valueToFind, in...
    method lastIndexOf (line 1330) | public static int lastIndexOf(@Nullable char[] array, char valueToFind) {
    method lastIndexOf (line 1334) | public static int lastIndexOf(@Nullable char[] array, char valueToFind...
    method contains (line 1351) | public static boolean contains(@Nullable char[] array, char valueToFin...
    method indexOf (line 1359) | public static int indexOf(@Nullable byte[] array, byte valueToFind) {
    method indexOf (line 1363) | public static int indexOf(@Nullable byte[] array, byte valueToFind, in...
    method lastIndexOf (line 1378) | public static int lastIndexOf(@Nullable byte[] array, byte valueToFind) {
    method lastIndexOf (line 1382) | public static int lastIndexOf(@Nullable byte[] array, byte valueToFind...
    method contains (line 1399) | public static boolean contains(@Nullable byte[] array, byte valueToFin...
    method indexOf (line 1407) | public static int indexOf(@Nullable double[] array, double valueToFind) {
    method indexOf (line 1411) | public static int indexOf(@Nullable double[] array, double valueToFind...
    method indexOf (line 1415) | public static int indexOf(@Nullable double[] array, double valueToFind...
    method indexOf (line 1430) | public static int indexOf(@Nullable double[] array, double valueToFind...
    method lastIndexOf (line 1447) | public static int lastIndexOf(@Nullable double[] array, double valueTo...
    method lastIndexOf (line 1451) | public static int lastIndexOf(@Nullable double[] array, double valueTo...
    method lastIndexOf (line 1455) | public static int lastIndexOf(@Nullable double[] array, double valueTo...
    method lastIndexOf (line 1472) | public static int lastIndexOf(@Nullable double[] array, double valueTo...
    method contains (line 1491) | public static boolean contains(@Nullable double[] array, double valueT...
    method contains (line 1495) | public static boolean contains(@Nullable double[] array, double valueT...
    method indexOf (line 1503) | public static int indexOf(@Nullable float[] array, float valueToFind) {
    method indexOf (line 1507) | public static int indexOf(@Nullable float[] array, float valueToFind, ...
    method lastIndexOf (line 1522) | public static int lastIndexOf(@Nullable float[] array, float valueToFi...
    method lastIndexOf (line 1526) | public static int lastIndexOf(@Nullable float[] array, float valueToFi...
    method contains (line 1543) | public static boolean contains(@Nullable float[] array, float valueToF...
    method indexOf (line 1551) | public static int indexOf(@Nullable boolean[] array, boolean valueToFi...
    method indexOf (line 1555) | public static int indexOf(@Nullable boolean[] array, boolean valueToFi...
    method lastIndexOf (line 1570) | public static int lastIndexOf(@Nullable boolean[] array, boolean value...
    method lastIndexOf (line 1574) | public static int lastIndexOf(@Nullable boolean[] array, boolean value...
    method contains (line 1591) | public static boolean contains(@Nullable boolean[] array, boolean valu...
    method toPrimitive (line 1599) | @Nullable
    method toPrimitive (line 1613) | @Nullable
    method toObject (line 1628) | @Nullable
    method toPrimitive (line 1646) | @Nullable
    method toPrimitive (line 1660) | @Nullable
    method toObject (line 1675) | @Nullable
    method toPrimitive (line 1693) | @Nullable
    method toPrimitive (line 1707) | @Nullable
    method toObject (line 1722) | @Nullable
    method toPrimitive (line 1740) | @Nullable
    method toPrimitive (line 1754) | @Nullable
    method toObject (line 1769) | @Nullable
    method toPrimitive (line 1787) | @Nullable
    method toPrimitive (line 1801) | @Nullable
    method toObject (line 1816) | @Nullable
    method toPrimitive (line 1834) | @Nullable
    method toPrimitive (line 1848) | @Nullable
    method toObject (line 1863) | @Nullable
    method toPrimitive (line 1881) | @Nullable
    method toPrimitive (line 1895) | @Nullable
    method toObject (line 1910) | @Nullable
    method toPrimitive (line 1928) | @Nullable
    method toPrimitive (line 1942) | @Nullable
    method toObject (line 1957) | @Nullable
    method asList (line 1971) | @NonNull
    method asUnmodifiableList (line 1979) | @NonNull
    method asArrayList (line 1984) | @NonNull
    method asLinkedList (line 1992) | @NonNull
    method sort (line 2000) | public static <T> void sort(@Nullable T[] array, Comparator<? super T>...
    method sort (line 2005) | public static void sort(@Nullable byte[] array) {
    method sort (line 2010) | public static void sort(@Nullable char[] array) {
    method sort (line 2015) | public static void sort(@Nullable double[] array) {
    method sort (line 2020) | public static void sort(@Nullable float[] array) {
    method sort (line 2025) | public static void sort(@Nullable int[] array) {
    method sort (line 2030) | public static void sort(@Nullable long[] array) {
    method sort (line 2035) | public static void sort(@Nullable short[] array) {
    method forAllDo (line 2048) | public static <E> void forAllDo(@Nullable Object array, @Nullable Clos...
    method toString (line 2115) | @NonNull
    type Closure (line 2140) | public interface Closure<E> {
      method execute (line 2141) | void execute(int index, E item);

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
  class BarUtils (line 40) | public final class BarUtils {
    method BarUtils (line 50) | private BarUtils() {
    method getStatusBarHeight (line 59) | public static int getStatusBarHeight() {
    method setStatusBarVisibility (line 71) | public static void setStatusBarVisibility(@NonNull final Activity acti...
    method setStatusBarVisibility (line 82) | public static void setStatusBarVisibility(@NonNull final Window window,
    method isStatusBarVisible (line 101) | public static boolean isStatusBarVisible(@NonNull final Activity activ...
    method setStatusBarLightMode (line 112) | public static void setStatusBarLightMode(@NonNull final Activity activ...
    method setStatusBarLightMode (line 123) | public static void setStatusBarLightMode(@NonNull final Window window,
    method isStatusBarLightMode (line 143) | public static boolean isStatusBarLightMode(@NonNull final Activity act...
    method isStatusBarLightMode (line 153) | public static boolean isStatusBarLightMode(@NonNull final Window windo...
    method addMarginTopEqualStatusBarHeight (line 167) | public static void addMarginTopEqualStatusBarHeight(@NonNull View view) {
    method subtractMarginTopEqualStatusBarHeight (line 185) | public static void subtractMarginTopEqualStatusBarHeight(@NonNull View...
    method addMarginTopEqualStatusBarHeight (line 197) | private static void addMarginTopEqualStatusBarHeight(@NonNull final Wi...
    method subtractMarginTopEqualStatusBarHeight (line 204) | private static void subtractMarginTopEqualStatusBarHeight(@NonNull fin...
    method setStatusBarColor (line 217) | public static View setStatusBarColor(@NonNull final Activity activity,
    method setStatusBarColor (line 230) | public static View setStatusBarColor(@NonNull final Activity activity,
    method setStatusBarColor (line 245) | public static View setStatusBarColor(@NonNull final Window window,
    method setStatusBarColor (line 258) | public static View setStatusBarColor(@NonNull final Window window,
    method setStatusBarColor (line 272) | public static void setStatusBarColor(@NonNull final View fakeStatusBar,
    method setStatusBarCustom (line 290) | public static void setStatusBarCustom(@NonNull final View fakeStatusBa...
    method setStatusBarColor4Drawer (line 317) | public static void setStatusBarColor4Drawer(@NonNull final DrawerLayou...
    method setStatusBarColor4Drawer (line 332) | public static void setStatusBarColor4Drawer(@NonNull final DrawerLayou...
    method applyStatusBarColor (line 352) | private static View applyStatusBarColor(@NonNull final Activity activity,
    method applyStatusBarColor (line 358) | private static View applyStatusBarColor(@NonNull final Window window,
    method hideStatusBarView (line 377) | private static void hideStatusBarView(@NonNull final Activity activity) {
    method hideStatusBarView (line 381) | private static void hideStatusBarView(@NonNull final Window window) {
    method showStatusBarView (line 388) | private static void showStatusBarView(@NonNull final Window window) {
    method createStatusBarView (line 395) | private static View createStatusBarView(@NonNull final Context context,
    method transparentStatusBar (line 405) | public static void transparentStatusBar(@NonNull final Activity activi...
    method transparentStatusBar (line 409) | public static void transparentStatusBar(@NonNull final Window window) {
    method getActionBarHeight (line 432) | public static int getActionBarHeight() {
    method setNotificationBarVisibility (line 452) | @RequiresPermission(EXPAND_STATUS_BAR)
    method invokePanels (line 463) | private static void invokePanels(final String methodName) {
    method getNavBarHeight (line 485) | public static int getNavBarHeight() {
    method setNavBarVisibility (line 501) | public static void setNavBarVisibility(@NonNull final Activity activit...
    method setNavBarVisibility (line 513) | public static void setNavBarVisibility(@NonNull final Window window, b...
    method isNavBarVisible (line 543) | public static boolean isNavBarVisible(@NonNull final Activity activity) {
    method isNavBarVisible (line 554) | public static boolean isNavBarVisible(@NonNull final Window window) {
    method getResNameById (line 589) | private static String getResNameById(int id) {
    method setNavBarColor (line 603) | @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    method setNavBarColor (line 614) | @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    method getNavBarColor (line 626) | @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    method getNavBarColor (line 637) | @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    method isSupportNavBar (line 647) | public static boolean isSupportNavBar() {
    method setNavBarLightMode (line 669) | public static void setNavBarLightMode(@NonNull final Activity activity,
    method setNavBarLightMode (line 680) | public static void setNavBarLightMode(@NonNull final Window window,
    method isNavBarLightMode (line 700) | public static boolean isNavBarLightMode(@NonNull final Activity activi...
    method isNavBarLightMode (line 710) | public static boolean isNavBarLightMode(@NonNull final Window window) {
    method transparentNavBar (line 719) | public static void transparentNavBar(@NonNull final Activity activity) {
    method transparentNavBar (line 723) | public static void transparentNavBar(@NonNull final Window window) {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
  class BrightnessUtils (line 19) | public final class BrightnessUtils {
    method BrightnessUtils (line 21) | private BrightnessUtils() {
    method isAutoBrightnessEnabled (line 30) | public static boolean isAutoBrightnessEnabled() {
    method setAutoBrightnessEnabled (line 50) | public static boolean setAutoBrightnessEnabled(final boolean enabled) {
    method getBrightness (line 64) | public static int getBrightness() {
    method setBrightness (line 83) | public static boolean setBrightness(@IntRange(from = 0, to = 255) fina...
    method setWindowBrightness (line 96) | public static void setWindowBrightness(@NonNull final Window window,
    method getWindowBrightness (line 109) | public static int getWindowBrightness(@NonNull final Window window) {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/BusUtils.java
  class BusUtils (line 30) | public final class BusUtils {
    method BusUtils (line 40) | private BusUtils() {
    method init (line 48) | private void init() {/*inject*/}
    method registerBus (line 50) | private void registerBus(String tag,
    method registerBus (line 56) | private void registerBus(String tag,
    method register (line 67) | public static void register(@Nullable final Object bus) {
    method unregister (line 71) | public static void unregister(@Nullable final Object bus) {
    method post (line 75) | public static void post(@NonNull final String tag) {
    method post (line 79) | public static void post(@NonNull final String tag, @NonNull final Obje...
    method postSticky (line 83) | public static void postSticky(@NonNull final String tag) {
    method postSticky (line 87) | public static void postSticky(@NonNull final String tag, final Object ...
    method removeSticky (line 91) | public static void removeSticky(final String tag) {
    method toString_ (line 95) | public static String toString_() {
    method toString (line 99) | @Override
    method getInstance (line 104) | private static BusUtils getInstance() {
    method registerInner (line 108) | private void registerInner(@Nullable final Object bus) {
    method recordTags (line 133) | private void recordTags(Class<?> aClass, String className) {
    method consumeStickyIfExist (line 158) | private void consumeStickyIfExist(final Object bus) {
    method consumeSticky (line 168) | private void consumeSticky(final Object bus, final String tag, final O...
    method unregisterInner (line 192) | private void unregisterInner(final Object bus) {
    method postInner (line 205) | private void postInner(final String tag, final Object arg) {
    method postInner (line 209) | private void postInner(final String tag, final Object arg, final boole...
    method invokeBus (line 223) | private void invokeBus(Object arg, BusInfo busInfo, boolean sticky) {
    method invokeBus (line 227) | private void invokeBus(Object bus, Object arg, BusInfo busInfo, boolea...
    method getMethodByBusInfo (line 238) | private Method getMethodByBusInfo(BusInfo busInfo) {
    method getClassName (line 253) | private Class getClassName(String paramType) throws ClassNotFoundExcep...
    method invokeMethod (line 276) | private void invokeMethod(final Object arg, final BusInfo busInfo, fin...
    method invokeMethod (line 280) | private void invokeMethod(final Object bus, final Object arg, final Bu...
    method realInvokeMethod (line 308) | private void realInvokeMethod(Object bus, Object arg, BusInfo busInfo,...
    method invokeBuses (line 329) | private void invokeBuses(Object arg, BusInfo busInfo, Set<Object> buse...
    method postStickyInner (line 347) | private void postStickyInner(final String tag, final Object arg) {
    method removeStickyInner (line 371) | private void removeStickyInner(final String tag) {
    method registerBus4Test (line 391) | static void registerBus4Test(String tag,
    class BusInfo (line 397) | private static final class BusInfo {
      method BusInfo (line 410) | BusInfo(String tag, String className, String funName, String paramTy...
      method toString (line 423) | @Override
      method getDesc (line 434) | private String getDesc() {
    type ThreadMode (line 440) | public enum ThreadMode {
    class LazyHolder (line 456) | private static class LazyHolder {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
  class CacheDiskStaticUtils (line 23) | public final class CacheDiskStaticUtils {
    method setDefaultCacheDiskUtils (line 32) | public static void setDefaultCacheDiskUtils(@Nullable final CacheDiskU...
    method put (line 42) | public static void put(@NonNull final String key, @Nullable final byte...
    method put (line 53) | public static void put(@NonNull final String key, @Nullable final byte...
    method getBytes (line 63) | public static byte[] getBytes(@NonNull final String key) {
    method getBytes (line 74) | public static byte[] getBytes(@NonNull final String key, @Nullable fin...
    method put (line 88) | public static void put(@NonNull final String key, @Nullable final Stri...
    method put (line 99) | public static void put(@NonNull final String key, @Nullable final Stri...
    method getString (line 109) | public static String getString(@NonNull final String key) {
    method getString (line 120) | public static String getString(@NonNull final String key, @Nullable fi...
    method put (line 134) | public static void put(@NonNull final String key, @Nullable final JSON...
    method put (line 145) | public static void put(@NonNull final String key,
    method getJSONObject (line 157) | public static JSONObject getJSONObject(@NonNull final String key) {
    method getJSONObject (line 168) | public static JSONObject getJSONObject(@NonNull final String key, @Nul...
    method put (line 183) | public static void put(@NonNull final String key, @Nullable final JSON...
    method put (line 194) | public static void put(@NonNull final String key, @Nullable final JSON...
    method getJSONArray (line 204) | public static JSONArray getJSONArray(@NonNull final String key) {
    method getJSONArray (line 215) | public static JSONArray getJSONArray(@NonNull final String key, @Nulla...
    method put (line 230) | public static void put(@NonNull final String key, @Nullable final Bitm...
    method put (line 241) | public static void put(@NonNull final String key, @Nullable final Bitm...
    method getBitmap (line 251) | public static Bitmap getBitmap(@NonNull final String key) {
    method getBitmap (line 262) | public static Bitmap getBitmap(@NonNull final String key, @Nullable fi...
    method put (line 276) | public static void put(@NonNull final String key, @Nullable final Draw...
    method put (line 287) | public static void put(@NonNull final String key, @Nullable final Draw...
    method getDrawable (line 297) | public static Drawable getDrawable(@NonNull final String key) {
    method getDrawable (line 308) | public static Drawable getDrawable(@NonNull final String key, final @N...
    method put (line 322) | public static void put(@NonNull final String key, @Nullable final Parc...
    method put (line 333) | public static void put(@NonNull final String key, @Nullable final Parc...
    method getParcelable (line 345) | public static <T> T getParcelable(@NonNull final String key,
    method getParcelable (line 359) | public static <T> T getParcelable(@NonNull final String key,
    method put (line 375) | public static void put(@NonNull final String key, @Nullable final Seri...
    method put (line 386) | public static void put(@NonNull final String key, @Nullable final Seri...
    method getSerializable (line 396) | public static Object getSerializable(@NonNull final String key) {
    method getSerializable (line 407) | public static Object getSerializable(@NonNull final String key, @Nulla...
    method getCacheSize (line 416) | public static long getCacheSize() {
    method getCacheCount (line 425) | public static int getCacheCount() {
    method remove (line 435) | public static boolean remove(@NonNull final String key) {
    method clear (line 444) | public static boolean clear() {
    method put (line 459) | public static void put(@NonNull final String key,
    method put (line 473) | public static void put(@NonNull final String key,
    method getBytes (line 487) | public static byte[] getBytes(@NonNull final String key, @NonNull fina...
    method getBytes (line 499) | public static byte[] getBytes(@NonNull final String key,
    method put (line 516) | public static void put(@NonNull final String key,
    method put (line 530) | public static void put(@NonNull final String key,
    method getString (line 544) | public static String getString(@NonNull final String key, @NonNull fin...
    method getString (line 556) | public static String getString(@NonNull final String key,
    method put (line 573) | public static void put(@NonNull final String key,
    method put (line 587) | public static void put(@NonNull final String key,
    method getJSONObject (line 601) | public static JSONObject getJSONObject(@NonNull final String key, @Non...
    method getJSONObject (line 613) | public static JSONObject getJSONObject(@NonNull final String key,
    method put (line 631) | public static void put(@NonNull final String key,
    method put (line 645) | public static void put(@NonNull final String key,
    method getJSONArray (line 659) | public static JSONArray getJSONArray(@NonNull final String key, @NonNu...
    method getJSONArray (line 671) | public static JSONArray getJSONArray(@NonNull final String key,
    method put (line 689) | public static void put(@NonNull final String key,
    method put (line 703) | public static void put(@NonNull final String key,
    method getBitmap (line 717) | public static Bitmap getBitmap(@NonNull final String key, @NonNull fin...
    method getBitmap (line 729) | public static Bitmap getBitmap(@NonNull final String key,
    method put (line 746) | public static void put(@NonNull final String key,
    method put (line 760) | public static void put(@NonNull final String key,
    method getDrawable (line 774) | public static Drawable getDrawable(@NonNull final String key, @NonNull...
    method getDrawable (line 786) | public static Drawable getDrawable(@NonNull final String key,
    method put (line 803) | public static void put(@NonNull final String key,
    method put (line 817) | public static void put(@NonNull final String key,
    method getParcelable (line 833) | public static <T> T getParcelable(@NonNull final String key,
    method getParcelable (line 849) | public static <T> T getParcelable(@NonNull final String key,
    method put (line 867) | public static void put(@NonNull final String key,
    method put (line 881) | public static void put(@NonNull final String key,
    method getSerializable (line 895) | public static Object getSerializable(@NonNull final String key, @NonNu...
    method getSerializable (line 907) | public static Object getSerializable(@NonNull final String key,
    method getCacheSize (line 919) | public static long getCacheSize(@NonNull final CacheDiskUtils cacheDis...
    method getCacheCount (line 929) | public static int getCacheCount(@NonNull final CacheDiskUtils cacheDis...
    method remove (line 940) | public static boolean remove(@NonNull final String key, @NonNull final...
    method clear (line 950) | public static boolean clear(@NonNull final CacheDiskUtils cacheDiskUti...
    method getDefaultCacheDiskUtils (line 954) | @NonNull

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
  class CacheDiskUtils (line 34) | public final class CacheDiskUtils implements CacheConstants {
    method getInstance (line 64) | public static CacheDiskUtils getInstance() {
    method getInstance (line 77) | public static CacheDiskUtils getInstance(final String cacheName) {
    method getInstance (line 89) | public static CacheDiskUtils getInstance(final long maxSize, final int...
    method getInstance (line 102) | public static CacheDiskUtils getInstance(String cacheName, final long ...
    method getInstance (line 116) | public static CacheDiskUtils getInstance(@NonNull final File cacheDir) {
    method getInstance (line 128) | public static CacheDiskUtils getInstance(@NonNull final File cacheDir,
    method CacheDiskUtils (line 145) | private CacheDiskUtils(final String cacheKey,
    method getDiskCacheManager (line 155) | private DiskCacheManager getDiskCacheManager() {
    method toString (line 170) | @Override
    method put (line 185) | public void put(@NonNull final String key, final byte[] value) {
    method put (line 196) | public void put(@NonNull final String key, final byte[] value, final i...
    method realPutBytes (line 200) | private void realPutBytes(final String key, byte[] value, int saveTime) {
    method getBytes (line 218) | public byte[] getBytes(@NonNull final String key) {
    method getBytes (line 229) | public byte[] getBytes(@NonNull final String key, final byte[] default...
    method realGetBytes (line 233) | private byte[] realGetBytes(@NonNull final String key) {
    method realGetBytes (line 237) | private byte[] realGetBytes(@NonNull final String key, final byte[] de...
    method put (line 261) | public void put(@NonNull final String key, final String value) {
    method put (line 272) | public void put(@NonNull final String key, final String value, final i...
    method getString (line 282) | public String getString(@NonNull final String key) {
    method getString (line 293) | public String getString(@NonNull final String key, final String defaul...
    method put (line 309) | public void put(@NonNull final String key, final JSONObject value) {
    method put (line 320) | public void put(@NonNull final String key,
    method getJSONObject (line 332) | public JSONObject getJSONObject(@NonNull final String key) {
    method getJSONObject (line 343) | public JSONObject getJSONObject(@NonNull final String key, final JSONO...
    method put (line 360) | public void put(@NonNull final String key, final JSONArray value) {
    method put (line 371) | public void put(@NonNull final String key, final JSONArray value, fina...
    method getJSONArray (line 381) | public JSONArray getJSONArray(@NonNull final String key) {
    method getJSONArray (line 392) | public JSONArray getJSONArray(@NonNull final String key, final JSONArr...
    method put (line 409) | public void put(@NonNull final String key, final Bitmap value) {
    method put (line 420) | public void put(@NonNull final String key, final Bitmap value, final i...
    method getBitmap (line 430) | public Bitmap getBitmap(@NonNull final String key) {
    method getBitmap (line 441) | public Bitmap getBitmap(@NonNull final String key, final Bitmap defaul...
    method put (line 457) | public void put(@NonNull final String key, final Drawable value) {
    method put (line 468) | public void put(@NonNull final String key, final Drawable value, final...
    method getDrawable (line 478) | public Drawable getDrawable(@NonNull final String key) {
    method getDrawable (line 489) | public Drawable getDrawable(@NonNull final String key, final Drawable ...
    method put (line 505) | public void put(@NonNull final String key, final Parcelable value) {
    method put (line 516) | public void put(@NonNull final String key, final Parcelable value, fin...
    method getParcelable (line 528) | public <T> T getParcelable(@NonNull final String key,
    method getParcelable (line 542) | public <T> T getParcelable(@NonNull final String key,
    method put (line 560) | public void put(@NonNull final String key, final Serializable value) {
    method put (line 571) | public void put(@NonNull final String key, final Serializable value, f...
    method getSerializable (line 581) | public Object getSerializable(@NonNull final String key) {
    method getSerializable (line 592) | public Object getSerializable(@NonNull final String key, final Object ...
    method getCacheSize (line 603) | public long getCacheSize() {
    method getCacheCount (line 614) | public int getCacheCount() {
    method remove (line 626) | public boolean remove(@NonNull final String key) {
    method clear (line 644) | public boolean clear() {
    class DiskCacheManager (line 650) | private static final class DiskCacheManager {
      method DiskCacheManager (line 660) | private DiskCacheManager(final File cacheDir, final long sizeLimit, ...
      method getCacheSize (line 691) | private long getCacheSize() {
      method getCacheCount (line 696) | private int getCacheCount() {
      method getFileBeforePut (line 701) | private File getFileBeforePut(final String key) {
      method wait2InitOk (line 711) | private void wait2InitOk() {
      method getFileIfExists (line 719) | private File getFileIfExists(final String key) {
      method getCacheNameByKey (line 725) | private String getCacheNameByKey(final String key) {
      method put (line 729) | private void put(final File file) {
      method updateModify (line 738) | private void updateModify(final File file) {
      method removeByKey (line 744) | private boolean removeByKey(final String key) {
      method clear (line 754) | private boolean clear() {
      method removeOldest (line 785) | private long removeOldest() {
    class DiskCacheHelper (line 809) | private static final class DiskCacheHelper {
      method newByteArrayWithTime (line 813) | private static byte[] newByteArrayWithTime(final int second, final b...
      method createDueTime (line 827) | private static String createDueTime(final int seconds) {
      method isDue (line 834) | private static boolean isDue(final byte[] data) {
      method getDueTime (line 839) | private static long getDueTime(final byte[] data) {
      method getDataWithoutDueTime (line 851) | private static byte[] getDataWithoutDueTime(final byte[] data) {
      method copyOfRange (line 858) | private static byte[] copyOfRange(final byte[] original, final int f...
      method hasTimeInfo (line 866) | private static boolean hasTimeInfo(final byte[] data) {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
  class CacheDoubleStaticUtils (line 22) | public final class CacheDoubleStaticUtils {
    method setDefaultCacheDoubleUtils (line 31) | public static void setDefaultCacheDoubleUtils(final CacheDoubleUtils c...
    method put (line 41) | public static void put(@NonNull final String key, final byte[] value) {
    method put (line 52) | public static void put(@NonNull final String key, byte[] value, final ...
    method getBytes (line 62) | public static byte[] getBytes(@NonNull final String key) {
    method getBytes (line 73) | public static byte[] getBytes(@NonNull final String key, final byte[] ...
    method put (line 87) | public static void put(@NonNull final String key, final String value) {
    method put (line 98) | public static void put(@NonNull final String key, final String value, ...
    method getString (line 108) | public static String getString(@NonNull final String key) {
    method getString (line 119) | public static String getString(@NonNull final String key, final String...
    method put (line 133) | public static void put(@NonNull final String key, final JSONObject val...
    method put (line 144) | public static void put(@NonNull final String key,
    method getJSONObject (line 156) | public static JSONObject getJSONObject(@NonNull final String key) {
    method getJSONObject (line 167) | public static JSONObject getJSONObject(@NonNull final String key, fina...
    method put (line 182) | public static void put(@NonNull final String key, final JSONArray valu...
    method put (line 193) | public static void put(@NonNull final String key, final JSONArray valu...
    method getJSONArray (line 203) | public static JSONArray getJSONArray(@NonNull final String key) {
    method getJSONArray (line 214) | public static JSONArray getJSONArray(@NonNull final String key, final ...
    method put (line 228) | public static void put(@NonNull final String key, final Bitmap value) {
    method put (line 239) | public static void put(@NonNull final String key, final Bitmap value, ...
    method getBitmap (line 249) | public static Bitmap getBitmap(@NonNull final String key) {
    method getBitmap (line 260) | public static Bitmap getBitmap(@NonNull final String key, final Bitmap...
    method put (line 274) | public static void put(@NonNull final String key, final Drawable value) {
    method put (line 285) | public static void put(@NonNull final String key, final Drawable value...
    method getDrawable (line 295) | public static Drawable getDrawable(@NonNull final String key) {
    method getDrawable (line 306) | public static Drawable getDrawable(@NonNull final String key, final Dr...
    method put (line 320) | public static void put(@NonNull final String key, final Parcelable val...
    method put (line 331) | public static void put(@NonNull final String key, final Parcelable val...
    method getParcelable (line 343) | public static <T> T getParcelable(@NonNull final String key,
    method getParcelable (line 357) | public static <T> T getParcelable(@NonNull final String key,
    method put (line 373) | public static void put(@NonNull final String key, final Serializable v...
    method put (line 384) | public static void put(@NonNull final String key, final Serializable v...
    method getSerializable (line 394) | public static Object getSerializable(@NonNull final String key) {
    method getSerializable (line 405) | public static Object getSerializable(@NonNull final String key, final ...
    method getCacheDiskSize (line 414) | public static long getCacheDiskSize() {
    method getCacheDiskCount (line 423) | public static int getCacheDiskCount() {
    method getCacheMemoryCount (line 432) | public static int getCacheMemoryCount() {
    method remove (line 441) | public static void remove(@NonNull String key) {
    method clear (line 448) | public static void clear() {
    method put (line 463) | public static void put(@NonNull final String key,
    method put (line 477) | public static void put(@NonNull final String key,
    method getBytes (line 491) | public static byte[] getBytes(@NonNull final String key, @NonNull fina...
    method getBytes (line 503) | public static byte[] getBytes(@NonNull final String key,
    method put (line 520) | public static void put(@NonNull final String key,
    method put (line 534) | public static void put(@NonNull final String key,
    method getString (line 548) | public static String getString(@NonNull final String key, @NonNull fin...
    method getString (line 560) | public static String getString(@NonNull final String key,
    method put (line 577) | public static void put(@NonNull final String key,
    method put (line 591) | public static void put(@NonNull final String key,
    method getJSONObject (line 605) | public static JSONObject getJSONObject(@NonNull final String key,
    method getJSONObject (line 618) | public static JSONObject getJSONObject(@NonNull final String key,
    method put (line 636) | public static void put(@NonNull final String key,
    method put (line 650) | public static void put(@NonNull final String key,
    method getJSONArray (line 664) | public static JSONArray getJSONArray(@NonNull final String key, @NonNu...
    method getJSONArray (line 676) | public static JSONArray getJSONArray(@NonNull final String key,
    method put (line 693) | public static void put(@NonNull final String key,
    method put (line 707) | public static void put(@NonNull final String key,
    method getBitmap (line 721) | public static Bitmap getBitmap(@NonNull final String key, @NonNull fin...
    method getBitmap (line 733) | public static Bitmap getBitmap(@NonNull final String key,
    method put (line 750) | public static void put(@NonNull final String key,
    method put (line 764) | public static void put(@NonNull final String key,
    method getDrawable (line 778) | public static Drawable getDrawable(@NonNull final String key, @NonNull...
    method getDrawable (line 790) | public static Drawable getDrawable(@NonNull final String key,
    method put (line 807) | public static void put(@NonNull final String key,
    method put (line 821) | public static void put(@NonNull final String key,
    method getParcelable (line 837) | public static <T> T getParcelable(@NonNull final String key,
    method getParcelable (line 853) | public static <T> T getParcelable(@NonNull final String key,
    method put (line 871) | public static void put(@NonNull final String key,
    method put (line 885) | public static void put(@NonNull final String key,
    method getSerializable (line 899) | public static Object getSerializable(@NonNull final String key, @NonNu...
    method getSerializable (line 911) | public static Object getSerializable(@NonNull final String key,
    method getCacheDiskSize (line 923) | public static long getCacheDiskSize(@NonNull final CacheDoubleUtils ca...
    method getCacheDiskCount (line 933) | public static int getCacheDiskCount(@NonNull final CacheDoubleUtils ca...
    method getCacheMemoryCount (line 943) | public static int getCacheMemoryCount(@NonNull final CacheDoubleUtils ...
    method remove (line 953) | public static void remove(@NonNull String key, @NonNull final CacheDou...
    method clear (line 962) | public static void clear(@NonNull final CacheDoubleUtils cacheDoubleUt...
    method getDefaultCacheDoubleUtils (line 966) | private static CacheDoubleUtils getDefaultCacheDoubleUtils() {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
  class CacheDoubleUtils (line 25) | public final class CacheDoubleUtils implements CacheConstants {
    method getInstance (line 37) | public static CacheDoubleUtils getInstance() {
    method getInstance (line 48) | public static CacheDoubleUtils getInstance(@NonNull final CacheMemoryU...
    method CacheDoubleUtils (line 64) | private CacheDoubleUtils(CacheMemoryUtils cacheMemoryUtils, CacheDiskU...
    method put (line 80) | public void put(@NonNull final String key, final byte[] value) {
    method put (line 91) | public void put(@NonNull final String key, byte[] value, final int sav...
    method getBytes (line 102) | public byte[] getBytes(@NonNull final String key) {
    method getBytes (line 113) | public byte[] getBytes(@NonNull final String key, final byte[] default...
    method put (line 134) | public void put(@NonNull final String key, final String value) {
    method put (line 145) | public void put(@NonNull final String key, final String value, final i...
    method getString (line 156) | public String getString(@NonNull final String key) {
    method getString (line 167) | public String getString(@NonNull final String key, final String defaul...
    method put (line 188) | public void put(@NonNull final String key, final JSONObject value) {
    method put (line 199) | public void put(@NonNull final String key,
    method getJSONObject (line 212) | public JSONObject getJSONObject(@NonNull final String key) {
    method getJSONObject (line 223) | public JSONObject getJSONObject(@NonNull final String key, final JSONO...
    method put (line 245) | public void put(@NonNull final String key, final JSONArray value) {
    method put (line 256) | public void put(@NonNull final String key, final JSONArray value, fina...
    method getJSONArray (line 267) | public JSONArray getJSONArray(@NonNull final String key) {
    method getJSONArray (line 278) | public JSONArray getJSONArray(@NonNull final String key, final JSONArr...
    method put (line 299) | public void put(@NonNull final String key, final Bitmap value) {
    method put (line 310) | public void put(@NonNull final String key, final Bitmap value, final i...
    method getBitmap (line 321) | public Bitmap getBitmap(@NonNull final String key) {
    method getBitmap (line 332) | public Bitmap getBitmap(@NonNull final String key, final Bitmap defaul...
    method put (line 353) | public void put(@NonNull final String key, final Drawable value) {
    method put (line 364) | public void put(@NonNull final String key, final Drawable value, final...
    method getDrawable (line 375) | public Drawable getDrawable(@NonNull final String key) {
    method getDrawable (line 386) | public Drawable getDrawable(@NonNull final String key, final Drawable ...
    method put (line 407) | public void put(@NonNull final String key, final Parcelable value) {
    method put (line 418) | public void put(@NonNull final String key, final Parcelable value, fin...
    method getParcelable (line 431) | public <T> T getParcelable(@NonNull final String key,
    method getParcelable (line 445) | public <T> T getParcelable(@NonNull final String key,
    method put (line 468) | public void put(@NonNull final String key, final Serializable value) {
    method put (line 479) | public void put(@NonNull final String key, final Serializable value, f...
    method getSerializable (line 490) | public Object getSerializable(@NonNull final String key) {
    method getSerializable (line 501) | public Object getSerializable(@NonNull final String key, final Object ...
    method getCacheDiskSize (line 517) | public long getCacheDiskSize() {
    method getCacheDiskCount (line 526) | public int getCacheDiskCount() {
    method getCacheMemoryCount (line 535) | public int getCacheMemoryCount() {
    method remove (line 544) | public void remove(@NonNull String key) {
    method clear (line 552) | public void clear() {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
  class CacheMemoryStaticUtils (line 13) | public final class CacheMemoryStaticUtils {
    method setDefaultCacheMemoryUtils (line 22) | public static void setDefaultCacheMemoryUtils(final CacheMemoryUtils c...
    method put (line 32) | public static void put(@NonNull final String key, final Object value) {
    method put (line 43) | public static void put(@NonNull final String key, final Object value, ...
    method get (line 54) | public static <T> T get(@NonNull final String key) {
    method get (line 66) | public static <T> T get(@NonNull final String key, final T defaultValu...
    method getCacheCount (line 75) | public static int getCacheCount() {
    method remove (line 85) | public static Object remove(@NonNull final String key) {
    method clear (line 92) | public static void clear() {
    method put (line 107) | public static void put(@NonNull final String key,
    method put (line 121) | public static void put(@NonNull final String key,
    method get (line 136) | public static <T> T get(@NonNull final String key, @NonNull final Cach...
    method get (line 149) | public static <T> T get(@NonNull final String key,
    method getCacheCount (line 161) | public static int getCacheCount(@NonNull final CacheMemoryUtils cacheM...
    method remove (line 172) | public static Object remove(@NonNull final String key, @NonNull final ...
    method clear (line 181) | public static void clear(@NonNull final CacheMemoryUtils cacheMemoryUt...
    method getDefaultCacheMemoryUtils (line 185) | private static CacheMemoryUtils getDefaultCacheMemoryUtils() {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
  class CacheMemoryUtils (line 19) | public final class CacheMemoryUtils implements CacheConstants {
    method getInstance (line 33) | public static CacheMemoryUtils getInstance() {
    method getInstance (line 43) | public static CacheMemoryUtils getInstance(final int maxCount) {
    method getInstance (line 54) | public static CacheMemoryUtils getInstance(final String cacheKey, fina...
    method CacheMemoryUtils (line 68) | private CacheMemoryUtils(String cacheKey, LruCache<String, CacheValue>...
    method toString (line 73) | @Override
    method put (line 84) | public void put(@NonNull final String key, final Object value) {
    method put (line 95) | public void put(@NonNull final String key, final Object value, int sav...
    method get (line 108) | public <T> T get(@NonNull final String key) {
    method get (line 120) | public <T> T get(@NonNull final String key, final T defaultValue) {
    method getCacheCount (line 136) | public int getCacheCount() {
    method remove (line 146) | public Object remove(@NonNull final String key) {
    method clear (line 155) | public void clear() {
    class CacheValue (line 159) | private static final class CacheValue {
      method CacheValue (line 163) | CacheValue(long dueTime, Object value) {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/CleanUtils.java
  class CleanUtils (line 20) | public final class CleanUtils {
    method CleanUtils (line 22) | private CleanUtils() {
    method cleanInternalCache (line 32) | public static boolean cleanInternalCache() {
    method cleanInternalFiles (line 42) | public static boolean cleanInternalFiles() {
    method cleanInternalDbs (line 52) | public static boolean cleanInternalDbs() {
    method cleanInternalDbByName (line 63) | public static boolean cleanInternalDbByName(final String dbName) {
    method cleanInternalSp (line 73) | public static boolean cleanInternalSp() {
    method cleanExternalCache (line 83) | public static boolean cleanExternalCache() {
    method cleanCustomDir (line 94) | public static boolean cleanCustomDir(final String dirPath) {
    method cleanAppUserData (line 98) | @RequiresApi(api = Build.VERSION_CODES.KITKAT)

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/ClickUtils.java
  class ClickUtils (line 35) | public class ClickUtils {
    method ClickUtils (line 52) | private ClickUtils() {
    method applyPressedViewScale (line 61) | public static void applyPressedViewScale(final View... views) {
    method applyPressedViewScale (line 71) | public static void applyPressedViewScale(final View[] views, final flo...
    method applyPressedViewScale (line 90) | public static void applyPressedViewScale(final View view, final float ...
    method applyPressedViewAlpha (line 104) | public static void applyPressedViewAlpha(final View... views) {
    method applyPressedViewAlpha (line 114) | public static void applyPressedViewAlpha(final View[] views, final flo...
    method applyPressedViewAlpha (line 132) | public static void applyPressedViewAlpha(final View view, final float ...
    method applyPressedBgAlpha (line 147) | public static void applyPressedBgAlpha(View view) {
    method applyPressedBgAlpha (line 157) | public static void applyPressedBgAlpha(View view, float alpha) {
    method applyPressedBgDark (line 166) | public static void applyPressedBgDark(View view) {
    method applyPressedBgDark (line 176) | public static void applyPressedBgDark(View view, float darkAlpha) {
    method applyPressedBgStyle (line 180) | private static void applyPressedBgStyle(View view, int style, float va...
    method createStyleDrawable (line 193) | private static Drawable createStyleDrawable(Drawable src, int style, f...
    method createAlphaDrawable (line 216) | private static Drawable createAlphaDrawable(Drawable drawable, float a...
    method createDarkDrawable (line 222) | private static Drawable createDarkDrawable(Drawable drawable, float al...
    method getDarkColorFilter (line 228) | private static ColorMatrixColorFilter getDarkColorFilter(float darkAlp...
    method applySingleDebouncing (line 243) | public static void applySingleDebouncing(final View view, final View.O...
    method applySingleDebouncing (line 254) | public static void applySingleDebouncing(final View view, @IntRange(fr...
    method applySingleDebouncing (line 265) | public static void applySingleDebouncing(final View[] views, final Vie...
    method applySingleDebouncing (line 276) | public static void applySingleDebouncing(final View[] views,
    method applyGlobalDebouncing (line 288) | public static void applyGlobalDebouncing(final View view, final View.O...
    method applyGlobalDebouncing (line 299) | public static void applyGlobalDebouncing(final View view, @IntRange(fr...
    method applyGlobalDebouncing (line 311) | public static void applyGlobalDebouncing(final View[] views, final Vie...
    method applyGlobalDebouncing (line 322) | public static void applyGlobalDebouncing(final View[] views,
    method applyDebouncing (line 328) | private static void applyDebouncing(final View[] views,
    method expandClickArea (line 350) | public static void expandClickArea(@NonNull final View view, final int...
    method expandClickArea (line 354) | public static void expandClickArea(@NonNull final View view,
    method back2HomeFriendly (line 382) | public static void back2HomeFriendly(final CharSequence tip) {
    method back2HomeFriendly (line 386) | public static void back2HomeFriendly(@NonNull final CharSequence tip,
    type Back2HomeFriendlyListener (line 404) | public interface Back2HomeFriendlyListener {
      method show (line 406) | @Override
      method dismiss (line 411) | @Override
      method show (line 417) | void show(CharSequence text, long duration);
      method dismiss (line 419) | void dismiss();
    class OnDebouncingClickListener (line 422) | public static abstract class OnDebouncingClickListener implements View...
      method run (line 427) | @Override
      method isValid (line 433) | private static boolean isValid(@NonNull final View view, final long ...
      method OnDebouncingClickListener (line 440) | public OnDebouncingClickListener() {
      method OnDebouncingClickListener (line 444) | public OnDebouncingClickListener(final boolean isGlobal) {
      method OnDebouncingClickListener (line 448) | public OnDebouncingClickListener(final long duration) {
      method OnDebouncingClickListener (line 452) | public OnDebouncingClickListener(final boolean isGlobal, final long ...
      method onDebouncingClick (line 457) | public abstract void onDebouncingClick(View v);
      method onClick (line 459) | @Override
    class OnMultiClickListener (line 475) | public static abstract class OnMultiClickListener implements View.OnCl...
      method OnMultiClickListener (line 485) | public OnMultiClickListener(int triggerClickCount) {
      method OnMultiClickListener (line 489) | public OnMultiClickListener(int triggerClickCount, long clickInterva...
      method onTriggerClick (line 494) | public abstract void onTriggerClick(View v);
      method onBeforeTriggerClick (line 496) | public abstract void onBeforeTriggerClick(View v, int count);
      method onClick (line 498) | @Override
    class OnUtilsTouchListener (line 524) | private static class OnUtilsTouchListener implements View.OnTouchListe...
      method getInstance (line 526) | public static OnUtilsTouchListener getInstance() {
      method OnUtilsTouchListener (line 530) | private OnUtilsTouchListener() {/**/}
      method onTouch (line 532) | @Override
      method processScale (line 546) | private void processScale(final View view, boolean isDown) {
      method processAlpha (line 557) | private void processAlpha(final View view, boolean isDown) {
      class LazyHolder (line 563) | private static class LazyHolder {
    class ClickDrawableWrapper (line 568) | static class ClickDrawableWrapper extends ShadowUtils.DrawableWrapper {
      method ClickDrawableWrapper (line 575) | public ClickDrawableWrapper(Drawable drawable) {
      method setColorFilter (line 583) | @Override
      method setAlpha (line 594) | @Override
      method draw (line 605) | @Override

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/ClipboardUtils.java
  class ClipboardUtils (line 16) | public final class ClipboardUtils {
    method ClipboardUtils (line 18) | private ClipboardUtils() {
    method copyText (line 28) | public static void copyText(final CharSequence text) {
    method copyText (line 40) | public static void copyText(final CharSequence label, final CharSequen...
    method clear (line 49) | public static void clear() {
    method getLabel (line 60) | public static CharSequence getLabel() {
    method getText (line 79) | public static CharSequence getText() {
    method addChangedListener (line 95) | public static void addChangedListener(final ClipboardManager.OnPrimary...
    method removeChangedListener (line 104) | public static void removeChangedListener(final ClipboardManager.OnPrim...

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/CloneUtils.java
  class CloneUtils (line 13) | public final class CloneUtils {
    method CloneUtils (line 15) | private CloneUtils() {
    method deepClone (line 27) | public static <T> T deepClone(final T data, final Type type) {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/CloseUtils.java
  class CloseUtils (line 14) | public final class CloseUtils {
    method CloseUtils (line 16) | private CloseUtils() {
    method closeIO (line 25) | public static void closeIO(final Closeable... closeables) {
    method closeIOQuietly (line 43) | public static void closeIOQuietly(final Closeable... closeables) {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/CollectionUtils.java
  class CollectionUtils (line 28) | public final class CollectionUtils {
    method CollectionUtils (line 30) | private CollectionUtils() {
    method newUnmodifiableList (line 44) | @SafeVarargs
    method newUnmodifiableListNotNull (line 55) | @SafeVarargs
    method newArrayList (line 60) | @SafeVarargs
    method newArrayListNotNull (line 70) | @SafeVarargs
    method newLinkedList (line 81) | @SafeVarargs
    method newLinkedListNotNull (line 91) | @SafeVarargs
    method newHashSet (line 102) | @SafeVarargs
    method newHashSetNotNull (line 112) | @SafeVarargs
    method newTreeSet (line 123) | @SafeVarargs
    method newTreeSetNotNull (line 133) | @SafeVarargs
    method newSynchronizedCollection (line 144) | public static Collection newSynchronizedCollection(Collection collecti...
    method newUnmodifiableCollection (line 148) | public static Collection newUnmodifiableCollection(Collection collecti...
    method union (line 165) | public static Collection union(final Collection a, final Collection b) {
    method intersection (line 195) | public static Collection intersection(final Collection a, final Collec...
    method getFreq (line 210) | private static int getFreq(final Object obj, final Map freqMap) {
    method disjunction (line 235) | public static Collection disjunction(final Collection a, final Collect...
    method subtract (line 264) | public static Collection subtract(final Collection a, final Collection...
    method containsAny (line 285) | public static boolean containsAny(final Collection coll1, final Collec...
    method getCardinalityMap (line 315) | public static Map<Object, Integer> getCardinalityMap(final Collection ...
    method isSubCollection (line 341) | public static boolean isSubCollection(final Collection a, final Collec...
    method isProperSubCollection (line 374) | public static boolean isProperSubCollection(final Collection a, final ...
    method isEqualCollection (line 391) | public static boolean isEqualCollection(final Collection a, final Coll...
    method cardinality (line 418) | public static <E> int cardinality(E obj, final Collection<E> coll) {
    method find (line 450) | public static <E> E find(Collection<E> collection, Predicate<E> predic...
    method forAllDo (line 468) | public static <E> void forAllDo(Collection<E> collection, Closure<E> c...
    method filter (line 485) | public static <E> void filter(Collection<E> collection, Predicate<E> p...
    method select (line 505) | public static <E> Collection<E> select(Collection<E> inputCollection, ...
    method selectRejected (line 527) | public static <E> Collection<E> selectRejected(Collection<E> inputColl...
    method transform (line 554) | public static <E1, E2> void transform(Collection<E1> collection, Trans...
    method collect (line 579) | public static <E1, E2> Collection<E2> collect(final Collection<E1> inp...
    method countMatches (line 598) | public static <E> int countMatches(Collection<E> collection, Predicate...
    method exists (line 618) | public static <E> boolean exists(Collection<E> collection, Predicate<E...
    method addIgnoreNull (line 635) | public static <E> boolean addIgnoreNull(Collection<E> collection, E ob...
    method addAll (line 646) | public static <E> void addAll(Collection<E> collection, Iterator<E> it...
    method addAll (line 659) | public static <E> void addAll(Collection<E> collection, Enumeration<E>...
    method addAll (line 672) | public static <E> void addAll(Collection<E> collection, E[] elements) {
    method get (line 707) | public static Object get(Object object, int index) {
    method size (line 770) | public static int size(Object object) {
    method sizeIsEmpty (line 820) | public static boolean sizeIsEmpty(Object object) {
    method isEmpty (line 849) | public static boolean isEmpty(Collection coll) {
    method isNotEmpty (line 861) | public static boolean isNotEmpty(Collection coll) {
    method retainAll (line 879) | public static <E> Collection<E> retainAll(Collection<E> collection, Co...
    method removeAll (line 904) | public static <E> Collection<E> removeAll(Collection<E> collection, Co...
    method shuffle (line 923) | public static <T> void shuffle(List<T> list) {
    method toString (line 933) | public static String toString(Collection collection) {
    type Closure (line 938) | public interface Closure<E> {
      method execute (line 939) | void execute(int index, E item);
    type Transformer (line 942) | public interface Transformer<E1, E2> {
      method transform (line 943) | E2 transform(E1 input);
    type Predicate (line 946) | public interface Predicate<E> {
      method evaluate (line 947) | boolean evaluate(E item);

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/ColorUtils.java
  class ColorUtils (line 19) | public final class ColorUtils {
    method ColorUtils (line 21) | private ColorUtils() {
    method getColor (line 31) | public static int getColor(@ColorRes int id) {
    method setAlphaComponent (line 42) | public static int setAlphaComponent(@ColorInt final int color,
    method setAlphaComponent (line 54) | public static int setAlphaComponent(@ColorInt int color,
    method setRedComponent (line 66) | public static int setRedComponent(@ColorInt int color,
    method setRedComponent (line 78) | public static int setRedComponent(@ColorInt int color,
    method setGreenComponent (line 90) | public static int setGreenComponent(@ColorInt int color,
    method setGreenComponent (line 102) | public static int setGreenComponent(@ColorInt int color,
    method setBlueComponent (line 114) | public static int setBlueComponent(@ColorInt int color,
    method setBlueComponent (line 126) | public static int setBlueComponent(@ColorInt int color,
    method string2Int (line 152) | public static int string2Int(@NonNull String colorString) {
    method int2RgbString (line 162) | public static String int2RgbString(@ColorInt int colorInt) {
    method int2ArgbString (line 177) | public static String int2ArgbString(@ColorInt final int colorInt) {
    method getRandomColor (line 193) | public static int getRandomColor() {
    method getRandomColor (line 203) | public static int getRandomColor(final boolean supportAlpha) {
    method isLightColor (line 214) | public static boolean isLightColor(@ColorInt int color) {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/ConvertUtils.java
  class ConvertUtils (line 39) | public final class ConvertUtils {
    method ConvertUtils (line 47) | private ConvertUtils() {
    method int2HexString (line 57) | public static String int2HexString(int num) {
    method hexString2Int (line 67) | public static int hexString2Int(String hexString) {
    method bytes2Bits (line 77) | public static String bytes2Bits(final byte[] bytes) {
    method bits2Bytes (line 94) | public static byte[] bits2Bytes(String bits) {
    method bytes2Chars (line 120) | public static char[] bytes2Chars(final byte[] bytes) {
    method chars2Bytes (line 137) | public static byte[] chars2Bytes(final char[] chars) {
    method bytes2HexString (line 154) | public static String bytes2HexString(final byte[] bytes) {
    method bytes2HexString (line 166) | public static String bytes2HexString(final byte[] bytes, boolean isUpp...
    method hexString2Bytes (line 186) | public static byte[] hexString2Bytes(String hexString) {
    method hex2Dec (line 201) | private static int hex2Dec(final char hexChar) {
    method bytes2String (line 214) | public static String bytes2String(final byte[] bytes) {
    method bytes2String (line 221) | public static String bytes2String(final byte[] bytes, final String cha...
    method string2Bytes (line 234) | public static byte[] string2Bytes(final String string) {
    method string2Bytes (line 241) | public static byte[] string2Bytes(final String string, final String ch...
    method bytes2JSONObject (line 254) | public static JSONObject bytes2JSONObject(final byte[] bytes) {
    method jsonObject2Bytes (line 267) | public static byte[] jsonObject2Bytes(final JSONObject jsonObject) {
    method bytes2JSONArray (line 275) | public static JSONArray bytes2JSONArray(final byte[] bytes) {
    method jsonArray2Bytes (line 288) | public static byte[] jsonArray2Bytes(final JSONArray jsonArray) {
    method bytes2Parcelable (line 296) | public static <T> T bytes2Parcelable(final byte[] bytes,
    method parcelable2Bytes (line 310) | public static byte[] parcelable2Bytes(final Parcelable parcelable) {
    method bytes2Object (line 322) | public static Object bytes2Object(final byte[] bytes) {
    method serializable2Bytes (line 345) | public static byte[] serializable2Bytes(final Serializable serializabl...
    method bytes2Bitmap (line 370) | public static Bitmap bytes2Bitmap(final byte[] bytes) {
    method bitmap2Bytes (line 377) | public static byte[] bitmap2Bytes(final Bitmap bitmap) {
    method bitmap2Bytes (line 384) | public static byte[] bitmap2Bytes(final Bitmap bitmap, final Bitmap.Co...
    method bytes2Drawable (line 391) | public static Drawable bytes2Drawable(final byte[] bytes) {
    method drawable2Bytes (line 398) | public static byte[] drawable2Bytes(final Drawable drawable) {
    method drawable2Bytes (line 405) | public static byte[] drawable2Bytes(final Drawable drawable, final Bit...
    method memorySize2Byte (line 422) | public static long memorySize2Byte(final long memorySize,
    method byte2MemorySize (line 441) | public static double byte2MemorySize(final long byteSize,
    method byte2FitMemorySize (line 454) | @SuppressLint("DefaultLocale")
    method byte2FitMemorySize (line 467) | @SuppressLint("DefaultLocale")
    method timeSpan2Millis (line 499) | public static long timeSpan2Millis(final long timeSpan, @TimeConstants...
    method millis2TimeSpan (line 517) | public static long millis2TimeSpan(final long millis, @TimeConstants.U...
    method millis2FitTimeSpan (line 537) | public static String millis2FitTimeSpan(long millis, int precision) {
    method input2OutputStream (line 544) | public static ByteArrayOutputStream input2OutputStream(final InputStre...
    method output2InputStream (line 569) | public static ByteArrayInputStream output2InputStream(final OutputStre...
    method inputStream2Bytes (line 577) | public static byte[] inputStream2Bytes(final InputStream is) {
    method bytes2InputStream (line 585) | public static InputStream bytes2InputStream(final byte[] bytes) {
    method outputStream2Bytes (line 593) | public static byte[] outputStream2Bytes(final OutputStream out) {
    method bytes2OutputStream (line 601) | public static OutputStream bytes2OutputStream(final byte[] bytes) {
    method inputStream2String (line 625) | public static String inputStream2String(final InputStream is, final St...
    method string2InputStream (line 640) | public static InputStream string2InputStream(final String string, fina...
    method outputStream2String (line 653) | public static String outputStream2String(final OutputStream out, final...
    method string2OutputStream (line 666) | public static OutputStream string2OutputStream(final String string, fi...
    method inputStream2Lines (line 676) | public static List<String> inputStream2Lines(final InputStream is) {
    method inputStream2Lines (line 680) | public static List<String> inputStream2Lines(final InputStream is,
    method drawable2Bitmap (line 708) | public static Bitmap drawable2Bitmap(final Drawable drawable) {
    method bitmap2Drawable (line 715) | public static Drawable bitmap2Drawable(final Bitmap bitmap) {
    method view2Bitmap (line 722) | public static Bitmap view2Bitmap(final View view) {
    method dp2px (line 729) | public static int dp2px(final float dpValue) {
    method px2dp (line 736) | public static int px2dp(final float pxValue) {
    method sp2px (line 743) | public static int sp2px(final float spValue) {
    method px2sp (line 750) | public static int px2sp(final float pxValue) {
    method getSafeCharset (line 754) | private static String getSafeCharset(String charsetName) {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java
  class CrashUtils (line 18) | public final class CrashUtils {
    method CrashUtils (line 25) | private CrashUtils() {
    method init (line 32) | public static void init() {
    method init (line 41) | public static void init(@NonNull final File crashDir) {
    method init (line 50) | public static void init(final String crashDirPath) {
    method init (line 59) | public static void init(final OnCrashListener onCrashListener) {
    method init (line 69) | public static void init(@NonNull final File crashDir, final OnCrashLis...
    method init (line 79) | public static void init(final String crashDirPath, final OnCrashListen...
    method getUncaughtExceptionHandler (line 95) | private static UncaughtExceptionHandler getUncaughtExceptionHandler(fi...
    type OnCrashListener (line 119) | public interface OnCrashListener {
      method onCrash (line 120) | void onCrash(CrashInfo crashInfo);
    class CrashInfo (line 123) | public static final class CrashInfo {
      method CrashInfo (line 127) | private CrashInfo(String time, Throwable throwable) {
      method addExtraHead (line 133) | public final void addExtraHead(Map<String, String> extraHead) {
      method addExtraHead (line 137) | public final void addExtraHead(String key, String value) {
      method getThrowable (line 141) | public final Throwable getThrowable() {
      method toString (line 145) | @Override

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/DebouncingUtils.java
  class DebouncingUtils (line 21) | public class DebouncingUtils {
    method DebouncingUtils (line 27) | private DebouncingUtils() {
    method isValid (line 37) | public static boolean isValid(@NonNull final View view) {
    method isValid (line 48) | public static boolean isValid(@NonNull final View view, final long dur...
    method isValid (line 59) | public static boolean isValid(@NonNull String key, final long duration) {
    method clearIfNecessary (line 76) | private static void clearIfNecessary(long curTime) {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
  class DeviceUtils (line 42) | public final class DeviceUtils {
    method DeviceUtils (line 44) | private DeviceUtils() {
    method isDeviceRooted (line 53) | public static boolean isDeviceRooted() {
    method isAdbEnabled (line 71) | @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
    method getSDKVersionName (line 84) | public static String getSDKVersionName() {
    method getSDKVersionCode (line 93) | public static int getSDKVersionCode() {
    method getAndroidID (line 102) | @SuppressLint("HardwareIds")
    method getMacAddress (line 120) | @RequiresPermission(allOf = {ACCESS_WIFI_STATE, CHANGE_WIFI_STATE})
    method getWifiEnabled (line 129) | private static boolean getWifiEnabled() {
    method setWifiEnabled (line 142) | @RequiresPermission(CHANGE_WIFI_STATE)
    method getMacAddress (line 158) | @RequiresPermission(allOf = {ACCESS_WIFI_STATE})
    method isAddressNotInExcepts (line 179) | private static boolean isAddressNotInExcepts(final String address, fin...
    method getMacAddressByWifiInfo (line 197) | @RequiresPermission(ACCESS_WIFI_STATE)
    method getMacAddressByNetworkInterface (line 218) | private static String getMacAddressByNetworkInterface() {
    method getMacAddressByInetAddress (line 239) | private static String getMacAddressByInetAddress() {
    method getInetAddress (line 261) | private static InetAddress getInetAddress() {
    method getMacAddressByFile (line 283) | private static String getMacAddressByFile() {
    method getManufacturer (line 306) | public static String getManufacturer() {
    method getModel (line 316) | public static String getModel() {
    method getABIs (line 332) | public static String[] getABIs() {
    method isTablet (line 348) | public static boolean isTablet() {
    method isEmulator (line 359) | public static boolean isEmulator() {
    method isEmulatorByCpu (line 403) | private static boolean isEmulatorByCpu() {
    method readCpuInfo (line 413) | private static String readCpuInfo() {
    method isDevelopmentSettingsEnabled (line 437) | @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
    method getUniqueDeviceId (line 457) | public static String getUniqueDeviceId() {
    method getUniqueDeviceId (line 470) | public static String getUniqueDeviceId(String prefix) {
    method getUniqueDeviceId (line 483) | public static String getUniqueDeviceId(boolean useCache) {
    method getUniqueDeviceId (line 497) | public static String getUniqueDeviceId(String prefix, boolean useCache) {
    method getUniqueDeviceIdReal (line 516) | private static String getUniqueDeviceIdReal(String prefix) {
    method isSameDevice (line 527) | @RequiresPermission(allOf = {ACCESS_WIFI_STATE, INTERNET, CHANGE_WIFI_...
    method saveUdid (line 552) | private static String saveUdid(String prefix, String id) {
    method getUdid (line 558) | private static String getUdid(String prefix, String id) {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/EncodeUtils.java
  class EncodeUtils (line 19) | public final class EncodeUtils {
    method EncodeUtils (line 21) | private EncodeUtils() {
    method urlEncode (line 31) | public static String urlEncode(final String input) {
    method urlEncode (line 42) | public static String urlEncode(final String input, final String charse...
    method urlDecode (line 57) | public static String urlDecode(final String input) {
    method urlDecode (line 68) | public static String urlDecode(final String input, final String charse...
    method base64Encode (line 84) | public static byte[] base64Encode(final String input) {
    method base64Encode (line 94) | public static byte[] base64Encode(final byte[] input) {
    method base64Encode2String (line 105) | public static String base64Encode2String(final byte[] input) {
    method base64Decode (line 116) | public static byte[] base64Decode(final String input) {
    method base64Decode (line 127) | public static byte[] base64Decode(final byte[] input) {
    method htmlEncode (line 138) | public static String htmlEncode(final CharSequence input) {
    method htmlDecode (line 178) | public static CharSequence htmlDecode(final String input) {
    method binaryEncode (line 193) | public static String binaryEncode(final String input) {
    method binaryDecode (line 208) | public static String binaryDecode(final String input) {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java
  class EncryptUtils (line 34) | public final class EncryptUtils {
    method EncryptUtils (line 36) | private EncryptUtils() {
    method encryptMD2ToString (line 50) | public static String encryptMD2ToString(final String data) {
    method encryptMD2ToString (line 61) | public static String encryptMD2ToString(final byte[] data) {
    method encryptMD2 (line 71) | public static byte[] encryptMD2(final byte[] data) {
    method encryptMD5ToString (line 81) | public static String encryptMD5ToString(final String data) {
    method encryptMD5ToString (line 93) | public static String encryptMD5ToString(final String data, final Strin...
    method encryptMD5ToString (line 106) | public static String encryptMD5ToString(final byte[] data) {
    method encryptMD5ToString (line 117) | public static String encryptMD5ToString(final byte[] data, final byte[...
    method encryptMD5 (line 133) | public static byte[] encryptMD5(final byte[] data) {
    method encryptMD5File2String (line 143) | public static String encryptMD5File2String(final String filePath) {
    method encryptMD5File (line 154) | public static byte[] encryptMD5File(final String filePath) {
    method encryptMD5File2String (line 165) | public static String encryptMD5File2String(final File file) {
    method encryptMD5File (line 175) | public static byte[] encryptMD5File(final File file) {
    method encryptSHA1ToString (line 209) | public static String encryptSHA1ToString(final String data) {
    method encryptSHA1ToString (line 220) | public static String encryptSHA1ToString(final byte[] data) {
    method encryptSHA1 (line 230) | public static byte[] encryptSHA1(final byte[] data) {
    method encryptSHA224ToString (line 240) | public static String encryptSHA224ToString(final String data) {
    method encryptSHA224ToString (line 251) | public static String encryptSHA224ToString(final byte[] data) {
    method encryptSHA224 (line 261) | public static byte[] encryptSHA224(final byte[] data) {
    method encryptSHA256ToString (line 271) | public static String encryptSHA256ToString(final String data) {
    method encryptSHA256ToString (line 282) | public static String encryptSHA256ToString(final byte[] data) {
    method encryptSHA256 (line 292) | public static byte[] encryptSHA256(final byte[] data) {
    method encryptSHA384ToString (line 302) | public static String encryptSHA384ToString(final String data) {
    method encryptSHA384ToString (line 313) | public static String encryptSHA384ToString(final byte[] data) {
    method encryptSHA384 (line 323) | public static byte[] encryptSHA384(final byte[] data) {
    method encryptSHA512ToString (line 333) | public static String encryptSHA512ToString(final String data) {
    method encryptSHA512ToString (line 344) | public static String encryptSHA512ToString(final byte[] data) {
    method encryptSHA512 (line 354) | public static byte[] encryptSHA512(final byte[] data) {
    method hashTemplate (line 365) | static byte[] hashTemplate(final byte[] data, final String algorithm) {
    method encryptHmacMD5ToString (line 388) | public static String encryptHmacMD5ToString(final String data, final S...
    method encryptHmacMD5ToString (line 400) | public static String encryptHmacMD5ToString(final byte[] data, final b...
    method encryptHmacMD5 (line 411) | public static byte[] encryptHmacMD5(final byte[] data, final byte[] ke...
    method encryptHmacSHA1ToString (line 422) | public static String encryptHmacSHA1ToString(final String data, final ...
    method encryptHmacSHA1ToString (line 434) | public static String encryptHmacSHA1ToString(final byte[] data, final ...
    method encryptHmacSHA1 (line 445) | public static byte[] encryptHmacSHA1(final byte[] data, final byte[] k...
    method encryptHmacSHA224ToString (line 456) | public static String encryptHmacSHA224ToString(final String data, fina...
    method encryptHmacSHA224ToString (line 468) | public static String encryptHmacSHA224ToString(final byte[] data, fina...
    method encryptHmacSHA224 (line 479) | public static byte[] encryptHmacSHA224(final byte[] data, final byte[]...
    method encryptHmacSHA256ToString (line 490) | public static String encryptHmacSHA256ToString(final String data, fina...
    method encryptHmacSHA256ToString (line 502) | public static String encryptHmacSHA256ToString(final byte[] data, fina...
    method encryptHmacSHA256 (line 513) | public static byte[] encryptHmacSHA256(final byte[] data, final byte[]...
    method encryptHmacSHA384ToString (line 524) | public static String encryptHmacSHA384ToString(final String data, fina...
    method encryptHmacSHA384ToString (line 536) | public static String encryptHmacSHA384ToString(final byte[] data, fina...
    method encryptHmacSHA384 (line 547) | public static byte[] encryptHmacSHA384(final byte[] data, final byte[]...
    method encryptHmacSHA512ToString (line 558) | public static String encryptHmacSHA512ToString(final String data, fina...
    method encryptHmacSHA512ToString (line 570) | public static String encryptHmacSHA512ToString(final byte[] data, fina...
    method encryptHmacSHA512 (line 581) | public static byte[] encryptHmacSHA512(final byte[] data, final byte[]...
    method hmacTemplate (line 593) | private static byte[] hmacTemplate(final byte[] data,
    method encryptDES2Base64 (line 622) | public static byte[] encryptDES2Base64(final byte[] data,
    method encryptDES2HexString (line 639) | public static String encryptDES2HexString(final byte[] data,
    method encryptDES (line 656) | public static byte[] encryptDES(final byte[] data,
    method decryptBase64DES (line 673) | public static byte[] decryptBase64DES(final byte[] data,
    method decryptHexStringDES (line 690) | public static byte[] decryptHexStringDES(final String data,
    method decryptDES (line 707) | public static byte[] decryptDES(final byte[] data,
    method encrypt3DES2Base64 (line 728) | public static byte[] encrypt3DES2Base64(final byte[] data,
    method encrypt3DES2HexString (line 745) | public static String encrypt3DES2HexString(final byte[] data,
    method encrypt3DES (line 762) | public static byte[] encrypt3DES(final byte[] data,
    method decryptBase64_3DES (line 779) | public static byte[] decryptBase64_3DES(final byte[] data,
    method decryptHexString3DES (line 796) | public static byte[] decryptHexString3DES(final String data,
    method decrypt3DES (line 813) | public static byte[] decrypt3DES(final byte[] data,
    method encryptAES2Base64 (line 834) | public static byte[] encryptAES2Base64(final byte[] data,
    method encryptAES2HexString (line 851) | public static String encryptAES2HexString(final byte[] data,
    method encryptAES (line 868) | public static byte[] encryptAES(final byte[] data,
    method decryptBase64AES (line 885) | public static byte[] decryptBase64AES(final byte[] data,
    method decryptHexStringAES (line 902) | public static byte[] decryptHexStringAES(final String data,
    method decryptAES (line 919) | public static byte[] decryptAES(final byte[] data,
    method symmetricTemplate (line 936) | private static byte[] symmetricTemplate(final byte[] data,
    method encryptRSA2Base64 (line 979) | public static byte[] encryptRSA2Base64(final byte[] data,
    method encryptRSA2HexString (line 995) | public static String encryptRSA2HexString(final byte[] data,
    method encryptRSA (line 1011) | public static byte[] encryptRSA(final byte[] data,
    method decryptBase64RSA (line 1027) | public static byte[] decryptBase64RSA(final byte[] data,
    method decryptHexStringRSA (line 1043) | public static byte[] decryptHexStringRSA(final String data,
    method decryptRSA (line 1059) | public static byte[] decryptRSA(final byte[] data,
    method rsaTemplate (line 1076) | private static byte[] rsaTemplate(final byte[] data,
    method rc4 (line 1142) | public static byte[] rc4(byte[] data, byte[] key) {
    method joins (line 1178) | private static byte[] joins(final byte[] prefix, final byte[] suffix) {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/FileIOUtils.java
  class FileIOUtils (line 36) | public final class FileIOUtils {
    method FileIOUtils (line 40) | private FileIOUtils() {
    method writeFileFromIS (line 55) | public static boolean writeFileFromIS(final String filePath, final Inp...
    method writeFileFromIS (line 67) | public static boolean writeFileFromIS(final String filePath,
    method writeFileFromIS (line 80) | public static boolean writeFileFromIS(final File file, final InputStre...
    method writeFileFromIS (line 92) | public static boolean writeFileFromIS(final File file,
    method writeFileFromIS (line 110) | public static boolean writeFileFromIS(final String filePath,
    method writeFileFromIS (line 125) | public static boolean writeFileFromIS(final String filePath,
    method writeFileFromIS (line 140) | public static boolean writeFileFromIS(final File file,
    method writeFileFromIS (line 155) | public static boolean writeFileFromIS(final File file,
    method writeFileFromBytesByStream (line 214) | public static boolean writeFileFromBytesByStream(final String filePath...
    method writeFileFromBytesByStream (line 226) | public static boolean writeFileFromBytesByStream(final String filePath,
    method writeFileFromBytesByStream (line 239) | public static boolean writeFileFromBytesByStream(final File file, fina...
    method writeFileFromBytesByStream (line 251) | public static boolean writeFileFromBytesByStream(final File file,
    method writeFileFromBytesByStream (line 269) | public static boolean writeFileFromBytesByStream(final String filePath,
    method writeFileFromBytesByStream (line 284) | public static boolean writeFileFromBytesByStream(final String filePath,
    method writeFileFromBytesByStream (line 299) | public static boolean writeFileFromBytesByStream(final File file,
    method writeFileFromBytesByStream (line 314) | public static boolean writeFileFromBytesByStream(final File file,
    method writeFileFromBytesByChannel (line 330) | public static boolean writeFileFromBytesByChannel(final String filePath,
    method writeFileFromBytesByChannel (line 345) | public static boolean writeFileFromBytesByChannel(final String filePath,
    method writeFileFromBytesByChannel (line 360) | public static boolean writeFileFromBytesByChannel(final File file,
    method writeFileFromBytesByChannel (line 375) | public static boolean writeFileFromBytesByChannel(final File file,
    method writeFileFromBytesByMap (line 420) | public static boolean writeFileFromBytesByMap(final String filePath,
    method writeFileFromBytesByMap (line 435) | public static boolean writeFileFromBytesByMap(final String filePath,
    method writeFileFromBytesByMap (line 450) | public static boolean writeFileFromBytesByMap(final File file,
    method writeFileFromBytesByMap (line 465) | public static boolean writeFileFromBytesByMap(final File file,
    method writeFileFromString (line 505) | public static boolean writeFileFromString(final String filePath, final...
    method writeFileFromString (line 517) | public static boolean writeFileFromString(final String filePath,
    method writeFileFromString (line 530) | public static boolean writeFileFromString(final File file, final Strin...
    method writeFileFromString (line 542) | public static boolean writeFileFromString(final File file,
    method readFile2List (line 579) | public static List<String> readFile2List(final String filePath) {
    method readFile2List (line 590) | public static List<String> readFile2List(final String filePath, final ...
    method readFile2List (line 600) | public static List<String> readFile2List(final File file) {
    method readFile2List (line 611) | public static List<String> readFile2List(final File file, final String...
    method readFile2List (line 623) | public static List<String> readFile2List(final String filePath, final ...
    method readFile2List (line 636) | public static List<String> readFile2List(final String filePath,
    method readFile2List (line 651) | public static List<String> readFile2List(final File file, final int st...
    method readFile2List (line 664) | public static List<String> readFile2List(final File file,
    method readFile2String (line 708) | public static String readFile2String(final String filePath) {
    method readFile2String (line 719) | public static String readFile2String(final String filePath, final Stri...
    method readFile2String (line 729) | public static String readFile2String(final File file) {
    method readFile2String (line 740) | public static String readFile2String(final File file, final String cha...
    method readFile2BytesByStream (line 765) | public static byte[] readFile2BytesByStream(final String filePath) {
    method readFile2BytesByStream (line 775) | public static byte[] readFile2BytesByStream(final File file) {
    method readFile2BytesByStream (line 790) | public static byte[] readFile2BytesByStream(final String filePath,
    method readFile2BytesByStream (line 802) | public static byte[] readFile2BytesByStream(final File file,
    method readFile2BytesByChannel (line 856) | public static byte[] readFile2BytesByChannel(final String filePath) {
    method readFile2BytesByChannel (line 866) | public static byte[] readFile2BytesByChannel(final File file) {
    method readFile2BytesByMap (line 900) | public static byte[] readFile2BytesByMap(final String filePath) {
    method readFile2BytesByMap (line 910) | public static byte[] readFile2BytesByMap(final File file) {
    method setBufferSize (line 944) | public static void setBufferSize(final int bufferSize) {
    type OnProgressUpdateListener (line 948) | public interface OnProgressUpdateListener {
      method onProgressUpdate (line 949) | void onProgressUpdate(double progress);

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/FileUtils.java
  class FileUtils (line 37) | public final class FileUtils {
    method FileUtils (line 41) | private FileUtils() {
    method getFileByPath (line 51) | public static File getFileByPath(final String filePath) {
    method isFileExists (line 61) | public static boolean isFileExists(final File file) {
    method isFileExists (line 75) | public static boolean isFileExists(final String filePath) {
    method isFileExistsApi29 (line 84) | private static boolean isFileExistsApi29(String filePath) {
    method rename (line 110) | public static boolean rename(final String filePath, final String newNa...
    method rename (line 121) | public static boolean rename(final File file, final String newName) {
    method isDir (line 142) | public static boolean isDir(final String dirPath) {
    method isDir (line 152) | public static boolean isDir(final File file) {
    method isFile (line 162) | public static boolean isFile(final String filePath) {
    method isFile (line 172) | public static boolean isFile(final File file) {
    method createOrExistsDir (line 182) | public static boolean createOrExistsDir(final String dirPath) {
    method createOrExistsDir (line 192) | public static boolean createOrExistsDir(final File file) {
    method createOrExistsFile (line 202) | public static boolean createOrExistsFile(final String filePath) {
    method createOrExistsFile (line 212) | public static boolean createOrExistsFile(final File file) {
    method createFileByDeleteOldFile (line 230) | public static boolean createFileByDeleteOldFile(final String filePath) {
    method createFileByDeleteOldFile (line 240) | public static boolean createFileByDeleteOldFile(final File file) {
    method copy (line 260) | public static boolean copy(final String srcPath,
    method copy (line 273) | public static boolean copy(final String srcPath,
    method copy (line 286) | public static boolean copy(final File src,
    method copy (line 299) | public static boolean copy(final File src,
    method copyDir (line 317) | private static boolean copyDir(final File srcDir,
    method copyFile (line 331) | private static boolean copyFile(final File srcFile,
    method move (line 344) | public static boolean move(final String srcPath,
    method move (line 357) | public static boolean move(final String srcPath,
    method move (line 370) | public static boolean move(final File src,
    method move (line 383) | public static boolean move(final File src,
    method moveDir (line 401) | public static boolean moveDir(final File srcDir,
    method moveFile (line 415) | public static boolean moveFile(final File srcFile,
    method copyOrMoveDir (line 421) | private static boolean copyOrMoveDir(final File srcDir,
    method copyOrMoveFile (line 446) | private static boolean copyOrMoveFile(final File srcFile,
    method delete (line 480) | public static boolean delete(final String filePath) {
    method delete (line 490) | public static boolean delete(final File file) {
    method deleteDir (line 504) | private static boolean deleteDir(final File dir) {
    method deleteFile (line 529) | private static boolean deleteFile(final File file) {
    method deleteAllInDir (line 539) | public static boolean deleteAllInDir(final String dirPath) {
    method deleteAllInDir (line 549) | public static boolean deleteAllInDir(final File dir) {
    method deleteFilesInDir (line 564) | public static boolean deleteFilesInDir(final String dirPath) {
    method deleteFilesInDir (line 574) | public static boolean deleteFilesInDir(final File dir) {
    method deleteFilesInDirWithFilter (line 590) | public static boolean deleteFilesInDirWithFilter(final String dirPath,
    method deleteFilesInDirWithFilter (line 602) | public static boolean deleteFilesInDirWithFilter(final File dir, final...
    method listFilesInDir (line 630) | public static List<File> listFilesInDir(final String dirPath) {
    method listFilesInDir (line 641) | public static List<File> listFilesInDir(final File dir) {
    method listFilesInDir (line 653) | public static List<File> listFilesInDir(final String dirPath, Comparat...
    method listFilesInDir (line 665) | public static List<File> listFilesInDir(final File dir, Comparator<Fil...
    method listFilesInDir (line 676) | public static List<File> listFilesInDir(final String dirPath, final bo...
    method listFilesInDir (line 687) | public static List<File> listFilesInDir(final File dir, final boolean ...
    method listFilesInDir (line 699) | public static List<File> listFilesInDir(final String dirPath,
    method listFilesInDir (line 713) | public static List<File> listFilesInDir(final File dir,
    method listFilesInDirWithFilter (line 732) | public static List<File> listFilesInDirWithFilter(final String dirPath,
    method listFilesInDirWithFilter (line 745) | public static List<File> listFilesInDirWithFilter(final File dir,
    method listFilesInDirWithFilter (line 759) | public static List<File> listFilesInDirWithFilter(final String dirPath,
    method listFilesInDirWithFilter (line 774) | public static List<File> listFilesInDirWithFilter(final File dir,
    method listFilesInDirWithFilter (line 788) | public static List<File> listFilesInDirWithFilter(final String dirPath,
    method listFilesInDirWithFilter (line 802) | public static List<File> listFilesInDirWithFilter(final File dir,
    method listFilesInDirWithFilter (line 818) | public static List<File> listFilesInDirWithFilter(final String dirPath,
    method listFilesInDirWithFilter (line 834) | public static List<File> listFilesInDirWithFilter(final File dir,
    method listFilesInDirWithFilterInner (line 845) | private static List<File> listFilesInDirWithFilterInner(final File dir,
    method getFileLastModified (line 871) | public static long getFileLastModified(final String filePath) {
    method getFileLastModified (line 881) | public static long getFileLastModified(final File file) {
    method getFileCharsetSimple (line 892) | public static String getFileCharsetSimple(final String filePath) {
    method getFileCharsetSimple (line 902) | public static String getFileCharsetSimple(final File file) {
    method isUtf8 (line 937) | public static boolean isUtf8(final String filePath) {
    method isUtf8 (line 947) | public static boolean isUtf8(final File file) {
    method isUtf8 (line 983) | private static int isUtf8(byte[] raw) {
    method getFileLines (line 1050) | public static int getFileLines(final String filePath) {
    method getFileLines (line 1060) | public static int getFileLines(final File file) {
    method getSize (line 1100) | public static String getSize(final String filePath) {
    method getSize (line 1110) | public static String getSize(final File file) {
    method getDirSize (line 1124) | private static String getDirSize(final File dir) {
    method getFileSize (line 1135) | private static String getFileSize(final File file) {
    method getLength (line 1146) | public static long getLength(final String filePath) {
    method getLength (line 1156) | public static long getLength(final File file) {
    method getDirLength (line 1170) | private static long getDirLength(final File dir) {
    method getFileLength (line 1192) | public static long getFileLength(final String filePath) {
    method getFileLength (line 1216) | private static long getFileLength(final File file) {
    method getFileMD5ToString (line 1227) | public static String getFileMD5ToString(final String filePath) {
    method getFileMD5ToString (line 1238) | public static String getFileMD5ToString(final File file) {
    method getFileMD5 (line 1248) | public static byte[] getFileMD5(final String filePath) {
    method getFileMD5 (line 1258) | public static byte[] getFileMD5(final File file) {
    method getDirName (line 1291) | public static String getDirName(final File file) {
    method getDirName (line 1302) | public static String getDirName(final String filePath) {
    method getFileName (line 1314) | public static String getFileName(final File file) {
    method getFileName (line 1325) | public static String getFileName(final String filePath) {
    method getFileNameNoExtension (line 1337) | public static String getFileNameNoExtension(final File file) {
    method getFileNameNoExtension (line 1348) | public static String getFileNameNoExtension(final String filePath) {
    method getFileExtension (line 1367) | public static String getFileExtension(final File file) {
    method getFileExtension (line 1378) | public static String getFileExtension(final String filePath) {
    method notifySystemToScan (line 1391) | public static void notifySystemToScan(final String filePath) {
    method notifySystemToScan (line 1400) | public static void notifySystemToScan(final File file) {
    method getFsTotalSize (line 1413) | public static long getFsTotalSize(String anyPathInFs) {
    method getFsAvailableSize (line 1434) | public static long getFsAvailableSize(final String anyPathInFs) {
    type OnReplaceListener (line 1453) | public interface OnReplaceListener {
      method onReplace (line 1454) | boolean onReplace(File srcFile, File destFile);

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/FlashlightUtils.java
  class FlashlightUtils (line 21) | public final class FlashlightUtils {
    method FlashlightUtils (line 26) | private FlashlightUtils() {
    method isFlashlightEnable (line 35) | public static boolean isFlashlightEnable() {
    method isFlashlightOn (line 46) | public static boolean isFlashlightOn() {
    method setFlashlightStatus (line 57) | public static void setFlashlightStatus(final boolean isOn) {
    method destroy (line 82) | public static void destroy() {
    method init (line 89) | private static boolean init() {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
  class FragmentUtils (line 33) | public final class FragmentUtils {
    method FragmentUtils (line 48) | private FragmentUtils() {
    method add (line 59) | public static void add(@NonNull final FragmentManager fm,
    method add (line 73) | public static void add(@NonNull final FragmentManager fm,
    method add (line 89) | public static void add(@NonNull final FragmentManager fm,
    method add (line 108) | public static void add(@NonNull final FragmentManager fm,
    method add (line 128) | public static void add(@NonNull final FragmentManager fm,
    method add (line 154) | public static void add(@NonNull final FragmentManager fm,
    method add (line 182) | public static void add(@NonNull final FragmentManager fm,
    method add (line 202) | public static void add(@NonNull final FragmentManager fm,
    method add (line 219) | public static void add(@NonNull final FragmentManager fm,
    method add (line 235) | public static void add(@NonNull final FragmentManager fm,
    method add (line 250) | public static void add(@NonNull final FragmentManager fm,
    method add (line 265) | public static void add(@NonNull final FragmentManager fm,
    method add (line 281) | public static void add(@NonNull final FragmentManager fm,
    method add (line 299) | public static void add(@NonNull final FragmentManager fm,
    method add (line 321) | public static void add(@NonNull final FragmentManager fm,
    method add (line 343) | public static void add(@NonNull final FragmentManager fm,
    method add (line 371) | public static void add(@NonNull final FragmentManager fm,
    method add (line 401) | public static void add(@NonNull final FragmentManager fm,
    method add (line 426) | public static void add(@NonNull final FragmentManager fm,
    method add (line 444) | public static void add(@NonNull final FragmentManager fm,
    method add (line 464) | public static void add(@NonNull final FragmentManager fm,
    method add (line 480) | public static void add(@NonNull final FragmentManager fm,
    method show (line 502) | public static void show(@NonNull final Fragment show) {
    method show (line 512) | public static void show(@NonNull final FragmentManager fm) {
    method hide (line 525) | public static void hide(@NonNull final Fragment hide) {
    method hide (line 535) | public static void hide(@NonNull final FragmentManager fm) {
    method showHide (line 549) | public static void showHide(@NonNull final Fragment show,
    method showHide (line 560) | public static void showHide(final int showIndex, @NonNull final Fragme...
    method showHide (line 570) | public static void showHide(@NonNull final Fragment show, @NonNull fin...
    method showHide (line 580) | public static void showHide(final int showIndex, @NonNull final List<F...
    method showHide (line 590) | public static void showHide(@NonNull final Fragment show, @NonNull fin...
    method showHide (line 604) | public static void showHide(@NonNull final Fragment show,
    method showHide (line 618) | public static void showHide(final int showIndex, @NonNull final List<F...
    method showHide (line 632) | public static void showHide(@NonNull final Fragment show, @NonNull fin...
    method replace (line 654) | public static void replace(@NonNull final Fragment srcFragment,
    method replace (line 666) | public static void replace(@NonNull final Fragment srcFragment,
    method replace (line 682) | public static void replace(@NonNull final Fragment srcFragment,
    method replace (line 700) | public static void replace(@NonNull final Fragment srcFragment,
    method replace (line 724) | public static void replace(@NonNull final Fragment srcFragment,
    method replace (line 751) | public static void replace(@NonNull final Fragment srcFragment,
    method replace (line 770) | public static void replace(@NonNull final Fragment srcFragment,
    method replace (line 785) | public static void replace(@NonNull final Fragment srcFragment,
    method replace (line 799) | public static void replace(@NonNull final FragmentManager fm,
    method replace (line 813) | public static void replace(@NonNull final FragmentManager fm,
    method replace (line 831) | public static void replace(@NonNull final FragmentManager fm,
    method replace (line 851) | public static void replace(@NonNull final FragmentManager fm,
    method replace (line 877) | public static void replace(@NonNull final FragmentManager fm,
    method replace (line 906) | public static void replace(@NonNull final FragmentManager fm,
    method replace (line 927) | public static void replace(@NonNull final FragmentManager fm,
    method replace (line 944) | public static void replace(@NonNull final FragmentManager fm,
    method replace (line 959) | public static void replace(@NonNull final Fragment srcFragment,
    method replace (line 973) | public static void replace(@NonNull final Fragment srcFragment,
    method replace (line 994) | public static void replace(@NonNull final Fragment srcFragment,
    method replace (line 1014) | public static void replace(@NonNull final Fragment srcFragment,
    method replace (line 1040) | public static void replace(@NonNull final Fragment srcFragment,
    method replace (line 1069) | public static void replace(@NonNull final Fragment srcFragment,
    method replace (line 1093) | public static void replace(@NonNull final Fragment srcFragment,
    method replace (line 1110) | public static void replace(@NonNull final Fragment srcFragment,
    method replace (line 1135) | public static void replace(@NonNull final FragmentManager fm,
    method replace (line 1151) | public static void replace(@NonNull final FragmentManager fm,
    method replace (line 1173) | public static void replace(@NonNull final FragmentManager fm,
    method replace (line 1195) | public static void replace(@NonNull final FragmentManager fm,
    method replace (line 1223) | public static void replace(@NonNull final FragmentManager fm,
    method replace (line 1254) | public static void replace(@NonNull final FragmentManager fm,
    method replace (line 1279) | public static void replace(@NonNull final FragmentManager fm,
    method replace (line 1298) | public static void replace(@NonNull final FragmentManager fm,
    method pop (line 1315) | public static void pop(@NonNull final FragmentManager fm) {
    method pop (line 1325) | public static void pop(@NonNull final FragmentManager fm,
    method popTo (line 1341) | public static void popTo(@NonNull final FragmentManager fm,
    method popTo (line 1355) | public static void popTo(@NonNull final FragmentManager fm,
    method popAll (line 1373) | public static void popAll(@NonNull final FragmentManager fm) {
    method popAll (line 1382) | public static void popAll(@NonNull final FragmentManager fm, final boo...
    method remove (line 1398) | public static void remove(@NonNull final Fragment remove) {
    method removeTo (line 1408) | public static void removeTo(@NonNull final Fragment removeTo, final bo...
    method removeAll (line 1417) | public static void removeAll(@NonNull final FragmentManager fm) {
    method putArgs (line 1422) | private static void putArgs(final Fragment fragment, final Args args) {
    method putArgs (line 1434) | private static void putArgs(final Fragment fragment, final boolean isH...
    method getArgs (line 1443) | private static Args getArgs(final Fragment fragment) {
    method operateNoAnim (line 1451) | private static void operateNoAnim(final int type, @Nullable final Frag...
    method operate (line 1459) | private static void operate(final int type,
    method addAnim (line 1532) | private static void addAnim(final FragmentTransaction ft,
    method addSharedElement (line 1540) | private static void addSharedElement(final FragmentTransaction ft,
    method getTop (line 1555) | public static Fragment getTop(@NonNull final FragmentManager fm) {
    method getTopInStack (line 1565) | public static Fragment getTopInStack(@NonNull final FragmentManager fm) {
    method getTopIsInStack (line 1569) | private static Fragment getTopIsInStack(@NonNull final FragmentManager...
    method getTopShow (line 1595) | public static Fragment getTopShow(@NonNull final FragmentManager fm) {
    method getTopShowInStack (line 1605) | public static Fragment getTopShowInStack(@NonNull final FragmentManage...
    method getTopShowIsInStack (line 1609) | private static Fragment getTopShowIsInStack(@NonNull final FragmentMan...
    method getFragments (line 1638) | public static List<Fragment> getFragments(@NonNull final FragmentManag...
    method getFragmentsInStack (line 1650) | public static List<Fragment> getFragmentsInStack(@NonNull final Fragme...
    method getAllFragments (line 1670) | public static List<FragmentNode> getAllFragments(@NonNull final Fragme...
    method getAllFragments (line 1674) | private static List<FragmentNode> getAllFragments(@NonNull final Fragm...
    method getAllFragmentsInStack (line 1694) | public static List<FragmentNode> getAllFragmentsInStack(@NonNull final...
    method getAllFragmentsInStack (line 1698) | private static List<FragmentNode> getAllFragmentsInStack(@NonNull fina...
    method findFragment (line 1722) | public static Fragment findFragment(@NonNull final FragmentManager fm,
    method findFragment (line 1734) | public static Fragment findFragment(@NonNull final FragmentManager fm,
    method dispatchBackPress (line 1745) | public static boolean dispatchBackPress(@NonNull final Fragment fragme...
    method dispatchBackPress (line 1759) | public static boolean dispatchBackPress(@NonNull final FragmentManager...
    method setBackgroundColor (line 1782) | public static void setBackgroundColor(@NonNull final Fragment fragment,
    method setBackgroundResource (line 1796) | public static void setBackgroundResource(@NonNull final Fragment fragm...
    method setBackground (line 1810) | public static void setBackground(@NonNull final Fragment fragment, fin...
    method getSimpleName (line 1826) | public static String getSimpleName(final Fragment fragment) {
    class Args (line 1830) | private static class Args {
      method Args (line 1836) | Args(final int id, final boolean isHide, final boolean isAddStack) {
      method Args (line 1840) | Args(final int id, final String tag,
    class FragmentNode (line 1849) | public static class FragmentNode {
      method FragmentNode (line 1853) | public FragmentNode(final Fragment fragment, final List<FragmentNode...
      method getFragment (line 1858) | public Fragment getFragment() {
      method getNext (line 1862) | public List<FragmentNode> getNext() {
      method toString (line 1866) | @Override
    type OnBackClickListener (line 1878) | public interface OnBackClickListener {
      method onBackClick (line 1879) | boolean onBackClick();

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/GsonUtils.java
  class GsonUtils (line 27) | public final class GsonUtils {
    method GsonUtils (line 35) | private GsonUtils() {
    method setGsonDelegate (line 44) | public static void setGsonDelegate(Gson delegate) {
    method setGson (line 55) | public static void setGson(final String key, final Gson gson) {
    method getGson (line 66) | public static Gson getGson(final String key) {
    method getGson (line 70) | public static Gson getGson() {
    method toJson (line 89) | public static String toJson(final Object object) {
    method toJson (line 100) | public static String toJson(final Object src, @NonNull final Type type...
    method toJson (line 111) | public static String toJson(@NonNull final Gson gson, final Object obj...
    method toJson (line 123) | public static String toJson(@NonNull final Gson gson, final Object src...
    method fromJson (line 134) | public static <T> T fromJson(final String json, @NonNull final Class<T...
    method fromJson (line 145) | public static <T> T fromJson(final String json, @NonNull final Type ty...
    method fromJson (line 156) | public static <T> T fromJson(@NonNull final Reader reader, @NonNull fi...
    method fromJson (line 167) | public static <T> T fromJson(@NonNull final Reader reader, @NonNull fi...
    method fromJson (line 179) | public static <T> T fromJson(@NonNull final Gson gson, final String js...
    method fromJson (line 191) | public static <T> T fromJson(@NonNull final Gson gson, final String js...
    method fromJson (line 203) | public static <T> T fromJson(@NonNull final Gson gson, final Reader re...
    method fromJson (line 215) | public static <T> T fromJson(@NonNull final Gson gson, final Reader re...
    method getListType (line 225) | public static Type getListType(@NonNull final Type type) {
    method getSetType (line 235) | public static Type getSetType(@NonNull final Type type) {
    method getMapType (line 246) | public static Type getMapType(@NonNull final Type keyType, @NonNull fi...
    method getArrayType (line 256) | public static Type getArrayType(@NonNull final Type type) {
    method getType (line 267) | public static Type getType(@NonNull final Type rawType, @NonNull final...
    method getGson4LogUtils (line 271) | static Gson getGson4LogUtils() {
    method createGson (line 280) | private static Gson createGson() {

FILE: lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java
  class ImageUtils (line 67) | public final class ImageUtils {
    method ImageUtils (line 69) | private ImageUtils() {
    method bitmap2Bytes (line 79) | public static byte[] bitmap2Bytes(final Bitmap bitmap) {
    method bitmap2Bytes (line 91) | public static byte[] bitmap2Bytes(@Nullable final Bitmap bitmap, @NonN...
    method bytes2Bitmap (line 104) | public static Bitmap bytes2Bitmap(@Nullable final byte[] bytes) {
    method drawable2Bitmap (line 116) | public static Bitmap drawable2Bitmap(@Nullable final Drawable drawable) {
    method bitmap2Drawable (line 149) | public static Drawable bitmap2Drawable(@Nullable final Bitmap bitmap) {
    method drawable2Bytes (line 159) | public static byte[] drawable2Bytes(@Nullable final Drawable drawable) {
    method drawable2Bytes (line 170) | public static byte[] drawable2Bytes(final Drawable drawable, final Com...
    method bytes2Drawable (line 180) | public static Drawable bytes2Drawable(final byte[] bytes) {
    method view2Bitmap (line 190) | public static Bitmap view2Bitmap(final View view) {
    method getBitmap (line 225) | public static Bitmap getBitmap(final File file) {
    method getBitmap (line 238) | public static Bitmap getBitmap(final File file, final int maxWidth, fi...
    method getBitmap (line 254) | public static Bitmap getBitmap(final String filePath) {
    method getBitmap (line 267) | public static Bitmap getBitmap(final String filePath, final int maxWid...
    method getBitmap (line 283) | public static Bitmap getBitmap(final InputStream is) {
    method getBitmap (line 296) | public static Bitmap getBitmap(final InputStream is, final int maxWidt...
    method getBitmap (line 313) | public static Bitmap getBitmap(final byte[] data, final int offset) {
    method getBitmap (line 327) | public static Bitmap getBitmap(final byte[] data,
    method getBitmap (line 346) | public static Bitmap getBitmap(@DrawableRes final int resId) {
    method getBitmap (line 369) | public static Bitmap getBitmap(@DrawableRes final int resId,
    method getBitmap (line 387) | public static Bitmap getBitmap(final FileDescriptor fd) {
    method getBitmap (line 400) | public static Bitmap getBitmap(final FileDescriptor fd,
    method drawColor (line 419) | public static Bitmap drawColor(@NonNull final Bitmap src, @ColorInt fi...
    method drawColor (line 431) | public static Bitmap drawColor(@NonNull final Bitmap src,
    method scale (line 449) | public static Bitmap scale(final Bitmap src, final int newWidth, final...
    method scale (line 462) | public static Bitmap scale(final Bitmap src,
    method scale (line 480) | public static Bitmap scale(final Bitmap src, final float scaleWidth, f...
    method scale (line 493) | public static Bitmap scale(final Bitmap src,
    method clip (line 515) | public static Bitmap clip(final Bitmap src,
    method clip (line 534) | public static Bitmap clip(final Bitmap src,
    method skew (line 554) | public static Bitmap skew(final Bitmap src, final float kx, final floa...
    method skew (line 567) | public static Bitmap skew(final Bitmap src,
    method skew (line 584) | public static Bitmap skew(final Bitmap src,
    method skew (line 603) | public static Bitmap skew(final Bitmap src,
    method rotate (line 626) | public static Bitmap rotate(final Bitmap src,
    method rotate (line 643) | public static Bitmap rotate(final Bitmap src,
    method getRotateDegree (line 663) 
Condensed preview — 661 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,275K chars).
[
  {
    "path": ".github/FUNDING.yml",
    "chars": 718,
    "preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 1137,
    "preview": "---\nname: Bug report\nabout: Make AndroidUtilCode more perfect!\nlabels: bug\nassignees: Blankj\n\n---\n\n## Describe the bug\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report_cn.md",
    "chars": 915,
    "preview": "---\nname: 提交 Bug\nabout: 让工具类更完美!\nlabels: bug\nassignees: Blankj\n\n---\n\n## 描述 Bug\n\n简洁地描述下 Bug。\n\n- AndroidUtilCode 的版本:<!-- "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-request.md",
    "chars": 410,
    "preview": "---\nname: Feature request\nabout: Make AndroidUtilCode more perfect!\nlabels: help wanted\nassignees: Blankj\n\n---\n\n## Descr"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-request_cn.md",
    "chars": 213,
    "preview": "---\nname: 提交需求\nabout: 让工具类更健全!\nlabels: help wanted\nassignees: Blankj\n\n---\n\n## 描述需求\n\n简洁地描述下需求。\n\n\n## 可借鉴的\n\n如果有的话,可以给出一些参考文"
  },
  {
    "path": ".github/workflows/android.yml",
    "chars": 276,
    "preview": "name: Android CI\n\non: [push]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v2\n   "
  },
  {
    "path": ".gitignore",
    "chars": 154,
    "preview": "*.iml\n__api__.json\n__bus__.json\n.gradle\nlocal.properties\n.idea\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n/apk\n*.ph"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 26266,
    "preview": "* `22/10/15` [add] Fix some issue. Publish v1.31.1\n* `21/12/06` [add] Publish v1.31.0\n* `21/05/13` [add] Support publish"
  },
  {
    "path": "LICENSE",
    "chars": 11336,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README-CN.md",
    "chars": 2953,
    "preview": "[![logo][logo]](https://github.com/Blankj/AndroidUtilCode)\n\n[![frame][frame]](https://github.com/Blankj/AucFrameTemplate"
  },
  {
    "path": "README.md",
    "chars": 3397,
    "preview": "[![logo][logo]](https://github.com/Blankj/AndroidUtilCode)\n\n[![frame][frame]](https://github.com/Blankj/AucFrameTemplate"
  },
  {
    "path": "build.gradle",
    "chars": 968,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n    Co"
  },
  {
    "path": "buildApp.gradle",
    "chars": 3568,
    "preview": "apply plugin: \"com.android.application\"\n\napply {\n    from \"${rootDir.path}/buildCommon.gradle\"\n    from \"${rootDir.path}"
  },
  {
    "path": "buildCommon.gradle",
    "chars": 696,
    "preview": "apply {\n    plugin \"kotlin-android\"\n    plugin \"kotlin-android-extensions\"\n}\n\nandroid {\n    compileSdkVersion Config.com"
  },
  {
    "path": "buildLib.gradle",
    "chars": 453,
    "preview": "apply plugin: \"com.android.library\"\napply from: \"${rootDir.path}/buildCommon.gradle\"\n\ndependencies {\n    if (project.nam"
  },
  {
    "path": "buildSrc/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "buildSrc/build.gradle",
    "chars": 650,
    "preview": "repositories {\n    google()\n    jcenter()\n}\n\napply {\n    plugin 'groovy'\n    plugin 'java-gradle-plugin'\n}\n\ngradlePlugin"
  },
  {
    "path": "buildSrc/settings.gradle",
    "chars": 253,
    "preview": "//dependencyResolutionManagement {\n//    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n//    repositories"
  },
  {
    "path": "buildSrc/src/main/groovy/Config.groovy",
    "chars": 6501,
    "preview": "class Config {\n\n    static applicationId = 'com.blankj.androidutilcode'\n    static appName = 'Util'\n\n    static compileS"
  },
  {
    "path": "buildSrc/src/main/groovy/ConfigUtils.groovy",
    "chars": 3155,
    "preview": "import org.gradle.api.Project\nimport org.gradle.api.ProjectEvaluationListener\nimport org.gradle.api.ProjectState\nimport "
  },
  {
    "path": "buildSrc/src/main/groovy/GLog.groovy",
    "chars": 8493,
    "preview": "/**\n * <pre>\n *     author: blankj\n *     blog  : http://blankj.com\n *     time  : 2019/07/13\n *     desc  :\n * </pre>\n "
  },
  {
    "path": "buildSrc/src/main/groovy/LibConfig.groovy",
    "chars": 589,
    "preview": "class LibConfig {\n\n    String path\n\n    String getGroupId() {\n        String[] splits = path.split(\":\")\n        return s"
  },
  {
    "path": "buildSrc/src/main/groovy/ModuleConfig.groovy",
    "chars": 832,
    "preview": "class ModuleConfig {\n\n    boolean isApply   // 是否应用\n    boolean useLocal  // 是否使用本地的\n    String localPath  // 本地路径\n    S"
  },
  {
    "path": "buildSrc/src/main/groovy/PluginConfig.groovy",
    "chars": 893,
    "preview": "final class PluginConfig {\n\n    boolean isApply = true  // 是否应用\n    boolean useLocal        // 是否使用本地的\n    String path  "
  },
  {
    "path": "buildSrc/src/main/groovy/TaskDurationUtils.groovy",
    "chars": 3104,
    "preview": "import org.gradle.BuildListener\nimport org.gradle.BuildResult\nimport org.gradle.api.Task\nimport org.gradle.api.execution"
  },
  {
    "path": "buildSrc/src/main/java/com/blankj/plugin/readme/FormatUtils.groovy",
    "chars": 1763,
    "preview": "package com.blankj.plugin.readme\n\nclass FormatUtils {\n\n    static def LINE_SEP = System.getProperty(\"line.separator\")\n  "
  },
  {
    "path": "buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeCorePlugin.groovy",
    "chars": 1690,
    "preview": "package com.blankj.plugin.readme\n\nimport org.gradle.api.Plugin\nimport org.gradle.api.Project\n\nclass ReadmeCorePlugin imp"
  },
  {
    "path": "buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeExtension.groovy",
    "chars": 104,
    "preview": "package com.blankj.plugin.readme\n\nclass ReadmeExtension {\n\n    File readmeFile\n    File readmeCnFile\n\n}\n"
  },
  {
    "path": "buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeSubPlugin.groovy",
    "chars": 1735,
    "preview": "package com.blankj.plugin.readme\n\nimport org.gradle.api.Plugin\nimport org.gradle.api.Project\n\nclass ReadmeSubPlugin impl"
  },
  {
    "path": "config/flavor.gradle",
    "chars": 482,
    "preview": "android {\n    flavorDimensions \"env\"\n    productFlavors {\n        dev {\n            dimension \"env\"\n        }\n\n        p"
  },
  {
    "path": "config/publish.gradle",
    "chars": 8059,
    "preview": "/*\r\n 1. add\r\n    signing.keyId=xx\r\n    signing.password=xx\r\n    signing.secretKeyRingFile=/Users/xx/secring.gpg\r\n    oss"
  },
  {
    "path": "feature/launcher/app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "feature/launcher/app/build.gradle",
    "chars": 90,
    "preview": "apply plugin: 'kotlin-kapt'\n\ndependencies {\n    kapt Config.libs.eventbus_processor.path\n}"
  },
  {
    "path": "feature/launcher/app/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "feature/launcher/app/src/main/AndroidManifest.xml",
    "chars": 1022,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "feature/launcher/app/src/main/java/com/blankj/launcher/app/LauncherApp.java",
    "chars": 483,
    "preview": "package com.blankj.launcher.app;\n\nimport com.blankj.common.CommonApplication;\n\n/**\n * <pre>\n *     author: Blankj\n *    "
  },
  {
    "path": "feature/main/app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "feature/main/app/build.gradle",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "feature/main/app/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "feature/main/app/src/main/AndroidManifest.xml",
    "chars": 998,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "feature/main/app/src/main/java/com/blankj/main/app/MainApp.java",
    "chars": 613,
    "preview": "package com.blankj.main.app;\n\nimport android.content.Context;\n\nimport com.blankj.common.CommonApplication;\n\n/**\n * <pre>"
  },
  {
    "path": "feature/main/pkg/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "feature/main/pkg/build.gradle",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "feature/main/pkg/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "feature/main/pkg/src/main/AndroidManifest.xml",
    "chars": 437,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.blankj.main.pkg\">\n\n    <applicatio"
  },
  {
    "path": "feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt",
    "chars": 2460,
    "preview": "package com.blankj.main.pkg\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.view.View\nimport andr"
  },
  {
    "path": "feature/main/pkg/src/main/java/com/blankj/main/pkg/SplashActivity.kt",
    "chars": 123,
    "preview": "package com.blankj.main.pkg\n\nimport com.blankj.common.activity.CommonActivity\n\nclass SplashActivity : CommonActivity() {"
  },
  {
    "path": "feature/main/pkg/src/main/res/layout/activity_main.xml",
    "chars": 2112,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schema"
  },
  {
    "path": "feature/main/pkg/src/main/res/values/strings.xml",
    "chars": 24,
    "preview": "<resources></resources>\n"
  },
  {
    "path": "feature/mock/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "feature/mock/build.gradle",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "feature/mock/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "feature/mock/src/main/AndroidManifest.xml",
    "chars": 38,
    "preview": "<manifest package=\"com.blankj.mock\" />"
  },
  {
    "path": "feature/mock/src/main/java/com/blankj/mock/subutil/SubUtilApiMock.java",
    "chars": 538,
    "preview": "package com.blankj.mock.subutil;\n\nimport android.content.Context;\n\nimport com.blankj.subutil.export.api.SubUtilApi;\nimpo"
  },
  {
    "path": "feature/mock/src/main/java/com/blankj/mock/utilcode/UtilCodeApiMock.java",
    "chars": 687,
    "preview": "package com.blankj.mock.utilcode;\n\nimport android.content.Context;\n\nimport com.blankj.utilcode.export.api.UtilCodeApi;\ni"
  },
  {
    "path": "feature/subutil/app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "feature/subutil/app/build.gradle",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "feature/subutil/app/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "feature/subutil/app/src/main/AndroidManifest.xml",
    "chars": 952,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "feature/subutil/app/src/main/java/com/blankj/subutil/app/SubUtilApp.kt",
    "chars": 549,
    "preview": "package com.blankj.subutil.app\n\nimport android.content.Context\nimport com.blankj.common.CommonApplication\n\n\n/**\n * ```\n "
  },
  {
    "path": "feature/subutil/export/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "feature/subutil/export/build.gradle",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "feature/subutil/export/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "feature/subutil/export/src/main/AndroidManifest.xml",
    "chars": 49,
    "preview": "<manifest package=\"com.blankj.subutil.export\" />\n"
  },
  {
    "path": "feature/subutil/export/src/main/java/com/blankj/subutil/export/api/SubUtilApi.java",
    "chars": 368,
    "preview": "package com.blankj.subutil.export.api;\n\nimport android.content.Context;\n\nimport com.blankj.utilcode.util.ApiUtils;\n\n\n/**"
  },
  {
    "path": "feature/subutil/pkg/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "feature/subutil/pkg/build.gradle",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "feature/subutil/pkg/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "feature/subutil/pkg/src/main/AndroidManifest.xml",
    "chars": 2632,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.blankj.subutil.pkg\"\n    android:sh"
  },
  {
    "path": "feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/Config.kt",
    "chars": 785,
    "preview": "package com.blankj.subutil.pkg\n\nimport android.os.Environment\nimport com.blankj.utilcode.util.Utils\n\n/**\n * ```\n * autho"
  },
  {
    "path": "feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/SubUtilApiImpl.java",
    "chars": 529,
    "preview": "package com.blankj.subutil.pkg;\n\nimport android.content.Context;\n\nimport com.blankj.subutil.export.api.SubUtilApi;\nimpor"
  },
  {
    "path": "feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/SubUtilActivity.kt",
    "chars": 2028,
    "preview": "package com.blankj.subutil.pkg.feature\n\nimport android.content.Context\nimport android.content.Intent\nimport com.blankj.c"
  },
  {
    "path": "feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/appStore/AppStoreActivity.kt",
    "chars": 1226,
    "preview": "package com.blankj.subutil.pkg.feature.appStore\n\nimport android.content.Context\nimport android.content.Intent\nimport com"
  },
  {
    "path": "feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/battery/BatteryActivity.kt",
    "chars": 1645,
    "preview": "package com.blankj.subutil.pkg.feature.battery\n\nimport android.content.Context\nimport android.content.Intent\nimport andr"
  },
  {
    "path": "feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/country/CountryActivity.kt",
    "chars": 1319,
    "preview": "package com.blankj.subutil.pkg.feature.country\n\nimport android.content.Context\nimport android.content.Intent\nimport com."
  },
  {
    "path": "feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/dangerous/DangerousActivity.kt",
    "chars": 4619,
    "preview": "package com.blankj.subutil.pkg.feature.dangerous\n\nimport android.content.Context\nimport android.content.Intent\nimport co"
  },
  {
    "path": "feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationActivity.kt",
    "chars": 3665,
    "preview": "package com.blankj.subutil.pkg.feature.location\n\nimport android.content.ComponentName\nimport android.content.Context\nimp"
  },
  {
    "path": "feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationService.kt",
    "chars": 3336,
    "preview": "package com.blankj.subutil.pkg.feature.location\n\nimport android.app.Service\nimport android.content.Intent\nimport android"
  },
  {
    "path": "feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/pinyin/PinyinActivity.kt",
    "chars": 1850,
    "preview": "package com.blankj.subutil.pkg.feature.pinyin\n\nimport android.content.Context\nimport android.content.Intent\nimport com.b"
  },
  {
    "path": "feature/subutil/pkg/src/main/res/values/strings.xml",
    "chars": 1577,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"demo_app_store\">App Store Demo</string>\n    <string"
  },
  {
    "path": "feature/utilcode/app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "feature/utilcode/app/build.gradle",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "feature/utilcode/app/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "feature/utilcode/app/src/main/AndroidManifest.xml",
    "chars": 899,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "feature/utilcode/app/src/main/java/com/blankj/utilcode/app/UtilCodeApp.kt",
    "chars": 546,
    "preview": "package com.blankj.utilcode.app\n\nimport com.blankj.common.CommonApplication\nimport com.blankj.utilcode.util.Utils\n\n\n/**\n"
  },
  {
    "path": "feature/utilcode/export/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "feature/utilcode/export/build.gradle",
    "chars": 378,
    "preview": "ext {\n    groupId = Config.modules.feature_utilcode_export.groupId\n    artifactId = Config.modules.feature_utilcode_expo"
  },
  {
    "path": "feature/utilcode/export/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "feature/utilcode/export/src/main/AndroidManifest.xml",
    "chars": 50,
    "preview": "<manifest package=\"com.blankj.utilcode.export\" />\n"
  },
  {
    "path": "feature/utilcode/export/src/main/java/com/blankj/utilcode/export/api/UtilCodeApi.java",
    "chars": 489,
    "preview": "package com.blankj.utilcode.export.api;\n\nimport android.content.Context;\n\nimport com.blankj.utilcode.util.ApiUtils;\n\n\n/*"
  },
  {
    "path": "feature/utilcode/pkg/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "feature/utilcode/pkg/build.gradle",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "feature/utilcode/pkg/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "feature/utilcode/pkg/src/main/AndroidManifest.xml",
    "chars": 13611,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.blankj.utilcode.pkg\">\n\n    <!-- ap"
  },
  {
    "path": "feature/utilcode/pkg/src/main/assets/test/sub/test.txt",
    "chars": 17,
    "preview": "1st line\n2nd line"
  },
  {
    "path": "feature/utilcode/pkg/src/main/assets/test/test.txt",
    "chars": 17,
    "preview": "1st line\n2nd line"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/Config.kt",
    "chars": 515,
    "preview": "package com.blankj.utilcode.pkg\n\nimport com.blankj.utilcode.util.PathUtils\n\n/**\n * ```\n * author: Blankj\n * blog  : http"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/UtilCodeApiImpl.java",
    "chars": 679,
    "preview": "package com.blankj.utilcode.pkg;\n\nimport android.content.Context;\n\nimport com.blankj.utilcode.export.api.UtilCodeApi;\nim"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/CoreUtilActivity.kt",
    "chars": 10000,
    "preview": "package com.blankj.utilcode.pkg.feature\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os."
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt",
    "chars": 10001,
    "preview": "package com.blankj.utilcode.pkg.feature.activity\n\nimport android.content.Context\nimport android.content.Intent\nimport an"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt",
    "chars": 1338,
    "preview": "package com.blankj.utilcode.pkg.feature.activity\n\nimport android.app.Activity\nimport android.content.Intent\nimport andro"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptCloseActivity.kt",
    "chars": 1030,
    "preview": "package com.blankj.utilcode.pkg.feature.adaptScreen\n\nimport android.content.Context\nimport android.content.Intent\nimport"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt",
    "chars": 1234,
    "preview": "package com.blankj.utilcode.pkg.feature.adaptScreen\n\nimport android.content.Context\nimport android.content.Intent\nimport"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptScreenActivity.kt",
    "chars": 1212,
    "preview": "package com.blankj.utilcode.pkg.feature.adaptScreen\n\nimport android.content.Context\nimport android.content.Intent\nimport"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptWidthActivity.kt",
    "chars": 1213,
    "preview": "package com.blankj.utilcode.pkg.feature.adaptScreen\n\nimport android.content.Context\nimport android.content.Intent\nimport"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/ApiActivity.kt",
    "chars": 1441,
    "preview": "package com.blankj.utilcode.pkg.feature.api\n\nimport android.content.Context\nimport android.content.Intent\nimport com.bla"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/export/OtherModuleApi.java",
    "chars": 572,
    "preview": "package com.blankj.utilcode.pkg.feature.api.other.export;\n\nimport com.blankj.utilcode.util.ApiUtils;\n\n/**\n * <pre>\n *   "
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/pkg/OtherPkgApiImpl.java",
    "chars": 672,
    "preview": "package com.blankj.utilcode.pkg.feature.api.other.pkg;\n\nimport com.blankj.utilcode.pkg.feature.api.other.export.OtherMod"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt",
    "chars": 6031,
    "preview": "package com.blankj.utilcode.pkg.feature.app\n\nimport android.app.Activity\nimport android.content.Context\nimport android.c"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarActivity.kt",
    "chars": 2708,
    "preview": "package com.blankj.utilcode.pkg.feature.bar\n\nimport android.content.Context\nimport android.content.Intent\nimport com.bla"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt",
    "chars": 3302,
    "preview": "package com.blankj.utilcode.pkg.feature.bar.nav\n\nimport android.content.Context\nimport android.content.Intent\nimport and"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/notification/BarNotificationActivity.kt",
    "chars": 1369,
    "preview": "package com.blankj.utilcode.pkg.feature.bar.notification\n\nimport android.content.Context\nimport android.content.Intent\ni"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt",
    "chars": 1706,
    "preview": "package com.blankj.utilcode.pkg.feature.bar.status\n\nimport android.content.Context\nimport android.content.Intent\nimport "
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt",
    "chars": 2171,
    "preview": "package com.blankj.utilcode.pkg.feature.bar.status\n\nimport android.content.Context\nimport android.content.Intent\nimport "
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityColor.kt",
    "chars": 1738,
    "preview": "package com.blankj.utilcode.pkg.feature.bar.status\n\nimport android.content.Context\nimport android.content.Intent\nimport "
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityCustom.kt",
    "chars": 945,
    "preview": "package com.blankj.utilcode.pkg.feature.bar.status\n\nimport android.content.Context\nimport android.content.Intent\nimport "
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt",
    "chars": 4092,
    "preview": "package com.blankj.utilcode.pkg.feature.bar.status\n\nimport android.content.Context\nimport android.content.Intent\nimport "
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt",
    "chars": 1932,
    "preview": "package com.blankj.utilcode.pkg.feature.bar.status\n\nimport android.content.Context\nimport android.content.Intent\nimport "
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentActivity.kt",
    "chars": 3545,
    "preview": "package com.blankj.utilcode.pkg.feature.bar.status.fragment\n\nimport android.content.Context\nimport android.content.Inten"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt",
    "chars": 2122,
    "preview": "package com.blankj.utilcode.pkg.feature.bar.status.fragment\n\nimport android.graphics.Color\nimport android.os.Bundle\nimpo"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentColor.kt",
    "chars": 1857,
    "preview": "package com.blankj.utilcode.pkg.feature.bar.status.fragment\n\nimport android.os.Bundle\nimport android.view.View\nimport co"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentCustom.kt",
    "chars": 988,
    "preview": "package com.blankj.utilcode.pkg.feature.bar.status.fragment\n\nimport android.os.Bundle\nimport android.view.View\nimport co"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt",
    "chars": 1989,
    "preview": "package com.blankj.utilcode.pkg.feature.bar.status.fragment\n\nimport android.graphics.Color\nimport android.os.Bundle\nimpo"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/brightness/BrightnessActivity.kt",
    "chars": 2782,
    "preview": "package com.blankj.utilcode.pkg.feature.brightness\n\nimport android.content.Context\nimport android.content.Intent\nimport "
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt",
    "chars": 3638,
    "preview": "package com.blankj.utilcode.pkg.feature.bus\n\nimport android.content.Context\nimport android.content.Intent\nimport android"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt",
    "chars": 9058,
    "preview": "package com.blankj.utilcode.pkg.feature.bus\n\nimport android.content.Context\nimport android.content.Intent\nimport com.bla"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clean/CleanActivity.kt",
    "chars": 2764,
    "preview": "package com.blankj.utilcode.pkg.feature.clean\n\nimport android.content.Context\nimport android.content.Intent\nimport com.b"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt",
    "chars": 4391,
    "preview": "package com.blankj.utilcode.pkg.feature.click\n\nimport android.content.Context\nimport android.content.Intent\nimport andro"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clipboard/ClipboardActivity.kt",
    "chars": 2459,
    "preview": "package com.blankj.utilcode.pkg.feature.clipboard\n\nimport android.content.Context\nimport android.content.Intent\nimport c"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/device/DeviceActivity.kt",
    "chars": 2397,
    "preview": "package com.blankj.utilcode.pkg.feature.device\n\nimport android.content.Context\nimport android.content.Intent\nimport andr"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/file/FileActivity.kt",
    "chars": 2810,
    "preview": "package com.blankj.utilcode.pkg.feature.file\n\nimport android.content.Context\nimport android.content.Intent\nimport com.bl"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/flashlight/FlashlightActivity.kt",
    "chars": 2057,
    "preview": "package com.blankj.utilcode.pkg.feature.flashlight\n\nimport android.content.Context\nimport android.content.Intent\nimport "
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ChildFragment.kt",
    "chars": 3242,
    "preview": "package com.blankj.utilcode.pkg.feature.fragment\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.frag"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt",
    "chars": 6814,
    "preview": "package com.blankj.utilcode.pkg.feature.fragment\n\nimport android.os.Build\nimport android.os.Bundle\nimport android.transi"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt",
    "chars": 2956,
    "preview": "package com.blankj.utilcode.pkg.feature.fragment\n\nimport android.content.Context\nimport android.content.Intent\nimport an"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/RootFragment.kt",
    "chars": 1591,
    "preview": "package com.blankj.utilcode.pkg.feature.fragment\n\nimport android.os.Bundle\nimport android.view.View\nimport com.blankj.co"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt",
    "chars": 8848,
    "preview": "package com.blankj.utilcode.pkg.feature.image\n\nimport android.content.Context\nimport android.content.Intent\nimport andro"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/intent/IntentActivity.kt",
    "chars": 3030,
    "preview": "package com.blankj.utilcode.pkg.feature.intent\n\nimport android.content.Context\nimport android.content.Intent\nimport andr"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt",
    "chars": 2449,
    "preview": "package com.blankj.utilcode.pkg.feature.keyboard\n\nimport android.content.Context\nimport android.content.Intent\nimport an"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt",
    "chars": 3060,
    "preview": "package com.blankj.utilcode.pkg.feature.language\n\nimport android.content.Context\nimport android.content.Intent\nimport co"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/log/LogActivity.kt",
    "chars": 11630,
    "preview": "package com.blankj.utilcode.pkg.feature.log\n\nimport android.content.ComponentName\nimport android.content.Context\nimport "
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/messenger/MessengerActivity.kt",
    "chars": 2102,
    "preview": "package com.blankj.utilcode.pkg.feature.messenger\n\nimport android.content.Context\nimport android.content.Intent\nimport a"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/messenger/MessengerRemoteActivity.kt",
    "chars": 2433,
    "preview": "package com.blankj.utilcode.pkg.feature.messenger\n\nimport android.content.Context\nimport android.content.Intent\nimport a"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/metaData/MetaDataActivity.kt",
    "chars": 1177,
    "preview": "package com.blankj.utilcode.pkg.feature.metaData\n\nimport android.content.Context\nimport android.content.Intent\nimport co"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java",
    "chars": 1026,
    "preview": "package com.blankj.utilcode.pkg.feature.mvp;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport andr"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpModel.java",
    "chars": 1018,
    "preview": "package com.blankj.utilcode.pkg.feature.mvp;\n\nimport com.blankj.base.mvp.BaseModel;\nimport com.blankj.utilcode.util.Thre"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpMvp.java",
    "chars": 513,
    "preview": "package com.blankj.utilcode.pkg.feature.mvp;\n\nimport com.blankj.utilcode.util.Utils;\n\n/**\n * <pre>\n *     author: blankj"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpPresenter.java",
    "chars": 943,
    "preview": "package com.blankj.utilcode.pkg.feature.mvp;\n\nimport com.blankj.base.mvp.BasePresenter;\nimport com.blankj.utilcode.util."
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java",
    "chars": 2365,
    "preview": "package com.blankj.utilcode.pkg.feature.mvp;\n\nimport android.text.Layout;\nimport android.view.View;\nimport android.widge"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt",
    "chars": 6282,
    "preview": "package com.blankj.utilcode.pkg.feature.network\n\nimport android.content.Context\nimport android.content.Intent\nimport and"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/notification/NotificationActivity.kt",
    "chars": 2523,
    "preview": "package com.blankj.utilcode.pkg.feature.notification\n\nimport android.app.PendingIntent\nimport android.content.Context\nim"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/path/PathActivity.kt",
    "chars": 4410,
    "preview": "package com.blankj.utilcode.pkg.feature.path\n\nimport android.content.Context\nimport android.content.Intent\nimport com.bl"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt",
    "chars": 8247,
    "preview": "package com.blankj.utilcode.pkg.feature.permission\n\nimport android.Manifest.permission\nimport android.content.Context\nim"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/phone/PhoneActivity.kt",
    "chars": 2449,
    "preview": "package com.blankj.utilcode.pkg.feature.phone\n\nimport android.content.Context\nimport android.content.Intent\nimport com.b"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/process/ProcessActivity.kt",
    "chars": 2807,
    "preview": "package com.blankj.utilcode.pkg.feature.process\n\nimport android.content.Context\nimport android.content.Intent\nimport com"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/ReflectActivity.kt",
    "chars": 1396,
    "preview": "package com.blankj.utilcode.pkg.feature.reflect\n\nimport android.content.Context\nimport android.content.Intent\nimport com"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java",
    "chars": 297,
    "preview": "package com.blankj.utilcode.pkg.feature.reflect;\n\nimport androidx.annotation.Keep;\n\n/**\n * <pre>\n *     author: blankj\n "
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/resource/ResourceActivity.kt",
    "chars": 1740,
    "preview": "package com.blankj.utilcode.pkg.feature.resource\n\nimport android.content.Context\nimport android.content.Intent\nimport co"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/rom/RomActivity.kt",
    "chars": 1083,
    "preview": "package com.blankj.utilcode.pkg.feature.rom\n\nimport android.content.Context\nimport android.content.Intent\nimport com.bla"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/screen/ScreenActivity.kt",
    "chars": 4044,
    "preview": "package com.blankj.utilcode.pkg.feature.screen\n\nimport android.content.Context\nimport android.content.Intent\nimport andr"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/sdcard/SDCardActivity.kt",
    "chars": 1927,
    "preview": "package com.blankj.utilcode.pkg.feature.sdcard\n\nimport android.content.Context\nimport android.content.Intent\nimport com."
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/shadow/ShadowActivity.kt",
    "chars": 1849,
    "preview": "package com.blankj.utilcode.pkg.feature.shadow\n\nimport android.content.Context\nimport android.content.Intent\nimport andr"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt",
    "chars": 7912,
    "preview": "package com.blankj.utilcode.pkg.feature.snackbar\n\nimport android.content.Context\nimport android.content.Intent\nimport an"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/spStatic/SPStaticActivity.kt",
    "chars": 2736,
    "preview": "package com.blankj.utilcode.pkg.feature.spStatic\n\nimport android.content.Context\nimport android.content.Intent\nimport co"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt",
    "chars": 12183,
    "preview": "package com.blankj.utilcode.pkg.feature.span\n\nimport android.animation.ValueAnimator\nimport android.content.Context\nimpo"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt",
    "chars": 1540,
    "preview": "package com.blankj.utilcode.pkg.feature.toast\n\nimport android.widget.TextView\nimport androidx.annotation.StringRes\nimpor"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt",
    "chars": 4439,
    "preview": "package com.blankj.utilcode.pkg.feature.toast\n\nimport android.content.Context\nimport android.content.Intent\nimport andro"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/uiMessage/UiMessageActivity.kt",
    "chars": 2884,
    "preview": "package com.blankj.utilcode.pkg.feature.uiMessage\n\nimport android.content.Context\nimport android.content.Intent\nimport c"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt",
    "chars": 2058,
    "preview": "package com.blankj.utilcode.pkg.feature.vibrate\n\nimport android.content.Context\nimport android.content.Intent\nimport com"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/volume/VolumeActivity.kt",
    "chars": 2155,
    "preview": "package com.blankj.utilcode.pkg.feature.volume\n\nimport android.content.Context\nimport android.content.Intent\nimport andr"
  },
  {
    "path": "feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt",
    "chars": 6254,
    "preview": "package com.blankj.utilcode.pkg.helper\n\nimport android.content.Context\nimport android.content.DialogInterface\nimport and"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/anim/fade_in_1000.xml",
    "chars": 254,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<alpha xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:dur"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/anim/fade_out_1000.xml",
    "chars": 254,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<alpha xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:dur"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/anim/slide_bottom_in_200.xml",
    "chars": 193,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/anim/slide_bottom_out_200.xml",
    "chars": 193,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/anim/slide_left_out_1000.xml",
    "chars": 332,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <translate\n "
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/anim/slide_right_in_1000.xml",
    "chars": 331,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <translate\n "
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/animator/fragment_slide_left_enter.xml",
    "chars": 711,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <objectAnima"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/animator/fragment_slide_left_exit.xml",
    "chars": 712,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <objectAnima"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/animator/fragment_slide_right_enter.xml",
    "chars": 712,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <objectAnima"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/animator/fragment_slide_right_exit.xml",
    "chars": 711,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <objectAnima"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/drawable/bar_status_custom.xml",
    "chars": 314,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <gradient"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/drawable/bar_status_nav_alpha.xml",
    "chars": 4906,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/drawable/bar_status_nav_color.xml",
    "chars": 5439,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/drawable/bar_status_nav_custom.xml",
    "chars": 887,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/drawable/bar_status_nav_image.xml",
    "chars": 1960,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/drawable/fragment_nav.xml",
    "chars": 1795,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/drawable/keyboard_dialog_bg.xml",
    "chars": 362,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid and"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/drawable/shadow_circle.xml",
    "chars": 181,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:sha"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/drawable/shadow_round_rect.xml",
    "chars": 206,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <solid an"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/drawable/snackbar_custom_bg.xml",
    "chars": 280,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <solid an"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/drawable/span_block_high.xml",
    "chars": 358,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <solid an"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/drawable/span_block_low.xml",
    "chars": 357,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <solid an"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/drawable/toast_round_rect.xml",
    "chars": 397,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <solid an"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml",
    "chars": 1363,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/layout/activity_item_shared_element_activity.xml",
    "chars": 666,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/layout/activity_sub_activity.xml",
    "chars": 574,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/layout/adaptscreen_close_activity.xml",
    "chars": 1934,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/layout/adaptscreen_height_activity.xml",
    "chars": 3845,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<HorizontalScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n"
  },
  {
    "path": "feature/utilcode/pkg/src/main/res/layout/adaptscreen_width_activity.xml",
    "chars": 5967,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:"
  }
]

// ... and 461 more files (download for full content)

About this extraction

This page contains the full source code of the Blankj/AndroidUtilCode GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 661 files (3.0 MB), approximately 817.9k tokens, and a symbol index with 5093 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!