Skip to content

Commit 3e0b5a9

Browse files
committed
feat: Enable EdgeToEdge on the Egg pages
Signed-off-by: Hu Shenghao <dede.hu@qq.com>
1 parent 3493249 commit 3e0b5a9

File tree

19 files changed

+145
-82
lines changed

19 files changed

+145
-82
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
### v3.4.0
4+
5+
- EdgeToEdge mode is enabled on the Easter Egg pages
6+
- Upgrade project dependencies
7+
38
### v3.3.0 (2024-12-20)
49

510
- Add Rocket Launcher Easter Egg [#286](https://github.com/hushenghao/AndroidEasterEggs/issues/286)

CHANGELOG_zh.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# 更新日志
22

3+
### v3.4.0
4+
5+
- 彩蛋相关页面开启了 EdgeToEdge 模式
6+
- 升级项目依赖项
7+
38
### v3.3.0 (2024-12-20)
49

510
- 添加 Rocket Launcher 彩蛋 [#286](https://github.com/hushenghao/AndroidEasterEggs/issues/286)

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ android {
77

88
defaultConfig {
99
applicationId = "com.dede.android_eggs"
10-
versionCode = 57
11-
versionName = "3.3.0"
10+
versionCode = 58
11+
versionName = "3.4.0"
1212
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
1313

1414
resourceConfigurations += listOf(

app/src/main/java/com/dede/android_eggs/util/EdgeUtils.kt

Lines changed: 0 additions & 35 deletions
This file was deleted.

basic/consumer-rules.pro

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@
55

66
# EdgeToEdgeCompat
77
-keep class androidx.activity.EdgeToEdgeImpl { *; }
8-
-keep class * extends androidx.activity.EdgeToEdgeImpl { *; }
8+
-keep class * extends androidx.activity.EdgeToEdgeImpl { *; }
9+
-keep class com.google.android.material.internal.EdgeToEdgeUtils { *; }

basic/src/main/java/androidx/activity/EdgeToEdgeCompat.java

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,25 @@
66
import android.util.Log;
77
import android.view.View;
88
import android.view.Window;
9+
import android.view.WindowManager;
10+
11+
import androidx.annotation.NonNull;
12+
import androidx.core.view.WindowInsetsCompat;
913

1014
import com.dede.basic.utils.DynamicObjectUtils;
1115
import com.dede.basic.utils.dynamic.DynamicResult;
1216

13-
import org.jetbrains.annotations.Nullable;
14-
1517
/**
1618
* EdgeToEdge compat
1719
*
1820
* @see EdgeToEdge
1921
*/
2022
public class EdgeToEdgeCompat {
2123

24+
public static final int EDGE_INSETS_MASK = WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout();
25+
2226
private static final String TAG = "EdgeToEdgeCompat";
2327

24-
@Nullable
2528
private final static EdgeToEdgeImpl impl = createEdgeToEdgeImpl();
2629

2730
/**
@@ -30,7 +33,6 @@ public class EdgeToEdgeCompat {
3033
* @return EdgeToEdgeImpl instance
3134
* @see EdgeToEdge#enable(ComponentActivity)
3235
*/
33-
@Nullable
3436
private static EdgeToEdgeImpl createEdgeToEdgeImpl() {
3537
String className = "androidx.activity.EdgeToEdgeBase";
3638
final int[] apis = {
@@ -43,17 +45,57 @@ private static EdgeToEdgeImpl createEdgeToEdgeImpl() {
4345
};
4446
for (int api : apis) {
4547
if (Build.VERSION.SDK_INT >= api) {
46-
className = "androidx.activity.EdgeToEdgeApi" + api;
48+
className = "androidx.activity.EdgeToEdgeApi1" + api;
4749
break;
4850
}
4951
}
5052
DynamicResult dynamicResult = DynamicObjectUtils.asDynamicObject(className)
5153
.newInstance(new Class[0], new Object[0]);
5254
EdgeToEdgeImpl impl = DynamicResult.getTypeValue(dynamicResult, EdgeToEdgeImpl.class);
55+
if (impl == null) {
56+
impl = new MaterialEdgeToEdgeUtilsImpl();
57+
}
5358
Log.i(TAG, "EdgeToEdgeImpl: " + impl);
5459
return impl;
5560
}
5661

62+
private static class MaterialEdgeToEdgeUtilsImpl implements EdgeToEdgeImpl {
63+
64+
private static int getScrimColor(SystemBarStyle systemBarStyle, boolean isDark) {
65+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
66+
// support dark mode
67+
return systemBarStyle.getScrimWithEnforcedContrast$activity_release(isDark);
68+
} else {
69+
return systemBarStyle.getScrim$activity_release(isDark);
70+
}
71+
}
72+
73+
@Override
74+
public void setUp(@NonNull SystemBarStyle statusBarStyle,
75+
@NonNull SystemBarStyle navigationBarStyle,
76+
@NonNull Window window,
77+
@NonNull View view,
78+
boolean statusBarIsDark,
79+
boolean navigationBarIsDark) {
80+
DynamicObjectUtils.asDynamicObject("com.google.android.material.internal.EdgeToEdgeUtils")
81+
.invokeMethod("applyEdgeToEdge",
82+
new Class[]{Window.class, boolean.class, Integer.class, Integer.class},
83+
new Object[]{window, true, getScrimColor(statusBarStyle, statusBarIsDark), getScrimColor(navigationBarStyle, navigationBarIsDark)});
84+
}
85+
86+
@Override
87+
public void adjustLayoutInDisplayCutoutMode(@NonNull Window window) {
88+
WindowManager.LayoutParams attributes = window.getAttributes();
89+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
90+
attributes.layoutInDisplayCutoutMode =
91+
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
92+
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
93+
attributes.layoutInDisplayCutoutMode =
94+
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
95+
}
96+
}
97+
}
98+
5799
private static boolean getDetectDarkMode(SystemBarStyle systemBarStyle, View view) {
58100
// internal val detectDarkMode: (Resources) -> Boolean
59101
// androidx.activity library
@@ -67,11 +109,6 @@ public static void enable(Activity activity, SystemBarStyle statusBarStyle, Syst
67109
return;
68110
}
69111

70-
if (impl == null) {
71-
Log.w(TAG, "enableEdgeToEdge, impl == null");
72-
return;
73-
}
74-
75112
Window window = activity.getWindow();
76113
View view = window.getDecorView();
77114
boolean statusBarIsDark = getDetectDarkMode(statusBarStyle, view);

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
package com.dede.basic
55

66
import android.animation.ValueAnimator
7-
import android.app.Activity
87
import android.content.Context
98
import android.content.Intent
109
import android.content.pm.PackageInfo
@@ -73,7 +72,4 @@ object Utils {
7372
return null to -1L
7473
}
7574

76-
val Activity.isPlatLogoActivity: Boolean
77-
get() = javaClass.simpleName == "PlatLogoActivity"
78-
7975
}

core/activity-actions/build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,13 @@ dependencies {
1515
implementation(project(":eggs:Tiramisu"))
1616
implementation(project(":eggs:S"))
1717
implementation(project(":eggs:R"))
18+
implementation(project(":eggs:Oreo"))
1819
implementation(project(":eggs:Nougat"))
20+
implementation(project(":eggs:Marshmallow"))
21+
implementation(project(":eggs:Lollipop"))
22+
implementation(project(":eggs:KitKat"))
23+
implementation(project(":eggs:JellyBean"))
24+
implementation(project(":eggs:IceCreamSandwich"))
1925

2026
implementation(libs.androidx.startup)
2127
implementation(platform(libs.androidx.compose.bom))

core/activity-actions/src/main/java/com/dede/android_eggs/activity_actions/ActivityActionDispatcher.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import android.content.Context
88
import android.os.Bundle
99
import androidx.startup.Initializer
1010
import com.dede.android_eggs.activity_actions.noOpDelegate
11-
import com.dede.android_eggs.util.actions.PlatLogoActivityAction
11+
import com.dede.android_eggs.util.actions.EggActivityAction
1212
import com.dede.android_eggs.util.actions.RequestNotificationPermissionAction
1313
import com.dede.android_eggs.util.actions.WarningDialogAction
1414

@@ -34,7 +34,7 @@ internal class ActivityActionDispatcher : Application.ActivityLifecycleCallbacks
3434
}
3535

3636
private val actions: Array<ActivityAction> = arrayOf(
37-
PlatLogoActivityAction(),
37+
EggActivityAction(),
3838
WarningDialogAction(),
3939
RequestNotificationPermissionAction(),
4040
)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.dede.android_eggs.util.actions
2+
3+
import android.app.Activity
4+
import androidx.activity.EdgeToEdgeCompat
5+
import com.dede.android_eggs.util.ActivityActionDispatcher
6+
import com.dede.android_eggs.views.main.util.EasterEggShortcutsHelp
7+
8+
internal class EggActivityAction : ActivityActionDispatcher.ActivityAction {
9+
10+
private val edgeToEdgePagers: Set<Class<out Activity>> = setOf(
11+
com.android_o.egg.octo.Ocquarium::class.java,
12+
com.android_m.egg.MLandActivity::class.java,
13+
com.android_l.egg.LLandActivity::class.java,
14+
com.android_k.egg.DessertCase::class.java,
15+
com.android_j.egg.BeanBag::class.java,
16+
com.android_i.egg.Nyandroid::class.java,
17+
)
18+
19+
private val Activity.isPlatLogoActivity: Boolean
20+
get() = javaClass.simpleName == "PlatLogoActivity"
21+
22+
override fun onPreCreate(activity: Activity) {
23+
if (activity.isPlatLogoActivity || edgeToEdgePagers.contains(activity.javaClass)) {
24+
EdgeToEdgeCompat.enable(activity)
25+
}
26+
}
27+
28+
override fun onCreate(activity: Activity) {
29+
if (activity.isPlatLogoActivity) {
30+
EasterEggShortcutsHelp.autoReportShortcutUsed(activity, activity.intent)
31+
}
32+
}
33+
}

0 commit comments

Comments
 (0)