diff --git a/app/build.gradle b/app/build.gradle index d37a627873..f66d276ebf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,61 +1,7 @@ -apply plugin: 'com.android.application' - -File signPropertiesFile = file('sign/keystore.properties') - -android { - compileSdkVersion compile_sdk_version - defaultConfig { - applicationId "com.blankj.androidutilcode" - minSdkVersion min_sdk_version - targetSdkVersion target_sdk_version - versionCode version_code - versionName version_name - } - - if (signPropertiesFile.exists()) { - Properties properties = new Properties() - properties.load(new FileInputStream(signPropertiesFile)) - signingConfigs { - release { - storeFile file(properties['keystore']) - storePassword properties['storePassword'] - keyAlias properties['keyAlias'] - keyPassword properties['keyPassword'] - } - } - } - - buildTypes { - release { - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - if (signPropertiesFile.exists()) { - signingConfig signingConfigs.release - } - } - } - - sourceSets { - main.res.srcDirs += 'src/main/res_core' - main.res.srcDirs += 'src/main/res_sub' - } - - lintOptions { - abortOnError false - } +plugins { + id "com.android.application" } -dependencies { - implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation project(':utilcode') - implementation project(':subutil') +configAndroidDomain project - implementation "com.android.support:appcompat-v7:$support_version" - implementation "com.android.support:design:$support_version" - implementation 'com.r0adkll:slidableactivity:2.0.5' - implementation 'com.android.support.constraint:constraint-layout:1.1.0' - // LeakCanary - debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakcanary_version" - releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:$leakcanary_version" -// implementation 'com.blankj:utilcode:1.17.2' -} +configAppDependencies project diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 594794c364..e0b09e87a5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -56,6 +57,7 @@ android:windowSoftInputMode="stateHidden|adjustPan"> + @@ -188,7 +190,8 @@ + android:launchMode="singleTop" + android:screenOrientation="landscape" /> - Util Core Util Sub Util diff --git a/build.gradle b/build.gradle index 296c1005bd..6a644395d9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,23 +1,17 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - apply from: 'version.gradle' + apply from: 'config.gradle' repositories { google() jcenter() } - dependencies { - classpath 'com.android.tools.build:gradle:3.1.3' - classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0' - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0' - classpath "tech.harmonysoft:traute-gradle:1.1.8" - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files + dependencies { + classpath depConfig.gradle } } allprojects { - apply plugin: "tech.harmonysoft.oss.traute" repositories { google() jcenter() @@ -28,8 +22,8 @@ allprojects { resolutionStrategy.eachDependency { if (it.requested.group == 'com.android.support' - && it.requested.name != 'multidex') { - it.useVersion support_version + && !it.requested.name.contains('multidex')) { + it.useVersion versionConfig.support } } } diff --git a/config.gradle b/config.gradle new file mode 100644 index 0000000000..722c7caf33 --- /dev/null +++ b/config.gradle @@ -0,0 +1,185 @@ +ext { + androidConfig = [ + applicationId : 'com.blankj.androidutilcode', + appName : 'Util', + + compileSdkVersion: 27, + minSdkVersion : 14, + targetSdkVersion : 27, + versionCode : 1_017_004, + versionName : '1.17.4'// E.g 1.9.72 => 1,009,072 + ] + + versionConfig = [ + // plugin + gradle : '3.1.3', + kotlin : '1.2.30', + // lib + support : '27.1.0', + gson : '2.8.2', + glide : '4.7.1', + leakcanary : '1.5.4', + // test + junit : '4.12', + robolectric: '3.1.2' + ] + + depConfig = [ + gradle : "com.android.tools.build:gradle:$versionConfig.gradle", + kotlin : "org.jetbrains.kotlin:kotlin-gradle-plugin:$versionConfig.kotlin", + + support : [ + appcompat_v7: "com.android.support:appcompat-v7:$versionConfig.support", + design : "com.android.support:design:$versionConfig.support", + ], + leakcanary : [ + android : "com.squareup.leakcanary:leakcanary-android:$versionConfig.leakcanary", + android_no_op: "com.squareup.leakcanary:leakcanary-android-no-op:$versionConfig.leakcanary", + ], + gson : "com.google.code.gson:gson:$versionConfig.gson", + glide : "com.github.bumptech.glide:glide:$versionConfig.glide", + + junit : "junit:junit:$versionConfig.junit", + robolectric: "org.robolectric:robolectric:$versionConfig.robolectric", + ] + + configAndroidDomain = this.&configAndroidDomain + configAppDependencies = this.&configAppDependencies + configUtilCodeDependencies = this.&configUtilCodeDependencies + configSubUtilDependencies = this.&configSubUtilDependencies +} + +def configAndroidDomain(Project pro) { + if (pro.plugins.hasPlugin("com.android.application")) { + configAppAndroidDomain(pro) + } else { + configLibAndroidDomain(pro) + } +} + +def configAppAndroidDomain(Project pro) { + configField(pro) + configSigning(pro) + pro.android { + compileSdkVersion androidConfig.compileSdkVersion + defaultConfig { + applicationId androidConfig.applicationId + minSdkVersion androidConfig.minSdkVersion + targetSdkVersion androidConfig.targetSdkVersion + versionCode androidConfig.versionCode + versionName androidConfig.versionName + } + + buildTypes { + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + sourceSets { + main.res.srcDirs += 'src/main/res_core' + main.res.srcDirs += 'src/main/res_sub' + } + + lintOptions { + abortOnError false + } + } +} + +def configField(Project pro) { + pro.android.defaultConfig { + resValue "string", "app_name", androidConfig.appName + } +} + +def configSigning(Project pro) { + File signPropertiesFile = file('sign/keystore.properties') + if (!signPropertiesFile.exists()) return + pro.android { + Properties properties = new Properties() + properties.load(new FileInputStream(signPropertiesFile)) + signingConfigs { + release { + storeFile file(properties['keystore']) + storePassword properties['storePassword'] + keyAlias properties['keyAlias'] + keyPassword properties['keyPassword'] + } + } + buildTypes.release.signingConfig signingConfigs.release + } +} + +def configLibAndroidDomain(Project pro) { + pro.android { + compileSdkVersion androidConfig.compileSdkVersion + defaultConfig { + minSdkVersion androidConfig.minSdkVersion + versionCode androidConfig.versionCode + versionName androidConfig.versionName + } + + buildTypes { + release { + minifyEnabled false +// consumerProguardFiles 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + lintOptions { + abortOnError false + } + + testOptions.unitTests.all { + testLogging { + events 'passed', 'skipped', 'failed', 'standardOut', 'standardError' + } + } + } +} + + +def configAppDependencies(Project pro) { + pro.dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation project(':utilcode') + implementation project(':subutil') + + implementation depConfig.support.appcompat_v7 + implementation depConfig.support.design + implementation 'com.r0adkll:slidableactivity:2.0.5' + // LeakCanary + debugImplementation depConfig.leakcanary.android + releaseImplementation depConfig.leakcanary.android_no_op +// implementation 'com.blankj:utilcode:1.17.2' + } +} + +def configUtilCodeDependencies(Project pro) { + pro.dependencies { + compileOnly depConfig.support.appcompat_v7 + compileOnly depConfig.support.design + + testImplementation depConfig.junit + testImplementation depConfig.robolectric + testImplementation depConfig.support.appcompat_v7 + } +} + +def configSubUtilDependencies(Project pro) { + pro.dependencies { + compileOnly depConfig.support.appcompat_v7 + compileOnly depConfig.support.design + + api depConfig.gson + api(depConfig.glide) { + exclude group: "com.android.support" + } + + testImplementation depConfig.junit + testImplementation depConfig.robolectric + } +} \ No newline at end of file diff --git a/app/sign/keystore.jks b/sign/keystore.jks similarity index 100% rename from app/sign/keystore.jks rename to sign/keystore.jks diff --git a/app/sign/keystore.properties b/sign/keystore.properties similarity index 100% rename from app/sign/keystore.properties rename to sign/keystore.properties diff --git a/subutil/build.gradle b/subutil/build.gradle index 72eba388c9..9e820bf294 100644 --- a/subutil/build.gradle +++ b/subutil/build.gradle @@ -1,44 +1,8 @@ -apply plugin: 'com.android.library' -apply from: 'readme.gradle' - -android { - compileSdkVersion compile_sdk_version - defaultConfig { - minSdkVersion min_sdk_version - versionCode version_code - versionName version_name - } - - buildTypes { - release { - minifyEnabled false -// consumerProguardFiles 'proguard-rules.pro' - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - - lintOptions { - abortOnError false - } - - testOptions.unitTests.all { - testLogging { - events 'passed', 'skipped', 'failed', 'standardOut', 'standardError' - } - } +apply { + plugin('com.android.library') + from('readme.gradle') } -dependencies { - compileOnly "com.android.support:appcompat-v7:$support_version" - compileOnly "com.android.support:design:$support_version" - - testImplementation "junit:junit:$junit_version" - testImplementation "org.robolectric:robolectric:$robolectric_version" - - api "com.google.code.gson:gson:$gson_version" +configAndroidDomain project - // glide - api ("com.github.bumptech.glide:glide:$glide_version") { - exclude group: "com.android.support" - } -} \ No newline at end of file +configSubUtilDependencies project \ No newline at end of file diff --git a/update_log.md b/update_log.md index fecd13b0fd..45ed678748 100644 --- a/update_log.md +++ b/update_log.md @@ -1,4 +1,5 @@ -* 18/06/29 修复 IntentUtils 分享图片判断逻辑,CacheDiskUtils 可放入 byte[0],发布 1.17.3 +* 18/07/16 新增 ScreenUtils#adaptPortraitScreen 和 ScreenUtils#adaptLandscapeScreen,发布 1.17.3 +* 18/07/13 修复 IntentUtils 分享图片判断逻辑,CacheDiskUtils 可放入 byte[0] * 18/06/29 修复 FragmentUtils 中 getFragmentManager 空指针错误,发布 1.17.2 * 18/06/27 新增 UriUtils#uri2File * 18/06/25 新增 KeyboardUtils#fixAndroidBug5497,发布 1.17.1 版本 diff --git a/utilcode/build.gradle b/utilcode/build.gradle index 7e62ceee60..c274cdf209 100644 --- a/utilcode/build.gradle +++ b/utilcode/build.gradle @@ -1,40 +1,16 @@ -apply plugin: 'com.android.library' -apply from: 'readme.gradle' - -android { - compileSdkVersion compile_sdk_version - defaultConfig { - minSdkVersion min_sdk_version - versionCode version_code - versionName version_name - } - - buildTypes { - release { - minifyEnabled true -// consumerProguardFiles 'proguard-rules.pro' - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - - lintOptions { - abortOnError false - } - - testOptions.unitTests.all { - testLogging { - events 'passed', 'skipped', 'failed', 'standardOut', 'standardError' - } - } +plugins { + id "com.android.library" + id "com.github.dcendents.android-maven" version "2.1" + id "com.jfrog.bintray" version "1.8.0" + id "tech.harmonysoft.oss.traute" version "1.1.8" } -dependencies { - compileOnly "com.android.support:appcompat-v7:$support_version" - compileOnly "com.android.support:design:$support_version" +configAndroidDomain project + +configUtilCodeDependencies project - testImplementation "junit:junit:$junit_version" - testImplementation "org.robolectric:robolectric:$robolectric_version" - testImplementation "com.android.support:support-v4:$support_version" +apply { + from('readme.gradle') + from("../bintrayUpload.gradle") } -apply from: "../bintrayUpload.gradle" //gradle bintrayUpload \ No newline at end of file diff --git a/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java b/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java index c2551ca09b..2ffd97bed9 100644 --- a/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java +++ b/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java @@ -30,6 +30,22 @@ * */ public final class AppUtils { + /** + * Return whether the app is installed. + * + * @param action The Intent action, such as ACTION_VIEW. + * @param category The desired category. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isAppInstalled(@NonNull final String action, + @NonNull final String category) { + Intent intent = new Intent(action); + intent.addCategory(category); + PackageManager pm = getApp().getPackageManager(); + ResolveInfo info = pm.resolveActivity(intent, 0); + return info != null; + } + private AppUtils() { throw new UnsupportedOperationException("u can't instantiate me..."); @@ -343,22 +359,6 @@ public static boolean uninstallAppSilent(final String packageName, } } - /** - * Return whether the app is installed. - * - * @param action The Intent action, such as ACTION_VIEW. - * @param category The desired category. - * @return {@code true}: yes
{@code false}: no - */ - public static boolean isAppInstalled(@NonNull final String action, - @NonNull final String category) { - Intent intent = new Intent(action); - intent.addCategory(category); - PackageManager pm = getApp().getPackageManager(); - ResolveInfo info = pm.resolveActivity(intent, 0); - return info != null; - } - /** * Return whether the app is installed. * diff --git a/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java b/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java index 7c15ed1f24..9edd860773 100644 --- a/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java +++ b/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java @@ -1,7 +1,9 @@ package com.blankj.utilcode.util; import android.app.Activity; +import android.app.Application.ActivityLifecycleCallbacks; import android.app.KeyguardManager; +import android.content.ComponentCallbacks; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.res.Configuration; @@ -9,6 +11,7 @@ import android.graphics.Bitmap; import android.graphics.Point; import android.os.Build; +import android.os.Bundle; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.annotation.RequiresPermission; @@ -254,4 +257,87 @@ public static boolean isTablet() { & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; } + + private static float scaledDensity; + private static float density; + + /** + * Adapt the portrait screen. + * + * @param designWidthInDp The size of design diagram width, in dp, + * e.g. the design diagram width is 750px, in XHDPI device, + * the designWidthInDp = 750 / 2. + */ + public static void adaptPortraitScreen(final float designWidthInDp) { + adaptScreen(designWidthInDp, true); + } + + /** + * Adapt the landscape screen. + * + * @param designHeightInDp The size of design diagram height, in dp, + * e.g. the design diagram height is 1920px, in XXHDPI device, + * the designHeightInDp = 1920 / 3. + */ + public static void adaptLandscapeScreen(final float designHeightInDp) { + adaptScreen(designHeightInDp, false); + } + + /** + * Reference from: https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA + * + * @param sizeInDp The size, in dp. + * @param isPortrait True to portrait, false otherwise. + */ + private static void adaptScreen(final float sizeInDp, + final boolean isPortrait) { + final DisplayMetrics appDm = Utils.getApp().getResources().getDisplayMetrics(); + if (density == 0) { + density = appDm.density; + scaledDensity = appDm.scaledDensity; + Utils.getApp().registerComponentCallbacks(new ComponentCallbacks() { + @Override + public void onConfigurationChanged(Configuration newConfig) { + if (newConfig != null && newConfig.fontScale > 0) { + scaledDensity = + Utils.getApp().getResources().getDisplayMetrics().scaledDensity; + } + } + + @Override + public void onLowMemory() {/**/} + }); + Utils.getApp().registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { + @Override + public void onActivityCreated(Activity activity, Bundle savedInstanceState) { + DisplayMetrics activityDm = activity.getResources().getDisplayMetrics(); + if (isPortrait) { + activityDm.density = appDm.widthPixels / sizeInDp; + } else { + activityDm.density = appDm.heightPixels / sizeInDp; + } + activityDm.scaledDensity = activityDm.density * (scaledDensity / density); + activityDm.densityDpi = (int) (160 * activityDm.density); + } + + @Override + public void onActivityStarted(Activity activity) {/**/} + + @Override + public void onActivityResumed(Activity activity) {/**/} + + @Override + public void onActivityPaused(Activity activity) {/**/} + + @Override + public void onActivityStopped(Activity activity) {/**/} + + @Override + public void onActivitySaveInstanceState(Activity activity, Bundle outState) {/**/} + + @Override + public void onActivityDestroyed(Activity activity) {/**/} + }); + } + } } diff --git a/utilcode/src/main/java/com/blankj/utilcode/util/Utils.java b/utilcode/src/main/java/com/blankj/utilcode/util/Utils.java index 1e189e6bbf..ce1eb66619 100644 --- a/utilcode/src/main/java/com/blankj/utilcode/util/Utils.java +++ b/utilcode/src/main/java/com/blankj/utilcode/util/Utils.java @@ -169,9 +169,7 @@ public void onActivityResumed(Activity activity) { } @Override - public void onActivityPaused(Activity activity) { - - } + public void onActivityPaused(Activity activity) {/**/} @Override public void onActivityStopped(Activity activity) { @@ -186,9 +184,7 @@ public void onActivityStopped(Activity activity) { } @Override - public void onActivitySaveInstanceState(Activity activity, Bundle outState) { - - } + public void onActivitySaveInstanceState(Activity activity, Bundle outState) {/**/} @Override public void onActivityDestroyed(Activity activity) { diff --git a/version.gradle b/version.gradle deleted file mode 100644 index c937038a2e..0000000000 --- a/version.gradle +++ /dev/null @@ -1,19 +0,0 @@ -ext{ - // Sdk and tools - compile_sdk_version = 27 - min_sdk_version = 14 - target_sdk_version = 27 - - version_code = 1_017_003 - version_name = '1.17.3'// E.g 1.9.72 => 1,009,072 - - // App dependencies - support_version = '27.1.0' - - leakcanary_version = '1.5.4' - gson_version = '2.8.2' - glide_version = '4.7.1' - - junit_version = '4.12' - robolectric_version = '3.1.2' -}