From a21c6edcf6261624b5ab1771d13f2a2ec6723f2b Mon Sep 17 00:00:00 2001 From: Christine Franks Date: Thu, 24 Jan 2019 12:18:40 -0800 Subject: [PATCH 01/17] Use ColorDisplayManager for night display settings Bug: 123352608 Test: make ROBOTEST_FILTER="(Night*)" RunSettingsRoboTests -j48 Change-Id: Id4ab9ca4a21243be5967d63db72212daefb3dcb9 --- ...DisplayActivationPreferenceController.java | 22 +++++++++---------- ...htDisplayAutoModePreferenceController.java | 8 +++---- ...playCustomEndTimePreferenceController.java | 10 ++++----- ...ayCustomStartTimePreferenceController.java | 10 ++++----- ...tDisplayIntensityPreferenceController.java | 18 +++++++-------- .../display/NightDisplayPreference.java | 5 ++++- .../NightDisplayPreferenceController.java | 5 ++--- .../display/NightDisplaySettings.java | 10 +++++---- .../display/NightDisplayTimeFormatter.java | 20 ++++++++--------- 9 files changed, 55 insertions(+), 53 deletions(-) diff --git a/src/com/android/settings/display/NightDisplayActivationPreferenceController.java b/src/com/android/settings/display/NightDisplayActivationPreferenceController.java index 17c16e73998..1be84348899 100644 --- a/src/com/android/settings/display/NightDisplayActivationPreferenceController.java +++ b/src/com/android/settings/display/NightDisplayActivationPreferenceController.java @@ -26,14 +26,13 @@ import android.widget.Button; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; -import com.android.internal.app.ColorDisplayController; import com.android.settings.R; import com.android.settings.core.TogglePreferenceController; import com.android.settingslib.widget.LayoutPreference; public class NightDisplayActivationPreferenceController extends TogglePreferenceController { - private ColorDisplayController mController; + private ColorDisplayManager mColorDisplayManager; private NightDisplayTimeFormatter mTimeFormatter; private Button mTurnOffButton; private Button mTurnOnButton; @@ -41,14 +40,15 @@ public class NightDisplayActivationPreferenceController extends TogglePreference private final OnClickListener mListener = new OnClickListener() { @Override public void onClick(View v) { - mController.setActivated(!mController.isActivated()); + mColorDisplayManager.setNightDisplayActivated(!mColorDisplayManager.isNightDisplayActivated()); updateStateInternal(); } }; public NightDisplayActivationPreferenceController(Context context, String key) { super(context, key); - mController = new ColorDisplayController(context); + + mColorDisplayManager = context.getSystemService(ColorDisplayManager.class); mTimeFormatter = new NightDisplayTimeFormatter(context); } @@ -83,17 +83,17 @@ public class NightDisplayActivationPreferenceController extends TogglePreference @Override public boolean isChecked() { - return mController.isActivated(); + return mColorDisplayManager.isNightDisplayActivated(); } @Override public boolean setChecked(boolean isChecked) { - return mController.setActivated(isChecked); + return mColorDisplayManager.setNightDisplayActivated(isChecked); } @Override public CharSequence getSummary() { - return mTimeFormatter.getAutoModeTimeSummary(mContext, mController); + return mTimeFormatter.getAutoModeTimeSummary(mContext, mColorDisplayManager); } private void updateStateInternal() { @@ -101,8 +101,8 @@ public class NightDisplayActivationPreferenceController extends TogglePreference return; } - final boolean isActivated = mController.isActivated(); - final int autoMode = mController.getAutoMode(); + final boolean isActivated = mColorDisplayManager.isNightDisplayActivated(); + final int autoMode = mColorDisplayManager.getNightDisplayAutoMode(); String buttonText; if (autoMode == ColorDisplayManager.AUTO_MODE_CUSTOM_TIME) { @@ -110,8 +110,8 @@ public class NightDisplayActivationPreferenceController extends TogglePreference ? R.string.night_display_activation_off_custom : R.string.night_display_activation_on_custom, mTimeFormatter.getFormattedTimeString(isActivated - ? mController.getCustomStartTime() - : mController.getCustomEndTime())); + ? mColorDisplayManager.getNightDisplayCustomStartTime() + : mColorDisplayManager.getNightDisplayCustomEndTime())); } else if (autoMode == ColorDisplayManager.AUTO_MODE_TWILIGHT) { buttonText = mContext.getString(isActivated ? R.string.night_display_activation_off_twilight diff --git a/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java b/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java index 33e3e6f5633..121b062a0e6 100644 --- a/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java +++ b/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java @@ -30,11 +30,11 @@ public class NightDisplayAutoModePreferenceController extends BasePreferenceCont implements Preference.OnPreferenceChangeListener { private DropDownPreference mPreference; - private ColorDisplayManager mManager; + private ColorDisplayManager mColorDisplayManager; public NightDisplayAutoModePreferenceController(Context context, String key) { super(context, key); - mManager = context.getSystemService(ColorDisplayManager.class); + mColorDisplayManager = context.getSystemService(ColorDisplayManager.class); } @Override @@ -63,11 +63,11 @@ public class NightDisplayAutoModePreferenceController extends BasePreferenceCont @Override public final void updateState(Preference preference) { - mPreference.setValue(String.valueOf(mManager.getNightDisplayAutoMode())); + mPreference.setValue(String.valueOf(mColorDisplayManager.getNightDisplayAutoMode())); } @Override public final boolean onPreferenceChange(Preference preference, Object newValue) { - return mManager.setNightDisplayAutoMode(Integer.parseInt((String) newValue)); + return mColorDisplayManager.setNightDisplayAutoMode(Integer.parseInt((String) newValue)); } } diff --git a/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java b/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java index b12c18ab973..0ebbeae4cc5 100644 --- a/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java +++ b/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java @@ -19,18 +19,17 @@ package com.android.settings.display; import android.content.Context; import android.hardware.display.ColorDisplayManager; import androidx.preference.Preference; -import com.android.internal.app.ColorDisplayController; import com.android.settings.core.BasePreferenceController; public class NightDisplayCustomEndTimePreferenceController extends BasePreferenceController { - private ColorDisplayController mController; + private ColorDisplayManager mColorDisplayManager; private NightDisplayTimeFormatter mTimeFormatter; public NightDisplayCustomEndTimePreferenceController(Context context, String key) { super(context, key); - mController = new ColorDisplayController(context); + mColorDisplayManager = context.getSystemService(ColorDisplayManager.class); mTimeFormatter = new NightDisplayTimeFormatter(context); } @@ -43,8 +42,9 @@ public class NightDisplayCustomEndTimePreferenceController extends BasePreferenc @Override public final void updateState(Preference preference) { preference - .setVisible(mController.getAutoMode() == ColorDisplayManager.AUTO_MODE_CUSTOM_TIME); + .setVisible(mColorDisplayManager.getNightDisplayAutoMode() + == ColorDisplayManager.AUTO_MODE_CUSTOM_TIME); preference.setSummary(mTimeFormatter.getFormattedTimeString( - mController.getCustomEndTime())); + mColorDisplayManager.getNightDisplayCustomEndTime())); } } diff --git a/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java b/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java index 10fb3a11076..a2a85ef292d 100644 --- a/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java +++ b/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java @@ -19,18 +19,17 @@ package com.android.settings.display; import android.content.Context; import android.hardware.display.ColorDisplayManager; import androidx.preference.Preference; -import com.android.internal.app.ColorDisplayController; import com.android.settings.core.BasePreferenceController; public class NightDisplayCustomStartTimePreferenceController extends BasePreferenceController { - private ColorDisplayController mController; + private ColorDisplayManager mColorDisplayManager; private NightDisplayTimeFormatter mTimeFormatter; public NightDisplayCustomStartTimePreferenceController(Context context, String key) { super(context, key); - mController = new ColorDisplayController(context); + mColorDisplayManager = context.getSystemService(ColorDisplayManager.class); mTimeFormatter = new NightDisplayTimeFormatter(context); } @@ -43,8 +42,9 @@ public class NightDisplayCustomStartTimePreferenceController extends BasePrefere @Override public final void updateState(Preference preference) { preference - .setVisible(mController.getAutoMode() == ColorDisplayManager.AUTO_MODE_CUSTOM_TIME); + .setVisible(mColorDisplayManager.getNightDisplayAutoMode() + == ColorDisplayManager.AUTO_MODE_CUSTOM_TIME); preference.setSummary(mTimeFormatter.getFormattedTimeString( - mController.getCustomStartTime())); + mColorDisplayManager.getNightDisplayCustomStartTime())); } } diff --git a/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java b/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java index 74878739c96..48e261e40a2 100644 --- a/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java +++ b/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java @@ -22,26 +22,24 @@ import android.text.TextUtils; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; -import androidx.annotation.VisibleForTesting; -import com.android.internal.app.ColorDisplayController; import com.android.settings.core.SliderPreferenceController; import com.android.settings.widget.SeekBarPreference; public class NightDisplayIntensityPreferenceController extends SliderPreferenceController { - private ColorDisplayController mController; + private ColorDisplayManager mColorDisplayManager; public NightDisplayIntensityPreferenceController(Context context, String key) { super(context, key); - mController = new ColorDisplayController(context); + mColorDisplayManager = context.getSystemService(ColorDisplayManager.class); } @Override public int getAvailabilityStatus() { if (!ColorDisplayManager.isNightDisplayAvailable(mContext)) { return UNSUPPORTED_ON_DEVICE; - } else if (!mController.isActivated()) { + } else if (!mColorDisplayManager.isNightDisplayActivated()) { return DISABLED_DEPENDENT_SETTING; } return AVAILABLE; @@ -63,22 +61,22 @@ public class NightDisplayIntensityPreferenceController extends SliderPreferenceC @Override public final void updateState(Preference preference) { super.updateState(preference); - preference.setEnabled(mController.isActivated()); + preference.setEnabled(mColorDisplayManager.isNightDisplayActivated()); } @Override public int getSliderPosition() { - return convertTemperature(mController.getColorTemperature()); + return convertTemperature(mColorDisplayManager.getNightDisplayColorTemperature()); } @Override public boolean setSliderPosition(int position) { - return mController.setColorTemperature(convertTemperature(position)); + return mColorDisplayManager.setNightDisplayColorTemperature(convertTemperature(position)); } @Override public int getMaxSteps() { - return convertTemperature(mController.getMinimumColorTemperature()); + return convertTemperature(ColorDisplayManager.getMinimumColorTemperature(mContext)); } /** @@ -87,6 +85,6 @@ public class NightDisplayIntensityPreferenceController extends SliderPreferenceC * adjustment status of the input. */ private int convertTemperature(int temperature) { - return mController.getMaximumColorTemperature() - temperature; + return ColorDisplayManager.getMaximumColorTemperature(mContext) - temperature; } } \ No newline at end of file diff --git a/src/com/android/settings/display/NightDisplayPreference.java b/src/com/android/settings/display/NightDisplayPreference.java index a84ba588816..82e25969a0a 100644 --- a/src/com/android/settings/display/NightDisplayPreference.java +++ b/src/com/android/settings/display/NightDisplayPreference.java @@ -15,6 +15,7 @@ package com.android.settings.display; import android.content.Context; +import android.hardware.display.ColorDisplayManager; import android.util.AttributeSet; import androidx.preference.SwitchPreference; @@ -26,12 +27,14 @@ import java.time.LocalTime; public class NightDisplayPreference extends SwitchPreference implements ColorDisplayController.Callback { + private ColorDisplayManager mColorDisplayManager; private ColorDisplayController mController; private NightDisplayTimeFormatter mTimeFormatter; public NightDisplayPreference(Context context, AttributeSet attrs) { super(context, attrs); + mColorDisplayManager = context.getSystemService(ColorDisplayManager.class); mController = new ColorDisplayController(context); mTimeFormatter = new NightDisplayTimeFormatter(context); } @@ -76,6 +79,6 @@ public class NightDisplayPreference extends SwitchPreference } private void updateSummary() { - setSummary(mTimeFormatter.getAutoModeTimeSummary(getContext(), mController)); + setSummary(mTimeFormatter.getAutoModeTimeSummary(getContext(), mColorDisplayManager)); } } diff --git a/src/com/android/settings/display/NightDisplayPreferenceController.java b/src/com/android/settings/display/NightDisplayPreferenceController.java index ab0250d50fe..6891d65dd95 100644 --- a/src/com/android/settings/display/NightDisplayPreferenceController.java +++ b/src/com/android/settings/display/NightDisplayPreferenceController.java @@ -16,7 +16,6 @@ package com.android.settings.display; import android.content.Context; import android.hardware.display.ColorDisplayManager; -import com.android.internal.app.ColorDisplayController; import com.android.settings.R; import com.android.settings.core.PreferenceControllerMixin; import com.android.settingslib.core.AbstractPreferenceController; @@ -37,8 +36,8 @@ public class NightDisplayPreferenceController extends AbstractPreferenceControll if (!isEnabled) { return true; } - final ColorDisplayController controller = new ColorDisplayController(context); - return controller.getAutoMode() != ColorDisplayManager.AUTO_MODE_DISABLED; + final ColorDisplayManager manager = context.getSystemService(ColorDisplayManager.class); + return manager.getNightDisplayAutoMode() != ColorDisplayManager.AUTO_MODE_DISABLED; } @Override diff --git a/src/com/android/settings/display/NightDisplaySettings.java b/src/com/android/settings/display/NightDisplaySettings.java index fb81a8c1327..4896b53d300 100644 --- a/src/com/android/settings/display/NightDisplaySettings.java +++ b/src/com/android/settings/display/NightDisplaySettings.java @@ -50,6 +50,7 @@ public class NightDisplaySettings extends DashboardFragment private static final int DIALOG_START_TIME = 0; private static final int DIALOG_END_TIME = 1; + private ColorDisplayManager mColorDisplayManager; private ColorDisplayController mController; @Override @@ -57,6 +58,7 @@ public class NightDisplaySettings extends DashboardFragment super.onCreate(savedInstanceState); final Context context = getContext(); + mColorDisplayManager = context.getSystemService(ColorDisplayManager.class); mController = new ColorDisplayController(context); } @@ -93,9 +95,9 @@ public class NightDisplaySettings extends DashboardFragment if (dialogId == DIALOG_START_TIME || dialogId == DIALOG_END_TIME) { final LocalTime initialTime; if (dialogId == DIALOG_START_TIME) { - initialTime = mController.getCustomStartTime(); + initialTime = mColorDisplayManager.getNightDisplayCustomStartTime(); } else { - initialTime = mController.getCustomEndTime(); + initialTime = mColorDisplayManager.getNightDisplayCustomEndTime(); } final Context context = getContext(); @@ -103,9 +105,9 @@ public class NightDisplaySettings extends DashboardFragment return new TimePickerDialog(context, (view, hourOfDay, minute) -> { final LocalTime time = LocalTime.of(hourOfDay, minute); if (dialogId == DIALOG_START_TIME) { - mController.setCustomStartTime(time); + mColorDisplayManager.setNightDisplayCustomStartTime(time); } else { - mController.setCustomEndTime(time); + mColorDisplayManager.setNightDisplayCustomEndTime(time); } }, initialTime.getHour(), initialTime.getMinute(), use24HourFormat); } diff --git a/src/com/android/settings/display/NightDisplayTimeFormatter.java b/src/com/android/settings/display/NightDisplayTimeFormatter.java index 1b82e0ae3ab..1b5b146ea2d 100644 --- a/src/com/android/settings/display/NightDisplayTimeFormatter.java +++ b/src/com/android/settings/display/NightDisplayTimeFormatter.java @@ -19,7 +19,6 @@ package com.android.settings.display; import android.content.Context; import android.hardware.display.ColorDisplayManager; -import com.android.internal.app.ColorDisplayController; import com.android.settings.R; import java.text.DateFormat; @@ -46,22 +45,23 @@ public class NightDisplayTimeFormatter { return mTimeFormatter.format(c.getTime()); } - public String getAutoModeTimeSummary(Context context, ColorDisplayController controller) { - final int summaryFormatResId = controller.isActivated() ? R.string.night_display_summary_on - : R.string.night_display_summary_off; - return context.getString(summaryFormatResId, getAutoModeSummary(context, controller)); + public String getAutoModeTimeSummary(Context context, ColorDisplayManager manager) { + final int summaryFormatResId = + manager.isNightDisplayActivated() ? R.string.night_display_summary_on + : R.string.night_display_summary_off; + return context.getString(summaryFormatResId, getAutoModeSummary(context, manager)); } - private String getAutoModeSummary(Context context, ColorDisplayController controller) { - final boolean isActivated = controller.isActivated(); - final int autoMode = controller.getAutoMode(); + private String getAutoModeSummary(Context context, ColorDisplayManager manager) { + final boolean isActivated = manager.isNightDisplayActivated(); + final int autoMode = manager.getNightDisplayAutoMode(); if (autoMode == ColorDisplayManager.AUTO_MODE_CUSTOM_TIME) { if (isActivated) { return context.getString(R.string.night_display_summary_on_auto_mode_custom, - getFormattedTimeString(controller.getCustomEndTime())); + getFormattedTimeString(manager.getNightDisplayCustomEndTime())); } else { return context.getString(R.string.night_display_summary_off_auto_mode_custom, - getFormattedTimeString(controller.getCustomStartTime())); + getFormattedTimeString(manager.getNightDisplayCustomStartTime())); } } else if (autoMode == ColorDisplayManager.AUTO_MODE_TWILIGHT) { return context.getString(isActivated From da2ca2f09239dedea565d00774d82cb8d014c838 Mon Sep 17 00:00:00 2001 From: Jason Chiu Date: Tue, 29 Jan 2019 17:13:28 +0800 Subject: [PATCH 02/17] Connect to network while clicking open or saved networks on slice Test: make RunSettingsRoboTests -j Fixes: 121342770 Change-Id: I0ffb925628dd271d054f990b9b176eb10372e6a3 --- AndroidManifest.xml | 6 + .../android/settings/wifi/WifiSettings.java | 36 +++--- src/com/android/settings/wifi/WifiUtils.java | 29 +++++ .../wifi/slice/ConnectToWifiHandler.java | 63 ++++++++++ .../settings/wifi/slice/WifiSlice.java | 4 + .../wifi/slice/ConnectToWifiHandlerTest.java | 117 ++++++++++++++++++ 6 files changed, 237 insertions(+), 18 deletions(-) create mode 100644 src/com/android/settings/wifi/slice/ConnectToWifiHandler.java create mode 100644 tests/robotests/src/com/android/settings/wifi/slice/ConnectToWifiHandlerTest.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index a8101f1fe93..fb581d60d6c 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2591,6 +2591,12 @@ + + Date: Wed, 30 Jan 2019 10:28:22 -0500 Subject: [PATCH 03/17] More tests for silent status bar setting Test: this Change-Id: I2f1890a4843438684c089b837cf74bd520b352e6 Fixes: 123419917 --- .../SilentStatusBarPreferenceController.java | 9 ++++++++- .../SilentStatusBarPreferenceControllerTest.java | 10 ++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/com/android/settings/notification/SilentStatusBarPreferenceController.java b/src/com/android/settings/notification/SilentStatusBarPreferenceController.java index 4721f5c9b27..5bf943ac37a 100644 --- a/src/com/android/settings/notification/SilentStatusBarPreferenceController.java +++ b/src/com/android/settings/notification/SilentStatusBarPreferenceController.java @@ -24,17 +24,24 @@ import android.provider.Settings; import com.android.settings.core.TogglePreferenceController; +import com.google.common.annotations.VisibleForTesting; + public class SilentStatusBarPreferenceController extends TogglePreferenceController { private static final String KEY = "hide_silent_icons"; private static final int MY_USER_ID = UserHandle.myUserId(); - private final NotificationBackend mBackend; + private NotificationBackend mBackend; public SilentStatusBarPreferenceController(Context context) { super(context, KEY); mBackend = new NotificationBackend(); } + @VisibleForTesting + void setBackend(NotificationBackend backend) { + mBackend = backend; + } + @Override public boolean isChecked() { return mBackend.shouldHideSilentStatusBarIcons(mContext); diff --git a/tests/robotests/src/com/android/settings/notification/SilentStatusBarPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/SilentStatusBarPreferenceControllerTest.java index 8a43a1ea2c4..9dd8ff9f5c6 100644 --- a/tests/robotests/src/com/android/settings/notification/SilentStatusBarPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/SilentStatusBarPreferenceControllerTest.java @@ -48,7 +48,6 @@ public class SilentStatusBarPreferenceControllerTest { @Mock private PreferenceScreen mScreen; - private FakeFeatureFactory mFeatureFactory; private Context mContext; private SilentStatusBarPreferenceController mController; private Preference mPreference; @@ -57,8 +56,8 @@ public class SilentStatusBarPreferenceControllerTest { public void setUp() { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; - mFeatureFactory = FakeFeatureFactory.setupForTest(); mController = new SilentStatusBarPreferenceController(mContext); + mController.setBackend(mBackend); mPreference = new Preference(mContext); mPreference.setKey(mController.getPreferenceKey()); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); @@ -83,7 +82,7 @@ public class SilentStatusBarPreferenceControllerTest { when(mBackend.shouldHideSilentStatusBarIcons(any())).thenReturn(false); assertThat(mController.isChecked()).isFalse(); } -/** + @Test public void isChecked_settingIsOn_true() { when(mBackend.shouldHideSilentStatusBarIcons(any())).thenReturn(true); @@ -93,18 +92,13 @@ public class SilentStatusBarPreferenceControllerTest { @Test public void onPreferenceChange_on() { mController.onPreferenceChange(mPreference, true); - - assertThat(mController.isChecked()).isTrue(); verify(mBackend).setHideSilentStatusIcons(true); } @Test public void onPreferenceChange_off() { mController.onPreferenceChange(mPreference, false); - - assertThat(mController.isChecked()).isFalse(); verify(mBackend).setHideSilentStatusIcons(false); } - **/ } From 139644bb0e7d7750adcde940e52598dd1016fb62 Mon Sep 17 00:00:00 2001 From: Soonil Nagarkar Date: Thu, 24 Jan 2019 17:52:19 -0800 Subject: [PATCH 04/17] Remove dead code from settings Test: manually Change-Id: I1ef0bb2a20c6c6f020dd051407dda2de87f174ea --- .../settings/location/LocationEnabler.java | 22 -------- .../location/LocationEnablerTest.java | 51 ------------------- .../settings/ui/LocationSettingsTests.java | 10 ++-- 3 files changed, 5 insertions(+), 78 deletions(-) diff --git a/src/com/android/settings/location/LocationEnabler.java b/src/com/android/settings/location/LocationEnabler.java index e1bdf162ef2..db5397330e1 100644 --- a/src/com/android/settings/location/LocationEnabler.java +++ b/src/com/android/settings/location/LocationEnabler.java @@ -15,9 +15,7 @@ package com.android.settings.location; import static com.android.settingslib.RestrictedLockUtilsInternal.checkIfRestrictionEnforced; import static com.android.settingslib.Utils.updateLocationEnabled; -import static com.android.settingslib.Utils.updateLocationMode; -import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -125,26 +123,6 @@ public class LocationEnabler implements LifecycleObserver, OnStart, OnStop { refreshLocationMode(); } - void setLocationMode(int mode) { - final int currentMode = Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF); - if (isRestricted()) { - // Location toggling disabled by user restriction. Read the current location mode to - // update the location master switch. - if (Log.isLoggable(TAG, Log.INFO)) { - Log.i(TAG, "Restricted user, not setting location mode"); - } - if (mListener != null) { - mListener.onLocationModeChanged(currentMode, true); - } - return; - } - - updateLocationMode(mContext, currentMode, mode, ActivityManager.getCurrentUser(), - Settings.Secure.LOCATION_CHANGER_SYSTEM_SETTINGS); - refreshLocationMode(); - } - boolean isEnabled(int mode) { return mode != Settings.Secure.LOCATION_MODE_OFF && !isRestricted(); } diff --git a/tests/robotests/src/com/android/settings/location/LocationEnablerTest.java b/tests/robotests/src/com/android/settings/location/LocationEnablerTest.java index 806e2ecf980..fbae2f45b16 100644 --- a/tests/robotests/src/com/android/settings/location/LocationEnablerTest.java +++ b/tests/robotests/src/com/android/settings/location/LocationEnablerTest.java @@ -141,57 +141,6 @@ public class LocationEnablerTest { verify(mListener).onLocationModeChanged(anyInt(), anyBoolean()); } - @Test - public void setLocationMode_restricted_shouldSetCurrentMode() { - when(mUserManager.hasUserRestriction(anyString())).thenReturn(true); - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_BATTERY_SAVING); - - mEnabler.setLocationMode(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY); - - verify(mListener).onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, true); - } - - @Test - public void setLocationMode_notRestricted_shouldUpdateSecureSettings() { - when(mUserManager.hasUserRestriction(anyString())).thenReturn(false); - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_BATTERY_SAVING); - - mEnabler.setLocationMode(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY); - - assertThat(Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_BATTERY_SAVING)) - .isEqualTo(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY); - } - - @Test - public void setLocationMode_notRestricted_shouldRefreshLocation() { - when(mUserManager.hasUserRestriction(anyString())).thenReturn(false); - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_BATTERY_SAVING); - - mEnabler.setLocationMode(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY); - - verify(mEnabler).refreshLocationMode(); - } - - @Test - public void setLocationMode_notRestricted_shouldBroadcastUpdateAndSetChanger() { - when(mUserManager.hasUserRestriction(anyString())).thenReturn(false); - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_BATTERY_SAVING); - mEnabler.setLocationMode(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY); - - verify(mContext).sendBroadcastAsUser( - argThat(actionMatches(LocationManager.MODE_CHANGING_ACTION)), - eq(UserHandle.of(ActivityManager.getCurrentUser())), - eq(WRITE_SECURE_SETTINGS)); - assertThat(Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.LOCATION_CHANGER, Settings.Secure.LOCATION_CHANGER_UNKNOWN)) - .isEqualTo(Settings.Secure.LOCATION_CHANGER_SYSTEM_SETTINGS); - } - @Test public void setLocationEnabled_notRestricted_shouldRefreshLocation() { when(mUserManager.hasUserRestriction(anyString())).thenReturn(false); diff --git a/tests/uitests/src/com/android/settings/ui/LocationSettingsTests.java b/tests/uitests/src/com/android/settings/ui/LocationSettingsTests.java index b4a1baa8c23..8e391f31525 100644 --- a/tests/uitests/src/com/android/settings/ui/LocationSettingsTests.java +++ b/tests/uitests/src/com/android/settings/ui/LocationSettingsTests.java @@ -95,7 +95,7 @@ public class LocationSettingsTests extends InstrumentationTestCase { public void testLocationDeviceOnlyMode() throws Exception { // Changing the value from default before testing the toggle to Device only mode Settings.Secure.putInt(getInstrumentation().getContext().getContentResolver(), - Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_HIGH_ACCURACY); + Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_ON); dismissAlertDialogs(); Thread.sleep(TIMEOUT); verifyLocationSettingsMode(Settings.Secure.LOCATION_MODE_SENSORS_ONLY); @@ -114,7 +114,7 @@ public class LocationSettingsTests extends InstrumentationTestCase { Settings.Secure.putInt(getInstrumentation().getContext().getContentResolver(), Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_SENSORS_ONLY); Thread.sleep(TIMEOUT); - verifyLocationSettingsMode(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY); + verifyLocationSettingsMode(Settings.Secure.LOCATION_MODE_ON); } @MediumTest @@ -145,7 +145,7 @@ public class LocationSettingsTests extends InstrumentationTestCase { private void verifyLocationSettingsMode(int mode) throws Exception { int modeIntValue = 1; String textMode = "Device only"; - if (mode == Settings.Secure.LOCATION_MODE_HIGH_ACCURACY) { + if (mode == Settings.Secure.LOCATION_MODE_ON) { modeIntValue = 3; textMode = "High accuracy"; } @@ -169,7 +169,7 @@ public class LocationSettingsTests extends InstrumentationTestCase { dismissAlertDialogs(); mDevice.wait(Until.findObject(By.desc("Navigate up")), TIMEOUT).click(); Thread.sleep(TIMEOUT); - if (mode == Settings.Secure.LOCATION_MODE_HIGH_ACCURACY || + if (mode == Settings.Secure.LOCATION_MODE_ON || mode == Settings.Secure.LOCATION_MODE_BATTERY_SAVING) { dismissAlertDialogs(); } @@ -190,7 +190,7 @@ public class LocationSettingsTests extends InstrumentationTestCase { } else { Settings.Secure.putInt(getInstrumentation().getContext().getContentResolver(), - Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_HIGH_ACCURACY); + Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_ON); } dismissAlertDialogs(); // Load location settings From 6ecec01e7bace6c1dd8b375f259eb28c91093336 Mon Sep 17 00:00:00 2001 From: Joel Galenson Date: Thu, 31 Jan 2019 08:19:21 -0800 Subject: [PATCH 05/17] Update call to use new method name. Test: See correct shadow behavior when scrolling app info. Change-Id: Ib6452f5caa42600330b934c50c30a42f303710ae --- src/com/android/settings/widget/EntityHeaderController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/settings/widget/EntityHeaderController.java b/src/com/android/settings/widget/EntityHeaderController.java index 567217883a5..8e31290577e 100644 --- a/src/com/android/settings/widget/EntityHeaderController.java +++ b/src/com/android/settings/widget/EntityHeaderController.java @@ -322,7 +322,7 @@ public class EntityHeaderController { Utils.getColorAttrDefaultColor(activity, android.R.attr.colorPrimaryDark))); actionBar.setElevation(0); if (mRecyclerView != null && mLifecycle != null) { - ActionBarShadowController.attachToRecyclerView(mActivity, mLifecycle, mRecyclerView); + ActionBarShadowController.attachToView(mActivity, mLifecycle, mRecyclerView); } return this; From 962a7ec22da0e2a8ccf283471e4330f0c5a8103b Mon Sep 17 00:00:00 2001 From: Alex Salo Date: Wed, 30 Jan 2019 17:58:47 -0800 Subject: [PATCH 06/17] Remove unused dependency Test: not needed Bug: 111939367 Change-Id: Id6040240e6221fe6311b7985f3763c04989be7d2 --- .../settings/display/AdaptiveSleepPreferenceController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/com/android/settings/display/AdaptiveSleepPreferenceController.java b/src/com/android/settings/display/AdaptiveSleepPreferenceController.java index 97bdb9efe27..bd9d386327f 100644 --- a/src/com/android/settings/display/AdaptiveSleepPreferenceController.java +++ b/src/com/android/settings/display/AdaptiveSleepPreferenceController.java @@ -17,7 +17,6 @@ import static android.provider.Settings.System.ADAPTIVE_SLEEP; import android.content.Context; import android.provider.Settings; -import android.text.TextUtils; import com.android.settings.R; import com.android.settings.core.TogglePreferenceController; From 3e586a5cf26f2d5fc834eb34d0e7e2cc27b6e499 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Mon, 28 Jan 2019 13:37:31 -0800 Subject: [PATCH 07/17] Add current user handle to tile intent in account detail page. - the account detail settings page is launched with the correct user handle when there is work profile to indicate which profile the account belongs to. When we process the dynamic tile, for the page, we should add this info to the tile intent, so that it can be launched with the correct profile. - when we launch the tile intent, check whether there's user handle specified. If so, launch the intent directly without prompting for profile selection. Change-Id: I91f8c666a826909006b1f53907b3441825322c10 Fixes: 119657694 Test: make RunSettingsRoboTests --- .../AccountDetailDashboardFragment.java | 15 +++++-- .../DashboardFeatureProviderImpl.java | 12 +++++- .../AccountDetailDashboardFragmentTest.java | 16 +++++++ .../DashboardFeatureProviderImplTest.java | 43 +++++++++++++++++++ 4 files changed, 81 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/accounts/AccountDetailDashboardFragment.java b/src/com/android/settings/accounts/AccountDetailDashboardFragment.java index 4b612384250..ad6ecaff6c0 100644 --- a/src/com/android/settings/accounts/AccountDetailDashboardFragment.java +++ b/src/com/android/settings/accounts/AccountDetailDashboardFragment.java @@ -15,11 +15,14 @@ */ package com.android.settings.accounts; +import static android.content.Intent.EXTRA_USER; + import android.accounts.Account; import android.accounts.AccountManager; import android.app.Activity; import android.app.settings.SettingsEnums; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; @@ -56,6 +59,8 @@ public class AccountDetailDashboardFragment extends DashboardFragment { String mAccountType; private AccountSyncPreferenceController mAccountSynController; private RemoveAccountPreferenceController mRemoveAccountController; + @VisibleForTesting + UserHandle mUserHandle; @Override public void onCreate(Bundle icicle) { @@ -63,7 +68,7 @@ public class AccountDetailDashboardFragment extends DashboardFragment { getPreferenceManager().setPreferenceComparisonCallback(null); Bundle args = getArguments(); final Activity activity = getActivity(); - UserHandle userHandle = Utils.getSecureTargetUser(activity.getActivityToken(), + mUserHandle = Utils.getSecureTargetUser(activity.getActivityToken(), (UserManager) getSystemService(Context.USER_SERVICE), args, activity.getIntent().getExtras()); if (args != null) { @@ -77,8 +82,8 @@ public class AccountDetailDashboardFragment extends DashboardFragment { mAccountType = args.getString(KEY_ACCOUNT_TYPE); } } - mAccountSynController.init(mAccount, userHandle); - mRemoveAccountController.init(mAccount, userHandle); + mAccountSynController.init(mAccount, mUserHandle); + mRemoveAccountController.init(mAccount, mUserHandle); } @Override @@ -154,7 +159,9 @@ public class AccountDetailDashboardFragment extends DashboardFragment { } final boolean display = mAccountType.equals(metadata.getString(METADATA_IA_ACCOUNT)); if (display) { - tile.getIntent().putExtra(EXTRA_ACCOUNT_NAME, mAccount.name); + final Intent intent = tile.getIntent(); + intent.putExtra(EXTRA_ACCOUNT_NAME, mAccount.name); + intent.putExtra(EXTRA_USER, mUserHandle); } return display; } diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index f79cf5bdc48..69e86cdd0e3 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -16,6 +16,8 @@ package com.android.settings.dashboard; +import static android.content.Intent.EXTRA_USER; + import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON_URI; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY_URI; @@ -29,6 +31,7 @@ import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.os.Bundle; +import android.os.UserHandle; import android.provider.Settings; import android.text.TextUtils; import android.util.ArrayMap; @@ -239,7 +242,14 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { mMetricsFeatureProvider.logDashboardStartIntent(mContext, intent, sourceMetricCategory); activity.startActivityForResultAsUser(intent, 0, tile.userHandle.get(0)); } else { - ProfileSelectDialog.show(activity.getSupportFragmentManager(), tile); + final UserHandle userHandle = intent.getParcelableExtra(EXTRA_USER); + if (userHandle != null && tile.userHandle.contains(userHandle)) { + mMetricsFeatureProvider.logDashboardStartIntent( + mContext, intent, sourceMetricCategory); + activity.startActivityForResultAsUser(intent, 0, userHandle); + } else { + ProfileSelectDialog.show(activity.getSupportFragmentManager(), tile); + } } } diff --git a/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java index 0be51c31d29..dffa96861c2 100644 --- a/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java @@ -15,6 +15,8 @@ */ package com.android.settings.accounts; +import static android.content.Intent.EXTRA_USER; + import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE; @@ -160,6 +162,20 @@ public class AccountDetailDashboardFragmentTest { assertThat(intent.getStringExtra("extra.accountName")).isEqualTo("name1@abc.com"); } + @Test + public void displayTile_shouldAddUserHandleToTileIntent() { + mFragment.mUserHandle = new UserHandle(1); + + final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_ACCOUNT_DETAIL); + mActivityInfo.metaData.putString(METADATA_CATEGORY, CategoryKey.CATEGORY_ACCOUNT); + mActivityInfo.metaData.putString(METADATA_ACCOUNT_TYPE, "com.abc"); + + mFragment.displayTile(tile); + + final UserHandle userHandle = tile.getIntent().getParcelableExtra(EXTRA_USER); + assertThat(userHandle.getIdentifier()).isEqualTo(1); + } + @Test public void onResume_accountMissing_shouldFinish() { ShadowUserManager userManager = diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java index 2aa6ae22ff8..1c51b81a5e9 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java @@ -16,6 +16,8 @@ package com.android.settings.dashboard; +import static android.content.Intent.EXTRA_USER; + import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_ORDER; import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_PROFILE; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT; @@ -67,6 +69,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; @@ -412,4 +415,44 @@ public class DashboardFeatureProviderImplTest { .startActivityForResult(any(Intent.class), eq(0)); verify(mActivity, never()).getSupportFragmentManager(); } + + @Test + public void openTileIntent_profileSelectionDialog_validUserHandleShouldNotShow() { + final int userId = 10; + ShadowUserManager.getShadow().addUser(userId, "Someone", 0); + + final UserHandle userHandle = new UserHandle(userId); + final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE); + tile.getIntent().putExtra(EXTRA_USER, userHandle); + final ArrayList handles = new ArrayList<>(); + handles.add(new UserHandle(0)); + handles.add(userHandle); + tile.userHandle = handles; + + mImpl.openTileIntent(mActivity, tile); + + final ArgumentCaptor argument = ArgumentCaptor.forClass(UserHandle.class); + verify(mActivity) + .startActivityForResultAsUser(any(Intent.class), anyInt(), argument.capture()); + assertThat(argument.getValue().getIdentifier()).isEqualTo(userId); + verify(mActivity, never()).getSupportFragmentManager(); + } + + @Test + public void openTileIntent_profileSelectionDialog_invalidUserHandleShouldShow() { + ShadowUserManager.getShadow().addUser(10, "Someone", 0); + + final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE); + tile.getIntent().putExtra(EXTRA_USER, new UserHandle(30)); + final ArrayList handles = new ArrayList<>(); + handles.add(new UserHandle(0)); + handles.add(new UserHandle(10)); + tile.userHandle = handles; + + mImpl.openTileIntent(mActivity, tile); + + verify(mActivity, never()) + .startActivityForResultAsUser(any(Intent.class), anyInt(), any(UserHandle.class)); + verify(mActivity).getSupportFragmentManager(); + } } From 7d93d8bcdc142cee6605fffca6760cbf346118f9 Mon Sep 17 00:00:00 2001 From: Vishwath Mohan Date: Tue, 29 Jan 2019 08:26:40 -0800 Subject: [PATCH 08/17] Allow multiple trust agents This CL is essentially a one-line change that sets the ONLY_ONE_TRUST_AGENT boolean to false. Bug: 111431046 Test: Tested manually that this works correctly Change-Id: Ia8f06235467e3223ef1e441a62d941a64a2d7c93 --- .../android/settings/security/trustagent/TrustAgentManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/settings/security/trustagent/TrustAgentManager.java b/src/com/android/settings/security/trustagent/TrustAgentManager.java index e039db8d8a5..f5c693aba23 100644 --- a/src/com/android/settings/security/trustagent/TrustAgentManager.java +++ b/src/com/android/settings/security/trustagent/TrustAgentManager.java @@ -53,7 +53,7 @@ import java.util.List; public class TrustAgentManager { // Only allow one trust agent on the platform. - private static final boolean ONLY_ONE_TRUST_AGENT = true; + private static final boolean ONLY_ONE_TRUST_AGENT = false; public static class TrustAgentComponentInfo { public ComponentName componentName; From e13d04c762eaa16b6d56adebd6270983f3614fa5 Mon Sep 17 00:00:00 2001 From: Antony Sargent Date: Tue, 29 Jan 2019 16:54:03 -0800 Subject: [PATCH 09/17] Add dialog for changing display name for mobile network This CL adds a pencil/edit icon at the top of the mobile network details page. When clicked, it brings up a dialog that allows the user to set the display name used for that mobile network - this is most useful in multi-SIM situations. This dialog also displays the mobile network operator name and phone number which can help the user keep straight which one they are renaming. Bug: 122670283 Test: make RunSettingsRoboTests Change-Id: Ifd63cfb66ce743bd5ba8a06b52229f06ed56b7bd --- res/layout/dialog_mobile_network_rename.xml | 64 ++++++++ res/values/ids.xml | 3 + res/values/strings.xml | 8 + .../telephony/MobileNetworkActivity.java | 15 +- .../telephony/MobileNetworkSettings.java | 34 ++++- .../RenameMobileNetworkDialogFragment.java | 137 ++++++++++++++++++ ...RenameMobileNetworkDialogFragmentTest.java | 130 +++++++++++++++++ 7 files changed, 381 insertions(+), 10 deletions(-) create mode 100644 res/layout/dialog_mobile_network_rename.xml create mode 100644 src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragment.java create mode 100644 tests/robotests/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragmentTest.java diff --git a/res/layout/dialog_mobile_network_rename.xml b/res/layout/dialog_mobile_network_rename.xml new file mode 100644 index 00000000000..d67f0dc6824 --- /dev/null +++ b/res/layout/dialog_mobile_network_rename.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + diff --git a/res/values/ids.xml b/res/values/ids.xml index 66af163e2b8..ba14e855286 100644 --- a/res/values/ids.xml +++ b/res/values/ids.xml @@ -31,4 +31,7 @@ + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 19f6d9e8477..7877f30231f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10446,6 +10446,14 @@ Inactive eSIM + + SIM name + + Rename Preferred network type diff --git a/src/com/android/settings/network/telephony/MobileNetworkActivity.java b/src/com/android/settings/network/telephony/MobileNetworkActivity.java index a5f011c8120..821b1e1e8d8 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkActivity.java +++ b/src/com/android/settings/network/telephony/MobileNetworkActivity.java @@ -97,13 +97,6 @@ public class MobileNetworkActivity extends SettingsBaseActivity { actionBar.setDisplayHomeAsUpEnabled(true); } - // Set the title to the name of the subscription. If we don't have subscription info, the - // title will just default to the label for this activity that's already specified in - // AndroidManifest.xml. - final SubscriptionInfo subscription = getSubscription(); - if (subscription != null) { - setTitle(subscription.getDisplayName()); - } updateSubscriptions(savedInstanceState); } @@ -136,6 +129,14 @@ public class MobileNetworkActivity extends SettingsBaseActivity { @VisibleForTesting void updateSubscriptions(Bundle savedInstanceState) { + // Set the title to the name of the subscription. If we don't have subscription info, the + // title will just default to the label for this activity that's already specified in + // AndroidManifest.xml. + final SubscriptionInfo subscription = getSubscription(); + if (subscription != null) { + setTitle(subscription.getDisplayName()); + } + mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList(true); if (!FeatureFlagPersistent.isEnabled(this, FeatureFlags.NETWORK_INTERNET_V2)) { diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java index 52015868cf8..a4156f565dd 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java +++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java @@ -28,9 +28,9 @@ import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; - -import androidx.annotation.VisibleForTesting; -import androidx.preference.Preference; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import com.android.internal.telephony.TelephonyIntents; import com.android.settings.R; @@ -52,6 +52,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import androidx.annotation.VisibleForTesting; +import androidx.preference.Preference; + @SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class MobileNetworkSettings extends RestrictedDashboardFragment { @@ -219,6 +222,31 @@ public class MobileNetworkSettings extends RestrictedDashboardFragment { } } + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + if (FeatureFlagPersistent.isEnabled(getContext(), FeatureFlags.NETWORK_INTERNET_V2) && + mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + final MenuItem item = menu.add(Menu.NONE, R.id.edit_sim_name, Menu.NONE, + R.string.mobile_network_sim_name); + item.setIcon(com.android.internal.R.drawable.ic_mode_edit); + item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); + } + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(MenuItem menuItem) { + if (FeatureFlagPersistent.isEnabled(getContext(), FeatureFlags.NETWORK_INTERNET_V2) && + mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + if (menuItem.getItemId() == R.id.edit_sim_name) { + RenameMobileNetworkDialogFragment.newInstance(mSubId).show( + getFragmentManager(), RenameMobileNetworkDialogFragment.TAG); + return true; + } + } + return super.onOptionsItemSelected(menuItem); + } + public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { @Override diff --git a/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragment.java b/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragment.java new file mode 100644 index 00000000000..488f9300e2e --- /dev/null +++ b/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragment.java @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2019 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.network.telephony; + +import android.app.Dialog; +import android.app.settings.SettingsEnums; +import android.content.Context; +import android.os.Bundle; +import android.telephony.ServiceState; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.text.BidiFormatter; +import android.text.TextDirectionHeuristics; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.android.settings.R; +import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import com.android.settingslib.DeviceInfoUtils; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; + +/** A dialog allowing the display name of a mobile network subscription to be changed */ +public class RenameMobileNetworkDialogFragment extends InstrumentedDialogFragment { + public static final String TAG ="RenameMobileNetwork"; + + private static final String KEY_SUBSCRIPTION_ID = "subscription_id"; + + private TelephonyManager mTelephonyManager; + private SubscriptionManager mSubscriptionManager; + private int mSubId; + private EditText mNameView; + + public static RenameMobileNetworkDialogFragment newInstance(int subscriptionId) { + final Bundle args = new Bundle(1); + args.putInt(KEY_SUBSCRIPTION_ID, subscriptionId); + final RenameMobileNetworkDialogFragment fragment = new RenameMobileNetworkDialogFragment(); + fragment.setArguments(args); + return fragment; + } + + @VisibleForTesting + protected TelephonyManager getTelephonyManager(Context context) { + return context.getSystemService(TelephonyManager.class); + } + + @VisibleForTesting + protected SubscriptionManager getSubscriptionManager(Context context) { + return context.getSystemService(SubscriptionManager.class); + } + + @VisibleForTesting + protected EditText getNameView() { + return mNameView; + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + mTelephonyManager = getTelephonyManager(context); + mSubscriptionManager = getSubscriptionManager(context); + mSubId = getArguments().getInt(KEY_SUBSCRIPTION_ID); + } + + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + final LayoutInflater layoutInflater = builder.getContext().getSystemService( + LayoutInflater.class); + final View view = layoutInflater.inflate(R.layout.dialog_mobile_network_rename, null); + populateView(view); + builder.setTitle(R.string.mobile_network_sim_name) + .setView(view) + .setPositiveButton(R.string.mobile_network_sim_name_rename, (dialog, which) -> { + SubscriptionInfo currentInfo = mSubscriptionManager.getActiveSubscriptionInfo( + mSubId); + String newName = mNameView.getText().toString(); + if (currentInfo != null && !currentInfo.getDisplayName().equals(newName)) { + mSubscriptionManager.setDisplayName(newName, mSubId); + } + }) + .setNegativeButton(android.R.string.cancel, null); + return builder.create(); + } + + @VisibleForTesting + protected void populateView(View view) { + mNameView = (EditText) view.findViewById(R.id.edittext); + final SubscriptionInfo info = mSubscriptionManager.getActiveSubscriptionInfo(mSubId); + if (info == null) { + Log.w(TAG, "got null SubscriptionInfo for mSubId:" + mSubId); + return; + } + final CharSequence displayName = info.getDisplayName(); + mNameView.setText(displayName); + if (!TextUtils.isEmpty(displayName)) { + mNameView.setSelection(displayName.length()); + } + + final TextView operatorName = view.findViewById(R.id.operator_name_value); + final ServiceState serviceState = mTelephonyManager.getServiceStateForSubscriber(mSubId); + operatorName.setText(serviceState.getOperatorAlphaLong()); + + final TextView phoneNumber = view.findViewById(R.id.number_value); + final String formattedNumber = DeviceInfoUtils.getFormattedPhoneNumber(getContext(), info); + phoneNumber.setText(BidiFormatter.getInstance().unicodeWrap(formattedNumber, + TextDirectionHeuristics.LTR)); + } + + @Override + public int getMetricsCategory() { + return SettingsEnums.MOBILE_NETWORK_RENAME_DIALOG; + } +} diff --git a/tests/robotests/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragmentTest.java b/tests/robotests/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragmentTest.java new file mode 100644 index 00000000000..df523029414 --- /dev/null +++ b/tests/robotests/src/com/android/settings/network/telephony/RenameMobileNetworkDialogFragmentTest.java @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2019 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.network.telephony; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +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 android.content.DialogInterface; +import android.telephony.ServiceState; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.widget.Button; +import android.widget.EditText; + +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.FragmentActivity; + +@RunWith(RobolectricTestRunner.class) +@Config(shadows = ShadowAlertDialogCompat.class) +public class RenameMobileNetworkDialogFragmentTest { + @Mock + private TelephonyManager mTelephonyMgr; + @Mock + private SubscriptionManager mSubscriptionMgr; + @Mock + private SubscriptionInfo mSubscriptionInfo; + + private FragmentActivity mActivity; + private RenameMobileNetworkDialogFragment mFragment; + private int mSubscriptionId = 1234; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mActivity = spy(Robolectric.buildActivity(FragmentActivity.class).setup().get()); + + when(mSubscriptionInfo.getSubscriptionId()).thenReturn(mSubscriptionId); + when(mSubscriptionInfo.getDisplayName()).thenReturn("test"); + + mFragment = spy(RenameMobileNetworkDialogFragment.newInstance(mSubscriptionId)); + doReturn(mTelephonyMgr).when(mFragment).getTelephonyManager(any()); + doReturn(mSubscriptionMgr).when(mFragment).getSubscriptionManager(any()); + + final ServiceState serviceState = mock(ServiceState.class); + when(serviceState.getOperatorAlphaLong()).thenReturn("fake carrier name"); + when(mTelephonyMgr.getServiceStateForSubscriber(mSubscriptionId)).thenReturn(serviceState); + } + + @Test + public void dialog_subscriptionMissing_noCrash() { + final AlertDialog dialog = startDialog(); + final Button negativeButton = dialog.getButton(DialogInterface.BUTTON_NEGATIVE); + assertThat(negativeButton).isNotNull(); + negativeButton.performClick(); + } + + @Test + public void dialog_cancelButtonClicked_setDisplayNameNotCalled() { + when(mSubscriptionMgr.getActiveSubscriptionInfo(mSubscriptionId)).thenReturn( + mSubscriptionInfo); + final AlertDialog dialog = startDialog(); + final EditText nameView = mFragment.getNameView(); + nameView.setText("test2"); + + final Button negativeButton = dialog.getButton(DialogInterface.BUTTON_NEGATIVE); + negativeButton.performClick(); + + verify(mSubscriptionMgr, never()).setDisplayName(anyString(), anyInt()); + } + + @Test + public void dialog_renameButtonClicked_setDisplayNameCalled() { + when(mSubscriptionMgr.getActiveSubscriptionInfo(mSubscriptionId)).thenReturn( + mSubscriptionInfo); + + final AlertDialog dialog = startDialog(); + final EditText nameView = mFragment.getNameView(); + nameView.setText("test2"); + + final Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE); + positiveButton.performClick(); + + final ArgumentCaptor captor = ArgumentCaptor.forClass(String.class); + verify(mSubscriptionMgr).setDisplayName(captor.capture(), eq(mSubscriptionId)); + assertThat(captor.getValue()).isEqualTo("test2"); + } + + /** Helper method to start the dialog */ + private AlertDialog startDialog() { + mFragment.show(mActivity.getSupportFragmentManager(), null); + return ShadowAlertDialogCompat.getLatestAlertDialog(); + } +} From cb0b08aac2a9bc9c83f5174d3eb3c66c2e997134 Mon Sep 17 00:00:00 2001 From: Quang Luong Date: Wed, 30 Jan 2019 14:04:47 -0800 Subject: [PATCH 10/17] Updated arguments for AccessPoint.getSummary calls Changed the arguments for getSummary to reflect the changes in settingslib Bug: 118705403 Test: none Change-Id: I2bd02e608a900865ff90dd78463a164fca39c905 --- src/com/android/settings/wifi/WifiConfigController.java | 5 ++--- src/com/android/settings/wifi/WifiStatusTest.java | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java index 739ddd70200..1d78485a94b 100644 --- a/src/com/android/settings/wifi/WifiConfigController.java +++ b/src/com/android/settings/wifi/WifiConfigController.java @@ -366,9 +366,8 @@ public class WifiConfigController implements TextWatcher, suggestionOrSpecifierPackageName = config.creatorName; } String summary = AccessPoint.getSummary( - mConfigUi.getContext(), state, isEphemeral, - suggestionOrSpecifierPackageName, - providerFriendlyName); + mConfigUi.getContext(), /* ssid */ null, state, isEphemeral, + suggestionOrSpecifierPackageName); addRow(group, R.string.wifi_status, summary); } diff --git a/src/com/android/settings/wifi/WifiStatusTest.java b/src/com/android/settings/wifi/WifiStatusTest.java index b06343331f3..ca7f5f7fecd 100644 --- a/src/com/android/settings/wifi/WifiStatusTest.java +++ b/src/com/android/settings/wifi/WifiStatusTest.java @@ -299,7 +299,8 @@ public class WifiStatusTest extends Activity { WifiInfo info = mWifiManager.getConnectionInfo(); String summary = AccessPoint.getSummary(this, info.getSSID(), networkInfo.getDetailedState(), - info.getNetworkId() == WifiConfiguration.INVALID_NETWORK_ID, null, null); + info.getNetworkId() == WifiConfiguration.INVALID_NETWORK_ID, + /* suggestionOrSpecifierPackageName */ null); mNetworkState.setText(summary); } } From f508a57ab5d96f43a3a4f3a0b78c4f875e28d773 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Thu, 31 Jan 2019 13:12:56 -0800 Subject: [PATCH 11/17] Ignore failing tests Bug: 123707483 Test: robotest Change-Id: Ie18ec3b25b905566e8a8afe90f3a7688cf1141f6 --- ...GameDriverEnableForAllAppsPreferenceControllerTest.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceControllerTest.java index 094cd21b3e5..5371cc9b910 100644 --- a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceControllerTest.java @@ -21,6 +21,7 @@ import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_U import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_ALL_APPS; import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_DEFAULT; import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_OFF; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.atLeastOnce; @@ -35,6 +36,7 @@ import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreference; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -136,6 +138,7 @@ public class GameDriverEnableForAllAppsPreferenceControllerTest { } @Test + @Ignore("b/123707483") public void updateState_gameDriverOff_notVisibleAndUncheck() { Settings.Global.putInt(mResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_OFF); mController.updateState(mPreference); @@ -151,7 +154,7 @@ public class GameDriverEnableForAllAppsPreferenceControllerTest { mController.onPreferenceChange(mPreference, true); assertThat(Settings.Global.getInt( - mResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT)) + mResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT)) .isEqualTo(GAME_DRIVER_ALL_APPS); } @@ -162,7 +165,7 @@ public class GameDriverEnableForAllAppsPreferenceControllerTest { mController.onPreferenceChange(mPreference, false); assertThat(Settings.Global.getInt( - mResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT)) + mResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT)) .isEqualTo(GAME_DRIVER_DEFAULT); } } From b617f84b326be92f85232b7ef00fa01de6ba38b0 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Thu, 31 Jan 2019 13:48:40 -0800 Subject: [PATCH 12/17] Fix a NPE from incorrect assumption of operation pecedence. Change-Id: I13d01c39bd3afcfbc7b680b96e0c7eb341fbc584 Fixes: 123709444 Test: robotest --- .../LegacySuggestionContextualCardController.java | 6 ++++-- .../LegacySuggestionContextualCardControllerTest.java | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardController.java b/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardController.java index bbcebbe6a2e..3b0b46d2f2b 100644 --- a/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardController.java +++ b/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardController.java @@ -128,8 +128,10 @@ public class LegacySuggestionContextualCardController implements ContextualCardC return; } final List suggestions = mSuggestionController.getSuggestions(); - Log.d(TAG, "Loaded suggests: " - + suggestions == null ? "null" : String.valueOf(suggestions.size())); + final String suggestionCount = suggestions == null + ? "null" + : String.valueOf(suggestions.size()); + Log.d(TAG, "Loaded suggests: " + suggestionCount); final List cards = new ArrayList<>(); if (suggestions != null) { diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardControllerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardControllerTest.java index ebc2154a009..a2d4d093c42 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardControllerTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardControllerTest.java @@ -19,6 +19,7 @@ package com.android.settings.homepage.contextualcards.legacysuggestion; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.content.Context; @@ -84,8 +85,10 @@ public class LegacySuggestionContextualCardControllerTest { @Test public void onServiceConnected_shouldLoadSuggestion() { + when(mSuggestionController.getSuggestions()).thenReturn(null); mController.mSuggestionController = mSuggestionController; mController.setCardUpdateListener(mCardUpdateListener); + mController.onServiceConnected(); verify(mSuggestionController).getSuggestions(); From a9fb15230934b8a12e6ca8d14907a4813d8cff3c Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Thu, 31 Jan 2019 14:22:24 -0800 Subject: [PATCH 13/17] Flags instead of booleans for countPermissionApps Test: Checked that the api retunred the results Bug: 123697839 Change-Id: Iadb1c4307933635e6114d3d32a2a2b1ed87949f4 --- .../location/AppLocationPermissionPreferenceController.java | 5 +++-- .../location/TopLevelLocationPreferenceController.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/location/AppLocationPermissionPreferenceController.java b/src/com/android/settings/location/AppLocationPermissionPreferenceController.java index 1fd19860659..43a6a9b26de 100644 --- a/src/com/android/settings/location/AppLocationPermissionPreferenceController.java +++ b/src/com/android/settings/location/AppLocationPermissionPreferenceController.java @@ -76,7 +76,7 @@ public class AppLocationPermissionPreferenceController extends PermissionControllerManager permController = mContext.getSystemService(PermissionControllerManager.class); permController.countPermissionApps( - Arrays.asList(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION), false, false, + Arrays.asList(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION), 0, (numApps) -> { mNumTotal = numApps; if (loadingInProgress.decrementAndGet() == 0) { @@ -85,7 +85,8 @@ public class AppLocationPermissionPreferenceController extends }, null); permController.countPermissionApps( - Collections.singletonList(ACCESS_BACKGROUND_LOCATION), true, false, + Collections.singletonList(ACCESS_BACKGROUND_LOCATION), + PermissionControllerManager.COUNT_ONLY_WHEN_GRANTED, (numApps) -> { mNumBackground = numApps; if (loadingInProgress.decrementAndGet() == 0) { diff --git a/src/com/android/settings/location/TopLevelLocationPreferenceController.java b/src/com/android/settings/location/TopLevelLocationPreferenceController.java index 6d7789fe4fe..2a7a3d7de2d 100644 --- a/src/com/android/settings/location/TopLevelLocationPreferenceController.java +++ b/src/com/android/settings/location/TopLevelLocationPreferenceController.java @@ -71,7 +71,7 @@ public class TopLevelLocationPreferenceController extends BasePreferenceControll return; } mContext.getSystemService(PermissionControllerManager.class).countPermissionApps( - Arrays.asList(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION), false, false, + Arrays.asList(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION), 0, (numApps) -> { setLocationAppCount(numApps); }, null); From 862b8cb101097729326a7cca05c3655b3b68f64a Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Tue, 29 Jan 2019 22:08:25 -0800 Subject: [PATCH 14/17] Add dark theme keywords Test: make Change-Id: I0a5bb5e42f419dd6baa80ae06822fb64f6a29cb0 Fixes: 123599254 --- res/values/strings.xml | 4 +++- res/xml/display_settings.xml | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index ab52c5cfb19..8c562f848e3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7056,7 +7056,9 @@ network, mobile network state, service state, signal strength, mobile network type, roaming, iccid serial number, hardware version android security patch level, baseband version, kernel version - + + theme, light, dark, mode + financial app, sms, permission diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml index b110b46ce26..0f4c1d349f0 100644 --- a/res/xml/display_settings.xml +++ b/res/xml/display_settings.xml @@ -141,6 +141,7 @@ android:dialogTitle="@string/dark_ui_mode_title" android:entries="@array/dark_ui_mode_entries" android:entryValues="@array/dark_ui_mode_values" + settings:keywords="@string/keywords_dark_ui_mode" settings:controller="com.android.settings.display.DarkUIPreferenceController" /> Date: Wed, 30 Jan 2019 16:06:41 +0800 Subject: [PATCH 15/17] Add a metrics for avatar Add a metrics log when user click search bar avatar Change-Id: I389d469cc3fe335ee934d72d642251a6f4fd038b Fixes: 123560980 Test: compilation --- src/com/android/settings/accounts/AvatarViewMixin.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/com/android/settings/accounts/AvatarViewMixin.java b/src/com/android/settings/accounts/AvatarViewMixin.java index 43531b3de39..3ce8c0a146c 100644 --- a/src/com/android/settings/accounts/AvatarViewMixin.java +++ b/src/com/android/settings/accounts/AvatarViewMixin.java @@ -17,6 +17,7 @@ package com.android.settings.accounts; import android.accounts.Account; +import android.app.settings.SettingsEnums; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; @@ -38,6 +39,7 @@ import androidx.lifecycle.OnLifecycleEvent; import com.android.settings.R; import com.android.settings.homepage.SettingsHomepageActivity; import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.utils.ThreadUtils; import java.net.URISyntaxException; @@ -91,6 +93,12 @@ public class AvatarViewMixin implements LifecycleObserver { return; } + final MetricsFeatureProvider metricsFeatureProvider = FeatureFactory.getFactory( + mContext).getMetricsFeatureProvider(); + metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, + SettingsEnums.CLICK_ACCOUNT_AVATAR, SettingsEnums.SETTINGS_HOMEPAGE, + null /* key */, Integer.MIN_VALUE /* value */); + // Here may have two different UI while start the activity. // It will display adding account UI when device has no any account. // It will display account information page when intent added the specified account. From ccc81a83cc85aae6a4d4fc64185e1ac51ff3e5f1 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Thu, 31 Jan 2019 18:25:00 -0800 Subject: [PATCH 16/17] Game Driver: Fix EnableForAllApps switch and test Bug: 123707483 Bug: 119221883 Test: Build, flash, boot and make RunSettingsRoboTests Change-Id: Iffbe3355b37763d4fa71b96271c1ba448fb6cdc5 --- ...erEnableForAllAppsPreferenceController.java | 15 ++++++++++++++- .../GameDriverGlobalSwitchBarController.java | 18 ++++++++++-------- ...ableForAllAppsPreferenceControllerTest.java | 9 +++++---- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceController.java b/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceController.java index 68be52641fd..dd48f6946f3 100644 --- a/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceController.java +++ b/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceController.java @@ -74,6 +74,7 @@ public class GameDriverEnableForAllAppsPreferenceController extends BasePreferen public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mPreference = screen.findPreference(getPreferenceKey()); + mPreference.setOnPreferenceChangeListener(this); } @Override @@ -98,8 +99,20 @@ public class GameDriverEnableForAllAppsPreferenceController extends BasePreferen @Override public boolean onPreferenceChange(Preference preference, Object newValue) { + final boolean isChecked = (boolean) newValue; + final int gameDriver = Settings.Global.getInt( + mContentResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT); + + if (isChecked && gameDriver == GAME_DRIVER_ALL_APPS) { + return true; + } + + if (!isChecked && (gameDriver == GAME_DRIVER_DEFAULT || gameDriver == GAME_DRIVER_OFF)) { + return true; + } + Settings.Global.putInt(mContentResolver, Settings.Global.GAME_DRIVER_ALL_APPS, - (boolean) newValue ? GAME_DRIVER_ALL_APPS : GAME_DRIVER_DEFAULT); + isChecked ? GAME_DRIVER_ALL_APPS : GAME_DRIVER_DEFAULT); return true; } diff --git a/src/com/android/settings/development/gamedriver/GameDriverGlobalSwitchBarController.java b/src/com/android/settings/development/gamedriver/GameDriverGlobalSwitchBarController.java index 125d95b4cf6..d84c28f3f5b 100644 --- a/src/com/android/settings/development/gamedriver/GameDriverGlobalSwitchBarController.java +++ b/src/com/android/settings/development/gamedriver/GameDriverGlobalSwitchBarController.java @@ -79,19 +79,21 @@ public class GameDriverGlobalSwitchBarController @Override public boolean onSwitchToggled(boolean isChecked) { - if (!isChecked) { - Settings.Global.putInt( - mContentResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_OFF); + final int gameDriver = Settings.Global.getInt( + mContentResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT); + + if (isChecked + && (gameDriver == GAME_DRIVER_DEFAULT || gameDriver == GAME_DRIVER_ALL_APPS)) { return true; } - if (Settings.Global.getInt( - mContentResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT) - != GAME_DRIVER_ALL_APPS) { - Settings.Global.putInt( - mContentResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT); + if (!isChecked && gameDriver == GAME_DRIVER_OFF) { + return true; } + Settings.Global.putInt(mContentResolver, Settings.Global.GAME_DRIVER_ALL_APPS, + isChecked ? GAME_DRIVER_DEFAULT : GAME_DRIVER_OFF); + return true; } diff --git a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceControllerTest.java index 5371cc9b910..3d418d9da92 100644 --- a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceControllerTest.java @@ -36,7 +36,6 @@ import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreference; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -63,11 +62,14 @@ public class GameDriverEnableForAllAppsPreferenceControllerTest { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; mResolver = mContext.getContentResolver(); + + Settings.Global.putInt(mResolver, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1); + Settings.Global.putInt( + mResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT); + mController = new GameDriverEnableForAllAppsPreferenceController(mContext, "testKey"); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); mController.displayPreference(mScreen); - - Settings.Global.putInt(mResolver, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1); } @Test @@ -138,7 +140,6 @@ public class GameDriverEnableForAllAppsPreferenceControllerTest { } @Test - @Ignore("b/123707483") public void updateState_gameDriverOff_notVisibleAndUncheck() { Settings.Global.putInt(mResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_OFF); mController.updateState(mPreference); From 015b8d5cfb4352e7fae4151e75bb3246d728ddd5 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Fri, 1 Feb 2019 11:41:53 -0800 Subject: [PATCH 17/17] Make a passthrough drawable for ic_settings_print. Bug: 123711718 Test: visual Change-Id: I6be16f501522167ea0af58c9eed1c491c3c4525d --- AndroidManifest.xml | 2 +- res/drawable/ic_settings_print.xml | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 res/drawable/ic_settings_print.xml diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 285fc56f057..b4579771762 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1825,7 +1825,7 @@ diff --git a/res/drawable/ic_settings_print.xml b/res/drawable/ic_settings_print.xml new file mode 100644 index 00000000000..dc92de06c6c --- /dev/null +++ b/res/drawable/ic_settings_print.xml @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file