From 6490923251f80f51164d037a79c8855067c6b9f4 Mon Sep 17 00:00:00 2001
From: Jackal Guo
Date: Tue, 17 Jul 2018 10:15:19 +0800
Subject: [PATCH 1/6] Change the order of preferences in a11y
Some preference items have the same order, and it makes these items
be sorted in different position per languages. Use unique order for
each items instead.
Bug: 77949267
Test: atest CtsAccessibilityTestCases
Test: manual check the order in different languages
Change-Id: Ibfcb316c4299266b053053d9d88819a7dcc158fa
---
.../settings/accessibility/AccessibilitySettings.java | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index b910130a219..22cff3eb7e4 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -633,8 +633,14 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
mCategoryToPrefCategoryMap.get(CATEGORY_DISPLAY);
experimentalCategory.removePreference(mToggleInversionPreference);
experimentalCategory.removePreference(mDisplayDaltonizerPreferenceScreen);
- mToggleInversionPreference.setOrder(mToggleLargePointerIconPreference.getOrder());
- mDisplayDaltonizerPreferenceScreen.setOrder(mToggleInversionPreference.getOrder());
+ mDisplayDaltonizerPreferenceScreen.setOrder(
+ mDisplayMagnificationPreferenceScreen.getOrder() + 1);
+ mToggleInversionPreference.setOrder(
+ mDisplayDaltonizerPreferenceScreen.getOrder() + 1);
+ mToggleLargePointerIconPreference.setOrder(
+ mToggleInversionPreference.getOrder() + 1);
+ mToggleDisableAnimationsPreference.setOrder(
+ mToggleLargePointerIconPreference.getOrder() + 1);
mToggleInversionPreference.setSummary(R.string.summary_empty);
displayCategory.addPreference(mToggleInversionPreference);
displayCategory.addPreference(mDisplayDaltonizerPreferenceScreen);
From c0ed614252a3254eabcba78b7c0bd9cd0d15141f Mon Sep 17 00:00:00 2001
From: tmfang
Date: Fri, 13 Jul 2018 11:11:26 +0800
Subject: [PATCH 2/6] Remove LocalePickerWithRegion class in Settings.
This class is too complex, we can't afford maintaining this long term.
We need a new Activity that wraps the framework version of LocalePickerWithRegion.
Bug: 111373939
Test: manual test & make RunSettingsRoboTests -j56
Change-Id: I93c719246b84350d2eee4e8ce1ffd97cd168925b
---
AndroidManifest.xml | 6 +
.../localepicker/LocaleListEditor.java | 38 +--
.../localepicker/LocalePickerWithRegion.java | 278 ------------------
.../LocalePickerWithRegionActivity.java | 79 +++++
...randfather_not_implementing_instrumentable | 3 +-
.../LocalePickerWithRegionActivityTest.java | 51 ++++
6 files changed, 158 insertions(+), 297 deletions(-)
delete mode 100644 src/com/android/settings/localepicker/LocalePickerWithRegion.java
create mode 100644 src/com/android/settings/localepicker/LocalePickerWithRegionActivity.java
create mode 100644 tests/robotests/src/com/android/settings/localepicker/LocalePickerWithRegionActivityTest.java
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index d3acd131657..303dea1761a 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -574,6 +574,12 @@
android:value="true" />
+
+
+
It shows suggestions at the top, then the rest of the locales.
- * Allows the user to search for locales using both their native name and their name in the
- * default locale.
- */
-public class LocalePickerWithRegion extends ListFragment implements SearchView.OnQueryTextListener {
- private static final String PARENT_FRAGMENT_NAME = "localeListEditor";
-
- private SuggestedLocaleAdapter mAdapter;
- private LocaleSelectedListener mListener;
- private Set mLocaleList;
- private LocaleStore.LocaleInfo mParentLocale;
- private boolean mTranslatedOnly = false;
- private SearchView mSearchView = null;
- private CharSequence mPreviousSearch = null;
- private boolean mPreviousSearchHadFocus = false;
- private int mFirstVisiblePosition = 0;
- private int mTopDistance = 0;
-
- /**
- * Other classes can register to be notified when a locale was selected.
- *
- * This is the mechanism to "return" the result of the selection.
- */
- public interface LocaleSelectedListener {
- /**
- * The classes that want to retrieve the locale picked should implement this method.
- * @param locale the locale picked.
- */
- void onLocaleSelected(LocaleStore.LocaleInfo locale);
- }
-
- private static LocalePickerWithRegion createCountryPicker(Context context,
- LocaleSelectedListener listener, LocaleStore.LocaleInfo parent,
- boolean translatedOnly) {
- LocalePickerWithRegion
- localePicker = new LocalePickerWithRegion();
- boolean shouldShowTheList = localePicker.setListener(context, listener, parent,
- translatedOnly);
- return shouldShowTheList ? localePicker : null;
- }
-
- public static LocalePickerWithRegion createLanguagePicker(Context context,
- LocaleSelectedListener listener, boolean translatedOnly) {
- LocalePickerWithRegion
- localePicker = new LocalePickerWithRegion();
- localePicker.setListener(context, listener, /* parent */ null, translatedOnly);
- return localePicker;
- }
-
- /**
- * Sets the listener and initializes the locale list.
- *
- * Returns true if we need to show the list, false if not.
- *
- * Can return false because of an error, trying to show a list of countries,
- * but no parent locale was provided.
- *
- * It can also return false if the caller tries to show the list in country mode and
- * there is only one country available (i.e. Japanese => Japan).
- * In this case we don't even show the list, we call the listener with that locale,
- * "pretending" it was selected, and return false.
- */
- private boolean setListener(Context context, LocaleSelectedListener listener,
- LocaleStore.LocaleInfo parent, boolean translatedOnly) {
- this.mParentLocale = parent;
- this.mListener = listener;
- this.mTranslatedOnly = translatedOnly;
- setRetainInstance(true);
-
- final HashSet langTagsToIgnore = new HashSet<>();
- if (!translatedOnly) {
- final LocaleList userLocales = LocalePicker.getLocales();
- final String[] langTags = userLocales.toLanguageTags().split(",");
- Collections.addAll(langTagsToIgnore, langTags);
- }
-
- if (parent != null) {
- mLocaleList = LocaleStore.getLevelLocales(context,
- langTagsToIgnore, parent, translatedOnly);
- if (mLocaleList.size() <= 1) {
- if (listener != null && (mLocaleList.size() == 1)) {
- listener.onLocaleSelected(mLocaleList.iterator().next());
- }
- return false;
- }
- } else {
- mLocaleList = LocaleStore.getLevelLocales(context, langTagsToIgnore,
- null /* no parent */, translatedOnly);
- }
-
- return true;
- }
-
- private void returnToParentFrame() {
- getFragmentManager().popBackStack(PARENT_FRAGMENT_NAME,
- FragmentManager.POP_BACK_STACK_INCLUSIVE);
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setHasOptionsMenu(true);
-
- if (mLocaleList == null) {
- // The fragment was killed and restored by the FragmentManager.
- // At this point we have no data, no listener. Just return, to prevend a NPE.
- // Fixes b/28748150. Created b/29400003 for a cleaner solution.
- returnToParentFrame();
- return;
- }
-
- final boolean countryMode = mParentLocale != null;
- final Locale sortingLocale = countryMode ? mParentLocale.getLocale() : Locale.getDefault();
- mAdapter = new SuggestedLocaleAdapter(mLocaleList, countryMode);
- final LocaleHelper.LocaleInfoComparator comp =
- new LocaleHelper.LocaleInfoComparator(sortingLocale, countryMode);
- mAdapter.sort(comp);
- setListAdapter(mAdapter);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem menuItem) {
- int id = menuItem.getItemId();
- switch (id) {
- case android.R.id.home:
- getFragmentManager().popBackStack();
- return true;
- }
- return super.onOptionsItemSelected(menuItem);
- }
-
- @Override
- public void onResume() {
- super.onResume();
-
- if (mParentLocale != null) {
- getActivity().setTitle(mParentLocale.getFullNameNative());
- } else {
- getActivity().setTitle(R.string.language_selection_title);
- }
-
- getListView().requestFocus();
- }
-
- @Override
- public void onPause() {
- super.onPause();
-
- // Save search status
- if (mSearchView != null) {
- mPreviousSearchHadFocus = mSearchView.hasFocus();
- mPreviousSearch = mSearchView.getQuery();
- } else {
- mPreviousSearchHadFocus = false;
- mPreviousSearch = null;
- }
-
- // Save scroll position
- final ListView list = getListView();
- final View firstChild = list.getChildAt(0);
- mFirstVisiblePosition = list.getFirstVisiblePosition();
- mTopDistance = (firstChild == null) ? 0 : (firstChild.getTop() - list.getPaddingTop());
- }
-
- @Override
- public void onListItemClick(ListView l, View v, int position, long id) {
- final LocaleStore.LocaleInfo locale =
- (LocaleStore.LocaleInfo) getListAdapter().getItem(position);
-
- if (locale.getParent() != null) {
- if (mListener != null) {
- mListener.onLocaleSelected(locale);
- }
- returnToParentFrame();
- } else {
- LocalePickerWithRegion
- selector = LocalePickerWithRegion.createCountryPicker(
- getContext(), mListener, locale, mTranslatedOnly /* translate only */);
- if (selector != null) {
- getFragmentManager().beginTransaction()
- .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
- .replace(getId(), selector).addToBackStack(null)
- .commit();
- } else {
- returnToParentFrame();
- }
- }
- }
-
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- if (mParentLocale == null) {
- inflater.inflate(R.menu.language_selection_list, menu);
-
- final MenuItem searchMenuItem = menu.findItem(R.id.locale_search_menu);
- mSearchView = (SearchView) searchMenuItem.getActionView();
-
- mSearchView.setQueryHint(getText(R.string.search_language_hint));
- mSearchView.setOnQueryTextListener(this);
-
- // Restore previous search status
- if (!TextUtils.isEmpty(mPreviousSearch)) {
- searchMenuItem.expandActionView();
- mSearchView.setIconified(false);
- mSearchView.setActivated(true);
- if (mPreviousSearchHadFocus) {
- mSearchView.requestFocus();
- }
- mSearchView.setQuery(mPreviousSearch, true /* submit */);
- } else {
- mSearchView.setQuery(null, false /* submit */);
- }
-
- // Restore previous scroll position
- getListView().setSelectionFromTop(mFirstVisiblePosition, mTopDistance);
- }
- }
-
- @Override
- public boolean onQueryTextSubmit(String query) {
- return false;
- }
-
- @Override
- public boolean onQueryTextChange(String newText) {
- if (mAdapter != null) {
- mAdapter.getFilter().filter(newText);
- }
- return false;
- }
-}
diff --git a/src/com/android/settings/localepicker/LocalePickerWithRegionActivity.java b/src/com/android/settings/localepicker/LocalePickerWithRegionActivity.java
new file mode 100644
index 00000000000..6ddcf2396c9
--- /dev/null
+++ b/src/com/android/settings/localepicker/LocalePickerWithRegionActivity.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2018 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.localepicker;
+
+import android.app.Activity;
+import android.app.FragmentTransaction;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.MenuItem;
+
+import com.android.internal.app.LocalePickerWithRegion;
+import com.android.internal.app.LocaleStore;
+
+public class LocalePickerWithRegionActivity extends Activity
+ implements LocalePickerWithRegion.LocaleSelectedListener {
+
+ private static final String PARENT_FRAGMENT_NAME = "localeListEditor";
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getActionBar().setDisplayHomeAsUpEnabled(true);
+
+ final LocalePickerWithRegion selector = LocalePickerWithRegion.createLanguagePicker(
+ this, LocalePickerWithRegionActivity.this, false /* translate only */);
+ getFragmentManager()
+ .beginTransaction()
+ .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
+ .replace(android.R.id.content, selector)
+ .addToBackStack(PARENT_FRAGMENT_NAME)
+ .commit();
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == android.R.id.home) {
+ handleBackPressed();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public void onLocaleSelected(LocaleStore.LocaleInfo locale) {
+ final Intent intent = new Intent();
+ intent.putExtra(LocaleListEditor.INTENT_LOCALE_KEY, locale);
+ setResult(RESULT_OK, intent);
+ finish();
+ }
+
+ @Override
+ public void onBackPressed() {
+ handleBackPressed();
+ }
+
+ private void handleBackPressed() {
+ if (getFragmentManager().getBackStackEntryCount() > 1) {
+ super.onBackPressed();
+ } else {
+ setResult(RESULT_CANCELED);
+ finish();
+ }
+ }
+}
+
diff --git a/tests/robotests/assets/grandfather_not_implementing_instrumentable b/tests/robotests/assets/grandfather_not_implementing_instrumentable
index 27ab65cf063..2c8ae5d9267 100644
--- a/tests/robotests/assets/grandfather_not_implementing_instrumentable
+++ b/tests/robotests/assets/grandfather_not_implementing_instrumentable
@@ -5,5 +5,4 @@ com.android.settings.password.ChooseLockPassword$SaveAndFinishWorker
com.android.settings.password.ChooseLockPattern$SaveAndFinishWorker
com.android.settings.RestrictedListPreference$RestrictedListPreferenceDialogFragment
com.android.settings.password.ConfirmDeviceCredentialBaseFragment$LastTryDialog
-com.android.settings.password.CredentialCheckResultTracker
-com.android.settings.localepicker.LocalePickerWithRegion
+com.android.settings.password.CredentialCheckResultTracker
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/localepicker/LocalePickerWithRegionActivityTest.java b/tests/robotests/src/com/android/settings/localepicker/LocalePickerWithRegionActivityTest.java
new file mode 100644
index 00000000000..bad3dbda032
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/localepicker/LocalePickerWithRegionActivityTest.java
@@ -0,0 +1,51 @@
+package com.android.settings.localepicker;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+
+import android.app.Activity;
+
+import com.android.internal.app.LocaleStore;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.Shadows;
+import org.robolectric.android.controller.ActivityController;
+import org.robolectric.shadows.ShadowActivity;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class LocalePickerWithRegionActivityTest {
+
+ private LocalePickerWithRegionActivity mActivity;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ final ActivityController mActivityController =
+ Robolectric.buildActivity(LocalePickerWithRegionActivity.class);
+ mActivity = spy(mActivityController.get());
+ }
+
+ @Test
+ public void onLocaleSelected_resultShouldBeOK() {
+ final ShadowActivity shadowActivity = Shadows.shadowOf(mActivity);
+ mActivity.onLocaleSelected(mock(LocaleStore.LocaleInfo.class));
+
+ assertEquals(Activity.RESULT_OK, shadowActivity.getResultCode());
+ }
+
+ @Test
+ public void onLocaleSelected_localeInfoShouldBeSentBack() {
+ final ShadowActivity shadowActivity = Shadows.shadowOf(mActivity);
+ mActivity.onLocaleSelected(mock(LocaleStore.LocaleInfo.class));
+
+ assertNotNull(shadowActivity.getResultIntent().getSerializableExtra(
+ LocaleListEditor.INTENT_LOCALE_KEY));
+ }
+}
From 1d44acce672508632b5474d30ebb3278f0fdd7ad Mon Sep 17 00:00:00 2001
From: tmfang
Date: Tue, 17 Jul 2018 09:54:14 +0800
Subject: [PATCH 3/6] Fix test cases broken
- AndroiX AlertDialog needs to use Theme.AppCompat.
- Create a ShadowAlertDialogCompat which can be compatible with AndroidX AlertDialog.
Fix: 111247403
Test: make RunSettingsRoboTests -j56 ROBOTEST_FILTER=com.android.settings.password.ChooseLockTypeDialogFragmentTest
Change-Id: I3e4bca285ecaefa5705c8d170050c21d1bc649e0
---
tests/robotests/res/values/themes.xml | 5 +-
.../ChooseLockTypeDialogFragmentTest.java | 37 ++++-----
.../shadow/SettingsShadowResourcesImpl.java | 3 +-
.../shadow/ShadowAlertDialogCompat.java | 83 +++++++++++++++++++
4 files changed, 107 insertions(+), 21 deletions(-)
create mode 100644 tests/robotests/src/com/android/settings/testutils/shadow/ShadowAlertDialogCompat.java
diff --git a/tests/robotests/res/values/themes.xml b/tests/robotests/res/values/themes.xml
index 74bdd9b1d79..9a247f6abd8 100644
--- a/tests/robotests/res/values/themes.xml
+++ b/tests/robotests/res/values/themes.xml
@@ -1,5 +1,8 @@
-
+
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java
index f76a5ca8517..5068f852cb1 100644
--- a/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 Google Inc.
+ * 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.
@@ -16,38 +16,33 @@
package com.android.settings.password;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import android.app.AlertDialog;
import android.content.Context;
import com.android.settings.R;
import com.android.settings.password.ChooseLockTypeDialogFragment.OnLockTypeSelectedListener;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.shadow.ShadowUserManager;
-import com.android.settings.testutils.shadow.ShadowUtils;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settingslib.testutils.FragmentTestUtils;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowAlertDialog;
-import org.robolectric.shadows.ShadowDialog;
+import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
@RunWith(SettingsRobolectricTestRunner.class)
-@Config(shadows = {ShadowUserManager.class, ShadowUtils.class})
+@Config(shadows = {SettingsShadowResourcesImpl.class, ShadowAlertDialogCompat.class})
public class ChooseLockTypeDialogFragmentTest {
private Context mContext;
@@ -61,32 +56,36 @@ public class ChooseLockTypeDialogFragmentTest {
}
@Test
- @Ignore("b/111247403")
public void testThatDialog_IsShown() {
AlertDialog latestDialog = startLockFragment();
- assertNotNull(latestDialog);
- ShadowDialog shadowDialog = Shadows.shadowOf(latestDialog);
+ ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(
+ latestDialog);
+
+ assertThat(latestDialog).isNotNull();
+ assertThat(latestDialog.isShowing()).isTrue();
// verify that we are looking at the expected dialog.
- assertEquals(shadowDialog.getTitle(),
+ assertThat(shadowAlertDialog.getTitle()).isEqualTo(
mContext.getString(R.string.setup_lock_settings_options_dialog_title));
}
@Test
- @Ignore("b/111247403")
public void testThat_OnClickListener_IsCalled() {
mFragment.mDelegate = mock(OnLockTypeSelectedListener.class);
AlertDialog lockDialog = startLockFragment();
- ShadowAlertDialog shadowAlertDialog = Shadows.shadowOf(lockDialog);
+ ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(lockDialog);
+
shadowAlertDialog.clickOnItem(0);
+
verify(mFragment.mDelegate, times(1)).onLockTypeSelected(any(ScreenLockType.class));
}
@Test
- @Ignore("b/111247403")
public void testThat_OnClickListener_IsNotCalledWhenCancelled() {
mFragment.mDelegate = mock(OnLockTypeSelectedListener.class);
AlertDialog lockDialog = startLockFragment();
+
lockDialog.dismiss();
+
verify(mFragment.mDelegate, never()).onLockTypeSelected(any(ScreenLockType.class));
}
@@ -94,7 +93,7 @@ public class ChooseLockTypeDialogFragmentTest {
ChooseLockTypeDialogFragment chooseLockTypeDialogFragment =
ChooseLockTypeDialogFragment.newInstance(1234);
chooseLockTypeDialogFragment.show(mFragment.getChildFragmentManager(), null);
- return ShadowAlertDialog.getLatestAlertDialog();
+ return ShadowAlertDialogCompat.getLatestAlertDialog();
}
public static class TestFragment extends Fragment implements OnLockTypeSelectedListener {
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResourcesImpl.java b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResourcesImpl.java
index 9fb69a32552..dd51687296b 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResourcesImpl.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResourcesImpl.java
@@ -43,7 +43,8 @@ public class SettingsShadowResourcesImpl extends ShadowResourcesImpl {
// that Robolectric isn't yet aware of.
// TODO: Remove this once Robolectric is updated.
if (id == R.drawable.switchbar_background
- || id == R.color.ripple_material_light) {
+ || id == R.color.ripple_material_light
+ || id == R.color.ripple_material_dark) {
return new ColorDrawable();
} else if (id == R.drawable.ic_launcher_settings) {
// ic_launcher_settings uses adaptive-icon, which is not supported by robolectric,
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAlertDialogCompat.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAlertDialogCompat.java
new file mode 100644
index 00000000000..a682d85e2b1
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAlertDialogCompat.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2018 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.testutils.shadow;
+
+import android.annotation.SuppressLint;
+import android.view.View;
+
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.RealObject;
+import org.robolectric.annotation.Resetter;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowDialog;
+import org.robolectric.util.ReflectionHelpers;
+
+import javax.annotation.Nullable;
+
+import androidx.appcompat.app.AlertDialog;
+
+/* Robolectric shadow for the androidx alert dialog. */
+@Implements(AlertDialog.class)
+public class ShadowAlertDialogCompat extends ShadowDialog {
+
+ @SuppressLint("StaticFieldLeak")
+ @Nullable
+ private static ShadowAlertDialogCompat latestSupportAlertDialog;
+ @RealObject
+ private AlertDialog realAlertDialog;
+
+ @Implementation
+ public void show() {
+ super.show();
+ latestSupportAlertDialog = this;
+ }
+
+ public CharSequence getMessage() {
+ final Object alertController = ReflectionHelpers.getField(realAlertDialog, "mAlert");
+ return ReflectionHelpers.getField(alertController, "mMessage");
+ }
+
+ public CharSequence getTitle() {
+ final Object alertController = ReflectionHelpers.getField(realAlertDialog, "mAlert");
+ return ReflectionHelpers.getField(alertController, "mTitle");
+ }
+
+ public View getView() {
+ final Object alertController = ReflectionHelpers.getField(realAlertDialog, "mAlert");
+ return ReflectionHelpers.getField(alertController, "mView");
+ }
+
+ @Nullable
+ public static AlertDialog getLatestAlertDialog() {
+ return latestSupportAlertDialog == null ? null : latestSupportAlertDialog.realAlertDialog;
+ }
+
+ @Resetter
+ public static void reset() {
+ latestSupportAlertDialog = null;
+ }
+
+ public static ShadowAlertDialogCompat shadowOf(AlertDialog alertDialog) {
+ return (ShadowAlertDialogCompat) Shadow.extract(alertDialog);
+ }
+
+ public void clickOnItem(int index) {
+ Shadows.shadowOf(realAlertDialog.getListView()).performItemClick(index);
+ }
+}
\ No newline at end of file
From 127fa65575ae0597aaf3d3d0719a8ca3ba497205 Mon Sep 17 00:00:00 2001
From: Irina Dumitrescu
Date: Mon, 9 Jul 2018 21:12:17 +0100
Subject: [PATCH 4/6] Disable notification settings access from work apps.
Fixes: 79241388
Test: the following command does not open the notification settings in
work profile user:
$ adb shell am start --user $USER -W -a android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS
Moreover, triggering the notifications from a sample app results in the
new toast being displayed.
Change-Id: I0a330a9cf22c813aea7600557660868263817e1e
---
res/values/strings.xml | 2 ++
.../notification/NotificationAccessSettings.java | 14 ++++++++++++++
2 files changed, 16 insertions(+)
diff --git a/res/values/strings.xml b/res/values/strings.xml
index bacfd187365..d167d6f308a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6917,6 +6917,8 @@
Apps & notifications
Permissions, default apps
+
+ Notification access is not available for apps in the work profile.
Accounts
diff --git a/src/com/android/settings/notification/NotificationAccessSettings.java b/src/com/android/settings/notification/NotificationAccessSettings.java
index 17739f9d3c5..ad721ba750c 100644
--- a/src/com/android/settings/notification/NotificationAccessSettings.java
+++ b/src/com/android/settings/notification/NotificationAccessSettings.java
@@ -23,10 +23,12 @@ import android.content.ComponentName;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
+import android.os.UserManager;
import android.provider.SearchIndexableResource;
import android.provider.Settings;
import android.service.notification.NotificationListenerService;
+import android.widget.Toast;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
@@ -61,6 +63,18 @@ public class NotificationAccessSettings extends ManagedServiceSettings {
private NotificationManager mNm;
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ final Context ctx = getContext();
+ if (UserManager.get(ctx).isManagedProfile()) {
+ // Apps in the work profile do not support notification listeners.
+ Toast.makeText(ctx, R.string.notification_settings_work_profile, Toast.LENGTH_SHORT)
+ .show();
+ finish();
+ }
+ }
+
@Override
public int getMetricsCategory() {
return MetricsEvent.NOTIFICATION_ACCESS;
From f1213365fc2070974c4d23aa1fd817847a1e19cc Mon Sep 17 00:00:00 2001
From: jackqdyulei
Date: Fri, 13 Jul 2018 14:50:04 -0700
Subject: [PATCH 5/6] Unrestrict SMS/PHONE app if it been set active
If an app been set default SMS/PHONE app, we need to unrestrict this
app. This CL extract a common function and invoke it when necessary.
Change-Id: Id29c5138438aa6f6f22cdd9c4ecf336de8481782
Fixes: 80305978
Test: robotests
---
.../defaultapps/DefaultAppPickerFragment.java | 3 ++
.../defaultapps/DefaultPhonePicker.java | 1 +
.../defaultapps/DefaultSmsPicker.java | 3 ++
.../deviceadmin/DeviceAdminAdd.java | 5 +--
.../settings/fuelgauge/BatteryUtils.java | 10 ++++++
.../defaultapps/DefaultPhonePickerTest.java | 12 +++++++
.../defaultapps/DefaultSmsPickerTest.java | 11 +++++++
.../deviceadmin/DeviceAdminAddTest.java | 8 ++++-
.../settings/fuelgauge/BatteryUtilsTest.java | 31 +++++++++++++++++++
9 files changed, 79 insertions(+), 5 deletions(-)
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
index d0493e9706c..3838d299575 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
@@ -28,6 +28,7 @@ import android.util.Pair;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settings.widget.RadioButtonPreference;
import com.android.settingslib.applications.DefaultAppInfo;
@@ -43,11 +44,13 @@ import androidx.fragment.app.FragmentActivity;
public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment {
protected PackageManager mPm;
+ protected BatteryUtils mBatteryUtils;
@Override
public void onAttach(Context context) {
super.onAttach(context);
mPm = context.getPackageManager();
+ mBatteryUtils = BatteryUtils.getInstance(context);
}
@Override
diff --git a/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java b/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java
index e462ab88a7e..0bda2ec5610 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java
@@ -80,6 +80,7 @@ public class DefaultPhonePicker extends DefaultAppPickerFragment {
@Override
protected boolean setDefaultKey(String key) {
if (!TextUtils.isEmpty(key) && !TextUtils.equals(key, getDefaultKey())) {
+ mBatteryUtils.clearForceAppStandby(key);
return mDefaultKeyUpdater.setDefaultDialerApplication(getContext(), key, mUserId);
}
return false;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java b/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java
index 91f9cafe95e..b5a2880461e 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java
@@ -16,6 +16,7 @@
package com.android.settings.applications.defaultapps;
+import android.app.AppOpsManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -25,6 +26,7 @@ import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.telephony.SmsApplication;
import com.android.settings.R;
import com.android.settings.Utils;
+import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.widget.CandidateInfo;
@@ -74,6 +76,7 @@ public class DefaultSmsPicker extends DefaultAppPickerFragment {
protected boolean setDefaultKey(String key) {
if (!TextUtils.isEmpty(key) && !TextUtils.equals(key, getDefaultKey())) {
mDefaultKeyUpdater.setDefaultApplication(getContext(), key);
+ mBatteryUtils.clearForceAppStandby(key);
return true;
}
return false;
diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
index 6e0f915af9e..04757348e88 100644
--- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
+++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
@@ -455,10 +455,7 @@ public class DeviceAdminAdd extends Activity {
void unrestrictAppIfPossible(BatteryUtils batteryUtils) {
// Unrestrict admin app if it is already been restricted
final String packageName = mDeviceAdmin.getComponent().getPackageName();
- final int uid = batteryUtils.getPackageUid(packageName);
- if (batteryUtils.isForceAppStandbyEnabled(uid, packageName)) {
- batteryUtils.setForceAppStandby(uid, packageName, AppOpsManager.MODE_ALLOWED);
- }
+ batteryUtils.clearForceAppStandby(packageName);
}
void continueRemoveAction(CharSequence msg) {
diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java
index f92f8adbc35..9e920c47978 100644
--- a/src/com/android/settings/fuelgauge/BatteryUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryUtils.java
@@ -407,6 +407,16 @@ public class BatteryUtils {
packageName) == AppOpsManager.MODE_IGNORED;
}
+ public boolean clearForceAppStandby(String packageName) {
+ final int uid = getPackageUid(packageName);
+ if (uid != UID_NULL && isForceAppStandbyEnabled(uid, packageName)) {
+ setForceAppStandby(uid, packageName, AppOpsManager.MODE_ALLOWED);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
public void initBatteryStatsHelper(BatteryStatsHelper statsHelper, Bundle bundle,
UserManager userManager) {
statsHelper.create(bundle);
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java
index f304b49cb32..57d31cf84f9 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java
@@ -29,6 +29,7 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.os.UserManager;
+import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
@@ -53,6 +54,8 @@ public class DefaultPhonePickerTest {
private DefaultPhonePicker.DefaultKeyUpdater mDefaultKeyUpdater;
@Mock
private PackageManager mPackageManager;
+ @Mock
+ private BatteryUtils mBatteryUtils;
private DefaultPhonePicker mPicker;
@@ -66,6 +69,7 @@ public class DefaultPhonePickerTest {
ReflectionHelpers.setField(mPicker, "mPm", mPackageManager);
ReflectionHelpers.setField(mPicker, "mDefaultKeyUpdater", mDefaultKeyUpdater);
+ ReflectionHelpers.setField(mPicker, "mBatteryUtils", mBatteryUtils);
doReturn(RuntimeEnvironment.application).when(mPicker).getContext();
}
@@ -87,6 +91,14 @@ public class DefaultPhonePickerTest {
@Test
public void getDefaultAppKey_shouldReturnDefault() {
mPicker.getDefaultKey();
+
verify(mDefaultKeyUpdater).getDefaultDialerApplication(any(Context.class), anyInt());
}
+
+ @Test
+ public void setDefaultKey_shouldUnrestrictApp() {
+ mPicker.setDefaultKey(TEST_APP_KEY);
+
+ verify(mBatteryUtils).clearForceAppStandby(TEST_APP_KEY);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java
index 18bb60e64ad..ade62a13cb1 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java
@@ -28,6 +28,7 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.os.UserManager;
+import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
@@ -52,6 +53,8 @@ public class DefaultSmsPickerTest {
private DefaultSmsPicker.DefaultKeyUpdater mDefaultKeyUpdater;
@Mock
private PackageManager mPackageManager;
+ @Mock
+ private BatteryUtils mBatteryUtils;
private DefaultSmsPicker mPicker;
@@ -64,6 +67,7 @@ public class DefaultSmsPickerTest {
ReflectionHelpers.setField(mPicker, "mPm", mPackageManager);
ReflectionHelpers.setField(mPicker, "mDefaultKeyUpdater", mDefaultKeyUpdater);
+ ReflectionHelpers.setField(mPicker, "mBatteryUtils", mBatteryUtils);
doReturn(RuntimeEnvironment.application).when(mPicker).getContext();
}
@@ -80,4 +84,11 @@ public class DefaultSmsPickerTest {
verify(mDefaultKeyUpdater).getDefaultApplication(any(Context.class));
}
+
+ @Test
+ public void setDefaultKey_shouldUnrestrictApp() {
+ mPicker.setDefaultKey(TEST_APP_KEY);
+
+ verify(mBatteryUtils).clearForceAppStandby(TEST_APP_KEY);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java
index e85f3f6a1bd..6bc143ca25b 100644
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java
+++ b/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java
@@ -17,9 +17,13 @@
package com.android.settings.applications.specialaccess.deviceadmin;
import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -39,6 +43,7 @@ import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
@RunWith(SettingsRobolectricTestRunner.class)
public class DeviceAdminAddTest {
@@ -47,7 +52,6 @@ public class DeviceAdminAddTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private DeviceAdminInfo mDeviceAdmin;
- @Mock
private BatteryUtils mBatteryUtils;
private FakeFeatureFactory mFeatureFactory;
private DeviceAdminAdd mDeviceAdminAdd;
@@ -56,6 +60,8 @@ public class DeviceAdminAddTest {
public void setUp() {
MockitoAnnotations.initMocks(this);
+ mBatteryUtils = spy(BatteryUtils.getInstance(RuntimeEnvironment.application));
+ doNothing().when(mBatteryUtils).setForceAppStandby(anyInt(), anyString(), anyInt());
mFeatureFactory = FakeFeatureFactory.setupForTest();
mDeviceAdminAdd = Robolectric.buildActivity(DeviceAdminAdd.class).get();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
index 238a88ba1d4..df34b785e6c 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
@@ -653,4 +653,35 @@ public class BatteryUtilsTest {
assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID,
mAnomalyInfo)).isTrue();
}
+
+ @Test
+ public void clearForceAppStandby_appRestricted_clearAndReturnTrue() {
+ when(mBatteryUtils.getPackageUid(HIGH_SDK_PACKAGE)).thenReturn(UID);
+ when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
+ HIGH_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_IGNORED);
+
+ assertThat(mBatteryUtils.clearForceAppStandby(HIGH_SDK_PACKAGE)).isTrue();
+ verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
+ HIGH_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
+ }
+
+ @Test
+ public void clearForceAppStandby_appInvalid_returnFalse() {
+ when(mBatteryUtils.getPackageUid(PACKAGE_NAME)).thenReturn(BatteryUtils.UID_NULL);
+
+ assertThat(mBatteryUtils.clearForceAppStandby(PACKAGE_NAME)).isFalse();
+ verify(mAppOpsManager, never()).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
+ PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
+ }
+
+ @Test
+ public void clearForceAppStandby_appUnrestricted_returnFalse() {
+ when(mBatteryUtils.getPackageUid(PACKAGE_NAME)).thenReturn(UID);
+ when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
+ PACKAGE_NAME)).thenReturn(AppOpsManager.MODE_ALLOWED);
+
+ assertThat(mBatteryUtils.clearForceAppStandby(PACKAGE_NAME)).isFalse();
+ verify(mAppOpsManager, never()).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
+ PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
+ }
}
From 661049f4d90c7a744c6023745c5565363490fe8d Mon Sep 17 00:00:00 2001
From: Fan Zhang
Date: Wed, 18 Jul 2018 14:31:44 -0700
Subject: [PATCH 6/6] Clean up saved network screen
Bug: 64806699
Test: rebuild
Change-Id: I4392809f08034c7c13575db2f5c41468fcea0987
---
AndroidManifest.xml | 2 +-
res/drawable/ic_menu_add_inset.xml | 29 ------------
res/xml/wifi_settings.xml | 2 +-
.../core/gateway/SettingsGateway.java | 4 +-
.../wifi/LongPressAccessPointPreference.java | 6 ---
.../settings/wifi/WifiPickerActivity.java | 1 +
.../android/settings/wifi/WifiSettings.java | 2 +-
.../SavedAccessPointsWifiSettings.java | 45 +++++++------------
...randfather_not_implementing_index_provider | 2 +-
.../SavedAccessPointsWifiSettingsTest.java | 4 +-
10 files changed, 26 insertions(+), 71 deletions(-)
delete mode 100644 res/drawable/ic_menu_add_inset.xml
rename src/com/android/settings/wifi/{ => savedaccesspoints}/SavedAccessPointsWifiSettings.java (88%)
rename tests/robotests/src/com/android/settings/wifi/{ => savedaccesspoints}/SavedAccessPointsWifiSettingsTest.java (96%)
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 303dea1761a..c1e0c608a2a 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -307,7 +307,7 @@
+ android:value="com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings" />
diff --git a/res/drawable/ic_menu_add_inset.xml b/res/drawable/ic_menu_add_inset.xml
deleted file mode 100644
index a4f0a654660..00000000000
--- a/res/drawable/ic_menu_add_inset.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
diff --git a/res/xml/wifi_settings.xml b/res/xml/wifi_settings.xml
index 52aadcfdceb..4ca92849788 100644
--- a/res/xml/wifi_settings.xml
+++ b/res/xml/wifi_settings.xml
@@ -39,6 +39,6 @@
+ android:fragment="com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings" />
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index 1569ff0eae8..219c92c5a6f 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -38,7 +38,6 @@ import com.android.settings.applications.DirectoryAccessDetails;
import com.android.settings.applications.ProcessStatsSummary;
import com.android.settings.applications.ProcessStatsUi;
import com.android.settings.applications.UsageAccessDetails;
-import com.android.settings.applications.specialaccess.vrlistener.VrListenerSettings;
import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
import com.android.settings.applications.appinfo.DrawOverlayDetails;
import com.android.settings.applications.appinfo.ExternalSourcesDetails;
@@ -50,6 +49,7 @@ import com.android.settings.applications.managedomainurls.ManageDomainUrls;
import com.android.settings.applications.specialaccess.deviceadmin.DeviceAdminSettings;
import com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureDetails;
import com.android.settings.applications.specialaccess.pictureinpicture.PictureInPictureSettings;
+import com.android.settings.applications.specialaccess.vrlistener.VrListenerSettings;
import com.android.settings.backup.PrivacySettings;
import com.android.settings.backup.ToggleBackupSettingFragment;
import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment;
@@ -127,12 +127,12 @@ import com.android.settings.wallpaper.WallpaperTypeSettings;
import com.android.settings.webview.WebViewAppPicker;
import com.android.settings.wfd.WifiDisplaySettings;
import com.android.settings.wifi.ConfigureWifiSettings;
-import com.android.settings.wifi.SavedAccessPointsWifiSettings;
import com.android.settings.wifi.WifiAPITest;
import com.android.settings.wifi.WifiInfo;
import com.android.settings.wifi.WifiSettings;
import com.android.settings.wifi.calling.WifiCallingSettings;
import com.android.settings.wifi.p2p.WifiP2pSettings;
+import com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings;
import com.android.settings.wifi.tether.WifiTetherSettings;
public class SettingsGateway {
diff --git a/src/com/android/settings/wifi/LongPressAccessPointPreference.java b/src/com/android/settings/wifi/LongPressAccessPointPreference.java
index 579d8487b7c..85fd800d912 100644
--- a/src/com/android/settings/wifi/LongPressAccessPointPreference.java
+++ b/src/com/android/settings/wifi/LongPressAccessPointPreference.java
@@ -27,12 +27,6 @@ public class LongPressAccessPointPreference extends AccessPointPreference {
private final Fragment mFragment;
- public LongPressAccessPointPreference(AccessPoint accessPoint, Context context,
- UserBadgeCache cache, boolean forSavedNetworks, Fragment fragment) {
- super(accessPoint, context, cache, forSavedNetworks);
- mFragment = fragment;
- }
-
public LongPressAccessPointPreference(AccessPoint accessPoint, Context context,
UserBadgeCache cache, boolean forSavedNetworks, int iconResId, Fragment fragment) {
super(accessPoint, context, cache, iconResId, forSavedNetworks);
diff --git a/src/com/android/settings/wifi/WifiPickerActivity.java b/src/com/android/settings/wifi/WifiPickerActivity.java
index ca392ce534d..f7c4f7936bd 100644
--- a/src/com/android/settings/wifi/WifiPickerActivity.java
+++ b/src/com/android/settings/wifi/WifiPickerActivity.java
@@ -21,6 +21,7 @@ import com.android.settings.ButtonBarHandler;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.wifi.p2p.WifiP2pSettings;
+import com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings;
import androidx.preference.PreferenceFragmentCompat;
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index e5ff3d97b07..28e10b2da6c 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -231,7 +231,7 @@ public class WifiSettings extends RestrictedSettingsFragment
Context prefContext = getPrefContext();
mAddPreference = new Preference(prefContext);
- mAddPreference.setIcon(R.drawable.ic_menu_add_inset);
+ mAddPreference.setIcon(R.drawable.ic_menu_add);
mAddPreference.setTitle(R.string.wifi_add_network);
mStatusMessagePreference = new LinkablePreference(prefContext);
diff --git a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java
similarity index 88%
rename from src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
rename to src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java
index ebb493c2844..eeb5ca9d81d 100644
--- a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
+++ b/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.settings.wifi;
+package com.android.settings.wifi.savedaccesspoints;
import android.annotation.Nullable;
import android.app.Activity;
@@ -26,30 +26,29 @@ import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.Toast;
-
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.search.Indexable;
+import com.android.settings.wifi.WifiConfigUiBase;
+import com.android.settings.wifi.WifiDialog;
+import com.android.settings.wifi.WifiSettings;
import com.android.settingslib.wifi.AccessPoint;
import com.android.settingslib.wifi.AccessPointPreference;
import com.android.settingslib.wifi.WifiSavedConfigUtils;
-
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
-import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-
/**
* UI to manage saved networks/access points.
* TODO(b/64806699): convert to {@link DashboardFragment} with {@link PreferenceController}s
*/
public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment
- implements Indexable, WifiDialog.WifiDialogListener {
+ implements WifiDialog.WifiDialogListener {
private static final String TAG = "SavedAccessPoints";
@VisibleForTesting
static final int MSG_UPDATE_PREFERENCES = 1;
@@ -111,7 +110,6 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment
private AccessPoint mDlgAccessPoint;
private Bundle mAccessPointSavedState;
private AccessPoint mSelectedAccessPoint;
- private Preference mAddNetworkPreference;
private AccessPointPreference.UserBadgeCache mUserBadgeCache;
@@ -139,7 +137,8 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
+ mWifiManager = (WifiManager) getContext()
+ .getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (savedInstanceState != null) {
if (savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) {
@@ -162,11 +161,10 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment
for (int i = 0; i < accessPointsSize; ++i) {
AccessPoint ap = accessPoints.get(i);
String key = ap.getKey();
- LongPressAccessPointPreference preference =
- (LongPressAccessPointPreference) getCachedPreference(key);
+ AccessPointPreference preference =
+ (AccessPointPreference) getCachedPreference(key);
if (preference == null) {
- preference = new LongPressAccessPointPreference(
- ap, context, mUserBadgeCache, true, this);
+ preference = new AccessPointPreference(ap, context, mUserBadgeCache, true);
preference.setKey(key);
preference.setIcon(null);
preferenceScreen.addPreference(preference);
@@ -176,14 +174,6 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment
removeCachedPrefs(preferenceScreen);
- if (mAddNetworkPreference == null) {
- mAddNetworkPreference = new Preference(getPrefContext());
- mAddNetworkPreference.setIcon(R.drawable.ic_menu_add_inset);
- mAddNetworkPreference.setTitle(R.string.wifi_add_network);
- }
- mAddNetworkPreference.setOrder(accessPointsSize);
- preferenceScreen.addPreference(mAddNetworkPreference);
-
if(getPreferenceScreen().getPreferenceCount() < 1) {
Log.w(TAG, "Saved networks activity loaded, but there are no saved networks!");
}
@@ -195,7 +185,7 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment
}
}
- private void showWifiDialog(@Nullable LongPressAccessPointPreference accessPoint) {
+ private void showWifiDialog(@Nullable AccessPointPreference accessPoint) {
if (mDialog != null) {
removeDialog(WifiSettings.WIFI_DIALOG_ID);
mDialog = null;
@@ -290,11 +280,8 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment
@Override
public boolean onPreferenceTreeClick(Preference preference) {
- if (preference instanceof LongPressAccessPointPreference) {
- showWifiDialog((LongPressAccessPointPreference) preference);
- return true;
- } else if (preference == mAddNetworkPreference) {
- showWifiDialog(null);
+ if (preference instanceof AccessPointPreference) {
+ showWifiDialog((AccessPointPreference) preference);
return true;
} else {
return super.onPreferenceTreeClick(preference);
diff --git a/tests/robotests/assets/grandfather_not_implementing_index_provider b/tests/robotests/assets/grandfather_not_implementing_index_provider
index 48c9de94d8b..37869e97cf2 100644
--- a/tests/robotests/assets/grandfather_not_implementing_index_provider
+++ b/tests/robotests/assets/grandfather_not_implementing_index_provider
@@ -73,5 +73,5 @@ com.android.settings.wifi.calling.WifiCallingSettingsForSub
com.android.settings.wifi.ChangeWifiStateDetails
com.android.settings.wifi.details.WifiNetworkDetailsFragment
com.android.settings.wifi.p2p.WifiP2pSettings
-com.android.settings.wifi.SavedAccessPointsWifiSettings
+com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings
com.android.settings.wifi.WifiInfo
diff --git a/tests/robotests/src/com/android/settings/wifi/SavedAccessPointsWifiSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettingsTest.java
similarity index 96%
rename from tests/robotests/src/com/android/settings/wifi/SavedAccessPointsWifiSettingsTest.java
rename to tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettingsTest.java
index b4fc4cdde7c..8ce2a3332f7 100644
--- a/tests/robotests/src/com/android/settings/wifi/SavedAccessPointsWifiSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettingsTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.settings.wifi;
+package com.android.settings.wifi.savedaccesspoints;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
@@ -28,6 +28,8 @@ import android.net.wifi.WifiManager.ActionListener;
import android.os.Handler;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.wifi.WifiConfigController;
+import com.android.settings.wifi.WifiDialog;
import com.android.settingslib.wifi.AccessPoint;
import org.junit.Before;