Merge "Use SystemUI theme to inflate FrameLayout and SplashScreenView" into sc-v2-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
3415b5cf17
@@ -316,7 +316,8 @@ public final class SplashScreenView extends FrameLayout {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private SurfaceView createSurfaceView(@NonNull SplashScreenView view) {
|
private SurfaceView createSurfaceView(@NonNull SplashScreenView view) {
|
||||||
final SurfaceView surfaceView = new SurfaceView(view.getContext());
|
final Context viewContext = view.getContext();
|
||||||
|
final SurfaceView surfaceView = new SurfaceView(viewContext);
|
||||||
surfaceView.setPadding(0, 0, 0, 0);
|
surfaceView.setPadding(0, 0, 0, 0);
|
||||||
surfaceView.setBackground(mIconBackground);
|
surfaceView.setBackground(mIconBackground);
|
||||||
if (mSurfacePackage == null) {
|
if (mSurfacePackage == null) {
|
||||||
@@ -326,10 +327,10 @@ public final class SplashScreenView extends FrameLayout {
|
|||||||
+ Thread.currentThread().getId());
|
+ Thread.currentThread().getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
SurfaceControlViewHost viewHost = new SurfaceControlViewHost(mContext,
|
SurfaceControlViewHost viewHost = new SurfaceControlViewHost(viewContext,
|
||||||
mContext.getDisplay(),
|
viewContext.getDisplay(),
|
||||||
surfaceView.getHostToken());
|
surfaceView.getHostToken());
|
||||||
ImageView imageView = new ImageView(mContext);
|
ImageView imageView = new ImageView(viewContext);
|
||||||
imageView.setBackground(mIconDrawable);
|
imageView.setBackground(mIconDrawable);
|
||||||
viewHost.setView(imageView, mIconSize, mIconSize);
|
viewHost.setView(imageView, mIconSize, mIconSize);
|
||||||
SurfaceControlViewHost.SurfacePackage surfacePackage = viewHost.getSurfacePackage();
|
SurfaceControlViewHost.SurfacePackage surfacePackage = viewHost.getSurfacePackage();
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ import android.os.Trace;
|
|||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
|
import android.view.ContextThemeWrapper;
|
||||||
import android.view.SurfaceControl;
|
import android.view.SurfaceControl;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.window.SplashScreenView;
|
import android.window.SplashScreenView;
|
||||||
@@ -299,6 +300,11 @@ public class SplashscreenContentDrawer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Creates the wrapper with system theme to avoid unexpected styles from app. */
|
||||||
|
ContextThemeWrapper createViewContextWrapper(Context appContext) {
|
||||||
|
return new ContextThemeWrapper(appContext, mContext.getTheme());
|
||||||
|
}
|
||||||
|
|
||||||
/** The configuration of the splash screen window. */
|
/** The configuration of the splash screen window. */
|
||||||
public static class SplashScreenWindowAttrs {
|
public static class SplashScreenWindowAttrs {
|
||||||
private int mWindowBgResId = 0;
|
private int mWindowBgResId = 0;
|
||||||
@@ -472,7 +478,8 @@ public class SplashscreenContentDrawer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "fillViewWithIcon");
|
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "fillViewWithIcon");
|
||||||
final SplashScreenView.Builder builder = new SplashScreenView.Builder(mContext)
|
final ContextThemeWrapper wrapper = createViewContextWrapper(mContext);
|
||||||
|
final SplashScreenView.Builder builder = new SplashScreenView.Builder(wrapper)
|
||||||
.setBackgroundColor(mThemeColor)
|
.setBackgroundColor(mThemeColor)
|
||||||
.setOverlayDrawable(mOverlayDrawable)
|
.setOverlayDrawable(mOverlayDrawable)
|
||||||
.setIconSize(iconSize)
|
.setIconSize(iconSize)
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ public class StartingSurfaceDrawer {
|
|||||||
return mDisplayManager.getDisplay(displayId);
|
return mDisplayManager.getDisplay(displayId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getSplashScreenTheme(int splashScreenThemeResId, ActivityInfo activityInfo) {
|
int getSplashScreenTheme(int splashScreenThemeResId, ActivityInfo activityInfo) {
|
||||||
return splashScreenThemeResId != 0
|
return splashScreenThemeResId != 0
|
||||||
? splashScreenThemeResId
|
? splashScreenThemeResId
|
||||||
: activityInfo.getThemeResource() != 0 ? activityInfo.getThemeResource()
|
: activityInfo.getThemeResource() != 0 ? activityInfo.getThemeResource()
|
||||||
@@ -174,7 +174,7 @@ public class StartingSurfaceDrawer {
|
|||||||
|
|
||||||
final int displayId = taskInfo.displayId;
|
final int displayId = taskInfo.displayId;
|
||||||
final int taskId = taskInfo.taskId;
|
final int taskId = taskInfo.taskId;
|
||||||
Context context = mContext;
|
|
||||||
// replace with the default theme if the application didn't set
|
// replace with the default theme if the application didn't set
|
||||||
final int theme = getSplashScreenTheme(windowInfo.splashScreenThemeResId, activityInfo);
|
final int theme = getSplashScreenTheme(windowInfo.splashScreenThemeResId, activityInfo);
|
||||||
if (DEBUG_SPLASH_SCREEN) {
|
if (DEBUG_SPLASH_SCREEN) {
|
||||||
@@ -182,12 +182,16 @@ public class StartingSurfaceDrawer {
|
|||||||
+ " theme=" + Integer.toHexString(theme) + " task=" + taskInfo.taskId
|
+ " theme=" + Integer.toHexString(theme) + " task=" + taskInfo.taskId
|
||||||
+ " suggestType=" + suggestType);
|
+ " suggestType=" + suggestType);
|
||||||
}
|
}
|
||||||
|
|
||||||
final Display display = getDisplay(displayId);
|
final Display display = getDisplay(displayId);
|
||||||
if (display == null) {
|
if (display == null) {
|
||||||
// Can't show splash screen on requested display, so skip showing at all.
|
// Can't show splash screen on requested display, so skip showing at all.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Context context = displayId == DEFAULT_DISPLAY
|
||||||
|
? mContext : mContext.createDisplayContext(display);
|
||||||
|
if (context == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (theme != context.getThemeResId()) {
|
if (theme != context.getThemeResId()) {
|
||||||
try {
|
try {
|
||||||
context = context.createPackageContextAsUser(activityInfo.packageName,
|
context = context.createPackageContextAsUser(activityInfo.packageName,
|
||||||
@@ -298,7 +302,8 @@ public class StartingSurfaceDrawer {
|
|||||||
// Record whether create splash screen view success, notify to current thread after
|
// Record whether create splash screen view success, notify to current thread after
|
||||||
// create splash screen view finished.
|
// create splash screen view finished.
|
||||||
final SplashScreenViewSupplier viewSupplier = new SplashScreenViewSupplier();
|
final SplashScreenViewSupplier viewSupplier = new SplashScreenViewSupplier();
|
||||||
final FrameLayout rootLayout = new FrameLayout(context);
|
final FrameLayout rootLayout = new FrameLayout(
|
||||||
|
mSplashscreenContentDrawer.createViewContextWrapper(context));
|
||||||
rootLayout.setPadding(0, 0, 0, 0);
|
rootLayout.setPadding(0, 0, 0, 0);
|
||||||
rootLayout.setFitsSystemWindows(false);
|
rootLayout.setFitsSystemWindows(false);
|
||||||
final Runnable setViewSynchronized = () -> {
|
final Runnable setViewSynchronized = () -> {
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import static org.junit.Assert.assertEquals;
|
|||||||
import static org.junit.Assert.assertNotEquals;
|
import static org.junit.Assert.assertNotEquals;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.doAnswer;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
@@ -85,7 +86,6 @@ public class StartingSurfaceDrawerTests {
|
|||||||
|
|
||||||
static final class TestStartingSurfaceDrawer extends StartingSurfaceDrawer{
|
static final class TestStartingSurfaceDrawer extends StartingSurfaceDrawer{
|
||||||
int mAddWindowForTask = 0;
|
int mAddWindowForTask = 0;
|
||||||
int mViewThemeResId;
|
|
||||||
|
|
||||||
TestStartingSurfaceDrawer(Context context, ShellExecutor splashScreenExecutor,
|
TestStartingSurfaceDrawer(Context context, ShellExecutor splashScreenExecutor,
|
||||||
TransactionPool pool) {
|
TransactionPool pool) {
|
||||||
@@ -97,7 +97,6 @@ public class StartingSurfaceDrawerTests {
|
|||||||
WindowManager.LayoutParams params, int suggestType) {
|
WindowManager.LayoutParams params, int suggestType) {
|
||||||
// listen for addView
|
// listen for addView
|
||||||
mAddWindowForTask = taskId;
|
mAddWindowForTask = taskId;
|
||||||
mViewThemeResId = view.getContext().getThemeResId();
|
|
||||||
// Do not wait for background color
|
// Do not wait for background color
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -167,12 +166,15 @@ public class StartingSurfaceDrawerTests {
|
|||||||
final int taskId = 1;
|
final int taskId = 1;
|
||||||
final StartingWindowInfo windowInfo =
|
final StartingWindowInfo windowInfo =
|
||||||
createWindowInfo(taskId, 0);
|
createWindowInfo(taskId, 0);
|
||||||
|
final int[] theme = new int[1];
|
||||||
|
doAnswer(invocation -> theme[0] = (Integer) invocation.callRealMethod())
|
||||||
|
.when(mStartingSurfaceDrawer).getSplashScreenTheme(eq(0), any());
|
||||||
|
|
||||||
mStartingSurfaceDrawer.addSplashScreenStartingWindow(windowInfo, mBinder,
|
mStartingSurfaceDrawer.addSplashScreenStartingWindow(windowInfo, mBinder,
|
||||||
STARTING_WINDOW_TYPE_SPLASH_SCREEN);
|
STARTING_WINDOW_TYPE_SPLASH_SCREEN);
|
||||||
waitHandlerIdle(mTestHandler);
|
waitHandlerIdle(mTestHandler);
|
||||||
verify(mStartingSurfaceDrawer).addWindow(eq(taskId), eq(mBinder), any(), any(), any(),
|
verify(mStartingSurfaceDrawer).getSplashScreenTheme(eq(0), any());
|
||||||
eq(STARTING_WINDOW_TYPE_SPLASH_SCREEN));
|
assertNotEquals(theme[0], 0);
|
||||||
assertNotEquals(mStartingSurfaceDrawer.mViewThemeResId, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user