From d62453d3defa6f40497fef014c5290b474af1a2e Mon Sep 17 00:00:00 2001 From: Jimmy Chen Date: Thu, 11 Oct 2018 18:03:51 +0800 Subject: [PATCH 01/11] p2p: do P2P factory reset for Network Reset Bug: 109866998 Test: * manual trigger network reset in below conditions: * trigger network reset with P2P on * trigger network reset with WiFi on, P2P off * trigger network reset with WiFi off * trigger network reset with WiFi off then do reboot * check groups shown in WiFi Direct page * use wpa_cli -i p2p0 list_network Test: RobotTest - make ROBOTEST_FILTER=ResetNetworkConfirmTest Change-Id: If5292e34cb9702d4319a4c9bbd867e0e5ed716a2 --- .../android/settings/ResetNetworkConfirm.java | 17 ++++++ .../settings/ResetNetworkConfirmTest.java | 16 ++++- .../shadow/ShadowWifiP2pManager.java | 61 +++++++++++++++++++ 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 tests/robotests/src/com/android/settings/testutils/shadow/ShadowWifiP2pManager.java diff --git a/src/com/android/settings/ResetNetworkConfirm.java b/src/com/android/settings/ResetNetworkConfirm.java index 2044af5228d..270f22b6f5c 100644 --- a/src/com/android/settings/ResetNetworkConfirm.java +++ b/src/com/android/settings/ResetNetworkConfirm.java @@ -26,6 +26,7 @@ import android.net.ConnectivityManager; import android.net.NetworkPolicyManager; import android.net.Uri; import android.net.wifi.WifiManager; +import android.net.wifi.p2p.WifiP2pManager; import android.os.AsyncTask; import android.os.Bundle; import android.os.RecoverySystem; @@ -129,6 +130,8 @@ public class ResetNetworkConfirm extends InstrumentedFragment { wifiManager.factoryReset(); } + p2pFactoryReset(context); + TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (telephonyManager != null) { @@ -180,6 +183,20 @@ public class ResetNetworkConfirm extends InstrumentedFragment { } } + @VisibleForTesting + void p2pFactoryReset(Context context) { + WifiP2pManager wifiP2pManager = (WifiP2pManager) + context.getSystemService(Context.WIFI_P2P_SERVICE); + if (wifiP2pManager != null) { + WifiP2pManager.Channel channel = wifiP2pManager.initialize( + context.getApplicationContext(), context.getMainLooper(), + null /* listener */); + if (channel != null) { + wifiP2pManager.factoryReset(channel, null /* listener */); + } + } + } + /** * Restore APN settings to default. */ diff --git a/tests/robotests/src/com/android/settings/ResetNetworkConfirmTest.java b/tests/robotests/src/com/android/settings/ResetNetworkConfirmTest.java index a10a4a41b10..6286cb95e28 100644 --- a/tests/robotests/src/com/android/settings/ResetNetworkConfirmTest.java +++ b/tests/robotests/src/com/android/settings/ResetNetworkConfirmTest.java @@ -24,6 +24,7 @@ import android.app.Activity; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowRecoverySystem; +import com.android.settings.testutils.shadow.ShadowWifiP2pManager; import org.junit.After; import org.junit.Before; @@ -35,7 +36,7 @@ import org.robolectric.Robolectric; import org.robolectric.annotation.Config; @RunWith(SettingsRobolectricTestRunner.class) -@Config(shadows = {ShadowRecoverySystem.class}) +@Config(shadows = {ShadowRecoverySystem.class, ShadowWifiP2pManager.class}) public class ResetNetworkConfirmTest { private Activity mActivity; @@ -52,6 +53,7 @@ public class ResetNetworkConfirmTest { @After public void tearDown() { ShadowRecoverySystem.reset(); + ShadowWifiP2pManager.reset(); } @Test @@ -76,4 +78,16 @@ public class ResetNetworkConfirmTest { assertThat(ShadowRecoverySystem.getWipeEuiccCalledCount()) .isEqualTo(0); } + + /** + * Test for WifiP2pManager factoryReset method. + */ + @Test + public void testResetNetworkData_resetP2p() { + + mResetNetworkConfirm.p2pFactoryReset(mActivity); + + assertThat(ShadowWifiP2pManager.getFactoryResetCount()) + .isEqualTo(1); + } } diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowWifiP2pManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowWifiP2pManager.java new file mode 100644 index 00000000000..8c383470ab6 --- /dev/null +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowWifiP2pManager.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.testutils.shadow; + +import android.net.wifi.p2p.WifiP2pManager; + +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; +import org.robolectric.annotation.Resetter; + +/** + * Shadown class for WifiP2pManager. + */ +@Implements(value = WifiP2pManager.class) +public class ShadowWifiP2pManager extends org.robolectric.shadows.ShadowWifiP2pManager { + + private static int sFactoryResetCount; + + /** + * factoryReset mock method. + */ + @Implementation + public void factoryReset(WifiP2pManager.Channel c, WifiP2pManager.ActionListener listener) { + if (c != null) { + sFactoryResetCount++; + } else { + throw new IllegalArgumentException("channel must be non-null."); + } + } + + /** + * Reset variables in shadow class. + */ + @Resetter + public static void reset() { + sFactoryResetCount = 0; + } + + /** + * Return the count of factoryReset called. + * + * @return the count of factoryReset called. + */ + public static int getFactoryResetCount() { + return sFactoryResetCount; + } +} From 1e4e80162e1d6b411626ff64da76321726c30128 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Sat, 10 Nov 2018 18:14:42 +0000 Subject: [PATCH 02/11] Revert "Revert "Add a new logger for StatsLog"" This reverts commit f14d4af767ba4b9ed6addb2bcc8dafe9e14c5946. Test: rebuild Reason for revert: Fixes build Change-Id: I003af1d9c973e58c09b1d8b9717c427febd6f809 --- .../SettingsMetricsFeatureProvider.java | 27 +++++ .../core/instrumentation/StatsLogWriter.java | 108 ++++++++++++++++++ .../gestures/WakeScreenGestureSettings.java | 8 +- .../ContextualCardsFragment.java | 4 +- .../telephony/MobileNetworkSettings.java | 4 +- .../telephony/NetworkSelectSettings.java | 5 +- .../gsm/AutoSelectPreferenceController.java | 4 +- ...NetworkSelectPagePreferenceController.java | 4 +- .../settings/overlay/FeatureFactoryImpl.java | 3 +- 9 files changed, 149 insertions(+), 18 deletions(-) create mode 100644 src/com/android/settings/core/instrumentation/SettingsMetricsFeatureProvider.java create mode 100644 src/com/android/settings/core/instrumentation/StatsLogWriter.java diff --git a/src/com/android/settings/core/instrumentation/SettingsMetricsFeatureProvider.java b/src/com/android/settings/core/instrumentation/SettingsMetricsFeatureProvider.java new file mode 100644 index 00000000000..93a5163645e --- /dev/null +++ b/src/com/android/settings/core/instrumentation/SettingsMetricsFeatureProvider.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.core.instrumentation; + +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; + +public class SettingsMetricsFeatureProvider extends MetricsFeatureProvider { + @Override + protected void installLogWriters() { + super.installLogWriters(); + mLoggerWriters.add(new StatsLogWriter()); + } +} diff --git a/src/com/android/settings/core/instrumentation/StatsLogWriter.java b/src/com/android/settings/core/instrumentation/StatsLogWriter.java new file mode 100644 index 00000000000..453d9e47e86 --- /dev/null +++ b/src/com/android/settings/core/instrumentation/StatsLogWriter.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.core.instrumentation; + +import android.app.settings.SettingsEnums; +import android.content.Context; +import android.util.Pair; +import android.util.StatsLog; + +import com.android.settingslib.core.instrumentation.LogWriter; + +public class StatsLogWriter implements LogWriter { + + @Override + public void visible(Context context, int attribution, int pageId) { + StatsLog.write(StatsLog.SETTINGS_UI_CHANGED /* Atom name */, + attribution, + SettingsEnums.PAGE_VISIBLE /* action */, + pageId, + null /* changedPreferenceKey */, + 0 /* changedPreferenceIntValue */); + } + + @Override + public void hidden(Context context, int pageId) { + StatsLog.write(StatsLog.SETTINGS_UI_CHANGED /* Atom name */, + SettingsEnums.PAGE_UNKNOWN /* attribution */, + SettingsEnums.PAGE_HIDE /* action */, + pageId, + null /* changedPreferenceKey */, + 0 /* changedPreferenceIntValue */); + } + + @Override + public void action(Context context, int action, Pair... taggedData) { + action(SettingsEnums.PAGE_UNKNOWN /* attribution */, + action, + SettingsEnums.PAGE_UNKNOWN /* pageId */, + null /* changedPreferenceKey */, + 0 /* changedPreferenceIntValue */); + } + + @Override + public void actionWithSource(Context context, int pageId, int action) { + action(SettingsEnums.PAGE_UNKNOWN /* attribution */, + action, + pageId /* pageId */, + null /* changedPreferenceKey */, + 0 /* changedPreferenceIntValue */); + } + + @Override + public void action(Context context, int action, int value) { + action(SettingsEnums.PAGE_UNKNOWN /* attribution */, + action, + SettingsEnums.PAGE_UNKNOWN /* pageId */, + null /* changedPreferenceKey */, + value /* changedPreferenceIntValue */); + } + + @Override + public void action(Context context, int action, boolean value) { + action(SettingsEnums.PAGE_UNKNOWN /* attribution */, + action, + SettingsEnums.PAGE_UNKNOWN /* pageId */, + null /* changedPreferenceKey */, + value ? 1 : 0 /* changedPreferenceIntValue */); + } + + @Override + public void action(Context context, int action, String pkg, + Pair... taggedData) { + action(SettingsEnums.PAGE_UNKNOWN /* attribution */, + action, + SettingsEnums.PAGE_UNKNOWN /* pageId */, + pkg /* changedPreferenceKey */, + 1 /* changedPreferenceIntValue */); + } + + @Override + public void count(Context context, String name, int value) { + // No-op + } + + @Override + public void action(int attribution, int action, int pageId, String key, int value) { + StatsLog.write(StatsLog.SETTINGS_UI_CHANGED /* atomName */, + attribution, + action, + pageId, + key, + value); + } +} diff --git a/src/com/android/settings/gestures/WakeScreenGestureSettings.java b/src/com/android/settings/gestures/WakeScreenGestureSettings.java index 708ac0198bc..b8a782ac95a 100644 --- a/src/com/android/settings/gestures/WakeScreenGestureSettings.java +++ b/src/com/android/settings/gestures/WakeScreenGestureSettings.java @@ -16,16 +16,12 @@ package com.android.settings.gestures; +import android.app.settings.SettingsEnums; import android.content.Context; -import android.content.SharedPreferences; import android.provider.SearchIndexableResource; -import com.android.internal.hardware.AmbientDisplayConfiguration; -import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; -import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; -import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.search.SearchIndexable; @@ -42,7 +38,7 @@ public class WakeScreenGestureSettings extends DashboardFragment { @Override public int getMetricsCategory() { - return MetricsProto.MetricsEvent.SETTINGS_GESTURE_WAKE_SCREEN; + return SettingsEnums.SETTINGS_GESTURE_WAKE_SCREEN; } @Override diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java b/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java index 29eea4b7fa2..5f9bf0df6ac 100644 --- a/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java @@ -18,6 +18,7 @@ package com.android.settings.homepage.contextualcards; import static com.android.settings.homepage.contextualcards.ContextualCardsAdapter.SPAN_COUNT; +import android.app.settings.SettingsEnums; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -26,7 +27,6 @@ import android.view.ViewGroup; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.core.InstrumentedFragment; @@ -69,6 +69,6 @@ public class ContextualCardsFragment extends InstrumentedFragment { @Override public int getMetricsCategory() { - return MetricsEvent.SETTINGS_HOMEPAGE; + return SettingsEnums.SETTINGS_HOMEPAGE; } } diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java index ebc38e450cc..623b6de9920 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java +++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java @@ -17,6 +17,7 @@ package com.android.settings.network.telephony; import android.app.Activity; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; import android.os.Bundle; @@ -31,7 +32,6 @@ import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; -import com.android.internal.logging.nano.MetricsProto; import com.android.internal.telephony.TelephonyIntents; import com.android.settings.R; import com.android.settings.dashboard.RestrictedDashboardFragment; @@ -75,7 +75,7 @@ public class MobileNetworkSettings extends RestrictedDashboardFragment { @Override public int getMetricsCategory() { - return MetricsProto.MetricsEvent.MOBILE_NETWORK; + return SettingsEnums.MOBILE_NETWORK; } /** diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java index 9df9d1eff2a..3b9b2f57190 100644 --- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java +++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java @@ -15,9 +15,8 @@ */ package com.android.settings.network.telephony; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.MOBILE_NETWORK_SELECT; - import android.app.Activity; +import android.app.settings.SettingsEnums; import android.content.Context; import android.os.Bundle; import android.os.Handler; @@ -203,7 +202,7 @@ public class NetworkSelectSettings extends DashboardFragment { @Override public int getMetricsCategory() { - return MOBILE_NETWORK_SELECT; + return SettingsEnums.MOBILE_NETWORK_SELECT; } private final Handler mHandler = new Handler() { diff --git a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java index 6899054dc28..0e47d9bdb64 100644 --- a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java +++ b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java @@ -16,6 +16,7 @@ package com.android.settings.network.telephony.gsm; +import android.app.settings.SettingsEnums; import android.content.Context; import android.os.Bundle; import android.os.PersistableBundle; @@ -26,7 +27,6 @@ import android.telephony.TelephonyManager; import androidx.preference.Preference; -import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.TogglePreferenceController; @@ -100,7 +100,7 @@ public class AutoSelectPreferenceController extends TogglePreferenceController { bundle.putInt(Settings.EXTRA_SUB_ID, mSubId); new SubSettingLauncher(mContext) .setDestination(NetworkSelectSettings.class.getName()) - .setSourceMetricsCategory(MetricsProto.MetricsEvent.MOBILE_NETWORK_SELECT) + .setSourceMetricsCategory(SettingsEnums.MOBILE_NETWORK_SELECT) .setTitleRes(R.string.choose_network_title) .setArguments(bundle) .launch(); diff --git a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java index 23de056aab6..ab25e15f672 100644 --- a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java +++ b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java @@ -16,6 +16,7 @@ package com.android.settings.network.telephony.gsm; +import android.app.settings.SettingsEnums; import android.content.Context; import android.os.Bundle; import android.provider.Settings; @@ -27,7 +28,6 @@ import android.text.TextUtils; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; -import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.SubSettingLauncher; @@ -88,7 +88,7 @@ public class OpenNetworkSelectPagePreferenceController extends BasePreferenceCon bundle.putInt(Settings.EXTRA_SUB_ID, mSubId); new SubSettingLauncher(mContext) .setDestination(NetworkSelectSettings.class.getName()) - .setSourceMetricsCategory(MetricsProto.MetricsEvent.MOBILE_NETWORK_SELECT) + .setSourceMetricsCategory(SettingsEnums.MOBILE_NETWORK_SELECT) .setTitleRes(R.string.choose_network_title) .setArguments(bundle) .launch(); diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java index 1f575293033..f74043f0264 100644 --- a/src/com/android/settings/overlay/FeatureFactoryImpl.java +++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java @@ -29,6 +29,7 @@ import com.android.settings.accounts.AccountFeatureProviderImpl; import com.android.settings.applications.ApplicationFeatureProvider; import com.android.settings.applications.ApplicationFeatureProviderImpl; import com.android.settings.connecteddevice.dock.DockUpdaterFeatureProviderImpl; +import com.android.settings.core.instrumentation.SettingsMetricsFeatureProvider; import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.dashboard.DashboardFeatureProviderImpl; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; @@ -80,7 +81,7 @@ public class FeatureFactoryImpl extends FeatureFactory { @Override public MetricsFeatureProvider getMetricsFeatureProvider() { if (mMetricsFeatureProvider == null) { - mMetricsFeatureProvider = new MetricsFeatureProvider(); + mMetricsFeatureProvider = new SettingsMetricsFeatureProvider(); } return mMetricsFeatureProvider; } From 80d03d1d2047c47abdf2f0dc7edc86ac8dbfa1c8 Mon Sep 17 00:00:00 2001 From: tmfang Date: Fri, 2 Nov 2018 16:53:47 +0800 Subject: [PATCH 03/11] Create a new top level Privacy entry This CL focuses on building up Privacy entry in Settings homepage. And also reuse some preferences in here. -App permission -Show password Test: robotest, visual Change-Id: I724ba4b4845fac933df0fca23a4e1c6afeb73362 Fixes: 116628158 --- color-check-baseline.xml | 54 +++++++++++--- res/drawable/ic_homepage_privacy.xml | 36 ++++++++++ res/drawable/ic_settings_privacy.xml | 31 ++++++++ res/values/colors.xml | 1 + res/values/strings.xml | 8 +++ res/xml/privacy_dashboard_settings.xml | 45 ++++++++++++ res/xml/top_level_settings.xml | 8 +++ .../core/gateway/SettingsGateway.java | 2 + .../dashboard/DashboardFragmentRegistry.java | 3 + .../privacy/PrivacyDashboardFragment.java | 70 +++++++++++++++++++ 10 files changed, 247 insertions(+), 11 deletions(-) create mode 100644 res/drawable/ic_homepage_privacy.xml create mode 100644 res/drawable/ic_settings_privacy.xml create mode 100644 res/xml/privacy_dashboard_settings.xml create mode 100644 src/com/android/settings/privacy/PrivacyDashboardFragment.java diff --git a/color-check-baseline.xml b/color-check-baseline.xml index 3672e2d7a84..365cbe71abd 100644 --- a/color-check-baseline.xml +++ b/color-check-baseline.xml @@ -1245,6 +1245,22 @@ column="5"/> + + + + @@ -1273,7 +1289,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1289,7 +1305,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1305,7 +1321,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1321,7 +1337,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1337,7 +1353,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1353,7 +1369,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1369,7 +1385,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1385,7 +1401,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1401,7 +1417,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1417,7 +1433,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1901,6 +1917,22 @@ column="17"/> + + + + + + + + + + + + + + + + + diff --git a/res/drawable/ic_settings_privacy.xml b/res/drawable/ic_settings_privacy.xml new file mode 100644 index 00000000000..fcad83ab33b --- /dev/null +++ b/res/drawable/ic_settings_privacy.xml @@ -0,0 +1,31 @@ + + + + + + + diff --git a/res/values/colors.xml b/res/values/colors.xml index 11c1aaf4437..f55eb1a7813 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -127,6 +127,7 @@ #1A73E8 #2EC7DC #9FA8DA + #5E97F6 @*android:color/material_red_A700 diff --git a/res/values/strings.xml b/res/values/strings.xml index f30c63d2f80..9e5cb2ade08 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6658,6 +6658,8 @@ + + @@ -10278,4 +10280,10 @@ Force desktop mode Force experimental desktop mode on secondary displays + + + Privacy + + Permission, permission usage + diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml new file mode 100644 index 00000000000..5d11936bf9f --- /dev/null +++ b/res/xml/privacy_dashboard_settings.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/xml/top_level_settings.xml b/res/xml/top_level_settings.xml index 69c4bb83cd2..03e32dcfb27 100644 --- a/res/xml/top_level_settings.xml +++ b/res/xml/top_level_settings.xml @@ -82,6 +82,14 @@ android:fragment="com.android.settings.deviceinfo.StorageSettings" settings:controller="com.android.settings.deviceinfo.TopLevelStoragePreferenceController"/> + + (PARENT_TO_CATEGORY_KEY_MAP.size()); diff --git a/src/com/android/settings/privacy/PrivacyDashboardFragment.java b/src/com/android/settings/privacy/PrivacyDashboardFragment.java new file mode 100644 index 00000000000..e3cd45768f6 --- /dev/null +++ b/src/com/android/settings/privacy/PrivacyDashboardFragment.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.privacy; + +import android.content.Context; +import android.provider.SearchIndexableResource; + +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.settings.R; +import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.security.ShowPasswordPreferenceController; +import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.search.SearchIndexable; + +import java.util.ArrayList; +import java.util.List; + +@SearchIndexable +public class PrivacyDashboardFragment extends DashboardFragment { + private static final String TAG = "PrivacyDashboardFragment"; + + @Override + public int getMetricsCategory() { + return MetricsEvent.TOP_LEVEL_PRIVACY; + } + + @Override + protected String getLogTag() { + return TAG; + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.privacy_dashboard_settings; + } + + @Override + public int getHelpResource() { + return R.string.help_url_privacy_dashboard; + } + + public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider() { + @Override + public List getXmlResourcesToIndex(Context context, + boolean enabled) { + final ArrayList result = new ArrayList<>(); + + final SearchIndexableResource sir = new SearchIndexableResource(context); + sir.xmlResId = R.xml.privacy_dashboard_settings; + result.add(sir); + return result; + } + }; +} From 7b235e3cfe9c720c427571fa213751cc2e06116b Mon Sep 17 00:00:00 2001 From: tmfang Date: Wed, 7 Nov 2018 12:06:34 +0800 Subject: [PATCH 04/11] Remove "Show password" in Security page "Show password" will be moved in Settings > Privacy. Since each of things should only exist in one place, we remove it in Security page. Test: visual Bug: 116628158 Change-Id: I9f9083b88d7a20faa9bd28ded2cf8c3b9a5622fd --- res/xml/security_dashboard_settings.xml | 14 -------------- .../settings/security/SecuritySettings.java | 1 - 2 files changed, 15 deletions(-) diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index ce271cc4752..38bc2d0d716 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -89,20 +89,6 @@ - - - - - - - diff --git a/src/com/android/settings/security/SecuritySettings.java b/src/com/android/settings/security/SecuritySettings.java index e00d3878890..aa347c8ab6b 100644 --- a/src/com/android/settings/security/SecuritySettings.java +++ b/src/com/android/settings/security/SecuritySettings.java @@ -108,7 +108,6 @@ public class SecuritySettings extends DashboardFragment { controllers.add(new ManageTrustAgentsPreferenceController(context)); controllers.add(new ScreenPinningPreferenceController(context)); controllers.add(new SimLockPreferenceController(context)); - controllers.add(new ShowPasswordPreferenceController(context)); controllers.add(new EncryptionStatusPreferenceController(context, PREF_KEY_ENCRYPTION_SECURITY_PAGE)); controllers.add(new TrustAgentListPreferenceController(context, host, lifecycle)); From e22bcd07fc8dc7b8bbbb6b6f6b8ce0c99aab0162 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Sun, 11 Nov 2018 19:43:54 -0800 Subject: [PATCH 05/11] Move EXTRA_SOURCE_METRICS_CATEGORY import. Bug: 117860032 Test: rebuild Change-Id: Iedf020183fe78cdf8206beb91e1222d821adbe63 --- src/com/android/settings/core/SubSettingLauncher.java | 4 ++-- .../settings/dashboard/DashboardFeatureProviderImpl.java | 5 ++--- .../com/android/settings/core/SubSettingLauncherTest.java | 4 ++-- .../settings/dashboard/DashboardFeatureProviderImplTest.java | 4 ++-- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/com/android/settings/core/SubSettingLauncher.java b/src/com/android/settings/core/SubSettingLauncher.java index 1df6bb98fe4..fb730b8e044 100644 --- a/src/com/android/settings/core/SubSettingLauncher.java +++ b/src/com/android/settings/core/SubSettingLauncher.java @@ -28,7 +28,7 @@ import androidx.fragment.app.Fragment; import com.android.settings.SettingsActivity; import com.android.settings.SubSettings; -import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; public class SubSettingLauncher { @@ -150,7 +150,7 @@ public class SubSettingLauncher { if (mLaunchRequest.sourceMetricsCategory < 0) { throw new IllegalArgumentException("Source metrics category must be set"); } - intent.putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY, + intent.putExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, mLaunchRequest.sourceMetricsCategory); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, mLaunchRequest.arguments); diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index 2267311a6e4..2a6bb388c32 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -45,7 +45,6 @@ import com.android.settings.dashboard.profileselector.ProfileSelectDialog; import com.android.settings.overlay.FeatureFactory; import com.android.settings.widget.RoundedHomepageIcon; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; -import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin; import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.TileUtils; @@ -126,7 +125,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { pref.setFragment(clsName); } else { final Intent intent = new Intent(tile.getIntent()); - intent.putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY, + intent.putExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, sourceMetricsCategory); if (action != null) { intent.setAction(action); @@ -160,7 +159,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { return; } final Intent intent = new Intent(tile.getIntent()) - .putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY, + .putExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, MetricsEvent.DASHBOARD_SUMMARY) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); launchIntentOrSelectProfile(activity, tile, intent, MetricsEvent.DASHBOARD_SUMMARY); diff --git a/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java b/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java index fd3b4a09424..d33d3fefc16 100644 --- a/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java +++ b/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java @@ -35,7 +35,7 @@ import androidx.fragment.app.FragmentActivity; import com.android.settings.SettingsActivity; import com.android.settings.testutils.SettingsRobolectricTestRunner; -import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import org.junit.Before; import org.junit.Test; @@ -103,7 +103,7 @@ public class SubSettingLauncherTest { assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)) .isEqualTo(SubSettingLauncherTest.class.getName()); assertThat(intent.getFlags()).isEqualTo(Intent.FLAG_ACTIVITY_NEW_TASK); - assertThat(intent.getIntExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY, -1)) + assertThat(intent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, -1)) .isEqualTo(123); } diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java index 634bdb7be13..d083a386c35 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java @@ -59,7 +59,7 @@ import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowThreadUtils; import com.android.settings.testutils.shadow.ShadowTileUtils; import com.android.settings.testutils.shadow.ShadowUserManager; -import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.drawer.CategoryKey; import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.TileUtils; @@ -338,7 +338,7 @@ public class DashboardFeatureProviderImplTest { final Intent launchIntent = shadowActivity.getNextStartedActivityForResult().intent; assertThat(launchIntent.getAction()) .isEqualTo("TestAction"); - assertThat(launchIntent.getIntExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY, 0)) + assertThat(launchIntent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, 0)) .isEqualTo(MetricsEvent.SETTINGS_GESTURES); } From ff47b303c490868248d06e9308ad561b4b2437b1 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Fri, 9 Nov 2018 14:52:42 -0800 Subject: [PATCH 06/11] Remove call to actionWithSource. Switch to generic action logging call. Bug: 117860032 Test: robotests Change-Id: Ibd7c59ac0ec8a9fa1b368b40f0453a1b42071377 --- .../appinfo/AppSettingPreferenceController.java | 7 +++++-- .../core/instrumentation/StatsLogWriter.java | 11 +---------- .../settings/dashboard/DashboardFragment.java | 6 ++++-- .../settings/widget/EntityHeaderController.java | 16 ++++++++-------- .../dashboard/DashboardFragmentTest.java | 11 +++++++---- 5 files changed, 25 insertions(+), 26 deletions(-) diff --git a/src/com/android/settings/applications/appinfo/AppSettingPreferenceController.java b/src/com/android/settings/applications/appinfo/AppSettingPreferenceController.java index f5ce18e0080..c08ae75fe3a 100644 --- a/src/com/android/settings/applications/appinfo/AppSettingPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppSettingPreferenceController.java @@ -18,6 +18,7 @@ package com.android.settings.applications.appinfo; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_OPEN_APP_SETTING; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; import android.content.pm.ResolveInfo; @@ -61,8 +62,10 @@ public class AppSettingPreferenceController extends AppInfoPreferenceControllerB return false; } FeatureFactory.getFactory(mContext).getMetricsFeatureProvider() - .actionWithSource(mContext, mParent.getMetricsCategory(), - ACTION_OPEN_APP_SETTING); + .action(SettingsEnums.PAGE_UNKNOWN, + ACTION_OPEN_APP_SETTING, + mParent.getMetricsCategory(), + null, 0); mContext.startActivity(intent); return true; } diff --git a/src/com/android/settings/core/instrumentation/StatsLogWriter.java b/src/com/android/settings/core/instrumentation/StatsLogWriter.java index 453d9e47e86..ed711bb9708 100644 --- a/src/com/android/settings/core/instrumentation/StatsLogWriter.java +++ b/src/com/android/settings/core/instrumentation/StatsLogWriter.java @@ -45,7 +45,7 @@ public class StatsLogWriter implements LogWriter { 0 /* changedPreferenceIntValue */); } - @Override + @Override public void action(Context context, int action, Pair... taggedData) { action(SettingsEnums.PAGE_UNKNOWN /* attribution */, action, @@ -54,15 +54,6 @@ public class StatsLogWriter implements LogWriter { 0 /* changedPreferenceIntValue */); } - @Override - public void actionWithSource(Context context, int pageId, int action) { - action(SettingsEnums.PAGE_UNKNOWN /* attribution */, - action, - pageId /* pageId */, - null /* changedPreferenceKey */, - 0 /* changedPreferenceIntValue */); - } - @Override public void action(Context context, int action, int value) { action(SettingsEnums.PAGE_UNKNOWN /* attribution */, diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index 0cda9eef411..56e9ee53cf6 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -16,6 +16,7 @@ package com.android.settings.dashboard; import android.app.Activity; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.res.TypedArray; import android.graphics.drawable.Icon; @@ -211,8 +212,9 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment @Override public void onExpandButtonClick() { - mMetricsFeatureProvider.actionWithSource(getContext(), getMetricsCategory(), - MetricsEvent.ACTION_SETTINGS_ADVANCED_BUTTON_EXPAND); + mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_ADVANCED_BUTTON_EXPAND, + getMetricsCategory(), null, 0); } protected boolean shouldForceRoundedIcon() { diff --git a/src/com/android/settings/widget/EntityHeaderController.java b/src/com/android/settings/widget/EntityHeaderController.java index b24a75bd639..5e8381931b7 100644 --- a/src/com/android/settings/widget/EntityHeaderController.java +++ b/src/com/android/settings/widget/EntityHeaderController.java @@ -23,6 +23,7 @@ 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; @@ -355,14 +356,13 @@ public class EntityHeaderController { if (mAppNotifPrefIntent == null) { button.setVisibility(View.GONE); } else { - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - FeatureFactory.getFactory(mAppContext).getMetricsFeatureProvider() - .actionWithSource(mAppContext, mMetricsCategory, - ACTION_OPEN_APP_NOTIFICATION_SETTING); - mFragment.startActivity(mAppNotifPrefIntent); - } + button.setOnClickListener(v -> { + FeatureFactory.getFactory(mAppContext).getMetricsFeatureProvider() + .action(SettingsEnums.PAGE_UNKNOWN, + ACTION_OPEN_APP_NOTIFICATION_SETTING, + mMetricsCategory, + null, 0); + mFragment.startActivity(mAppNotifPrefIntent); }); button.setVisibility(View.VISIBLE); } diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java index 8e9480d03a2..12154636b05 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java @@ -15,6 +15,8 @@ */ package com.android.settings.dashboard; +import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.DASHBOARD_CONTAINER; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.nullable; @@ -25,6 +27,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.pm.ActivityInfo; import android.os.Bundle; @@ -185,9 +188,9 @@ public class DashboardFragmentTest { = mFakeFeatureFactory.getMetricsFeatureProvider(); mTestFragment.onExpandButtonClick(); - verify(metricsFeatureProvider).actionWithSource( - RuntimeEnvironment.application, MetricsEvent.DASHBOARD_CONTAINER, - MetricsEvent.ACTION_SETTINGS_ADVANCED_BUTTON_EXPAND); + verify(metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_ADVANCED_BUTTON_EXPAND, + DASHBOARD_CONTAINER, null, 0); } public static class TestPreferenceController extends AbstractPreferenceController @@ -243,7 +246,7 @@ public class DashboardFragmentTest { @Override public int getMetricsCategory() { - return MetricsEvent.DASHBOARD_CONTAINER; + return DASHBOARD_CONTAINER; } @Override From b122b17b08e2d0d34c90b317bb11d3bb397504ab Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Mon, 12 Nov 2018 13:35:59 +0800 Subject: [PATCH 07/11] Fix phone muted conditional card not show up When DND mode is on, the phone muted conditional card will not appear. The phone muted event is independent of DND mode, so the condition of DND mode is taken out. Bug: 119312937 Test: visual Change-Id: Ie79dca1e4f607e666014512855922db10aa5a3d7 --- .../RingerMutedConditionController.java | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/src/com/android/settings/homepage/contextualcards/conditional/RingerMutedConditionController.java b/src/com/android/settings/homepage/contextualcards/conditional/RingerMutedConditionController.java index 09b75eb0d54..6dab6b83e61 100644 --- a/src/com/android/settings/homepage/contextualcards/conditional/RingerMutedConditionController.java +++ b/src/com/android/settings/homepage/contextualcards/conditional/RingerMutedConditionController.java @@ -16,12 +16,8 @@ package com.android.settings.homepage.contextualcards.conditional; -import static android.content.Context.NOTIFICATION_SERVICE; - -import android.app.NotificationManager; import android.content.Context; import android.media.AudioManager; -import android.provider.Settings; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; @@ -32,14 +28,11 @@ import java.util.Objects; public class RingerMutedConditionController extends AbnormalRingerConditionController { static final int ID = Objects.hash("RingerMutedConditionController"); - private final NotificationManager mNotificationManager; private final Context mAppContext; public RingerMutedConditionController(Context appContext, ConditionManager conditionManager) { super(appContext, conditionManager); mAppContext = appContext; - mNotificationManager = - (NotificationManager) appContext.getSystemService(NOTIFICATION_SERVICE); } @Override @@ -49,14 +42,7 @@ public class RingerMutedConditionController extends AbnormalRingerConditionContr @Override public boolean isDisplayable() { - int zen = Settings.Global.ZEN_MODE_OFF; - if (mNotificationManager != null) { - zen = mNotificationManager.getZenMode(); - } - final boolean zenModeEnabled = zen != Settings.Global.ZEN_MODE_OFF; - final boolean isSilent = - mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT; - return isSilent && !zenModeEnabled; + return mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT; } @Override From 1cc88be5042e1d6844957b55a25713f9d99583f0 Mon Sep 17 00:00:00 2001 From: Stanley Wang Date: Mon, 12 Nov 2018 14:16:19 +0800 Subject: [PATCH 08/11] Fix condition text is out of button highlighting. Change-Id: I1b70ee198f3aa14622e24ab11558e6301723cb36 Fixes: 112294276 Test: manual --- res/values/styles.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/res/values/styles.xml b/res/values/styles.xml index a954c5eb285..aa3412316c9 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -476,13 +476,11 @@ From e783c9c1e912d62bd98905461be7b04a793d985a Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Fri, 9 Nov 2018 14:58:09 -0800 Subject: [PATCH 09/11] Switch count logging to action. Bug: 117860032 Test: robotest Change-Id: I6882759b2f00ae43b42cb5e49c6dc50df90f7d63 --- .../core/instrumentation/StatsLogWriter.java | 5 ----- src/com/android/settings/widget/SwitchBar.java | 17 ++++++++++++++--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/core/instrumentation/StatsLogWriter.java b/src/com/android/settings/core/instrumentation/StatsLogWriter.java index ed711bb9708..2617259235d 100644 --- a/src/com/android/settings/core/instrumentation/StatsLogWriter.java +++ b/src/com/android/settings/core/instrumentation/StatsLogWriter.java @@ -82,11 +82,6 @@ public class StatsLogWriter implements LogWriter { 1 /* changedPreferenceIntValue */); } - @Override - public void count(Context context, String name, int value) { - // No-op - } - @Override public void action(int attribution, int action, int pageId, String key, int value) { StatsLog.write(StatsLog.SETTINGS_UI_CHANGED /* atomName */, diff --git a/src/com/android/settings/widget/SwitchBar.java b/src/com/android/settings/widget/SwitchBar.java index 8afba4050a9..6cde6440f22 100644 --- a/src/com/android/settings/widget/SwitchBar.java +++ b/src/com/android/settings/widget/SwitchBar.java @@ -18,6 +18,7 @@ package com.android.settings.widget; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Rect; @@ -143,8 +144,13 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC @Override public void onClick(View v) { if (mDisabledByAdmin) { - mMetricsFeatureProvider.count(mContext, - mMetricsTag + "/switch_bar|restricted", 1); + mMetricsFeatureProvider.action( + SettingsEnums.PAGE_UNKNOWN, + SettingsEnums.ACTION_SETTINGS_PREFERENCE_CHANGE, + SettingsEnums.PAGE_UNKNOWN, + mMetricsTag + "/switch_bar|restricted", + 1); + RestrictedLockUtils.sendShowAdminSupportDetailsIntent(context, mEnforcedAdmin); } @@ -287,7 +293,12 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (mLoggingIntialized) { - mMetricsFeatureProvider.count(mContext, mMetricsTag + "/switch_bar|" + isChecked, 1); + mMetricsFeatureProvider.action( + SettingsEnums.PAGE_UNKNOWN, + SettingsEnums.ACTION_SETTINGS_PREFERENCE_CHANGE, + SettingsEnums.PAGE_UNKNOWN, + mMetricsTag + "/switch_bar", + isChecked ? 1 : 0); } mLoggingIntialized = true; propagateChecked(isChecked); From 0b6a3000e0b53acbbef889372c7023a5115f1e87 Mon Sep 17 00:00:00 2001 From: Emily Chuang Date: Thu, 8 Nov 2018 22:21:01 +0800 Subject: [PATCH 10/11] Restrict the number of contextual cards shown in suggestion area. In order to make static IA visible in the homepage, we have to limit the number of cards. Bug: 118691898 Test: robotest Change-Id: Iefb8b7e874ec1334e93be2d196b7cb72624b17b0 --- res/layout/horizontal_divider.xml | 2 - res/layout/settings_homepage.xml | 1 - .../contextualcards/ContextualCardLoader.java | 40 +++++- .../ContextualCardLoaderTest.java | 128 +++++++++++++++++- 4 files changed, 165 insertions(+), 6 deletions(-) diff --git a/res/layout/horizontal_divider.xml b/res/layout/horizontal_divider.xml index a13442337ee..969854ea973 100644 --- a/res/layout/horizontal_divider.xml +++ b/res/layout/horizontal_divider.xml @@ -20,6 +20,4 @@ android:id="@+id/divider" android:layout_width="match_parent" android:layout_height="@dimen/horizontal_divider_height" - android:layout_marginTop="@dimen/horizontal_divider_margin_top" - android:layout_marginBottom="@dimen/horizontal_divider_margin_bottom" android:background="?android:attr/dividerHorizontal"/> \ No newline at end of file diff --git a/res/layout/settings_homepage.xml b/res/layout/settings_homepage.xml index 0140cedc117..f027d655349 100644 --- a/res/layout/settings_homepage.xml +++ b/res/layout/settings_homepage.xml @@ -27,5 +27,4 @@ android:layout_height="match_parent" android:layoutAnimation="@anim/layout_animation_fall_down"/> - diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java index f3fbf06310d..adfaf201cd6 100644 --- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java @@ -33,6 +33,8 @@ import androidx.annotation.VisibleForTesting; import androidx.slice.Slice; import com.android.settings.homepage.contextualcards.deviceinfo.BatterySlice; +import com.android.settings.homepage.contextualcards.slices.ConnectedDeviceSlice; +import com.android.settings.wifi.WifiSlice; import com.android.settingslib.utils.AsyncLoaderCompat; import java.util.ArrayList; @@ -40,9 +42,13 @@ import java.util.List; import java.util.stream.Collectors; public class ContextualCardLoader extends AsyncLoaderCompat> { - private static final String TAG = "ContextualCardLoader"; + + @VisibleForTesting + static final int DEFAULT_CARD_COUNT = 4; static final int CARD_CONTENT_LOADER_ID = 1; + private static final String TAG = "ContextualCardLoader"; + private Context mContext; public interface CardContentLoaderListener { @@ -77,7 +83,30 @@ public class ContextualCardLoader extends AsyncLoaderCompat } } } - return filterEligibleCards(result); + return getFinalDisplayableCards(result); + } + + @VisibleForTesting + List getFinalDisplayableCards(List candidates) { + List eligibleCards = filterEligibleCards(candidates); + eligibleCards = eligibleCards.stream().limit(DEFAULT_CARD_COUNT).collect( + Collectors.toList()); + + if (eligibleCards.size() <= 2 || getNumberOfLargeCard(eligibleCards) == 0) { + return eligibleCards; + } + + if (eligibleCards.size() == DEFAULT_CARD_COUNT) { + eligibleCards.remove(eligibleCards.size() - 1); + } + + if (getNumberOfLargeCard(eligibleCards) == 1) { + return eligibleCards; + } + + eligibleCards.remove(eligibleCards.size() - 1); + + return eligibleCards; } @VisibleForTesting @@ -139,6 +168,13 @@ public class ContextualCardLoader extends AsyncLoaderCompat return true; } + private int getNumberOfLargeCard(List cards) { + return (int) cards.stream() + .filter(card -> card.getSliceUri().equals(WifiSlice.WIFI_URI) + || card.getSliceUri().equals(ConnectedDeviceSlice.CONNECTED_DEVICE_URI)) + .count(); + } + private long getAppVersionCode() { try { return mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java index e98e36f56f4..598e23f6f7c 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java @@ -16,21 +16,31 @@ package com.android.settings.homepage.contextualcards; +import static com.android.settings.homepage.contextualcards.ContextualCardLoader.DEFAULT_CARD_COUNT; + import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; + import android.content.Context; import android.net.Uri; import com.android.settings.homepage.contextualcards.deviceinfo.BatterySlice; +import com.android.settings.homepage.contextualcards.slices.ConnectedDeviceSlice; import com.android.settings.slices.SettingsSliceProvider; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.wifi.WifiSlice; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; import org.robolectric.shadows.ShadowContentResolver; +import org.robolectric.shadows.ShadowLog; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -45,7 +55,7 @@ public class ContextualCardLoaderTest { @Before public void setUp() { mContext = RuntimeEnvironment.application; - mContextualCardLoader = new ContextualCardLoader(mContext); + mContextualCardLoader = spy(new ContextualCardLoader(mContext)); mProvider = new SettingsSliceProvider(); ShadowContentResolver.registerProviderInternal(SettingsSliceProvider.SLICE_AUTHORITY, mProvider); @@ -92,6 +102,57 @@ public class ContextualCardLoaderTest { getContextualCard(sliceUri))).isFalse(); } + @Test + public void getFinalDisplayableCards_twoEligibleCards_shouldShowAll() { + final List cards = getContextualCardList().stream().limit(2) + .collect(Collectors.toList()); + doReturn(cards).when(mContextualCardLoader).filterEligibleCards(any(List.class)); + + final List result = mContextualCardLoader.getFinalDisplayableCards(cards); + + assertThat(result).hasSize(cards.size()); + } + + @Test + public void getFinalDisplayableCards_fiveEligibleCardsNoLarge_shouldShowDefaultCardCount() { + final List fiveCards = getContextualCardListWithNoLargeCard(); + doReturn(fiveCards).when(mContextualCardLoader).filterEligibleCards(any(List.class)); + + final List result = mContextualCardLoader.getFinalDisplayableCards( + fiveCards); + + assertThat(result).hasSize(DEFAULT_CARD_COUNT); + } + + @Test + public void getFinalDisplayableCards_threeEligibleCardsOneLarge_shouldShowThreeCards() { + final List cards = getContextualCardList().stream().limit(2) + .collect(Collectors.toList()); + cards.add(new ContextualCard.Builder() + .setName("test_gesture") + .setCardType(ContextualCard.CardType.SLICE) + .setSliceUri(Uri.parse( + "content://com.android.settings.test.slices/action/gesture_pick_up")) + .build()); + doReturn(cards).when(mContextualCardLoader).filterEligibleCards(any(List.class)); + + final List result = mContextualCardLoader.getFinalDisplayableCards(cards); + + assertThat(result).hasSize(3); + } + + @Test + public void getFinalDisplayableCards_threeEligibleCardsTwoLarge_shouldShowTwoCards() { + final List threeCards = getContextualCardList().stream().limit(3) + .collect(Collectors.toList()); + doReturn(threeCards).when(mContextualCardLoader).filterEligibleCards(any(List.class)); + + final List result = mContextualCardLoader.getFinalDisplayableCards( + threeCards); + + assertThat(result).hasSize(2); + } + private ContextualCard getContextualCard(String sliceUri) { return new ContextualCard.Builder() .setName("test_card") @@ -99,4 +160,69 @@ public class ContextualCardLoaderTest { .setSliceUri(Uri.parse(sliceUri)) .build(); } + + private List getContextualCardList() { + final List cards = new ArrayList<>(); + cards.add(new ContextualCard.Builder() + .setName("test_wifi") + .setCardType(ContextualCard.CardType.SLICE) + .setSliceUri(WifiSlice.WIFI_URI) + .build()); + cards.add(new ContextualCard.Builder() + .setName("test_flashlight") + .setCardType(ContextualCard.CardType.SLICE) + .setSliceUri( + Uri.parse("content://com.android.settings.test.slices/action/flashlight")) + .build()); + cards.add(new ContextualCard.Builder() + .setName("test_connected") + .setCardType(ContextualCard.CardType.SLICE) + .setSliceUri(ConnectedDeviceSlice.CONNECTED_DEVICE_URI) + .build()); + cards.add(new ContextualCard.Builder() + .setName("test_gesture") + .setCardType(ContextualCard.CardType.SLICE) + .setSliceUri(Uri.parse( + "content://com.android.settings.test.slices/action/gesture_pick_up")) + .build()); + cards.add(new ContextualCard.Builder() + .setName("test_battery") + .setCardType(ContextualCard.CardType.SLICE) + .setSliceUri(BatterySlice.BATTERY_CARD_URI) + .build()); + return cards; + } + + private List getContextualCardListWithNoLargeCard() { + final List cards = new ArrayList<>(); + cards.add(new ContextualCard.Builder() + .setName("test_rotate") + .setCardType(ContextualCard.CardType.SLICE) + .setSliceUri( + Uri.parse("content://com.android.settings.test.slices/action/auto_rotate")) + .build()); + cards.add(new ContextualCard.Builder() + .setName("test_flashlight") + .setCardType(ContextualCard.CardType.SLICE) + .setSliceUri( + Uri.parse("content://com.android.settings.test.slices/action/flashlight")) + .build()); + cards.add(new ContextualCard.Builder() + .setName("test_bt") + .setCardType(ContextualCard.CardType.SLICE) + .setSliceUri(Uri.parse("content://android.settings.test.slices/action/bluetooth")) + .build()); + cards.add(new ContextualCard.Builder() + .setName("test_gesture") + .setCardType(ContextualCard.CardType.SLICE) + .setSliceUri(Uri.parse( + "content://com.android.settings.test.slices/action/gesture_pick_up")) + .build()); + cards.add(new ContextualCard.Builder() + .setName("test_battery") + .setCardType(ContextualCard.CardType.SLICE) + .setSliceUri(BatterySlice.BATTERY_CARD_URI) + .build()); + return cards; + } } From 4864624c3d6a814a222611bad2ea4d3163f9b55a Mon Sep 17 00:00:00 2001 From: Hai Shalom Date: Mon, 12 Nov 2018 11:49:05 -0800 Subject: [PATCH 11/11] Fix Wi-Fi setup in setup wizard Fix Wi-Fi setup in setup wizard; New WPA3/OWE networks added to arrays.xml in an order of security caused a mismatch in the network type index in SUW. Workaround to append the new string instead. Will require additional work. Bug: 119385642 Test: Setup wizard and settings app functional test Change-Id: I6d95213a24de274f686ab372bb5fc69128a07e56 --- res/values/arrays.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values/arrays.xml b/res/values/arrays.xml index c3faabad9f9..4bd86dce0d6 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -215,11 +215,11 @@ @string/wifi_security_none - @string/wifi_security_owe @string/wifi_security_wep @string/wifi_security_psk_generic - @string/wifi_security_sae @string/wifi_security_eap + @string/wifi_security_owe + @string/wifi_security_sae @string/wifi_security_eap_suiteb