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/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;
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/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/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/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);
+ }
}
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));
+ }
+}
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
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;