Merge "Add switch bar to enable/disable dev settings in new page."
diff --git a/res/layout-land/choose_lock_pattern.xml b/res/layout-land/choose_lock_pattern.xml
index 0743577..8e78b05 100644
--- a/res/layout-land/choose_lock_pattern.xml
+++ b/res/layout-land/choose_lock_pattern.xml
@@ -138,10 +138,12 @@
</LinearLayout>
<!-- right side: lock pattern -->
- <FrameLayout
+ <com.android.setupwizardlib.view.FillContentLayout
+ style="@style/LockPatternContainerStyle"
android:layout_width="0dp"
android:layout_height="match_parent"
- android:layout_weight="1.0">
+ android:layout_weight="1.0"
+ android:paddingStart="0dp">
<com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
android:layout_width="match_parent"
@@ -149,7 +151,7 @@
android:layout_gravity="center"
android:background="@color/lock_pattern_background" />
- </FrameLayout>
+ </com.android.setupwizardlib.view.FillContentLayout>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/res/layout-land/confirm_lock_pattern_internal.xml b/res/layout-land/confirm_lock_pattern_internal.xml
index 4e58f32..952ab49 100644
--- a/res/layout-land/confirm_lock_pattern_internal.xml
+++ b/res/layout-land/confirm_lock_pattern_internal.xml
@@ -96,10 +96,12 @@
</ScrollView>
- <FrameLayout
+ <com.android.setupwizardlib.view.FillContentLayout
+ style="@style/LockPatternContainerStyle"
android:layout_width="0dp"
android:layout_height="match_parent"
- android:layout_weight="1">
+ android:layout_weight="1"
+ android:paddingStart="0dp">
<com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
android:layout_width="match_parent"
@@ -107,7 +109,7 @@
android:layout_gravity="center"
android:background="@color/lock_pattern_background" />
- </FrameLayout>
+ </com.android.setupwizardlib.view.FillContentLayout>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</com.android.setupwizardlib.GlifLayout>
diff --git a/res/layout/choose_lock_pattern_common.xml b/res/layout/choose_lock_pattern_common.xml
index 3ea960d..7dca27d 100644
--- a/res/layout/choose_lock_pattern_common.xml
+++ b/res/layout/choose_lock_pattern_common.xml
@@ -64,19 +64,31 @@
android:gravity="center"
android:clipChildren="false"
android:clipToPadding="false"
- android:orientation="vertical">
+ android:orientation="vertical"
+ android:paddingLeft="0dp"
+ android:paddingRight="0dp">
<TextView android:id="@+id/headerText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minLines="2"
android:gravity="center"
+ android:paddingHorizontal="?attr/suwMarginSides"
android:textSize="18sp" />
- <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1" />
+ <com.android.setupwizardlib.view.FillContentLayout
+ style="@style/LockPatternContainerStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="0dp"
+ android:layout_weight="1">
+
+ <com.android.internal.widget.LockPatternView
+ android:id="@+id/lockPattern"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center" />
+
+ </com.android.setupwizardlib.view.FillContentLayout>
</LinearLayout>
diff --git a/res/layout/confirm_lock_pattern_internal_base.xml b/res/layout/confirm_lock_pattern_internal_base.xml
index 5109632..d0ce769 100644
--- a/res/layout/confirm_lock_pattern_internal_base.xml
+++ b/res/layout/confirm_lock_pattern_internal_base.xml
@@ -61,14 +61,23 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:gravity="center">
+ android:gravity="center"
+ android:paddingLeft="0dp"
+ android:paddingRight="0dp">
- <com.android.internal.widget.LockPatternView
- android:id="@+id/lockPattern"
- android:layout_width="match_parent"
+ <com.android.setupwizardlib.view.FillContentLayout
+ style="@style/LockPatternContainerStyle"
+ android:layout_width="wrap_content"
android:layout_height="0dp"
- android:layout_weight="4"
- android:layout_gravity="center_horizontal"/>
+ android:layout_weight="1">
+
+ <com.android.internal.widget.LockPatternView
+ android:id="@+id/lockPattern"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center" />
+
+ </com.android.setupwizardlib.view.FillContentLayout>
<TextView
style="@style/TextAppearance.ConfirmDeviceCredentialsErrorText"
@@ -77,9 +86,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
+ android:layout_marginHorizontal="?attr/suwMarginSides"
android:layout_marginTop="12dp"
- android:layout_marginStart="12dp"
- android:layout_marginEnd="12dp"
android:gravity="center_vertical"/>
<ImageView
@@ -87,6 +95,7 @@
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_marginHorizontal="?attr/suwMarginSides"
android:layout_marginBottom="24dp"
android:contentDescription="@string/confirm_fingerprint_icon_content_description"
android:visibility="gone"/>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index fcc0b6d..c58f6bb 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4630,6 +4630,12 @@
<string name="background_activity_summary_off">App\'s background activity is limited when not in use</string>
<!-- Summary for the background activity when it is disabled [CHAR_LIMIT=120] -->
<string name="background_activity_summary_disabled">App not allowed to run in background</string>
+ <!-- TODO: Pending UX review. Summary for the background activity when it is whitlisted [CHAR_LIMIT=120] -->
+ <string name="background_activity_summary_whitelisted">App can not be optimized for battery use</string>
+ <!-- TODO: Pending UX review. Title for the warning dialog to show to the user when limiting background activity for an app -->
+ <string name="background_activity_warning_dialog_title">Limit background activity?</string>
+ <!-- TODO: Pending UX review. Text for the warning dialog to show to the user when limiting background activity for an app -->
+ <string name="background_activity_warning_dialog_text">If you limit background activity for an app, it may misbehave</string>
<!-- Title for the screen usage in power use UI [CHAR_LIMIT=60] -->
<string name="device_screen_usage">Screen usage since full charge</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index a3bfcdf..fe92e6d 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -427,6 +427,16 @@
<style name="DreamStartButton" parent="android:Widget.Material.Button" />
+ <style name="LockPatternContainerStyle">
+ <item name="android:maxHeight">400dp</item>
+ <item name="android:maxWidth">420dp</item>
+ <item name="android:minHeight">0dp</item>
+ <item name="android:minWidth">0dp</item>
+ <item name="android:paddingBottom">0dp</item>
+ <item name="android:paddingHorizontal">44dp</item>
+ <item name="android:paddingTop">0dp</item>
+ </style>
+
<style name="LockPatternStyle">
<item name="*android:regularColor">@color/lock_pattern_view_regular_color</item>
<item name="*android:successColor">@color/lock_pattern_view_success_color</item>
diff --git a/res/xml/wifi_network_details_fragment.xml b/res/xml/wifi_network_details_fragment.xml
index 550ab36..5407947 100644
--- a/res/xml/wifi_network_details_fragment.xml
+++ b/res/xml/wifi_network_details_fragment.xml
@@ -22,14 +22,14 @@
android:selectable="false"
android:order="-10000"/>
+ <!-- Buttons -->
+ <com.android.settings.widget.ActionButtonPreference
+ android:key="buttons"
+ android:selectable="false" />
+
<!-- General Details Category -->
<PreferenceCategory
android:key="general_details_category" >
- <!-- Buttons -->
- <com.android.settings.widget.ActionButtonPreference
- android:key="buttons"
- android:selectable="false" />
-
<com.android.settings.wifi.WifiDetailPreference
android:key="signal_strength"
android:title="@string/wifi_signal"
@@ -87,5 +87,4 @@
android:key="ipv6_addresses"
android:selectable="false"/>
</PreferenceCategory>
-
</PreferenceScreen>
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 0142e62..66a0ca2 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -68,7 +68,8 @@
public class AdvancedPowerUsageDetail extends DashboardFragment implements
ButtonActionDialogFragment.AppButtonsDialogListener,
AnomalyDialogFragment.AnomalyDialogListener,
- LoaderManager.LoaderCallbacks<List<Anomaly>> {
+ LoaderManager.LoaderCallbacks<List<Anomaly>>,
+ BackgroundActivityPreferenceController.WarningConfirmationListener {
public static final String TAG = "AdvancedPowerUsageDetail";
public static final String EXTRA_UID = "extra_uid";
@@ -109,6 +110,7 @@
@VisibleForTesting
AnomalySummaryPreferenceController mAnomalySummaryPreferenceController;
private AppButtonsPreferenceController mAppButtonsPreferenceController;
+ private BackgroundActivityPreferenceController mBackgroundActivityPreferenceController;
private DevicePolicyManagerWrapper mDpm;
private UserManager mUserManager;
@@ -319,7 +321,9 @@
final int uid = bundle.getInt(EXTRA_UID, 0);
final String packageName = bundle.getString(EXTRA_PACKAGE_NAME);
- controllers.add(new BackgroundActivityPreferenceController(context, uid));
+ mBackgroundActivityPreferenceController = new BackgroundActivityPreferenceController(
+ context, this, uid, packageName);
+ controllers.add(mBackgroundActivityPreferenceController);
controllers.add(new BatteryOptimizationPreferenceController(
(SettingsActivity) getActivity(), this, packageName));
mAppButtonsPreferenceController = new AppButtonsPreferenceController(
@@ -364,4 +368,10 @@
public void onLoaderReset(Loader<List<Anomaly>> loader) {
}
+
+ @Override
+ public void onLimitBackgroundActivity() {
+ mBackgroundActivityPreferenceController.setUnchecked(
+ findPreference(mBackgroundActivityPreferenceController.getPreferenceKey()));
+ }
}
diff --git a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
index 4d1cf77..cea6d16 100644
--- a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
@@ -14,12 +14,17 @@
package com.android.settings.fuelgauge;
+import android.app.AlertDialog;
import android.app.AppOpsManager;
+import android.app.Dialog;
+import android.app.Fragment;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Build;
+import android.os.Bundle;
import android.os.UserManager;
import android.support.annotation.VisibleForTesting;
import android.support.v14.preference.SwitchPreference;
@@ -29,6 +34,7 @@
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.enterprise.DevicePolicyManagerWrapper;
import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -45,54 +51,72 @@
private final PackageManager mPackageManager;
private final AppOpsManager mAppOpsManager;
private final UserManager mUserManager;
- private final String[] mPackages;
private final int mUid;
@VisibleForTesting
DevicePolicyManagerWrapper mDpm;
-
+ private Fragment mFragment;
private String mTargetPackage;
+ private boolean mIsPreOApp;
+ private PowerWhitelistBackend mPowerWhitelistBackend;
- public BackgroundActivityPreferenceController(Context context, int uid) {
+ public BackgroundActivityPreferenceController(Context context, Fragment fragment,
+ int uid, String packageName) {
+ this(context, fragment, uid, packageName, PowerWhitelistBackend.getInstance());
+ }
+
+ @VisibleForTesting
+ BackgroundActivityPreferenceController(Context context, Fragment fragment,
+ int uid, String packageName, PowerWhitelistBackend backend) {
super(context);
+ mPowerWhitelistBackend = backend;
mPackageManager = context.getPackageManager();
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
mDpm = new DevicePolicyManagerWrapperImpl(
(DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE));
mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
mUid = uid;
- mPackages = mPackageManager.getPackagesForUid(mUid);
+ mFragment = fragment;
+ mTargetPackage = packageName;
+ mIsPreOApp = isLegacyApp(packageName);
}
@Override
public void updateState(Preference preference) {
final int mode = mAppOpsManager
- .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, mUid, mTargetPackage);
+ .checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mTargetPackage);
+ final boolean whitelisted = mPowerWhitelistBackend.isWhitelisted(mTargetPackage);
// Set checked or not before we may set it disabled
if (mode != AppOpsManager.MODE_ERRORED) {
- final boolean checked = mode != AppOpsManager.MODE_IGNORED;
+ final boolean checked = whitelisted || mode != AppOpsManager.MODE_IGNORED;
((SwitchPreference) preference).setChecked(checked);
}
- if (mode == AppOpsManager.MODE_ERRORED
+ if (whitelisted || mode == AppOpsManager.MODE_ERRORED
|| Utils.isProfileOrDeviceOwner(mUserManager, mDpm, mTargetPackage)) {
preference.setEnabled(false);
+ } else {
+ preference.setEnabled(true);
}
-
updateSummary(preference);
}
@Override
public boolean isAvailable() {
- if (mPackages == null) {
- return false;
- }
- for (final String packageName : mPackages) {
- if (isLegacyApp(packageName)) {
- mTargetPackage = packageName;
- return true;
- }
- }
+ return mTargetPackage != null;
+ }
- return false;
+ /**
+ * Called from the warning dialog, if the user decides to go ahead and disable background
+ * activity for this package
+ */
+ public void setUnchecked(Preference preference) {
+ if (mIsPreOApp) {
+ mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, mUid, mTargetPackage,
+ AppOpsManager.MODE_IGNORED);
+ }
+ mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mTargetPackage,
+ AppOpsManager.MODE_IGNORED);
+ ((SwitchPreference) preference).setChecked(false);
+ updateSummary(preference);
}
@Override
@@ -102,20 +126,24 @@
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
- boolean switchOn = (Boolean) newValue;
- mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, mUid, mTargetPackage,
- switchOn ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED);
-
+ final boolean switchOn = (Boolean) newValue;
+ if (!switchOn) {
+ final WarningDialogFragment dialogFragment = new WarningDialogFragment();
+ dialogFragment.setTargetFragment(mFragment, 0);
+ dialogFragment.show(mFragment.getFragmentManager(), TAG);
+ return false;
+ }
+ if (mIsPreOApp) {
+ mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, mUid, mTargetPackage,
+ AppOpsManager.MODE_ALLOWED);
+ }
+ mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mTargetPackage,
+ AppOpsManager.MODE_ALLOWED);
updateSummary(preference);
return true;
}
@VisibleForTesting
- String getTargetPackage() {
- return mTargetPackage;
- }
-
- @VisibleForTesting
boolean isLegacyApp(final String packageName) {
try {
ApplicationInfo info = mPackageManager.getApplicationInfo(packageName,
@@ -131,8 +159,12 @@
@VisibleForTesting
void updateSummary(Preference preference) {
+ if (mPowerWhitelistBackend.isWhitelisted(mTargetPackage)) {
+ preference.setSummary(R.string.background_activity_summary_whitelisted);
+ return;
+ }
final int mode = mAppOpsManager
- .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, mUid, mTargetPackage);
+ .checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mTargetPackage);
if (mode == AppOpsManager.MODE_ERRORED) {
preference.setSummary(R.string.background_activity_summary_disabled);
@@ -142,4 +174,37 @@
: R.string.background_activity_summary_off);
}
}
+
+ interface WarningConfirmationListener {
+ void onLimitBackgroundActivity();
+ }
+
+ /**
+ * Warning dialog to show to the user as turning off background activity can lead to
+ * apps misbehaving as their background task scheduling guarantees will no longer be honored.
+ */
+ public static class WarningDialogFragment extends InstrumentedDialogFragment {
+ @Override
+ public int getMetricsCategory() {
+ // TODO (b/65494831): add metric id
+ return 0;
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ final WarningConfirmationListener listener =
+ (WarningConfirmationListener) getTargetFragment();
+ return new AlertDialog.Builder(getContext())
+ .setTitle(R.string.background_activity_warning_dialog_title)
+ .setMessage(R.string.background_activity_warning_dialog_text)
+ .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ listener.onLimitBackgroundActivity();
+ }
+ })
+ .setNegativeButton(R.string.dlg_cancel, null)
+ .create();
+ }
+ }
}
diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java
index 34e8cc3..d66b310 100644
--- a/src/com/android/settings/location/LocationSettings.java
+++ b/src/com/android/settings/location/LocationSettings.java
@@ -35,7 +35,6 @@
import android.widget.Switch;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.DimmableIconPreference;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
@@ -43,6 +42,7 @@
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.widget.SwitchBar;
import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedPreference;
import com.android.settingslib.RestrictedSwitchPreference;
import com.android.settingslib.location.RecentLocationApps;
@@ -207,8 +207,8 @@
List<Preference> recentLocationPrefs = new ArrayList<>(recentLocationRequests.size());
for (final RecentLocationApps.Request request : recentLocationRequests) {
- DimmableIconPreference pref = new DimmableIconPreference(getPrefContext(),
- request.contentDescription);
+ RestrictedPreference pref = new RestrictedPreference(getPrefContext());
+ pref.setSummary(request.contentDescription);
pref.setIcon(request.icon);
pref.setTitle(request.label);
pref.setOnPreferenceClickListener(
diff --git a/src/com/android/settings/widget/ValidatedEditTextPreference.java b/src/com/android/settings/widget/ValidatedEditTextPreference.java
index 76331d4..58c62eb 100644
--- a/src/com/android/settings/widget/ValidatedEditTextPreference.java
+++ b/src/com/android/settings/widget/ValidatedEditTextPreference.java
@@ -21,8 +21,10 @@
import android.support.annotation.VisibleForTesting;
import android.text.Editable;
import android.text.InputType;
+import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.View;
import android.widget.EditText;
@@ -61,17 +63,18 @@
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
- if (mValidator != null) {
- final EditText editText = view.findViewById(android.R.id.edit);
- if (editText != null) {
- editText.removeTextChangedListener(mTextWatcher);
- if (mIsPassword) {
- editText.setInputType(
- InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
- editText.setMaxLines(1);
- }
- editText.addTextChangedListener(mTextWatcher);
+ final EditText editText = view.findViewById(android.R.id.edit);
+ if (editText != null && !TextUtils.isEmpty(editText.getText())) {
+ editText.setSelection(editText.getText().length());
+ }
+ if (mValidator != null && editText != null) {
+ editText.removeTextChangedListener(mTextWatcher);
+ if (mIsPassword) {
+ editText.setInputType(
+ InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
+ editText.setMaxLines(1);
}
+ editText.addTextChangedListener(mTextWatcher);
}
}
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index 5a3d426..3cf7f93 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -492,7 +492,7 @@
}
}
- /* package */ WifiConfiguration getConfig() {
+ public WifiConfiguration getConfig() {
if (mMode == WifiConfigUiBase.MODE_VIEW) {
return null;
}
diff --git a/src/com/android/settings/wifi/WifiDialog.java b/src/com/android/settings/wifi/WifiDialog.java
index 81f2a14..cb3f8df 100644
--- a/src/com/android/settings/wifi/WifiDialog.java
+++ b/src/com/android/settings/wifi/WifiDialog.java
@@ -27,8 +27,7 @@
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.wifi.AccessPoint;
-// TODO(b/64069122) Have this extend a dialogfragment to handle the fullscreen launch case.
-class WifiDialog extends AlertDialog implements WifiConfigUiBase, DialogInterface.OnClickListener {
+public class WifiDialog extends AlertDialog implements WifiConfigUiBase, DialogInterface.OnClickListener {
public interface WifiDialogListener {
void onForget(WifiDialog dialog);
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index ef6a650..f3b08bf 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -884,17 +884,20 @@
* {@link #mConnectedAccessPointPreferenceCategory}.
*/
private void addConnectedAccessPointPreference(AccessPoint connectedAp) {
- String key = connectedAp.getBssid();
- LongPressAccessPointPreference pref = (LongPressAccessPointPreference)
- getCachedPreference(key);
- if (pref == null) {
- pref = createLongPressActionPointPreference(connectedAp);
- }
+ final LongPressAccessPointPreference pref = getOrCreatePreference(connectedAp);
// Save the state of the current access point in the bundle so that we can restore it
// in the Wifi Network Details Fragment
pref.getAccessPoint().saveWifiState(pref.getExtras());
- pref.setFragment(WifiNetworkDetailsFragment.class.getName());
+
+ // Launch details page on click.
+ pref.setOnPreferenceClickListener(preference -> {
+ SettingsActivity activity = (SettingsActivity) WifiSettings.this.getActivity();
+ activity.startPreferencePanel(this,
+ WifiNetworkDetailsFragment.class.getName(), pref.getExtras(),
+ R.string.wifi_details_title, null, null, 0);
+ return true;
+ });
pref.refresh();
mConnectedAccessPointPreferenceCategory.addPreference(pref);
@@ -905,6 +908,15 @@
}
}
+ private LongPressAccessPointPreference getOrCreatePreference(AccessPoint ap) {
+ LongPressAccessPointPreference pref = (LongPressAccessPointPreference)
+ getCachedPreference(AccessPointPreference.generatePreferenceKey(ap));
+ if (pref == null) {
+ pref = createLongPressActionPointPreference(ap);
+ }
+ return pref;
+ }
+
/** Removes all preferences and hide the {@link #mConnectedAccessPointPreferenceCategory}. */
private void removeConnectedAccessPointPreference() {
mConnectedAccessPointPreferenceCategory.removeAll();
diff --git a/src/com/android/settings/wifi/details/WifiDetailActionBarObserver.java b/src/com/android/settings/wifi/details/WifiDetailActionBarObserver.java
deleted file mode 100644
index 81413d2..0000000
--- a/src/com/android/settings/wifi/details/WifiDetailActionBarObserver.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.wifi.details;
-
-import android.app.Fragment;
-import android.content.Context;
-import android.os.Bundle;
-import com.android.settings.R;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnCreate;
-
-/**
- * ActionBar lifecycle observer for {@link WifiNetworkDetailsFragment}.
- */
-public class WifiDetailActionBarObserver implements LifecycleObserver, OnCreate {
-
- private final Fragment mFragment;
- private final Context mContext;
-
- public WifiDetailActionBarObserver(Context context, Fragment fragment) {
- mContext = context;
- mFragment = fragment;
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- if (mFragment.getActivity() != null) {
- mFragment.getActivity().getActionBar()
- .setTitle(mContext.getString(R.string.wifi_details_title));
- }
- }
-}
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index 0996416..014fb0f 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -21,6 +21,7 @@
import static com.android.settings.wifi.WifiSettings.isEditabilityLockedDown;
+import android.app.Activity;
import android.app.Fragment;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -48,7 +49,7 @@
import android.text.TextUtils;
import android.util.Log;
import android.widget.ImageView;
-
+import android.widget.Toast;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
@@ -60,13 +61,14 @@
import com.android.settings.widget.ActionButtonPreference;
import com.android.settings.widget.EntityHeaderController;
import com.android.settings.wifi.WifiDetailPreference;
+import com.android.settings.wifi.WifiDialog;
+import com.android.settings.wifi.WifiDialog.WifiDialogListener;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;
import com.android.settingslib.wifi.AccessPoint;
-
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
@@ -79,7 +81,9 @@
* {@link WifiNetworkDetailsFragment}.
*/
public class WifiDetailPreferenceController extends AbstractPreferenceController
- implements PreferenceControllerMixin, LifecycleObserver, OnPause, OnResume {
+ implements PreferenceControllerMixin, WifiDialogListener, LifecycleObserver, OnPause,
+ OnResume {
+
private static final String TAG = "WifiDetailsPrefCtrl";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -121,7 +125,7 @@
private NetworkCapabilities mNetworkCapabilities;
private int mRssiSignalLevel = -1;
private String[] mSignalStr;
- private final WifiConfiguration mWifiConfig;
+ private WifiConfiguration mWifiConfig;
private WifiInfo mWifiInfo;
private final WifiManager mWifiManager;
private final MetricsFeatureProvider mMetricsFeatureProvider;
@@ -147,9 +151,21 @@
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) {
+ case WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION:
+ if (!intent.getBooleanExtra(WifiManager.EXTRA_MULTIPLE_NETWORKS_CHANGED,
+ false /* defaultValue */)) {
+ // only one network changed
+ WifiConfiguration wifiConfiguration = intent
+ .getParcelableExtra(WifiManager.EXTRA_WIFI_CONFIGURATION);
+ if (mAccessPoint.matches(wifiConfiguration)) {
+ mWifiConfig = wifiConfiguration;
+ }
+ }
+ // fall through
case WifiManager.NETWORK_STATE_CHANGED_ACTION:
case WifiManager.RSSI_CHANGED_ACTION:
updateInfo();
+ break;
}
}
};
@@ -239,6 +255,8 @@
mFilter = new IntentFilter();
mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
+ mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
+
lifecycle.addObserver(this);
}
@@ -334,7 +352,7 @@
return;
}
- // Update whether the forgot button should be displayed.
+ // Update whether the forget button should be displayed.
mButtonsPref.setButton1Visible(canForgetNetwork());
refreshNetworkState();
@@ -520,6 +538,32 @@
mConnectivityManagerWrapper.startCaptivePortalApp(mNetwork);
}
+ @Override
+ public void onForget(WifiDialog dialog) {
+ // can't forget network from a 'modify' dialog
+ }
+
+ @Override
+ public void onSubmit(WifiDialog dialog) {
+ if (dialog.getController() != null) {
+ mWifiManager.save(dialog.getController().getConfig(), new WifiManager.ActionListener() {
+ @Override
+ public void onSuccess() {
+ }
+
+ @Override
+ public void onFailure(int reason) {
+ Activity activity = mFragment.getActivity();
+ if (activity != null) {
+ Toast.makeText(activity,
+ R.string.wifi_failed_save_message,
+ Toast.LENGTH_SHORT).show();
+ }
+ }
+ });
+ }
+ }
+
/**
* Wrapper for testing compatibility.
*/
diff --git a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
index 4918889..765bebc 100644
--- a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
+++ b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
@@ -15,17 +15,25 @@
*/
package com.android.settings.wifi.details;
+import static com.android.settings.wifi.WifiSettings.WIFI_DIALOG_ID;
+
+import android.app.Dialog;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import com.android.internal.logging.nano.MetricsProto;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.vpn2.ConnectivityManagerWrapperImpl;
-import com.android.settings.wifi.WifiDetailPreference;
+import com.android.settings.wifi.WifiConfigUiBase;
+import com.android.settings.wifi.WifiDialog;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.wifi.AccessPoint;
import java.util.ArrayList;
@@ -44,13 +52,9 @@
private AccessPoint mAccessPoint;
private WifiDetailPreferenceController mWifiDetailPreferenceController;
- private WifiDetailActionBarObserver mWifiDetailActionBarObserver;
@Override
public void onAttach(Context context) {
- mWifiDetailActionBarObserver = new WifiDetailActionBarObserver(context, this);
- getLifecycle().addObserver(mWifiDetailActionBarObserver);
-
mAccessPoint = new AccessPoint(context, getArguments());
super.onAttach(context);
}
@@ -71,6 +75,44 @@
}
@Override
+ public int getDialogMetricsCategory(int dialogId) {
+ if (dialogId == WIFI_DIALOG_ID) {
+ return MetricsEvent.DIALOG_WIFI_AP_EDIT;
+ }
+ return 0;
+ }
+
+ @Override
+ public Dialog onCreateDialog(int dialogId) {
+ if (getActivity() == null || mWifiDetailPreferenceController == null
+ || mAccessPoint == null) {
+ return null;
+ }
+ return WifiDialog.createModal(getActivity(), mWifiDetailPreferenceController, mAccessPoint,
+ WifiConfigUiBase.MODE_MODIFY);
+ }
+
+
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ MenuItem item = menu.add(0, Menu.FIRST, 0, R.string.wifi_modify);
+ item.setIcon(R.drawable.ic_mode_edit);
+ item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+ super.onCreateOptionsMenu(menu, inflater);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem menuItem) {
+ switch (menuItem.getItemId()) {
+ case Menu.FIRST:
+ showDialog(WIFI_DIALOG_ID);
+ return true;
+ default:
+ return super.onOptionsItemSelected(menuItem);
+ }
+ }
+
+ @Override
protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
ConnectivityManager cm = context.getSystemService(ConnectivityManager.class);
mWifiDetailPreferenceController = WifiDetailPreferenceController.newInstance(
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
index 91f4a2b..86836f9 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
@@ -16,14 +16,25 @@
package com.android.settings.fuelgauge;
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.app.AlertDialog;
import android.app.AppOpsManager;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.UserManager;
import android.support.v14.preference.SwitchPreference;
+import android.widget.Button;
import com.android.settings.R;
import com.android.settings.TestConfig;
@@ -38,22 +49,17 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
+import org.robolectric.shadows.ShadowAlertDialog;
+import org.robolectric.shadows.ShadowDialog;
+import org.robolectric.util.FragmentTestUtil;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class BackgroundActivityPreferenceControllerTest {
- private static final int UID_NORMAL = 1234;
- private static final int UID_SPECIAL = 2345;
+ private static final int UID_LOW_SDK = 1234;
+ private static final int UID_HIGH_SDK = 3456;
private static final String HIGH_SDK_PACKAGE = "com.android.package.high";
private static final String LOW_SDK_PACKAGE = "com.android.package.low";
- private static final String[] PACKAGES_NORMAL = {LOW_SDK_PACKAGE};
- private static final String[] PACKAGES_SPECIAL = {HIGH_SDK_PACKAGE, LOW_SDK_PACKAGE};
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
@@ -71,6 +77,10 @@
private DevicePolicyManager mDevicePolicyManager;
@Mock
private DevicePolicyManagerWrapper mDevicePolicyManagerWrapper;
+ @Mock
+ private AdvancedPowerUsageDetail mFragment;
+ @Mock
+ private PowerWhitelistBackend mPowerWhitelistBackend;
private BackgroundActivityPreferenceController mController;
private SwitchPreference mPreference;
private Context mShadowContext;
@@ -85,19 +95,19 @@
when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn(
mDevicePolicyManager);
- when(mPackageManager.getPackagesForUid(UID_NORMAL)).thenReturn(PACKAGES_NORMAL);
- when(mPackageManager.getPackagesForUid(UID_SPECIAL)).thenReturn(PACKAGES_SPECIAL);
when(mPackageManager.getApplicationInfo(HIGH_SDK_PACKAGE, PackageManager.GET_META_DATA))
.thenReturn(mHighApplicationInfo);
when(mPackageManager.getApplicationInfo(LOW_SDK_PACKAGE, PackageManager.GET_META_DATA))
.thenReturn(mLowApplicationInfo);
+
+ when(mPowerWhitelistBackend.isWhitelisted(LOW_SDK_PACKAGE)).thenReturn(false);
mHighApplicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
mLowApplicationInfo.targetSdkVersion = Build.VERSION_CODES.L;
mPreference = new SwitchPreference(mShadowContext);
- mController = spy(new BackgroundActivityPreferenceController(mContext, UID_NORMAL));
- mController.isAvailable();
+ mController = spy(new BackgroundActivityPreferenceController(
+ mContext, mFragment, UID_LOW_SDK, LOW_SDK_PACKAGE, mPowerWhitelistBackend));
mController.mDpm = mDevicePolicyManagerWrapper;
}
@@ -105,49 +115,66 @@
public void testOnPreferenceChange_TurnOnCheck_MethodInvoked() {
mController.onPreferenceChange(mPreference, true);
- verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL,
- mController.getTargetPackage(), AppOpsManager.MODE_ALLOWED);
- verify(mController).updateSummary(mPreference);
+ verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_LOW_SDK,
+ LOW_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
+ verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
+ LOW_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
+
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mShadowContext.getText(R.string.background_activity_summary_on));
}
@Test
- public void testOnPreferenceChange_TurnOffCheck_MethodInvoked() {
- mController.onPreferenceChange(mPreference, false);
-
- verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL,
- mController.getTargetPackage(), AppOpsManager.MODE_IGNORED);
- verify(mController).updateSummary(mPreference);
+ public void testOnPreferenceChange_TurnOnCheckHighSDK_MethodInvoked() {
+ mController = new BackgroundActivityPreferenceController(mContext, mFragment, UID_HIGH_SDK,
+ HIGH_SDK_PACKAGE, mPowerWhitelistBackend);
+ mController.onPreferenceChange(mPreference, true);
+ verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_HIGH_SDK,
+ HIGH_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
+ verify(mAppOpsManager, never()).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_HIGH_SDK,
+ HIGH_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mShadowContext.getText(R.string.background_activity_summary_on));
}
@Test
public void testUpdateState_CheckOn_SetCheckedTrue() {
- when(mAppOpsManager
- .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL, LOW_SDK_PACKAGE))
- .thenReturn(AppOpsManager.MODE_DEFAULT);
+ when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
+ LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_ALLOWED);
mController.updateState(mPreference);
assertThat(mPreference.isChecked()).isTrue();
+ assertThat(mPreference.isEnabled()).isTrue();
verify(mController).updateSummary(mPreference);
}
@Test
public void testUpdateState_CheckOff_SetCheckedFalse() {
- when(mAppOpsManager
- .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL, LOW_SDK_PACKAGE))
- .thenReturn(AppOpsManager.MODE_IGNORED);
+ when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
+ LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_IGNORED);
mController.updateState(mPreference);
assertThat(mPreference.isChecked()).isFalse();
+ assertThat(mPreference.isEnabled()).isTrue();
verify(mController).updateSummary(mPreference);
}
@Test
+ public void testUpdateState_whitelisted() {
+ when(mPowerWhitelistBackend.isWhitelisted(LOW_SDK_PACKAGE)).thenReturn(true);
+ mController.updateState(mPreference);
+ assertThat(mPreference.isChecked()).isTrue();
+ assertThat(mPreference.isEnabled()).isFalse();
+ assertThat(mPreference.getSummary()).isEqualTo(
+ mShadowContext.getText(R.string.background_activity_summary_whitelisted));
+ }
+
+ @Test
public void testUpdateSummary_modeError_showSummaryDisabled() {
- when(mAppOpsManager
- .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL, LOW_SDK_PACKAGE))
- .thenReturn(AppOpsManager.MODE_ERRORED);
+ when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
+ LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_ERRORED);
final CharSequence expectedSummary = mShadowContext.getText(
R.string.background_activity_summary_disabled);
mController.updateSummary(mPreference);
@@ -157,9 +184,8 @@
@Test
public void testUpdateSummary_modeDefault_showSummaryOn() {
- when(mAppOpsManager
- .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL, LOW_SDK_PACKAGE))
- .thenReturn(AppOpsManager.MODE_DEFAULT);
+ when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
+ LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_DEFAULT);
final CharSequence expectedSummary = mShadowContext.getText(
R.string.background_activity_summary_on);
@@ -170,9 +196,8 @@
@Test
public void testUpdateSummary_modeIgnored_showSummaryOff() {
- when(mAppOpsManager
- .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL, LOW_SDK_PACKAGE))
- .thenReturn(AppOpsManager.MODE_IGNORED);
+ when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
+ LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_IGNORED);
final CharSequence expectedSummary = mShadowContext.getText(
R.string.background_activity_summary_off);
@@ -182,31 +207,30 @@
}
@Test
- public void testIsPackageAvailable_SdkLowerThanO_ReturnTrue() {
+ public void testIsLegacyApp_SdkLowerThanO_ReturnTrue() {
assertThat(mController.isLegacyApp(LOW_SDK_PACKAGE)).isTrue();
}
@Test
- public void testIsPackageAvailable_SdkLargerOrEqualThanO_ReturnFalse() {
+ public void testIsLegacyApp_SdkLargerOrEqualThanO_ReturnFalse() {
assertThat(mController.isLegacyApp(HIGH_SDK_PACKAGE)).isFalse();
}
@Test
- public void testMultiplePackages_ReturnStatusForTargetPackage() {
- mController = new BackgroundActivityPreferenceController(mContext, UID_SPECIAL);
- mController.mDpm = mDevicePolicyManagerWrapper;
- when(mAppOpsManager
- .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_SPECIAL, LOW_SDK_PACKAGE))
- .thenReturn(AppOpsManager.MODE_ALLOWED);
- when(mAppOpsManager
- .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_SPECIAL, HIGH_SDK_PACKAGE))
- .thenReturn(AppOpsManager.MODE_IGNORED);
+ public void testIsAvailable_ReturnTrue() {
+ assertThat(mController.isAvailable()).isTrue();
+ }
- final boolean available = mController.isAvailable();
- mController.updateState(mPreference);
-
- assertThat(available).isTrue();
- // Should get status from LOW_SDK_PACKAGE
- assertThat(mPreference.isChecked()).isTrue();
+ @Test
+ public void testWarningDialog() {
+ BackgroundActivityPreferenceController.WarningDialogFragment dialogFragment =
+ new BackgroundActivityPreferenceController.WarningDialogFragment();
+ dialogFragment.setTargetFragment(mFragment, 0);
+ FragmentTestUtil.startFragment(dialogFragment);
+ final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
+ ShadowAlertDialog shadowDialog = shadowOf(dialog);
+ final Button okButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
+ shadowDialog.clickOn(okButton.getId());
+ verify(mFragment).onLimitBackgroundActivity();
}
}
diff --git a/tests/robotests/src/com/android/settings/widget/ValidatedEditTextPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/ValidatedEditTextPreferenceTest.java
index 88a5147..e061787 100644
--- a/tests/robotests/src/com/android/settings/widget/ValidatedEditTextPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/ValidatedEditTextPreferenceTest.java
@@ -35,9 +35,10 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
@@ -58,10 +59,36 @@
}
@Test
- public void bindDialogView_noTextWatcher_shouldDoNothing() {
+ public void bindDialogView_nullEditText_shouldNotCrash() {
+ when(mView.findViewById(android.R.id.edit)).thenReturn(null);
+ // should not crash trying to get the EditText text
+ mPreference.onBindDialogView(mView);
+ }
+
+ @Test
+ public void bindDialogView_emptyEditText_shouldNotSetSelection() {
+ final String testText = "";
+ final EditText editText = spy(new EditText(RuntimeEnvironment.application));
+ editText.setText(testText);
+ when(mView.findViewById(android.R.id.edit)).thenReturn(editText);
+
mPreference.onBindDialogView(mView);
- verifyZeroInteractions(mView);
+ // no need to setSelection if text was empty
+ verify(editText, never()).setSelection(anyInt());
+ }
+
+ @Test
+ public void bindDialogView_nonemptyEditText_shouldSetSelection() {
+ final String testText = "whatever";
+ final EditText editText = spy(new EditText(RuntimeEnvironment.application));
+ editText.setText(testText);
+ when(mView.findViewById(android.R.id.edit)).thenReturn(editText);
+
+ mPreference.onBindDialogView(mView);
+
+ // selection should be set to end of string
+ verify(editText).setSelection(testText.length());
}
@Test
diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailActionBarObserverTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailActionBarObserverTest.java
deleted file mode 100644
index c573d3c..0000000
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailActionBarObserverTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.wifi.details;
-
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.ActionBar;
-import android.app.Activity;
-import android.content.Context;
-import android.os.Bundle;
-import com.android.settings.R;
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class WifiDetailActionBarObserverTest {
-
- @Mock private Bundle mockBundle;
- @Mock private Activity mockActivity;
- @Mock private ActionBar mockActionBar;
- @Mock private WifiNetworkDetailsFragment mockFragment;
-
- private Context mContext = RuntimeEnvironment.application;
- private Lifecycle mLifecycle;
- private WifiDetailActionBarObserver mObserver;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mLifecycle = new Lifecycle();
-
- when(mockFragment.getActivity()).thenReturn(mockActivity);
- when(mockActivity.getActionBar()).thenReturn(mockActionBar);
-
- mObserver = new WifiDetailActionBarObserver(mContext, mockFragment);
- mLifecycle.addObserver(mObserver);
- }
-
- @Test
- public void actionBarIsSetToNetworkInfo() {
- mLifecycle.onCreate(mockBundle);
-
- verify(mockActionBar).setTitle(mContext.getString(R.string.wifi_details_title));
- }
-}