From 649bed1524bcabe8ec10dbfa6ef900437c2eab78 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Thu, 29 Apr 2021 18:08:56 +0800 Subject: [PATCH 01/19] [DO NOT MERGE] Modify Wi-Fi details settings to restricted style - Show restricted text in guest mode - Screenshot: https://screenshot.googleplex.com/6nYcmazMM46TxaB Bug: 177573895 Test: manual test make RunSettingsRoboTests \ ROBOTEST_FILTER=WifiNetworkDetailsFragmentTest Change-Id: I5f857b2079e0f550e4be601d27dd54dac56b2f57 Merged-In: I5f857b2079e0f550e4be601d27dd54dac56b2f57 --- .../details/WifiNetworkDetailsFragment.java | 45 ++++++++- .../WifiNetworkDetailsFragmentTest.java | 99 +++++++++++++++++++ 2 files changed, 139 insertions(+), 5 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/wifi/details/WifiNetworkDetailsFragmentTest.java diff --git a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java index 8af9a7f1905..9aefa7d4a34 100644 --- a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java +++ b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java @@ -25,12 +25,15 @@ import android.net.wifi.WifiManager; import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import android.os.UserManager; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import androidx.annotation.VisibleForTesting; + import com.android.settings.R; -import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.dashboard.RestrictedDashboardFragment; import com.android.settings.wifi.WifiConfigUiBase; import com.android.settings.wifi.WifiDialog; import com.android.settingslib.RestrictedLockUtils; @@ -51,15 +54,45 @@ import java.util.List; * future, please develop in * {@link com.android.settings.wifi.details2.WifiNetworkDetailsFragment2}. */ -public class WifiNetworkDetailsFragment extends DashboardFragment implements +public class WifiNetworkDetailsFragment extends RestrictedDashboardFragment implements WifiDialog.WifiDialogListener { private static final String TAG = "WifiNetworkDetailsFrg"; + @VisibleForTesting + boolean mIsUiRestricted; + private AccessPoint mAccessPoint; private WifiDetailPreferenceController mWifiDetailPreferenceController; private List mWifiDialogListeners = new ArrayList<>(); + public WifiNetworkDetailsFragment() { + super(UserManager.DISALLOW_CONFIG_WIFI); + } + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + setIfOnlyAvailableForAdmins(true); + mIsUiRestricted = isUiRestricted(); + } + + @Override + public void onStart() { + super.onStart(); + if (mIsUiRestricted) { + restrictUi(); + } + } + + @VisibleForTesting + void restrictUi() { + if (!isUiRestrictedByOnlyAdmin()) { + getEmptyTextView().setText(R.string.wifi_empty_list_user_restricted); + } + getPreferenceScreen().removeAll(); + } + @Override public void onAttach(Context context) { mAccessPoint = new AccessPoint(context, getArguments()); @@ -102,9 +135,11 @@ public class WifiNetworkDetailsFragment extends DashboardFragment implements @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - MenuItem item = menu.add(0, Menu.FIRST, 0, R.string.wifi_modify); - item.setIcon(com.android.internal.R.drawable.ic_mode_edit); - item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); + if (!mIsUiRestricted) { + MenuItem item = menu.add(0, Menu.FIRST, 0, R.string.wifi_modify); + item.setIcon(com.android.internal.R.drawable.ic_mode_edit); + item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); + } super.onCreateOptionsMenu(menu, inflater); } diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiNetworkDetailsFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiNetworkDetailsFragmentTest.java new file mode 100644 index 00000000000..f4693cf5658 --- /dev/null +++ b/tests/robotests/src/com/android/settings/wifi/details/WifiNetworkDetailsFragmentTest.java @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2021 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.ArgumentMatchers.anyInt; +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 android.view.Menu; +import android.view.MenuInflater; +import android.widget.TextView; + +import androidx.preference.PreferenceScreen; + +import com.android.settings.R; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; + +@RunWith(RobolectricTestRunner.class) +public class WifiNetworkDetailsFragmentTest { + + @Mock + Menu mMenu; + private WifiNetworkDetailsFragment mFragment; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mFragment = new WifiNetworkDetailsFragment(); + } + + @Test + public void onCreateOptionsMenu_uiRestricted_shouldNotAddEditMenu() { + mFragment.mIsUiRestricted = true; + + mFragment.onCreateOptionsMenu(mMenu, mock(MenuInflater.class)); + + verify(mMenu, never()).add(anyInt(), anyInt(), anyInt(), eq(R.string.wifi_modify)); + } + + @Test + public void restrictUi_shouldShowRestrictedText() { + final WifiNetworkDetailsFragmentTest.FakeFragment + fragment = spy(new WifiNetworkDetailsFragmentTest.FakeFragment()); + final PreferenceScreen screen = mock(PreferenceScreen.class); + final TextView restrictedText = mock(TextView.class); + doReturn(screen).when(fragment).getPreferenceScreen(); + doReturn(false).when(fragment).isUiRestrictedByOnlyAdmin(); + doReturn(restrictedText).when(fragment).getEmptyTextView(); + + fragment.restrictUi(); + + verify(restrictedText).setText(anyInt()); + } + + @Test + public void restrictUi_shouldRemoveAllPreferences() { + final WifiNetworkDetailsFragmentTest.FakeFragment + fragment = spy(new WifiNetworkDetailsFragmentTest.FakeFragment()); + final PreferenceScreen screen = mock(PreferenceScreen.class); + doReturn(screen).when(fragment).getPreferenceScreen(); + doReturn(true).when(fragment).isUiRestrictedByOnlyAdmin(); + + fragment.restrictUi(); + + verify(screen).removeAll(); + } + + // Fake WifiNetworkDetailsFragment to override the protected method as public. + public class FakeFragment extends WifiNetworkDetailsFragment { + @Override + public boolean isUiRestrictedByOnlyAdmin() { + return super.isUiRestrictedByOnlyAdmin(); + } + } +} \ No newline at end of file From 1f24c6a9682fe12a018403daa5d2c3462996e150 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Thu, 29 Apr 2021 18:08:56 +0800 Subject: [PATCH 02/19] [DO NOT MERGE] Modify Wi-Fi details settings to restricted style - Show restricted text in guest mode - Screenshot: https://screenshot.googleplex.com/6nYcmazMM46TxaB Bug: 177573895 Test: manual test make RunSettingsRoboTests \ ROBOTEST_FILTER=WifiNetworkDetailsFragmentTest Change-Id: I5f857b2079e0f550e4be601d27dd54dac56b2f57 Merged-In: I5f857b2079e0f550e4be601d27dd54dac56b2f57 --- .../details/WifiNetworkDetailsFragment.java | 45 ++++++++- .../WifiNetworkDetailsFragmentTest.java | 99 +++++++++++++++++++ 2 files changed, 139 insertions(+), 5 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/wifi/details/WifiNetworkDetailsFragmentTest.java diff --git a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java index b645d60bbd2..ee03e6e7074 100644 --- a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java +++ b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java @@ -25,12 +25,15 @@ import android.net.wifi.WifiManager; import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import android.os.UserManager; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import androidx.annotation.VisibleForTesting; + import com.android.settings.R; -import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.dashboard.RestrictedDashboardFragment; import com.android.settings.wifi.WifiConfigUiBase; import com.android.settings.wifi.WifiDialog; import com.android.settingslib.RestrictedLockUtils; @@ -47,15 +50,45 @@ import java.util.List; *

The AccessPoint should be saved to the intent Extras when launching this class via * {@link AccessPoint#saveWifiState(Bundle)} in order to properly render this page. */ -public class WifiNetworkDetailsFragment extends DashboardFragment implements +public class WifiNetworkDetailsFragment extends RestrictedDashboardFragment implements WifiDialog.WifiDialogListener { private static final String TAG = "WifiNetworkDetailsFrg"; + @VisibleForTesting + boolean mIsUiRestricted; + private AccessPoint mAccessPoint; private WifiDetailPreferenceController mWifiDetailPreferenceController; private List mWifiDialogListeners = new ArrayList<>(); + public WifiNetworkDetailsFragment() { + super(UserManager.DISALLOW_CONFIG_WIFI); + } + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + setIfOnlyAvailableForAdmins(true); + mIsUiRestricted = isUiRestricted(); + } + + @Override + public void onStart() { + super.onStart(); + if (mIsUiRestricted) { + restrictUi(); + } + } + + @VisibleForTesting + void restrictUi() { + if (!isUiRestrictedByOnlyAdmin()) { + getEmptyTextView().setText(R.string.wifi_empty_list_user_restricted); + } + getPreferenceScreen().removeAll(); + } + @Override public void onAttach(Context context) { mAccessPoint = new AccessPoint(context, getArguments()); @@ -98,9 +131,11 @@ public class WifiNetworkDetailsFragment extends DashboardFragment implements @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - MenuItem item = menu.add(0, Menu.FIRST, 0, R.string.wifi_modify); - item.setIcon(com.android.internal.R.drawable.ic_mode_edit); - item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); + if (!mIsUiRestricted) { + MenuItem item = menu.add(0, Menu.FIRST, 0, R.string.wifi_modify); + item.setIcon(com.android.internal.R.drawable.ic_mode_edit); + item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); + } super.onCreateOptionsMenu(menu, inflater); } diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiNetworkDetailsFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiNetworkDetailsFragmentTest.java new file mode 100644 index 00000000000..f4693cf5658 --- /dev/null +++ b/tests/robotests/src/com/android/settings/wifi/details/WifiNetworkDetailsFragmentTest.java @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2021 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.ArgumentMatchers.anyInt; +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 android.view.Menu; +import android.view.MenuInflater; +import android.widget.TextView; + +import androidx.preference.PreferenceScreen; + +import com.android.settings.R; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; + +@RunWith(RobolectricTestRunner.class) +public class WifiNetworkDetailsFragmentTest { + + @Mock + Menu mMenu; + private WifiNetworkDetailsFragment mFragment; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mFragment = new WifiNetworkDetailsFragment(); + } + + @Test + public void onCreateOptionsMenu_uiRestricted_shouldNotAddEditMenu() { + mFragment.mIsUiRestricted = true; + + mFragment.onCreateOptionsMenu(mMenu, mock(MenuInflater.class)); + + verify(mMenu, never()).add(anyInt(), anyInt(), anyInt(), eq(R.string.wifi_modify)); + } + + @Test + public void restrictUi_shouldShowRestrictedText() { + final WifiNetworkDetailsFragmentTest.FakeFragment + fragment = spy(new WifiNetworkDetailsFragmentTest.FakeFragment()); + final PreferenceScreen screen = mock(PreferenceScreen.class); + final TextView restrictedText = mock(TextView.class); + doReturn(screen).when(fragment).getPreferenceScreen(); + doReturn(false).when(fragment).isUiRestrictedByOnlyAdmin(); + doReturn(restrictedText).when(fragment).getEmptyTextView(); + + fragment.restrictUi(); + + verify(restrictedText).setText(anyInt()); + } + + @Test + public void restrictUi_shouldRemoveAllPreferences() { + final WifiNetworkDetailsFragmentTest.FakeFragment + fragment = spy(new WifiNetworkDetailsFragmentTest.FakeFragment()); + final PreferenceScreen screen = mock(PreferenceScreen.class); + doReturn(screen).when(fragment).getPreferenceScreen(); + doReturn(true).when(fragment).isUiRestrictedByOnlyAdmin(); + + fragment.restrictUi(); + + verify(screen).removeAll(); + } + + // Fake WifiNetworkDetailsFragment to override the protected method as public. + public class FakeFragment extends WifiNetworkDetailsFragment { + @Override + public boolean isUiRestrictedByOnlyAdmin() { + return super.isUiRestrictedByOnlyAdmin(); + } + } +} \ No newline at end of file From 91c14e8c6a4052f63734ed772cd5ca5dd7da32da Mon Sep 17 00:00:00 2001 From: jasonwshsu Date: Mon, 3 May 2021 15:00:56 +0800 Subject: [PATCH 03/19] Align dark theme in accessibility page with the dark theme in display page. Root Cause: Two different behaved dark theme exist in different page Solution: Align with the dark theme in display page Bug: 185880142 Test: manual test Change-Id: If905c1e3e067377a835223d5d5eb2ca426673e49 --- res/xml/accessibility_settings.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml index 6fa8b00b6c5..267045baf74 100644 --- a/res/xml/accessibility_settings.xml +++ b/res/xml/accessibility_settings.xml @@ -53,11 +53,13 @@ settings:controller="com.android.settings.accessibility.ReduceBrightColorsPreferenceController" settings:keywords="@string/keywords_reduce_bright_colors"/> - From 139ff593466f249181dea36ea05c34e98505ac60 Mon Sep 17 00:00:00 2001 From: Hugh Chen Date: Tue, 27 Apr 2021 14:37:29 +0800 Subject: [PATCH 04/19] Fix the section below "Pair new device" moves up a few pixels This CL add new controller that used to show the summary when bluetooth is off. It can prevent a jank since the UI is decided before render. Bug: 182232469 Test: make RunSettingsRoboTests -j56 Change-Id: I78eb757cd1b636fbb18028fb2294861467bc6eba --- res/xml/connected_devices.xml | 13 +- .../AddDevicePreferenceController.java | 14 +- .../AddDeviceSummaryPreferenceController.java | 39 +++++ .../AddDevicePreferenceControllerTest.java | 10 ++ ...DeviceSummaryPreferenceControllerTest.java | 151 ++++++++++++++++++ 5 files changed, 223 insertions(+), 4 deletions(-) create mode 100644 src/com/android/settings/connecteddevice/AddDeviceSummaryPreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/connecteddevice/AddDeviceSummaryPreferenceControllerTest.java diff --git a/res/xml/connected_devices.xml b/res/xml/connected_devices.xml index e7e3c2ccfbe..75878f90ae0 100644 --- a/res/xml/connected_devices.xml +++ b/res/xml/connected_devices.xml @@ -40,7 +40,6 @@ android:key="add_bt_devices" android:title="@string/bluetooth_pairing_pref_title" android:icon="@drawable/ic_add_24dp" - android:summary="@string/connected_device_add_device_summary" android:fragment="com.android.settings.bluetooth.BluetoothPairingDetail" settings:allowDividerAbove="true" settings:keywords="@string/keywords_add_bt_device" @@ -48,6 +47,18 @@ settings:useAdminDisabledSummary="true" settings:controller="com.android.settings.connecteddevice.AddDevicePreferenceController"/> + + Date: Thu, 11 Mar 2021 22:15:29 +0800 Subject: [PATCH 05/19] wifi: Use new API for wifi data usage function For wifi, a old API: buildTemplateWifiWildcard will includes the merged wifi which is included to mobile usage. It should not double count again. Call new API: buildTemplateWifi with NetworkId: NetworkTemplate.WIFI_NETWORKID_ALL and null subscriberId to get non-merged wifi usage. Test: make RunSettingsRoboTests ROBOTEST_FILTER=AppDataUsageTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=AppDataUsagePreferenceControllerTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=DataUsageSummaryTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=DataUsageSummaryPreferenceTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=DataUsageSummaryPreferenceControllerTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=DataUsageUtilsTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=NetworkProviderSettingsTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=SettingsDumpServiceTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=WifiSettingsTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=DataUsageInfoControllerTest Test: Manual Test, wifi data usage count correctly. Bug: 176396812 Change-Id: Ia4d8fa67ea3cb75c2d35be9ab60e5c5ffa391ffb --- src/com/android/settings/SettingsDumpService.java | 4 +++- .../appinfo/AppDataUsagePreferenceController.java | 3 ++- .../settings/datausage/DataUsageSummary.java | 4 +++- .../datausage/DataUsageSummaryPreference.java | 7 +++++-- .../DataUsageSummaryPreferenceController.java | 3 ++- .../settings/datausage/DataUsageUtils.java | 3 ++- .../settings/datausage/lib/DataUsageLib.java | 3 ++- .../settings/network/NetworkProviderSettings.java | 6 +++--- src/com/android/settings/wifi/WifiSettings.java | 6 +++--- .../settings/datausage/AppDataUsageTest.java | 15 +++++++++++---- .../datausage/DataUsageInfoControllerTest.java | 6 +++--- .../datausage/DataUsageSummaryPreferenceTest.java | 6 ++++-- 12 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/com/android/settings/SettingsDumpService.java b/src/com/android/settings/SettingsDumpService.java index 5e6ee9307a7..a935c18be01 100644 --- a/src/com/android/settings/SettingsDumpService.java +++ b/src/com/android/settings/SettingsDumpService.java @@ -120,7 +120,9 @@ public class SettingsDumpService extends Service { obj.put("cell", array); } if (packageManager.hasSystemFeature(FEATURE_WIFI)) { - obj.put("wifi", dumpDataUsage(NetworkTemplate.buildTemplateWifiWildcard(), controller)); + obj.put("wifi", dumpDataUsage( + NetworkTemplate.buildTemplateWifi( + NetworkTemplate.WIFI_NETWORKID_ALL, null /* subscriberId */), controller)); } if (packageManager.hasSystemFeature(FEATURE_ETHERNET)) { diff --git a/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java b/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java index a3ea4784b28..f321d720df4 100644 --- a/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java @@ -139,7 +139,8 @@ public class AppDataUsagePreferenceController extends AppInfoPreferenceControlle return NetworkTemplate.buildTemplateMobileWildcard(); } if (DataUsageUtils.hasWifiRadio(context)) { - return NetworkTemplate.buildTemplateWifiWildcard(); + return NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */); } return NetworkTemplate.buildTemplateEthernet(); } diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java index b11935f0c84..a4396a286c2 100644 --- a/src/com/android/settings/datausage/DataUsageSummary.java +++ b/src/com/android/settings/datausage/DataUsageSummary.java @@ -183,7 +183,9 @@ public class DataUsageSummary extends DataUsageBaseFragment implements DataUsage void addWifiSection() { TemplatePreferenceCategory category = (TemplatePreferenceCategory) inflatePreferences(R.xml.data_usage_wifi); - category.setTemplate(NetworkTemplate.buildTemplateWifiWildcard(), 0, services); + category.setTemplate( + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */), 0, services); } private void addEthernetSection() { diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreference.java b/src/com/android/settings/datausage/DataUsageSummaryPreference.java index f1728b6a02b..260a6dae937 100644 --- a/src/com/android/settings/datausage/DataUsageSummaryPreference.java +++ b/src/com/android/settings/datausage/DataUsageSummaryPreference.java @@ -225,7 +225,8 @@ public class DataUsageSummaryPreference extends Preference { static void launchWifiDataUsage(Context context) { final Bundle args = new Bundle(1); args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, - NetworkTemplate.buildTemplateWifiWildcard()); + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */)); args.putInt(DataUsageList.EXTRA_NETWORK_TYPE, ConnectivityManager.TYPE_WIFI); final SubSettingLauncher launcher = new SubSettingLauncher(context) .setArguments(args) @@ -367,7 +368,9 @@ public class DataUsageSummaryPreference extends Preference { @VisibleForTesting protected long getHistoricalUsageLevel() { final DataUsageController controller = new DataUsageController(getContext()); - return controller.getHistoricalUsageLevel(NetworkTemplate.buildTemplateWifiWildcard()); + return controller.getHistoricalUsageLevel( + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */)); } @VisibleForTesting diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java index 73f8f45909c..bc47e5e75d6 100644 --- a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java +++ b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java @@ -138,7 +138,8 @@ public class DataUsageSummaryPreferenceController extends TelephonyBasePreferenc mDefaultTemplate = DataUsageLib.getMobileTemplate(context, subscriptionId); } else if (DataUsageUtils.hasWifiRadio(context)) { mDataUsageTemplate = R.string.wifi_data_template; - mDefaultTemplate = NetworkTemplate.buildTemplateWifiWildcard(); + mDefaultTemplate = NetworkTemplate.buildTemplateWifi( + NetworkTemplate.WIFI_NETWORKID_ALL, null /* subscriberId */); } else { mDataUsageTemplate = R.string.ethernet_data_template; mDefaultTemplate = DataUsageUtils.getDefaultTemplate(context, subscriptionId); diff --git a/src/com/android/settings/datausage/DataUsageUtils.java b/src/com/android/settings/datausage/DataUsageUtils.java index 7da69cb9352..fae53ecd2e9 100644 --- a/src/com/android/settings/datausage/DataUsageUtils.java +++ b/src/com/android/settings/datausage/DataUsageUtils.java @@ -184,7 +184,8 @@ public final class DataUsageUtils extends com.android.settingslib.net.DataUsageU if (SubscriptionManager.isValidSubscriptionId(defaultSubId) && hasMobileData(context)) { return DataUsageLib.getMobileTemplate(context, defaultSubId); } else if (hasWifiRadio(context)) { - return NetworkTemplate.buildTemplateWifiWildcard(); + return NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */); } else { return NetworkTemplate.buildTemplateEthernet(); } diff --git a/src/com/android/settings/datausage/lib/DataUsageLib.java b/src/com/android/settings/datausage/lib/DataUsageLib.java index cf2ce1fcf76..786f0ecee2e 100644 --- a/src/com/android/settings/datausage/lib/DataUsageLib.java +++ b/src/com/android/settings/datausage/lib/DataUsageLib.java @@ -73,6 +73,7 @@ public class DataUsageLib { private static NetworkTemplate getMobileTemplateForSubId( TelephonyManager telephonyManager, int subId) { - return NetworkTemplate.buildTemplateMobileAll(telephonyManager.getSubscriberId(subId)); + return NetworkTemplate.buildTemplateMobileAll( + telephonyManager.getSubscriberId(subId)); } } diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java index c368fa3f66a..3b652212cc3 100644 --- a/src/com/android/settings/network/NetworkProviderSettings.java +++ b/src/com/android/settings/network/NetworkProviderSettings.java @@ -279,9 +279,9 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment mAddWifiNetworkPreference = new AddWifiNetworkPreference(getPrefContext()); mDataUsagePreference = findPreference(PREF_KEY_DATA_USAGE); mDataUsagePreference.setVisible(DataUsageUtils.hasWifiRadio(getContext())); - mDataUsagePreference.setTemplate(NetworkTemplate.buildTemplateWifiWildcard(), - 0 /*subId*/, - null /*service*/); + mDataUsagePreference.setTemplate( + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */), 0 /*subId*/, null /*service*/); mResetInternetPreference = findPreference(PREF_KEY_RESET_INTERNET); if (mResetInternetPreference != null) { mResetInternetPreference.setVisible(false); diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index ceacefe90ce..dac65c6ec64 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -261,9 +261,9 @@ public class WifiSettings extends RestrictedSettingsFragment mStatusMessagePreference = findPreference(PREF_KEY_STATUS_MESSAGE); mDataUsagePreference = findPreference(PREF_KEY_DATA_USAGE); mDataUsagePreference.setVisible(DataUsageUtils.hasWifiRadio(getContext())); - mDataUsagePreference.setTemplate(NetworkTemplate.buildTemplateWifiWildcard(), - 0 /*subId*/, - null /*service*/); + mDataUsagePreference.setTemplate( + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */), 0 /*subId*/, null /*service*/); } @Override diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java index ded7d106ec2..f75b7f030d6 100644 --- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java +++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java @@ -18,6 +18,7 @@ package com.android.settings.datausage; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; @@ -309,7 +310,8 @@ public class AppDataUsageTest { ReflectionHelpers.setField(mFragment, "mContext", context); ReflectionHelpers.setField(mFragment, "mAppItem", appItem); ReflectionHelpers.setField(mFragment, "mTemplate", - NetworkTemplate.buildTemplateWifiWildcard()); + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */)); final long end = System.currentTimeMillis(); final long start = end - (DateUtils.WEEK_IN_MILLIS * 4); @@ -334,7 +336,8 @@ public class AppDataUsageTest { ReflectionHelpers.setField(mFragment, "mContext", context); ReflectionHelpers.setField(mFragment, "mAppItem", appItem); ReflectionHelpers.setField(mFragment, "mTemplate", - NetworkTemplate.buildTemplateWifiWildcard()); + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */)); final long end = System.currentTimeMillis(); final long start = end - (DateUtils.WEEK_IN_MILLIS * 4); @@ -365,7 +368,8 @@ public class AppDataUsageTest { ReflectionHelpers.setField(mFragment, "mCycles", testCycles); ReflectionHelpers.setField(mFragment, "mAppItem", appItem); ReflectionHelpers.setField(mFragment, "mTemplate", - NetworkTemplate.buildTemplateWifiWildcard()); + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */)); final NetworkCycleDataForUidLoader loader = (NetworkCycleDataForUidLoader) mFragment.mUidDataCallbacks.onCreateLoader(0 /* id */, Bundle.EMPTY /* args */); @@ -436,6 +440,9 @@ public class AppDataUsageTest { mFragment.onCreate(Bundle.EMPTY); assertThat(mFragment.mTemplate.getMatchRule()) - .isEqualTo(NetworkTemplate.MATCH_WIFI_WILDCARD); + .isEqualTo(NetworkTemplate.MATCH_WIFI); + assertNull(mFragment.mTemplate.getSubscriberId()); + assertThat(mFragment.mTemplate.getNetworkId()) + .isEqualTo(NetworkTemplate.WIFI_NETWORKID_ALL); } } diff --git a/tests/unit/src/com/android/settings/datausage/DataUsageInfoControllerTest.java b/tests/unit/src/com/android/settings/datausage/DataUsageInfoControllerTest.java index d94d3801189..d770aba8c36 100644 --- a/tests/unit/src/com/android/settings/datausage/DataUsageInfoControllerTest.java +++ b/tests/unit/src/com/android/settings/datausage/DataUsageInfoControllerTest.java @@ -101,8 +101,8 @@ public class DataUsageInfoControllerTest { } private NetworkPolicy getDefaultNetworkPolicy() { - NetworkTemplate template = - new NetworkTemplate(NetworkTemplate.MATCH_WIFI_WILDCARD, null, null); + NetworkTemplate template = NetworkTemplate.buildTemplateWifi( + NetworkTemplate.WIFI_NETWORKID_ALL, null /* subscriberId */); int cycleDay = -1; String cycleTimezone = "UTC"; long warningBytes = -1; @@ -176,4 +176,4 @@ public class DataUsageInfoControllerTest { assertThat(info.limitLevel).isEqualTo(policy.limitBytes); } -} \ No newline at end of file +} diff --git a/tests/unit/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/unit/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java index 76deec6cf64..7d814b58da7 100644 --- a/tests/unit/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java +++ b/tests/unit/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java @@ -531,11 +531,13 @@ public class DataUsageSummaryPreferenceTest { final Bundle expect = new Bundle(1); expect.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, - NetworkTemplate.buildTemplateWifiWildcard()); + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */)); final Bundle actual = startedIntent .getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS); assertThat((NetworkTemplate) actual.getParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE)) - .isEqualTo(NetworkTemplate.buildTemplateWifiWildcard()); + .isEqualTo(NetworkTemplate.buildTemplateWifi( + NetworkTemplate.WIFI_NETWORKID_ALL, null /* subscriberId */)); assertThat(startedIntent.getIntExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, 0)) .isEqualTo(ResourcesUtils.getResourcesId(mContext, "string", "wifi_data_usage")); From c5cf69b1cf7683af5f0ebfdbaf27c5a225db9f72 Mon Sep 17 00:00:00 2001 From: Jeremy Goldman Date: Wed, 5 May 2021 13:56:59 +0800 Subject: [PATCH 06/19] Create unit test for the VpnInfoPreference Currently the Settings VPN library doesn't including much testing support, so this is intended as a start, in order to improve reliability and stability of the area. Test: atest -c VpnInfoPreferenceTest Bug: 187245804 Change-Id: Id5acb699e0a68f479f3b0b6e6614c2e4e43b163b --- .../settings/vpn2/VpnInfoPreferenceTest.java | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 tests/unit/src/com/android/settings/vpn2/VpnInfoPreferenceTest.java diff --git a/tests/unit/src/com/android/settings/vpn2/VpnInfoPreferenceTest.java b/tests/unit/src/com/android/settings/vpn2/VpnInfoPreferenceTest.java new file mode 100644 index 00000000000..e0683cad8d5 --- /dev/null +++ b/tests/unit/src/com/android/settings/vpn2/VpnInfoPreferenceTest.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2021 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.vpn2; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.content.res.Resources; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; + +import androidx.preference.PreferenceViewHolder; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import com.android.settings.testutils.ResourcesUtils; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class VpnInfoPreferenceTest { + + private Context mContext; + private Resources mResources; + private VpnInfoPreference mVpnInfoPreference; + private AttributeSet mAttrs; + private PreferenceViewHolder mHolder; + private View mWarningButton; + + @Before + public void setUp() { + mContext = spy(ApplicationProvider.getApplicationContext()); + mResources = spy(mContext.getResources()); + when(mContext.getResources()).thenReturn(mResources); + + final int helpUrlId = ResourcesUtils.getResourcesId( + mContext, "string", "help_url_insecure_vpn"); + when(mResources.getString(helpUrlId)).thenReturn("https://www.google.com/"); + + mVpnInfoPreference = new VpnInfoPreference(mContext, mAttrs); + LayoutInflater inflater = mContext.getSystemService(LayoutInflater.class); + + // The VpnInfoPreference is a RestrictedPreference, which is a TwoTargetPreference + final int layoutId = ResourcesUtils.getResourcesId( + mContext, "layout", "preference_two_target"); + View view = inflater.inflate( + layoutId, + null /* root */, false /* attachToRoot */); + mHolder = spy(PreferenceViewHolder.createInstanceForTests(view)); + final int warningButtonId = ResourcesUtils.getResourcesId( + mContext, "id", "warning_button"); + mWarningButton = spy(new View(mContext)); + when(mWarningButton.getId()).thenReturn(warningButtonId); + when(mHolder.findViewById(warningButtonId)).thenReturn(mWarningButton); + } + + @Test + public void onBindViewHolder_notInsecureVpn_iconInvisible() { + mVpnInfoPreference.setInsecureVpn(false); + + mVpnInfoPreference.onBindViewHolder(mHolder); + + verify(mWarningButton).setVisibility(View.GONE); + verify(mWarningButton).setEnabled(false); + } + + @Test + public void onBindViewHolder_emptyUrl_iconInvisible() { + final int helpUrlId = ResourcesUtils.getResourcesId( + mContext, "string", "help_url_insecure_vpn"); + when(mResources.getString(helpUrlId)).thenReturn(""); + VpnInfoPreference vpnInfoPreference = new VpnInfoPreference(mContext, mAttrs); + + vpnInfoPreference.setInsecureVpn(true); + + vpnInfoPreference.onBindViewHolder(mHolder); + + verify(mWarningButton).setVisibility(View.GONE); + verify(mWarningButton).setEnabled(false); + } + + @Test + public void onBindViewHolder_insecureVpn_iconVisible() { + mVpnInfoPreference.setInsecureVpn(true); + + mVpnInfoPreference.onBindViewHolder(mHolder); + + verify(mWarningButton).setVisibility(View.VISIBLE); + verify(mWarningButton).setEnabled(true); + } + + @Test + public void onBindViewHolder_dividerInvisible() { + mVpnInfoPreference.onBindViewHolder(mHolder); + + final int dividerId = ResourcesUtils.getResourcesId(mContext, "id", "two_target_divider"); + final View divider = mHolder.findViewById(dividerId); + assertEquals(View.GONE, divider.getVisibility()); + } +} From 7d0988f26d9052057281e1ad4335d88e1f9a7ac8 Mon Sep 17 00:00:00 2001 From: "Wesley.CW Wang" Date: Wed, 5 May 2021 21:42:59 +0800 Subject: [PATCH 07/19] Update battery settings string Bug: 168635076 Bug: 183689347 Test: make SettingsRoboTests Change-Id: I1650c1c391ec3444f53360cd0f87f226b988ea04 --- res/values/strings.xml | 10 +++++----- .../BatterySaverStickyPreferenceController.java | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 742ed97ae2e..68f666aead5 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6088,7 +6088,7 @@ Restricted %1$s - These apps have been using battery in the background. Restricted apps may not work properly and notifications may be delayed. + These apps are restricted from background battery usage. They may not work as expected, and notifications may be delayed. Use Battery Manager @@ -6312,7 +6312,7 @@ Full charge lasts about - Battery usage data is approximate and can change based on usage + Battery usage data is approximate and can change based on usage. While in active use @@ -6417,11 +6417,11 @@ Turn off when charged - Battery Saver turns off when your phone charges above %1$s + Battery Saver turns off when your phone charges above ^1% - Battery Saver turns off when your tablet charges above %1$s + Battery Saver turns off when your tablet charges above ^1% - Battery Saver turns off when your device charges above %1$s + Battery Saver turns off when your device charges above ^1% %1$s diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceController.java index 7d4bdac074f..6754245d712 100644 --- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceController.java +++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceController.java @@ -4,6 +4,8 @@ import android.content.Context; import android.icu.text.NumberFormat; import android.provider.Settings; import android.provider.Settings.Global; +import android.text.TextUtils; + import androidx.preference.Preference; import androidx.preference.SwitchPreference; import com.android.settings.R; @@ -37,13 +39,11 @@ public class BatterySaverStickyPreferenceController extends TogglePreferenceCont @Override protected void refreshSummary(Preference preference) { super.refreshSummary(preference); - final double stickyShutoffLevel = Settings.Global.getInt( + final int stickyShutoffLevel = Settings.Global.getInt( mContext.getContentResolver(), Global.LOW_POWER_MODE_STICKY_AUTO_DISABLE_LEVEL, 90); - final String percentage = NumberFormat - .getPercentInstance() - .format(stickyShutoffLevel / 100.0); - preference.setSummary( - mContext.getString(R.string.battery_saver_sticky_description_new, percentage)); + preference.setSummary(TextUtils.expandTemplate( + mContext.getString(R.string.battery_saver_sticky_description_new), + NumberFormat.getIntegerInstance().format(stickyShutoffLevel))); } @Override From ecd149597709f207a863588ef98bc67b33cfdc75 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Wed, 5 May 2021 22:22:09 +0800 Subject: [PATCH 08/19] Fix searching condition for biometric settings The preferences that are related to biometric settings should only be searchable if the device supports the multiple biometric auth. However we can see these preferences still can be searched even the device doesn't support the feature, which is caused by that there's no guardence. So the availiability of the preferences need to be updated to prevent revealing unsupported preference from Settings search. Fixes: 187167774 Test: manual test 1) Navigate to Settings search on a device without face auth 2) Search for face 3) See if there's something about face unlock Change-Id: I6f120e8d9002a1e8f0be9361fdbea193776e4d7d --- .../combination/BiometricFaceStatusPreferenceController.java | 2 +- .../BiometricFingerprintStatusPreferenceController.java | 3 ++- .../combination/BiometricSettingsAppPreferenceController.java | 3 +++ .../BiometricSettingsKeyguardPreferenceController.java | 4 ++++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/biometrics/combination/BiometricFaceStatusPreferenceController.java b/src/com/android/settings/biometrics/combination/BiometricFaceStatusPreferenceController.java index e4b210ea621..047a2dfa193 100644 --- a/src/com/android/settings/biometrics/combination/BiometricFaceStatusPreferenceController.java +++ b/src/com/android/settings/biometrics/combination/BiometricFaceStatusPreferenceController.java @@ -32,6 +32,6 @@ public class BiometricFaceStatusPreferenceController extends FaceStatusPreferenc @Override protected boolean isDeviceSupported() { - return Utils.hasFaceHardware(mContext); + return Utils.isMultipleBiometricsSupported(mContext) && Utils.hasFaceHardware(mContext); } } diff --git a/src/com/android/settings/biometrics/combination/BiometricFingerprintStatusPreferenceController.java b/src/com/android/settings/biometrics/combination/BiometricFingerprintStatusPreferenceController.java index fd742ffd30c..72a19c72d44 100644 --- a/src/com/android/settings/biometrics/combination/BiometricFingerprintStatusPreferenceController.java +++ b/src/com/android/settings/biometrics/combination/BiometricFingerprintStatusPreferenceController.java @@ -33,6 +33,7 @@ public class BiometricFingerprintStatusPreferenceController extends @Override protected boolean isDeviceSupported() { - return Utils.hasFingerprintHardware(mContext); + return Utils.isMultipleBiometricsSupported(mContext) + && Utils.hasFingerprintHardware(mContext); } } diff --git a/src/com/android/settings/biometrics/combination/BiometricSettingsAppPreferenceController.java b/src/com/android/settings/biometrics/combination/BiometricSettingsAppPreferenceController.java index 9107e1b48de..861ff276d7a 100644 --- a/src/com/android/settings/biometrics/combination/BiometricSettingsAppPreferenceController.java +++ b/src/com/android/settings/biometrics/combination/BiometricSettingsAppPreferenceController.java @@ -69,6 +69,9 @@ public class BiometricSettingsAppPreferenceController extends TogglePreferenceCo @Override public int getAvailabilityStatus() { + if (!Utils.isMultipleBiometricsSupported(mContext)) { + return UNSUPPORTED_ON_DEVICE; + } if (mFaceManager == null || mFingerprintManager == null) { return AVAILABLE_UNSEARCHABLE; } diff --git a/src/com/android/settings/biometrics/combination/BiometricSettingsKeyguardPreferenceController.java b/src/com/android/settings/biometrics/combination/BiometricSettingsKeyguardPreferenceController.java index 263134a0154..6fe651f74cc 100644 --- a/src/com/android/settings/biometrics/combination/BiometricSettingsKeyguardPreferenceController.java +++ b/src/com/android/settings/biometrics/combination/BiometricSettingsKeyguardPreferenceController.java @@ -21,6 +21,7 @@ import android.app.admin.DevicePolicyManager; import android.content.Context; import android.provider.Settings; +import com.android.settings.Utils; import com.android.settings.core.TogglePreferenceController; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtilsInternal; @@ -62,6 +63,9 @@ public class BiometricSettingsKeyguardPreferenceController extends TogglePrefere @Override public int getAvailabilityStatus() { + if (!Utils.isMultipleBiometricsSupported(mContext)) { + return UNSUPPORTED_ON_DEVICE; + } return getRestrictingAdmin() != null ? DISABLED_FOR_USER : AVAILABLE; } } From 129036cf751a2becd6e484059f07e7529ebfe7d6 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Wed, 5 May 2021 18:50:25 +0800 Subject: [PATCH 09/19] Fix color filling on some Wifi pages Since there's no edge-to-edge in the theme that Wifi page applied, it caused the different colors filled in status bar and collapsing toolbar area separately. It can be fixed by updating the theme to Theme.SubSettings. Fix: 187016196 Fix: 187021412 Test: visual verified Change-Id: I686861c37acfb1eeddda1278cd70fa5bfd44cc1d --- AndroidManifest.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 9b11fe81c98..54ea5f27358 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -141,7 +141,7 @@ @@ -418,6 +418,7 @@ android:label="@string/apn_settings" android:launchMode="singleTask" android:exported="true" + android:theme="@style/Theme.SubSettings" android:configChanges="orientation|keyboardHidden|screenSize"> @@ -2059,6 +2060,7 @@ @@ -2999,6 +3001,7 @@ From 2042dac123317d51ab449dab5baae7f830de5bb2 Mon Sep 17 00:00:00 2001 From: Tsung-Mao Fang Date: Wed, 5 May 2021 23:31:19 +0800 Subject: [PATCH 10/19] Fix loading ring overlapping problem By design, the loading ring is in the middle of the recycler view. In the Android S, recyclerview isn't matched the screen's height. So, if the recyclerview doesn't contains any item, the height could be very low and then it causes to overlaps with drop down view. The simple solution is to fix height of view of progress bar, so it won't rely on the height of recycler view anymore. Fix: 184643347 Test: Go to app notification page, and no overlapping problem. Change-Id: I9f4fddba0254ac0cb0ba0b128a7dcc2de05d1fce --- res/layout/loading_container.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/layout/loading_container.xml b/res/layout/loading_container.xml index eb67044a380..80cbbf9ac9a 100644 --- a/res/layout/loading_container.xml +++ b/res/layout/loading_container.xml @@ -18,7 +18,7 @@ android:id="@+id/loading_container" android:orientation="vertical" android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="450dp" android:visibility="gone" android:gravity="center"> From 2918626258502c4f2c52d3575cf011fa89003fab Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Thu, 6 May 2021 01:18:01 +0800 Subject: [PATCH 11/19] Update the theme for Notification history page Fix: 187241188 Test: visual verified 1) Enable the light theme 2) Settings > Notifications > Notification history 3) See if the color of icon in the status bar is white Change-Id: I2f198a10b71d0d0f7c92db0feab2154a1c8f25c6 --- AndroidManifest.xml | 2 +- res/values/themes.xml | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 9b11fe81c98..265167e3c39 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1312,7 +1312,7 @@ diff --git a/res/values/themes.xml b/res/values/themes.xml index b5f71fa5cb6..af44276c281 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -254,11 +254,4 @@ @*android:color/primary_device_default_settings_light @*android:color/accent_device_default_light - - From aa48592b40ee75761cd3b679eca983134505abc1 Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Thu, 6 May 2021 01:44:50 +0800 Subject: [PATCH 12/19] Update Prevent Ringing summary when it turn off Bug: 187145174 Test: manual & robotest Change-Id: Ifc06a38ff65f084db2803c56b5a37224c5b9b810 --- .../gestures/PreventRingingParentPreferenceController.java | 3 ++- .../gestures/PreventRingingParentPreferenceControllerTest.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/gestures/PreventRingingParentPreferenceController.java b/src/com/android/settings/gestures/PreventRingingParentPreferenceController.java index ca1f1c775b4..b67943817ee 100644 --- a/src/com/android/settings/gestures/PreventRingingParentPreferenceController.java +++ b/src/com/android/settings/gestures/PreventRingingParentPreferenceController.java @@ -92,8 +92,9 @@ public class PreventRingingParentPreferenceController extends TogglePreferenceCo case VOLUME_HUSH_MUTE: summary = mContext.getText(R.string.prevent_ringing_option_mute_summary); break; + // VOLUME_HUSH_OFF default: - summary = null; + summary = mContext.getText(R.string.switch_off_text); } preference.setSummary(summary); } diff --git a/tests/robotests/src/com/android/settings/gestures/PreventRingingParentPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/PreventRingingParentPreferenceControllerTest.java index 9e4877c954f..4844a1cb0a7 100644 --- a/tests/robotests/src/com/android/settings/gestures/PreventRingingParentPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/gestures/PreventRingingParentPreferenceControllerTest.java @@ -97,7 +97,8 @@ public class PreventRingingParentPreferenceControllerTest { Settings.Secure.putInt(mContext.getContentResolver(), VOLUME_HUSH_GESTURE, VOLUME_HUSH_OFF); mController.updateState(mPreference); - assertThat(mPreference.getSummary()).isEqualTo(null); + assertThat(mPreference.getSummary()).isEqualTo(mContext.getResources().getText( + R.string.switch_off_text)); } @Test From f54a2be819a11d4204b537c393a203f4b05edee0 Mon Sep 17 00:00:00 2001 From: Yi Jiang Date: Wed, 5 May 2021 12:06:42 -0700 Subject: [PATCH 13/19] Fixes NPE in Screen attention setting Bug: 186904496 Test: make RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.display Change-Id: I9bd1e6824e19cf8ea281f7af482d13ef47f36256 --- .../AdaptiveSleepPreferenceController.java | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/com/android/settings/display/AdaptiveSleepPreferenceController.java b/src/com/android/settings/display/AdaptiveSleepPreferenceController.java index 7fbb01ecd38..8f61683bb63 100644 --- a/src/com/android/settings/display/AdaptiveSleepPreferenceController.java +++ b/src/com/android/settings/display/AdaptiveSleepPreferenceController.java @@ -73,7 +73,6 @@ public class AdaptiveSleepPreferenceController { * Adds the controlled preference to the provided preference screen. */ public void addToScreen(PreferenceScreen screen) { - initializePreference(); updatePreference(); screen.addPreference(mPreference); } @@ -82,6 +81,7 @@ public class AdaptiveSleepPreferenceController { * Updates the appearance of the preference. */ public void updatePreference() { + initializePreference(); final EnforcedAdmin enforcedAdmin = mRestrictionUtils.checkIfRestrictionEnforced(mContext, UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT); if (enforcedAdmin != null) { @@ -93,19 +93,22 @@ public class AdaptiveSleepPreferenceController { @VisibleForTesting void initializePreference() { - mPreference = new RestrictedSwitchPreference(mContext); - mPreference.setTitle(R.string.adaptive_sleep_title); - mPreference.setSummary(R.string.adaptive_sleep_description); - mPreference.setChecked(isChecked()); - mPreference.setKey(PREFERENCE_KEY); - mPreference.setOnPreferenceChangeListener((preference, value) -> { - final boolean isChecked = (Boolean) value; - mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_SCREEN_ATTENTION_CHANGED, - isChecked); - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ADAPTIVE_SLEEP, isChecked ? 1 : DEFAULT_VALUE); - return true; - }); + if (mPreference == null) { + mPreference = new RestrictedSwitchPreference(mContext); + mPreference.setTitle(R.string.adaptive_sleep_title); + mPreference.setSummary(R.string.adaptive_sleep_description); + mPreference.setChecked(isChecked()); + mPreference.setKey(PREFERENCE_KEY); + mPreference.setOnPreferenceChangeListener((preference, value) -> { + final boolean isChecked = (Boolean) value; + mMetricsFeatureProvider.action(mContext, + SettingsEnums.ACTION_SCREEN_ATTENTION_CHANGED, + isChecked); + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.ADAPTIVE_SLEEP, isChecked ? 1 : DEFAULT_VALUE); + return true; + }); + } } @VisibleForTesting From 88cafbaa2446f8ecb61298522614a3434960b854 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Thu, 6 May 2021 05:48:20 +0800 Subject: [PATCH 14/19] [Provider Model] Fix settings crash issue - The GlobalSettingsChangeListener needs to be closed after the life cycle is destroyed Bug: 185756174 Bug: 186404332 Bug: 186591527 Test: manual test atest -c InternetUpdaterTest Change-Id: I9fbad3b303055c6c7a61ccad8efe69cefef56c58 --- src/com/android/settings/network/InternetUpdater.java | 7 +++++++ .../com/android/settings/network/InternetUpdaterTest.java | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/src/com/android/settings/network/InternetUpdater.java b/src/com/android/settings/network/InternetUpdater.java index dd70cef62af..cb8d32ca161 100644 --- a/src/com/android/settings/network/InternetUpdater.java +++ b/src/com/android/settings/network/InternetUpdater.java @@ -20,6 +20,7 @@ import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET; import static android.net.NetworkCapabilities.TRANSPORT_WIFI; +import static androidx.lifecycle.Lifecycle.Event.ON_DESTROY; import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE; import static androidx.lifecycle.Lifecycle.Event.ON_RESUME; @@ -191,6 +192,12 @@ public class InternetUpdater implements AirplaneModeEnabler.OnAirplaneModeChange mContext.unregisterReceiver(mWifiStateReceiver); } + /** @OnLifecycleEvent(ON_DESTROY) */ + @OnLifecycleEvent(ON_DESTROY) + public void onDestroy() { + mAirplaneModeEnabler.close(); + } + @Override public void onAirplaneModeChanged(boolean isAirplaneModeOn) { fetchActiveNetwork(); diff --git a/tests/unit/src/com/android/settings/network/InternetUpdaterTest.java b/tests/unit/src/com/android/settings/network/InternetUpdaterTest.java index d61ca00473e..5ab2ce06aa3 100644 --- a/tests/unit/src/com/android/settings/network/InternetUpdaterTest.java +++ b/tests/unit/src/com/android/settings/network/InternetUpdaterTest.java @@ -107,6 +107,13 @@ public class InternetUpdaterTest { any(ConnectivityManager.NetworkCallback.class)); } + @Test + public void onDestroy_shouldCloseCallback() { + mInternetUpdater.onDestroy(); + + verify(mAirplaneModeEnabler).close(); + } + @Test public void updateInternetAvailable_wifiConnectedAndNoValidated_internetUnavailable() { final NetworkCapabilities networkCapabilities = new NetworkCapabilities.Builder() From fd41cce94b81e51617f8d2edc0927cc8717f60f2 Mon Sep 17 00:00:00 2001 From: lesl Date: Thu, 11 Mar 2021 22:15:29 +0800 Subject: [PATCH 15/19] wifi: Use new API for wifi data usage function For wifi, a old API: buildTemplateWifiWildcard will includes the merged wifi which is included to mobile usage. It should not double count again. Call new API: buildTemplateWifi with NetworkId: NetworkTemplate.WIFI_NETWORKID_ALL and null subscriberId to get non-merged wifi usage. Test: make RunSettingsRoboTests ROBOTEST_FILTER=AppDataUsageTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=AppDataUsagePreferenceControllerTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=DataUsageSummaryTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=DataUsageSummaryPreferenceTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=DataUsageSummaryPreferenceControllerTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=DataUsageUtilsTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=NetworkProviderSettingsTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=SettingsDumpServiceTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=WifiSettingsTest Test: make RunSettingsRoboTests ROBOTEST_FILTER=DataUsageInfoControllerTest Test: Manual Test, wifi data usage count correctly. Bug: 176396812 Merged-In: Ia4d8fa67ea3cb75c2d35be9ab60e5c5ffa391ffb Change-Id: Ia4d8fa67ea3cb75c2d35be9ab60e5c5ffa391ffb --- src/com/android/settings/SettingsDumpService.java | 4 +++- .../appinfo/AppDataUsagePreferenceController.java | 3 ++- .../settings/datausage/DataUsageSummary.java | 4 +++- .../datausage/DataUsageSummaryPreference.java | 7 +++++-- .../DataUsageSummaryPreferenceController.java | 3 ++- .../settings/datausage/DataUsageUtils.java | 3 ++- .../settings/datausage/lib/DataUsageLib.java | 3 ++- src/com/android/settings/wifi/WifiSettings.java | 6 +++--- src/com/android/settings/wifi/WifiSettings2.java | 6 +++--- .../settings/datausage/AppDataUsageTest.java | 15 +++++++++++---- .../datausage/DataUsageInfoControllerTest.java | 6 +++--- .../datausage/DataUsageSummaryPreferenceTest.java | 6 ++++-- 12 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/com/android/settings/SettingsDumpService.java b/src/com/android/settings/SettingsDumpService.java index 5e6ee9307a7..a935c18be01 100644 --- a/src/com/android/settings/SettingsDumpService.java +++ b/src/com/android/settings/SettingsDumpService.java @@ -120,7 +120,9 @@ public class SettingsDumpService extends Service { obj.put("cell", array); } if (packageManager.hasSystemFeature(FEATURE_WIFI)) { - obj.put("wifi", dumpDataUsage(NetworkTemplate.buildTemplateWifiWildcard(), controller)); + obj.put("wifi", dumpDataUsage( + NetworkTemplate.buildTemplateWifi( + NetworkTemplate.WIFI_NETWORKID_ALL, null /* subscriberId */), controller)); } if (packageManager.hasSystemFeature(FEATURE_ETHERNET)) { diff --git a/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java b/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java index a3ea4784b28..f321d720df4 100644 --- a/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java @@ -139,7 +139,8 @@ public class AppDataUsagePreferenceController extends AppInfoPreferenceControlle return NetworkTemplate.buildTemplateMobileWildcard(); } if (DataUsageUtils.hasWifiRadio(context)) { - return NetworkTemplate.buildTemplateWifiWildcard(); + return NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */); } return NetworkTemplate.buildTemplateEthernet(); } diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java index 9d9bf9c65ae..83b1fb98a5a 100644 --- a/src/com/android/settings/datausage/DataUsageSummary.java +++ b/src/com/android/settings/datausage/DataUsageSummary.java @@ -180,7 +180,9 @@ public class DataUsageSummary extends DataUsageBaseFragment implements DataUsage void addWifiSection() { TemplatePreferenceCategory category = (TemplatePreferenceCategory) inflatePreferences(R.xml.data_usage_wifi); - category.setTemplate(NetworkTemplate.buildTemplateWifiWildcard(), 0, services); + category.setTemplate( + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */), 0, services); } private void addEthernetSection() { diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreference.java b/src/com/android/settings/datausage/DataUsageSummaryPreference.java index 93df2f1bcdb..bca1b71cc17 100644 --- a/src/com/android/settings/datausage/DataUsageSummaryPreference.java +++ b/src/com/android/settings/datausage/DataUsageSummaryPreference.java @@ -224,7 +224,8 @@ public class DataUsageSummaryPreference extends Preference { static void launchWifiDataUsage(Context context) { final Bundle args = new Bundle(1); args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, - NetworkTemplate.buildTemplateWifiWildcard()); + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */)); args.putInt(DataUsageList.EXTRA_NETWORK_TYPE, ConnectivityManager.TYPE_WIFI); final SubSettingLauncher launcher = new SubSettingLauncher(context) .setArguments(args) @@ -364,7 +365,9 @@ public class DataUsageSummaryPreference extends Preference { @VisibleForTesting long getHistoricalUsageLevel() { final DataUsageController controller = new DataUsageController(getContext()); - return controller.getHistoricalUsageLevel(NetworkTemplate.buildTemplateWifiWildcard()); + return controller.getHistoricalUsageLevel( + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */)); } } diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java index 51f5213a547..f9776f31c23 100644 --- a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java +++ b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java @@ -138,7 +138,8 @@ public class DataUsageSummaryPreferenceController extends TelephonyBasePreferenc mDefaultTemplate = DataUsageLib.getMobileTemplate(context, subscriptionId); } else if (DataUsageUtils.hasWifiRadio(context)) { mDataUsageTemplate = R.string.wifi_data_template; - mDefaultTemplate = NetworkTemplate.buildTemplateWifiWildcard(); + mDefaultTemplate = NetworkTemplate.buildTemplateWifi( + NetworkTemplate.WIFI_NETWORKID_ALL, null /* subscriberId */); } else { mDataUsageTemplate = R.string.ethernet_data_template; mDefaultTemplate = DataUsageUtils.getDefaultTemplate(context, subscriptionId); diff --git a/src/com/android/settings/datausage/DataUsageUtils.java b/src/com/android/settings/datausage/DataUsageUtils.java index 7da69cb9352..fae53ecd2e9 100644 --- a/src/com/android/settings/datausage/DataUsageUtils.java +++ b/src/com/android/settings/datausage/DataUsageUtils.java @@ -184,7 +184,8 @@ public final class DataUsageUtils extends com.android.settingslib.net.DataUsageU if (SubscriptionManager.isValidSubscriptionId(defaultSubId) && hasMobileData(context)) { return DataUsageLib.getMobileTemplate(context, defaultSubId); } else if (hasWifiRadio(context)) { - return NetworkTemplate.buildTemplateWifiWildcard(); + return NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */); } else { return NetworkTemplate.buildTemplateEthernet(); } diff --git a/src/com/android/settings/datausage/lib/DataUsageLib.java b/src/com/android/settings/datausage/lib/DataUsageLib.java index cf2ce1fcf76..786f0ecee2e 100644 --- a/src/com/android/settings/datausage/lib/DataUsageLib.java +++ b/src/com/android/settings/datausage/lib/DataUsageLib.java @@ -73,6 +73,7 @@ public class DataUsageLib { private static NetworkTemplate getMobileTemplateForSubId( TelephonyManager telephonyManager, int subId) { - return NetworkTemplate.buildTemplateMobileAll(telephonyManager.getSubscriberId(subId)); + return NetworkTemplate.buildTemplateMobileAll( + telephonyManager.getSubscriberId(subId)); } } diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index 1ba99a29f26..f2a4abbf7dc 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -272,9 +272,9 @@ public class WifiSettings extends RestrictedSettingsFragment mUserBadgeCache = new AccessPointPreference.UserBadgeCache(getPackageManager()); mDataUsagePreference = findPreference(PREF_KEY_DATA_USAGE); mDataUsagePreference.setVisible(DataUsageUtils.hasWifiRadio(getContext())); - mDataUsagePreference.setTemplate(NetworkTemplate.buildTemplateWifiWildcard(), - 0 /*subId*/, - null /*service*/); + mDataUsagePreference.setTemplate( + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */), 0 /*subId*/, null /*service*/); } @Override diff --git a/src/com/android/settings/wifi/WifiSettings2.java b/src/com/android/settings/wifi/WifiSettings2.java index 8fbe293211e..d791bc20572 100644 --- a/src/com/android/settings/wifi/WifiSettings2.java +++ b/src/com/android/settings/wifi/WifiSettings2.java @@ -249,9 +249,9 @@ public class WifiSettings2 extends RestrictedSettingsFragment mStatusMessagePreference = findPreference(PREF_KEY_STATUS_MESSAGE); mDataUsagePreference = findPreference(PREF_KEY_DATA_USAGE); mDataUsagePreference.setVisible(DataUsageUtils.hasWifiRadio(getContext())); - mDataUsagePreference.setTemplate(NetworkTemplate.buildTemplateWifiWildcard(), - 0 /*subId*/, - null /*service*/); + mDataUsagePreference.setTemplate( + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */), 0 /*subId*/, null /*service*/); } @Override diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java index ded7d106ec2..f75b7f030d6 100644 --- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java +++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java @@ -18,6 +18,7 @@ package com.android.settings.datausage; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; @@ -309,7 +310,8 @@ public class AppDataUsageTest { ReflectionHelpers.setField(mFragment, "mContext", context); ReflectionHelpers.setField(mFragment, "mAppItem", appItem); ReflectionHelpers.setField(mFragment, "mTemplate", - NetworkTemplate.buildTemplateWifiWildcard()); + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */)); final long end = System.currentTimeMillis(); final long start = end - (DateUtils.WEEK_IN_MILLIS * 4); @@ -334,7 +336,8 @@ public class AppDataUsageTest { ReflectionHelpers.setField(mFragment, "mContext", context); ReflectionHelpers.setField(mFragment, "mAppItem", appItem); ReflectionHelpers.setField(mFragment, "mTemplate", - NetworkTemplate.buildTemplateWifiWildcard()); + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */)); final long end = System.currentTimeMillis(); final long start = end - (DateUtils.WEEK_IN_MILLIS * 4); @@ -365,7 +368,8 @@ public class AppDataUsageTest { ReflectionHelpers.setField(mFragment, "mCycles", testCycles); ReflectionHelpers.setField(mFragment, "mAppItem", appItem); ReflectionHelpers.setField(mFragment, "mTemplate", - NetworkTemplate.buildTemplateWifiWildcard()); + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */)); final NetworkCycleDataForUidLoader loader = (NetworkCycleDataForUidLoader) mFragment.mUidDataCallbacks.onCreateLoader(0 /* id */, Bundle.EMPTY /* args */); @@ -436,6 +440,9 @@ public class AppDataUsageTest { mFragment.onCreate(Bundle.EMPTY); assertThat(mFragment.mTemplate.getMatchRule()) - .isEqualTo(NetworkTemplate.MATCH_WIFI_WILDCARD); + .isEqualTo(NetworkTemplate.MATCH_WIFI); + assertNull(mFragment.mTemplate.getSubscriberId()); + assertThat(mFragment.mTemplate.getNetworkId()) + .isEqualTo(NetworkTemplate.WIFI_NETWORKID_ALL); } } diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageInfoControllerTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageInfoControllerTest.java index 6c892019433..747f31c4fd2 100644 --- a/tests/robotests/src/com/android/settings/datausage/DataUsageInfoControllerTest.java +++ b/tests/robotests/src/com/android/settings/datausage/DataUsageInfoControllerTest.java @@ -78,8 +78,8 @@ public class DataUsageInfoControllerTest { } private NetworkPolicy getDefaultNetworkPolicy() { - NetworkTemplate template = - new NetworkTemplate(NetworkTemplate.MATCH_WIFI_WILDCARD, null, null); + NetworkTemplate template = NetworkTemplate.buildTemplateWifi( + NetworkTemplate.WIFI_NETWORKID_ALL, null /* subscriberId */); int cycleDay = -1; String cycleTimezone = "UTC"; long warningBytes = -1; @@ -141,4 +141,4 @@ public class DataUsageInfoControllerTest { mInfoController.updateDataLimit(info, policy); assertThat(info.limitLevel).isEqualTo(policy.limitBytes); } -} \ No newline at end of file +} diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java index 35e6b1d3104..bfe54a98390 100644 --- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java @@ -511,11 +511,13 @@ public class DataUsageSummaryPreferenceTest { final Bundle expect = new Bundle(1); expect.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, - NetworkTemplate.buildTemplateWifiWildcard()); + NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */)); final Bundle actual = startedIntent .getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS); assertThat((NetworkTemplate) actual.getParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE)) - .isEqualTo(NetworkTemplate.buildTemplateWifiWildcard()); + .isEqualTo(NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL, + null /* subscriberId */)); assertThat(startedIntent.getIntExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, 0)) .isEqualTo(R.string.wifi_data_usage); From 953b7e3bf56ddc226f266f6f7fbdf131445b4c5a Mon Sep 17 00:00:00 2001 From: ykhung Date: Thu, 6 May 2021 10:22:55 +0800 Subject: [PATCH 16/19] Add abnormal interpolation info to log unexpected conditions Bug: 184807417 Test: make SettingsRoboTests Change-Id: I11156c85b6b955dd505b41a9a41be0756638f1dd --- src/com/android/settings/fuelgauge/BatteryChartView.java | 4 ++++ src/com/android/settings/fuelgauge/BatteryHistEntry.java | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/src/com/android/settings/fuelgauge/BatteryChartView.java b/src/com/android/settings/fuelgauge/BatteryChartView.java index 8e83cb9ec49..e2e7f8f7519 100644 --- a/src/com/android/settings/fuelgauge/BatteryChartView.java +++ b/src/com/android/settings/fuelgauge/BatteryChartView.java @@ -111,6 +111,10 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick /** Sets all levels value to draw the trapezoid shape */ public void setLevels(int[] levels) { + if (levels == null) { + mLevels = null; + return; + } // We should provide trapezoid count + 1 data to draw all trapezoids. mLevels = levels.length == mTrapezoidCount + 1 ? levels : null; setClickable(false); diff --git a/src/com/android/settings/fuelgauge/BatteryHistEntry.java b/src/com/android/settings/fuelgauge/BatteryHistEntry.java index 6130fffc4a0..d83d8149691 100644 --- a/src/com/android/settings/fuelgauge/BatteryHistEntry.java +++ b/src/com/android/settings/fuelgauge/BatteryHistEntry.java @@ -16,6 +16,7 @@ package com.android.settings.fuelgauge; import android.content.ContentValues; import android.database.Cursor; import android.os.BatteryConsumer; +import android.util.Log; import java.time.Duration; @@ -310,6 +311,14 @@ public class BatteryHistEntry { lowerHistEntry == null ? 0 : lowerHistEntry.mBackgroundUsageTimeInMs, upperHistEntry.mBackgroundUsageTimeInMs, ratio); + // Checks whether there is any abnoaml cases! + if (upperHistEntry.mConsumePower < consumePower + || upperHistEntry.mForegroundUsageTimeInMs < foregroundUsageTimeInMs + || upperHistEntry.mBackgroundUsageTimeInMs < backgroundUsageTimeInMs) { + Log.w(TAG, String.format( + "abnormal interpolation:\nupper:%s\nlower:%s", + upperHistEntry, lowerHistEntry)); + } final double batteryLevel = lowerHistEntry == null ? upperHistEntry.mBatteryLevel From efbcc69cc4d64ae36bfe1ef3403fffb1dfe0c604 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Thu, 6 May 2021 00:24:37 +0800 Subject: [PATCH 17/19] Fix inconsist color filling on collapsing toolbar Some pages are updating the background color for action bar after action bar is created, which will break the animation of collapsing toolbar. It also causes the different color filled in the status bar and collapsing toolbar area separately. Removing the styleActionbar method from EntityHeaderController can fix this issue. Fix: 187019164 Test: robotests && visual verified 1) Settings -> Apps -> See all apps -> pick up either app -> Mobile data & Wi-Fi 2) Scrolling the content and see if the toolbar has the different color between status bar and toolbar Change-Id: Ic0842b9e6c48662872694534a3696c4b8900481f --- .../AppHeaderViewPreferenceController.java | 11 ++----- .../HeaderPreferenceController.java | 9 ------ .../DataUsageSummaryPreferenceController.java | 1 - ...onversationHeaderPreferenceController.java | 3 -- .../app/HeaderPreferenceController.java | 3 -- .../widget/EntityHeaderController.java | 31 ------------------- ...AppHeaderViewPreferenceControllerTest.java | 21 ------------- ...aUsageSummaryPreferenceControllerTest.java | 2 -- ...BatteryHeaderPreferenceControllerTest.java | 16 ---------- .../widget/EntityHeaderControllerTest.java | 26 ---------------- 10 files changed, 2 insertions(+), 121 deletions(-) diff --git a/src/com/android/settings/applications/appinfo/AppHeaderViewPreferenceController.java b/src/com/android/settings/applications/appinfo/AppHeaderViewPreferenceController.java index c9f0e31f171..285493a16c9 100644 --- a/src/com/android/settings/applications/appinfo/AppHeaderViewPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppHeaderViewPreferenceController.java @@ -29,11 +29,10 @@ import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.LifecycleObserver; -import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.widget.LayoutPreference; public class AppHeaderViewPreferenceController extends BasePreferenceController - implements AppInfoDashboardFragment.Callback, LifecycleObserver, OnStart { + implements AppInfoDashboardFragment.Callback, LifecycleObserver { private static final String KEY_HEADER = "header_view"; @@ -67,19 +66,13 @@ public class AppHeaderViewPreferenceController extends BasePreferenceController final Activity activity = mParent.getActivity(); mEntityHeaderController = EntityHeaderController .newInstance(activity, mParent, mHeader.findViewById(R.id.entity_header)) + .setRecyclerView(mParent.getListView(), mLifecycle) .setPackageName(mPackageName) .setButtonActions(EntityHeaderController.ActionType.ACTION_NONE, EntityHeaderController.ActionType.ACTION_NONE) .bindHeaderButtons(); } - @Override - public void onStart() { - mEntityHeaderController - .setRecyclerView(mParent.getListView(), mLifecycle) - .styleActionBar(mParent.getActivity()); - } - @Override public void refreshUi() { setAppLabelAndIcon(mParent.getPackageInfo(), mParent.getAppEntry()); diff --git a/src/com/android/settings/applications/specialaccess/notificationaccess/HeaderPreferenceController.java b/src/com/android/settings/applications/specialaccess/notificationaccess/HeaderPreferenceController.java index 1144f12132d..8ccf7ed7eef 100644 --- a/src/com/android/settings/applications/specialaccess/notificationaccess/HeaderPreferenceController.java +++ b/src/com/android/settings/applications/specialaccess/notificationaccess/HeaderPreferenceController.java @@ -25,7 +25,6 @@ import android.util.IconDrawableFactory; import android.view.View; import androidx.lifecycle.LifecycleObserver; -import androidx.lifecycle.OnLifecycleEvent; import androidx.preference.PreferenceScreen; import com.android.settings.R; @@ -36,7 +35,6 @@ import com.android.settings.notification.NotificationBackend; import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.bluetooth.LocalBluetoothManager; -import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.widget.LayoutPreference; public class HeaderPreferenceController extends BasePreferenceController @@ -127,11 +125,4 @@ public class HeaderPreferenceController extends BasePreferenceController .done(mFragment.getActivity(), mContext); pref.findViewById(R.id.entity_header).setVisibility(View.VISIBLE); } - - @OnLifecycleEvent(Lifecycle.Event.ON_START) - public void onStart() { - if (mHeaderController != null) { - mHeaderController.styleActionBar(mFragment.getActivity()); - } - } } diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java index 73f8f45909c..47f1ea170d1 100644 --- a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java +++ b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java @@ -178,7 +178,6 @@ public class DataUsageSummaryPreferenceController extends TelephonyBasePreferenc } RecyclerView view = mFragment.getListView(); mEntityHeaderController.setRecyclerView(view, mLifecycle); - mEntityHeaderController.styleActionBar((Activity) mContext); } @VisibleForTesting diff --git a/src/com/android/settings/notification/app/ConversationHeaderPreferenceController.java b/src/com/android/settings/notification/app/ConversationHeaderPreferenceController.java index 73659b8bf39..f99a56aabda 100644 --- a/src/com/android/settings/notification/app/ConversationHeaderPreferenceController.java +++ b/src/com/android/settings/notification/app/ConversationHeaderPreferenceController.java @@ -122,9 +122,6 @@ public class ConversationHeaderPreferenceController extends NotificationPreferen @OnLifecycleEvent(Lifecycle.Event.ON_START) public void onStart() { mStarted = true; - if (mHeaderController != null) { - mHeaderController.styleActionBar(mFragment.getActivity()); - } } @VisibleForTesting diff --git a/src/com/android/settings/notification/app/HeaderPreferenceController.java b/src/com/android/settings/notification/app/HeaderPreferenceController.java index 4e9c039475c..974ac79be08 100644 --- a/src/com/android/settings/notification/app/HeaderPreferenceController.java +++ b/src/com/android/settings/notification/app/HeaderPreferenceController.java @@ -121,9 +121,6 @@ public class HeaderPreferenceController extends NotificationPreferenceController @OnLifecycleEvent(Lifecycle.Event.ON_START) public void onStart() { mStarted = true; - if (mHeaderController != null) { - mHeaderController.styleActionBar(mFragment.getActivity()); - } } @VisibleForTesting diff --git a/src/com/android/settings/widget/EntityHeaderController.java b/src/com/android/settings/widget/EntityHeaderController.java index 91a20b35109..791d6ca5640 100644 --- a/src/com/android/settings/widget/EntityHeaderController.java +++ b/src/com/android/settings/widget/EntityHeaderController.java @@ -18,15 +18,12 @@ package com.android.settings.widget; import android.annotation.IdRes; import android.annotation.UserIdInt; -import android.app.ActionBar; import android.app.Activity; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; -import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.os.Bundle; import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; @@ -48,7 +45,6 @@ import com.android.settings.applications.appinfo.AppInfoDashboardFragment; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.core.lifecycle.Lifecycle; -import com.android.settingslib.widget.ActionBarShadowController; import com.android.settingslib.widget.LayoutPreference; import java.lang.annotation.Retention; @@ -244,7 +240,6 @@ public class EntityHeaderController { * Done mutating entity header, rebinds everything (optionally skip rebinding buttons). */ public View done(Activity activity, boolean rebindActions) { - styleActionBar(activity); ImageView iconView = mHeader.findViewById(R.id.entity_header_icon); if (iconView != null) { iconView.setImageDrawable(mIcon); @@ -302,32 +297,6 @@ public class EntityHeaderController { return; } - /** - * Styles the action bar (elevation, scrolling behaviors, color, etc). - *

- * This method must be called after {@link Fragment#onCreate(Bundle)}. - */ - public EntityHeaderController styleActionBar(Activity activity) { - if (activity == null) { - Log.w(TAG, "No activity, cannot style actionbar."); - return this; - } - final ActionBar actionBar = activity.getActionBar(); - if (actionBar == null) { - Log.w(TAG, "No actionbar, cannot style actionbar."); - return this; - } - actionBar.setBackgroundDrawable( - new ColorDrawable( - Utils.getColorAttrDefaultColor(activity, android.R.attr.colorPrimaryDark))); - actionBar.setElevation(0); - if (mRecyclerView != null && mLifecycle != null) { - ActionBarShadowController.attachToView(mActivity, mLifecycle, mRecyclerView); - } - - return this; - } - /** * Done mutating entity header, rebinds everything. */ diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppHeaderViewPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppHeaderViewPreferenceControllerTest.java index 6684e1ad5b5..c5ed4593b65 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/AppHeaderViewPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppHeaderViewPreferenceControllerTest.java @@ -16,23 +16,16 @@ package com.android.settings.applications.appinfo; -import static androidx.lifecycle.Lifecycle.Event.ON_START; - import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; -import android.app.ActionBar; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; -import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; @@ -116,18 +109,4 @@ public class AppHeaderViewPreferenceControllerTest { assertThat(title).isNotNull(); assertThat(title.getText()).isEqualTo(appLabel); } - - @Test - public void onStart_shouldStyleActionBar() { - final ActionBar actionBar = mock(ActionBar.class); - when(mActivity.getActionBar()).thenReturn(actionBar); - - mController.displayPreference(mScreen); - - verifyZeroInteractions(actionBar); - - mLifecycle.handleLifecycleEvent(ON_START); - - verify(actionBar).setBackgroundDrawable(any(Drawable.class)); - } } diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceControllerTest.java index 6a7f2374380..71d5d7e8f7f 100644 --- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceControllerTest.java @@ -29,7 +29,6 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -386,7 +385,6 @@ public class DataUsageSummaryPreferenceControllerTest { verify(mHeaderController) .setRecyclerView(any(RecyclerView.class), any(Lifecycle.class)); - verify(mHeaderController).styleActionBar(any(Activity.class)); } private DataUsageController.DataUsageInfo createTestDataUsageInfo(long now) { diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java index e36a8318c0a..6313da22805 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java @@ -17,13 +17,9 @@ package com.android.settings.fuelgauge; -import static androidx.lifecycle.Lifecycle.Event.ON_START; - import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -41,7 +37,6 @@ import android.text.TextUtils; import androidx.lifecycle.LifecycleOwner; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceScreen; -import androidx.recyclerview.widget.RecyclerView; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; @@ -283,17 +278,6 @@ public class BatteryHeaderPreferenceControllerTest { verify(mBatteryUsageProgressBarPref).setBottomSummary(null); } - @Test - public void onStart_shouldStyleActionBar() { - when(mEntityHeaderController.setRecyclerView(nullable(RecyclerView.class), eq(mLifecycle))) - .thenReturn(mEntityHeaderController); - - mController.displayPreference(mPreferenceScreen); - mLifecycle.handleLifecycleEvent(ON_START); - - verify(mEntityHeaderController).styleActionBar(mActivity); - } - @Test public void quickUpdateHeaderPreference_onlyUpdateBatteryLevelAndChargingState() { mController.quickUpdateHeaderPreference(); diff --git a/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java b/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java index f73d0f7a206..cac1b34d4ef 100644 --- a/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java +++ b/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java @@ -26,13 +26,11 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.app.ActionBar; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.ResolveInfo; -import android.graphics.drawable.ColorDrawable; import android.os.UserHandle; import android.view.LayoutInflater; import android.view.View; @@ -302,30 +300,6 @@ public class EntityHeaderControllerTest { .isEqualTo(View.GONE); } - @Test - public void styleActionBar_invalidObjects_shouldNotCrash() { - mController = EntityHeaderController.newInstance(mActivity, mFragment, null); - mController.styleActionBar(null); - - when(mActivity.getActionBar()).thenReturn(null); - mController.styleActionBar(mActivity); - - verify(mActivity).getActionBar(); - } - - @Test - public void styleActionBar_setElevationAndBackground() { - final ActionBar actionBar = mActivity.getActionBar(); - - mController = EntityHeaderController.newInstance(mActivity, mFragment, null); - mController.styleActionBar(mActivity); - - verify(actionBar).setElevation(0); - // Enforce a color drawable as background here, as image based drawables might not be - // wide enough to cover entire action bar. - verify(actionBar).setBackgroundDrawable(any(ColorDrawable.class)); - } - @Test public void initAppHeaderController_appHeaderNull_useFragmentContext() { mController = EntityHeaderController.newInstance(mActivity, mFragment, null); From dd452cdf0868bff32bb246b4a9e4e35b044df4c5 Mon Sep 17 00:00:00 2001 From: menghanli Date: Thu, 6 May 2021 16:00:53 +0800 Subject: [PATCH 18/19] Rename Tap assistance to Timing controls The "Tap assistance" section in a11y settings is specifically about the duration or delay of time-based controls. Rename the title to align to a wording that better calls that out. Bug: 186773417 Test: Manual testing Change-Id: I1116f42468ea2d2d9210f6e34041c02831879dc9 --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 742ed97ae2e..2079422d696 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5121,7 +5121,7 @@ Interaction controls - Tap assistance + Timing controls System controls From 924506e1317c8f3b42341816f6002d51418973ef Mon Sep 17 00:00:00 2001 From: menghanli Date: Mon, 3 May 2021 20:11:59 +0800 Subject: [PATCH 19/19] Fix Sound Amplifier does not have 'Open XXX' button SettingsMainSwitchPreference does not allow hide switch bar. For support this launch preference, we hide the SettingsMainSwitchPreference and add new preference into the list. Bug: 184711985 Test: Manual testing Change-Id: I293800e83aafb387e0bb0a4988af774b56f508e6 --- ...cessibilityActivityPreferenceFragment.java | 59 +++++++++++++------ 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java index 4db7857786f..fe08d6b5bde 100644 --- a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java +++ b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java @@ -30,34 +30,41 @@ import android.os.Bundle; import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; +import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.View; +import android.view.ViewGroup; import android.view.accessibility.AccessibilityManager; import androidx.annotation.Nullable; +import androidx.preference.Preference; import com.android.settings.R; -import com.android.settings.widget.SettingsMainSwitchPreference; +import java.util.ArrayList; import java.util.List; /** Fragment for providing open activity button. */ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeaturePreferenceFragment { private static final String TAG = "LaunchA11yActivity"; private static final String EMPTY_STRING = ""; + protected static final String KEY_LAUNCH_PREFERENCE = "launch_preference"; @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + final View view = super.onCreateView(inflater, container, savedInstanceState); - mToggleServiceSwitchPreference.hide(); - } + // Init new preference to replace the switch preference instead. + initLaunchPreference(); + removePreference(KEY_USE_SERVICE_PREFERENCE); + return view; + }; @Override protected void onPreferenceToggled(String preferenceKey, boolean enabled) { - logAccessibilityServiceEnabled(mComponentName, enabled); - launchShortcutTargetActivity(getPrefContext().getDisplayId(), mComponentName); + // Do nothing. } @Override @@ -99,16 +106,6 @@ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeature // accessibility service from this page. } - @Override - protected void updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference) { - final AccessibilityShortcutInfo info = getAccessibilityShortcutInfo(); - final String switchBarText = (info == null) ? EMPTY_STRING : getString( - R.string.accessibility_service_primary_open_title, - info.getActivityInfo().loadLabel(getPackageManager())); - - switchPreference.setTitle(switchBarText); - } - // IMPORTANT: Refresh the info since there are dynamically changing capabilities. private AccessibilityShortcutInfo getAccessibilityShortcutInfo() { final List infos = AccessibilityManager.getInstance( @@ -126,6 +123,34 @@ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeature return null; } + /** Customizes the order by preference key. */ + protected List getPreferenceOrderList() { + final List lists = new ArrayList<>(); + lists.add(KEY_ANIMATED_IMAGE); + lists.add(KEY_LAUNCH_PREFERENCE); + lists.add(KEY_GENERAL_CATEGORY); + lists.add(KEY_HTML_DESCRIPTION_PREFERENCE); + return lists; + } + + private void initLaunchPreference() { + final Preference launchPreference = new Preference(getPrefContext()); + launchPreference.setKey(KEY_LAUNCH_PREFERENCE); + + final AccessibilityShortcutInfo info = getAccessibilityShortcutInfo(); + final String switchBarText = (info == null) ? EMPTY_STRING : getString( + R.string.accessibility_service_primary_open_title, + info.getActivityInfo().loadLabel(getPackageManager())); + launchPreference.setTitle(switchBarText); + + launchPreference.setOnPreferenceClickListener(preference -> { + logAccessibilityServiceEnabled(mComponentName, /* enabled= */ true); + launchShortcutTargetActivity(getPrefContext().getDisplayId(), mComponentName); + return true; + }); + getPreferenceScreen().addPreference(launchPreference); + } + private void launchShortcutTargetActivity(int displayId, ComponentName name) { final Intent intent = new Intent(); final Bundle bundle = ActivityOptions.makeBasic().setLaunchDisplayId(displayId).toBundle();