Fix bug causing the Overlay Settings page to be hidden behind overlays.

Test: Manually using an app that displays a full-screen overlay.
Test: make RunSettingsRoboTests -j32 ROBOTEST_FILTER=DrawOverlayDetailsTest
Bug: 72734249

Change-Id: I84b61fea2a793bebfac025ca3a209286ceeef963
This commit is contained in:
Peter Visontay
2018-02-12 14:46:06 +00:00
parent a42bfa83df
commit 9aeaa197a9
2 changed files with 24 additions and 11 deletions

View File

@@ -15,6 +15,8 @@
*/ */
package com.android.settings.applications.appinfo; package com.android.settings.applications.appinfo;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.AppOpsManager; import android.app.AppOpsManager;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
@@ -30,8 +32,9 @@ import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference.OnPreferenceChangeListener; import android.support.v7.preference.Preference.OnPreferenceChangeListener;
import android.support.v7.preference.Preference.OnPreferenceClickListener; import android.support.v7.preference.Preference.OnPreferenceClickListener;
import android.util.Log; import android.util.Log;
import android.view.Window;
import android.view.WindowManager; import android.view.WindowManager;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R; import com.android.settings.R;
@@ -86,15 +89,16 @@ public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenc
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
getActivity().getWindow().addFlags( getActivity().getWindow().addPrivateFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
} }
@Override @Override
public void onPause() { public void onPause() {
getActivity().getWindow().clearFlags(
WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
super.onPause(); super.onPause();
Window window = getActivity().getWindow();
WindowManager.LayoutParams attrs = window.getAttributes();
attrs.privateFlags &= ~PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
window.setAttributes(attrs);
} }
@Override @Override

View File

@@ -16,6 +16,7 @@
package com.android.settings.applications.appinfo; package com.android.settings.applications.appinfo;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.nullable; import static org.mockito.Matchers.nullable;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
@@ -27,6 +28,8 @@ import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.view.Window; import android.view.Window;
import android.view.WindowManager.LayoutParams;
import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
@@ -37,9 +40,8 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Answers; import org.mockito.Answers;
import org.mockito.InOrder; import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.mockito.Spy; import org.mockito.Spy;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
@@ -55,6 +57,8 @@ public class DrawOverlayDetailsTest {
@Mock @Mock
private Window mWindow; private Window mWindow;
private LayoutParams layoutParams;
private FakeFeatureFactory mFeatureFactory; private FakeFeatureFactory mFeatureFactory;
@Spy @Spy
@@ -65,6 +69,7 @@ public class DrawOverlayDetailsTest {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mFeatureFactory = FakeFeatureFactory.setupForTest(); mFeatureFactory = FakeFeatureFactory.setupForTest();
layoutParams = new LayoutParams();
} }
@Test @Test
@@ -86,13 +91,17 @@ public class DrawOverlayDetailsTest {
public void hideNonSystemOverlaysWhenResumed() { public void hideNonSystemOverlaysWhenResumed() {
when(mFragment.getActivity()).thenReturn(mActivity); when(mFragment.getActivity()).thenReturn(mActivity);
when(mActivity.getWindow()).thenReturn(mWindow); when(mActivity.getWindow()).thenReturn(mWindow);
when(mWindow.getAttributes()).thenReturn(layoutParams);
mFragment.onResume(); mFragment.onResume();
verify(mWindow).addPrivateFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
mFragment.onPause(); mFragment.onPause();
InOrder inOrder = Mockito.inOrder(mWindow); // There's no Window.clearPrivateFlags() method, so the Window.attributes are updated.
inOrder.verify(mWindow).addFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); ArgumentCaptor<LayoutParams> paramCaptor = ArgumentCaptor.forClass(LayoutParams.class);
inOrder.verify(mWindow).clearFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); verify(mWindow).setAttributes(paramCaptor.capture());
inOrder.verifyNoMoreInteractions(); assertEquals(0,
paramCaptor.getValue().privateFlags & PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
} }
} }