Merge "Fix "Add Network" button on SavedAccessPoints page." into oc-mr1-dev
diff --git a/res/layout/data_usage_spinner_item.xml b/res/layout/data_usage_spinner_item.xml
new file mode 100644
index 0000000..1706edf
--- /dev/null
+++ b/res/layout/data_usage_spinner_item.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Copied from frameworks/base/core/res/res/layout/simple_spinner_item.xml and modified
+ layout height and added padding. -->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@android:id/text1"
+ style="?android:attr/spinnerItemStyle"
+ android:singleLine="true"
+ android:layout_width="match_parent"
+ android:layout_height="?android:attr/listPreferredItemHeightSmall"
+ android:ellipsize="marquee"
+ android:textAlignment="inherit"
+ android:gravity="center"
+ android:paddingStart="30dp"
+ android:paddingEnd="30dp"/>
\ No newline at end of file
diff --git a/src/com/android/settings/applications/DrawOverlayDetails.java b/src/com/android/settings/applications/DrawOverlayDetails.java
index c6f3cc0..78f1c08 100644
--- a/src/com/android/settings/applications/DrawOverlayDetails.java
+++ b/src/com/android/settings/applications/DrawOverlayDetails.java
@@ -29,12 +29,13 @@
import android.support.v7.preference.Preference.OnPreferenceClickListener;
import android.util.Log;
+import android.view.Window;
+import android.view.WindowManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.applications.AppStateAppOpsBridge.PermissionState;
import com.android.settings.applications.AppStateOverlayBridge.OverlayState;
-import com.android.settings.core.TouchOverlayManager;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.applications.ApplicationsState.AppEntry;
@@ -60,8 +61,6 @@
private Intent mSettingsIntent;
private OverlayState mOverlayState;
- private TouchOverlayManager mTouchOverlayManager;
-
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -69,7 +68,6 @@
Context context = getActivity();
mOverlayBridge = new AppStateOverlayBridge(context, mState, null);
mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
- mTouchOverlayManager = new TouchOverlayManager(context);
// find preferences
addPreferencesFromResource(R.xml.app_ops_permissions_details);
@@ -92,17 +90,17 @@
}
@Override
- public void onStart() {
- super.onStart();
-
- mTouchOverlayManager.setOverlayAllowed(false);
+ public void onResume() {
+ super.onResume();
+ getActivity().getWindow().addFlags(
+ WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
}
@Override
- public void onStop() {
- super.onStop();
-
- mTouchOverlayManager.setOverlayAllowed(true);
+ public void onPause() {
+ getActivity().getWindow().clearFlags(
+ WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+ super.onPause();
}
@Override
@@ -153,16 +151,6 @@
.getMetricsFeatureProvider().action(getContext(), logCategory, packageName);
}
- private boolean canDrawOverlay(String pkgName) {
- int result = mAppOpsManager.noteOpNoThrow(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
- mPackageInfo.applicationInfo.uid, pkgName);
- if (result == AppOpsManager.MODE_ALLOWED) {
- return true;
- }
-
- return false;
- }
-
@Override
protected boolean refreshUi() {
mOverlayState = mOverlayBridge.getOverlayInfo(mPackageName,
diff --git a/src/com/android/settings/core/TouchOverlayManager.java b/src/com/android/settings/core/TouchOverlayManager.java
deleted file mode 100644
index f69d1bf..0000000
--- a/src/com/android/settings/core/TouchOverlayManager.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.settings.core;
-
-import android.app.AppOpsManager;
-import android.content.Context;
-import android.os.Binder;
-import android.os.IBinder;
-
-public class TouchOverlayManager {
-
- private final Context mContext;
- private final IBinder mToken = new Binder();
-
- public TouchOverlayManager(Context context) {
- mContext = context;
- }
-
- public void setOverlayAllowed(boolean allowed) {
- final AppOpsManager aom = mContext.getSystemService(AppOpsManager.class);
- if (aom != null) {
- aom.setUserRestriction(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, !allowed, mToken);
- aom.setUserRestriction(AppOpsManager.OP_TOAST_WINDOW, !allowed, mToken);
- }
- }
-}
diff --git a/src/com/android/settings/dashboard/suggestions/EventStore.java b/src/com/android/settings/dashboard/suggestions/EventStore.java
index 43ed65b..cc3872e 100644
--- a/src/com/android/settings/dashboard/suggestions/EventStore.java
+++ b/src/com/android/settings/dashboard/suggestions/EventStore.java
@@ -82,7 +82,7 @@
}
private void writePref(String prefKey, long value) {
- mSharedPrefs.edit().putLong(prefKey, value).commit();
+ mSharedPrefs.edit().putLong(prefKey, value).apply();
}
private long readPref(String prefKey, Long defaultValue) {
diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java
index d00749d..fb8119c 100644
--- a/src/com/android/settings/datausage/BillingCycleSettings.java
+++ b/src/com/android/settings/datausage/BillingCycleSettings.java
@@ -264,7 +264,7 @@
formatter.getUnitDisplayName(MeasureUnit.GIGABYTE)
};
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
- getContext(), android.R.layout.simple_spinner_item, unitNames);
+ getContext(), R.layout.data_usage_spinner_item, unitNames);
type.setAdapter(adapter);
if (bytes > 1.5f * GB_IN_BYTES) {
diff --git a/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java b/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java
index 6a13282..f9eabb9 100644
--- a/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java
+++ b/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java
@@ -35,15 +35,13 @@
import android.content.pm.ServiceInfo;
import android.os.Bundle;
import android.os.UserHandle;
-import android.provider.Settings;
-import android.provider.SettingsStringUtil;
import android.util.Slog;
+import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
import com.android.internal.app.AlertActivity;
import com.android.internal.app.AlertController;
import com.android.settings.R;
-import com.android.settings.core.TouchOverlayManager;
/** @hide */
public class NotificationAccessConfirmationActivity extends Activity
@@ -54,14 +52,12 @@
private int mUserId;
private ComponentName mComponentName;
- private TouchOverlayManager mTouchOverlayManager;
private NotificationManager mNm;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- mTouchOverlayManager = new TouchOverlayManager(this);
mNm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mComponentName = getIntent().getParcelableExtra(EXTRA_COMPONENT_NAME);
@@ -84,6 +80,20 @@
.installContent(p);
}
+ @Override
+ public void onResume() {
+ super.onResume();
+ getWindow().addFlags(
+ WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+ }
+
+ @Override
+ public void onPause() {
+ getWindow().clearFlags(
+ WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+ super.onPause();
+ }
+
private void onAllow() {
String requiredPermission = Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE;
try {
@@ -121,16 +131,4 @@
finish();
}
}
-
- @Override
- protected void onResume() {
- super.onResume();
- mTouchOverlayManager.setOverlayAllowed(false);
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- mTouchOverlayManager.setOverlayAllowed(true);
- }
}
diff --git a/src/com/android/settings/support/SupportDashboardActivity.java b/src/com/android/settings/support/SupportDashboardActivity.java
index 819d5f7..d3fcf9a 100644
--- a/src/com/android/settings/support/SupportDashboardActivity.java
+++ b/src/com/android/settings/support/SupportDashboardActivity.java
@@ -47,8 +47,8 @@
supportFeatureProvider.startSupportV2(this);
} else {
startActivity(new Intent(this, LegacySupportActivity.class));
- finish();
}
+ finish();
}
/**
diff --git a/tests/robotests/src/com/android/settings/applications/DrawOverlayDetailsTest.java b/tests/robotests/src/com/android/settings/applications/DrawOverlayDetailsTest.java
index 6122576..5d20a4c 100644
--- a/tests/robotests/src/com/android/settings/applications/DrawOverlayDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/DrawOverlayDetailsTest.java
@@ -19,52 +19,59 @@
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.nullable;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
+
+import android.app.Activity;
import android.content.Context;
+import android.view.Window;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
-import com.android.settings.core.TouchOverlayManager;
import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.shadow.ShadowPreferenceFragment;
+import com.android.settings.testutils.shadow.ShadowAppInfoBase;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
+import org.mockito.InOrder;
import org.mockito.Mock;
+import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
-import org.robolectric.util.ReflectionHelpers;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class DrawOverlayDetailsTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private Context mContext;
-
- private FakeFeatureFactory mFeatureFactory;
- private DrawOverlayDetails mFragment;
+ private Activity mActivity;
@Mock
- private TouchOverlayManager mTouchOverlayManager;
+ private Window mWindow;
+
+ private FakeFeatureFactory mFeatureFactory;
+
+ @Spy
+ private DrawOverlayDetails mFragment;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- FakeFeatureFactory.setupForTest(mContext);
- mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
-
- mFragment = new DrawOverlayDetails();
- ReflectionHelpers.setField(mFragment, "mTouchOverlayManager", mTouchOverlayManager);
+ FakeFeatureFactory.setupForTest(mActivity);
+ mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mActivity);
}
@Test
public void logSpecialPermissionChange() {
- mFragment.onAttach(ShadowApplication.getInstance().getApplicationContext());
+ when(mFragment.getContext()).thenReturn(
+ ShadowApplication.getInstance().getApplicationContext());
+
mFragment.logSpecialPermissionChange(true, "app");
verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_ALLOW), eq("app"));
@@ -75,16 +82,17 @@
}
@Test
- @Config(shadows = ShadowPreferenceFragment.class)
- public void onStart_disableOverlay() {
- mFragment.onStart();
- verify(mTouchOverlayManager).setOverlayAllowed(false);
- }
+ @Config(shadows = {ShadowAppInfoBase.class})
+ public void hideNonSystemOverlaysWhenResumed() {
+ when(mFragment.getActivity()).thenReturn(mActivity);
+ when(mActivity.getWindow()).thenReturn(mWindow);
- @Test
- @Config(shadows = ShadowPreferenceFragment.class)
- public void onStop_enableOverlay() {
- mFragment.onStop();
- verify(mTouchOverlayManager).setOverlayAllowed(true);
+ mFragment.onResume();
+ mFragment.onPause();
+
+ InOrder inOrder = Mockito.inOrder(mWindow);
+ inOrder.verify(mWindow).addFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+ inOrder.verify(mWindow).clearFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+ inOrder.verifyNoMoreInteractions();
}
}
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPreferenceFragment.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAppInfoBase.java
similarity index 81%
rename from tests/robotests/src/com/android/settings/testutils/shadow/ShadowPreferenceFragment.java
rename to tests/robotests/src/com/android/settings/testutils/shadow/ShadowAppInfoBase.java
index cfd0ce9..12173c8 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPreferenceFragment.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAppInfoBase.java
@@ -16,20 +16,20 @@
package com.android.settings.testutils.shadow;
-import android.support.v14.preference.PreferenceFragment;
+import com.android.settings.applications.AppInfoBase;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
-@Implements(PreferenceFragment.class)
-public class ShadowPreferenceFragment {
+@Implements(AppInfoBase.class)
+public class ShadowAppInfoBase {
@Implementation
- public void onStart() {
+ public void onResume() {
// No-op.
}
@Implementation
- public void onStop() {
+ public void onPause() {
// No-op.
}
}