├── .gitignore
├── .travis.yml
├── LICENSE
├── README-CN.md
├── README.md
├── _config.yml
├── app
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── assets
│ ├── fonts
│ │ └── dnmbhs.ttf
│ └── test_install.apk
│ ├── java
│ └── com
│ │ └── blankj
│ │ └── androidutilcode
│ │ ├── Config.java
│ │ ├── UtilsApp.java
│ │ ├── activity
│ │ ├── ActivityActivity.java
│ │ ├── AppActivity.java
│ │ ├── CleanActivity.java
│ │ ├── DeviceActivity.java
│ │ ├── FragmentActivity.java
│ │ ├── HandlerActivity.java
│ │ ├── ImageActivity.java
│ │ ├── KeyboardActivity.java
│ │ ├── LocationActivity.java
│ │ ├── LogActivity.java
│ │ ├── MainActivity.java
│ │ ├── NetworkActivity.java
│ │ ├── PhoneActivity.java
│ │ ├── PinyinActivity.java
│ │ ├── ProcessActivity.java
│ │ ├── SDCardActivity.java
│ │ ├── SnackbarActivity.java
│ │ ├── SpannableActivity.java
│ │ └── ToastActivity.java
│ │ ├── base
│ │ ├── BaseActivity.java
│ │ ├── BaseApplication.java
│ │ └── BaseFragment.java
│ │ ├── fragment
│ │ ├── Demo0Fragment.java
│ │ ├── Demo1Fragment.java
│ │ ├── Demo2Fragment.java
│ │ └── Demo3Fragment.java
│ │ ├── service
│ │ └── LocationService.java
│ │ └── transition
│ │ └── DetailTransition.java
│ └── res
│ ├── animator
│ ├── fragment_slide_left_enter.xml
│ ├── fragment_slide_left_exit.xml
│ ├── fragment_slide_right_enter.xml
│ └── fragment_slide_right_exit.xml
│ ├── drawable
│ ├── lena.png
│ ├── shape_spannable_block_high.xml
│ ├── shape_spannable_block_low.xml
│ └── shape_toast_bg.xml
│ ├── layout
│ ├── activity_activity.xml
│ ├── activity_app.xml
│ ├── activity_clean.xml
│ ├── activity_device.xml
│ ├── activity_flashlight.xml
│ ├── activity_fragment.xml
│ ├── activity_handler.xml
│ ├── activity_image.xml
│ ├── activity_keyboard.xml
│ ├── activity_location.xml
│ ├── activity_log.xml
│ ├── activity_main.xml
│ ├── activity_network.xml
│ ├── activity_permission.xml
│ ├── activity_phone.xml
│ ├── activity_pinyin.xml
│ ├── activity_process.xml
│ ├── activity_sdcard.xml
│ ├── activity_snackbar.xml
│ ├── activity_spannable.xml
│ ├── activity_toast.xml
│ ├── fragment_demo0.xml
│ ├── fragment_demo1.xml
│ ├── fragment_demo2.xml
│ ├── fragment_demo3.xml
│ ├── snackbar_add.xml
│ └── toast_custom.xml
│ ├── menu
│ └── about.xml
│ ├── mipmap-hdpi
│ └── ic_launcher.png
│ ├── mipmap-xhdpi
│ └── ic_launcher.png
│ ├── values
│ ├── colors.xml
│ ├── dimens.xml
│ ├── strings.xml
│ └── styles.xml
│ └── xml
│ └── provider_paths.xml
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
├── update_log.md
└── utilcode
├── .gitignore
├── build.gradle
├── proguard-rules.pro
├── project.properties
└── src
├── main
├── AndroidManifest.xml
└── java
│ └── com
│ └── blankj
│ └── utilcode
│ ├── constant
│ ├── MemoryConstants.java
│ ├── RegexConstants.java
│ └── TimeConstants.java
│ └── util
│ ├── ActivityUtils.java
│ ├── AppUtils.java
│ ├── BarUtils.java
│ ├── CacheUtils.java
│ ├── CameraUtils.java
│ ├── CleanUtils.java
│ ├── ClipboardUtils.java
│ ├── CloseUtils.java
│ ├── ConvertUtils.java
│ ├── CrashUtils.java
│ ├── DeviceUtils.java
│ ├── EmptyUtils.java
│ ├── EncodeUtils.java
│ ├── EncryptUtils.java
│ ├── FileIOUtils.java
│ ├── FileUtils.java
│ ├── FragmentUtils.java
│ ├── HandlerUtils.java
│ ├── ImageUtils.java
│ ├── IntentUtils.java
│ ├── KeyboardUtils.java
│ ├── LocationUtils.java
│ ├── LogUtils.java
│ ├── LunarUtils.java
│ ├── NetworkUtils.java
│ ├── PermissionUtils.java
│ ├── PhoneUtils.java
│ ├── PinyinUtils.java
│ ├── ProcessUtils.java
│ ├── RegexUtils.java
│ ├── SDCardUtils.java
│ ├── SPUtils.java
│ ├── ScreenUtils.java
│ ├── ServiceUtils.java
│ ├── ShellUtils.java
│ ├── SizeUtils.java
│ ├── SnackbarUtils.java
│ ├── SpannableStringUtils.java
│ ├── StringUtils.java
│ ├── ThreadPoolUtils.java
│ ├── TimeUtils.java
│ ├── ToastUtils.java
│ ├── Utils.java
│ ├── VibrationUtils.java
│ └── ZipUtils.java
└── test
├── java
└── com
│ └── blankj
│ └── utilcode
│ └── util
│ ├── ClipboardUtilsTest.java
│ ├── ConvertUtilsTest.java
│ ├── DogeTest.java
│ ├── EmptyUtilsTest.java
│ ├── EncodeUtilsTest.java
│ ├── EncryptUtilsTest.java
│ ├── FileIOUtilsTest.java
│ ├── FileUtilsTest.java
│ ├── PinyinUtilsTest.java
│ ├── RegexUtilsTest.java
│ ├── SDCardUtilsTest.java
│ ├── SPUtilsTest.java
│ ├── StringUtilsTest.java
│ ├── TestUtils.java
│ ├── TimeUtilsTest.java
│ └── ZipUtilsTest.java
└── res
├── encrypt
└── MD5.txt
├── file
├── GBK.txt
├── UTF16BE.txt
├── UTF8.txt
└── Unicode.txt
└── zip
└── testZip
├── test.txt
├── testDir
└── test.txt
├── 测试.txt
└── 测试文件夹
└── 测试.txt
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | .idea
5 | .DS_Store
6 | /build
7 | /captures
8 | .externalNativeBuild
9 | /sign
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: android
2 | jdk: oraclejdk8
3 | sudo: false
4 |
5 | env:
6 | global:
7 | - COMPILE_SDK_VERSION = 25
8 | - BUILD_TOOLS_VERSION = 25.0.2
9 |
10 | android:
11 | components:
12 | - platform-tools
13 | - tools
14 | - build-tools-$BUILD_TOOLS_VERSION
15 | - android-$COMPILE_SDK_VERSION
16 |
17 | licenses:
18 | - android-sdk-license-.+
19 | - '.+'
20 |
21 | notifications:
22 | email: false
23 |
24 | before_install:
25 | - chmod +x gradlew
26 | - mkdir "$ANDROID_HOME/licenses" || true
27 | - echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license"
28 | - echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_HOME/licenses/android-sdk-preview-license"
29 |
30 | before_cache:
31 | - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
32 | - rm -fr $HOME/.gradle/caches/*/plugin-resolution/
33 | cache:
34 | directories:
35 | - $HOME/.gradle/caches/
36 | - $HOME/.gradle/wrapper/
37 | - $HOME/.android/build-cache
38 |
39 | script:
40 | - ./gradlew build connectedCheck
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-cayman
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | File signPropertiesFile = rootProject.file('sign/keystore.properties')
4 |
5 | android {
6 | compileSdkVersion 25
7 | buildToolsVersion "25.0.2"
8 |
9 | defaultConfig {
10 | applicationId "com.blankj.androidutilcode"
11 | minSdkVersion 15
12 | targetSdkVersion 16
13 | versionCode 31
14 | versionName "1.5.1"
15 | }
16 |
17 | if (signPropertiesFile.exists()) {
18 | Properties properties = new Properties()
19 | properties.load(new FileInputStream(signPropertiesFile))
20 | signingConfigs {
21 | release {
22 | storeFile rootProject.file(properties['keystore'])
23 | storePassword properties['storePassword']
24 | keyAlias properties['keyAlias']
25 | keyPassword properties['keyPassword']
26 | }
27 | }
28 | }
29 |
30 | buildTypes {
31 | debug {
32 | minifyEnabled false
33 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
34 | }
35 | release {
36 | minifyEnabled true
37 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
38 | if (signPropertiesFile.exists()) {
39 | signingConfig signingConfigs.release
40 | }
41 | }
42 | }
43 |
44 | lintOptions {
45 | abortOnError false
46 | }
47 | }
48 |
49 | dependencies {
50 | compile fileTree(include: ['*.jar'], dir: 'libs')
51 | final SUPPORT_VERSION = '25.3.1'
52 | final LEAKCANARY_VERSION = '1.5';
53 |
54 | def leakCanary = "com.squareup.leakcanary:leakcanary-android-no-op:$LEAKCANARY_VERSION"
55 |
56 | compile project(':utilcode')
57 | compile "com.android.support:appcompat-v7:$SUPPORT_VERSION"
58 | compile "com.android.support:support-v4:$SUPPORT_VERSION"
59 | compile "com.android.support:design:$SUPPORT_VERSION"
60 |
61 | // LeakCanary
62 | debugCompile "com.squareup.leakcanary:leakcanary-android:$LEAKCANARY_VERSION"
63 | releaseCompile leakCanary
64 | testCompile leakCanary
65 | }
66 |
67 |
68 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in G:\Android_IDE\ADT\sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
19 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 | * author: Blankj 10 | * blog : http://blankj.com 11 | * time : 2017/05/10 12 | * desc : 13 | *14 | */ 15 | public class Config { 16 | public static final String PKG = "com.blankj.androidutilcode"; 17 | public static final String TEST_PKG = "com.blankj.testinstall"; 18 | private static String testApkPath; 19 | 20 | public static String getTestApkPath() { 21 | if (testApkPath == null) 22 | testApkPath = Utils.getContext().getCacheDir().getAbsolutePath() + File.separatorChar + "apk" + File.separatorChar + "test_install.apk"; 23 | return testApkPath; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/UtilsApp.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode; 2 | 3 | import com.blankj.androidutilcode.base.BaseApplication; 4 | import com.blankj.utilcode.util.CrashUtils; 5 | import com.blankj.utilcode.util.FileIOUtils; 6 | import com.blankj.utilcode.util.FileUtils; 7 | import com.blankj.utilcode.util.LogUtils; 8 | import com.blankj.utilcode.util.Utils; 9 | import com.squareup.leakcanary.LeakCanary; 10 | 11 | import java.io.IOException; 12 | 13 | /** 14 | *
15 | * author: Blankj 16 | * blog : http://blankj.com 17 | * time : 2016/10/12 18 | * desc : 工具类测试App 19 | *20 | */ 21 | public class UtilsApp extends BaseApplication { 22 | 23 | @Override 24 | public void onCreate() { 25 | super.onCreate(); 26 | // 内存泄露检查工具 27 | if (LeakCanary.isInAnalyzerProcess(this)) { 28 | // This process is dedicated to LeakCanary for heap analysis. 29 | // You should not init your app in this process. 30 | return; 31 | } 32 | LeakCanary.install(this); 33 | Utils.init(this); 34 | initLog(); 35 | initCrash(); 36 | initAssets(); 37 | } 38 | 39 | public static void initLog() { 40 | LogUtils.Builder builder = new LogUtils.Builder() 41 | .setLogSwitch(BuildConfig.DEBUG)// 设置log总开关,包括输出到控制台和文件,默认开 42 | .setConsoleSwitch(BuildConfig.DEBUG)// 设置是否输出到控制台开关,默认开 43 | .setGlobalTag(null)// 设置log全局标签,默认为空 44 | // 当全局标签不为空时,我们输出的log全部为该tag, 45 | // 为空时,如果传入的tag为空那就显示类名,否则显示tag 46 | .setLogHeadSwitch(true)// 设置log头信息开关,默认为开 47 | .setLog2FileSwitch(false)// 打印log时是否存到文件的开关,默认关 48 | .setDir("")// 当自定义路径为空时,写入应用的/cache/log/目录中 49 | .setBorderSwitch(true)// 输出日志是否带边框开关,默认开 50 | .setConsoleFilter(LogUtils.V)// log的控制台过滤器,和logcat过滤器同理,默认Verbose 51 | .setFileFilter(LogUtils.V);// log文件过滤器,和logcat过滤器同理,默认Verbose 52 | LogUtils.d(builder.toString()); 53 | } 54 | 55 | private void initCrash() { 56 | CrashUtils.getInstance().init(); 57 | } 58 | 59 | private void initAssets() { 60 | if (!FileUtils.isFileExists(Config.getTestApkPath())) { 61 | try { 62 | FileIOUtils.writeFileFromIS(Config.getTestApkPath(), getAssets().open("test_install.apk"), false); 63 | } catch (IOException e) { 64 | e.printStackTrace(); 65 | } 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/ActivityActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.blankj.androidutilcode.Config; 9 | import com.blankj.androidutilcode.R; 10 | import com.blankj.androidutilcode.base.BaseActivity; 11 | import com.blankj.utilcode.util.ActivityUtils; 12 | 13 | /** 14 | *
15 | * author: Blankj 16 | * blog : http://blankj.com 17 | * time : 2016/10/13 18 | * desc : Activity工具类Demo 19 | *20 | */ 21 | public class ActivityActivity extends BaseActivity { 22 | 23 | private String imageActivityClassName; 24 | 25 | @Override 26 | public void initData(Bundle bundle) { 27 | imageActivityClassName = Config.PKG + ".activity.ImageActivity"; 28 | } 29 | 30 | @Override 31 | public int bindLayout() { 32 | return R.layout.activity_activity; 33 | } 34 | 35 | @Override 36 | public void initView(Bundle savedInstanceState, View view) { 37 | findViewById(R.id.btn_launch_image_activity).setOnClickListener(this); 38 | TextView tvAboutActivity = (TextView) findViewById(R.id.tv_about_activity); 39 | tvAboutActivity.setText("Is ImageActivity Exists: " + ActivityUtils.isActivityExists(Config.PKG, imageActivityClassName) 40 | + "\ngetLauncherActivity: " + ActivityUtils.getLauncherActivity(Config.PKG) 41 | + "\ngetTopActivity: " + ActivityUtils.getTopActivity() 42 | ); 43 | } 44 | 45 | @Override 46 | public void doBusiness(Context context) { 47 | 48 | } 49 | 50 | @Override 51 | public void onWidgetClick(View view) { 52 | switch (view.getId()) { 53 | case R.id.btn_launch_image_activity: 54 | ActivityUtils.startActivity(Config.PKG, imageActivityClassName); 55 | break; 56 | default: 57 | break; 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/AppActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.blankj.androidutilcode.Config; 9 | import com.blankj.androidutilcode.R; 10 | import com.blankj.androidutilcode.base.BaseActivity; 11 | import com.blankj.utilcode.util.AppUtils; 12 | import com.blankj.utilcode.util.SpannableStringUtils; 13 | import com.blankj.utilcode.util.ToastUtils; 14 | 15 | /** 16 | *
17 | * author: Blankj 18 | * blog : http://blankj.com 19 | * time : 2016/10/13 20 | * desc : App工具类Demo 21 | *22 | */ 23 | 24 | public class AppActivity extends BaseActivity { 25 | 26 | @Override 27 | public void initData(Bundle bundle) { 28 | 29 | } 30 | 31 | @Override 32 | public int bindLayout() { 33 | return R.layout.activity_app; 34 | } 35 | 36 | @Override 37 | public void initView(Bundle savedInstanceState, View view) { 38 | findViewById(R.id.btn_install_app).setOnClickListener(this); 39 | findViewById(R.id.btn_install_app_silent).setOnClickListener(this); 40 | findViewById(R.id.btn_uninstall_app).setOnClickListener(this); 41 | findViewById(R.id.btn_uninstall_app_silent).setOnClickListener(this); 42 | findViewById(R.id.btn_launch_app).setOnClickListener(this); 43 | findViewById(R.id.btn_get_app_details_settings).setOnClickListener(this); 44 | TextView tvAboutApp = (TextView) findViewById(R.id.tv_about_app); 45 | tvAboutApp.setText(new SpannableStringUtils.Builder().append("app icon: ") 46 | .appendLine("").setDrawable(AppUtils.getAppIcon(), SpannableStringUtils.ALIGN_CENTER) 47 | .append(AppUtils.getAppInfo().toString()) 48 | .appendLine("isAppRoot: " + AppUtils.isAppRoot()) 49 | .appendLine("isAppDebug: " + AppUtils.isAppDebug()) 50 | .appendLine("AppSignatureSHA1: " + AppUtils.getAppSignatureSHA1()) 51 | .appendLine("isAppForeground: " + AppUtils.isAppForeground()) 52 | .create()); 53 | } 54 | 55 | @Override 56 | public void doBusiness(Context context) { 57 | 58 | } 59 | 60 | @Override 61 | public void onWidgetClick(View view) { 62 | switch (view.getId()) { 63 | case R.id.btn_install_app: 64 | if (AppUtils.isInstallApp(Config.TEST_PKG)) { 65 | ToastUtils.showShort(R.string.app_install_tips); 66 | } else { 67 | AppUtils.installApp(Config.getTestApkPath(), "com.blankj.androidutilcode.provider"); 68 | } 69 | break; 70 | case R.id.btn_install_app_silent: 71 | new Thread(new Runnable() { 72 | @Override 73 | public void run() { 74 | if (AppUtils.isInstallApp(Config.TEST_PKG)) { 75 | ToastUtils.showShortSafe(R.string.app_install_tips); 76 | } else { 77 | if (AppUtils.installAppSilent(Config.getTestApkPath())) { 78 | ToastUtils.showShortSafe(R.string.install_successfully); 79 | } else { 80 | ToastUtils.showShortSafe(R.string.install_unsuccessfully); 81 | } 82 | } 83 | } 84 | }).start(); 85 | break; 86 | case R.id.btn_uninstall_app: 87 | if (AppUtils.isInstallApp(Config.TEST_PKG)) { 88 | AppUtils.uninstallApp(Config.TEST_PKG); 89 | } else { 90 | ToastUtils.showShort(R.string.app_uninstall_tips); 91 | } 92 | break; 93 | case R.id.btn_uninstall_app_silent: 94 | if (AppUtils.isInstallApp(Config.TEST_PKG)) { 95 | if (AppUtils.uninstallAppSilent(Config.TEST_PKG, false)) { 96 | ToastUtils.showShort(R.string.uninstall_successfully); 97 | } else { 98 | ToastUtils.showShort(R.string.uninstall_unsuccessfully); 99 | } 100 | } else { 101 | ToastUtils.showShort(R.string.app_uninstall_tips); 102 | } 103 | break; 104 | case R.id.btn_launch_app: 105 | AppUtils.launchApp(this.getPackageName()); 106 | break; 107 | case R.id.btn_get_app_details_settings: 108 | AppUtils.getAppDetailsSettings(); 109 | break; 110 | } 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/CleanActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.Button; 7 | 8 | import com.blankj.androidutilcode.R; 9 | import com.blankj.androidutilcode.base.BaseActivity; 10 | import com.blankj.utilcode.util.CleanUtils; 11 | import com.blankj.utilcode.util.ToastUtils; 12 | 13 | import java.io.File; 14 | 15 | /** 16 | *
17 | * author: Blankj 18 | * blog : http://blankj.com 19 | * time : 2016/09/29 20 | * desc : Clean工具类Demo 21 | *22 | */ 23 | public class CleanActivity extends BaseActivity { 24 | 25 | @Override 26 | public void initData(Bundle bundle) { 27 | 28 | } 29 | 30 | @Override 31 | public int bindLayout() { 32 | return R.layout.activity_clean; 33 | } 34 | 35 | @Override 36 | public void initView(Bundle savedInstanceState, View view) { 37 | Button btnCleanInternalCache = (Button) findViewById(R.id.btn_clean_internal_cache); 38 | Button btnCleanInternalFiles = (Button) findViewById(R.id.btn_clean_internal_files); 39 | Button btnCleanInternalDbs = (Button) findViewById(R.id.btn_clean_internal_databases); 40 | Button btnCleanInternalSP = (Button) findViewById(R.id.btn_clean_internal_sp); 41 | Button btnCleanExternalCache = (Button) findViewById(R.id.btn_clean_external_cache); 42 | btnCleanInternalCache.setOnClickListener(this); 43 | btnCleanInternalFiles.setOnClickListener(this); 44 | btnCleanInternalDbs.setOnClickListener(this); 45 | btnCleanInternalSP.setOnClickListener(this); 46 | btnCleanExternalCache.setOnClickListener(this); 47 | 48 | btnCleanInternalCache.setText(getCacheDir().getPath()); 49 | btnCleanInternalFiles.setText(getFilesDir().getPath()); 50 | btnCleanInternalDbs.setText(getFilesDir().getParent() + File.separator + "databases"); 51 | btnCleanInternalSP.setText(getFilesDir().getParent() + File.separator + "shared_prefs"); 52 | 53 | if (getExternalCacheDir() != null) { 54 | btnCleanExternalCache.setText(getExternalCacheDir().getAbsolutePath()); 55 | } 56 | } 57 | 58 | @Override 59 | public void doBusiness(Context context) { 60 | 61 | } 62 | 63 | @Override 64 | public void onWidgetClick(View view) { 65 | switch (view.getId()) { 66 | case R.id.btn_clean_internal_cache: 67 | ToastUtils.showShort("cleanInternalCache" + CleanUtils.cleanInternalCache()); 68 | break; 69 | case R.id.btn_clean_internal_files: 70 | ToastUtils.showShort("cleanInternalFiles" + CleanUtils.cleanInternalFiles()); 71 | break; 72 | case R.id.btn_clean_internal_databases: 73 | ToastUtils.showShort("cleanInternalDbs" + CleanUtils.cleanInternalDbs()); 74 | break; 75 | case R.id.btn_clean_internal_sp: 76 | ToastUtils.showShort("cleanInternalSP" + CleanUtils.cleanInternalSP()); 77 | break; 78 | case R.id.btn_clean_external_cache: 79 | ToastUtils.showShort("cleanExternalCache" + CleanUtils.cleanExternalCache()); 80 | break; 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/DeviceActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.blankj.androidutilcode.R; 9 | import com.blankj.androidutilcode.base.BaseActivity; 10 | import com.blankj.utilcode.util.DeviceUtils; 11 | 12 | /** 13 | *
14 | * author: Blankj 15 | * blog : http://blankj.com 16 | * time : 2016/09/27 17 | * desc : Device工具类Demo 18 | *19 | */ 20 | public class DeviceActivity extends BaseActivity { 21 | 22 | @Override 23 | public void initData(Bundle bundle) { 24 | 25 | } 26 | 27 | @Override 28 | public int bindLayout() { 29 | return R.layout.activity_device; 30 | } 31 | 32 | @Override 33 | public void initView(Bundle savedInstanceState, View view) { 34 | findViewById(R.id.btn_shutdown).setOnClickListener(this); 35 | findViewById(R.id.btn_reboot).setOnClickListener(this); 36 | findViewById(R.id.btn_reboot_to_recovery).setOnClickListener(this); 37 | findViewById(R.id.btn_reboot_to_bootloader).setOnClickListener(this); 38 | TextView tvAboutDevice = (TextView) findViewById(R.id.tv_about_device); 39 | tvAboutDevice.setText("isRoot: " + DeviceUtils.isDeviceRooted() 40 | + "\ngetSDKVersion: " + DeviceUtils.getSDKVersion() 41 | + "\ngetAndroidID: " + DeviceUtils.getAndroidID() 42 | + "\ngetMacAddress: " + DeviceUtils.getMacAddress() 43 | + "\ngetManufacturer: " + DeviceUtils.getManufacturer() 44 | + "\ngetModel: " + DeviceUtils.getModel() 45 | ); 46 | } 47 | 48 | @Override 49 | public void doBusiness(Context context) { 50 | 51 | } 52 | 53 | @Override 54 | public void onWidgetClick(View view) { 55 | switch (view.getId()) { 56 | case R.id.btn_shutdown: 57 | DeviceUtils.shutdown(); 58 | break; 59 | case R.id.btn_reboot: 60 | DeviceUtils.reboot(); 61 | break; 62 | case R.id.btn_reboot_to_recovery: 63 | DeviceUtils.reboot2Recovery(); 64 | break; 65 | case R.id.btn_reboot_to_bootloader: 66 | DeviceUtils.reboot2Bootloader(); 67 | break; 68 | } 69 | } 70 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/FragmentActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.support.v4.app.Fragment; 6 | import android.view.View; 7 | 8 | import com.blankj.androidutilcode.R; 9 | import com.blankj.androidutilcode.base.BaseActivity; 10 | import com.blankj.androidutilcode.fragment.Demo0Fragment; 11 | import com.blankj.utilcode.util.FragmentUtils; 12 | 13 | import java.util.ArrayList; 14 | 15 | /** 16 | *
17 | * author: Blankj 18 | * blog : http://blankj.com 19 | * time : 17/02/01 20 | * desc : Fragment工具类Demo 21 | *22 | */ 23 | public class FragmentActivity extends BaseActivity { 24 | 25 | public Fragment rootFragment; 26 | 27 | @Override 28 | public void initData(Bundle bundle) { 29 | 30 | } 31 | 32 | @Override 33 | public int bindLayout() { 34 | return R.layout.activity_fragment; 35 | } 36 | 37 | @Override 38 | public void initView(Bundle savedInstanceState, View view) { 39 | 40 | } 41 | 42 | @Override 43 | public void doBusiness(Context context) { 44 | ArrayList
16 | * author: Blankj 17 | * blog : http://blankj.com 18 | * time : 2016/09/27 19 | * desc : Handler工具类Demo 20 | *21 | */ 22 | public class HandlerActivity extends BaseActivity 23 | implements Callback { 24 | 25 | private TextView tvAboutHandler; 26 | private HandlerUtils.HandlerHolder handlerHolder; 27 | 28 | @Override 29 | public void initData(Bundle bundle) { 30 | 31 | } 32 | 33 | @Override 34 | public int bindLayout() { 35 | return R.layout.activity_handler; 36 | } 37 | 38 | @Override 39 | public void initView(Bundle savedInstanceState, View view) { 40 | tvAboutHandler = (TextView) findViewById(R.id.tv_about_handler); 41 | findViewById(R.id.btn_send_msg_after_3s).setOnClickListener(this); 42 | } 43 | 44 | @Override 45 | public void doBusiness(Context context) { 46 | handlerHolder = new HandlerUtils.HandlerHolder(this); 47 | } 48 | 49 | @Override 50 | public void onWidgetClick(View view) { 51 | switch (view.getId()) { 52 | case R.id.btn_send_msg_after_3s: 53 | handlerHolder.sendEmptyMessageDelayed(0, 3000); 54 | break; 55 | } 56 | } 57 | 58 | @Override 59 | public boolean handleMessage(Message msg) { 60 | tvAboutHandler.setText(R.string.handler_received_msg); 61 | return false; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/ImageActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.graphics.Bitmap; 5 | import android.graphics.Color; 6 | import android.os.Bundle; 7 | import android.view.View; 8 | import android.widget.ImageView; 9 | 10 | import com.blankj.androidutilcode.R; 11 | import com.blankj.androidutilcode.base.BaseActivity; 12 | import com.blankj.utilcode.util.ImageUtils; 13 | import com.blankj.utilcode.util.SizeUtils; 14 | 15 | /** 16 | *
17 | * author: Blankj 18 | * blog : http://blankj.com 19 | * time : 2016/09/26 20 | * desc : Image工具类Demo 21 | *22 | */ 23 | public class ImageActivity extends BaseActivity { 24 | 25 | private ImageView ivSrc; 26 | private ImageView ivView2Bitmap; 27 | 28 | @Override 29 | public void initData(Bundle bundle) { 30 | 31 | } 32 | 33 | @Override 34 | public int bindLayout() { 35 | return R.layout.activity_image; 36 | } 37 | 38 | @Override 39 | public void initView(Bundle savedInstanceState, View view) { 40 | ivSrc = (ImageView) findViewById(R.id.iv_src); 41 | ivView2Bitmap = (ImageView) findViewById(R.id.iv_view2Bitmap); 42 | ImageView ivRound = (ImageView) findViewById(R.id.iv_round); 43 | ImageView ivRoundCorner = (ImageView) findViewById(R.id.iv_round_corner); 44 | ImageView ivFastBlur = (ImageView) findViewById(R.id.iv_fast_blur); 45 | ImageView ivRenderScriptBlur = (ImageView) findViewById(R.id.iv_render_script_blur); 46 | ImageView ivStackBlur = (ImageView) findViewById(R.id.iv_stack_blur); 47 | ImageView ivAddFrame = (ImageView) findViewById(R.id.iv_add_frame); 48 | ImageView ivAddReflection = (ImageView) findViewById(R.id.iv_add_reflection); 49 | ImageView ivAddTextWatermark = (ImageView) findViewById(R.id.iv_add_text_watermark); 50 | ImageView ivAddImageWatermark = (ImageView) findViewById(R.id.iv_add_image_watermark); 51 | ImageView ivGray = (ImageView) findViewById(R.id.iv_gray); 52 | 53 | Bitmap src = ImageUtils.getBitmap(getResources(), R.drawable.lena); 54 | Bitmap watermark = ImageUtils.getBitmap(getResources(), R.mipmap.ic_launcher); 55 | 56 | SizeUtils.forceGetViewSize(ivSrc, new SizeUtils.onGetSizeListener() { 57 | @Override 58 | public void onGetSize(View view) { 59 | ivView2Bitmap.setImageBitmap(ImageUtils.view2Bitmap(ivSrc)); 60 | } 61 | }); 62 | ivRound.setImageBitmap(ImageUtils.toRound(src)); 63 | ivRoundCorner.setImageBitmap(ImageUtils.toRoundCorner(src, 60)); 64 | ivFastBlur.setImageBitmap(ImageUtils.fastBlur(src, 0.1f, 5)); 65 | ivRenderScriptBlur.setImageBitmap(ImageUtils.renderScriptBlur(src, 10)); 66 | src = ImageUtils.getBitmap(getResources(), R.drawable.lena); 67 | ivStackBlur.setImageBitmap(ImageUtils.stackBlur(src, 10, false)); 68 | ivAddFrame.setImageBitmap(ImageUtils.addFrame(src, 16, Color.GREEN)); 69 | ivAddReflection.setImageBitmap(ImageUtils.addReflection(src, 80)); 70 | ivAddTextWatermark.setImageBitmap(ImageUtils.addTextWatermark(src, "blankj", 40, 0x8800ff00, 0, 0)); 71 | ivAddImageWatermark.setImageBitmap(ImageUtils.addImageWatermark(src, watermark, 0, 0, 0x88)); 72 | ivGray.setImageBitmap(ImageUtils.toGray(src)); 73 | } 74 | 75 | @Override 76 | public void doBusiness(Context context) { 77 | 78 | } 79 | 80 | @Override 81 | public void onWidgetClick(View view) { 82 | 83 | } 84 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/KeyboardActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.graphics.Rect; 5 | import android.os.Bundle; 6 | import android.util.DisplayMetrics; 7 | import android.view.MotionEvent; 8 | import android.view.View; 9 | import android.view.inputmethod.InputMethodManager; 10 | import android.widget.EditText; 11 | import android.widget.TextView; 12 | 13 | import com.blankj.androidutilcode.R; 14 | import com.blankj.androidutilcode.base.BaseActivity; 15 | import com.blankj.utilcode.util.KeyboardUtils; 16 | import com.blankj.utilcode.util.LogUtils; 17 | 18 | /** 19 | *
20 | * author: Blankj 21 | * blog : http://blankj.com 22 | * time : 2016/09/27 23 | * desc : Keyboard工具类Demo 24 | *25 | */ 26 | public class KeyboardActivity extends BaseActivity { 27 | 28 | TextView tvAboutKeyboard; 29 | 30 | @Override 31 | public void initData(Bundle bundle) { 32 | 33 | } 34 | 35 | @Override 36 | public int bindLayout() { 37 | return R.layout.activity_keyboard; 38 | } 39 | 40 | @Override 41 | public void initView(Bundle savedInstanceState, View view) { 42 | findViewById(R.id.btn_hide_soft_input).setOnClickListener(this); 43 | findViewById(R.id.btn_show_soft_input).setOnClickListener(this); 44 | findViewById(R.id.btn_toggle_soft_input).setOnClickListener(this); 45 | tvAboutKeyboard = (TextView) findViewById(R.id.tv_about_keyboard); 46 | } 47 | 48 | @Override 49 | public void doBusiness(Context context) { 50 | 51 | } 52 | 53 | @Override 54 | public void onWidgetClick(View view) { 55 | switch (view.getId()) { 56 | case R.id.btn_hide_soft_input: 57 | KeyboardUtils.hideSoftInput(this); 58 | break; 59 | case R.id.btn_show_soft_input: 60 | KeyboardUtils.showSoftInput((EditText) findViewById(R.id.et)); 61 | break; 62 | case R.id.btn_toggle_soft_input: 63 | KeyboardUtils.toggleSoftInput(); 64 | break; 65 | } 66 | } 67 | 68 | @Override 69 | public boolean dispatchTouchEvent(MotionEvent ev) { 70 | if (ev.getAction() == MotionEvent.ACTION_DOWN) { 71 | View v = getCurrentFocus(); 72 | if (isShouldHideKeyboard(v, ev)) { 73 | InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 74 | imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 75 | } 76 | } 77 | return super.dispatchTouchEvent(ev); 78 | } 79 | 80 | // 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘 81 | private boolean isShouldHideKeyboard(View v, MotionEvent event) { 82 | if (v != null && (v instanceof EditText)) { 83 | int[] l = {0, 0}; 84 | v.getLocationInWindow(l); 85 | int left = l[0], 86 | top = l[1], 87 | bottom = top + v.getHeight(), 88 | right = left + v.getWidth(); 89 | return !(event.getX() > left && event.getX() < right 90 | && event.getY() > top && event.getY() < bottom); 91 | } 92 | return false; 93 | } 94 | 95 | private boolean isKeyboardShown(View rootView) { 96 | final int softKeyboardHeight = 100; 97 | Rect frame = new Rect(); 98 | rootView.getWindowVisibleDisplayFrame(frame); 99 | DisplayMetrics dm = rootView.getResources().getDisplayMetrics(); 100 | int heightDiff = rootView.getBottom() - frame.bottom; 101 | LogUtils.d("" + rootView.getBottom() + ", " + frame.bottom + ", " + heightDiff); 102 | return heightDiff > softKeyboardHeight * dm.density; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/LocationActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.ComponentName; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.content.ServiceConnection; 7 | import android.os.Bundle; 8 | import android.os.IBinder; 9 | import android.view.View; 10 | import android.widget.TextView; 11 | 12 | import com.blankj.androidutilcode.R; 13 | import com.blankj.androidutilcode.base.BaseActivity; 14 | import com.blankj.androidutilcode.service.LocationService; 15 | 16 | /** 17 | *
18 | * author: Blankj 19 | * blog : http://blankj.com 20 | * time : 2016/10/13 21 | * desc : Location工具类Demo 22 | *23 | */ 24 | public class LocationActivity extends BaseActivity { 25 | 26 | TextView tvAboutLocation; 27 | LocationService mLocationService; 28 | 29 | @Override 30 | public void initData(Bundle bundle) { 31 | 32 | } 33 | 34 | @Override 35 | public int bindLayout() { 36 | return R.layout.activity_location; 37 | } 38 | 39 | @Override 40 | public void initView(Bundle savedInstanceState, View view) { 41 | tvAboutLocation = (TextView) findViewById(R.id.tv_about_location); 42 | tvAboutLocation.setText("lastLatitude: unknown" 43 | + "\nlastLongitude: unknown" 44 | + "\nlatitude: unknown" 45 | + "\nlongitude: unknown" 46 | + "\ngetCountryName: unknown" 47 | + "\ngetLocality: unknown" 48 | + "\ngetStreet: unknown" 49 | ); 50 | } 51 | 52 | @Override 53 | public void doBusiness(Context context) { 54 | bindService(new Intent(this, LocationService.class), conn, Context.BIND_AUTO_CREATE); 55 | } 56 | 57 | @Override 58 | public void onWidgetClick(View view) { 59 | 60 | } 61 | 62 | @Override 63 | protected void onDestroy() { 64 | unbindService(conn); 65 | super.onDestroy(); 66 | } 67 | 68 | ServiceConnection conn = new ServiceConnection() { 69 | @Override 70 | public void onServiceDisconnected(ComponentName name) { 71 | 72 | } 73 | 74 | @Override 75 | public void onServiceConnected(ComponentName name, IBinder service) { 76 | mLocationService = ((LocationService.LocationBinder) service).getService(); 77 | mLocationService.setOnGetLocationListener(new LocationService.OnGetLocationListener() { 78 | @Override 79 | public void getLocation(final String lastLatitude, final String lastLongitude, final String latitude, final String longitude, final String country, final String locality, final String street) { 80 | runOnUiThread(new Runnable() { 81 | @Override 82 | public void run() { 83 | tvAboutLocation.setText("lastLatitude: " + lastLatitude + 84 | "\nlastLongitude: " + lastLongitude + 85 | "\nlatitude: " + latitude + 86 | "\nlongitude: " + longitude + 87 | "\ngetCountryName: " + country + 88 | "\ngetLocality: " + locality + 89 | "\ngetStreet: " + street 90 | ); 91 | } 92 | }); 93 | } 94 | }); 95 | } 96 | }; 97 | } 98 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.graphics.Color; 6 | import android.net.Uri; 7 | import android.os.Bundle; 8 | import android.support.v7.widget.Toolbar; 9 | import android.view.Menu; 10 | import android.view.MenuItem; 11 | import android.view.View; 12 | 13 | import com.blankj.androidutilcode.R; 14 | import com.blankj.androidutilcode.base.BaseActivity; 15 | 16 | /** 17 | *
18 | * author: Blankj 19 | * blog : http://blankj.com 20 | * time : 2016/09/29 21 | * desc : MainActivity 22 | *23 | */ 24 | public class MainActivity extends BaseActivity { 25 | 26 | @Override 27 | public void initData(Bundle bundle) { 28 | 29 | } 30 | 31 | @Override 32 | public int bindLayout() { 33 | return R.layout.activity_main; 34 | } 35 | 36 | @Override 37 | public void initView(Bundle savedInstanceState, View view) { 38 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 39 | if (toolbar != null) { 40 | toolbar.setTitleTextColor(Color.WHITE); 41 | setSupportActionBar(toolbar); 42 | } 43 | } 44 | 45 | @Override 46 | public void doBusiness(Context context) { 47 | 48 | } 49 | 50 | @Override 51 | public void onWidgetClick(View view) { 52 | 53 | } 54 | 55 | public void activityClick(View view) { 56 | startActivity(new Intent(this, ActivityActivity.class)); 57 | } 58 | 59 | public void appClick(View view) { 60 | startActivity(new Intent(this, AppActivity.class)); 61 | } 62 | 63 | public void cleanClick(View view) { 64 | startActivity(new Intent(this, CleanActivity.class)); 65 | } 66 | 67 | public void crashClick(View view) { 68 | throw new NullPointerException("crash test"); 69 | } 70 | 71 | public void deviceClick(View view) { 72 | startActivity(new Intent(this, DeviceActivity.class)); 73 | } 74 | 75 | public void fragmentClick(View view) { 76 | startActivity(new Intent(this, FragmentActivity.class)); 77 | } 78 | 79 | // public void flashlightClick(View view) { 80 | // startActivity(new Intent(this, FlashlightActivity.class)); 81 | // } 82 | 83 | public void handlerClick(View view) { 84 | startActivity(new Intent(this, HandlerActivity.class)); 85 | } 86 | 87 | public void imageClick(View view) { 88 | startActivity(new Intent(this, ImageActivity.class)); 89 | } 90 | 91 | public void keyboardClick(View view) { 92 | startActivity(new Intent(this, KeyboardActivity.class)); 93 | } 94 | 95 | public void locationClick(View view) { 96 | startActivity(new Intent(this, LocationActivity.class)); 97 | } 98 | 99 | public void logClick(View view) { 100 | startActivity(new Intent(this, LogActivity.class)); 101 | } 102 | 103 | public void networkClick(View view) { 104 | startActivity(new Intent(this, NetworkActivity.class)); 105 | } 106 | 107 | // public void permissionClick(View view) { 108 | // startActivity(new Intent(this, PermissionActivity.class)); 109 | // } 110 | 111 | public void phoneClick(View view) { 112 | startActivity(new Intent(this, PhoneActivity.class)); 113 | } 114 | 115 | public void pinyinClick(View view) { 116 | startActivity(new Intent(this, PinyinActivity.class)); 117 | } 118 | 119 | public void processClick(View view) { 120 | startActivity(new Intent(this, ProcessActivity.class)); 121 | } 122 | 123 | public void sdcardClick(View view) { 124 | startActivity(new Intent(this, SDCardActivity.class)); 125 | } 126 | 127 | public void snackbarClick(View view) { 128 | startActivity(new Intent(this, SnackbarActivity.class)); 129 | } 130 | 131 | public void spannableClick(View view) { 132 | startActivity(new Intent(this, SpannableActivity.class)); 133 | } 134 | 135 | public void toastClick(View view) { 136 | startActivity(new Intent(this, ToastActivity.class)); 137 | } 138 | 139 | 140 | @Override 141 | public boolean onCreateOptionsMenu(Menu menu) { 142 | getMenuInflater().inflate(R.menu.about, menu); 143 | return true; 144 | } 145 | 146 | @Override 147 | public boolean onOptionsItemSelected(MenuItem item) { 148 | try { 149 | switch (item.getItemId()) { 150 | 151 | case R.id.action_git_hub: 152 | 153 | startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/Blankj/AndroidUtilCode"))); 154 | break; 155 | case R.id.action_blog: 156 | startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.jianshu.com/u/46702d5c6978"))); 157 | break; 158 | } 159 | } catch (Exception e) { 160 | e.printStackTrace(); 161 | } 162 | 163 | return super.onOptionsItemSelected(item); 164 | } 165 | } 166 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/NetworkActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.blankj.androidutilcode.R; 9 | import com.blankj.androidutilcode.base.BaseActivity; 10 | import com.blankj.utilcode.util.NetworkUtils; 11 | 12 | /** 13 | *
14 | * author: Blankj 15 | * blog : http://blankj.com 16 | * time : 2016/10/13 17 | * desc : Network工具类Demo 18 | *19 | */ 20 | public class NetworkActivity extends BaseActivity { 21 | 22 | private TextView tvAboutNetwork; 23 | 24 | @Override 25 | public void initData(Bundle bundle) { 26 | 27 | } 28 | 29 | @Override 30 | public int bindLayout() { 31 | return R.layout.activity_network; 32 | } 33 | 34 | @Override 35 | public void initView(Bundle savedInstanceState, View view) { 36 | tvAboutNetwork = (TextView) findViewById(R.id.tv_about_network); 37 | findViewById(R.id.btn_open_wireless_settings).setOnClickListener(this); 38 | findViewById(R.id.btn_set_wifi_enabled).setOnClickListener(this); 39 | setAboutNetwork(); 40 | } 41 | 42 | @Override 43 | public void doBusiness(Context context) { 44 | 45 | } 46 | 47 | @Override 48 | public void onWidgetClick(View view) { 49 | switch (view.getId()) { 50 | case R.id.btn_open_wireless_settings: 51 | NetworkUtils.openWirelessSettings(); 52 | break; 53 | case R.id.btn_set_data_enabled: 54 | NetworkUtils.setDataEnabled(!NetworkUtils.getDataEnabled()); 55 | break; 56 | case R.id.btn_set_wifi_enabled: 57 | NetworkUtils.setWifiEnabled(!NetworkUtils.getWifiEnabled()); 58 | break; 59 | } 60 | setAboutNetwork(); 61 | } 62 | 63 | private void setAboutNetwork() { 64 | tvAboutNetwork.setText("isConnected: " + NetworkUtils.isConnected() 65 | + "\nisAvailableByPing: " + NetworkUtils.isAvailableByPing() 66 | + "\ngetDataEnabled: " + NetworkUtils.getDataEnabled() 67 | + "\nis4G: " + NetworkUtils.is4G() 68 | + "\ngetWifiEnabled: " + NetworkUtils.getWifiEnabled() 69 | + "\nisWifiConnected: " + NetworkUtils.isWifiConnected() 70 | + "\nisWifiAvailable: " + NetworkUtils.isWifiAvailable() 71 | + "\nisAvailableByPing: " + NetworkUtils.isAvailableByPing() 72 | + "\ngetNetworkOperatorName: " + NetworkUtils.getNetworkOperatorName() 73 | + "\ngetNetworkTypeName: " + NetworkUtils.getNetworkType() 74 | + "\ngetIPAddress: " + NetworkUtils.getIPAddress(true) 75 | + "\ngetDomainAddress: " + NetworkUtils.getDomainAddress("baidu.com") 76 | ); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/PhoneActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.blankj.androidutilcode.R; 9 | import com.blankj.androidutilcode.base.BaseActivity; 10 | import com.blankj.utilcode.util.PhoneUtils; 11 | 12 | /** 13 | *
14 | * author: Blankj 15 | * blog : http://blankj.com 16 | * time : 2016/10/13 17 | * desc : Phone工具类Demo 18 | *19 | */ 20 | public class PhoneActivity extends BaseActivity { 21 | 22 | @Override 23 | public void initData(Bundle bundle) { 24 | 25 | } 26 | 27 | @Override 28 | public int bindLayout() { 29 | return R.layout.activity_phone; 30 | } 31 | 32 | @Override 33 | public void initView(Bundle savedInstanceState, View view) { 34 | findViewById(R.id.btn_dial).setOnClickListener(this); 35 | findViewById(R.id.btn_call).setOnClickListener(this); 36 | findViewById(R.id.btn_send_sms).setOnClickListener(this); 37 | findViewById(R.id.btn_send_sms_silent).setOnClickListener(this); 38 | TextView tvAboutPhone = (TextView) findViewById(R.id.tv_about_phone); 39 | tvAboutPhone.setText("isPhone: " + PhoneUtils.isPhone() 40 | + "\ngetIMEI: " + PhoneUtils.getIMEI() 41 | + "\ngetIMSI: " + PhoneUtils.getIMSI() 42 | + "\ngetPhoneType: " + PhoneUtils.getPhoneType() 43 | + "\nisSimCardReady: " + PhoneUtils.isSimCardReady() 44 | + "\ngetSimOperatorName: " + PhoneUtils.getSimOperatorName() 45 | + "\ngetSimOperatorByMnc: " + PhoneUtils.getSimOperatorByMnc() 46 | + "\n获取手机状态信息: " + PhoneUtils.getPhoneStatus() 47 | ); 48 | } 49 | 50 | @Override 51 | public void doBusiness(Context context) { 52 | 53 | } 54 | 55 | @Override 56 | public void onWidgetClick(View view) { 57 | switch (view.getId()) { 58 | case R.id.btn_dial: 59 | PhoneUtils.dial("10000"); 60 | break; 61 | case R.id.btn_call: 62 | PhoneUtils.call("10000"); 63 | break; 64 | case R.id.btn_send_sms: 65 | PhoneUtils.sendSms("10000", "test"); 66 | break; 67 | case R.id.btn_send_sms_silent: 68 | PhoneUtils.sendSmsSilent("10000", "test"); 69 | break; 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/PinyinActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.blankj.androidutilcode.R; 9 | import com.blankj.androidutilcode.base.BaseActivity; 10 | import com.blankj.utilcode.util.PinyinUtils; 11 | 12 | /** 13 | *
14 | * author: Blankj 15 | * blog : http://blankj.com 16 | * time : 17/02/01 17 | * desc : Pinyin工具类Demo 18 | *19 | */ 20 | public class PinyinActivity extends BaseActivity { 21 | 22 | @Override 23 | public void initData(Bundle bundle) { 24 | 25 | } 26 | 27 | @Override 28 | public int bindLayout() { 29 | return R.layout.activity_pinyin; 30 | } 31 | 32 | @Override 33 | public void initView(Bundle savedInstanceState, View view) { 34 | TextView tvAboutPinyin = (TextView) findViewById(R.id.tv_about_pinyin); 35 | tvAboutPinyin.setText("测试拼音工具类" 36 | + "\n转拼音: " + PinyinUtils.ccs2Pinyin("测试拼音工具类", " ") 37 | + "\n获取首字母: " + PinyinUtils.getPinyinFirstLetters("测试拼音工具类", " ") 38 | + "\n澹台: " + PinyinUtils.getSurnamePinyin("澹台")); 39 | } 40 | 41 | @Override 42 | public void doBusiness(Context context) { 43 | 44 | } 45 | 46 | @Override 47 | public void onWidgetClick(View view) { 48 | 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/ProcessActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.blankj.androidutilcode.R; 9 | import com.blankj.androidutilcode.base.BaseActivity; 10 | import com.blankj.utilcode.util.ProcessUtils; 11 | 12 | import java.util.Iterator; 13 | import java.util.Set; 14 | 15 | /** 16 | *
17 | * author: Blankj 18 | * blog : http://blankj.com 19 | * time : 2016/10/13 20 | * desc : Process工具类Demo 21 | *22 | */ 23 | public class ProcessActivity extends BaseActivity { 24 | 25 | private TextView tvAboutProcess; 26 | 27 | @Override 28 | public void initData(Bundle bundle) { 29 | 30 | } 31 | 32 | @Override 33 | public int bindLayout() { 34 | return R.layout.activity_process; 35 | } 36 | 37 | @Override 38 | public void initView(Bundle savedInstanceState, View view) { 39 | findViewById(R.id.btn_kill_all_background_processes).setOnClickListener(this); 40 | tvAboutProcess = (TextView) findViewById(R.id.tv_about_process); 41 | Set
14 | * author: Blankj 15 | * blog : http://blankj.com 16 | * time : 2016/09/27 17 | * desc : SDCard工具类Demo 18 | *19 | */ 20 | public class SDCardActivity extends BaseActivity { 21 | 22 | @Override 23 | public void initData(Bundle bundle) { 24 | 25 | } 26 | 27 | @Override 28 | public int bindLayout() { 29 | return R.layout.activity_sdcard; 30 | } 31 | 32 | @Override 33 | public void initView(Bundle savedInstanceState, View view) { 34 | TextView tvAboutSdcard = (TextView) findViewById(R.id.tv_about_sdcard); 35 | tvAboutSdcard.setText("isSDCardEnable: " + SDCardUtils.isSDCardEnable() 36 | + "\ngetDataPath: " + SDCardUtils.getDataPath() 37 | + "\ngetSDCardPath: " + SDCardUtils.getSDCardPath() 38 | + "\ngetFreeSpace: " + SDCardUtils.getFreeSpace() 39 | + "\ngetSDCardInfo: " + SDCardUtils.getSDCardInfo() 40 | ); 41 | } 42 | 43 | @Override 44 | public void doBusiness(Context context) { 45 | 46 | } 47 | 48 | @Override 49 | public void onWidgetClick(View view) { 50 | 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/activity/ToastActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.activity; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.view.Gravity; 6 | import android.view.View; 7 | import android.widget.TextView; 8 | 9 | import com.blankj.androidutilcode.R; 10 | import com.blankj.androidutilcode.base.BaseActivity; 11 | import com.blankj.utilcode.util.ToastUtils; 12 | 13 | /** 14 | *
15 | * author: Blankj 16 | * blog : http://blankj.com 17 | * time : 2016/09/29 18 | * desc : Toast工具类Demo 19 | *20 | */ 21 | public class ToastActivity extends BaseActivity { 22 | 23 | private boolean isDefaultLocation; 24 | private boolean isDefaultView; 25 | private TextView tvAboutToast; 26 | 27 | @Override 28 | public void initData(Bundle bundle) { 29 | isDefaultLocation = true; 30 | isDefaultView = true; 31 | } 32 | 33 | @Override 34 | public int bindLayout() { 35 | return R.layout.activity_toast; 36 | } 37 | 38 | @Override 39 | public void initView(Bundle savedInstanceState, View view) { 40 | findViewById(R.id.btn_toggle_location).setOnClickListener(this); 41 | findViewById(R.id.btn_toggle_view).setOnClickListener(this); 42 | findViewById(R.id.btn_show_short_toast_safe).setOnClickListener(this); 43 | findViewById(R.id.btn_show_long_toast_safe).setOnClickListener(this); 44 | findViewById(R.id.btn_show_short_toast).setOnClickListener(this); 45 | findViewById(R.id.btn_show_long_toast).setOnClickListener(this); 46 | findViewById(R.id.btn_cancel_toast).setOnClickListener(this); 47 | tvAboutToast = (TextView) findViewById(R.id.tv_about_toast); 48 | tvAboutToast.setText("is default location: " + isDefaultLocation 49 | + "\nis default view: " + isDefaultView 50 | ); 51 | } 52 | 53 | @Override 54 | public void doBusiness(Context context) { 55 | 56 | } 57 | 58 | @Override 59 | public void onWidgetClick(View view) { 60 | switch (view.getId()) { 61 | case R.id.btn_toggle_location: 62 | if (isDefaultLocation) { 63 | ToastUtils.setGravity(Gravity.CENTER, 0, 0); 64 | } else { 65 | ToastUtils.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, getResources().getDimensionPixelSize(R.dimen.offset_64)); 66 | } 67 | isDefaultLocation = !isDefaultLocation; 68 | break; 69 | case R.id.btn_toggle_view: 70 | if (isDefaultView) { 71 | ToastUtils.setView(R.layout.toast_custom); 72 | } else { 73 | ToastUtils.setView(null); 74 | } 75 | isDefaultView = !isDefaultView; 76 | break; 77 | case R.id.btn_show_short_toast_safe: 78 | new Thread(new Runnable() { 79 | @Override 80 | public void run() { 81 | ToastUtils.showShortSafe(R.string.toast_short_safe); 82 | } 83 | }).start(); 84 | break; 85 | case R.id.btn_show_long_toast_safe: 86 | new Thread(new Runnable() { 87 | @Override 88 | public void run() { 89 | ToastUtils.showLongSafe(R.string.toast_long_safe); 90 | } 91 | }).start(); 92 | break; 93 | case R.id.btn_show_short_toast: 94 | ToastUtils.showShort(R.string.toast_short); 95 | break; 96 | case R.id.btn_show_long_toast: 97 | ToastUtils.showShort(R.string.toast_long); 98 | break; 99 | case R.id.btn_cancel_toast: 100 | ToastUtils.cancel(); 101 | break; 102 | } 103 | tvAboutToast.setText("is default location: " + isDefaultLocation 104 | + "\nis default view: " + isDefaultView 105 | ); 106 | } 107 | 108 | @Override 109 | protected void onDestroy() { 110 | ToastUtils.setView(null); 111 | super.onDestroy(); 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/base/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.base; 2 | 3 | import android.content.Context; 4 | import android.os.Build; 5 | import android.os.Bundle; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.Window; 10 | import android.view.WindowManager; 11 | 12 | /** 13 | *
14 | * author: Blankj 15 | * blog : http://blankj.com 16 | * time : 2016/10/24 17 | * desc : Activity基类 18 | *19 | */ 20 | public abstract class BaseActivity extends AppCompatActivity 21 | implements View.OnClickListener { 22 | 23 | /** 24 | * 是否全屏 25 | */ 26 | private boolean isFullScreen = false; 27 | /** 28 | * 是否沉浸状态栏 29 | */ 30 | private boolean isSteepStatusBar = false; 31 | /** 32 | * 当前Activity渲染的视图View 33 | */ 34 | protected View contentView; 35 | /** 36 | * 上次点击时间 37 | */ 38 | private long lastClick = 0; 39 | 40 | protected BaseActivity mActivity; 41 | 42 | @Override 43 | protected void onCreate(Bundle savedInstanceState) { 44 | super.onCreate(savedInstanceState); 45 | try { 46 | mActivity = this; 47 | Bundle bundle = getIntent().getExtras(); 48 | initData(bundle); 49 | contentView = LayoutInflater.from(this).inflate(bindLayout(), null); 50 | if (isFullScreen) { 51 | this.getWindow().setFlags( 52 | WindowManager.LayoutParams.FLAG_FULLSCREEN, 53 | WindowManager.LayoutParams.FLAG_FULLSCREEN); 54 | requestWindowFeature(Window.FEATURE_NO_TITLE); 55 | } 56 | if (isSteepStatusBar) { 57 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 58 | getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 59 | getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); 60 | } 61 | } 62 | setContentView(contentView); 63 | initView(savedInstanceState, contentView); 64 | doBusiness(this); 65 | } catch (Exception e) { 66 | e.printStackTrace(); 67 | } 68 | } 69 | 70 | 71 | /** 72 | * 初始化数据 73 | * 74 | * @param bundle 从上个Activity传递过来的bundle 75 | */ 76 | public abstract void initData(Bundle bundle); 77 | 78 | /** 79 | * 绑定布局 80 | * 81 | * @return 布局Id 82 | */ 83 | public abstract int bindLayout(); 84 | 85 | /** 86 | * 初始化view 87 | */ 88 | public abstract void initView(Bundle savedInstanceState, final View view); 89 | 90 | /** 91 | * 业务操作 92 | * 93 | * @param context 上下文 94 | */ 95 | public abstract void doBusiness(Context context); 96 | 97 | /** 98 | * 视图点击事件 99 | * 100 | * @param view 视图 101 | */ 102 | public abstract void onWidgetClick(View view); 103 | 104 | /** 105 | * 判断是否快速点击 106 | * 107 | * @return {@code true}: 是
11 | * author: Blankj 12 | * blog : http://blankj.com 13 | * time : 2017/03/30 14 | * desc : 基类App 15 | *16 | */ 17 | public class BaseApplication extends Application { 18 | 19 | private static final String TAG = "BaseApplication"; 20 | 21 | private static BaseApplication sInstance; 22 | 23 | public static Context getInstance() { 24 | return sInstance; 25 | } 26 | 27 | @Override 28 | public void onCreate() { 29 | super.onCreate(); 30 | sInstance = this; 31 | registerActivityLifecycleCallbacks(mCallbacks); 32 | } 33 | 34 | private ActivityLifecycleCallbacks mCallbacks = new ActivityLifecycleCallbacks() { 35 | 36 | @Override 37 | public void onActivityCreated(Activity activity, Bundle savedInstanceState) { 38 | Log.d(TAG, "onActivityCreated() called with: activity = [" + activity + "], savedInstanceState = [" + savedInstanceState + "]"); 39 | } 40 | 41 | @Override 42 | public void onActivityStarted(Activity activity) { 43 | Log.d(TAG, "onActivityStarted() called with: activity = [" + activity + "]"); 44 | } 45 | 46 | @Override 47 | public void onActivityResumed(Activity activity) { 48 | Log.d(TAG, "onActivityResumed() called with: activity = [" + activity + "]"); 49 | } 50 | 51 | @Override 52 | public void onActivityPaused(Activity activity) { 53 | Log.d(TAG, "onActivityPaused() called with: activity = [" + activity + "]"); 54 | } 55 | 56 | @Override 57 | public void onActivityStopped(Activity activity) { 58 | Log.d(TAG, "onActivityStopped() called with: activity = [" + activity + "]"); 59 | } 60 | 61 | @Override 62 | public void onActivitySaveInstanceState(Activity activity, Bundle outState) { 63 | Log.d(TAG, "onActivitySaveInstanceState() called with: activity = [" + activity + "], outState = [" + outState + "]"); 64 | } 65 | 66 | @Override 67 | public void onActivityDestroyed(Activity activity) { 68 | Log.d(TAG, "onActivityDestroyed() called with: activity = [" + activity + "]"); 69 | } 70 | }; 71 | } 72 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/base/BaseFragment.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.base; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v4.app.Fragment; 7 | import android.support.v4.app.FragmentTransaction; 8 | import android.util.Log; 9 | import android.view.LayoutInflater; 10 | import android.view.View; 11 | import android.view.ViewGroup; 12 | 13 | /** 14 | *
15 | * author: Blankj 16 | * blog : http://blankj.com 17 | * time : 2017/03/28 18 | * desc : Fragment-v4基类 19 | *20 | */ 21 | public abstract class BaseFragment extends Fragment 22 | implements View.OnClickListener { 23 | 24 | private static final String TAG = "BaseFragment"; 25 | 26 | private static final String STATE_SAVE_IS_HIDDEN = "STATE_SAVE_IS_HIDDEN"; 27 | /** 28 | * 当前Activity渲染的视图View 29 | */ 30 | protected View contentView; 31 | /** 32 | * 上次点击时间 33 | */ 34 | private long lastClick = 0; 35 | 36 | protected BaseActivity mActivity; 37 | 38 | @Override 39 | public void onCreate(@Nullable Bundle savedInstanceState) { 40 | super.onCreate(savedInstanceState); 41 | if (savedInstanceState != null) { 42 | boolean isSupportHidden = savedInstanceState.getBoolean(STATE_SAVE_IS_HIDDEN); 43 | FragmentTransaction ft = getFragmentManager().beginTransaction(); 44 | if (isSupportHidden) { 45 | ft.hide(this); 46 | } else { 47 | ft.show(this); 48 | } 49 | ft.commit(); 50 | } 51 | Log.d(TAG, "onCreate: "); 52 | } 53 | 54 | @Nullable 55 | @Override 56 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 57 | setRetainInstance(true); 58 | contentView = inflater.inflate(bindLayout(), null); 59 | Log.d(TAG, "onCreateView: "); 60 | return contentView; 61 | } 62 | 63 | @Override 64 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 65 | super.onViewCreated(view, savedInstanceState); 66 | Bundle bundle = getArguments(); 67 | initData(bundle); 68 | initView(savedInstanceState, contentView); 69 | Log.d(TAG, "onViewCreated: "); 70 | } 71 | 72 | @Override 73 | public void onActivityCreated(Bundle savedInstanceState) { 74 | super.onActivityCreated(savedInstanceState); 75 | mActivity = (BaseActivity) getActivity(); 76 | doBusiness(mActivity); 77 | Log.d(TAG, "onActivityCreated: "); 78 | } 79 | 80 | 81 | /** 82 | * 初始化数据 83 | * 84 | * @param bundle 传递过来的bundle 85 | */ 86 | public abstract void initData(Bundle bundle); 87 | 88 | /** 89 | * 绑定布局 90 | * 91 | * @return 布局Id 92 | */ 93 | public abstract int bindLayout(); 94 | 95 | /** 96 | * 初始化view 97 | */ 98 | public abstract void initView(Bundle savedInstanceState, final View view); 99 | 100 | /** 101 | * 业务操作 102 | * 103 | * @param context 上下文 104 | */ 105 | public abstract void doBusiness(Context context); 106 | 107 | /** 108 | * 视图点击事件 109 | * 110 | * @param view 视图 111 | */ 112 | public abstract void onWidgetClick(View view); 113 | 114 | /** 115 | * 判断是否快速点击 116 | * 117 | * @return {@code true}: 是
18 | * author: Blankj 19 | * blog : http://blankj.com 20 | * time : 17/02/02 21 | * desc : 22 | *23 | */ 24 | public class Demo1Fragment extends BaseFragment { 25 | 26 | public static Demo1Fragment newInstance() { 27 | Bundle args = new Bundle(); 28 | Demo1Fragment fragment = new Demo1Fragment(); 29 | fragment.setArguments(args); 30 | return fragment; 31 | } 32 | 33 | private TextView tvAboutFragment; 34 | 35 | @Override 36 | public void initData(Bundle bundle) { 37 | 38 | } 39 | 40 | @Override 41 | public int bindLayout() { 42 | return R.layout.fragment_demo1; 43 | } 44 | 45 | @Override 46 | public void initView(Bundle savedInstanceState, View view) { 47 | Random random = new Random(); 48 | FragmentUtils.setBackgroundColor(this, Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256))); 49 | view.findViewById(R.id.btn_show_about_fragment).setOnClickListener(this); 50 | view.findViewById(R.id.btn_hide_show).setOnClickListener(this); 51 | tvAboutFragment = (TextView) view.findViewById(R.id.tv_about_fragment); 52 | } 53 | 54 | @Override 55 | public void doBusiness(Context context) { 56 | 57 | } 58 | 59 | @Override 60 | public void onWidgetClick(View view) { 61 | tvAboutFragment.setText(""); 62 | switch (view.getId()) { 63 | case R.id.btn_show_about_fragment: 64 | tvAboutFragment.setText("lastAdd: " + FragmentUtils.getLastAddFragment(getFragmentManager()).getClass().getSimpleName() 65 | + "\nlastAddInStack: " + (FragmentUtils.getLastAddFragmentInStack(getFragmentManager()) != null ? FragmentUtils.getLastAddFragmentInStack(getFragmentManager()).getClass().getSimpleName() : "null") 66 | + "\ntopShow: " + FragmentUtils.getTopShowFragment(getFragmentManager()).getClass().getSimpleName() 67 | + "\ntopShowInStack: " + (FragmentUtils.getTopShowFragmentInStack(getFragmentManager()) != null ? FragmentUtils.getTopShowFragmentInStack(getFragmentManager()).getClass().getSimpleName() : "null") 68 | + "\n---all of fragments---\n" 69 | + FragmentUtils.getAllFragments(getFragmentManager()).toString() 70 | + "\n----------------------\n\n" 71 | + "---stack top---\n" 72 | + FragmentUtils.getAllFragmentsInStack(getFragmentManager()).toString() 73 | + "\n---stack bottom---\n\n" 74 | ); 75 | break; 76 | case R.id.btn_hide_show: 77 | FragmentUtils.hideAllShowFragment(((FragmentActivity) getActivity()).rootFragment); 78 | break; 79 | } 80 | } 81 | 82 | // @Override 83 | // public boolean onBackClick() { 84 | // LogUtils.d("onBackClick"); 85 | // FragmentUtils.showFragment(((FragmentActivity) getActivity()).rootFragment); 86 | // FragmentUtils.popFragment(getFragmentManager()); 87 | // return true; 88 | // } 89 | } 90 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/fragment/Demo2Fragment.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.fragment; 2 | 3 | import android.content.Context; 4 | import android.graphics.Color; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | import android.widget.TextView; 8 | 9 | import com.blankj.androidutilcode.R; 10 | import com.blankj.androidutilcode.base.BaseFragment; 11 | import com.blankj.utilcode.util.FragmentUtils; 12 | import com.blankj.utilcode.util.LogUtils; 13 | 14 | import java.util.Random; 15 | 16 | /** 17 | *
18 | * author: Blankj 19 | * blog : http://blankj.com 20 | * time : 17/02/02 21 | * desc : 22 | *23 | */ 24 | public class Demo2Fragment extends BaseFragment 25 | implements FragmentUtils.OnBackClickListener{ 26 | 27 | private TextView tvAboutFragment; 28 | 29 | public static Demo2Fragment newInstance() { 30 | Bundle args = new Bundle(); 31 | Demo2Fragment fragment = new Demo2Fragment(); 32 | fragment.setArguments(args); 33 | return fragment; 34 | } 35 | 36 | @Override 37 | public void initData(Bundle bundle) { 38 | 39 | } 40 | 41 | @Override 42 | public int bindLayout() { 43 | return R.layout.fragment_demo2; 44 | } 45 | 46 | @Override 47 | public void initView(Bundle savedInstanceState, View view) { 48 | Random random = new Random(); 49 | FragmentUtils.setBackgroundColor(this, Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256))); 50 | view.findViewById(R.id.btn_show_about_fragment).setOnClickListener(this); 51 | view.findViewById(R.id.btn_pop).setOnClickListener(this); 52 | tvAboutFragment = (TextView) view.findViewById(R.id.tv_about_fragment); 53 | } 54 | 55 | @Override 56 | public void doBusiness(Context context) { 57 | 58 | } 59 | 60 | @Override 61 | public void onWidgetClick(View view) { 62 | tvAboutFragment.setText(""); 63 | switch (view.getId()) { 64 | case R.id.btn_show_about_fragment: 65 | tvAboutFragment.setText("lastAdd: " + FragmentUtils.getLastAddFragment(getFragmentManager()).getClass().getSimpleName() 66 | + "\nlastAddInStack: " + (FragmentUtils.getLastAddFragmentInStack(getFragmentManager()) != null ? FragmentUtils.getLastAddFragmentInStack(getFragmentManager()).getClass().getSimpleName() : "null") 67 | + "\ntopShow: " + FragmentUtils.getTopShowFragment(getFragmentManager()).getClass().getSimpleName() 68 | + "\ntopShowInStack: " + (FragmentUtils.getTopShowFragmentInStack(getFragmentManager()) != null ? FragmentUtils.getTopShowFragmentInStack(getFragmentManager()).getClass().getSimpleName() : "null") 69 | + "\n---all of fragments---\n" 70 | + FragmentUtils.getAllFragments(getFragmentManager()).toString() 71 | + "\n----------------------\n\n" 72 | + "---stack top---\n" 73 | + FragmentUtils.getAllFragmentsInStack(getFragmentManager()).toString() 74 | + "\n---stack bottom---\n\n" 75 | ); 76 | break; 77 | case R.id.btn_pop: 78 | FragmentUtils.popFragment(getFragmentManager()); 79 | break; 80 | } 81 | } 82 | 83 | @Override 84 | public boolean onBackClick() { 85 | LogUtils.d("demo2 onBackClick"); 86 | return false; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/service/LocationService.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.service; 2 | 3 | import android.app.Service; 4 | import android.content.Intent; 5 | import android.location.Location; 6 | import android.os.Binder; 7 | import android.os.Bundle; 8 | import android.os.IBinder; 9 | import android.os.Looper; 10 | import android.support.annotation.Nullable; 11 | 12 | import com.blankj.utilcode.util.LocationUtils; 13 | import com.blankj.utilcode.util.ToastUtils; 14 | 15 | /** 16 | *
17 | * author: Blankj 18 | * blog : http://blankj.com 19 | * time : 2016/11/21 20 | * desc : Location服务 21 | *22 | */ 23 | public class LocationService extends Service { 24 | 25 | private boolean isSuccess; 26 | private String lastLatitude = "loading..."; 27 | private String lastLongitude = "loading..."; 28 | private String latitude = "loading..."; 29 | private String longitude = "loading..."; 30 | private String country = "loading..."; 31 | private String locality = "loading..."; 32 | private String street = "loading..."; 33 | private OnGetLocationListener mOnGetLocationListener; 34 | 35 | public void setOnGetLocationListener(OnGetLocationListener onGetLocationListener) { 36 | mOnGetLocationListener = onGetLocationListener; 37 | } 38 | 39 | private LocationUtils.OnLocationChangeListener mOnLocationChangeListener = new LocationUtils.OnLocationChangeListener() { 40 | @Override 41 | public void getLastKnownLocation(Location location) { 42 | lastLatitude = String.valueOf(location.getLatitude()); 43 | lastLongitude = String.valueOf(location.getLongitude()); 44 | if (mOnGetLocationListener != null) { 45 | mOnGetLocationListener.getLocation(lastLatitude, lastLongitude, latitude, longitude, country, locality, street); 46 | } 47 | } 48 | 49 | @Override 50 | public void onLocationChanged(final Location location) { 51 | latitude = String.valueOf(location.getLatitude()); 52 | longitude = String.valueOf(location.getLongitude()); 53 | if (mOnGetLocationListener != null) { 54 | mOnGetLocationListener.getLocation(lastLatitude, lastLongitude, latitude, longitude, country, locality, street); 55 | } 56 | country = LocationUtils.getCountryName(Double.parseDouble(latitude), Double.parseDouble(longitude)); 57 | locality = LocationUtils.getLocality(Double.parseDouble(latitude), Double.parseDouble(longitude)); 58 | street = LocationUtils.getStreet(Double.parseDouble(latitude), Double.parseDouble(longitude)); 59 | if (mOnGetLocationListener != null) { 60 | mOnGetLocationListener.getLocation(lastLatitude, lastLongitude, latitude, longitude, country, locality, street); 61 | } 62 | } 63 | 64 | @Override 65 | public void onStatusChanged(String provider, int status, Bundle extras) { 66 | 67 | } 68 | }; 69 | 70 | @Override 71 | public void onCreate() { 72 | super.onCreate(); 73 | new Thread(new Runnable() { 74 | @Override 75 | public void run() { 76 | Looper.prepare(); 77 | isSuccess = LocationUtils.register(0, 0, mOnLocationChangeListener); 78 | if (isSuccess) ToastUtils.showShortSafe("init success"); 79 | Looper.loop(); 80 | } 81 | }).start(); 82 | } 83 | 84 | @Nullable 85 | @Override 86 | public IBinder onBind(Intent intent) { 87 | return new LocationBinder(); 88 | } 89 | 90 | public class LocationBinder extends Binder { 91 | public LocationService getService() { 92 | return LocationService.this; 93 | } 94 | } 95 | 96 | @Override 97 | public void onDestroy() { 98 | LocationUtils.unregister(); 99 | // 一定要制空,否则内存泄漏 100 | mOnGetLocationListener = null; 101 | super.onDestroy(); 102 | } 103 | 104 | /** 105 | * 获取位置监听器 106 | */ 107 | public interface OnGetLocationListener { 108 | void getLocation( 109 | String lastLatitude, String lastLongitude, 110 | String latitude, String longitude, 111 | String country, String locality, String street 112 | ); 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /app/src/main/java/com/blankj/androidutilcode/transition/DetailTransition.java: -------------------------------------------------------------------------------- 1 | package com.blankj.androidutilcode.transition; 2 | 3 | import android.annotation.TargetApi; 4 | import android.content.Context; 5 | import android.os.Build; 6 | import android.transition.ChangeBounds; 7 | import android.transition.ChangeImageTransform; 8 | import android.transition.ChangeTransform; 9 | import android.transition.TransitionSet; 10 | import android.util.AttributeSet; 11 | 12 | /** 13 | *
14 | * author: Blankj 15 | * blog : http://blankj.com 16 | * time : 17/02/21 17 | * desc : 18 | *19 | */ 20 | @TargetApi(Build.VERSION_CODES.LOLLIPOP) 21 | public class DetailTransition extends TransitionSet { 22 | public DetailTransition() { 23 | init(); 24 | } 25 | 26 | // 允许资源文件使用 27 | public DetailTransition(Context context, AttributeSet attrs) { 28 | super(context, attrs); 29 | init(); 30 | } 31 | 32 | private void init() { 33 | setOrdering(ORDERING_TOGETHER); 34 | addTransition(new ChangeBounds()). 35 | addTransition(new ChangeTransform()). 36 | addTransition(new ChangeImageTransform()); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/res/animator/fragment_slide_left_enter.xml: -------------------------------------------------------------------------------- 1 | 2 |
10 | * author: Blankj 11 | * blog : http://blankj.com 12 | * time : 2017/03/13 13 | * desc : 存储相关常量 14 | *15 | */ 16 | public final class MemoryConstants { 17 | 18 | /** 19 | * Byte与Byte的倍数 20 | */ 21 | public static final int BYTE = 1; 22 | /** 23 | * KB与Byte的倍数 24 | */ 25 | public static final int KB = 1024; 26 | /** 27 | * MB与Byte的倍数 28 | */ 29 | public static final int MB = 1048576; 30 | /** 31 | * GB与Byte的倍数 32 | */ 33 | public static final int GB = 1073741824; 34 | 35 | @IntDef({BYTE, KB, MB, GB}) 36 | @Retention(RetentionPolicy.SOURCE) 37 | public @interface Unit { 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /utilcode/src/main/java/com/blankj/utilcode/constant/RegexConstants.java: -------------------------------------------------------------------------------- 1 | package com.blankj.utilcode.constant; 2 | 3 | /** 4 | *
5 | * author: Blankj 6 | * blog : http://blankj.com 7 | * time : 2017/03/13 8 | * desc : 正则相关常量 9 | *10 | */ 11 | public final class RegexConstants { 12 | 13 | /** 14 | * 正则:手机号(简单) 15 | */ 16 | public static final String REGEX_MOBILE_SIMPLE = "^[1]\\d{10}$"; 17 | /** 18 | * 正则:手机号(精确) 19 | *
移动:134(0-8)、135、136、137、138、139、147、150、151、152、157、158、159、178、182、183、184、187、188
20 | *联通:130、131、132、145、155、156、175、176、185、186
21 | *电信:133、153、173、177、180、181、189
22 | *全球星:1349
23 | *虚拟运营商:170
24 | */ 25 | public static final String REGEX_MOBILE_EXACT = "^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|(147))\\d{8}$"; 26 | /** 27 | * 正则:电话号码 28 | */ 29 | public static final String REGEX_TEL = "^0\\d{2,3}[- ]?\\d{7,8}"; 30 | /** 31 | * 正则:身份证号码15位 32 | */ 33 | public static final String REGEX_ID_CARD15 = "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$"; 34 | /** 35 | * 正则:身份证号码18位 36 | */ 37 | public static final String REGEX_ID_CARD18 = "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9Xx])$"; 38 | /** 39 | * 正则:邮箱 40 | */ 41 | public static final String REGEX_EMAIL = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"; 42 | /** 43 | * 正则:URL 44 | */ 45 | public static final String REGEX_URL = "[a-zA-z]+://[^\\s]*"; 46 | /** 47 | * 正则:汉字 48 | */ 49 | public static final String REGEX_ZH = "^[\\u4e00-\\u9fa5]+$"; 50 | /** 51 | * 正则:用户名,取值范围为a-z,A-Z,0-9,"_",汉字,不能以"_"结尾,用户名必须是6-20位 52 | */ 53 | public static final String REGEX_USERNAME = "^[\\w\\u4e00-\\u9fa5]{6,20}(? 10 | * author: Blankj 11 | * blog : http://blankj.com 12 | * time : 2017/03/13 13 | * desc : 时间相关常量 14 | * 15 | */ 16 | public final class TimeConstants { 17 | 18 | /** 19 | * 毫秒与毫秒的倍数 20 | */ 21 | public static final int MSEC = 1; 22 | /** 23 | * 秒与毫秒的倍数 24 | */ 25 | public static final int SEC = 1000; 26 | /** 27 | * 分与毫秒的倍数 28 | */ 29 | public static final int MIN = 60000; 30 | /** 31 | * 时与毫秒的倍数 32 | */ 33 | public static final int HOUR = 3600000; 34 | /** 35 | * 天与毫秒的倍数 36 | */ 37 | public static final int DAY = 86400000; 38 | 39 | @IntDef({MSEC, SEC, MIN, HOUR, DAY}) 40 | @Retention(RetentionPolicy.SOURCE) 41 | public @interface Unit { 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /utilcode/src/main/java/com/blankj/utilcode/util/CleanUtils.java: -------------------------------------------------------------------------------- 1 | package com.blankj.utilcode.util; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | *7 | * author: Blankj 8 | * blog : http://blankj.com 9 | * time : 2016/09/27 10 | * desc : 清除相关工具类 11 | *12 | */ 13 | public final class CleanUtils { 14 | 15 | private CleanUtils() { 16 | throw new UnsupportedOperationException("u can't instantiate me..."); 17 | } 18 | 19 | /** 20 | * 清除内部缓存 21 | *
/data/data/com.xxx.xxx/cache
22 | * 23 | * @return {@code true}: 清除成功/data/data/com.xxx.xxx/files
32 | * 33 | * @return {@code true}: 清除成功/data/data/com.xxx.xxx/databases
42 | * 43 | * @return {@code true}: 清除成功/data/data/com.xxx.xxx/databases/dbName
52 | * 53 | * @param dbName 数据库名称 54 | * @return {@code true}: 清除成功/data/data/com.xxx.xxx/shared_prefs
63 | * 64 | * @return {@code true}: 清除成功/storage/emulated/0/android/data/com.xxx.xxx/cache
73 | * 74 | * @return {@code true}: 清除成功11 | * author: Blankj 12 | * blog : http://blankj.com 13 | * time : 2016/09/25 14 | * desc : 剪贴板相关工具类 15 | *16 | */ 17 | public final class ClipboardUtils { 18 | 19 | private ClipboardUtils() { 20 | throw new UnsupportedOperationException("u can't instantiate me..."); 21 | } 22 | 23 | /** 24 | * 复制文本到剪贴板 25 | * 26 | * @param text 文本 27 | */ 28 | public static void copyText(CharSequence text) { 29 | ClipboardManager clipboard = (ClipboardManager) Utils.getContext().getSystemService(Context.CLIPBOARD_SERVICE); 30 | clipboard.setPrimaryClip(ClipData.newPlainText("text", text)); 31 | } 32 | 33 | /** 34 | * 获取剪贴板的文本 35 | * 36 | * @return 剪贴板的文本 37 | */ 38 | public static CharSequence getText() { 39 | ClipboardManager clipboard = (ClipboardManager) Utils.getContext().getSystemService(Context.CLIPBOARD_SERVICE); 40 | ClipData clip = clipboard.getPrimaryClip(); 41 | if (clip != null && clip.getItemCount() > 0) { 42 | return clip.getItemAt(0).coerceToText(Utils.getContext()); 43 | } 44 | return null; 45 | } 46 | 47 | /** 48 | * 复制uri到剪贴板 49 | * 50 | * @param uri uri 51 | */ 52 | public static void copyUri(Uri uri) { 53 | ClipboardManager clipboard = (ClipboardManager) Utils.getContext().getSystemService(Context.CLIPBOARD_SERVICE); 54 | clipboard.setPrimaryClip(ClipData.newUri(Utils.getContext().getContentResolver(), "uri", uri)); 55 | } 56 | 57 | /** 58 | * 获取剪贴板的uri 59 | * 60 | * @return 剪贴板的uri 61 | */ 62 | public static Uri getUri() { 63 | ClipboardManager clipboard = (ClipboardManager) Utils.getContext().getSystemService(Context.CLIPBOARD_SERVICE); 64 | ClipData clip = clipboard.getPrimaryClip(); 65 | if (clip != null && clip.getItemCount() > 0) { 66 | return clip.getItemAt(0).getUri(); 67 | } 68 | return null; 69 | } 70 | 71 | /** 72 | * 复制意图到剪贴板 73 | * 74 | * @param intent 意图 75 | */ 76 | public static void copyIntent(Intent intent) { 77 | ClipboardManager clipboard = (ClipboardManager) Utils.getContext().getSystemService(Context.CLIPBOARD_SERVICE); 78 | clipboard.setPrimaryClip(ClipData.newIntent("intent", intent)); 79 | } 80 | 81 | /** 82 | * 获取剪贴板的意图 83 | * 84 | * @return 剪贴板的意图 85 | */ 86 | public static Intent getIntent() { 87 | ClipboardManager clipboard = (ClipboardManager) Utils.getContext().getSystemService(Context.CLIPBOARD_SERVICE); 88 | ClipData clip = clipboard.getPrimaryClip(); 89 | if (clip != null && clip.getItemCount() > 0) { 90 | return clip.getItemAt(0).getIntent(); 91 | } 92 | return null; 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /utilcode/src/main/java/com/blankj/utilcode/util/CloseUtils.java: -------------------------------------------------------------------------------- 1 | package com.blankj.utilcode.util; 2 | 3 | import java.io.Closeable; 4 | import java.io.IOException; 5 | 6 | /** 7 | *
8 | * author: Blankj 9 | * blog : http://blankj.com 10 | * time : 2016/10/09 11 | * desc : 关闭相关工具类 12 | *13 | */ 14 | public final class CloseUtils { 15 | 16 | private CloseUtils() { 17 | throw new UnsupportedOperationException("u can't instantiate me..."); 18 | } 19 | 20 | /** 21 | * 关闭IO 22 | * 23 | * @param closeables closeables 24 | */ 25 | public static void closeIO(Closeable... closeables) { 26 | if (closeables == null) return; 27 | for (Closeable closeable : closeables) { 28 | if (closeable != null) { 29 | try { 30 | closeable.close(); 31 | } catch (IOException e) { 32 | e.printStackTrace(); 33 | } 34 | } 35 | } 36 | } 37 | 38 | /** 39 | * 安静关闭IO 40 | * 41 | * @param closeables closeables 42 | */ 43 | public static void closeIOQuietly(Closeable... closeables) { 44 | if (closeables == null) return; 45 | for (Closeable closeable : closeables) { 46 | if (closeable != null) { 47 | try { 48 | closeable.close(); 49 | } catch (IOException ignored) { 50 | } 51 | } 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /utilcode/src/main/java/com/blankj/utilcode/util/EmptyUtils.java: -------------------------------------------------------------------------------- 1 | package com.blankj.utilcode.util; 2 | 3 | import android.os.Build; 4 | import android.util.SparseArray; 5 | import android.util.SparseBooleanArray; 6 | import android.util.SparseIntArray; 7 | import android.util.SparseLongArray; 8 | 9 | import java.lang.reflect.Array; 10 | import java.util.Collection; 11 | import java.util.Map; 12 | 13 | /** 14 | *
15 | * author: Blankj 16 | * blog : http://blankj.com 17 | * time : 2016/09/28 18 | * desc : 判空相关工具类 19 | *20 | */ 21 | public final class EmptyUtils { 22 | 23 | private EmptyUtils() { 24 | throw new UnsupportedOperationException("u can't instantiate me..."); 25 | } 26 | 27 | /** 28 | * 判断对象是否为空 29 | * 30 | * @param obj 对象 31 | * @return {@code true}: 为空
10 | * author: Blankj 11 | * blog : http://blankj.com 12 | * time : 16/11/01 13 | * desc : Handler相关工具类 14 | *15 | */ 16 | public final class HandlerUtils { 17 | 18 | private HandlerUtils() { 19 | throw new UnsupportedOperationException("u can't instantiate me..."); 20 | } 21 | 22 | public static class HandlerHolder extends Handler { 23 | WeakReference
12 | * author: Blankj 13 | * blog : http://blankj.com 14 | * time : 2016/08/02 15 | * desc : 键盘相关工具类 16 | *17 | */ 18 | public final class KeyboardUtils { 19 | 20 | private KeyboardUtils() { 21 | throw new UnsupportedOperationException("u can't instantiate me..."); 22 | } 23 | 24 | /* 25 | 避免输入法面板遮挡 26 |
在manifest.xml中activity中设置
27 |android:windowSoftInputMode="adjustPan"
28 | */ 29 | 30 | /** 31 | * 动态隐藏软键盘 32 | * 33 | * @param activity activity 34 | */ 35 | public static void hideSoftInput(Activity activity) { 36 | View view = activity.getCurrentFocus(); 37 | if (view == null) view = new View(activity); 38 | InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); 39 | if (imm == null) return; 40 | imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 41 | } 42 | 43 | /** 44 | * 动态隐藏软键盘 45 | * 46 | * @param context 上下文 47 | * @param view 视图 48 | */ 49 | public static void hideSoftInput(Context context, View view) { 50 | InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 51 | if (imm == null) return; 52 | imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 53 | } 54 | 55 | /** 56 | * 点击屏幕空白区域隐藏软键盘 57 | *根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘
58 | *需重写dispatchTouchEvent
59 | *参照以下注释代码
60 | */ 61 | public static void clickBlankArea2HideSoftInput() { 62 | Log.d("tips", "U should copy the following code."); 63 | /* 64 | @Override 65 | public boolean dispatchTouchEvent(MotionEvent ev) { 66 | if (ev.getAction() == MotionEvent.ACTION_DOWN) { 67 | View v = getCurrentFocus(); 68 | if (isShouldHideKeyboard(v, ev)) { 69 | InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 70 | imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 71 | } 72 | } 73 | return super.dispatchTouchEvent(ev); 74 | } 75 | 76 | // 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘 77 | private boolean isShouldHideKeyboard(View v, MotionEvent event) { 78 | if (v != null && (v instanceof EditText)) { 79 | int[] l = {0, 0}; 80 | v.getLocationInWindow(l); 81 | int left = l[0], 82 | top = l[1], 83 | bottom = top + v.getHeight(), 84 | right = left + v.getWidth(); 85 | return !(event.getX() > left && event.getX() < right 86 | && event.getY() > top && event.getY() < bottom); 87 | } 88 | return false; 89 | } 90 | */ 91 | } 92 | 93 | /** 94 | * 动态显示软键盘 95 | * 96 | * @param edit 输入框 97 | */ 98 | public static void showSoftInput(EditText edit) { 99 | edit.setFocusable(true); 100 | edit.setFocusableInTouchMode(true); 101 | edit.requestFocus(); 102 | InputMethodManager imm = (InputMethodManager) Utils.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 103 | if (imm == null) return; 104 | imm.showSoftInput(edit, 0); 105 | } 106 | 107 | /** 108 | * 切换键盘显示与否状态 109 | */ 110 | public static void toggleSoftInput() { 111 | InputMethodManager imm = (InputMethodManager) Utils.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 112 | if (imm == null) return; 113 | imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); 114 | } 115 | } -------------------------------------------------------------------------------- /utilcode/src/main/java/com/blankj/utilcode/util/PermissionUtils.java: -------------------------------------------------------------------------------- 1 | package com.blankj.utilcode.util; 2 | 3 | import android.annotation.TargetApi; 4 | import android.app.Activity; 5 | import android.content.Context; 6 | import android.content.pm.PackageManager; 7 | import android.os.Build; 8 | import android.support.v4.app.ActivityCompat; 9 | import android.support.v4.content.ContextCompat; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | /** 15 | *16 | * author: Blankj 17 | * blog : http://blankj.com 18 | * time : 2017/04/16 19 | * desc : 权限相关工具类 20 | *21 | */ 22 | public final class PermissionUtils { 23 | 24 | private static int mRequestCode = -1; 25 | 26 | private static OnPermissionListener mOnPermissionListener; 27 | 28 | public interface OnPermissionListener { 29 | 30 | void onPermissionGranted(); 31 | 32 | void onPermissionDenied(String[] deniedPermissions); 33 | } 34 | 35 | public abstract static class RationaleHandler { 36 | private Context context; 37 | private int requestCode; 38 | private String[] permissions; 39 | 40 | protected abstract void showRationale(); 41 | 42 | void showRationale(Context context, int requestCode, String[] permissions) { 43 | this.context = context; 44 | this.requestCode = requestCode; 45 | this.permissions = permissions; 46 | showRationale(); 47 | } 48 | 49 | @TargetApi(Build.VERSION_CODES.M) 50 | public void requestPermissionsAgain() { 51 | ((Activity) context).requestPermissions(permissions, requestCode); 52 | } 53 | } 54 | 55 | @TargetApi(Build.VERSION_CODES.M) 56 | public static void requestPermissions(Context context, int requestCode 57 | , String[] permissions, OnPermissionListener listener) { 58 | requestPermissions(context, requestCode, permissions, listener, null); 59 | } 60 | 61 | @TargetApi(Build.VERSION_CODES.M) 62 | public static void requestPermissions(Context context, int requestCode 63 | , String[] permissions, OnPermissionListener listener, RationaleHandler handler) { 64 | if (context instanceof Activity) { 65 | mRequestCode = requestCode; 66 | mOnPermissionListener = listener; 67 | String[] deniedPermissions = getDeniedPermissions(context, permissions); 68 | if (deniedPermissions.length > 0) { 69 | boolean rationale = shouldShowRequestPermissionRationale(context, deniedPermissions); 70 | if (rationale && handler != null) { 71 | handler.showRationale(context, requestCode, deniedPermissions); 72 | } else { 73 | ((Activity) context).requestPermissions(deniedPermissions, requestCode); 74 | } 75 | } else { 76 | if (mOnPermissionListener != null) 77 | mOnPermissionListener.onPermissionGranted(); 78 | } 79 | } else { 80 | throw new RuntimeException("Context must be an Activity"); 81 | } 82 | } 83 | 84 | /** 85 | * 请求权限结果,对应Activity中onRequestPermissionsResult()方法。 86 | */ 87 | public static void onRequestPermissionsResult(Activity context, int requestCode, String[] permissions, int[] 88 | grantResults) { 89 | if (mRequestCode != -1 && requestCode == mRequestCode) { 90 | if (mOnPermissionListener != null) { 91 | String[] deniedPermissions = getDeniedPermissions(context, permissions); 92 | if (deniedPermissions.length > 0) { 93 | mOnPermissionListener.onPermissionDenied(deniedPermissions); 94 | } else { 95 | mOnPermissionListener.onPermissionGranted(); 96 | } 97 | } 98 | } 99 | } 100 | 101 | /** 102 | * 获取请求权限中需要授权的权限 103 | */ 104 | private static String[] getDeniedPermissions(Context context, String[] permissions) { 105 | List
15 | * author: Blankj 16 | * blog : http://blankj.com 17 | * time : 2016/08/11 18 | * desc : SD卡相关工具类 19 | *20 | */ 21 | public final class SDCardUtils { 22 | 23 | private SDCardUtils() { 24 | throw new UnsupportedOperationException("u can't instantiate me..."); 25 | } 26 | 27 | /** 28 | * 判断SD卡是否可用 29 | * 30 | * @return true : 可用
先用shell,shell失败再普通方法获取,一般是/storage/emulated/0/
39 | * 40 | * @return SD卡路径 41 | */ 42 | public static String getSDCardPath() { 43 | if (!isSDCardEnable()) return null; 44 | String cmd = "cat /proc/mounts"; 45 | Runtime run = Runtime.getRuntime(); 46 | BufferedReader bufferedReader = null; 47 | try { 48 | Process p = run.exec(cmd); 49 | bufferedReader = new BufferedReader(new InputStreamReader(new BufferedInputStream(p.getInputStream()))); 50 | String lineStr; 51 | while ((lineStr = bufferedReader.readLine()) != null) { 52 | if (lineStr.contains("sdcard") && lineStr.contains(".android_secure")) { 53 | String[] strArray = lineStr.split(" "); 54 | if (strArray.length >= 5) { 55 | return strArray[1].replace("/.android_secure", "") + File.separator; 56 | } 57 | } 58 | if (p.waitFor() != 0 && p.exitValue() == 1) { 59 | break; 60 | } 61 | } 62 | } catch (Exception e) { 63 | e.printStackTrace(); 64 | } finally { 65 | CloseUtils.closeIO(bufferedReader); 66 | } 67 | return Environment.getExternalStorageDirectory().getPath() + File.separator; 68 | } 69 | 70 | /** 71 | * 获取SD卡data路径 72 | * 73 | * @return SD卡data路径 74 | */ 75 | public static String getDataPath() { 76 | if (!isSDCardEnable()) return null; 77 | return Environment.getExternalStorageDirectory().getPath() + File.separator + "data" + File.separator; 78 | } 79 | 80 | /** 81 | * 获取SD卡剩余空间 82 | * 83 | * @return SD卡剩余空间 84 | */ 85 | @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) 86 | public static String getFreeSpace() { 87 | if (!isSDCardEnable()) return null; 88 | StatFs stat = new StatFs(getSDCardPath()); 89 | long blockSize, availableBlocks; 90 | availableBlocks = stat.getAvailableBlocksLong(); 91 | blockSize = stat.getBlockSizeLong(); 92 | return ConvertUtils.byte2FitMemorySize(availableBlocks * blockSize); 93 | } 94 | 95 | /** 96 | * 获取SD卡信息 97 | * 98 | * @return SDCardInfo 99 | */ 100 | @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) 101 | public static String getSDCardInfo() { 102 | if (!isSDCardEnable()) return null; 103 | SDCardInfo sd = new SDCardInfo(); 104 | sd.isExist = true; 105 | StatFs sf = new StatFs(Environment.getExternalStorageDirectory().getPath()); 106 | sd.totalBlocks = sf.getBlockCountLong(); 107 | sd.blockByteSize = sf.getBlockSizeLong(); 108 | sd.availableBlocks = sf.getAvailableBlocksLong(); 109 | sd.availableBytes = sf.getAvailableBytes(); 110 | sd.freeBlocks = sf.getFreeBlocksLong(); 111 | sd.freeBytes = sf.getFreeBytes(); 112 | sd.totalBytes = sf.getTotalBytes(); 113 | return sd.toString(); 114 | } 115 | 116 | public static class SDCardInfo { 117 | boolean isExist; 118 | long totalBlocks; 119 | long freeBlocks; 120 | long availableBlocks; 121 | long blockByteSize; 122 | long totalBytes; 123 | long freeBytes; 124 | long availableBytes; 125 | 126 | @Override 127 | public String toString() { 128 | return "isExist=" + isExist + 129 | "\ntotalBlocks=" + totalBlocks + 130 | "\nfreeBlocks=" + freeBlocks + 131 | "\navailableBlocks=" + availableBlocks + 132 | "\nblockByteSize=" + blockByteSize + 133 | "\ntotalBytes=" + totalBytes + 134 | "\nfreeBytes=" + freeBytes + 135 | "\navailableBytes=" + availableBytes; 136 | } 137 | } 138 | } -------------------------------------------------------------------------------- /utilcode/src/main/java/com/blankj/utilcode/util/SizeUtils.java: -------------------------------------------------------------------------------- 1 | package com.blankj.utilcode.util; 2 | 3 | import android.util.DisplayMetrics; 4 | import android.util.TypedValue; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | 8 | /** 9 | *10 | * author: Blankj 11 | * blog : http://blankj.com 12 | * time : 2016/08/02 13 | * desc : 尺寸相关工具类 14 | *15 | */ 16 | public final class SizeUtils { 17 | 18 | private SizeUtils() { 19 | throw new UnsupportedOperationException("u can't instantiate me..."); 20 | } 21 | 22 | /** 23 | * dp转px 24 | * 25 | * @param dpValue dp值 26 | * @return px值 27 | */ 28 | public static int dp2px(float dpValue) { 29 | final float scale = Utils.getContext().getResources().getDisplayMetrics().density; 30 | return (int) (dpValue * scale + 0.5f); 31 | } 32 | 33 | /** 34 | * px转dp 35 | * 36 | * @param pxValue px值 37 | * @return dp值 38 | */ 39 | public static int px2dp( float pxValue) { 40 | final float scale = Utils.getContext().getResources().getDisplayMetrics().density; 41 | return (int) (pxValue / scale + 0.5f); 42 | } 43 | 44 | /** 45 | * sp转px 46 | * 47 | * @param spValue sp值 48 | * @return px值 49 | */ 50 | public static int sp2px(float spValue) { 51 | final float fontScale = Utils.getContext().getResources().getDisplayMetrics().scaledDensity; 52 | return (int) (spValue * fontScale + 0.5f); 53 | } 54 | 55 | /** 56 | * px转sp 57 | * 58 | * @param pxValue px值 59 | * @return sp值 60 | */ 61 | public static int px2sp( float pxValue) { 62 | final float fontScale = Utils.getContext().getResources().getDisplayMetrics().scaledDensity; 63 | return (int) (pxValue / fontScale + 0.5f); 64 | } 65 | 66 | /** 67 | * 各种单位转换 68 | *
该方法存在于TypedValue
69 | * 70 | * @param unit 单位 71 | * @param value 值 72 | * @param metrics DisplayMetrics 73 | * @return 转换结果 74 | */ 75 | public static float applyDimension(int unit, float value, DisplayMetrics metrics) { 76 | switch (unit) { 77 | case TypedValue.COMPLEX_UNIT_PX: 78 | return value; 79 | case TypedValue.COMPLEX_UNIT_DIP: 80 | return value * metrics.density; 81 | case TypedValue.COMPLEX_UNIT_SP: 82 | return value * metrics.scaledDensity; 83 | case TypedValue.COMPLEX_UNIT_PT: 84 | return value * metrics.xdpi * (1.0f / 72); 85 | case TypedValue.COMPLEX_UNIT_IN: 86 | return value * metrics.xdpi; 87 | case TypedValue.COMPLEX_UNIT_MM: 88 | return value * metrics.xdpi * (1.0f / 25.4f); 89 | } 90 | return 0; 91 | } 92 | 93 | /** 94 | * 在onCreate中获取视图的尺寸 95 | *需回调onGetSizeListener接口,在onGetSize中获取view宽高
96 | *用法示例如下所示
97 | *98 | * SizeUtils.forceGetViewSize(view, new SizeUtils.onGetSizeListener() { 99 | * Override 100 | * public void onGetSize(View view) { 101 | * view.getWidth(); 102 | * } 103 | * }); 104 | *105 | * 106 | * @param view 视图 107 | * @param listener 监听器 108 | */ 109 | public static void forceGetViewSize(final View view, final onGetSizeListener listener) { 110 | view.post(new Runnable() { 111 | @Override 112 | public void run() { 113 | if (listener != null) { 114 | listener.onGetSize(view); 115 | } 116 | } 117 | }); 118 | } 119 | 120 | /** 121 | * 获取到View尺寸的监听 122 | */ 123 | public interface onGetSizeListener { 124 | void onGetSize(View view); 125 | } 126 | 127 | /** 128 | * 测量视图尺寸 129 | * 130 | * @param view 视图 131 | * @return arr[0]: 视图宽度, arr[1]: 视图高度 132 | */ 133 | public static int[] measureView(View view) { 134 | ViewGroup.LayoutParams lp = view.getLayoutParams(); 135 | if (lp == null) { 136 | lp = new ViewGroup.LayoutParams( 137 | ViewGroup.LayoutParams.MATCH_PARENT, 138 | ViewGroup.LayoutParams.WRAP_CONTENT 139 | ); 140 | } 141 | int widthSpec = ViewGroup.getChildMeasureSpec(0, 0, lp.width); 142 | int lpHeight = lp.height; 143 | int heightSpec; 144 | if (lpHeight > 0) { 145 | heightSpec = View.MeasureSpec.makeMeasureSpec(lpHeight, View.MeasureSpec.EXACTLY); 146 | } else { 147 | heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 148 | } 149 | view.measure(widthSpec, heightSpec); 150 | return new int[]{view.getMeasuredWidth(), view.getMeasuredHeight()}; 151 | } 152 | 153 | /** 154 | * 获取测量视图宽度 155 | * 156 | * @param view 视图 157 | * @return 视图宽度 158 | */ 159 | public static int getMeasuredWidth(View view) { 160 | return measureView(view)[0]; 161 | } 162 | 163 | /** 164 | * 获取测量视图高度 165 | * 166 | * @param view 视图 167 | * @return 视图高度 168 | */ 169 | public static int getMeasuredHeight(View view) { 170 | return measureView(view)[1]; 171 | } 172 | } 173 | -------------------------------------------------------------------------------- /utilcode/src/main/java/com/blankj/utilcode/util/Utils.java: -------------------------------------------------------------------------------- 1 | package com.blankj.utilcode.util; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.content.Context; 5 | 6 | /** 7 | *
8 | * author: Blankj 9 | * blog : http://blankj.com 10 | * time : 16/12/08 11 | * desc : Utils初始化相关 12 | *13 | */ 14 | public final class Utils { 15 | 16 | @SuppressLint("StaticFieldLeak") 17 | private static Context context; 18 | 19 | private Utils() { 20 | throw new UnsupportedOperationException("u can't instantiate me..."); 21 | } 22 | 23 | /** 24 | * 初始化工具类 25 | * 26 | * @param context 上下文 27 | */ 28 | public static void init(Context context) { 29 | Utils.context = context.getApplicationContext(); 30 | } 31 | 32 | /** 33 | * 获取ApplicationContext 34 | * 35 | * @return ApplicationContext 36 | */ 37 | public static Context getContext() { 38 | if (context != null) return context; 39 | throw new NullPointerException("u should init first"); 40 | } 41 | } -------------------------------------------------------------------------------- /utilcode/src/main/java/com/blankj/utilcode/util/VibrationUtils.java: -------------------------------------------------------------------------------- 1 | package com.blankj.utilcode.util; 2 | 3 | /** 4 | *
5 | * author: Blankj 6 | * blog : http://blankj.com 7 | * time : 2016/09/29 8 | * desc : 震动相关工具类 9 | *10 | */ 11 | public final class VibrationUtils { 12 | 13 | // private VibrationUtils() { 14 | // throw new UnsupportedOperationException("u can't instantiate me..."); 15 | // } 16 | // 17 | // /** 18 | // * 震动 19 | // *
需添加权限 {@code
15 | * author: Blankj 16 | * blog : http://blankj.com 17 | * time : 2016/09/26 18 | * desc : ClipboardUtils单元测试 19 | *20 | */ 21 | @RunWith(RobolectricTestRunner.class) 22 | @Config(manifest = Config.NONE) 23 | public class ClipboardUtilsTest { 24 | 25 | @Before 26 | public void setUp() throws Exception { 27 | TestUtils.init(); 28 | } 29 | 30 | @Test 31 | public void testText() throws Exception { 32 | ClipboardUtils.copyText("test"); 33 | assertThat(ClipboardUtils.getText()).isEqualTo("test"); 34 | } 35 | 36 | @Test 37 | public void testUri() throws Exception { 38 | ClipboardUtils.copyUri(Uri.parse("http://www.blankj.com")); 39 | System.out.println((ClipboardUtils.getUri())); 40 | } 41 | 42 | @Test 43 | public void testIntent() throws Exception { 44 | ClipboardUtils.copyIntent(IntentUtils.getShareTextIntent("test")); 45 | System.out.println(ClipboardUtils.getText()); 46 | } 47 | } -------------------------------------------------------------------------------- /utilcode/src/test/java/com/blankj/utilcode/util/ConvertUtilsTest.java: -------------------------------------------------------------------------------- 1 | package com.blankj.utilcode.util; 2 | 3 | 4 | import com.blankj.utilcode.constant.MemoryConstants; 5 | import com.blankj.utilcode.constant.TimeConstants; 6 | 7 | import org.junit.Test; 8 | 9 | import static com.blankj.utilcode.util.ConvertUtils.*; 10 | import static com.google.common.truth.Truth.assertThat; 11 | 12 | 13 | /** 14 | *
15 | * author: Blankj 16 | * blog : http://blankj.com 17 | * time : 2016/08/13 18 | * desc : ConvertUtils单元测试 19 | *20 | */ 21 | public class ConvertUtilsTest { 22 | 23 | byte[] mBytes = new byte[]{0x00, 0x08, (byte) 0xdb, 0x33, 0x45, (byte) 0xab, 0x02, 0x23}; 24 | String hexString = "0008DB3345AB0223"; 25 | 26 | @Test 27 | public void testBytes2HexString() throws Exception { 28 | assertThat(bytes2HexString(mBytes)).isEqualTo(hexString); 29 | } 30 | 31 | @Test 32 | public void testHexString2Bytes() throws Exception { 33 | assertThat(hexString2Bytes(hexString)).isEqualTo(mBytes); 34 | } 35 | 36 | char[] mChars1 = new char[]{'0', '1', '2'}; 37 | byte[] mBytes1 = new byte[]{48, 49, 50}; 38 | 39 | @Test 40 | public void testChars2Bytes() throws Exception { 41 | assertThat(chars2Bytes(mChars1)).isEqualTo(mBytes1); 42 | } 43 | 44 | @Test 45 | public void testBytes2Chars() throws Exception { 46 | assertThat(bytes2Chars(mBytes1)).isEqualTo(mChars1); 47 | } 48 | 49 | @Test 50 | public void testByte2Unit() throws Exception { 51 | assertThat(byte2MemorySize(MemoryConstants.GB, MemoryConstants.MB) - 1024).isWithin(0.001); 52 | } 53 | 54 | @Test 55 | public void testByte2FitSize() throws Exception { 56 | assertThat(byte2FitMemorySize(1024 * 1024 * 3 + 1024 * 100)).isEqualTo("3.098MB"); 57 | } 58 | 59 | @Test 60 | public void testMillis2FitTimeSpan() throws Exception { 61 | long millis = TimeConstants.DAY * 6 + TimeConstants.HOUR * 6 62 | + TimeConstants.MIN * 6 + TimeConstants.SEC * 6 + 6; 63 | System.out.println(millis2FitTimeSpan(millis, 7)); 64 | System.out.println(millis2FitTimeSpan(millis, 4)); 65 | System.out.println(millis2FitTimeSpan(millis, 3)); 66 | System.out.println(millis2FitTimeSpan(millis * 4, 5)); 67 | } 68 | 69 | @Test 70 | public void testBytes2Bits() throws Exception { 71 | System.out.println(bytes2Bits(new byte[]{0x7F, (byte) 0xFA})); 72 | } 73 | 74 | @Test 75 | public void testBits2Bytes() throws Exception { 76 | System.out.println(bytes2HexString(bits2Bytes("111111111111010"))); 77 | } 78 | 79 | @Test 80 | public void testInputStream2BytesAndBytes2InputStream() throws Exception { 81 | String string = "this is test string"; 82 | assertThat(new String(inputStream2Bytes( 83 | bytes2InputStream(string.getBytes("UTF-8"))))) 84 | .isEqualTo(string); 85 | } 86 | 87 | @Test 88 | public void testInputStream2StringAndString2InputStream() throws Exception { 89 | String string = "this is test string"; 90 | assertThat(inputStream2String( 91 | string2InputStream(string, "UTF-8") 92 | , "UTF-8")).isEqualTo(string); 93 | } 94 | } -------------------------------------------------------------------------------- /utilcode/src/test/java/com/blankj/utilcode/util/DogeTest.java: -------------------------------------------------------------------------------- 1 | package com.blankj.utilcode.util; 2 | 3 | import java.io.File; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | import java.util.Locale; 7 | 8 | /** 9 | *
10 | * author: Blankj 11 | * blog : http://blankj.com 12 | * time : 2016/11/23 13 | * desc : 生成Doge的README 14 | *15 | */ 16 | public class DogeTest { 17 | 18 | private static List
22 | * author: Blankj 23 | * blog : http://blankj.com 24 | * time : 2016/09/28 25 | * desc : EmptyUtils单元测试 26 | *27 | */ 28 | @RunWith(RobolectricTestRunner.class) 29 | @Config(manifest = Config.NONE , sdk = 23) 30 | public class EmptyUtilsTest { 31 | 32 | @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) 33 | @Test 34 | public void isEmpty() throws Exception { 35 | String string = ""; 36 | String string1 = " "; 37 | int[][] arr = new int[][]{}; 38 | int[] arr1 = null; 39 | LinkedList
13 | * author: Blankj 14 | * blog : http://blankj.com 15 | * time : 2016/08/12 16 | * desc : EncodeUtils单元测试 17 | *18 | */ 19 | @RunWith(RobolectricTestRunner.class) 20 | @Config(manifest = Config.NONE) 21 | public class EncodeUtilsTest { 22 | 23 | String urlEncodeString = "%E5%93%88%E5%93%88%E5%93%88"; 24 | String html = "" + 25 | "" + 26 | "
body 元素的内容会显示在浏览器中。
" + 30 | "title 元素的内容会显示在浏览器的标题栏中。
" + 31 | "" + 32 | ""; 33 | String encodeHtml = "<html><head><title>我的第一个 HTML 页面</title></head><body><p>body 元素的内容会显示在浏览器中。</p><p>title 元素的内容会显示在浏览器的标题栏中。</p></body></html>"; 34 | 35 | @Test 36 | public void testUrlEncode() throws Exception { 37 | assertThat(urlEncode("哈哈哈")).isEqualTo(urlEncodeString); 38 | assertThat(urlEncode("哈哈哈", "UTF-8")).isEqualTo(urlEncodeString); 39 | } 40 | 41 | @Test 42 | public void testUrlDecode() throws Exception { 43 | assertThat(urlDecode(urlEncodeString)).isEqualTo("哈哈哈"); 44 | assertThat(urlDecode(urlEncodeString, "UTF-8")).isEqualTo("哈哈哈"); 45 | } 46 | 47 | @Test 48 | public void testBase64EncodeAndDecode() throws Exception { 49 | assertThat(base64Decode(base64Encode("blankj"))) 50 | .isEqualTo("blankj".getBytes()); 51 | assertThat(base64Decode(base64Encode2String("blankj".getBytes()))) 52 | .isEqualTo("blankj".getBytes()); 53 | assertThat(base64Encode2String("blankj".getBytes())) 54 | .isEqualTo("Ymxhbmtq"); 55 | assertThat(base64Encode("blankj".getBytes())) 56 | .isEqualTo("Ymxhbmtq".getBytes()); 57 | } 58 | 59 | @Test 60 | public void testHtmlEncode() throws Exception { 61 | assertThat(htmlEncode(html)).isEqualTo(encodeHtml); 62 | } 63 | 64 | @Test 65 | public void testHtmlDecode() throws Exception { 66 | assertThat(htmlDecode(encodeHtml).toString()).isEqualTo(html); 67 | } 68 | } -------------------------------------------------------------------------------- /utilcode/src/test/java/com/blankj/utilcode/util/FileIOUtilsTest.java: -------------------------------------------------------------------------------- 1 | package com.blankj.utilcode.util; 2 | 3 | import org.junit.Test; 4 | 5 | import static com.blankj.utilcode.util.TestUtils.FILE_SEP; 6 | 7 | /** 8 | *9 | * author: Blankj 10 | * blog : http://blankj.com 11 | * time : 2017/05/24 12 | * desc : 13 | *14 | */ 15 | public class FileIOUtilsTest { 16 | 17 | String path = TestUtils.TEST_PATH + FILE_SEP + "file" + FILE_SEP; 18 | String path1 = TestUtils.TEST_PATH + FILE_SEP + "file1" + FILE_SEP; 19 | 20 | @Test 21 | public void writeFileFromIS() throws Exception { 22 | // assertTrue(FileIOUtils.writeFileFromIS(path + "NEW.txt", new FileInputStream(path + "UTF8.txt"), false)); 23 | // assertTrue(FileIOUtils.writeFileFromIS(path + "NEW.txt", new FileInputStream(path + "UTF8.txt"), true)); 24 | } 25 | 26 | @Test 27 | public void writeFileFromBytes() throws Exception { 28 | // String p = path + "test.txt"; 29 | // String p1 = path + "copy.zip"; 30 | // byte[] data = new byte[(1 << 20) * 100]; 31 | // long st, end; 32 | // FileUtils.deleteFile(p); 33 | // 34 | // st = System.currentTimeMillis(); 35 | // for (int i = 0; i < 100; i++) { 36 | // FileIOUtils.writeFileFromBytesByStream(p, data, true); 37 | // } 38 | // end = System.currentTimeMillis(); 39 | // System.out.println(end - st); 40 | // FileUtils.deleteFile(p); 41 | // 42 | // st = System.currentTimeMillis(); 43 | // for (int i = 0; i < 100; i++) { 44 | // FileIOUtils.writeFileFromBytesByChannel(p, data, true); 45 | // } 46 | // end = System.currentTimeMillis(); 47 | // System.out.println(end - st); 48 | // FileUtils.deleteFile(p); 49 | // 50 | // st = System.currentTimeMillis(); 51 | // for (int i = 0; i < 100; i++) { 52 | // FileIOUtils.writeFileFromBytesByMap(p, data, true, false); 53 | // } 54 | // end = System.currentTimeMillis(); 55 | // System.out.println(end - st); 56 | // FileUtils.deleteFile(p); 57 | } 58 | 59 | @Test 60 | public void writeFileFromString() throws Exception { 61 | 62 | } 63 | 64 | @Test 65 | public void readFile2List() throws Exception { 66 | 67 | } 68 | 69 | @Test 70 | public void readFile2String() throws Exception { 71 | 72 | } 73 | 74 | @Test 75 | public void readFile2Bytes() throws Exception { 76 | // String p = path + "test.app.zip"; 77 | // long st, end; 78 | // st = System.currentTimeMillis(); 79 | // FileIOUtils.readFile2BytesByStream(p); 80 | // end = System.currentTimeMillis(); 81 | // System.out.println(end - st); 82 | // st = System.currentTimeMillis(); 83 | // FileIOUtils.readFile2BytesByChannel(p); 84 | // end = System.currentTimeMillis(); 85 | // System.out.println(end - st); 86 | // st = System.currentTimeMillis(); 87 | // FileIOUtils.readFile2BytesByMap(p); 88 | // end = System.currentTimeMillis(); 89 | // System.out.println(end - st); 90 | } 91 | 92 | } -------------------------------------------------------------------------------- /utilcode/src/test/java/com/blankj/utilcode/util/PinyinUtilsTest.java: -------------------------------------------------------------------------------- 1 | package com.blankj.utilcode.util; 2 | 3 | import org.junit.Before; 4 | import org.junit.Test; 5 | 6 | /** 7 | *
8 | * author: Blankj 9 | * blog : http://blankj.com 10 | * time : 16/11/16 11 | * desc : PinyinUtils单元测试 12 | *13 | */ 14 | public class PinyinUtilsTest { 15 | 16 | @Before 17 | public void setUp() throws Exception { 18 | PinyinUtils.ccs2Pinyin(""); 19 | } 20 | 21 | @Test 22 | public void getPinyinFirstLetter() throws Exception { 23 | System.out.println("单: " + PinyinUtils.getPinyinFirstLetter("单")); 24 | System.out.println("元: " + PinyinUtils.getPinyinFirstLetter("元")); 25 | System.out.println("測: " + PinyinUtils.getPinyinFirstLetter("測")); 26 | System.out.println("試: " + PinyinUtils.getPinyinFirstLetter("試")); 27 | } 28 | 29 | @Test 30 | public void getPinyinFirstLetters() throws Exception { 31 | System.out.println("單元測試: " + PinyinUtils.getPinyinFirstLetters("單元測試", ",")); 32 | } 33 | 34 | @Test 35 | public void ccs2Pinyin() throws Exception { 36 | long t = System.currentTimeMillis(); 37 | System.out.println("已初始化的汉字转拼音用时测试: " + PinyinUtils.ccs2Pinyin("已初始化的汉字转拼音用时测试", " ")); 38 | System.out.printf("用时: %dms\n", System.currentTimeMillis() - t); 39 | } 40 | 41 | @Test 42 | public void getSurnamePinyin() throws Exception { 43 | System.out.println("澹台: " + PinyinUtils.getSurnamePinyin("澹台")); 44 | System.out.println("尉迟: " + PinyinUtils.getSurnamePinyin("尉迟")); 45 | System.out.println("万俟: " + PinyinUtils.getSurnamePinyin("万俟")); 46 | System.out.println("单于: " + PinyinUtils.getSurnamePinyin("单于")); 47 | String surnames = "乐乘乜仇会便区单参句召员宓弗折曾朴查洗盖祭种秘繁缪能蕃覃解谌适都阿难黑"; 48 | int size = surnames.length(); 49 | long t = System.currentTimeMillis(); 50 | for (int i = 0; i < size; ++i) { 51 | String surname = String.valueOf(surnames.charAt(i)); 52 | System.out.printf("%s 正确: %-6s 首字母: %-6s 错误: %-6s\n", 53 | surname, 54 | PinyinUtils.getSurnamePinyin(surname), 55 | PinyinUtils.getSurnameFirstLetter(surname), 56 | PinyinUtils.ccs2Pinyin(surname)); 57 | } 58 | System.out.printf("用时: %dms\n", System.currentTimeMillis() - t); 59 | } 60 | } -------------------------------------------------------------------------------- /utilcode/src/test/java/com/blankj/utilcode/util/RegexUtilsTest.java: -------------------------------------------------------------------------------- 1 | package com.blankj.utilcode.util; 2 | 3 | import org.junit.Test; 4 | 5 | import java.util.Arrays; 6 | 7 | import static com.blankj.utilcode.util.RegexUtils.*; 8 | import static com.google.common.truth.Truth.assertThat; 9 | 10 | /** 11 | *
12 | * author: Blankj 13 | * blog : http://blankj.com 14 | * time : 2016/08/16 15 | * desc : RegularUtils单元测试 16 | *17 | */ 18 | public class RegexUtilsTest { 19 | 20 | @Test 21 | public void testIsMobileSimple() throws Exception { 22 | assertThat(isMobileSimple("11111111111")).isTrue(); 23 | } 24 | 25 | @Test 26 | public void testIsMobileExact() throws Exception { 27 | assertThat(isMobileExact("11111111111")).isFalse(); 28 | assertThat(isMobileExact("13888880000")).isTrue(); 29 | } 30 | 31 | @Test 32 | public void testIsTel() throws Exception { 33 | assertThat(isTel("033-88888888")).isTrue(); 34 | assertThat(isTel("033-7777777")).isTrue(); 35 | assertThat(isTel("0444-88888888")).isTrue(); 36 | assertThat(isTel("0444-7777777")).isTrue(); 37 | assertThat(isTel("033 88888888")).isTrue(); 38 | assertThat(isTel("033 7777777")).isTrue(); 39 | assertThat(isTel("0444 88888888")).isTrue(); 40 | assertThat(isTel("0444 7777777")).isTrue(); 41 | assertThat(isTel("03388888888")).isTrue(); 42 | assertThat(isTel("0337777777")).isTrue(); 43 | assertThat(isTel("044488888888")).isTrue(); 44 | assertThat(isTel("04447777777")).isTrue(); 45 | 46 | assertThat(isTel("133-88888888")).isFalse(); 47 | assertThat(isTel("033-666666")).isFalse(); 48 | assertThat(isTel("0444-999999999")).isFalse(); 49 | } 50 | 51 | @Test 52 | public void testIsIDCard() throws Exception { 53 | assertThat(isIDCard18("33698418400112523x")).isTrue(); 54 | assertThat(isIDCard18("336984184001125233")).isTrue(); 55 | assertThat(isIDCard18("336984184021125233")).isFalse(); 56 | } 57 | 58 | @Test 59 | public void testIsEmail() throws Exception { 60 | assertThat(isEmail("blankj@qq.com")).isTrue(); 61 | assertThat(isEmail("blankj@qq")).isFalse(); 62 | } 63 | 64 | @Test 65 | public void testIsURL() throws Exception { 66 | assertThat(isURL("http://blankj.com")).isTrue(); 67 | assertThat(isURL("https:blank")).isFalse(); 68 | } 69 | 70 | @Test 71 | public void testIsChz() throws Exception { 72 | assertThat(isZh("我")).isTrue(); 73 | assertThat(isZh("wo")).isFalse(); 74 | } 75 | 76 | @Test 77 | public void testIsUsername() throws Exception { 78 | assertThat(isUsername("小明233333")).isTrue(); 79 | assertThat(isUsername("小明")).isFalse(); 80 | assertThat(isUsername("小明233333_")).isFalse(); 81 | } 82 | 83 | @Test 84 | public void testIsDate() throws Exception { 85 | assertThat(isDate("2016-08-16")).isTrue(); 86 | assertThat(isDate("2016-02-29")).isTrue(); 87 | assertThat(isDate("2015-02-29")).isFalse(); 88 | assertThat(isDate("2016-8-16")).isFalse(); 89 | } 90 | 91 | @Test 92 | public void testIsIP() throws Exception { 93 | assertThat(isIP("255.255.255.0")).isTrue(); 94 | assertThat(isIP("256.255.255.0")).isFalse(); 95 | } 96 | 97 | @Test 98 | public void testIsMatch() throws Exception { 99 | assertThat(isMatch("\\d?", "1")).isTrue(); 100 | assertThat(isMatch("\\d?", "a")).isFalse(); 101 | } 102 | 103 | @Test 104 | public void testGetMatches() throws Exception { 105 | // 贪婪 106 | System.out.println(getMatches("b.*j", "blankj blankj")); 107 | // 懒惰 108 | System.out.println(getMatches("b.*?j", "blankj blankj")); 109 | } 110 | 111 | @Test 112 | public void testGetSplits() throws Exception { 113 | System.out.println(Arrays.asList(getSplits("1 2 3", " "))); 114 | } 115 | 116 | @Test 117 | public void testGetReplace() throws Exception { 118 | System.out.println(getReplaceFirst("1 2 3", " ", ", ")); 119 | } 120 | 121 | @Test 122 | public void testGetReplaceAll() throws Exception { 123 | System.out.println(getReplaceAll("1 2 3", " ", ", ")); 124 | } 125 | } -------------------------------------------------------------------------------- /utilcode/src/test/java/com/blankj/utilcode/util/SDCardUtilsTest.java: -------------------------------------------------------------------------------- 1 | package com.blankj.utilcode.util; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.robolectric.RobolectricTestRunner; 6 | import org.robolectric.annotation.Config; 7 | 8 | /** 9 | *
10 | * author: Blankj 11 | * blog : http://blankj.com 12 | * time : 2016/08/23 13 | * desc : SDCard单元测试 14 | *15 | */ 16 | @RunWith(RobolectricTestRunner.class) 17 | @Config(manifest = Config.NONE) 18 | public class SDCardUtilsTest { 19 | 20 | @Test 21 | public void testIsSDCardEnable() throws Exception { 22 | System.out.println(SDCardUtils.isSDCardEnable()); 23 | } 24 | 25 | @Test 26 | public void testGetSDCardPath() throws Exception { 27 | System.out.println(SDCardUtils.getSDCardPath()); 28 | } 29 | } -------------------------------------------------------------------------------- /utilcode/src/test/java/com/blankj/utilcode/util/SPUtilsTest.java: -------------------------------------------------------------------------------- 1 | package com.blankj.utilcode.util; 2 | 3 | import org.junit.Before; 4 | import org.junit.Test; 5 | import org.junit.runner.RunWith; 6 | import org.robolectric.RobolectricTestRunner; 7 | import org.robolectric.annotation.Config; 8 | 9 | import java.util.Map; 10 | 11 | import static com.google.common.truth.Truth.assertThat; 12 | 13 | /** 14 | *
15 | * author: Blankj 16 | * blog : http://blankj.com 17 | * time : 2016/08/22 18 | * desc : SPUtils单元测试 19 | *20 | */ 21 | @RunWith(RobolectricTestRunner.class) 22 | @Config(manifest = Config.NONE) 23 | public class SPUtilsTest { 24 | 25 | private SPUtils spUtils; 26 | 27 | @Before 28 | public void setUp() throws Exception { 29 | TestUtils.init(); 30 | if (spUtils == null) { 31 | spUtils = new SPUtils("test"); 32 | spUtils.put("stringKey", "stringVal"); 33 | spUtils.put("intKey", 1); 34 | spUtils.put("longKey", 1L); 35 | spUtils.put("floatKey", 1f); 36 | spUtils.put("booleanKey", true); 37 | } 38 | } 39 | 40 | @Test 41 | public void testGetString() throws Exception { 42 | assertThat(spUtils.getString("stringKey")).isEqualTo("stringVal"); 43 | assertThat(spUtils.getString("stringKey1", "stringVal1")).isEqualTo("stringVal1"); 44 | assertThat(spUtils.getString("stringKey1")).isNull(); 45 | } 46 | 47 | @Test 48 | public void testGetInt() throws Exception { 49 | assertThat(spUtils.getInt("intKey")).isEqualTo(1); 50 | assertThat(spUtils.getInt("intKey1", 10086)).isEqualTo(10086); 51 | assertThat(spUtils.getInt("intKey1")).isEqualTo(-1); 52 | } 53 | 54 | @Test 55 | public void testGetLong() throws Exception { 56 | assertThat(spUtils.getLong("longKey")).isEqualTo(1L); 57 | assertThat(spUtils.getLong("longKey1", 10086L)).isEqualTo(10086L); 58 | assertThat(spUtils.getLong("longKey1")).isEqualTo(-1L); 59 | } 60 | 61 | @Test 62 | public void testGetFloat() throws Exception { 63 | assertThat(spUtils.getFloat("floatKey") - 1.f).isWithin(0.f); 64 | assertThat(spUtils.getFloat("floatKey1", 10086f) - 10086f).isWithin(0.f); 65 | assertThat(spUtils.getFloat("floatKey1") + 1.f).isWithin(0.f); 66 | } 67 | 68 | @Test 69 | public void testGetBoolean() throws Exception { 70 | assertThat(spUtils.getBoolean("booleanKey")).isTrue(); 71 | assertThat(spUtils.getBoolean("booleanKey1", true)).isTrue(); 72 | assertThat(spUtils.getBoolean("booleanKey1")).isFalse(); 73 | } 74 | 75 | @Test 76 | public void testGetAll() throws Exception { 77 | Map
10 | * author: Blankj 11 | * blog : http://blankj.com 12 | * time : 2016/08/16 13 | * desc : StringUtils单元测试 14 | *15 | */ 16 | public class StringUtilsTest { 17 | 18 | @Test 19 | public void testIsEmpty() throws Exception { 20 | assertThat(isEmpty("")).isTrue(); 21 | assertThat(isEmpty(null)).isTrue(); 22 | assertThat(isEmpty(" ")).isFalse(); 23 | } 24 | 25 | @Test 26 | public void testIsSpace() throws Exception { 27 | assertThat(isSpace("")).isTrue(); 28 | assertThat(isSpace(null)).isTrue(); 29 | assertThat(isSpace(" ")).isTrue(); 30 | assertThat(isSpace(" \n\t\r")).isTrue(); 31 | } 32 | 33 | @Test 34 | public void testEquals() throws Exception { 35 | assertThat(StringUtils.equals("blankj", "blankj")).isEqualTo(true); 36 | assertThat(StringUtils.equals("blankj", "Blankj")).isEqualTo(false); 37 | } 38 | 39 | @Test 40 | public void testEqualsIgnoreCase() throws Exception { 41 | assertThat(equalsIgnoreCase(null, null)).isEqualTo(true); 42 | assertThat(equalsIgnoreCase(null, "blankj")).isEqualTo(false); 43 | assertThat(equalsIgnoreCase("blankj", "Blankj")).isEqualTo(true); 44 | assertThat(equalsIgnoreCase("blankj", "blankj")).isEqualTo(true); 45 | assertThat(equalsIgnoreCase("blankj", "blank")).isEqualTo(false); 46 | } 47 | 48 | @Test 49 | public void testNull2Length0() throws Exception { 50 | assertThat(null2Length0(null)).isEqualTo(""); 51 | } 52 | 53 | @Test 54 | public void testLength() throws Exception { 55 | assertThat(length(null)).isEqualTo(0); 56 | assertThat(length("")).isEqualTo(0); 57 | assertThat(length("blankj")).isEqualTo(6); 58 | } 59 | 60 | @Test 61 | public void testUpperFirstLetter() throws Exception { 62 | assertThat(upperFirstLetter("blankj")).isEqualTo("Blankj"); 63 | assertThat(upperFirstLetter("Blankj")).isEqualTo("Blankj"); 64 | assertThat(upperFirstLetter("1Blankj")).isEqualTo("1Blankj"); 65 | } 66 | 67 | @Test 68 | public void testLowerFirstLetter() throws Exception { 69 | assertThat(lowerFirstLetter("blankj")).isEqualTo("blankj"); 70 | assertThat(lowerFirstLetter("Blankj")).isEqualTo("blankj"); 71 | assertThat(lowerFirstLetter("1blankj")).isEqualTo("1blankj"); 72 | } 73 | 74 | @Test 75 | public void testReverse() throws Exception { 76 | assertThat(reverse("blankj")).isEqualTo("jknalb"); 77 | assertThat(reverse("blank")).isEqualTo("knalb"); 78 | assertThat(reverse("测试中文")).isEqualTo("文中试测"); 79 | assertThat(reverse(null)).isNull(); 80 | } 81 | 82 | @Test 83 | public void testToDBC() throws Exception { 84 | assertThat(toDBC(" ,.&")).isEqualTo(" ,.&"); 85 | } 86 | 87 | @Test 88 | public void testToSBC() throws Exception { 89 | assertThat(toSBC(" ,.&")).isEqualTo(" ,.&"); 90 | } 91 | } -------------------------------------------------------------------------------- /utilcode/src/test/java/com/blankj/utilcode/util/ZipUtilsTest.java: -------------------------------------------------------------------------------- 1 | package com.blankj.utilcode.util; 2 | 3 | /** 4 | *
5 | * author: Blankj 6 | * blog : http://blankj.com 7 | * time : 2016/09/10 8 | * desc : ZipUtils单元测试 9 | *10 | */ 11 | public class ZipUtilsTest { 12 | 13 | // String testZip = TestUtils.TEST_PATH() + FILE_SEP + "zip" + FILE_SEP + "testZip" + FILE_SEP; 14 | // String testZipFiles = TestUtils.TEST_PATH() + FILE_SEP + "zip" + FILE_SEP + "testZips.zip"; 15 | // String testZipFile = TestUtils.TEST_PATH() + FILE_SEP + "zip" + FILE_SEP + "testZip.zip"; 16 | // String unzipFile = TestUtils.TEST_PATH() + FILE_SEP + "zip" + FILE_SEP + "testUnzip"; 17 | // 18 | // @Test 19 | // public void testZipFiles() throws Exception { 20 | // List