提交 d049f20b 编写于 作者: B Blankj

see 08/25 log

上级 63941ede
......@@ -41,7 +41,7 @@
[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png
[aucsvg]: https://img.shields.io/badge/AndroidUtilCode-v1.19.1-brightgreen.svg
[aucsvg]: https://img.shields.io/badge/AndroidUtilCode-v1.19.2-brightgreen.svg
[auc]: https://github.com/Blankj/AndroidUtilCode
[apisvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
......
......@@ -41,7 +41,7 @@ If this project helps you a lot and you want to support the project's developmen
[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png
[aucsvg]: https://img.shields.io/badge/AndroidUtilCode-v1.19.1-brightgreen.svg
[aucsvg]: https://img.shields.io/badge/AndroidUtilCode-v1.19.2-brightgreen.svg
[auc]: https://github.com/Blankj/AndroidUtilCode
[apisvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
......
......@@ -36,9 +36,7 @@ public class UtilsApp extends BaseApplication {
@Override
public void onCreate() {
super.onCreate();
LogUtils.e();
sInstance = this;
com.blankj.subutil.util.Utils.init(this);
initLeakCanary();
initLog();
initCrash();
......
......@@ -6,8 +6,8 @@ ext {
compileSdkVersion: 27,
minSdkVersion : 14,
targetSdkVersion : 27,
versionCode : 1_019_001,
versionName : '1.19.1'// E.g 1.9.72 => 1,009,072
versionCode : 1_019_002,
versionName : '1.19.2'// E.g 1.9.72 => 1,009,072
]
versionConfig = [
......@@ -167,7 +167,7 @@ def configAppDependencies(Project pro) {
// LeakCanary
debugImplementation depConfig.leakcanary.android
releaseImplementation depConfig.leakcanary.android_no_op
// implementation 'com.blankj:utilcode:1.19.1'
// implementation 'com.blankj:utilcode:1.19.2'
}
}
......
<manifest package="com.blankj.subutil" />
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.blankj.subutil">
<application>
<provider
android:name=".util.Utils$ContentProvider4SubUtil"
android:authorities="${applicationId}.subutil.content.provider"
android:exported="false"
android:multiprocess="true" />
</application>
</manifest>
......@@ -2,8 +2,14 @@ package com.blankj.subutil.util;
import android.annotation.SuppressLint;
import android.app.Application;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.FileProvider;
import java.lang.reflect.InvocationTargetException;
......@@ -97,4 +103,42 @@ public final class Utils {
}
throw new NullPointerException("u should init first");
}
public static final class ContentProvider4SubUtil extends ContentProvider {
@Override
public boolean onCreate() {
Utils.init(getContext());
return true;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
return null;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
}
}
\ No newline at end of file
* 18/08/24 新增 ScreenUtils#restoreAdaptScreen,利用 FileProvider4UtilCode 不再需要初始化,发布 1.19.2
* 18/08/23 修复适配后 ToastUtils 原生 Toast 尺寸发生改变的问题,修复 KeyboardUtils#fixSoftInputLeaks,发布 1.19.1
* 18/08/10 修复 ScreenUtils#adaptxx 导致获取状态栏和导航栏尺寸不对问题,发布 1.19.0
* 18/08/09 新增 IntentUtils#isIntentAvailable,ToastUtils 传入空显示 null,发布 1.18.6
......
......@@ -2,23 +2,10 @@
Gradle:
```groovy
implementation 'com.blankj:utilcode:1.19.1'
implementation 'com.blankj:utilcode:1.19.2'
```
## How to use
```java
// init it in the function of onCreate in ur Application
Utils.init(application);
```
## Proguard
U needn't do anything, because I add `consumerProguardFiles 'proguard-rules.pro'` in build.gradle.
## APIs
* ### Activity 相关 -> [ActivityUtils.java][activity.java] -> [Demo][activity.demo]
......@@ -543,6 +530,7 @@ isTablet : 判断是否是平板
adaptScreen4VerticalSlide : 适配垂直滑动的屏幕
adaptScreen4HorizontalSlide: 适配水平滑动的屏幕
cancelAdaptScreen : 取消适配屏幕
restoreAdaptScreen : 恢复适配屏幕
isAdaptScreen : 是否适配屏幕
```
......
......@@ -2,23 +2,10 @@
Gradle:
```groovy
implementation 'com.blankj:utilcode:1.19.1'
implementation 'com.blankj:utilcode:1.19.2'
```
## How to use
```java
// init it in the function of onCreate in ur Application
Utils.init(application);
```
## Proguard
U needn't do anything, because I add `consumerProguardFiles 'proguard-rules.pro'` in build.gradle.
## APIs
* ### About Activity -> [ActivityUtils.java][activity.java] -> [Demo][activity.demo]
......@@ -543,6 +530,7 @@ isTablet
adaptScreen4VerticalSlide
adaptScreen4HorizontalSlide
cancelAdaptScreen
restoreAdaptScreen
isAdaptScreen
```
......
......@@ -10,7 +10,7 @@
android:windowSoftInputMode="stateHidden|stateAlwaysHidden" />
<provider
android:name=".util.Utils$FileProvider4Util"
android:name=".util.Utils$FileProvider4UtilCode"
android:authorities="${applicationId}.utilcode.provider"
android:exported="false"
android:grantUriPermissions="true"
......
......@@ -360,6 +360,22 @@ public final class ScreenUtils {
appDm.densityDpi = systemDm.densityDpi;
}
/**
* Cancel adapt the screen.
*/
public static void cancelAdaptScreen() {
Utils.cancelAdaptScreen();
}
/**
* Restore adapt the screen.
* <p>U should call the method of {@link ScreenUtils#adaptScreen4VerticalSlide(Activity, int)}
* or {@link ScreenUtils#adaptScreen4HorizontalSlide(Activity, int)} firstly.</p>
*/
public static void restoreAdaptScreen() {
Utils.restoreAdaptScreen();
}
/**
* Return whether adapt screen.
*
......
......@@ -240,7 +240,7 @@ public final class ToastUtils {
if (Utils.isAdaptScreen()) {
Utils.cancelAdaptScreen();
sToast = Toast.makeText(Utils.getApp(), text, duration);
Utils.adaptScreen();
Utils.restoreAdaptScreen();
} else {
sToast = Toast.makeText(Utils.getApp(), text, duration);
}
......
......@@ -9,6 +9,7 @@ import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.FileProvider;
import android.util.DisplayMetrics;
......@@ -87,20 +88,21 @@ public final class Utils {
*/
public static Application getApp() {
if (sApplication != null) return sApplication;
return getApplicationByReflect();
Application app = getApplicationByReflect();
init(app);
return app;
}
private static Application getApplicationByReflect() {
try {
@SuppressLint("PrivateApi")
Class<?> activityThread = Class.forName("android.app.ActivityThread");
Object at = activityThread.getMethod("currentActivityThread").invoke(null);
Object app = activityThread.getMethod("getApplication").invoke(at);
Object thread = activityThread.getMethod("currentActivityThread").invoke(null);
Object app = activityThread.getMethod("getApplication").invoke(thread);
if (app == null) {
throw new NullPointerException("u should init first");
}
init((Application) app);
return sApplication;
return (Application) app;
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
......@@ -144,21 +146,46 @@ public final class Utils {
return false;
}
static void adaptScreen() {
static final AdaptScreenArgs ADAPT_SCREEN_ARGS = new AdaptScreenArgs();
static void restoreAdaptScreen() {
final DisplayMetrics systemDm = Resources.getSystem().getDisplayMetrics();
final DisplayMetrics appDm = Utils.getApp().getResources().getDisplayMetrics();
if (ADAPT_SCREEN_ARGS.isVerticalSlide) {
appDm.density = appDm.widthPixels / (float) ADAPT_SCREEN_ARGS.sizeInPx;
final Activity activity = ACTIVITY_LIFECYCLE.getTopActivity();
if (activity != null) {
final DisplayMetrics activityDm = activity.getResources().getDisplayMetrics();
if (ADAPT_SCREEN_ARGS.isVerticalSlide) {
activityDm.density = activityDm.widthPixels / (float) ADAPT_SCREEN_ARGS.sizeInPx;
} else {
activityDm.density = activityDm.heightPixels / (float) ADAPT_SCREEN_ARGS.sizeInPx;
}
activityDm.scaledDensity = activityDm.density * (systemDm.scaledDensity / systemDm.density);
activityDm.densityDpi = (int) (160 * activityDm.density);
appDm.density = activityDm.density;
appDm.scaledDensity = activityDm.scaledDensity;
appDm.densityDpi = activityDm.densityDpi;
} else {
appDm.density = appDm.heightPixels / (float) ADAPT_SCREEN_ARGS.sizeInPx;
if (ADAPT_SCREEN_ARGS.isVerticalSlide) {
appDm.density = appDm.widthPixels / (float) ADAPT_SCREEN_ARGS.sizeInPx;
} else {
appDm.density = appDm.heightPixels / (float) ADAPT_SCREEN_ARGS.sizeInPx;
}
appDm.scaledDensity = appDm.density * (systemDm.scaledDensity / systemDm.density);
appDm.densityDpi = (int) (160 * appDm.density);
}
appDm.scaledDensity = appDm.density * (systemDm.scaledDensity / systemDm.density);
appDm.densityDpi = (int) (160 * appDm.density);
}
static void cancelAdaptScreen() {
final DisplayMetrics systemDm = Resources.getSystem().getDisplayMetrics();
final DisplayMetrics appDm = Utils.getApp().getResources().getDisplayMetrics();
final Activity activity = ACTIVITY_LIFECYCLE.getTopActivity();
if (activity != null) {
final DisplayMetrics activityDm = activity.getResources().getDisplayMetrics();
activityDm.density = systemDm.density;
activityDm.scaledDensity = systemDm.scaledDensity;
activityDm.densityDpi = systemDm.densityDpi;
}
appDm.density = systemDm.density;
appDm.scaledDensity = systemDm.scaledDensity;
appDm.densityDpi = systemDm.densityDpi;
......@@ -170,8 +197,6 @@ public final class Utils {
return systemDm.density != appDm.density;
}
static final AdaptScreenArgs ADAPT_SCREEN_ARGS = new AdaptScreenArgs();
static class AdaptScreenArgs {
int sizeInPx;
boolean isVerticalSlide;
......@@ -270,7 +295,14 @@ public final class Utils {
return topActivity;
}
}
// using reflect to get top activity
Activity topActivityByReflect = getTopActivityByReflect();
if (topActivityByReflect != null) {
setTopActivity(topActivityByReflect);
}
return topActivityByReflect;
}
private Activity getTopActivityByReflect() {
try {
@SuppressLint("PrivateApi")
Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
......@@ -286,9 +318,7 @@ public final class Utils {
if (!pausedField.getBoolean(activityRecord)) {
Field activityField = activityRecordClass.getDeclaredField("activity");
activityField.setAccessible(true);
Activity activity = (Activity) activityField.get(activityRecord);
setTopActivity(activity);
return activity;
return (Activity) activityField.get(activityRecord);
}
}
} catch (ClassNotFoundException e) {
......@@ -307,7 +337,7 @@ public final class Utils {
}
public static final class FileProvider4Util extends FileProvider {
public static final class FileProvider4UtilCode extends FileProvider {
@Override
public boolean onCreate() {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册