Skip to content

Commit 3493249

Browse files
committed
feat: Compat PlatlogoActivity edgeToEdge
Signed-off-by: Hu Shenghao <dede.hu@qq.com>
1 parent ac7ec8e commit 3493249

File tree

7 files changed

+106
-45
lines changed

7 files changed

+106
-45
lines changed

basic/consumer-rules.pro

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# DrawableKt.installApi24InflateDelegates
12
-keep class androidx.appcompat.widget.ResourceManagerInternal { *; }
23
-keep class androidx.appcompat.widget.ResourceManagerInternal$InflateDelegate { *; }
3-
-keep class * extends androidx.appcompat.widget.ResourceManagerInternal$InflateDelegate { *; }
4+
-keep class * extends androidx.appcompat.widget.ResourceManagerInternal$InflateDelegate { *; }
5+
6+
# EdgeToEdgeCompat
7+
-keep class androidx.activity.EdgeToEdgeImpl { *; }
8+
-keep class * extends androidx.activity.EdgeToEdgeImpl { *; }
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package androidx.activity;
2+
3+
import android.app.Activity;
4+
import android.graphics.Color;
5+
import android.os.Build;
6+
import android.util.Log;
7+
import android.view.View;
8+
import android.view.Window;
9+
10+
import com.dede.basic.utils.DynamicObjectUtils;
11+
import com.dede.basic.utils.dynamic.DynamicResult;
12+
13+
import org.jetbrains.annotations.Nullable;
14+
15+
/**
16+
* EdgeToEdge compat
17+
*
18+
* @see EdgeToEdge
19+
*/
20+
public class EdgeToEdgeCompat {
21+
22+
private static final String TAG = "EdgeToEdgeCompat";
23+
24+
@Nullable
25+
private final static EdgeToEdgeImpl impl = createEdgeToEdgeImpl();
26+
27+
/**
28+
* Create EdgeToEdge instance
29+
*
30+
* @return EdgeToEdgeImpl instance
31+
* @see EdgeToEdge#enable(ComponentActivity)
32+
*/
33+
@Nullable
34+
private static EdgeToEdgeImpl createEdgeToEdgeImpl() {
35+
String className = "androidx.activity.EdgeToEdgeBase";
36+
final int[] apis = {
37+
Build.VERSION_CODES.R, // 30
38+
Build.VERSION_CODES.Q, // 29
39+
Build.VERSION_CODES.P, // 28
40+
Build.VERSION_CODES.O, // 26
41+
Build.VERSION_CODES.M, // 23
42+
Build.VERSION_CODES.LOLLIPOP,// 21
43+
};
44+
for (int api : apis) {
45+
if (Build.VERSION.SDK_INT >= api) {
46+
className = "androidx.activity.EdgeToEdgeApi" + api;
47+
break;
48+
}
49+
}
50+
DynamicResult dynamicResult = DynamicObjectUtils.asDynamicObject(className)
51+
.newInstance(new Class[0], new Object[0]);
52+
EdgeToEdgeImpl impl = DynamicResult.getTypeValue(dynamicResult, EdgeToEdgeImpl.class);
53+
Log.i(TAG, "EdgeToEdgeImpl: " + impl);
54+
return impl;
55+
}
56+
57+
private static boolean getDetectDarkMode(SystemBarStyle systemBarStyle, View view) {
58+
// internal val detectDarkMode: (Resources) -> Boolean
59+
// androidx.activity library
60+
// release build
61+
return systemBarStyle.getDetectDarkMode$activity_release().invoke(view.getResources());
62+
}
63+
64+
public static void enable(Activity activity, SystemBarStyle statusBarStyle, SystemBarStyle navigationBarStyle) {
65+
if (activity instanceof ComponentActivity) {
66+
EdgeToEdge.enable((ComponentActivity) activity, statusBarStyle, navigationBarStyle);
67+
return;
68+
}
69+
70+
if (impl == null) {
71+
Log.w(TAG, "enableEdgeToEdge, impl == null");
72+
return;
73+
}
74+
75+
Window window = activity.getWindow();
76+
View view = window.getDecorView();
77+
boolean statusBarIsDark = getDetectDarkMode(statusBarStyle, view);
78+
boolean navigationBarIsDark = getDetectDarkMode(navigationBarStyle, view);
79+
impl.setUp(
80+
statusBarStyle, navigationBarStyle, window, view, statusBarIsDark, navigationBarIsDark
81+
);
82+
impl.adjustLayoutInDisplayCutoutMode(window);
83+
}
84+
85+
public static void enable(Activity activity) {
86+
enable(activity, SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT),
87+
SystemBarStyle.auto(EdgeToEdge.getDefaultLightScrim(), EdgeToEdge.getDefaultDarkScrim()));
88+
}
89+
}

basic/src/main/java/com/dede/basic/Utils.kt

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,8 @@ import android.content.Context
99
import android.content.Intent
1010
import android.content.pm.PackageInfo
1111
import android.content.pm.PackageManager.NameNotFoundException
12-
import android.graphics.Color
1312
import android.os.Build
1413
import android.provider.Settings
15-
import android.view.WindowManager
16-
import androidx.activity.ComponentActivity
17-
import androidx.activity.enableEdgeToEdge
18-
import androidx.core.view.WindowCompat
19-
import androidx.core.view.WindowInsetsCompat
20-
import androidx.core.view.WindowInsetsControllerCompat
2114

2215
object Utils {
2316

@@ -83,36 +76,4 @@ object Utils {
8376
val Activity.isPlatLogoActivity: Boolean
8477
get() = javaClass.simpleName == "PlatLogoActivity"
8578

86-
fun Activity.platLogoEdge2Edge() {
87-
if (this is ComponentActivity) {
88-
this.enableEdgeToEdge()
89-
return
90-
}
91-
92-
@Suppress("DEPRECATION")
93-
with(window) {
94-
addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
95-
addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
96-
97-
navigationBarColor = Color.TRANSPARENT
98-
statusBarColor = Color.TRANSPARENT
99-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
100-
isNavigationBarContrastEnforced = false
101-
isStatusBarContrastEnforced = false
102-
}
103-
104-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
105-
attributes = attributes.apply {
106-
layoutInDisplayCutoutMode =
107-
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
108-
}
109-
}
110-
111-
WindowCompat.setDecorFitsSystemWindows(this, false)
112-
val windowInsetsController = WindowCompat.getInsetsController(this, this.decorView)
113-
windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())
114-
windowInsetsController.systemBarsBehavior =
115-
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
116-
}
117-
}
11879
}

basic/src/main/java/com/dede/basic/utils/DynamicObjectUtils.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import kotlin.reflect.KClass
1313

1414
object DynamicObjectUtils {
1515

16+
@JvmStatic
1617
fun forName(className: String): Class<out Any>? {
1718
return try {
1819
Class.forName(className)
@@ -22,19 +23,23 @@ object DynamicObjectUtils {
2223
}
2324
}
2425

26+
@JvmStatic
2527
fun asDynamicObject(className: String): DynamicObject {
2628
val clazz = forName(className) ?: return ClassNotFoundDynamicObject.INSTANCE
2729
return asDynamicObject(clazz)
2830
}
2931

32+
@JvmStatic
3033
fun asDynamicObject(obj: Any): DynamicObject {
3134
return ReflectDynamicObject(obj, obj.javaClass)
3235
}
3336

37+
@JvmStatic
3438
fun asDynamicObject(clazz: Class<out Any>): DynamicObject {
3539
return ReflectDynamicObject(null, clazz)
3640
}
3741

42+
@JvmStatic
3843
fun asDynamicObject(clazz: KClass<out Any>): DynamicObject {
3944
return asDynamicObject(clazz.java)
4045
}

basic/src/main/java/com/dede/basic/utils/dynamic/DynamicObject.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class DynamicResult private constructor(
7171
return getTypeValue(kClass.java)
7272
}
7373

74+
@JvmStatic
7475
@Suppress("UNCHECKED_CAST")
7576
fun <T : Any> DynamicResult.getTypeValue(tClass: Class<out T>): T? {
7677
val value = this.getValue()
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
package com.dede.android_eggs.util.actions
22

33
import android.app.Activity
4+
import androidx.activity.EdgeToEdgeCompat
45
import com.dede.android_eggs.util.ActivityActionDispatcher
56
import com.dede.android_eggs.views.main.util.EasterEggShortcutsHelp
67
import com.dede.basic.Utils.isPlatLogoActivity
7-
import com.dede.basic.Utils.platLogoEdge2Edge
88

99
internal class PlatLogoActivityAction : ActivityActionDispatcher.ActivityAction {
1010

1111
override fun onPreCreate(activity: Activity) {
1212
if (activity.isPlatLogoActivity) {
13-
activity.platLogoEdge2Edge()
13+
EdgeToEdgeCompat.enable(activity)
1414
}
1515
}
1616

1717
override fun onCreate(activity: Activity) {
1818
if (activity.isPlatLogoActivity) {
19-
EasterEggShortcutsHelp.reportShortcutUsed(activity, activity.intent)
19+
EasterEggShortcutsHelp.autoReportShortcutUsed(activity, activity.intent)
2020
}
2121
}
22-
}
22+
}

core/shortcut/src/main/java/com/dede/android_eggs/views/main/util/EasterEggShortcutsHelp.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ object EasterEggShortcutsHelp {
135135
ShortcutManagerCompat.requestPinShortcut(context, shortcut, callback)
136136
}
137137

138-
fun reportShortcutUsed(context: Context, intent: Intent) {
138+
fun autoReportShortcutUsed(context: Context, intent: Intent) {
139139
val shortcutId = intent.getStringExtra(EXTRA_SHORTCUT_ID) ?: return
140140
ShortcutManagerCompat.reportShortcutUsed(context, shortcutId)
141141
}

0 commit comments

Comments
 (0)