Fix boot timeout and reduce boot time
Since the notification shade has been separated from status bar
to another window where the keyguard resides. It won't be visible
until KeyguardViewMediator receives system ready.
By making the visibility of notification shade consistent with the
initial state of keyguard when attaching the window, window manager
won't miss to wait for it. That avoids dismissing boot animation
too early. The windows of notification shade and wallpaper can also
be drawn earlier, that reduces the total waiting time of drawn
windows by about 50~100ms on a mid-end device.
The logic of wait-for-visible-not-drawn-window is restored to be
the same as Q. The isVisible considers the independent visibility
of wallpaper and visibility of the insets client. The isDrawnLw
accepts READY_TO_SHOW so even keyguard decides not to use wallpaper,
the procedure won't wait until timeout.
Bug: 160271169
Bug: 158144185
Bug: 157746100
Bug: 157281833
Test: atest DisplayContentTests# \
testShouldWaitForSystemDecorWindowsOnBoot_OnDefaultDisplay
NotificationShadeWindowControllerTest#attach_visibleWithWallpaper
Test: Boot with enable/disable keyguard/wallpaper, there is no timeout
and black screen or flickering.
Change-Id: I2f979055e89ae5e40af05e469741bb89e2e24ce6
This commit is contained in:
@@ -23,6 +23,7 @@ import android.view.WindowManager;
|
|||||||
import com.android.systemui.car.window.SystemUIOverlayWindowController;
|
import com.android.systemui.car.window.SystemUIOverlayWindowController;
|
||||||
import com.android.systemui.colorextraction.SysuiColorExtractor;
|
import com.android.systemui.colorextraction.SysuiColorExtractor;
|
||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
|
import com.android.systemui.keyguard.KeyguardViewMediator;
|
||||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||||
import com.android.systemui.statusbar.phone.BiometricUnlockController;
|
import com.android.systemui.statusbar.phone.BiometricUnlockController;
|
||||||
import com.android.systemui.statusbar.phone.DozeParameters;
|
import com.android.systemui.statusbar.phone.DozeParameters;
|
||||||
@@ -49,12 +50,14 @@ public class DummyNotificationShadeWindowController extends NotificationShadeWin
|
|||||||
DozeParameters dozeParameters,
|
DozeParameters dozeParameters,
|
||||||
StatusBarStateController statusBarStateController,
|
StatusBarStateController statusBarStateController,
|
||||||
ConfigurationController configurationController,
|
ConfigurationController configurationController,
|
||||||
|
KeyguardViewMediator keyguardViewMediator,
|
||||||
KeyguardBypassController keyguardBypassController,
|
KeyguardBypassController keyguardBypassController,
|
||||||
SysuiColorExtractor colorExtractor,
|
SysuiColorExtractor colorExtractor,
|
||||||
DumpManager dumpManager,
|
DumpManager dumpManager,
|
||||||
SystemUIOverlayWindowController overlayWindowController) {
|
SystemUIOverlayWindowController overlayWindowController) {
|
||||||
super(context, windowManager, activityManager, dozeParameters, statusBarStateController,
|
super(context, windowManager, activityManager, dozeParameters, statusBarStateController,
|
||||||
configurationController, keyguardBypassController, colorExtractor, dumpManager);
|
configurationController, keyguardViewMediator, keyguardBypassController,
|
||||||
|
colorExtractor, dumpManager);
|
||||||
mOverlayWindowController = overlayWindowController;
|
mOverlayWindowController = overlayWindowController;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ public class NotificationShadeWindowController implements Callback, Dumpable,
|
|||||||
private final boolean mKeyguardScreenRotation;
|
private final boolean mKeyguardScreenRotation;
|
||||||
private final long mLockScreenDisplayTimeout;
|
private final long mLockScreenDisplayTimeout;
|
||||||
private final Display.Mode mKeyguardDisplayMode;
|
private final Display.Mode mKeyguardDisplayMode;
|
||||||
|
private final KeyguardViewMediator mKeyguardViewMediator;
|
||||||
private final KeyguardBypassController mKeyguardBypassController;
|
private final KeyguardBypassController mKeyguardBypassController;
|
||||||
private ViewGroup mNotificationShadeView;
|
private ViewGroup mNotificationShadeView;
|
||||||
private LayoutParams mLp;
|
private LayoutParams mLp;
|
||||||
@@ -104,6 +105,7 @@ public class NotificationShadeWindowController implements Callback, Dumpable,
|
|||||||
IActivityManager activityManager, DozeParameters dozeParameters,
|
IActivityManager activityManager, DozeParameters dozeParameters,
|
||||||
StatusBarStateController statusBarStateController,
|
StatusBarStateController statusBarStateController,
|
||||||
ConfigurationController configurationController,
|
ConfigurationController configurationController,
|
||||||
|
KeyguardViewMediator keyguardViewMediator,
|
||||||
KeyguardBypassController keyguardBypassController, SysuiColorExtractor colorExtractor,
|
KeyguardBypassController keyguardBypassController, SysuiColorExtractor colorExtractor,
|
||||||
DumpManager dumpManager) {
|
DumpManager dumpManager) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
@@ -113,6 +115,7 @@ public class NotificationShadeWindowController implements Callback, Dumpable,
|
|||||||
mDozeParameters = dozeParameters;
|
mDozeParameters = dozeParameters;
|
||||||
mScreenBrightnessDoze = mDozeParameters.getScreenBrightnessDoze();
|
mScreenBrightnessDoze = mDozeParameters.getScreenBrightnessDoze();
|
||||||
mLpChanged = new LayoutParams();
|
mLpChanged = new LayoutParams();
|
||||||
|
mKeyguardViewMediator = keyguardViewMediator;
|
||||||
mKeyguardBypassController = keyguardBypassController;
|
mKeyguardBypassController = keyguardBypassController;
|
||||||
mColorExtractor = colorExtractor;
|
mColorExtractor = colorExtractor;
|
||||||
dumpManager.registerDumpable(getClass().getName(), this);
|
dumpManager.registerDumpable(getClass().getName(), this);
|
||||||
@@ -202,6 +205,11 @@ public class NotificationShadeWindowController implements Callback, Dumpable,
|
|||||||
mWindowManager.addView(mNotificationShadeView, mLp);
|
mWindowManager.addView(mNotificationShadeView, mLp);
|
||||||
mLpChanged.copyFrom(mLp);
|
mLpChanged.copyFrom(mLp);
|
||||||
onThemeChanged();
|
onThemeChanged();
|
||||||
|
|
||||||
|
// Make the state consistent with KeyguardViewMediator#setupLocked during initialization.
|
||||||
|
if (mKeyguardViewMediator.isShowingAndNotOccluded()) {
|
||||||
|
setKeyguardShowing(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setNotificationShadeView(ViewGroup view) {
|
public void setNotificationShadeView(ViewGroup view) {
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ import com.android.internal.statusbar.IStatusBarService;
|
|||||||
import com.android.systemui.SysuiTestCase;
|
import com.android.systemui.SysuiTestCase;
|
||||||
import com.android.systemui.colorextraction.SysuiColorExtractor;
|
import com.android.systemui.colorextraction.SysuiColorExtractor;
|
||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
|
import com.android.systemui.keyguard.KeyguardViewMediator;
|
||||||
import com.android.systemui.model.SysUiState;
|
import com.android.systemui.model.SysUiState;
|
||||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||||
import com.android.systemui.shared.system.QuickStepContract;
|
import com.android.systemui.shared.system.QuickStepContract;
|
||||||
@@ -135,6 +136,8 @@ public class BubbleControllerTest extends SysuiTestCase {
|
|||||||
@Mock
|
@Mock
|
||||||
private SysuiStatusBarStateController mStatusBarStateController;
|
private SysuiStatusBarStateController mStatusBarStateController;
|
||||||
@Mock
|
@Mock
|
||||||
|
private KeyguardViewMediator mKeyguardViewMediator;
|
||||||
|
@Mock
|
||||||
private KeyguardBypassController mKeyguardBypassController;
|
private KeyguardBypassController mKeyguardBypassController;
|
||||||
@Mock
|
@Mock
|
||||||
private FloatingContentCoordinator mFloatingContentCoordinator;
|
private FloatingContentCoordinator mFloatingContentCoordinator;
|
||||||
@@ -198,8 +201,8 @@ public class BubbleControllerTest extends SysuiTestCase {
|
|||||||
|
|
||||||
mNotificationShadeWindowController = new NotificationShadeWindowController(mContext,
|
mNotificationShadeWindowController = new NotificationShadeWindowController(mContext,
|
||||||
mWindowManager, mActivityManager, mDozeParameters, mStatusBarStateController,
|
mWindowManager, mActivityManager, mDozeParameters, mStatusBarStateController,
|
||||||
mConfigurationController, mKeyguardBypassController, mColorExtractor,
|
mConfigurationController, mKeyguardViewMediator, mKeyguardBypassController,
|
||||||
mDumpManager);
|
mColorExtractor, mDumpManager);
|
||||||
mNotificationShadeWindowController.setNotificationShadeView(mNotificationShadeWindowView);
|
mNotificationShadeWindowController.setNotificationShadeView(mNotificationShadeWindowView);
|
||||||
mNotificationShadeWindowController.attach();
|
mNotificationShadeWindowController.attach();
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ import com.android.internal.statusbar.IStatusBarService;
|
|||||||
import com.android.systemui.SysuiTestCase;
|
import com.android.systemui.SysuiTestCase;
|
||||||
import com.android.systemui.colorextraction.SysuiColorExtractor;
|
import com.android.systemui.colorextraction.SysuiColorExtractor;
|
||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
|
import com.android.systemui.keyguard.KeyguardViewMediator;
|
||||||
import com.android.systemui.model.SysUiState;
|
import com.android.systemui.model.SysUiState;
|
||||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||||
import com.android.systemui.statusbar.FeatureFlags;
|
import com.android.systemui.statusbar.FeatureFlags;
|
||||||
@@ -132,6 +133,8 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase {
|
|||||||
@Mock
|
@Mock
|
||||||
private SysuiStatusBarStateController mStatusBarStateController;
|
private SysuiStatusBarStateController mStatusBarStateController;
|
||||||
@Mock
|
@Mock
|
||||||
|
private KeyguardViewMediator mKeyguardViewMediator;
|
||||||
|
@Mock
|
||||||
private KeyguardBypassController mKeyguardBypassController;
|
private KeyguardBypassController mKeyguardBypassController;
|
||||||
@Mock
|
@Mock
|
||||||
private FloatingContentCoordinator mFloatingContentCoordinator;
|
private FloatingContentCoordinator mFloatingContentCoordinator;
|
||||||
@@ -194,8 +197,8 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase {
|
|||||||
// Bubbles get added to status bar window view
|
// Bubbles get added to status bar window view
|
||||||
mNotificationShadeWindowController = new NotificationShadeWindowController(mContext,
|
mNotificationShadeWindowController = new NotificationShadeWindowController(mContext,
|
||||||
mWindowManager, mActivityManager, mDozeParameters, mStatusBarStateController,
|
mWindowManager, mActivityManager, mDozeParameters, mStatusBarStateController,
|
||||||
mConfigurationController, mKeyguardBypassController, mColorExtractor,
|
mConfigurationController, mKeyguardViewMediator, mKeyguardBypassController,
|
||||||
mDumpManager);
|
mColorExtractor, mDumpManager);
|
||||||
mNotificationShadeWindowController.setNotificationShadeView(mNotificationShadeWindowView);
|
mNotificationShadeWindowController.setNotificationShadeView(mNotificationShadeWindowView);
|
||||||
mNotificationShadeWindowController.attach();
|
mNotificationShadeWindowController.attach();
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone;
|
|||||||
|
|
||||||
import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
|
import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
|
||||||
import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
|
import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
|
||||||
|
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
@@ -41,6 +42,7 @@ import com.android.internal.colorextraction.ColorExtractor;
|
|||||||
import com.android.systemui.SysuiTestCase;
|
import com.android.systemui.SysuiTestCase;
|
||||||
import com.android.systemui.colorextraction.SysuiColorExtractor;
|
import com.android.systemui.colorextraction.SysuiColorExtractor;
|
||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
|
import com.android.systemui.keyguard.KeyguardViewMediator;
|
||||||
import com.android.systemui.statusbar.SysuiStatusBarStateController;
|
import com.android.systemui.statusbar.SysuiStatusBarStateController;
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||||
|
|
||||||
@@ -63,6 +65,7 @@ public class NotificationShadeWindowControllerTest extends SysuiTestCase {
|
|||||||
@Mock private IActivityManager mActivityManager;
|
@Mock private IActivityManager mActivityManager;
|
||||||
@Mock private SysuiStatusBarStateController mStatusBarStateController;
|
@Mock private SysuiStatusBarStateController mStatusBarStateController;
|
||||||
@Mock private ConfigurationController mConfigurationController;
|
@Mock private ConfigurationController mConfigurationController;
|
||||||
|
@Mock private KeyguardViewMediator mKeyguardViewMediator;
|
||||||
@Mock private KeyguardBypassController mKeyguardBypassController;
|
@Mock private KeyguardBypassController mKeyguardBypassController;
|
||||||
@Mock private SysuiColorExtractor mColorExtractor;
|
@Mock private SysuiColorExtractor mColorExtractor;
|
||||||
@Mock ColorExtractor.GradientColors mGradientColors;
|
@Mock ColorExtractor.GradientColors mGradientColors;
|
||||||
@@ -79,8 +82,8 @@ public class NotificationShadeWindowControllerTest extends SysuiTestCase {
|
|||||||
|
|
||||||
mNotificationShadeWindowController = new NotificationShadeWindowController(mContext,
|
mNotificationShadeWindowController = new NotificationShadeWindowController(mContext,
|
||||||
mWindowManager, mActivityManager, mDozeParameters, mStatusBarStateController,
|
mWindowManager, mActivityManager, mDozeParameters, mStatusBarStateController,
|
||||||
mConfigurationController, mKeyguardBypassController, mColorExtractor,
|
mConfigurationController, mKeyguardViewMediator, mKeyguardBypassController,
|
||||||
mDumpManager);
|
mColorExtractor, mDumpManager);
|
||||||
mNotificationShadeWindowController.setNotificationShadeView(mNotificationShadeWindowView);
|
mNotificationShadeWindowController.setNotificationShadeView(mNotificationShadeWindowView);
|
||||||
|
|
||||||
mNotificationShadeWindowController.attach();
|
mNotificationShadeWindowController.attach();
|
||||||
@@ -119,6 +122,17 @@ public class NotificationShadeWindowControllerTest extends SysuiTestCase {
|
|||||||
mNotificationShadeWindowController.setForcePluginOpen(true);
|
mNotificationShadeWindowController.setForcePluginOpen(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void attach_visibleWithWallpaper() {
|
||||||
|
clearInvocations(mWindowManager);
|
||||||
|
when(mKeyguardViewMediator.isShowingAndNotOccluded()).thenReturn(true);
|
||||||
|
mNotificationShadeWindowController.attach();
|
||||||
|
|
||||||
|
verify(mNotificationShadeWindowView).setVisibility(eq(View.VISIBLE));
|
||||||
|
verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture());
|
||||||
|
assertThat((mLayoutParameters.getValue().flags & FLAG_SHOW_WALLPAPER) != 0).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void setBackgroundBlurRadius_expandedWithBlurs() {
|
public void setBackgroundBlurRadius_expandedWithBlurs() {
|
||||||
mNotificationShadeWindowController.setBackgroundBlurRadius(10);
|
mNotificationShadeWindowController.setBackgroundBlurRadius(10);
|
||||||
|
|||||||
@@ -3647,15 +3647,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
|||||||
drawnWindowTypes.put(TYPE_NOTIFICATION_SHADE, true);
|
drawnWindowTypes.put(TYPE_NOTIFICATION_SHADE, true);
|
||||||
|
|
||||||
final WindowState visibleNotDrawnWindow = getWindow(w -> {
|
final WindowState visibleNotDrawnWindow = getWindow(w -> {
|
||||||
boolean isVisible = w.mViewVisibility == View.VISIBLE && !w.mObscured;
|
final boolean isVisible = w.isVisible() && !w.mObscured;
|
||||||
boolean hasDrawn = w.isDrawnLw() && w.hasDrawnLw();
|
final boolean isDrawn = w.isDrawnLw();
|
||||||
if (isVisible && !hasDrawn) {
|
if (isVisible && !isDrawn) {
|
||||||
ProtoLog.d(WM_DEBUG_BOOT,
|
ProtoLog.d(WM_DEBUG_BOOT,
|
||||||
"DisplayContent: boot is waiting for window of type %d to be drawn",
|
"DisplayContent: boot is waiting for window of type %d to be drawn",
|
||||||
w.mAttrs.type);
|
w.mAttrs.type);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (hasDrawn) {
|
if (isDrawn) {
|
||||||
switch (w.mAttrs.type) {
|
switch (w.mAttrs.type) {
|
||||||
case TYPE_BOOT_PROGRESS:
|
case TYPE_BOOT_PROGRESS:
|
||||||
case TYPE_BASE_APPLICATION:
|
case TYPE_BASE_APPLICATION:
|
||||||
|
|||||||
@@ -482,12 +482,17 @@ public class DisplayContentTests extends WindowTestsBase {
|
|||||||
final DisplayContent defaultDisplay = mWm.getDefaultDisplayContentLocked();
|
final DisplayContent defaultDisplay = mWm.getDefaultDisplayContentLocked();
|
||||||
final WindowState[] windows = createNotDrawnWindowsOn(defaultDisplay,
|
final WindowState[] windows = createNotDrawnWindowsOn(defaultDisplay,
|
||||||
TYPE_WALLPAPER, TYPE_APPLICATION);
|
TYPE_WALLPAPER, TYPE_APPLICATION);
|
||||||
|
final WindowState wallpaper = windows[0];
|
||||||
|
assertTrue(wallpaper.mIsWallpaper);
|
||||||
|
// By default WindowState#mWallpaperVisible is false.
|
||||||
|
assertFalse(wallpaper.isVisible());
|
||||||
|
|
||||||
// Verify waiting for windows to be drawn.
|
// Verify waiting for windows to be drawn.
|
||||||
assertTrue(defaultDisplay.shouldWaitForSystemDecorWindowsOnBoot());
|
assertTrue(defaultDisplay.shouldWaitForSystemDecorWindowsOnBoot());
|
||||||
|
|
||||||
// Verify not waiting for drawn windows.
|
// Verify not waiting for drawn window and invisible wallpaper.
|
||||||
makeWindowsDrawnState(windows, WindowStateAnimator.HAS_DRAWN);
|
setDrawnState(WindowStateAnimator.READY_TO_SHOW, wallpaper);
|
||||||
|
setDrawnState(WindowStateAnimator.HAS_DRAWN, windows[1]);
|
||||||
assertFalse(defaultDisplay.shouldWaitForSystemDecorWindowsOnBoot());
|
assertFalse(defaultDisplay.shouldWaitForSystemDecorWindowsOnBoot());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -508,26 +513,10 @@ public class DisplayContentTests extends WindowTestsBase {
|
|||||||
assertTrue(secondaryDisplay.shouldWaitForSystemDecorWindowsOnBoot());
|
assertTrue(secondaryDisplay.shouldWaitForSystemDecorWindowsOnBoot());
|
||||||
|
|
||||||
// Verify not waiting for drawn windows on display with system decorations.
|
// Verify not waiting for drawn windows on display with system decorations.
|
||||||
makeWindowsDrawnState(windows, WindowStateAnimator.HAS_DRAWN);
|
setDrawnState(WindowStateAnimator.HAS_DRAWN, windows);
|
||||||
assertFalse(secondaryDisplay.shouldWaitForSystemDecorWindowsOnBoot());
|
assertFalse(secondaryDisplay.shouldWaitForSystemDecorWindowsOnBoot());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testShouldWaitForSystemDecorWindowsOnBoot_OnWindowReadyToShowAndDrawn() {
|
|
||||||
mWm.mSystemBooted = true;
|
|
||||||
final DisplayContent defaultDisplay = mWm.getDefaultDisplayContentLocked();
|
|
||||||
final WindowState[] windows = createNotDrawnWindowsOn(defaultDisplay,
|
|
||||||
TYPE_WALLPAPER, TYPE_APPLICATION);
|
|
||||||
|
|
||||||
// Verify waiting for windows to be drawn.
|
|
||||||
makeWindowsDrawnState(windows, WindowStateAnimator.READY_TO_SHOW);
|
|
||||||
assertTrue(defaultDisplay.shouldWaitForSystemDecorWindowsOnBoot());
|
|
||||||
|
|
||||||
// Verify not waiting for drawn windows.
|
|
||||||
makeWindowsDrawnState(windows, WindowStateAnimator.HAS_DRAWN);
|
|
||||||
assertFalse(defaultDisplay.shouldWaitForSystemDecorWindowsOnBoot());
|
|
||||||
}
|
|
||||||
|
|
||||||
private WindowState[] createNotDrawnWindowsOn(DisplayContent displayContent, int... types) {
|
private WindowState[] createNotDrawnWindowsOn(DisplayContent displayContent, int... types) {
|
||||||
final WindowState[] windows = new WindowState[types.length];
|
final WindowState[] windows = new WindowState[types.length];
|
||||||
for (int i = 0; i < types.length; i++) {
|
for (int i = 0; i < types.length; i++) {
|
||||||
@@ -538,9 +527,9 @@ public class DisplayContentTests extends WindowTestsBase {
|
|||||||
return windows;
|
return windows;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void makeWindowsDrawnState(WindowState[] windows, int state) {
|
private static void setDrawnState(int state, WindowState... windows) {
|
||||||
for (WindowState window : windows) {
|
for (WindowState window : windows) {
|
||||||
window.mHasSurface = true;
|
window.mHasSurface = state != WindowStateAnimator.NO_SURFACE;
|
||||||
window.mWinAnimator.mDrawState = state;
|
window.mWinAnimator.mDrawState = state;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user