Skip to content

Commit ce9c9bf

Browse files
joechan-cq0xZOne
authored andcommitted
【Android】fix alibaba#1870
新容器创建时,使用上个容器的SystemUiOverlayStyle,初始化新容器的状态栏、导航栏颜色效果
1 parent 259c1ea commit ce9c9bf

File tree

2 files changed

+105
-11
lines changed

2 files changed

+105
-11
lines changed

android/src/main/java/com/idlefish/flutterboost/FlutterBoostUtils.java

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,28 @@
44

55
package com.idlefish.flutterboost;
66

7+
import android.app.Activity;
8+
import android.os.Build;
79
import android.os.Bundle;
810
import android.view.View;
911
import android.view.ViewGroup;
12+
import android.view.Window;
13+
import android.view.WindowManager;
1014

15+
import java.lang.reflect.Field;
1116
import java.util.HashMap;
1217
import java.util.Map;
1318
import java.util.Set;
1419
import java.util.UUID;
1520

21+
import androidx.annotation.NonNull;
22+
import androidx.annotation.Nullable;
23+
import androidx.core.view.WindowInsetsControllerCompat;
1624
import io.flutter.embedding.android.FlutterView;
1725
import io.flutter.embedding.engine.FlutterEngine;
1826
import io.flutter.embedding.engine.plugins.FlutterPlugin;
27+
import io.flutter.embedding.engine.systemchannels.PlatformChannel;
28+
import io.flutter.plugin.platform.PlatformPlugin;
1929

2030
/**
2131
* Helper methods to deal with common tasks.
@@ -82,4 +92,79 @@ public static FlutterView findFlutterView(View view) {
8292
}
8393
return null;
8494
}
95+
96+
@Nullable
97+
public static PlatformChannel.SystemChromeStyle getCurrentSystemUiOverlayTheme(PlatformPlugin platformPlugin) {
98+
if (platformPlugin != null) {
99+
try {
100+
Field field = platformPlugin.getClass().getDeclaredField("currentTheme");
101+
field.setAccessible(true);
102+
return (PlatformChannel.SystemChromeStyle) field.get(platformPlugin);
103+
} catch (NoSuchFieldException e) {
104+
e.printStackTrace();
105+
} catch (IllegalAccessException e) {
106+
e.printStackTrace();
107+
}
108+
}
109+
return null;
110+
}
111+
112+
public static void setSystemChromeSystemUIOverlayStyle(@NonNull Activity activity,
113+
PlatformChannel.SystemChromeStyle systemChromeStyle) {
114+
Window window = activity.getWindow();
115+
View view = window.getDecorView();
116+
WindowInsetsControllerCompat windowInsetsControllerCompat =
117+
new WindowInsetsControllerCompat(window, view);
118+
119+
if (Build.VERSION.SDK_INT < 30) {
120+
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
121+
window.clearFlags(
122+
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
123+
| WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
124+
}
125+
if (Build.VERSION.SDK_INT >= 23) {
126+
if (systemChromeStyle.statusBarIconBrightness != null) {
127+
switch (systemChromeStyle.statusBarIconBrightness) {
128+
case DARK:
129+
windowInsetsControllerCompat.setAppearanceLightStatusBars(true);
130+
break;
131+
case LIGHT:
132+
windowInsetsControllerCompat.setAppearanceLightStatusBars(false);
133+
break;
134+
}
135+
}
136+
137+
if (systemChromeStyle.statusBarColor != null) {
138+
window.setStatusBarColor(systemChromeStyle.statusBarColor);
139+
}
140+
}
141+
if (systemChromeStyle.systemStatusBarContrastEnforced != null && Build.VERSION.SDK_INT >= 29) {
142+
window.setStatusBarContrastEnforced(systemChromeStyle.systemStatusBarContrastEnforced);
143+
}
144+
145+
if (Build.VERSION.SDK_INT >= 26) {
146+
if (systemChromeStyle.systemNavigationBarIconBrightness != null) {
147+
switch (systemChromeStyle.systemNavigationBarIconBrightness) {
148+
case DARK:
149+
windowInsetsControllerCompat.setAppearanceLightNavigationBars(true);
150+
break;
151+
case LIGHT:
152+
windowInsetsControllerCompat.setAppearanceLightNavigationBars(false);
153+
break;
154+
}
155+
}
156+
157+
if (systemChromeStyle.systemNavigationBarColor != null) {
158+
window.setNavigationBarColor(systemChromeStyle.systemNavigationBarColor);
159+
}
160+
}
161+
if (systemChromeStyle.systemNavigationBarDividerColor != null && Build.VERSION.SDK_INT >= 28) {
162+
window.setNavigationBarDividerColor(systemChromeStyle.systemNavigationBarDividerColor);
163+
}
164+
if (systemChromeStyle.systemNavigationBarContrastEnforced != null
165+
&& Build.VERSION.SDK_INT >= 29) {
166+
window.setNavigationBarContrastEnforced(
167+
systemChromeStyle.systemNavigationBarContrastEnforced);
168+
}
169+
}
85170
}

android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostActivity.java

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,6 @@
44

55
package com.idlefish.flutterboost.containers;
66

7-
import static com.idlefish.flutterboost.containers.FlutterActivityLaunchConfigs.ACTIVITY_RESULT_KEY;
8-
import static com.idlefish.flutterboost.containers.FlutterActivityLaunchConfigs.EXTRA_BACKGROUND_MODE;
9-
import static com.idlefish.flutterboost.containers.FlutterActivityLaunchConfigs.EXTRA_CACHED_ENGINE_ID;
10-
import static com.idlefish.flutterboost.containers.FlutterActivityLaunchConfigs.EXTRA_DESTROY_ENGINE_WITH_ACTIVITY;
11-
import static com.idlefish.flutterboost.containers.FlutterActivityLaunchConfigs.EXTRA_ENABLE_STATE_RESTORATION;
12-
import static com.idlefish.flutterboost.containers.FlutterActivityLaunchConfigs.EXTRA_UNIQUE_ID;
13-
import static com.idlefish.flutterboost.containers.FlutterActivityLaunchConfigs.EXTRA_URL;
14-
import static com.idlefish.flutterboost.containers.FlutterActivityLaunchConfigs.EXTRA_URL_PARAM;
15-
167
import android.app.Activity;
178
import android.content.Context;
189
import android.content.Intent;
@@ -37,14 +28,24 @@
3728
import io.flutter.embedding.android.RenderMode;
3829
import io.flutter.embedding.engine.FlutterEngine;
3930
import io.flutter.embedding.engine.renderer.FlutterRenderer;
31+
import io.flutter.embedding.engine.systemchannels.PlatformChannel;
4032
import io.flutter.plugin.platform.PlatformPlugin;
4133

34+
import static com.idlefish.flutterboost.containers.FlutterActivityLaunchConfigs.ACTIVITY_RESULT_KEY;
35+
import static com.idlefish.flutterboost.containers.FlutterActivityLaunchConfigs.EXTRA_BACKGROUND_MODE;
36+
import static com.idlefish.flutterboost.containers.FlutterActivityLaunchConfigs.EXTRA_CACHED_ENGINE_ID;
37+
import static com.idlefish.flutterboost.containers.FlutterActivityLaunchConfigs.EXTRA_DESTROY_ENGINE_WITH_ACTIVITY;
38+
import static com.idlefish.flutterboost.containers.FlutterActivityLaunchConfigs.EXTRA_ENABLE_STATE_RESTORATION;
39+
import static com.idlefish.flutterboost.containers.FlutterActivityLaunchConfigs.EXTRA_UNIQUE_ID;
40+
import static com.idlefish.flutterboost.containers.FlutterActivityLaunchConfigs.EXTRA_URL;
41+
import static com.idlefish.flutterboost.containers.FlutterActivityLaunchConfigs.EXTRA_URL_PARAM;
42+
4243
public class FlutterBoostActivity extends FlutterActivity implements FlutterViewContainer {
4344
private static final String TAG = "FlutterBoost_java";
4445
private final String who = UUID.randomUUID().toString();
4546
private final FlutterTextureHooker textureHooker =new FlutterTextureHooker();
4647
private FlutterView flutterView;
47-
private PlatformPlugin platformPlugin;
48+
protected PlatformPlugin platformPlugin;
4849
private LifecycleStage stage;
4950
private boolean isAttached = false;
5051

@@ -58,7 +59,15 @@ protected void onCreate(Bundle savedInstanceState) {
5859
final FlutterContainerManager containerManager = FlutterContainerManager.instance();
5960
// try to detach prevous container from the engine.
6061
FlutterViewContainer top = containerManager.getTopContainer();
61-
if (top != null && top != this) top.detachFromEngineIfNeeded();
62+
if (top != null && top != this) {
63+
if (top instanceof FlutterBoostActivity) {
64+
PlatformChannel.SystemChromeStyle preContainerTheme = FlutterBoostUtils.getCurrentSystemUiOverlayTheme(((FlutterBoostActivity) top).platformPlugin);
65+
if (preContainerTheme != null) {
66+
FlutterBoostUtils.setSystemChromeSystemUIOverlayStyle(this, preContainerTheme);
67+
}
68+
}
69+
top.detachFromEngineIfNeeded();
70+
}
6271
super.onCreate(savedInstanceState);
6372
stage = LifecycleStage.ON_CREATE;
6473
flutterView = FlutterBoostUtils.findFlutterView(getWindow().getDecorView());

0 commit comments

Comments
 (0)