Skip to content

Commit 8bf46cb

Browse files
committed
Fix MIUI bugs
1 parent cd0a84c commit 8bf46cb

File tree

1 file changed

+51
-7
lines changed

1 file changed

+51
-7
lines changed

autosize/src/main/java/me/jessyan/autosize/AutoSize.java

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@
1818
import android.app.Activity;
1919
import android.app.Dialog;
2020
import android.app.Fragment;
21+
import android.content.res.Resources;
2122
import android.util.DisplayMetrics;
2223
import android.view.View;
2324

25+
import java.lang.reflect.Field;
2426
import java.util.Locale;
2527
import java.util.Map;
2628
import java.util.concurrent.ConcurrentHashMap;
@@ -191,7 +193,7 @@ public static void cancelAdapt(Activity activity) {
191193
}
192194

193195
/**
194-
* 赋值
196+
* 给几大 {@link DisplayMetrics} 赋值
195197
*
196198
* @param activity {@link Activity}
197199
* @param density {@link DisplayMetrics#density}
@@ -202,12 +204,54 @@ private static void setDensity(Activity activity, float density, int densityDpi,
202204
final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
203205
final DisplayMetrics appDisplayMetrics = AutoSizeConfig.getInstance().getApplication().getResources().getDisplayMetrics();
204206

205-
activityDisplayMetrics.density = density;
206-
activityDisplayMetrics.densityDpi = densityDpi;
207-
activityDisplayMetrics.scaledDensity = scaledDensity;
207+
setDensity(activityDisplayMetrics, density, densityDpi, scaledDensity);
208+
209+
setDensity(appDisplayMetrics, density, densityDpi, scaledDensity);
210+
211+
//兼容 MIUI
212+
DisplayMetrics activityDisplayMetricsOnMIUI = getMetricsOnMiui(activity.getResources());
213+
DisplayMetrics appDisplayMetricsOnMIUI = getMetricsOnMiui(AutoSizeConfig.getInstance().getApplication().getResources());
214+
215+
if (activityDisplayMetricsOnMIUI != null) {
216+
setDensity(activityDisplayMetricsOnMIUI, density, densityDpi, scaledDensity);
217+
}
218+
219+
if (appDisplayMetricsOnMIUI != null) {
220+
setDensity(appDisplayMetricsOnMIUI, density, densityDpi, scaledDensity);
221+
}
222+
}
208223

209-
appDisplayMetrics.density = density;
210-
appDisplayMetrics.densityDpi = densityDpi;
211-
appDisplayMetrics.scaledDensity = scaledDensity;
224+
/**
225+
* 赋值
226+
*
227+
* @param displayMetrics {@link DisplayMetrics}
228+
* @param density {@link DisplayMetrics#density}
229+
* @param densityDpi {@link DisplayMetrics#densityDpi}
230+
* @param scaledDensity {@link DisplayMetrics#scaledDensity}
231+
*/
232+
private static void setDensity(DisplayMetrics displayMetrics, float density, int densityDpi, float scaledDensity) {
233+
displayMetrics.density = density;
234+
displayMetrics.densityDpi = densityDpi;
235+
displayMetrics.scaledDensity = scaledDensity;
236+
}
237+
238+
/**
239+
* 解决 MIUI 更改框架导致的 MIUI7 + Android5.1.1 上出现的失效问题 (以及极少数基于这部分 MIUI 去掉 ART 然后置入 XPosed 的手机)
240+
* 来源于: https://github.com/Firedamp/Rudeness/blob/master/rudeness-sdk/src/main/java/com/bulong/rudeness/RudenessScreenHelper.java#L61:5
241+
*
242+
* @param resources {@link Resources}
243+
* @return {@link DisplayMetrics}, 可能为 {@code null}
244+
*/
245+
private static DisplayMetrics getMetricsOnMiui(Resources resources) {
246+
if ("MiuiResources".equals(resources.getClass().getSimpleName()) || "XResources".equals(resources.getClass().getSimpleName())) {
247+
try {
248+
Field field = Resources.class.getDeclaredField("mTmpMetrics");
249+
field.setAccessible(true);
250+
return (DisplayMetrics) field.get(resources);
251+
} catch (Exception e) {
252+
return null;
253+
}
254+
}
255+
return null;
212256
}
213257
}

0 commit comments

Comments
 (0)