From 8552458b7ecf171a0318a4b58f1c65d645ffa8a1 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Mon, 5 Nov 2018 23:09:43 +0800 Subject: [PATCH 01/22] Update the strings of conditional cards Bug: 113451905 Test: visual Change-Id: I023e005a0a913981f0e0445fa42b7a76b51d3021 --- res/values/strings.xml | 25 +++++++++++-------- .../DndConditionCardController.java | 15 +---------- 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 9c69bd1ec14..f9cc6695be3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -9033,25 +9033,28 @@ Hide - Hotspot is on + Hotspot - Portable Wi-Fi hotspot %1$s is active, Wi-Fi for this device is turned off. + %1$s on Airplane mode is on - When airplane mode is turned on, Wi\u2011Fi, Bluetooth, and mobile network are turned off. Wi\u2011Fi and Bluetooth can be turned back on. + Networks unavailable Do Not Disturb is on + + Impacts what you hear and see + Battery Saver is on - Battery Saver turns off some device features and restricts apps + Features restricted Mobile data is off @@ -9060,10 +9063,10 @@ Internet is available only via Wi-Fi - Data Saver is on + Data Saver - Background data is only available via Wi-Fi. This may affect some apps or services when Wi-Fi is not available. + Features restricted Work profile is off @@ -9078,22 +9081,22 @@ Device is muted - Phone is muted + Phone muted - Calls and notifications will be muted + For calls & notifications Device is set to vibrate - Phone is set to vibrate + Vibration only Calls and notifications will vibrate device - Calls and notifications will vibrate phone + For calls & notifications Set Night Light schedule @@ -9105,7 +9108,7 @@ Night Light is on - Screen is tinted amber. This may help you fall asleep. + Screen tinted amber %1$d diff --git a/src/com/android/settings/homepage/contextualcards/conditional/DndConditionCardController.java b/src/com/android/settings/homepage/contextualcards/conditional/DndConditionCardController.java index 706b50e8be1..cf91157b8fe 100644 --- a/src/com/android/settings/homepage/contextualcards/conditional/DndConditionCardController.java +++ b/src/com/android/settings/homepage/contextualcards/conditional/DndConditionCardController.java @@ -98,25 +98,12 @@ public class DndConditionCardController implements ConditionalCardController { .setName(mAppContext.getPackageName() + "/" + mAppContext.getText(R.string.condition_zen_title)) .setTitleText(mAppContext.getText(R.string.condition_zen_title).toString()) - .setSummaryText(getSummary().toString()) + .setSummaryText(mAppContext.getText(R.string.condition_zen_summary).toString()) .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_do_not_disturb_on_24dp)) .setIsHalfWidth(true) .build(); } - public CharSequence getSummary() { - final int zen = mNotificationManager.getZenMode(); - final ZenModeConfig config; - boolean zenModeEnabled = zen != Settings.Global.ZEN_MODE_OFF; - if (zenModeEnabled) { - config = mNotificationManager.getZenModeConfig(); - } else { - config = null; - } - return ZenModeConfig.getDescription(mAppContext, zen != Settings.Global.ZEN_MODE_OFF, - config, true); - } - public class Receiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { From c4b72388b055f58bc8cf6e6fa960778762202cc2 Mon Sep 17 00:00:00 2001 From: Beverly Date: Wed, 28 Nov 2018 11:31:50 -0500 Subject: [PATCH 02/22] Set min height of zen radio button to 48dp Test: manual using accessibility scanner Change-Id: I5fd92a3420bca2b3eb371241ef2ee463f9f27009 Fixes: 119585103 --- res/layout/zen_onboarding.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/res/layout/zen_onboarding.xml b/res/layout/zen_onboarding.xml index 33cdbdd35fd..35b992d1265 100644 --- a/res/layout/zen_onboarding.xml +++ b/res/layout/zen_onboarding.xml @@ -47,7 +47,8 @@ android:id="@+id/zen_onboarding_new_setting_button" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingHorizontal="8dp" /> + android:paddingHorizontal="8dp" + android:minHeight="48dp"/> + android:paddingHorizontal="8dp" + android:minHeight="48dp"/> Date: Wed, 28 Nov 2018 15:06:58 -0800 Subject: [PATCH 03/22] Remove WifiDetailPreference. - use the standard Preference instead to display the wifi details, and enable sumary copying for the preferences under Wifi Network details. Change-Id: I5371ac667d9239276f6492896123d617f5193871 Fixes: 62493282 Test: make RunSettingsRoboTests --- res/xml/wifi_network_details_fragment.xml | 40 ++++++++------ .../settings/wifi/WifiDetailPreference.java | 54 ------------------- .../WifiDetailPreferenceController.java | 52 +++++++++--------- .../WifiDetailPreferenceControllerTest.java | 48 ++++++++--------- 4 files changed, 72 insertions(+), 122 deletions(-) delete mode 100644 src/com/android/settings/wifi/WifiDetailPreference.java diff --git a/res/xml/wifi_network_details_fragment.xml b/res/xml/wifi_network_details_fragment.xml index b33cb75800b..8b027e22242 100644 --- a/res/xml/wifi_network_details_fragment.xml +++ b/res/xml/wifi_network_details_fragment.xml @@ -34,18 +34,18 @@ - - - - - + - + - + - + - + + android:selectable="false" + settings:enableCopying="true"/> diff --git a/src/com/android/settings/wifi/WifiDetailPreference.java b/src/com/android/settings/wifi/WifiDetailPreference.java deleted file mode 100644 index 2567a429932..00000000000 --- a/src/com/android/settings/wifi/WifiDetailPreference.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2009 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; - -import android.content.Context; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.widget.TextView; - -import androidx.preference.Preference; -import androidx.preference.PreferenceViewHolder; - -import com.android.settings.R; - -/** - * A Preference to be used with the Wifi Network Detail Fragment that allows a summary text to be - * set inside the widget resource - */ -public class WifiDetailPreference extends Preference { - private String mDetailText; - - public WifiDetailPreference(Context context, AttributeSet attrs) { - super(context, attrs); - setWidgetLayoutResource(R.layout.preference_widget_summary); - } - - public void setDetailText(String text) { - if (TextUtils.equals(mDetailText, text)) return; - mDetailText = text; - notifyChanged(); - } - - @Override - public void onBindViewHolder(PreferenceViewHolder view) { - super.onBindViewHolder(view); - TextView textView = ((TextView) view.findViewById(R.id.widget_summary)); - textView.setText(mDetailText); - textView.setPadding(0, 0, 10, 0); - } -} diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java index 9a3398ad94f..48446c95bde 100644 --- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java +++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java @@ -57,7 +57,6 @@ import com.android.settings.Utils; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.widget.ActionButtonPreference; import com.android.settings.widget.EntityHeaderController; -import com.android.settings.wifi.WifiDetailPreference; import com.android.settings.wifi.WifiDialog; import com.android.settings.wifi.WifiDialog.WifiDialogListener; import com.android.settings.wifi.WifiUtils; @@ -133,15 +132,15 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController // UI elements - in order of appearance private ActionButtonPreference mButtonsPref; private EntityHeaderController mEntityHeaderController; - private WifiDetailPreference mSignalStrengthPref; - private WifiDetailPreference mLinkSpeedPref; - private WifiDetailPreference mFrequencyPref; - private WifiDetailPreference mSecurityPref; - private WifiDetailPreference mMacAddressPref; - private WifiDetailPreference mIpAddressPref; - private WifiDetailPreference mGatewayPref; - private WifiDetailPreference mSubnetPref; - private WifiDetailPreference mDnsPref; + private Preference mSignalStrengthPref; + private Preference mLinkSpeedPref; + private Preference mFrequencyPref; + private Preference mSecurityPref; + private Preference mMacAddressPref; + private Preference mIpAddressPref; + private Preference mGatewayPref; + private Preference mSubnetPref; + private Preference mDnsPref; private PreferenceCategory mIpv6Category; private Preference mIpv6AddressPref; @@ -283,22 +282,21 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController .setButton2Text(R.string.wifi_sign_in_button_text) .setButton2OnClickListener(view -> signIntoNetwork()); - mSignalStrengthPref = - (WifiDetailPreference) screen.findPreference(KEY_SIGNAL_STRENGTH_PREF); - mLinkSpeedPref = (WifiDetailPreference) screen.findPreference(KEY_LINK_SPEED); - mFrequencyPref = (WifiDetailPreference) screen.findPreference(KEY_FREQUENCY_PREF); - mSecurityPref = (WifiDetailPreference) screen.findPreference(KEY_SECURITY_PREF); + mSignalStrengthPref = screen.findPreference(KEY_SIGNAL_STRENGTH_PREF); + mLinkSpeedPref = screen.findPreference(KEY_LINK_SPEED); + mFrequencyPref = screen.findPreference(KEY_FREQUENCY_PREF); + mSecurityPref = screen.findPreference(KEY_SECURITY_PREF); - mMacAddressPref = (WifiDetailPreference) screen.findPreference(KEY_MAC_ADDRESS_PREF); - mIpAddressPref = (WifiDetailPreference) screen.findPreference(KEY_IP_ADDRESS_PREF); - mGatewayPref = (WifiDetailPreference) screen.findPreference(KEY_GATEWAY_PREF); - mSubnetPref = (WifiDetailPreference) screen.findPreference(KEY_SUBNET_MASK_PREF); - mDnsPref = (WifiDetailPreference) screen.findPreference(KEY_DNS_PREF); + mMacAddressPref = screen.findPreference(KEY_MAC_ADDRESS_PREF); + mIpAddressPref = screen.findPreference(KEY_IP_ADDRESS_PREF); + mGatewayPref = screen.findPreference(KEY_GATEWAY_PREF); + mSubnetPref = screen.findPreference(KEY_SUBNET_MASK_PREF); + mDnsPref = screen.findPreference(KEY_DNS_PREF); mIpv6Category = (PreferenceCategory) screen.findPreference(KEY_IPV6_CATEGORY); mIpv6AddressPref = screen.findPreference(KEY_IPV6_ADDRESSES_PREF); - mSecurityPref.setDetailText(mAccessPoint.getSecurityString(false /* concise */)); + mSecurityPref.setSummary(mAccessPoint.getSecurityString(false /* concise */)); } private void setupEntityHeader(PreferenceScreen screen) { @@ -359,12 +357,12 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController refreshRssiViews(); // MAC Address Pref - mMacAddressPref.setDetailText(mWifiInfo.getMacAddress()); + mMacAddressPref.setSummary(mWifiInfo.getMacAddress()); // Link Speed Pref int linkSpeedMbps = mWifiInfo.getLinkSpeed(); mLinkSpeedPref.setVisible(linkSpeedMbps >= 0); - mLinkSpeedPref.setDetailText(mContext.getString( + mLinkSpeedPref.setSummary(mContext.getString( R.string.link_speed, mWifiInfo.getLinkSpeed())); // Frequency Pref @@ -379,7 +377,7 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController } else { Log.e(TAG, "Unexpected frequency " + frequency); } - mFrequencyPref.setDetailText(band); + mFrequencyPref.setSummary(band); updateIpLayerInfo(); } @@ -414,12 +412,12 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController R.color.wifi_details_icon_color, mContext.getTheme())); mSignalStrengthPref.setIcon(wifiIconDark); - mSignalStrengthPref.setDetailText(mSignalStr[mRssiSignalLevel]); + mSignalStrengthPref.setSummary(mSignalStr[mRssiSignalLevel]); } - private void updatePreference(WifiDetailPreference pref, String detailText) { + private void updatePreference(Preference pref, String detailText) { if (!TextUtils.isEmpty(detailText)) { - pref.setDetailText(detailText); + pref.setSummary(detailText); pref.setVisible(true); } else { pref.setVisible(false); diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java index 4a0988a25c9..d39b55f6f3e 100644 --- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java @@ -57,6 +57,7 @@ import android.widget.ImageView; import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.LifecycleOwner; +import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; @@ -69,7 +70,6 @@ import com.android.settings.testutils.shadow.ShadowEntityHeaderController; import com.android.settings.widget.ActionButtonPreference; import com.android.settings.widget.ActionButtonPreferenceTest; import com.android.settings.widget.EntityHeaderController; -import com.android.settings.wifi.WifiDetailPreference; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.widget.LayoutPreference; @@ -144,27 +144,27 @@ public class WifiDetailPreferenceControllerTest { @Mock private ActionButtonPreference mockButtonsPref; @Mock - private WifiDetailPreference mockSignalStrengthPref; + private Preference mockSignalStrengthPref; @Mock - private WifiDetailPreference mockLinkSpeedPref; + private Preference mockLinkSpeedPref; @Mock - private WifiDetailPreference mockFrequencyPref; + private Preference mockFrequencyPref; @Mock - private WifiDetailPreference mockSecurityPref; + private Preference mockSecurityPref; @Mock - private WifiDetailPreference mockMacAddressPref; + private Preference mockMacAddressPref; @Mock - private WifiDetailPreference mockIpAddressPref; + private Preference mockIpAddressPref; @Mock - private WifiDetailPreference mockGatewayPref; + private Preference mockGatewayPref; @Mock - private WifiDetailPreference mockSubnetPref; + private Preference mockSubnetPref; @Mock - private WifiDetailPreference mockDnsPref; + private Preference mockDnsPref; @Mock private PreferenceCategory mockIpv6Category; @Mock - private WifiDetailPreference mockIpv6AddressesPref; + private Preference mockIpv6AddressesPref; @Mock private PackageManager mockPackageManager; @@ -336,7 +336,7 @@ public class WifiDetailPreferenceControllerTest { public void securityPreference_stringShouldBeSet() { displayAndResume(); - verify(mockSecurityPref).setDetailText(SECURITY); + verify(mockSecurityPref).setSummary(SECURITY); } @Test @@ -413,7 +413,7 @@ public class WifiDetailPreferenceControllerTest { displayAndResume(); - verify(mockSignalStrengthPref).setDetailText(expectedStrength); + verify(mockSignalStrengthPref).setSummary(expectedStrength); } @Test @@ -422,7 +422,7 @@ public class WifiDetailPreferenceControllerTest { displayAndResume(); - verify(mockLinkSpeedPref).setDetailText(expectedLinkSpeed); + verify(mockLinkSpeedPref).setSummary(expectedLinkSpeed); } @Test @@ -438,7 +438,7 @@ public class WifiDetailPreferenceControllerTest { public void macAddressPref_shouldHaveDetailTextSet() { displayAndResume(); - verify(mockMacAddressPref).setDetailText(MAC_ADDRESS); + verify(mockMacAddressPref).setSummary(MAC_ADDRESS); } @Test @@ -447,7 +447,7 @@ public class WifiDetailPreferenceControllerTest { displayAndResume(); - verify(mockIpAddressPref).setDetailText(Constants.IPV4_ADDR.getAddress().getHostAddress()); + verify(mockIpAddressPref).setSummary(Constants.IPV4_ADDR.getAddress().getHostAddress()); } @Test @@ -458,8 +458,8 @@ public class WifiDetailPreferenceControllerTest { displayAndResume(); - verify(mockSubnetPref).setDetailText("255.255.255.128"); - verify(mockGatewayPref).setDetailText("192.0.2.127"); + verify(mockSubnetPref).setSummary("255.255.255.128"); + verify(mockGatewayPref).setSummary("192.0.2.127"); } @Test @@ -470,7 +470,7 @@ public class WifiDetailPreferenceControllerTest { displayAndResume(); - verify(mockDnsPref).setDetailText( + verify(mockDnsPref).setSummary( "8.8.4.4\n" + "8.8.8.8\n" + Constants.IPV6_DNS.getHostAddress()); @@ -551,15 +551,15 @@ public class WifiDetailPreferenceControllerTest { lp.addRoute(Constants.IPV4_DEFAULT); updateLinkProperties(lp); - inOrder.verify(mockGatewayPref).setDetailText(Constants.IPV4_GATEWAY.getHostAddress()); + inOrder.verify(mockGatewayPref).setSummary(Constants.IPV4_GATEWAY.getHostAddress()); inOrder.verify(mockGatewayPref).setVisible(true); lp.addLinkAddress(Constants.IPV4_ADDR); lp.addRoute(Constants.IPV4_SUBNET); updateLinkProperties(lp); - inOrder.verify(mockIpAddressPref).setDetailText(asString(Constants.IPV4_ADDR)); + inOrder.verify(mockIpAddressPref).setSummary(asString(Constants.IPV4_ADDR)); inOrder.verify(mockIpAddressPref).setVisible(true); - inOrder.verify(mockSubnetPref).setDetailText("255.255.255.128"); + inOrder.verify(mockSubnetPref).setSummary("255.255.255.128"); inOrder.verify(mockSubnetPref).setVisible(true); lp.addLinkAddress(Constants.IPV6_GLOBAL1); @@ -578,13 +578,13 @@ public class WifiDetailPreferenceControllerTest { lp.addDnsServer(Constants.IPV6_DNS); updateLinkProperties(lp); - inOrder.verify(mockDnsPref).setDetailText(Constants.IPV6_DNS.getHostAddress()); + inOrder.verify(mockDnsPref).setSummary(Constants.IPV6_DNS.getHostAddress()); inOrder.verify(mockDnsPref).setVisible(true); lp.addDnsServer(Constants.IPV4_DNS1); lp.addDnsServer(Constants.IPV4_DNS2); updateLinkProperties(lp); - inOrder.verify(mockDnsPref).setDetailText( + inOrder.verify(mockDnsPref).setSummary( Constants.IPV6_DNS.getHostAddress() + "\n" + Constants.IPV4_DNS1.getHostAddress() + "\n" + Constants.IPV4_DNS2.getHostAddress()); From e44d953a25e713cedd719570ff7fa83193dc8f1c Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Wed, 28 Nov 2018 16:35:25 +0800 Subject: [PATCH 04/22] Fix conditional cards disappeared from contextual homepage This symptom only occurred in the case of more than 3 conditional cards and no suggestion cards in homepage. It is caused by incompletely keeping conditional cards. So adding missing card types makes conditional cards be kept correctly. Bug: 120115919 Test: robotest Change-Id: Ic67c0a813de4f966c164bf92e4d4d64debcf95be --- .../ContextualCardManager.java | 8 ++++- .../ContextualCardManagerTest.java | 29 ++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java index 30eae298752..5f397d787eb 100644 --- a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java @@ -40,6 +40,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeSet; import java.util.stream.Collectors; /** @@ -132,8 +133,13 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo // except Conditional cards, all other cards are from the database. So when the map sent // here is empty, we only keep Conditional cards. if (cardTypes.isEmpty()) { + final Set conditionalCardTypes = new TreeSet() {{ + add(ContextualCard.CardType.CONDITIONAL); + add(ContextualCard.CardType.CONDITIONAL_HEADER); + add(ContextualCard.CardType.CONDITIONAL_FOOTER); + }}; cardsToKeep = mContextualCards.stream() - .filter(card -> card.getCardType() == ContextualCard.CardType.CONDITIONAL) + .filter(card -> conditionalCardTypes.contains(card.getCardType())) .collect(Collectors.toList()); } else { cardsToKeep = mContextualCards.stream() diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java index 82876722efa..28015a770c8 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java @@ -25,6 +25,8 @@ import android.content.Context; import android.net.Uri; import android.util.ArrayMap; +import com.android.settings.homepage.contextualcards.conditional.ConditionFooterContextualCard; +import com.android.settings.homepage.contextualcards.conditional.ConditionHeaderContextualCard; import com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -70,7 +72,7 @@ public class ContextualCardManagerTest { } @Test - public void onContextualCardUpdated_emtpyMapWithExistingCards_shouldOnlyKeepConditionalCard() { + public void onContextualCardUpdated_emptyMapWithExistingCards_shouldOnlyKeepConditionalCard() { mManager.mContextualCards.add(new ConditionalContextualCard.Builder().build()); mManager.mContextualCards.add( buildContextualCard(TEST_SLICE_URI)); @@ -84,6 +86,31 @@ public class ContextualCardManagerTest { .isEqualTo(ContextualCard.CardType.CONDITIONAL); } + @Test + public void onContextualCardUpdated_hasEmptyMap_shouldKeepConditionalHeaderCard() { + mManager.mContextualCards.add(new ConditionHeaderContextualCard.Builder().build()); + mManager.setListener(mListener); + + mManager.onContextualCardUpdated(new ArrayMap<>()); + + assertThat(mManager.mContextualCards).hasSize(1); + assertThat(mManager.mContextualCards.get(0).getCardType()) + .isEqualTo(ContextualCard.CardType.CONDITIONAL_HEADER); + } + + @Test + public void onContextualCardUpdated_hasEmptyMap_shouldKeepConditionalFooterCard() { + mManager.mContextualCards.add(new ConditionFooterContextualCard.Builder().build()); + mManager.setListener(mListener); + + mManager.onContextualCardUpdated(new ArrayMap<>()); + + assertThat(mManager.mContextualCards).hasSize(1); + assertThat(mManager.mContextualCards.get(0).getCardType()) + .isEqualTo(ContextualCard.CardType.CONDITIONAL_FOOTER); + } + + private ContextualCard buildContextualCard(String sliceUri) { return new ContextualCard.Builder() .setName("test_name") From 68f37a19ae35e6b60994c240016310e8e8d87696 Mon Sep 17 00:00:00 2001 From: Yi-Ling Chuang Date: Tue, 20 Nov 2018 19:51:13 +0800 Subject: [PATCH 05/22] Add contextual card feedback email mechanism. When users dismiss a card, ask them for feedback. Bug: 113783548 Test: robotests Change-Id: I4f53f89ff8377b0dae8c1fc13c6e474456f90c2f --- AndroidManifest.xml | 3 + res/values/config.xml | 2 + res/values/strings.xml | 5 ++ .../ContextualCardFeedbackDialog.java | 66 +++++++++++++++++++ .../slices/SliceContextualCardController.java | 32 ++++++++- tests/robotests/res/values-mcc999/config.xml | 3 + .../ContextualCardManagerTest.java | 3 - .../SliceContextualCardControllerTest.java | 56 ++++++++++++++-- 8 files changed, 157 insertions(+), 13 deletions(-) create mode 100644 src/com/android/settings/homepage/contextualcards/ContextualCardFeedbackDialog.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index b69cac73ad3..38bd2e49f57 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3032,6 +3032,9 @@ + + diff --git a/res/values/config.xml b/res/values/config.xml index 917f14d4d6a..6b0a10e29fc 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -160,4 +160,6 @@ android.settings.EDIT_EMERGENCY_INFO + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 9c69bd1ec14..de6f29a1c4f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10351,4 +10351,9 @@ Storage is low. %1$s used - %2$s free + + + Send feedback + + Would you like to give us feedback on this suggestion? \ No newline at end of file diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardFeedbackDialog.java b/src/com/android/settings/homepage/contextualcards/ContextualCardFeedbackDialog.java new file mode 100644 index 00000000000..0d5b2758613 --- /dev/null +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardFeedbackDialog.java @@ -0,0 +1,66 @@ +/* + * 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.homepage.contextualcards; + +import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.util.Log; + +import com.android.internal.app.AlertActivity; +import com.android.internal.app.AlertController; +import com.android.settings.R; + +public class ContextualCardFeedbackDialog extends AlertActivity implements + DialogInterface.OnClickListener { + + public static final String EXTRA_CARD_NAME = "card_name"; + public static final String EXTRA_FEEDBACK_EMAIL = "feedback_email"; + + private static final String TAG = "CardFeedbackDialog"; + private static final String SUBJECT = "Settings Contextual Card Feedback - "; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + final AlertController.AlertParams alertParams = mAlertParams; + alertParams.mMessage = getText(R.string.contextual_card_feedback_confirm_message); + alertParams.mPositiveButtonText = getText(R.string.contextual_card_feedback_send); + alertParams.mPositiveButtonListener = this; + alertParams.mNegativeButtonText = getText(R.string.skip_label); + + setupAlert(); + } + + @Override + public void onClick(DialogInterface dialog, int which) { + final String cardName = getIntent().getStringExtra(EXTRA_CARD_NAME); + final String email = getIntent().getStringExtra(EXTRA_FEEDBACK_EMAIL); + final Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:" + email)); + intent.putExtra(Intent.EXTRA_SUBJECT, SUBJECT + cardName); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + try { + startActivity(intent); + } catch (Exception e) { + Log.e(TAG, "Send feedback failed.", e); + } + finish(); + } +} diff --git a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardController.java b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardController.java index f1fbc9cb83a..3368580e002 100644 --- a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardController.java +++ b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardController.java @@ -17,11 +17,16 @@ package com.android.settings.homepage.contextualcards.slices; import android.content.Context; +import android.content.Intent; +import android.text.TextUtils; -import com.android.settings.homepage.contextualcards.CardContentProvider; +import androidx.annotation.VisibleForTesting; + +import com.android.settings.R; import com.android.settings.homepage.contextualcards.CardDatabaseHelper; import com.android.settings.homepage.contextualcards.ContextualCard; import com.android.settings.homepage.contextualcards.ContextualCardController; +import com.android.settings.homepage.contextualcards.ContextualCardFeedbackDialog; import com.android.settings.homepage.contextualcards.ContextualCardUpdateListener; import com.android.settingslib.utils.ThreadUtils; @@ -32,7 +37,8 @@ public class SliceContextualCardController implements ContextualCardController { private static final String TAG = "SliceCardController"; - private Context mContext; + private final Context mContext; + private ContextualCardUpdateListener mCardUpdateListener; public SliceContextualCardController(Context context) { @@ -51,7 +57,7 @@ public class SliceContextualCardController implements ContextualCardController { @Override public void onActionClick(ContextualCard card) { - //TODO(b/113783548): Implement feedback mechanism + } @Override @@ -60,10 +66,30 @@ public class SliceContextualCardController implements ContextualCardController { final CardDatabaseHelper dbHelper = CardDatabaseHelper.getInstance(mContext); dbHelper.markContextualCardAsDismissed(mContext, card.getName()); }); + showFeedbackDialog(card); } @Override public void setCardUpdateListener(ContextualCardUpdateListener listener) { mCardUpdateListener = listener; } + + @VisibleForTesting + void showFeedbackDialog(ContextualCard card) { + final String email = mContext.getString(R.string.config_contextual_card_feedback_email); + if (TextUtils.isEmpty(email)) { + return; + } + final Intent feedbackIntent = new Intent(mContext, ContextualCardFeedbackDialog.class); + feedbackIntent.putExtra(ContextualCardFeedbackDialog.EXTRA_CARD_NAME, + getSimpleCardName(card)); + feedbackIntent.putExtra(ContextualCardFeedbackDialog.EXTRA_FEEDBACK_EMAIL, email); + feedbackIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mContext.startActivity(feedbackIntent); + } + + private String getSimpleCardName(ContextualCard card) { + final String[] split = card.getName().split("/"); + return split[split.length - 1]; + } } diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml index 73d22647091..9bba3c331d9 100644 --- a/tests/robotests/res/values-mcc999/config.xml +++ b/tests/robotests/res/values-mcc999/config.xml @@ -77,4 +77,7 @@ com.android.settings.slice_whitelist_package + + + test@test.test diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java index 82876722efa..6aada0d1ed0 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java @@ -18,9 +18,6 @@ package com.android.settings.homepage.contextualcards; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.anyMap; -import static org.mockito.Mockito.doNothing; - import android.content.Context; import android.net.Uri; import android.util.ArrayMap; diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java index 362e1f541ac..29e309d9620 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java @@ -18,6 +18,10 @@ package com.android.settings.homepage.contextualcards.slices; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.spy; + import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; @@ -27,14 +31,21 @@ import android.net.Uri; import com.android.settings.homepage.contextualcards.CardContentProvider; import com.android.settings.homepage.contextualcards.CardDatabaseHelper; import com.android.settings.homepage.contextualcards.ContextualCard; +import com.android.settings.homepage.contextualcards.ContextualCardFeedbackDialog; +import com.android.settings.homepage.contextualcards.ContextualCardsFragment; import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; +import org.robolectric.Shadows; +import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowActivity; import org.robolectric.shadows.ShadowContentResolver; +import org.robolectric.shadows.androidx.fragment.FragmentController; @RunWith(SettingsRobolectricTestRunner.class) public class SliceContextualCardControllerTest { @@ -49,25 +60,22 @@ public class SliceContextualCardControllerTest { @Before public void setUp() { + MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; mProvider = Robolectric.setupContentProvider(CardContentProvider.class); ShadowContentResolver.registerProviderInternal(CardContentProvider.CARD_AUTHORITY, mProvider); mResolver = mContext.getContentResolver(); - mController = new SliceContextualCardController(mContext); + mController = spy(new SliceContextualCardController(mContext)); } @Test public void onDismissed_cardShouldBeMarkedAsDismissed() { final Uri providerUri = CardContentProvider.URI; - final ContextualCard card = new ContextualCard.Builder() - .setName(TEST_CARD_NAME) - .setCardType(ContextualCard.CardType.SLICE) - .setSliceUri(Uri.parse(TEST_SLICE_URI)) - .build(); mResolver.insert(providerUri, generateOneRow()); + doNothing().when(mController).showFeedbackDialog(any(ContextualCard.class)); - mController.onDismissed(card); + mController.onDismissed(getTestSliceCard()); final String[] columns = {CardDatabaseHelper.CardColumns.CARD_DISMISSED}; final String selection = CardDatabaseHelper.CardColumns.NAME + "=?"; @@ -80,6 +88,32 @@ public class SliceContextualCardControllerTest { assertThat(qryDismissed).isEqualTo(1); } + @Test + public void onDismissed_noFeedbackEmail_shouldNotShowFeedbackDialog() { + mResolver.insert(CardContentProvider.URI, generateOneRow()); + final ContextualCardsFragment fragment = + FragmentController.of(new ContextualCardsFragment()).create().get(); + final ShadowActivity shadowActivity = Shadows.shadowOf(fragment.getActivity()); + + mController.onDismissed(getTestSliceCard()); + + assertThat(shadowActivity.getNextStartedActivity()).isNull(); + } + + @Test + @Config(qualifiers = "mcc999") + public void onDismissed_hasFeedbackEmail_shouldShowFeedbackDialog() { + mResolver.insert(CardContentProvider.URI, generateOneRow()); + final ContextualCardsFragment fragment = + FragmentController.of(new ContextualCardsFragment()).create().get(); + final ShadowActivity shadowActivity = Shadows.shadowOf(fragment.getActivity()); + + mController.onDismissed(getTestSliceCard()); + + assertThat(shadowActivity.getNextStartedActivity().getComponent().getClassName()) + .isEqualTo(ContextualCardFeedbackDialog.class.getName()); + } + private ContentValues generateOneRow() { final ContentValues values = new ContentValues(); values.put(CardDatabaseHelper.CardColumns.NAME, TEST_CARD_NAME); @@ -93,4 +127,12 @@ public class SliceContextualCardControllerTest { return values; } + + private ContextualCard getTestSliceCard() { + return new ContextualCard.Builder() + .setName(TEST_CARD_NAME) + .setCardType(ContextualCard.CardType.SLICE) + .setSliceUri(Uri.parse(TEST_SLICE_URI)) + .build(); + } } From f5d6089d35dea8775c18b883a45e855a64e5bd1e Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Fri, 23 Nov 2018 10:51:27 +0800 Subject: [PATCH 06/22] Upload basic UI files for Wi-Fi DPP Settings development II. Add 3 fragments: WifiDppQrCodeGeneratorFragment WifiDppChooseSavedWifiNetworkFragment WifiDppAddDeviceFragment Bug: 118797380 118797202 118794978 118796825 118794858 Test: atest WifiDppConfiguratorActivityTest atest WifiDppQrCodeScannerFragmentTest atest atest RunSettingsRoboTests Change-Id: I2fbc2f46f941d49b63e4ac74d92f94bf617d2b9b --- res/layout/wifi_dpp_add_device_fragment.xml | 48 +++++++++ ...dpp_choose_saved_wifi_network_fragment.xml | 35 ++++++ .../wifi_dpp_qrcode_generator_fragment.xml | 34 ++++++ .../wifi_dpp_qrcode_scanner_fragment.xml | 1 - .../wifi/dpp/WifiDppAddDeviceFragment.java | 37 +++++++ ...WifiDppChooseSavedWifiNetworkFragment.java | 37 +++++++ .../wifi/dpp/WifiDppConfiguratorActivity.java | 41 +++++-- .../wifi/dpp/WifiDppQrCodeBaseFragment.java | 101 ++++++++++++++++-- .../dpp/WifiDppQrCodeGeneratorFragment.java | 37 +++++++ .../dpp/WifiDppQrCodeScannerFragment.java | 3 - .../dpp/WifiDppConfiguratorActivityTest.java | 26 ++++- .../dpp/WifiDppQrCodeScannerFragmentTest.java | 3 +- 12 files changed, 376 insertions(+), 27 deletions(-) create mode 100644 res/layout/wifi_dpp_add_device_fragment.xml create mode 100644 res/layout/wifi_dpp_choose_saved_wifi_network_fragment.xml create mode 100644 res/layout/wifi_dpp_qrcode_generator_fragment.xml create mode 100644 src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java create mode 100644 src/com/android/settings/wifi/dpp/WifiDppChooseSavedWifiNetworkFragment.java create mode 100644 src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java diff --git a/res/layout/wifi_dpp_add_device_fragment.xml b/res/layout/wifi_dpp_add_device_fragment.xml new file mode 100644 index 00000000000..03add625733 --- /dev/null +++ b/res/layout/wifi_dpp_add_device_fragment.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + diff --git a/res/layout/wifi_dpp_choose_saved_wifi_network_fragment.xml b/res/layout/wifi_dpp_choose_saved_wifi_network_fragment.xml new file mode 100644 index 00000000000..a65cf3e99f6 --- /dev/null +++ b/res/layout/wifi_dpp_choose_saved_wifi_network_fragment.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + diff --git a/res/layout/wifi_dpp_qrcode_generator_fragment.xml b/res/layout/wifi_dpp_qrcode_generator_fragment.xml new file mode 100644 index 00000000000..789b3a3a42a --- /dev/null +++ b/res/layout/wifi_dpp_qrcode_generator_fragment.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/res/layout/wifi_dpp_qrcode_scanner_fragment.xml b/res/layout/wifi_dpp_qrcode_scanner_fragment.xml index 130bb6d847b..a864f511e93 100644 --- a/res/layout/wifi_dpp_qrcode_scanner_fragment.xml +++ b/res/layout/wifi_dpp_qrcode_scanner_fragment.xml @@ -17,7 +17,6 @@ (WifiDppConfiguratorActivity.class); @Test - public void testLaunchModeQrCodeScanner_shouldNotAutoFinish() { + public void launchActivity_modeQrCodeScanner_shouldNotAutoFinish() { Intent intent = new Intent(); intent.putExtra(WifiDppConfiguratorActivity.EXTRA_LAUNCH_MODE, WifiDppConfiguratorActivity.LaunchMode.LAUNCH_MODE_QR_CODE_SCANNER.getMode()); mActivityRule.launchActivity(intent); assertThat(mActivityRule.getActivity().isFinishing()).isEqualTo(false); - mActivityRule.finishActivity(); } @Test - public void testNoLaunchMode_shouldFinishActivityWithResultCodeCanceled() { + public void launchActivity_modeQrCodeGenerator_shouldNotAutoFinish() { + Intent intent = new Intent(); + intent.putExtra(WifiDppConfiguratorActivity.EXTRA_LAUNCH_MODE, + WifiDppConfiguratorActivity.LaunchMode.LAUNCH_MODE_QR_CODE_GENERATOR.getMode()); + mActivityRule.launchActivity(intent); + + assertThat(mActivityRule.getActivity().isFinishing()).isEqualTo(false); + } + + @Test + public void launchActivity_modeChooseSavedWifiNetwork_shouldNotAutoFinish() { + Intent intent = new Intent(); + intent.putExtra(WifiDppConfiguratorActivity.EXTRA_LAUNCH_MODE, + WifiDppConfiguratorActivity.LaunchMode + .LAUNCH_MODE_CHOOSE_SAVED_WIFI_NETWORK.getMode()); + mActivityRule.launchActivity(intent); + + assertThat(mActivityRule.getActivity().isFinishing()).isEqualTo(false); + } + + @Test + public void launchActivity_noLaunchMode_shouldFinishActivityWithResultCodeCanceled() { // If we do not specify launch mode, the activity will finish itself right away Intent intent = new Intent(); mActivityRule.launchActivity(intent); diff --git a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java index 58fa61fcf6f..0f4bfd9e6b4 100644 --- a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java +++ b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java @@ -47,8 +47,9 @@ public class WifiDppQrCodeScannerFragmentTest { } @Test - public void testLeftButton_shouldFinishActivityWithResultCodeCanceled() { + public void leftButton_shouldFinishActivityWithResultCodeCanceled() { onView(withText("Cancel")).perform(click()); + assertThat(mActivityRule.getActivityResult().getResultCode()). isEqualTo(Activity.RESULT_CANCELED); } From fe03fa546a53cd62cd8c0afc3853a8b0bc9c4a3d Mon Sep 17 00:00:00 2001 From: tmfang Date: Thu, 29 Nov 2018 12:50:31 +0800 Subject: [PATCH 07/22] Connect button should have correct icon Test: visual Change-Id: I3688a309a538112c60f5d6084c774c08a2ac05d5 Fixes: 119758987 --- .../settings/bluetooth/BluetoothDetailsButtonsController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsButtonsController.java b/src/com/android/settings/bluetooth/BluetoothDetailsButtonsController.java index 563a06a01f3..4bb210343b8 100644 --- a/src/com/android/settings/bluetooth/BluetoothDetailsButtonsController.java +++ b/src/com/android/settings/bluetooth/BluetoothDetailsButtonsController.java @@ -76,7 +76,7 @@ public class BluetoothDetailsButtonsController extends BluetoothDetailsControlle if (!mConnectButtonInitialized || previouslyConnected) { mActionButtons .setButton2Text(R.string.bluetooth_device_context_connect) - // TODO (b/119646923) Icon is not ready. + .setButton2Icon(R.drawable.ic_add_24dp) .setButton2OnClickListener( view -> mCachedDevice.connect(true /* connectAllProfiles */)); mConnectButtonInitialized = true; From 133c73f5f798a06e8d0c848652c516cc39fa02fc Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Wed, 28 Nov 2018 20:51:06 +0800 Subject: [PATCH 08/22] Update icon color for "Accessibility" and "Support & Tips" for Dark mode Change-Id: I874354f3eb669b36822a3fac7e9160ac19d65d35 Fixes: 119785748 Test: robotests & visual --- color-check-baseline.xml | 76 ++++++++++++++++++++++++++++++++++--- res/values-night/colors.xml | 2 + res/values/colors.xml | 4 +- 3 files changed, 74 insertions(+), 8 deletions(-) diff --git a/color-check-baseline.xml b/color-check-baseline.xml index eb2e7302ed0..efbb2c609ea 100644 --- a/color-check-baseline.xml +++ b/color-check-baseline.xml @@ -161,6 +161,22 @@ column="5"/> + + + + + + + + + + + + + + + + @@ -2637,7 +2701,7 @@ errorLine2=" ^"> @@ -2653,7 +2717,7 @@ errorLine2=" ^"> @@ -2669,7 +2733,7 @@ errorLine2=" ^"> diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml index 595f429cd5f..bc06f472328 100644 --- a/res/values-night/colors.xml +++ b/res/values-night/colors.xml @@ -19,5 +19,7 @@ #dadce0 #82000000 @android:color/black + #783BE5 + #3F5FBD diff --git a/res/values/colors.xml b/res/values/colors.xml index e477277e7fc..6a6a2b3fe8f 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -116,9 +116,9 @@ #C14CE6 #0F9D58 #F15B8D - #783BE5 + #5011C1 #9E9E9E - #3F5FBD + #26459C #1A73E8 #2EC7DC #9FA8DA From da296233bc8bd51fbf8e043d317a7f73458da499 Mon Sep 17 00:00:00 2001 From: Stanley Wang Date: Thu, 29 Nov 2018 18:56:39 +0800 Subject: [PATCH 09/22] Fix adaptive brightness not appearing in Settings search Change-Id: I33ed525b3c051a982869114754bd3b7423b61d22 Fixes: 117449384 Test: manual --- res/xml/display_settings.xml | 1 - .../settings/display/AutoBrightnessPreferenceController.java | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml index b0e362c41a6..50a5649ac36 100644 --- a/res/xml/display_settings.xml +++ b/res/xml/display_settings.xml @@ -44,7 +44,6 @@ android:title="@string/auto_brightness_title" android:summary="@string/summary_placeholder" android:fragment="com.android.settings.display.AutoBrightnessSettings" - settings:searchable="false" settings:controller="com.android.settings.display.AutoBrightnessPreferenceController" /> Date: Wed, 14 Nov 2018 13:46:42 +0000 Subject: [PATCH 10/22] Add a developer option to allow all background activity starts Test: make RunSettingsRoboTests ROBOTEST_FILTER=AllowBackgroundActivityStartsPreferenceControllerTest Bug: 110956953 Change-Id: I45db536d8a60aa6c3a81c01b93ff8e13bf52a77b --- res/values/strings.xml | 7 +- res/xml/development_settings.xml | 5 + ...undActivityStartsPreferenceController.java | 68 +++++++++++ .../DevelopmentSettingsDashboardFragment.java | 1 + ...ctivityStartsPreferenceControllerTest.java | 110 ++++++++++++++++++ 5 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 src/com/android/settings/development/AllowBackgroundActivityStartsPreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/development/AllowBackgroundActivityStartsPreferenceControllerTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index a95eb3d4748..5b6321a3d86 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -9889,6 +9889,11 @@ Track all GNSS constellations and frequencies with no duty cycling + + Allow background activity starts + + Allows all background activity starts + Always show crash dialog @@ -10254,4 +10259,4 @@ Send feedback Would you like to give us feedback on this suggestion? - \ No newline at end of file + diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml index cc724b8e56e..a0f019d3ff3 100644 --- a/res/xml/development_settings.xml +++ b/res/xml/development_settings.xml @@ -484,6 +484,11 @@ android:fragment="com.android.settings.applications.appops.BackgroundCheckSummary" android:title="@string/background_check_pref" /> + + Date: Tue, 27 Nov 2018 15:20:15 -0800 Subject: [PATCH 11/22] Fix Wifi-Detail page colors There were some hardcoded colors in this page that should have been using colorControlNormal. This CL just updates it to use those. Test: Visual inspection Fixes: 37628554 Change-Id: I431744e7613eeb0ac751cf1505bcf2ef9e19d95d --- color-check-baseline.xml | 58 ++++++------------- res/drawable/ic_frequency_antenna.xml | 2 +- res/drawable/ic_security_lock_24dp.xml | 2 +- res/values/colors.xml | 4 +- .../WifiDetailPreferenceController.java | 3 +- 5 files changed, 24 insertions(+), 45 deletions(-) diff --git a/color-check-baseline.xml b/color-check-baseline.xml index efbb2c609ea..b14e4eee20f 100644 --- a/color-check-baseline.xml +++ b/color-check-baseline.xml @@ -1,6 +1,18 @@ + + + + + errorLine1=" <color name="fallback_tintColor">#89000000</color>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - - - - - - - - @@ -2701,7 +2681,7 @@ errorLine2=" ^"> @@ -2717,7 +2697,7 @@ errorLine2=" ^"> @@ -2733,7 +2713,7 @@ errorLine2=" ^"> @@ -2749,7 +2729,7 @@ errorLine2=" ^"> diff --git a/res/drawable/ic_frequency_antenna.xml b/res/drawable/ic_frequency_antenna.xml index 581b83e6077..716a98a1205 100644 --- a/res/drawable/ic_frequency_antenna.xml +++ b/res/drawable/ic_frequency_antenna.xml @@ -19,7 +19,7 @@ android:viewportHeight="24" android:width="24dp" android:height="24dp" - android:tint="@color/wifi_details_icon_color"> + android:tint="?android:attr/colorControlNormal"> + android:tint="?android:attr/colorControlNormal"> diff --git a/res/values/colors.xml b/res/values/colors.xml index 6a6a2b3fe8f..b768d6a3054 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -99,8 +99,8 @@ #fff5f5f5 - - #8A000000 + + #89000000 #f2f2f2 diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java index 48446c95bde..ba8241a6773 100644 --- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java +++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java @@ -408,8 +408,7 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController mEntityHeaderController.setIcon(wifiIcon).done(mFragment.getActivity(), true /* rebind */); Drawable wifiIconDark = wifiIcon.getConstantState().newDrawable().mutate(); - wifiIconDark.setTint(mContext.getResources().getColor( - R.color.wifi_details_icon_color, mContext.getTheme())); + wifiIconDark.setTintList(Utils.getColorAttr(mContext, android.R.attr.colorControlNormal)); mSignalStrengthPref.setIcon(wifiIconDark); mSignalStrengthPref.setSummary(mSignalStr[mRssiSignalLevel]); From 8e14ca0058d65174de1c48e6c074dd3fc1e02fe1 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 27 Nov 2018 13:06:44 -0800 Subject: [PATCH 12/22] Remove obsolete logic in SettingsActivity. mIsShowingDashboard is always false, it used to be true when we are displaying homepage, but now homepage is hosted in a entirely different activity. so all related logic can now be removed. Test: robotests Misc clean up: remove unused colors Test: rebuild, color-lint Change-Id: I1e1628c1e9606c2b7dc40ef3c21d4ed1391a8c03 --- AndroidManifest.xml | 7 - color-check-baseline.xml | 356 ++++-------------- res/layout/settings_main_dashboard.xml | 33 -- res/values/colors.xml | 20 - .../android/settings/SettingsActivity.java | 26 +- .../search/SearchFeatureProvider.java | 6 +- .../settings/SettingsActivityTest.java | 31 +- .../search/SearchFeatureProviderImplTest.java | 20 +- .../widget/RoundedHomepageIconTest.java | 4 +- 9 files changed, 103 insertions(+), 400 deletions(-) delete mode 100644 res/layout/settings_main_dashboard.xml diff --git a/AndroidManifest.xml b/AndroidManifest.xml index cc7f909680e..7689b11cb1c 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -114,13 +114,6 @@ - - - - + errorLine1=" <color name="bluetooth_dialog_text_color">#8a000000</color>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - - - - @@ -253,7 +237,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -269,7 +253,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -285,7 +269,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -301,23 +285,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - - - - @@ -333,7 +301,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -349,7 +317,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -365,7 +333,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -381,7 +349,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -397,7 +365,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -413,7 +381,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -429,7 +397,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -445,7 +413,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -461,7 +429,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -477,7 +445,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -493,23 +461,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - - - - @@ -525,103 +477,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - - - - - - - - - - - - - - - - - - - - - - - - @@ -637,39 +493,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - - - - - - - - @@ -685,7 +509,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -701,7 +525,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -717,7 +541,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -733,7 +557,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -749,7 +573,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -765,7 +589,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -781,7 +605,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -797,7 +621,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -813,7 +637,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -829,7 +653,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -845,7 +669,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -861,7 +685,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -877,7 +701,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -893,7 +717,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -909,7 +733,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -925,7 +749,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -941,7 +765,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -957,7 +781,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -973,7 +797,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -989,39 +813,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - - - - - - - - @@ -1037,7 +829,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1053,7 +845,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1069,7 +861,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1085,7 +877,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1101,7 +893,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1117,7 +909,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1133,7 +925,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1149,7 +941,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1165,7 +957,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1181,7 +973,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1197,7 +989,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1213,7 +1005,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1229,7 +1021,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1245,7 +1037,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1261,7 +1053,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1277,7 +1069,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1293,7 +1085,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1309,7 +1101,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1325,7 +1117,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1341,7 +1133,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1357,7 +1149,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1373,7 +1165,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1389,7 +1181,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1405,7 +1197,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1421,7 +1213,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1437,7 +1229,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1453,7 +1245,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1469,7 +1261,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1485,7 +1277,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -2669,7 +2461,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~"> @@ -2701,7 +2493,7 @@ errorLine2=" ^"> @@ -2717,7 +2509,7 @@ errorLine2=" ^"> @@ -2733,7 +2525,7 @@ errorLine2=" ^"> @@ -2749,7 +2541,7 @@ errorLine2=" ^"> diff --git a/res/layout/settings_main_dashboard.xml b/res/layout/settings_main_dashboard.xml deleted file mode 100644 index 39940925e2b..00000000000 --- a/res/layout/settings_main_dashboard.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - diff --git a/res/values/colors.xml b/res/values/colors.xml index 6a6a2b3fe8f..d10cb5f4fa0 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -19,8 +19,6 @@ #F00 #00F - #FFCED7DB - #8a000000 #ff9a9a9a @@ -30,7 +28,6 @@ #20ffffff @android:color/holo_blue_light - #ffbdbdbd @color/lock_pattern_view_regular_color #ff84ffff @color/suw_color_accent_light @@ -52,25 +49,13 @@ #ff384248 #ffced7db - #ffe0e0e0 @*android:color/accent_device_default_light #60000000 - #33b5e5 - - #ff009587 - #ffF3B300 - #ffff9700 - #ffff5621 - - #ff384248 #ffabffec - #8a000000 - #4d000000 - #4285F4 #3367D6 @@ -78,7 +63,6 @@ #ffffff #ff80868B - #ffffffff #ff323232 #99323232 @@ -102,10 +86,6 @@ #8A000000 - - #f2f2f2 - #f8f8f8 - #2196F3 #72B70F diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 07f59e2b4d6..222c18c77b9 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -38,7 +38,6 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; -import android.widget.Toolbar; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -169,8 +168,6 @@ public class SettingsActivity extends SettingsBaseActivity private Button mNextButton; - private boolean mIsShowingDashboard; - private ViewGroup mContent; // Categories @@ -241,9 +238,6 @@ public class SettingsActivity extends SettingsBaseActivity // Getting Intent properties can only be done after the super.onCreate(...) final String initialFragmentName = intent.getStringExtra(EXTRA_SHOW_FRAGMENT); - mIsShowingDashboard = TextUtils.equals( - SettingsActivity.class.getName(), intent.getComponent().getClassName()); - // This is a "Sub Settings" when: // - this is a real SubSettings // - or :settings:show_fragment_as_subsetting is passed to the Intent @@ -256,8 +250,7 @@ public class SettingsActivity extends SettingsBaseActivity setTheme(R.style.Theme_SubSettings); } - setContentView(mIsShowingDashboard ? - R.layout.settings_main_dashboard : R.layout.settings_main_prefs); + setContentView(R.layout.settings_main_prefs); mContent = findViewById(R.id.main_content); @@ -276,25 +269,16 @@ public class SettingsActivity extends SettingsBaseActivity setTitleFromBackStack(); } } else { - launchSettingFragment(initialFragmentName, isSubSettings, intent); + launchSettingFragment(initialFragmentName, intent); } final boolean deviceProvisioned = Utils.isDeviceProvisioned(this); - if (mIsShowingDashboard) { - findViewById(R.id.search_bar).setVisibility( - deviceProvisioned ? View.VISIBLE : View.INVISIBLE); - findViewById(R.id.action_bar).setVisibility(View.GONE); - final Toolbar toolbar = findViewById(R.id.search_action_bar); - setActionBar(toolbar); - FeatureFactory.getFactory(this).getSearchFeatureProvider() - .initSearchToolbar(this, toolbar); - } ActionBar actionBar = getActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(deviceProvisioned); actionBar.setHomeButtonEnabled(deviceProvisioned); - actionBar.setDisplayShowTitleEnabled(!mIsShowingDashboard); + actionBar.setDisplayShowTitleEnabled(true); } mSwitchBar = findViewById(R.id.switch_bar); if (mSwitchBar != null) { @@ -372,8 +356,8 @@ public class SettingsActivity extends SettingsBaseActivity } @VisibleForTesting - void launchSettingFragment(String initialFragmentName, boolean isSubSettings, Intent intent) { - if (!mIsShowingDashboard && initialFragmentName != null) { + void launchSettingFragment(String initialFragmentName, Intent intent) { + if (initialFragmentName != null) { setTitleFromIntent(intent); Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS); diff --git a/src/com/android/settings/search/SearchFeatureProvider.java b/src/com/android/settings/search/SearchFeatureProvider.java index 3c1c62b43c7..34f8629c6e0 100644 --- a/src/com/android/settings/search/SearchFeatureProvider.java +++ b/src/com/android/settings/search/SearchFeatureProvider.java @@ -68,8 +68,10 @@ public interface SearchFeatureProvider { if (activity == null || toolbar == null) { return; } - if (!Utils.isPackageEnabled(activity, getSettingsIntelligencePkgName(activity))) { - final ViewGroup parent = (ViewGroup)toolbar.getParent(); + + if (!Utils.isDeviceProvisioned(activity) || + !Utils.isPackageEnabled(activity, getSettingsIntelligencePkgName(activity))) { + final ViewGroup parent = (ViewGroup) toolbar.getParent(); if (parent != null) { parent.setVisibility(View.GONE); } diff --git a/tests/robotests/src/com/android/settings/SettingsActivityTest.java b/tests/robotests/src/com/android/settings/SettingsActivityTest.java index 2c98f70c2b4..aa414649e70 100644 --- a/tests/robotests/src/com/android/settings/SettingsActivityTest.java +++ b/tests/robotests/src/com/android/settings/SettingsActivityTest.java @@ -28,9 +28,6 @@ import static org.mockito.Mockito.when; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; -import android.os.Bundle; -import android.provider.Settings.Global; -import android.view.View; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; @@ -38,16 +35,13 @@ import androidx.fragment.app.FragmentTransaction; import com.android.settings.core.OnActivityResultListener; import com.android.settings.testutils.SettingsRobolectricTestRunner; -import com.android.settings.testutils.shadow.ShadowUtils; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; import java.util.ArrayList; import java.util.List; @@ -70,29 +64,6 @@ public class SettingsActivityTest { mActivity = spy(new SettingsActivity()); } - @Test - @Config(shadows = ShadowUtils.class) - public void onCreate_deviceNotProvisioned_shouldDisableSearch() { - Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 0); - final SettingsActivity activity = Robolectric.buildActivity(SettingsActivity.class) - .create(Bundle.EMPTY) - .get(); - - assertThat(activity.findViewById(R.id.search_bar).getVisibility()) - .isEqualTo(View.INVISIBLE); - } - - @Test - @Config(shadows = ShadowUtils.class) - public void onCreate_deviceProvisioned_shouldEnableSearch() { - Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 1); - final SettingsActivity activity = Robolectric.buildActivity(SettingsActivity.class) - .create(Bundle.EMPTY) - .get(); - - assertThat(activity.findViewById(R.id.search_bar).getVisibility()).isEqualTo(View.VISIBLE); - } - @Test public void launchSettingFragment_nullExtraShowFragment_shouldNotCrash() { when(mActivity.getSupportFragmentManager()).thenReturn(mFragmentManager); @@ -101,7 +72,7 @@ public class SettingsActivityTest { doReturn(RuntimeEnvironment.application.getClassLoader()).when(mActivity).getClassLoader(); - mActivity.launchSettingFragment(null, true, mock(Intent.class)); + mActivity.launchSettingFragment(null, mock(Intent.class)); } @Test diff --git a/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java index b0e40255622..37fd88801d2 100644 --- a/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java @@ -53,6 +53,8 @@ public class SearchFeatureProviderImplTest { mActivity = Robolectric.setupActivity(Activity.class); mProvider = new SearchFeatureProviderImpl(); mPackageManager = Shadows.shadowOf(mActivity.getPackageManager()); + Settings.Global.putInt(mActivity.getContentResolver(), + Settings.Global.DEVICE_PROVISIONED, 1); } @Test @@ -82,7 +84,7 @@ public class SearchFeatureProviderImplTest { @Test @Config(shadows = ShadowUtils.class) - public void initSearchToolbar_NotHaveResolvedInfo_shouldNotStartActivity() { + public void initSearchToolbar_noResolvedInfo_shouldNotStartActivity() { final Toolbar toolbar = new Toolbar(mActivity); // This ensures navigationView is created. toolbar.setNavigationContentDescription("test"); @@ -90,9 +92,21 @@ public class SearchFeatureProviderImplTest { toolbar.performClick(); - final Intent launchIntent = Shadows.shadowOf(mActivity).getNextStartedActivity(); + assertThat(Shadows.shadowOf(mActivity).getNextStartedActivity()).isNull(); + } - assertThat(launchIntent).isNull(); + @Test + public void initSearchToolbar_deviceNotProvisioned_shouldNotCreateSearchBar() { + final Toolbar toolbar = new Toolbar(mActivity); + // This ensures navigationView is created. + toolbar.setNavigationContentDescription("test"); + + Settings.Global.putInt(mActivity.getContentResolver(), + Settings.Global.DEVICE_PROVISIONED, 0); + + toolbar.performClick(); + + assertThat(Shadows.shadowOf(mActivity).getNextStartedActivity()).isNull(); } @Test(expected = IllegalArgumentException.class) diff --git a/tests/robotests/src/com/android/settings/widget/RoundedHomepageIconTest.java b/tests/robotests/src/com/android/settings/widget/RoundedHomepageIconTest.java index aaffa93ba0b..5bc8ddae4fb 100644 --- a/tests/robotests/src/com/android/settings/widget/RoundedHomepageIconTest.java +++ b/tests/robotests/src/com/android/settings/widget/RoundedHomepageIconTest.java @@ -101,7 +101,7 @@ public class RoundedHomepageIconTest { public void onBindTile_externalTileWithBackgroundColorHint_shouldUpdateIcon() { final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE)); mActivityInfo.metaData.putInt(META_DATA_PREFERENCE_ICON_BACKGROUND_HINT, - R.color.memory_critical); + R.color.material_blue_500); doReturn(Icon.createWithResource(mContext, R.drawable.ic_settings)) .when(tile).getIcon(mContext); @@ -110,7 +110,7 @@ public class RoundedHomepageIconTest { icon.setBackgroundColor(mContext, tile); assertThat(icon.mBackgroundColor) - .isEqualTo(mContext.getColor(R.color.memory_critical)); + .isEqualTo(mContext.getColor(R.color.material_blue_500)); } } From d13b50b39e3516fef0afdf8b7125351d3f0ffe78 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Thu, 29 Nov 2018 13:18:21 -0800 Subject: [PATCH 13/22] Remove the 2 seconds wait time to sync app data usage list. - in v2, completely remove the asyn task to force update the network stats since the network stats apis is actually not used. - in v1, remove the 2s delay and only update the list when the asyn task is done. Change-Id: I10e887022d07fe38504036cbf3f12362eec939b3 Fixes: 119562454 Test: manual --- .../settings/datausage/DataUsageList.java | 8 +------ .../settings/datausage/DataUsageListV2.java | 22 ------------------- 2 files changed, 1 insertion(+), 29 deletions(-) diff --git a/src/com/android/settings/datausage/DataUsageList.java b/src/com/android/settings/datausage/DataUsageList.java index 8f0026f4e1e..24192cd02e7 100644 --- a/src/com/android/settings/datausage/DataUsageList.java +++ b/src/com/android/settings/datausage/DataUsageList.java @@ -193,17 +193,13 @@ public class DataUsageList extends DataUsageBaseFragment { public void onResume() { super.onResume(); mDataStateListener.setListener(true, mSubId, getContext()); - updateBody(); // kick off background task to update stats new AsyncTask() { @Override protected Void doInBackground(Void... params) { try { - // wait a few seconds before kicking off - Thread.sleep(2 * DateUtils.SECOND_IN_MILLIS); services.mStatsService.forceUpdate(); - } catch (InterruptedException e) { } catch (RemoteException e) { } return null; @@ -211,9 +207,7 @@ public class DataUsageList extends DataUsageBaseFragment { @Override protected void onPostExecute(Void result) { - if (isAdded()) { - updateBody(); - } + updateBody(); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } diff --git a/src/com/android/settings/datausage/DataUsageListV2.java b/src/com/android/settings/datausage/DataUsageListV2.java index 4432feec1be..3a71935a865 100644 --- a/src/com/android/settings/datausage/DataUsageListV2.java +++ b/src/com/android/settings/datausage/DataUsageListV2.java @@ -187,28 +187,6 @@ public class DataUsageListV2 extends DataUsageBaseFragment { super.onResume(); mDataStateListener.setListener(true, mSubId, getContext()); updateBody(); - - // kick off background task to update stats - new AsyncTask() { - @Override - protected Void doInBackground(Void... params) { - try { - // wait a few seconds before kicking off - Thread.sleep(2 * DateUtils.SECOND_IN_MILLIS); - services.mStatsService.forceUpdate(); - } catch (InterruptedException e) { - } catch (RemoteException e) { - } - return null; - } - - @Override - protected void onPostExecute(Void result) { - if (isAdded()) { - updateBody(); - } - } - }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @Override From da7a5d1171a63c433c868ca17539abffe9bf50db Mon Sep 17 00:00:00 2001 From: Raff Tsai Date: Fri, 16 Nov 2018 15:06:46 +0800 Subject: [PATCH 14/22] Add log feature - Add ContextualCardFeatureProvider to handle card interaction Bug: 79698338 Test: manual Change-Id: I2a76f5ccfd07072a98ee927bed7dc39731d4cb09 --- res/values/config.xml | 3 + .../ContextualCardFeatureProvider.java | 39 +++++ .../ContextualCardFeatureProviderImpl.java | 136 ++++++++++++++++++ .../slices/SliceContextualCardController.java | 5 + .../slices/SliceContextualCardRenderer.java | 24 +++- .../settings/overlay/FeatureFactory.java | 3 + .../settings/overlay/FeatureFactoryImpl.java | 10 ++ tests/robotests/res/values-mcc999/config.xml | 5 + ...ContextualCardFeatureProviderImplTest.java | 62 ++++++++ .../SliceContextualCardControllerTest.java | 11 +- .../testutils/FakeFeatureFactory.java | 7 + 11 files changed, 301 insertions(+), 4 deletions(-) create mode 100644 src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java create mode 100644 src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java create mode 100644 tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImplTest.java diff --git a/res/values/config.xml b/res/values/config.xml index 6b0a10e29fc..edd948f7962 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -151,6 +151,9 @@ com.android.settings.intelligence + + + com.android.emergency diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java new file mode 100644 index 00000000000..8583f38c78b --- /dev/null +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java @@ -0,0 +1,39 @@ +/* + * 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.homepage.contextualcards; + +import android.content.Context; + +import java.util.List; + +/** Feature provider for the contextual card feature. */ +public interface ContextualCardFeatureProvider { + + /** Homepage displays. */ + public void logHomepageDisplay(Context context, Long latency); + + /** When user clicks dismiss in contextual card */ + public void logContextualCardDismiss(Context context, ContextualCard card); + + /** After ContextualCardManager decides which cards will be displayed/hidden */ + public void logContextualCardDisplay(Context context, List showedCards, + List hiddenCards); + + /** When user clicks toggle/title area of a contextual card. */ + public void logContextualCardClick(Context context, ContextualCard card, int row, + int tapTarget); +} diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java new file mode 100644 index 00000000000..e437e2b37f9 --- /dev/null +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java @@ -0,0 +1,136 @@ +/* + * 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.homepage.contextualcards; + +import android.content.Context; +import android.content.Intent; +import android.text.TextUtils; +import android.util.Log; + +import androidx.annotation.VisibleForTesting; +import androidx.slice.widget.EventInfo; + +import com.android.settings.R; + +import java.util.List; + +public class ContextualCardFeatureProviderImpl implements ContextualCardFeatureProvider { + private static final String TAG = "ContextualCardFeature"; + + // Contextual card interaction logs + // Settings Homepage shows + private static final int CONTEXTUAL_HOME_SHOW = 38; + + // Contextual card shows, log card name and rank + private static final int CONTEXTUAL_CARD_SHOW = 39; + + // Contextual card is eligible to be shown, but doesn't rank high + // enough, log card name and score + private static final int CONTEXTUAL_CARD_NOT_SHOW = 40; + + // Contextual card is dismissed, log card name + private static final int CONTEXTUAL_CARD_DISMISS = 41; + + // Contextual card is clicked , log card name, score, tap area + private static final int CONTEXTUAL_CARD_CLICK = 42; + + // SettingsLogBroadcastReceiver contracts + // contextual card name + private static final String EXTRA_CONTEXTUALCARD_NAME = "name"; + + // contextual card score + private static final String EXTRA_CONTEXTUALCARD_SCORE = "score"; + + // contextual card clicked row + private static final String EXTRA_CONTEXTUALCARD_ROW = "row"; + + // contextual card tap target + private static final String EXTRA_CONTEXTUALCARD_TAP_TARGET = "target"; + + // contextual homepage display latency + private static final String EXTRA_LATENCY = "latency"; + + // log type + private static final String EXTRA_CONTEXTUALCARD_ACTION_TYPE = "type"; + + + // Contextual card tap target + private static final int TARGET_DEFAULT = 0; + + // Click title area + private static final int TARGET_TITLE = 1; + + // Click toggle + private static final int TARGET_TOGGLE = 2; + + // Click slider + private static final int TARGET_SLIDER = 3; + + @Override + public void logHomepageDisplay(Context context, Long latency) { + } + + @Override + public void logContextualCardDismiss(Context context, ContextualCard card) { + final Intent intent = new Intent(); + intent.putExtra(EXTRA_CONTEXTUALCARD_ACTION_TYPE, CONTEXTUAL_CARD_DISMISS); + intent.putExtra(EXTRA_CONTEXTUALCARD_NAME, card.getName()); + intent.putExtra(EXTRA_CONTEXTUALCARD_SCORE, card.getRankingScore()); + sendBroadcast(context, intent); + } + + @Override + public void logContextualCardDisplay(Context context, List showCards, + List hiddenCards) { + } + + @Override + public void logContextualCardClick(Context context, ContextualCard card, int row, + int actionType) { + final Intent intent = new Intent(); + intent.putExtra(EXTRA_CONTEXTUALCARD_ACTION_TYPE, CONTEXTUAL_CARD_CLICK); + intent.putExtra(EXTRA_CONTEXTUALCARD_NAME, card.getName()); + intent.putExtra(EXTRA_CONTEXTUALCARD_SCORE, card.getRankingScore()); + intent.putExtra(EXTRA_CONTEXTUALCARD_ROW, row); + intent.putExtra(EXTRA_CONTEXTUALCARD_TAP_TARGET, actionTypeToTapTarget(actionType)); + sendBroadcast(context, intent); + } + + @VisibleForTesting + void sendBroadcast(final Context context, final Intent intent) { + intent.setPackage(context.getString(R.string.config_settingsintelligence_package_name)); + final String action = context.getString(R.string.config_settingsintelligence_log_action); + if (!TextUtils.isEmpty(action)) { + intent.setAction(action); + context.sendBroadcast(intent); + } + } + + private int actionTypeToTapTarget(int actionType) { + switch (actionType) { + case EventInfo.ACTION_TYPE_CONTENT: + return TARGET_TITLE; + case EventInfo.ACTION_TYPE_TOGGLE: + return TARGET_TOGGLE; + case EventInfo.ACTION_TYPE_SLIDER: + return TARGET_SLIDER; + default: + Log.w(TAG, "unknown type " + actionType); + return TARGET_DEFAULT; + } + } +} diff --git a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardController.java b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardController.java index 3368580e002..4378be3f0d7 100644 --- a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardController.java +++ b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardController.java @@ -26,8 +26,10 @@ import com.android.settings.R; import com.android.settings.homepage.contextualcards.CardDatabaseHelper; import com.android.settings.homepage.contextualcards.ContextualCard; import com.android.settings.homepage.contextualcards.ContextualCardController; +import com.android.settings.homepage.contextualcards.ContextualCardFeatureProvider; import com.android.settings.homepage.contextualcards.ContextualCardFeedbackDialog; import com.android.settings.homepage.contextualcards.ContextualCardUpdateListener; +import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.utils.ThreadUtils; /** @@ -67,6 +69,9 @@ public class SliceContextualCardController implements ContextualCardController { dbHelper.markContextualCardAsDismissed(mContext, card.getName()); }); showFeedbackDialog(card); + final ContextualCardFeatureProvider contexualCardFeatureProvider = + FeatureFactory.getFactory(mContext).getContextualCardFeatureProvider(); + contexualCardFeatureProvider.logContextualCardDismiss(mContext, card); } @Override diff --git a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java index 74f25eb7478..a2d6e2b119c 100644 --- a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java +++ b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java @@ -20,6 +20,7 @@ import android.content.ContentResolver; import android.content.Context; import android.net.Uri; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.Log; import android.view.View; import android.widget.Button; @@ -38,10 +39,13 @@ import androidx.slice.widget.SliceView; import com.android.settings.R; import com.android.settings.homepage.contextualcards.ContextualCard; +import com.android.settings.homepage.contextualcards.ContextualCardFeatureProvider; import com.android.settings.homepage.contextualcards.ContextualCardRenderer; import com.android.settings.homepage.contextualcards.ControllerRendererPool; +import com.android.settings.overlay.FeatureFactory; import java.util.Map; +import java.util.Set; /** * Card renderer for {@link ContextualCard} built as slices. @@ -58,6 +62,7 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, private final Context mContext; private final LifecycleOwner mLifecycleOwner; private final ControllerRendererPool mControllerRendererPool; + private final Set mCardSet; public SliceContextualCardRenderer(Context context, LifecycleOwner lifecycleOwner, ControllerRendererPool controllerRendererPool) { @@ -65,6 +70,7 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, mLifecycleOwner = lifecycleOwner; mSliceLiveDataMap = new ArrayMap<>(); mControllerRendererPool = controllerRendererPool; + mCardSet = new ArraySet<>(); } @Override @@ -99,6 +105,7 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, sliceLiveData = SliceLiveData.fromUri(mContext, uri); mSliceLiveDataMap.put(uri.toString(), sliceLiveData); } + mCardSet.add(card); sliceLiveData.removeObservers(mLifecycleOwner); sliceLiveData.observe(mLifecycleOwner, slice -> { @@ -128,14 +135,27 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, final Button btnRemove = cardHolder.itemView.findViewById(R.id.remove); btnRemove.setOnClickListener(v -> { - mControllerRendererPool.getController(mContext, card.getCardType()).onDismissed( - card); + mControllerRendererPool.getController(mContext, card.getCardType()).onDismissed(card); }); } @Override public void onSliceAction(@NonNull EventInfo eventInfo, @NonNull SliceItem sliceItem) { //TODO(b/79698338): Log user interaction + + // sliceItem.getSlice().getUri() is like + // content://android.settings.slices/action/wifi/_gen/0/_gen/0 + // contextualCard.getSliceUri() is prefix of sliceItem.getSlice().getUri() + for (ContextualCard card : mCardSet) { + if (sliceItem.getSlice().getUri().toString().startsWith( + card.getSliceUri().toString())) { + ContextualCardFeatureProvider contexualCardFeatureProvider = + FeatureFactory.getFactory(mContext).getContextualCardFeatureProvider(); + contexualCardFeatureProvider.logContextualCardClick(mContext, card, + eventInfo.rowIndex, eventInfo.actionType); + break; + } + } } public static class SliceViewHolder extends RecyclerView.ViewHolder { diff --git a/src/com/android/settings/overlay/FeatureFactory.java b/src/com/android/settings/overlay/FeatureFactory.java index 02468b8ad06..a52619b3a6f 100644 --- a/src/com/android/settings/overlay/FeatureFactory.java +++ b/src/com/android/settings/overlay/FeatureFactory.java @@ -28,6 +28,7 @@ import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.gestures.AssistGestureFeatureProvider; +import com.android.settings.homepage.contextualcards.ContextualCardFeatureProvider; import com.android.settings.localepicker.LocaleFeatureProvider; import com.android.settings.panel.PanelFeatureProvider; import com.android.settings.search.SearchFeatureProvider; @@ -108,6 +109,8 @@ public abstract class FeatureFactory { public abstract PanelFeatureProvider getPanelFeatureProvider(); + public abstract ContextualCardFeatureProvider getContextualCardFeatureProvider(); + public static final class FactoryNotFoundException extends RuntimeException { public FactoryNotFoundException(Throwable throwable) { super("Unable to create factory. Did you misconfigure Proguard?", throwable); diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java index 8d6d4b69fb6..3515ac06a48 100644 --- a/src/com/android/settings/overlay/FeatureFactoryImpl.java +++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java @@ -40,6 +40,8 @@ import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.fuelgauge.PowerUsageFeatureProviderImpl; import com.android.settings.gestures.AssistGestureFeatureProvider; import com.android.settings.gestures.AssistGestureFeatureProviderImpl; +import com.android.settings.homepage.contextualcards.ContextualCardFeatureProvider; +import com.android.settings.homepage.contextualcards.ContextualCardFeatureProviderImpl; import com.android.settings.localepicker.LocaleFeatureProvider; import com.android.settings.localepicker.LocaleFeatureProviderImpl; import com.android.settings.panel.PanelFeatureProvider; @@ -75,6 +77,7 @@ public class FeatureFactoryImpl extends FeatureFactory { private SlicesFeatureProvider mSlicesFeatureProvider; private AccountFeatureProvider mAccountFeatureProvider; private PanelFeatureProvider mPanelFeatureProvider; + private ContextualCardFeatureProvider mContextualCardFeatureProvider; @Override public SupportFeatureProvider getSupportFeatureProvider(Context context) { @@ -220,4 +223,11 @@ public class FeatureFactoryImpl extends FeatureFactory { } return mPanelFeatureProvider; } + + public ContextualCardFeatureProvider getContextualCardFeatureProvider() { + if (mContextualCardFeatureProvider == null) { + mContextualCardFeatureProvider = new ContextualCardFeatureProviderImpl(); + } + return mContextualCardFeatureProvider; + } } diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml index 9bba3c331d9..c5c552e54e1 100644 --- a/tests/robotests/res/values-mcc999/config.xml +++ b/tests/robotests/res/values-mcc999/config.xml @@ -73,6 +73,11 @@ fake_package/fake_service + + + aaa.bbb.ccc + + com.android.settings.slice_whitelist_package diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImplTest.java new file mode 100644 index 00000000000..08631f7bdfc --- /dev/null +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImplTest.java @@ -0,0 +1,62 @@ +/* + * 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.homepage.contextualcards; + +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.content.Intent; + +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(SettingsRobolectricTestRunner.class) +public class ContextualCardFeatureProviderImplTest { + + private Context mContext; + private ContextualCardFeatureProviderImpl mImpl; + + @Before + public void setUp() { + mContext = spy(RuntimeEnvironment.application); + mImpl = new ContextualCardFeatureProviderImpl(); + } + + @Test + public void sendBroadcast_emptyAction_notSendBroadcast() { + final Intent intent = new Intent(); + mImpl.sendBroadcast(mContext, intent); + + verify(mContext, never()).sendBroadcast(intent); + } + + @Test + @Config(qualifiers = "mcc999") + public void sendBroadcast_hasAction_sendBroadcast() { + final Intent intent = new Intent(); + mImpl.sendBroadcast(mContext, intent); + + verify(mContext).sendBroadcast(intent); + } +} \ No newline at end of file diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java index 29e309d9620..af3b2e8b015 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java @@ -18,9 +18,10 @@ package com.android.settings.homepage.contextualcards.slices; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import android.content.ContentResolver; import android.content.ContentValues; @@ -33,6 +34,7 @@ import com.android.settings.homepage.contextualcards.CardDatabaseHelper; import com.android.settings.homepage.contextualcards.ContextualCard; import com.android.settings.homepage.contextualcards.ContextualCardFeedbackDialog; import com.android.settings.homepage.contextualcards.ContextualCardsFragment; +import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; @@ -57,6 +59,7 @@ public class SliceContextualCardControllerTest { private CardContentProvider mProvider; private ContentResolver mResolver; private SliceContextualCardController mController; + private FakeFeatureFactory mFeatureFactory; @Before public void setUp() { @@ -67,6 +70,7 @@ public class SliceContextualCardControllerTest { mProvider); mResolver = mContext.getContentResolver(); mController = spy(new SliceContextualCardController(mContext)); + mFeatureFactory = FakeFeatureFactory.setupForTest(); } @Test @@ -75,7 +79,8 @@ public class SliceContextualCardControllerTest { mResolver.insert(providerUri, generateOneRow()); doNothing().when(mController).showFeedbackDialog(any(ContextualCard.class)); - mController.onDismissed(getTestSliceCard()); + final ContextualCard card = getTestSliceCard(); + mController.onDismissed(card); final String[] columns = {CardDatabaseHelper.CardColumns.CARD_DISMISSED}; final String selection = CardDatabaseHelper.CardColumns.NAME + "=?"; @@ -86,6 +91,8 @@ public class SliceContextualCardControllerTest { cr.close(); assertThat(qryDismissed).isEqualTo(1); + verify(mFeatureFactory.mContextualCardFeatureProvider).logContextualCardDismiss( + mContext, card); } @Test diff --git a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java index e14ef1f4b9d..978dd7d30f5 100644 --- a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java +++ b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java @@ -28,6 +28,7 @@ import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.gestures.AssistGestureFeatureProvider; +import com.android.settings.homepage.contextualcards.ContextualCardFeatureProvider; import com.android.settings.localepicker.LocaleFeatureProvider; import com.android.settings.overlay.DockUpdaterFeatureProvider; import com.android.settings.overlay.FeatureFactory; @@ -63,6 +64,7 @@ public class FakeFeatureFactory extends FeatureFactory { public final AssistGestureFeatureProvider assistGestureFeatureProvider; public final AccountFeatureProvider mAccountFeatureProvider; public final PanelFeatureProvider mPanelFeatureProvider; + public final ContextualCardFeatureProvider mContextualCardFeatureProvider; public SlicesFeatureProvider slicesFeatureProvider; public SearchFeatureProvider searchFeatureProvider; @@ -105,6 +107,7 @@ public class FakeFeatureFactory extends FeatureFactory { slicesFeatureProvider = mock(SlicesFeatureProvider.class); mAccountFeatureProvider = mock(AccountFeatureProvider.class); mPanelFeatureProvider = mock(PanelFeatureProvider.class); + mContextualCardFeatureProvider = mock(ContextualCardFeatureProvider.class); } @Override @@ -191,4 +194,8 @@ public class FakeFeatureFactory extends FeatureFactory { public PanelFeatureProvider getPanelFeatureProvider() { return mPanelFeatureProvider; } + + public ContextualCardFeatureProvider getContextualCardFeatureProvider() { + return mContextualCardFeatureProvider; + } } From 134332fafab09b5a152d7837e5a1a9fd2db061f4 Mon Sep 17 00:00:00 2001 From: John Reck Date: Thu, 29 Nov 2018 16:00:08 -0800 Subject: [PATCH 15/22] Bump string length limits Bug: 119882754 Test: strings can be longer Change-Id: I9545387639166ba6150d8a9d8e99c9ea9cd03e24 --- res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index e93e06f87af..830aa820727 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10322,9 +10322,9 @@ Force experimental desktop mode on secondary displays - + Override force-dark - + Overrides the force-dark feature to be always-on From 53f75f0df9bf06df318b9e80774b007bda0cbd75 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 27 Nov 2018 16:14:51 -0800 Subject: [PATCH 16/22] Move all custom slice uris to a registry class. Change-Id: I192320f95ac81d14c8891ce2531d603912e59f56 Fixes: 119776308 Test: robotests --- .../bluetooth/BluetoothSliceBuilder.java | 16 +- .../flashlight/FlashlightSliceBuilder.java | 54 ++--- .../BatteryTipPreferenceController.java | 3 + .../contextualcards/ContextualCardLoader.java | 7 +- .../SettingsContextualCardProvider.java | 23 +-- .../deviceinfo/BatterySlice.java | 31 +-- .../deviceinfo/DataUsageSlice.java | 30 +-- .../deviceinfo/DeviceInfoSlice.java | 31 +-- .../deviceinfo/EmergencyInfoSlice.java | 24 +-- .../deviceinfo/StorageSlice.java | 31 +-- .../slices/BatteryFixSlice.java | 35 +--- .../slices/ConnectedDeviceSlice.java | 31 +-- .../slices/LowStorageSlice.java | 31 +-- .../location/LocationSliceBuilder.java | 18 +- .../telephony/Enhanced4gLteSliceHelper.java | 22 +-- .../ZenModePreferenceController.java | 3 + .../notification/ZenModeSliceBuilder.java | 23 +-- .../panel/InternetConnectivityPanel.java | 20 +- .../settings/slices/CustomSliceManager.java | 16 +- .../settings/slices/CustomSliceRegistry.java | 184 ++++++++++++++++++ .../slices/SettingsSliceProvider.java | 41 ++-- .../slices/SliceDeepLinkSpringBoard.java | 6 +- src/com/android/settings/wifi/WifiSlice.java | 22 +-- .../wifi/calling/WifiCallingSliceHelper.java | 57 ++---- .../RecentAppsPreferenceControllerTest.java | 32 +-- ...rySaverButtonPreferenceControllerTest.java | 19 +- .../ContextualCardLoaderTest.java | 12 +- .../SettingsContextualCardProviderTest.java | 13 +- .../Enhanced4gLteSliceHelperTest.java | 9 +- .../panel/InternetConnectivityPanelTest.java | 6 +- .../slices/SettingsSliceProviderTest.java | 31 ++- .../calling/WifiCallingSliceHelperTest.java | 19 +- .../slices/SliceDeepLinkSpringBoardTest.java | 14 +- 33 files changed, 415 insertions(+), 499 deletions(-) create mode 100644 src/com/android/settings/slices/CustomSliceRegistry.java diff --git a/src/com/android/settings/bluetooth/BluetoothSliceBuilder.java b/src/com/android/settings/bluetooth/BluetoothSliceBuilder.java index 1462f917aa3..0a2e8ceb7fa 100644 --- a/src/com/android/settings/bluetooth/BluetoothSliceBuilder.java +++ b/src/com/android/settings/bluetooth/BluetoothSliceBuilder.java @@ -20,7 +20,6 @@ import static android.app.slice.Slice.EXTRA_TOGGLE_STATE; import android.annotation.ColorInt; import android.app.PendingIntent; import android.bluetooth.BluetoothAdapter; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -37,6 +36,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.SubSettings; import com.android.settings.connecteddevice.BluetoothDashboardFragment; +import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.SliceBroadcastReceiver; import com.android.settings.slices.SliceBuilderUtils; @@ -47,16 +47,6 @@ public class BluetoothSliceBuilder { private static final String TAG = "BluetoothSliceBuilder"; - /** - * Backing Uri for the Bluetooth Slice. - */ - public static final Uri BLUETOOTH_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSlicesContract.AUTHORITY) - .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) - .appendPath(SettingsSlicesContract.KEY_BLUETOOTH) - .build(); - /** * Action notifying a change on the BluetoothSlice. */ @@ -74,7 +64,7 @@ public class BluetoothSliceBuilder { } /** - * Return a Bluetooth Slice bound to {@link #BLUETOOTH_URI}. + * Return a Bluetooth Slice bound to {@link CustomSliceRegistry#BLUETOOTH_URI}. *

* Note that you should register a listener for {@link #INTENT_FILTER} to get changes for * Bluetooth. @@ -92,7 +82,7 @@ public class BluetoothSliceBuilder { final SliceAction toggleSliceAction = new SliceAction(toggleAction, null /* actionTitle */, isBluetoothEnabled); - return new ListBuilder(context, BLUETOOTH_URI, ListBuilder.INFINITY) + return new ListBuilder(context, CustomSliceRegistry.BLUETOOTH_URI, ListBuilder.INFINITY) .setAccentColor(color) .addRow(new RowBuilder() .setTitle(title) diff --git a/src/com/android/settings/flashlight/FlashlightSliceBuilder.java b/src/com/android/settings/flashlight/FlashlightSliceBuilder.java index d21739ebbcd..57d99ef530f 100644 --- a/src/com/android/settings/flashlight/FlashlightSliceBuilder.java +++ b/src/com/android/settings/flashlight/FlashlightSliceBuilder.java @@ -22,17 +22,14 @@ import static androidx.slice.builders.ListBuilder.ICON_IMAGE; import android.annotation.ColorInt; import android.app.PendingIntent; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraManager; -import android.net.Uri; import android.provider.Settings; import android.provider.Settings.Secure; -import android.provider.SettingsSlicesContract; import android.util.Log; import androidx.core.graphics.drawable.IconCompat; @@ -43,7 +40,7 @@ import androidx.slice.builders.SliceAction; import com.android.settings.R; import com.android.settings.Utils; -import com.android.settings.slices.SettingsSliceProvider; +import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.SliceBroadcastReceiver; @@ -54,37 +51,23 @@ public class FlashlightSliceBuilder { private static final String TAG = "FlashlightSliceBuilder"; - public static final String KEY_FLASHLIGHT = "flashlight"; - - /** - * Backing Uri for the Flashlight Slice. - */ - public static final Uri FLASHLIGHT_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSliceProvider.SLICE_AUTHORITY) - .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) - .appendPath(KEY_FLASHLIGHT) - .build(); - /** * Action notifying a change on the Flashlight Slice. */ public static final String ACTION_FLASHLIGHT_SLICE_CHANGED = - "com.android.settings.flashlight.action.FLASHLIGHT_SLICE_CHANGED"; + "com.android.settings.flashlight.action.FLASHLIGHT_SLICE_CHANGED"; /** * Action broadcasting a change on whether flashlight is on or off. */ public static final String ACTION_FLASHLIGHT_CHANGED = - "com.android.settings.flashlight.action.FLASHLIGHT_CHANGED"; + "com.android.settings.flashlight.action.FLASHLIGHT_CHANGED"; public static final IntentFilter INTENT_FILTER = new IntentFilter(ACTION_FLASHLIGHT_CHANGED); - private FlashlightSliceBuilder() {} + private FlashlightSliceBuilder() { + } - /** - * Return a Flashlight Slice bound to {@link #FLASHLIGHT_URI}. - */ public static Slice getSlice(Context context) { if (!isFlashlightAvailable(context)) { return null; @@ -93,14 +76,15 @@ public class FlashlightSliceBuilder { @ColorInt final int color = Utils.getColorAccentDefaultColor(context); final IconCompat icon = IconCompat.createWithResource(context, R.drawable.ic_signal_flashlight); - return new ListBuilder(context, FLASHLIGHT_URI, ListBuilder.INFINITY) - .setAccentColor(color) - .addRow(new RowBuilder() - .setTitle(context.getText(R.string.power_flashlight)) - .setTitleItem(icon, ICON_IMAGE) - .setPrimaryAction( - new SliceAction(toggleAction, null, isFlashlightEnabled(context)))) - .build(); + return new ListBuilder(context, CustomSliceRegistry.FLASHLIGHT_SLICE_URI, + ListBuilder.INFINITY) + .setAccentColor(color) + .addRow(new RowBuilder() + .setTitle(context.getText(R.string.power_flashlight)) + .setTitleItem(icon, ICON_IMAGE) + .setPrimaryAction( + new SliceAction(toggleAction, null, isFlashlightEnabled(context)))) + .build(); } /** @@ -119,7 +103,7 @@ public class FlashlightSliceBuilder { } catch (CameraAccessException e) { Log.e(TAG, "Camera couldn't set torch mode.", e); } - context.getContentResolver().notifyChange(FLASHLIGHT_URI, null); + context.getContentResolver().notifyChange(CustomSliceRegistry.FLASHLIGHT_SLICE_URI, null); } private static String getCameraId(Context context) throws CameraAccessException { @@ -130,7 +114,7 @@ public class FlashlightSliceBuilder { Boolean flashAvailable = c.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); Integer lensFacing = c.get(CameraCharacteristics.LENS_FACING); if (flashAvailable != null && flashAvailable - && lensFacing != null && lensFacing == CameraCharacteristics.LENS_FACING_BACK) { + && lensFacing != null && lensFacing == CameraCharacteristics.LENS_FACING_BACK) { return id; } } @@ -141,16 +125,16 @@ public class FlashlightSliceBuilder { final Intent intent = new Intent(ACTION_FLASHLIGHT_SLICE_CHANGED); intent.setClass(context, SliceBroadcastReceiver.class); return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent, - PendingIntent.FLAG_CANCEL_CURRENT); + PendingIntent.FLAG_CANCEL_CURRENT); } private static boolean isFlashlightAvailable(Context context) { return Settings.Secure.getInt( - context.getContentResolver(), Secure.FLASHLIGHT_AVAILABLE, 0) == 1; + context.getContentResolver(), Secure.FLASHLIGHT_AVAILABLE, 0) == 1; } private static boolean isFlashlightEnabled(Context context) { return Settings.Secure.getInt( - context.getContentResolver(), Secure.FLASHLIGHT_ENABLED, 0) == 1; + context.getContentResolver(), Secure.FLASHLIGHT_ENABLED, 0) == 1; } } diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java index eac2bf5c2f6..0d9b1c41573 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java @@ -42,6 +42,9 @@ import java.util.Map; * Controller in charge of the battery tip group */ public class BatteryTipPreferenceController extends BasePreferenceController { + + public static final String PREF_NAME = "battery_tip"; + private static final String TAG = "BatteryTipPreferenceController"; private static final int REQUEST_ANOMALY_ACTION = 0; private static final String KEY_BATTERY_TIPS = "key_battery_tips"; diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java index 4c06601a431..3ef465333fd 100644 --- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java @@ -34,8 +34,7 @@ import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import androidx.slice.Slice; -import com.android.settings.homepage.contextualcards.slices.ConnectedDeviceSlice; -import com.android.settings.wifi.WifiSlice; +import com.android.settings.slices.CustomSliceRegistry; import com.android.settingslib.utils.AsyncLoaderCompat; import java.util.ArrayList; @@ -170,8 +169,8 @@ public class ContextualCardLoader extends AsyncLoaderCompat private int getNumberOfLargeCard(List cards) { return (int) cards.stream() - .filter(card -> card.getSliceUri().equals(WifiSlice.WIFI_URI) - || card.getSliceUri().equals(ConnectedDeviceSlice.CONNECTED_DEVICE_URI)) + .filter(card -> card.getSliceUri().equals(CustomSliceRegistry.WIFI_SLICE_URI) + || card.getSliceUri().equals(CustomSliceRegistry.CONNECTED_DEVICE_SLICE_URI)) .count(); } diff --git a/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java b/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java index 5ff3e909e42..376bb83606a 100644 --- a/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java +++ b/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java @@ -16,16 +16,11 @@ package com.android.settings.homepage.contextualcards; -import static android.provider.SettingsSlicesContract.KEY_WIFI; - import android.annotation.Nullable; -import com.android.settings.homepage.contextualcards.slices.BatteryFixSlice; -import com.android.settings.homepage.contextualcards.slices.ConnectedDeviceSlice; -import com.android.settings.homepage.contextualcards.slices.LowStorageSlice; import com.android.settings.intelligence.ContextualCardProto.ContextualCard; import com.android.settings.intelligence.ContextualCardProto.ContextualCardList; -import com.android.settings.wifi.WifiSlice; +import com.android.settings.slices.CustomSliceRegistry; import com.google.android.settings.intelligence.libs.contextualcards.ContextualCardProvider; @@ -39,26 +34,26 @@ public class SettingsContextualCardProvider extends ContextualCardProvider { public ContextualCardList getContextualCards() { final ContextualCard wifiCard = ContextualCard.newBuilder() - .setSliceUri(WifiSlice.WIFI_URI.toString()) - .setCardName(KEY_WIFI) + .setSliceUri(CustomSliceRegistry.WIFI_SLICE_URI.toString()) + .setCardName(CustomSliceRegistry.WIFI_SLICE_URI.toString()) .setCardCategory(ContextualCard.Category.IMPORTANT) .build(); final ContextualCard connectedDeviceCard = ContextualCard.newBuilder() - .setSliceUri(ConnectedDeviceSlice.CONNECTED_DEVICE_URI.toString()) - .setCardName(ConnectedDeviceSlice.PATH_CONNECTED_DEVICE) + .setSliceUri(CustomSliceRegistry.CONNECTED_DEVICE_SLICE_URI.toString()) + .setCardName(CustomSliceRegistry.CONNECTED_DEVICE_SLICE_URI.toString()) .setCardCategory(ContextualCard.Category.IMPORTANT) .build(); final ContextualCard lowStorageCard = ContextualCard.newBuilder() - .setSliceUri(LowStorageSlice.LOW_STORAGE_URI.toString()) - .setCardName(LowStorageSlice.PATH_LOW_STORAGE) + .setSliceUri(CustomSliceRegistry.LOW_STORAGE_SLICE_URI.toString()) + .setCardName(CustomSliceRegistry.LOW_STORAGE_SLICE_URI.toString()) .setCardCategory(ContextualCard.Category.IMPORTANT) .build(); final ContextualCard batteryFixCard = ContextualCard.newBuilder() - .setSliceUri(BatteryFixSlice.BATTERY_FIX_URI.toString()) - .setCardName(BatteryFixSlice.PATH_BATTERY_FIX) + .setSliceUri(CustomSliceRegistry.BATTERY_FIX_SLICE_URI.toString()) + .setCardName(CustomSliceRegistry.BATTERY_FIX_SLICE_URI.toString()) .setCardCategory(ContextualCard.Category.IMPORTANT) .build(); final ContextualCardList cards = ContextualCardList.newBuilder() diff --git a/src/com/android/settings/homepage/contextualcards/deviceinfo/BatterySlice.java b/src/com/android/settings/homepage/contextualcards/deviceinfo/BatterySlice.java index 873b942aaff..222e9dd3bfc 100644 --- a/src/com/android/settings/homepage/contextualcards/deviceinfo/BatterySlice.java +++ b/src/com/android/settings/homepage/contextualcards/deviceinfo/BatterySlice.java @@ -16,8 +16,9 @@ package com.android.settings.homepage.contextualcards.deviceinfo; +import static com.android.settings.slices.CustomSliceRegistry.BATTERY_INFO_SLICE_URI; + import android.app.PendingIntent; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -37,7 +38,6 @@ import com.android.settings.Utils; import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.PowerUsageSummary; import com.android.settings.slices.CustomSliceable; -import com.android.settings.slices.SettingsSliceProvider; import com.android.settings.slices.SliceBuilderUtils; /** @@ -46,20 +46,6 @@ import com.android.settings.slices.SliceBuilderUtils; public class BatterySlice implements CustomSliceable { private static final String TAG = "BatterySlice"; - /** - * The path denotes the unique name of battery slice. - */ - public static final String PATH_BATTERY_INFO = "battery_card"; - - /** - * Backing Uri for the Battery Slice. - */ - public static final Uri BATTERY_CARD_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSliceProvider.SLICE_AUTHORITY) - .appendPath(PATH_BATTERY_INFO) - .build(); - private final Context mContext; private BatteryInfo mBatteryInfo; @@ -69,9 +55,6 @@ public class BatterySlice implements CustomSliceable { mContext = context; } - /** - * Return a {@link BatterySlice} bound to {@link #BATTERY_CARD_URI} - */ @Override public Slice getSlice() { if (mBatteryInfo == null) { @@ -82,7 +65,7 @@ public class BatterySlice implements CustomSliceable { R.drawable.ic_settings_battery); final CharSequence title = mContext.getText(R.string.power_usage_summary_title); final SliceAction primarySliceAction = new SliceAction(getPrimaryAction(), icon, title); - final Slice slice = new ListBuilder(mContext, BATTERY_CARD_URI, ListBuilder.INFINITY) + final Slice slice = new ListBuilder(mContext, BATTERY_INFO_SLICE_URI, ListBuilder.INFINITY) .setAccentColor(Utils.getColorAccentDefaultColor(mContext)) .setHeader(new ListBuilder.HeaderBuilder().setTitle(title)) .addRow(new ListBuilder.RowBuilder() @@ -97,7 +80,7 @@ public class BatterySlice implements CustomSliceable { @Override public Uri getUri() { - return BATTERY_CARD_URI; + return BATTERY_INFO_SLICE_URI; } @Override @@ -108,12 +91,10 @@ public class BatterySlice implements CustomSliceable { @Override public Intent getIntent() { final String screenTitle = mContext.getText(R.string.power_usage_summary_title).toString(); - final Uri contentUri = new Uri.Builder().appendPath(PATH_BATTERY_INFO).build(); return SliceBuilderUtils.buildSearchResultPageIntent(mContext, - PowerUsageSummary.class.getName(), PATH_BATTERY_INFO, screenTitle, + PowerUsageSummary.class.getName(), "" /* key */, screenTitle, MetricsProto.MetricsEvent.SLICE) - .setClassName(mContext.getPackageName(), SubSettings.class.getName()) - .setData(contentUri); + .setClassName(mContext.getPackageName(), SubSettings.class.getName()); } @Override diff --git a/src/com/android/settings/homepage/contextualcards/deviceinfo/DataUsageSlice.java b/src/com/android/settings/homepage/contextualcards/deviceinfo/DataUsageSlice.java index 6296b1ee8c5..9be4b6125c9 100644 --- a/src/com/android/settings/homepage/contextualcards/deviceinfo/DataUsageSlice.java +++ b/src/com/android/settings/homepage/contextualcards/deviceinfo/DataUsageSlice.java @@ -17,7 +17,6 @@ package com.android.settings.homepage.contextualcards.deviceinfo; import android.app.PendingIntent; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -39,8 +38,8 @@ import com.android.settings.SubSettings; import com.android.settings.Utils; import com.android.settings.datausage.DataUsageSummary; import com.android.settings.datausage.DataUsageUtils; +import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.CustomSliceable; -import com.android.settings.slices.SettingsSliceProvider; import com.android.settings.slices.SliceBuilderUtils; import com.android.settingslib.net.DataUsageController; @@ -50,19 +49,6 @@ public class DataUsageSlice implements CustomSliceable { private static final String TAG = "DataUsageSlice"; private static final long MILLIS_IN_A_DAY = TimeUnit.DAYS.toMillis(1); - /** - * The path denotes the unique name of data usage slice. - */ - public static final String PATH_DATA_USAGE = "data_usage_card"; - - /** - * Backing Uri for the Data usage Slice. - */ - public static final Uri DATA_USAGE_CARD_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSliceProvider.SLICE_AUTHORITY) - .appendPath(PATH_DATA_USAGE) - .build(); private final Context mContext; @@ -72,12 +58,9 @@ public class DataUsageSlice implements CustomSliceable { @Override public Uri getUri() { - return DATA_USAGE_CARD_URI; + return CustomSliceRegistry.DATA_USAGE_SLICE_URI; } - /** - * Return a Data usage Slice bound to {@link #DATA_USAGE_CARD_URI} - */ @Override public Slice getSlice() { final IconCompat icon = IconCompat.createWithResource(mContext, @@ -87,7 +70,8 @@ public class DataUsageSlice implements CustomSliceable { final DataUsageController dataUsageController = new DataUsageController(mContext); final DataUsageController.DataUsageInfo info = dataUsageController.getDataUsageInfo(); final ListBuilder listBuilder = - new ListBuilder(mContext, DATA_USAGE_CARD_URI, ListBuilder.INFINITY) + new ListBuilder(mContext, CustomSliceRegistry.DATA_USAGE_SLICE_URI, + ListBuilder.INFINITY) .setAccentColor(Utils.getColorAccentDefaultColor(mContext)) .setHeader(new ListBuilder.HeaderBuilder().setTitle(title)); if (DataUsageUtils.hasSim(mContext)) { @@ -106,12 +90,10 @@ public class DataUsageSlice implements CustomSliceable { @Override public Intent getIntent() { final String screenTitle = mContext.getText(R.string.data_usage_wifi_title).toString(); - final Uri contentUri = new Uri.Builder().appendPath(PATH_DATA_USAGE).build(); return SliceBuilderUtils.buildSearchResultPageIntent(mContext, - DataUsageSummary.class.getName(), PATH_DATA_USAGE, screenTitle, + DataUsageSummary.class.getName(), "" /* key */, screenTitle, MetricsProto.MetricsEvent.SLICE) - .setClassName(mContext.getPackageName(), SubSettings.class.getName()) - .setData(contentUri); + .setClassName(mContext.getPackageName(), SubSettings.class.getName()); } private PendingIntent getPrimaryAction() { diff --git a/src/com/android/settings/homepage/contextualcards/deviceinfo/DeviceInfoSlice.java b/src/com/android/settings/homepage/contextualcards/deviceinfo/DeviceInfoSlice.java index b8751f8e827..b7c662e8e6e 100644 --- a/src/com/android/settings/homepage/contextualcards/deviceinfo/DeviceInfoSlice.java +++ b/src/com/android/settings/homepage/contextualcards/deviceinfo/DeviceInfoSlice.java @@ -17,7 +17,6 @@ package com.android.settings.homepage.contextualcards.deviceinfo; import android.app.PendingIntent; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -39,8 +38,8 @@ import com.android.settings.SubSettings; import com.android.settings.Utils; import com.android.settings.deviceinfo.DeviceModelPreferenceController; import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment; +import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.CustomSliceable; -import com.android.settings.slices.SettingsSliceProvider; import com.android.settings.slices.SliceBuilderUtils; import com.android.settingslib.DeviceInfoUtils; @@ -49,20 +48,6 @@ import java.util.List; public class DeviceInfoSlice implements CustomSliceable { private static final String TAG = "DeviceInfoSlice"; - /** - * The path denotes the unique name of device info slice - */ - public static final String PATH_DEVICE_INFO = "device_info_card"; - - /** - * Backing Uri for the Device info Slice. - */ - public static final Uri DEVICE_INFO_CARD_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSliceProvider.SLICE_AUTHORITY) - .appendPath(PATH_DEVICE_INFO) - .build(); - private final Context mContext; private final SubscriptionManager mSubscriptionManager; @@ -71,16 +56,14 @@ public class DeviceInfoSlice implements CustomSliceable { mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class); } - /** - * Return a device info slice bound to {@Link #DEVICE_INFO_CARD_URI} - */ @Override public Slice getSlice() { final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.ic_info_outline_24dp); final String title = mContext.getString(R.string.device_info_label); final SliceAction primaryAction = new SliceAction(getPrimaryAction(), icon, title); - return new ListBuilder(mContext, DEVICE_INFO_CARD_URI, ListBuilder.INFINITY) + return new ListBuilder(mContext, CustomSliceRegistry.DEVICE_INFO_SLICE_URI, + ListBuilder.INFINITY) .setAccentColor((Utils.getColorAccentDefaultColor(mContext))) .setHeader(new ListBuilder.HeaderBuilder().setTitle(title)) .addRow(new ListBuilder.RowBuilder() @@ -92,18 +75,16 @@ public class DeviceInfoSlice implements CustomSliceable { @Override public Uri getUri() { - return DEVICE_INFO_CARD_URI; + return CustomSliceRegistry.DEVICE_INFO_SLICE_URI; } @Override public Intent getIntent() { final String screenTitle = mContext.getText(R.string.device_info_label).toString(); - final Uri contentUri = new Uri.Builder().appendPath(PATH_DEVICE_INFO).build(); return SliceBuilderUtils.buildSearchResultPageIntent(mContext, - MyDeviceInfoFragment.class.getName(), PATH_DEVICE_INFO, screenTitle, + MyDeviceInfoFragment.class.getName(), "" /* key */, screenTitle, MetricsProto.MetricsEvent.SLICE) - .setClassName(mContext.getPackageName(), SubSettings.class.getName()) - .setData(contentUri); + .setClassName(mContext.getPackageName(), SubSettings.class.getName()); } private PendingIntent getPrimaryAction() { diff --git a/src/com/android/settings/homepage/contextualcards/deviceinfo/EmergencyInfoSlice.java b/src/com/android/settings/homepage/contextualcards/deviceinfo/EmergencyInfoSlice.java index aff34f429d8..dfadc722aa0 100644 --- a/src/com/android/settings/homepage/contextualcards/deviceinfo/EmergencyInfoSlice.java +++ b/src/com/android/settings/homepage/contextualcards/deviceinfo/EmergencyInfoSlice.java @@ -17,10 +17,8 @@ package com.android.settings.homepage.contextualcards.deviceinfo; import android.app.PendingIntent; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; -import android.net.Uri; import androidx.core.graphics.drawable.IconCompat; import androidx.slice.Slice; @@ -28,39 +26,27 @@ import androidx.slice.builders.ListBuilder; import androidx.slice.builders.SliceAction; import com.android.settings.R; -import com.android.settings.slices.SettingsSliceProvider; +import com.android.settings.slices.CustomSliceRegistry; // This is a slice helper class for EmergencyInfo public class EmergencyInfoSlice { - /** - * The path denotes the unique name of emergency info slice. - */ - public static final String PATH_EMERGENCY_INFO_CARD = "emergency_info_card"; - - /** - * Backing Uri for the Emergency Info Slice. - */ - public static final Uri EMERGENCY_INFO_CARD_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSliceProvider.SLICE_AUTHORITY) - .appendPath(PATH_EMERGENCY_INFO_CARD) - .build(); private static final String ACTION_EDIT_EMERGENCY_INFO = "android.settings.EDIT_EMERGENCY_INFO"; public static Slice getSlice(Context context) { - final ListBuilder listBuilder = new ListBuilder(context, EMERGENCY_INFO_CARD_URI, + final ListBuilder listBuilder = new ListBuilder(context, + CustomSliceRegistry.EMERGENCY_INFO_SLICE_URI, ListBuilder.INFINITY); listBuilder.addRow( new ListBuilder.RowBuilder() .setTitle(context.getText(R.string.emergency_info_title)) .setSubtitle( context.getText(R.string.emergency_info_contextual_card_summary)) - .setPrimaryAction(generatePrimaryAction(context))); + .setPrimaryAction(createPrimaryAction(context))); return listBuilder.build(); } - private static SliceAction generatePrimaryAction(Context context) { + private static SliceAction createPrimaryAction(Context context) { PendingIntent pendingIntent = PendingIntent.getActivity( context, diff --git a/src/com/android/settings/homepage/contextualcards/deviceinfo/StorageSlice.java b/src/com/android/settings/homepage/contextualcards/deviceinfo/StorageSlice.java index c61a8a06557..1e07f7a38cc 100644 --- a/src/com/android/settings/homepage/contextualcards/deviceinfo/StorageSlice.java +++ b/src/com/android/settings/homepage/contextualcards/deviceinfo/StorageSlice.java @@ -17,7 +17,6 @@ package com.android.settings.homepage.contextualcards.deviceinfo; import android.app.PendingIntent; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -36,8 +35,8 @@ import com.android.settings.SubSettings; import com.android.settings.Utils; import com.android.settings.deviceinfo.StorageDashboardFragment; import com.android.settings.deviceinfo.storage.StorageSummaryDonutPreferenceController; +import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.CustomSliceable; -import com.android.settings.slices.SettingsSliceProvider; import com.android.settings.slices.SliceBuilderUtils; import com.android.settingslib.deviceinfo.PrivateStorageInfo; import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider; @@ -45,20 +44,6 @@ import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider; public class StorageSlice implements CustomSliceable { private static final String TAG = "StorageSlice"; - /** - * The path denotes the unique name of storage slicel - */ - public static final String PATH_STORAGE_INFO = "storage_card"; - - /** - * Backing Uri for the storage slice. - */ - public static final Uri STORAGE_CARD_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSliceProvider.SLICE_AUTHORITY) - .appendPath(PATH_STORAGE_INFO) - .build(); - private final Context mContext; public StorageSlice(Context context) { @@ -67,12 +52,9 @@ public class StorageSlice implements CustomSliceable { @Override public Uri getUri() { - return STORAGE_CARD_URI; + return CustomSliceRegistry.STORAGE_SLICE_URI; } - /** - * Return a storage slice bound to {@link #STORAGE_CARD_URI} - */ @Override public Slice getSlice() { final IconCompat icon = IconCompat.createWithResource(mContext, @@ -80,7 +62,8 @@ public class StorageSlice implements CustomSliceable { final String title = mContext.getString(R.string.storage_label); final SliceAction primaryAction = new SliceAction(getPrimaryAction(), icon, title); final PrivateStorageInfo info = getPrivateStorageInfo(); - return new ListBuilder(mContext, STORAGE_CARD_URI, ListBuilder.INFINITY) + return new ListBuilder(mContext, CustomSliceRegistry.STORAGE_SLICE_URI, + ListBuilder.INFINITY) .setAccentColor(Utils.getColorAccentDefaultColor(mContext)) .setHeader(new ListBuilder.HeaderBuilder().setTitle(title)) .addRow(new ListBuilder.RowBuilder() @@ -93,12 +76,10 @@ public class StorageSlice implements CustomSliceable { @Override public Intent getIntent() { final String screenTitle = mContext.getText(R.string.storage_label).toString(); - final Uri contentUri = new Uri.Builder().appendPath(PATH_STORAGE_INFO).build(); return SliceBuilderUtils.buildSearchResultPageIntent(mContext, - StorageDashboardFragment.class.getName(), PATH_STORAGE_INFO, screenTitle, + StorageDashboardFragment.class.getName(), "" /* key */, screenTitle, MetricsProto.MetricsEvent.SLICE) - .setClassName(mContext.getPackageName(), SubSettings.class.getName()) - .setData(contentUri); + .setClassName(mContext.getPackageName(), SubSettings.class.getName()); } private PendingIntent getPrimaryAction() { diff --git a/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java b/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java index 23ff172c595..cae222a4916 100644 --- a/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java +++ b/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java @@ -19,7 +19,6 @@ package com.android.settings.homepage.contextualcards.slices; import static android.content.Context.MODE_PRIVATE; import android.app.PendingIntent; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -34,7 +33,6 @@ import androidx.slice.builders.ListBuilder.RowBuilder; import androidx.slice.builders.SliceAction; import com.android.internal.logging.nano.MetricsProto; -import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.R; import com.android.settings.SubSettings; @@ -42,9 +40,10 @@ import com.android.settings.Utils; import com.android.settings.fuelgauge.BatteryStatsHelperLoader; import com.android.settings.fuelgauge.PowerUsageSummary; import com.android.settings.fuelgauge.batterytip.BatteryTipLoader; +import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; +import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.CustomSliceable; -import com.android.settings.slices.SettingsSliceProvider; import com.android.settings.slices.SliceBackgroundWorker; import com.android.settings.slices.SliceBuilderUtils; import com.android.settingslib.utils.ThreadUtils; @@ -53,20 +52,6 @@ import java.util.List; public class BatteryFixSlice implements CustomSliceable { - /** - * Unique name of Battery Fix Slice. - */ - public static final String PATH_BATTERY_FIX = "battery_fix"; - - /** - * Uri for Battery Fix Slice. - */ - public static final Uri BATTERY_FIX_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSliceProvider.SLICE_AUTHORITY) - .appendPath(PATH_BATTERY_FIX) - .build(); - @VisibleForTesting static final String PREFS = "battery_fix_prefs"; @VisibleForTesting @@ -82,12 +67,9 @@ public class BatteryFixSlice implements CustomSliceable { @Override public Uri getUri() { - return BATTERY_FIX_URI; + return CustomSliceRegistry.BATTERY_FIX_SLICE_URI; } - /** - * Return a Slice bound to {@link #BATTERY_FIX_URI}. - */ @Override public Slice getSlice() { IconCompat icon; @@ -109,7 +91,8 @@ public class BatteryFixSlice implements CustomSliceable { primaryAction = new SliceAction(getPrimaryAction(), icon, batteryTip.getTitle(mContext)); - slice = new ListBuilder(mContext, BATTERY_FIX_URI, ListBuilder.INFINITY) + slice = new ListBuilder(mContext, CustomSliceRegistry.BATTERY_FIX_SLICE_URI, + ListBuilder.INFINITY) .setAccentColor(Utils.getColorAccentDefaultColor(mContext)) .addRow(new RowBuilder() .setTitle(batteryTip.getTitle(mContext)) @@ -125,7 +108,8 @@ public class BatteryFixSlice implements CustomSliceable { R.drawable.ic_battery_status_good_24dp); final String title = mContext.getString(R.string.power_usage_summary_title); primaryAction = new SliceAction(getPrimaryAction(), icon, title); - slice = new ListBuilder(mContext, BATTERY_FIX_URI, ListBuilder.INFINITY) + slice = new ListBuilder(mContext, CustomSliceRegistry.BATTERY_FIX_SLICE_URI, + ListBuilder.INFINITY) .setAccentColor(Utils.getColorAccentDefaultColor(mContext)) .addRow(new RowBuilder() .setTitle(title) @@ -140,10 +124,11 @@ public class BatteryFixSlice implements CustomSliceable { public Intent getIntent() { final String screenTitle = mContext.getText(R.string.power_usage_summary_title) .toString(); - final Uri contentUri = new Uri.Builder().appendPath(PATH_BATTERY_FIX).build(); + final Uri contentUri = new Uri.Builder() + .appendPath(BatteryTipPreferenceController.PREF_NAME).build(); return SliceBuilderUtils.buildSearchResultPageIntent(mContext, - PowerUsageSummary.class.getName(), PATH_BATTERY_FIX, + PowerUsageSummary.class.getName(), BatteryTipPreferenceController.PREF_NAME, screenTitle, MetricsProto.MetricsEvent.SLICE) .setClassName(mContext.getPackageName(), SubSettings.class.getName()) diff --git a/src/com/android/settings/homepage/contextualcards/slices/ConnectedDeviceSlice.java b/src/com/android/settings/homepage/contextualcards/slices/ConnectedDeviceSlice.java index ef7c1bd0e60..fe907f342a8 100644 --- a/src/com/android/settings/homepage/contextualcards/slices/ConnectedDeviceSlice.java +++ b/src/com/android/settings/homepage/contextualcards/slices/ConnectedDeviceSlice.java @@ -18,7 +18,6 @@ package com.android.settings.homepage.contextualcards.slices; import android.app.PendingIntent; import android.bluetooth.BluetoothAdapter; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; @@ -43,8 +42,8 @@ import com.android.settings.Utils; import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment; import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment; import com.android.settings.core.SubSettingLauncher; +import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.CustomSliceable; -import com.android.settings.slices.SettingsSliceProvider; import com.android.settings.slices.SliceBuilderUtils; import com.android.settingslib.bluetooth.BluetoothUtils; import com.android.settingslib.bluetooth.CachedBluetoothDevice; @@ -67,20 +66,6 @@ import java.util.stream.Collectors; */ public class ConnectedDeviceSlice implements CustomSliceable { - /** - * The path denotes the unique name of Connected device Slice. - */ - public static final String PATH_CONNECTED_DEVICE = "connected_device"; - - /** - * Backing Uri for Connected device Slice. - */ - public static final Uri CONNECTED_DEVICE_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSliceProvider.SLICE_AUTHORITY) - .appendPath(PATH_CONNECTED_DEVICE) - .build(); - /** * To sort the Bluetooth devices by {@link CachedBluetoothDevice}. * Refer compareTo method from {@link com.android.settings.bluetooth.BluetoothDevicePreference}. @@ -109,12 +94,9 @@ public class ConnectedDeviceSlice implements CustomSliceable { @Override public Uri getUri() { - return CONNECTED_DEVICE_URI; + return CustomSliceRegistry.CONNECTED_DEVICE_SLICE_URI; } - /** - * Return a Connected Device Slice bound to {@link #CONNECTED_DEVICE_URI}. - */ @Override public Slice getSlice() { final IconCompat icon = IconCompat.createWithResource(mContext, @@ -127,7 +109,8 @@ public class ConnectedDeviceSlice implements CustomSliceable { final SliceAction primarySliceAction = new SliceAction(primaryActionIntent, icon, title); final ListBuilder listBuilder = - new ListBuilder(mContext, CONNECTED_DEVICE_URI, ListBuilder.INFINITY) + new ListBuilder(mContext, CustomSliceRegistry.CONNECTED_DEVICE_SLICE_URI, + ListBuilder.INFINITY) .setAccentColor(Utils.getColorAccentDefaultColor(mContext)); // Get row builders by connected devices, e.g. Bluetooth. @@ -159,14 +142,12 @@ public class ConnectedDeviceSlice implements CustomSliceable { public Intent getIntent() { final String screenTitle = mContext.getText(R.string.connected_devices_dashboard_title) .toString(); - final Uri contentUri = new Uri.Builder().appendPath(PATH_CONNECTED_DEVICE).build(); return SliceBuilderUtils.buildSearchResultPageIntent(mContext, - ConnectedDeviceDashboardFragment.class.getName(), PATH_CONNECTED_DEVICE, + ConnectedDeviceDashboardFragment.class.getName(), "" /* key */, screenTitle, MetricsProto.MetricsEvent.SLICE) - .setClassName(mContext.getPackageName(), SubSettings.class.getName()) - .setData(contentUri); + .setClassName(mContext.getPackageName(), SubSettings.class.getName()); } @Override diff --git a/src/com/android/settings/homepage/contextualcards/slices/LowStorageSlice.java b/src/com/android/settings/homepage/contextualcards/slices/LowStorageSlice.java index 7f6efccd49e..b3b0b0abb37 100644 --- a/src/com/android/settings/homepage/contextualcards/slices/LowStorageSlice.java +++ b/src/com/android/settings/homepage/contextualcards/slices/LowStorageSlice.java @@ -17,7 +17,6 @@ package com.android.settings.homepage.contextualcards.slices; import android.app.PendingIntent; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -36,8 +35,8 @@ import com.android.settings.R; import com.android.settings.SubSettings; import com.android.settings.Utils; import com.android.settings.deviceinfo.StorageSettings; +import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.CustomSliceable; -import com.android.settings.slices.SettingsSliceProvider; import com.android.settings.slices.SliceBuilderUtils; import com.android.settingslib.deviceinfo.PrivateStorageInfo; import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider; @@ -46,20 +45,6 @@ import java.text.NumberFormat; public class LowStorageSlice implements CustomSliceable { - /** - * The path denotes the unique name of Low storage Slice. - */ - public static final String PATH_LOW_STORAGE = "low_storage"; - - /** - * Backing Uri for Low storage Slice. - */ - public static final Uri LOW_STORAGE_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSliceProvider.SLICE_AUTHORITY) - .appendPath(PATH_LOW_STORAGE) - .build(); - private static final String TAG = "LowStorageSlice"; /** @@ -73,9 +58,6 @@ public class LowStorageSlice implements CustomSliceable { mContext = context; } - /** - * Return a Low storage Slice bound to {@link #LOW_STORAGE_URI} - */ @Override public Slice getSlice() { // Get current storage percentage from StorageManager. @@ -108,7 +90,8 @@ public class LowStorageSlice implements CustomSliceable { * Slices doesn't support "Icon on the left" in header. Now we intend to start with Icon * right aligned. Will update the icon to left until Slices support it. */ - return new ListBuilder(mContext, LOW_STORAGE_URI, ListBuilder.INFINITY) + return new ListBuilder(mContext, CustomSliceRegistry.LOW_STORAGE_SLICE_URI, + ListBuilder.INFINITY) .setAccentColor(Utils.getColorAccentDefaultColor(mContext)) .addRow(new RowBuilder() .setTitle(title) @@ -120,7 +103,7 @@ public class LowStorageSlice implements CustomSliceable { @Override public Uri getUri() { - return LOW_STORAGE_URI; + return CustomSliceRegistry.LOW_STORAGE_SLICE_URI; } @Override @@ -132,13 +115,11 @@ public class LowStorageSlice implements CustomSliceable { public Intent getIntent() { final String screenTitle = mContext.getText(R.string.storage_label) .toString(); - final Uri contentUri = new Uri.Builder().appendPath(PATH_LOW_STORAGE).build(); return SliceBuilderUtils.buildSearchResultPageIntent(mContext, - StorageSettings.class.getName(), PATH_LOW_STORAGE, + StorageSettings.class.getName(), "" /* key */, screenTitle, MetricsProto.MetricsEvent.SLICE) - .setClassName(mContext.getPackageName(), SubSettings.class.getName()) - .setData(contentUri); + .setClassName(mContext.getPackageName(), SubSettings.class.getName()); } } \ No newline at end of file diff --git a/src/com/android/settings/location/LocationSliceBuilder.java b/src/com/android/settings/location/LocationSliceBuilder.java index 56cf676a0a6..1d79ada8c6b 100644 --- a/src/com/android/settings/location/LocationSliceBuilder.java +++ b/src/com/android/settings/location/LocationSliceBuilder.java @@ -23,11 +23,9 @@ import static androidx.slice.builders.ListBuilder.ICON_IMAGE; import android.annotation.ColorInt; import android.app.PendingIntent; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.net.Uri; -import android.provider.SettingsSlicesContract; import androidx.core.graphics.drawable.IconCompat; import androidx.slice.Slice; @@ -39,6 +37,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.SubSettings; import com.android.settings.Utils; +import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.SliceBuilderUtils; /** @@ -46,21 +45,11 @@ import com.android.settings.slices.SliceBuilderUtils; */ public class LocationSliceBuilder { - /** - * Backing Uri for the Location Slice. - */ - public static final Uri LOCATION_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSlicesContract.AUTHORITY) - .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) - .appendPath(KEY_LOCATION) - .build(); - private LocationSliceBuilder() { } /** - * Return a Location Slice bound to {@link #LOCATION_URI}. + * Return a Location Slice bound to {@link CustomSliceRegistry#LOCATION_SLICE_URI}. */ public static Slice getSlice(Context context) { final IconCompat icon = IconCompat.createWithResource(context, @@ -70,7 +59,8 @@ public class LocationSliceBuilder { final PendingIntent primaryAction = getPrimaryAction(context); final SliceAction primarySliceAction = new SliceAction(primaryAction, icon, title); - return new ListBuilder(context, LOCATION_URI, ListBuilder.INFINITY) + return new ListBuilder(context, CustomSliceRegistry.LOCATION_SLICE_URI, + ListBuilder.INFINITY) .setAccentColor(color) .addRow(new RowBuilder() .setTitle(title) diff --git a/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelper.java b/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelper.java index b198f92efb7..aff1211d326 100644 --- a/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelper.java +++ b/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelper.java @@ -19,7 +19,6 @@ package com.android.settings.network.telephony; import static android.app.slice.Slice.EXTRA_TOGGLE_STATE; import android.app.PendingIntent; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -40,9 +39,8 @@ import androidx.slice.builders.SliceAction; import com.android.ims.ImsManager; import com.android.settings.R; import com.android.settings.Utils; -import com.android.settings.slices.SettingsSliceProvider; +import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.SliceBroadcastReceiver; -import com.android.settings.slices.SliceBuilderUtils; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; @@ -57,12 +55,7 @@ import java.util.concurrent.TimeoutException; */ public class Enhanced4gLteSliceHelper { - private static final String TAG = "Enhanced4gLteSliceHelper"; - - /** - * Settings slice path to enhanced 4g LTE setting. - */ - public static final String PATH_ENHANCED_4G_LTE = "enhanced_4g_lte"; + private static final String TAG = "Enhanced4gLteSlice"; /** * Action passed for changes to enhanced 4g LTE slice (toggle). @@ -70,14 +63,6 @@ public class Enhanced4gLteSliceHelper { public static final String ACTION_ENHANCED_4G_LTE_CHANGED = "com.android.settings.mobilenetwork.action.ENHANCED_4G_LTE_CHANGED"; - /** - * Slice Uri for Enhanced 4G slice - */ - public static final Uri SLICE_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSliceProvider.SLICE_AUTHORITY) - .appendPath(PATH_ENHANCED_4G_LTE) - .build(); /** * Action for mobile network settings activity which * allows setting configuration for Enhanced 4G LTE @@ -225,8 +210,7 @@ public class Enhanced4gLteSliceHelper { } // notify change in slice in any case to get re-queried. This would result in displaying // appropriate message with the updated setting. - final Uri uri = SliceBuilderUtils.getUri(PATH_ENHANCED_4G_LTE, false /*isPlatformSlice*/); - mContext.getContentResolver().notifyChange(uri, null); + mContext.getContentResolver().notifyChange(CustomSliceRegistry.ENHANCED_4G_SLICE_URI, null); } private CharSequence getEnhanced4glteModeTitle(int subId) { diff --git a/src/com/android/settings/notification/ZenModePreferenceController.java b/src/com/android/settings/notification/ZenModePreferenceController.java index 44ad2ffb6d1..22eb0c098d6 100644 --- a/src/com/android/settings/notification/ZenModePreferenceController.java +++ b/src/com/android/settings/notification/ZenModePreferenceController.java @@ -35,6 +35,9 @@ import com.android.settingslib.core.lifecycle.events.OnResume; public class ZenModePreferenceController extends BasePreferenceController implements LifecycleObserver, OnResume, OnPause { + + public static final String ZEN_MODE_KEY = "zen_mode"; + private SettingObserver mSettingObserver; private ZenModeSettings.SummaryBuilder mSummaryBuilder; diff --git a/src/com/android/settings/notification/ZenModeSliceBuilder.java b/src/com/android/settings/notification/ZenModeSliceBuilder.java index bd6ad0bd618..f5208c14187 100644 --- a/src/com/android/settings/notification/ZenModeSliceBuilder.java +++ b/src/com/android/settings/notification/ZenModeSliceBuilder.java @@ -18,16 +18,16 @@ package com.android.settings.notification; import static android.app.slice.Slice.EXTRA_TOGGLE_STATE; +import static com.android.settings.notification.ZenModePreferenceController.ZEN_MODE_KEY; + import android.annotation.ColorInt; import android.app.NotificationManager; import android.app.PendingIntent; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.provider.Settings; -import android.provider.SettingsSlicesContract; import androidx.core.graphics.drawable.IconCompat; import androidx.slice.Slice; @@ -39,7 +39,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.SubSettings; import com.android.settings.Utils; -import com.android.settings.slices.SettingsSliceProvider; +import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.SliceBroadcastReceiver; import com.android.settings.slices.SliceBuilderUtils; @@ -47,18 +47,6 @@ public class ZenModeSliceBuilder { private static final String TAG = "ZenModeSliceBuilder"; - private static final String ZEN_MODE_KEY = "zen_mode"; - - /** - * Backing Uri for the Zen Mode Slice. - */ - public static final Uri ZEN_MODE_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSliceProvider.SLICE_AUTHORITY) - .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) - .appendPath(ZEN_MODE_KEY) - .build(); - /** * Action notifying a change on the Zen Mode Slice. */ @@ -77,7 +65,7 @@ public class ZenModeSliceBuilder { } /** - * Return a ZenMode Slice bound to {@link #ZEN_MODE_URI}. + * Return a ZenMode Slice bound to {@link CustomSliceRegistry#ZEN_MODE_URI}. *

* Note that you should register a listener for {@link #INTENT_FILTER} to get changes for * ZenMode. @@ -93,7 +81,8 @@ public class ZenModeSliceBuilder { final SliceAction toggleSliceAction = new SliceAction(toggleAction, null /* actionTitle */, isZenModeEnabled); - return new ListBuilder(context, ZEN_MODE_URI, ListBuilder.INFINITY) + return new ListBuilder(context, CustomSliceRegistry.ZEN_MODE_SLICE_URI, + ListBuilder.INFINITY) .setAccentColor(color) .addRow(new RowBuilder() .setTitle(title) diff --git a/src/com/android/settings/panel/InternetConnectivityPanel.java b/src/com/android/settings/panel/InternetConnectivityPanel.java index b6fe53bcbfc..1e01e719c8b 100644 --- a/src/com/android/settings/panel/InternetConnectivityPanel.java +++ b/src/com/android/settings/panel/InternetConnectivityPanel.java @@ -16,16 +16,12 @@ package com.android.settings.panel; -import androidx.annotation.VisibleForTesting; - -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.net.Uri; -import android.provider.SettingsSlicesContract; import com.android.settings.R; -import com.android.settings.wifi.WifiSlice; +import com.android.settings.slices.CustomSliceRegistry; import java.util.ArrayList; import java.util.List; @@ -34,19 +30,11 @@ import java.util.List; * Represents the Internet Connectivity Panel. * *

- * Displays Wifi (full Slice) and Airplane mode. + * Displays Wifi (full Slice) and Airplane mode. *

*/ public class InternetConnectivityPanel implements PanelContent { - @VisibleForTesting - static final Uri AIRPLANE_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSlicesContract.AUTHORITY) - .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) - .appendPath(SettingsSlicesContract.KEY_AIRPLANE_MODE) - .build(); - private final Context mContext; public static InternetConnectivityPanel create(Context context) { @@ -65,8 +53,8 @@ public class InternetConnectivityPanel implements PanelContent { @Override public List getSlices() { final List uris = new ArrayList<>(); - uris.add(WifiSlice.WIFI_URI); - uris.add(AIRPLANE_URI); + uris.add(CustomSliceRegistry.WIFI_SLICE_URI); + uris.add(CustomSliceRegistry.AIRPLANE_URI); return uris; } diff --git a/src/com/android/settings/slices/CustomSliceManager.java b/src/com/android/settings/slices/CustomSliceManager.java index 99e22a15cbd..bef72b75c2a 100644 --- a/src/com/android/settings/slices/CustomSliceManager.java +++ b/src/com/android/settings/slices/CustomSliceManager.java @@ -101,13 +101,13 @@ public class CustomSliceManager { } private void addSlices() { - mUriMap.put(WifiSlice.WIFI_URI, WifiSlice.class); - mUriMap.put(DataUsageSlice.DATA_USAGE_CARD_URI, DataUsageSlice.class); - mUriMap.put(DeviceInfoSlice.DEVICE_INFO_CARD_URI, DeviceInfoSlice.class); - mUriMap.put(StorageSlice.STORAGE_CARD_URI, StorageSlice.class); - mUriMap.put(BatterySlice.BATTERY_CARD_URI, BatterySlice.class); - mUriMap.put(ConnectedDeviceSlice.CONNECTED_DEVICE_URI, ConnectedDeviceSlice.class); - mUriMap.put(LowStorageSlice.LOW_STORAGE_URI, LowStorageSlice.class); - mUriMap.put(BatteryFixSlice.BATTERY_FIX_URI, BatteryFixSlice.class); + mUriMap.put(CustomSliceRegistry.BATTERY_FIX_SLICE_URI, BatteryFixSlice.class); + mUriMap.put(CustomSliceRegistry.BATTERY_INFO_SLICE_URI, BatterySlice.class); + mUriMap.put(CustomSliceRegistry.CONNECTED_DEVICE_SLICE_URI, ConnectedDeviceSlice.class); + mUriMap.put(CustomSliceRegistry.DATA_USAGE_SLICE_URI, DataUsageSlice.class); + mUriMap.put(CustomSliceRegistry.DEVICE_INFO_SLICE_URI, DeviceInfoSlice.class); + mUriMap.put(CustomSliceRegistry.LOW_STORAGE_SLICE_URI, LowStorageSlice.class); + mUriMap.put(CustomSliceRegistry.STORAGE_SLICE_URI, StorageSlice.class); + mUriMap.put(CustomSliceRegistry.WIFI_SLICE_URI, WifiSlice.class); } } diff --git a/src/com/android/settings/slices/CustomSliceRegistry.java b/src/com/android/settings/slices/CustomSliceRegistry.java new file mode 100644 index 00000000000..f2b3299ba1c --- /dev/null +++ b/src/com/android/settings/slices/CustomSliceRegistry.java @@ -0,0 +1,184 @@ +/* + * 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.slices; + +import static android.provider.SettingsSlicesContract.KEY_LOCATION; +import static android.provider.SettingsSlicesContract.KEY_WIFI; + +import static com.android.settings.notification.ZenModePreferenceController.ZEN_MODE_KEY; + +import android.content.ContentResolver; +import android.net.Uri; +import android.provider.SettingsSlicesContract; + +import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController; +import com.android.settings.wifi.calling.WifiCallingSliceHelper; + +/** + * A registry of custom slice Uris. + */ +public class CustomSliceRegistry { + + /** + * Uri for Airplane mode Slice. + */ + public static final Uri AIRPLANE_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSlicesContract.AUTHORITY) + .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) + .appendPath(SettingsSlicesContract.KEY_AIRPLANE_MODE) + .build(); + + /** + * Uri for Battery Fix Slice. + */ + public static final Uri BATTERY_FIX_SLICE_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendEncodedPath(SettingsSlicesContract.PATH_SETTING_INTENT) + .appendPath(BatteryTipPreferenceController.PREF_NAME) + .build(); + /** + * Backing Uri for the Battery info Slice. + */ + public static final Uri BATTERY_INFO_SLICE_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendEncodedPath(SettingsSlicesContract.PATH_SETTING_INTENT) + .appendPath("battery_card") + .build(); + /** + * Backing Uri for the Bluetooth Slice. + */ + public static final Uri BLUETOOTH_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSlicesContract.AUTHORITY) + .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) + .appendPath(SettingsSlicesContract.KEY_BLUETOOTH) + .build(); + + /** + * Backing Uri for Connected device Slice. + */ + public static final Uri CONNECTED_DEVICE_SLICE_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) + .appendPath("connected_device") + .build(); + /** + * Backing Uri for the Data usage Slice. + */ + public static final Uri DATA_USAGE_SLICE_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath("data_usage_card") + .build(); + /** + * Backing Uri for the Device info Slice. + */ + public static final Uri DEVICE_INFO_SLICE_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath("device_info_card") + .build(); + /** + * Backing Uri for the Emergency Info Slice. + */ + public static final Uri EMERGENCY_INFO_SLICE_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath("emergency_info_card") + .build(); + /** + * Slice Uri for Enhanced 4G slice + */ + public static final Uri ENHANCED_4G_SLICE_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath("enhanced_4g_lte") + .build(); + /** + * Backing Uri for the Flashlight Slice. + */ + public static final Uri FLASHLIGHT_SLICE_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) + .appendPath("flashlight") + .build(); + /** + * Backing Uri for the Location Slice. + */ + public static final Uri LOCATION_SLICE_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSlicesContract.AUTHORITY) + .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) + .appendPath(KEY_LOCATION) + .build(); + /** + * Backing Uri for Low storage Slice. + */ + public static final Uri LOW_STORAGE_SLICE_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendEncodedPath(SettingsSlicesContract.PATH_SETTING_INTENT) + .appendPath("low_storage") + .build(); + /** + * Backing Uri for the storage slice. + */ + public static final Uri STORAGE_SLICE_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath("storage_card") + .build(); + /** + * Full {@link Uri} for the Wifi Calling Slice. + */ + public static final Uri WIFI_CALLING_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath(WifiCallingSliceHelper.PATH_WIFI_CALLING) + .build(); + /** + * Full {@link Uri} for the Wifi Calling Preference Slice. + */ + public static final Uri WIFI_CALLING_PREFERENCE_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath(WifiCallingSliceHelper.PATH_WIFI_CALLING_PREFERENCE) + .build(); + /** + * Backing Uri for the Wifi Slice. + */ + public static final Uri WIFI_SLICE_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSlicesContract.AUTHORITY) + .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) + .appendPath(KEY_WIFI) + .build(); + /** + * Backing Uri for the Zen Mode Slice. + */ + public static final Uri ZEN_MODE_SLICE_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) + .appendPath(ZEN_MODE_KEY) + .build(); +} diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java index 952fc8b4596..109f02ef61d 100644 --- a/src/com/android/settings/slices/SettingsSliceProvider.java +++ b/src/com/android/settings/slices/SettingsSliceProvider.java @@ -44,11 +44,8 @@ import com.android.settings.core.BasePreferenceController; import com.android.settings.flashlight.FlashlightSliceBuilder; import com.android.settings.homepage.contextualcards.deviceinfo.EmergencyInfoSlice; import com.android.settings.location.LocationSliceBuilder; -import com.android.settings.network.telephony.Enhanced4gLteSliceHelper; import com.android.settings.notification.ZenModeSliceBuilder; import com.android.settings.overlay.FeatureFactory; -import com.android.settings.wifi.WifiSlice; -import com.android.settings.wifi.calling.WifiCallingSliceHelper; import com.android.settingslib.SliceBroadcastRelay; import com.android.settingslib.utils.ThreadUtils; @@ -175,23 +172,21 @@ public class SettingsSliceProvider extends SliceProvider { if (filter != null) { registerIntentToUri(filter, sliceUri); } - ThreadUtils.postOnMainThread(() -> { - startBackgroundWorker(sliceable); - }); + ThreadUtils.postOnMainThread(() -> startBackgroundWorker(sliceable)); return; } - if (ZenModeSliceBuilder.ZEN_MODE_URI.equals(sliceUri)) { + if (CustomSliceRegistry.ZEN_MODE_SLICE_URI.equals(sliceUri)) { registerIntentToUri(ZenModeSliceBuilder.INTENT_FILTER, sliceUri); return; - } else if (BluetoothSliceBuilder.BLUETOOTH_URI.equals(sliceUri)) { + } else if (CustomSliceRegistry.BLUETOOTH_URI.equals(sliceUri)) { registerIntentToUri(BluetoothSliceBuilder.INTENT_FILTER, sliceUri); return; - } else if (FlashlightSliceBuilder.FLASHLIGHT_URI.equals(sliceUri)) { + } else if (CustomSliceRegistry.FLASHLIGHT_SLICE_URI.equals(sliceUri)) { registerIntentToUri(FlashlightSliceBuilder.INTENT_FILTER, sliceUri); mRegisteredUris.add(sliceUri); return; - } else if (EmergencyInfoSlice.EMERGENCY_INFO_CARD_URI.equals(sliceUri)) { + } else if (CustomSliceRegistry.EMERGENCY_INFO_SLICE_URI.equals(sliceUri)) { return; } @@ -236,30 +231,30 @@ public class SettingsSliceProvider extends SliceProvider { return sliceable.getSlice(); } - if (WifiCallingSliceHelper.WIFI_CALLING_URI.equals(sliceUri)) { + if (CustomSliceRegistry.WIFI_CALLING_URI.equals(sliceUri)) { return FeatureFactory.getFactory(getContext()) .getSlicesFeatureProvider() .getNewWifiCallingSliceHelper(getContext()) .createWifiCallingSlice(sliceUri); - } else if (ZenModeSliceBuilder.ZEN_MODE_URI.equals(sliceUri)) { + } else if (CustomSliceRegistry.ZEN_MODE_SLICE_URI.equals(sliceUri)) { return ZenModeSliceBuilder.getSlice(getContext()); - } else if (BluetoothSliceBuilder.BLUETOOTH_URI.equals(sliceUri)) { + } else if (CustomSliceRegistry.BLUETOOTH_URI.equals(sliceUri)) { return BluetoothSliceBuilder.getSlice(getContext()); - } else if (LocationSliceBuilder.LOCATION_URI.equals(sliceUri)) { + } else if (CustomSliceRegistry.LOCATION_SLICE_URI.equals(sliceUri)) { return LocationSliceBuilder.getSlice(getContext()); - } else if (Enhanced4gLteSliceHelper.SLICE_URI.equals(sliceUri)) { + } else if (CustomSliceRegistry.ENHANCED_4G_SLICE_URI.equals(sliceUri)) { return FeatureFactory.getFactory(getContext()) .getSlicesFeatureProvider() .getNewEnhanced4gLteSliceHelper(getContext()) .createEnhanced4gLteSlice(sliceUri); - } else if (WifiCallingSliceHelper.WIFI_CALLING_PREFERENCE_URI.equals(sliceUri)) { + } else if (CustomSliceRegistry.WIFI_CALLING_PREFERENCE_URI.equals(sliceUri)) { return FeatureFactory.getFactory(getContext()) .getSlicesFeatureProvider() .getNewWifiCallingSliceHelper(getContext()) .createWifiCallingPreferenceSlice(sliceUri); - } else if (FlashlightSliceBuilder.FLASHLIGHT_URI.equals(sliceUri)) { + } else if (CustomSliceRegistry.FLASHLIGHT_SLICE_URI.equals(sliceUri)) { return FlashlightSliceBuilder.getSlice(getContext()); - } else if (EmergencyInfoSlice.EMERGENCY_INFO_CARD_URI.equals(sliceUri)) { + } else if (CustomSliceRegistry.EMERGENCY_INFO_SLICE_URI.equals(sliceUri)) { return EmergencyInfoSlice.getSlice(getContext()); } @@ -476,16 +471,16 @@ public class SettingsSliceProvider extends SliceProvider { private List getSpecialCasePlatformUris() { return Arrays.asList( - WifiSlice.WIFI_URI, - BluetoothSliceBuilder.BLUETOOTH_URI, - LocationSliceBuilder.LOCATION_URI + CustomSliceRegistry.WIFI_SLICE_URI, + CustomSliceRegistry.BLUETOOTH_URI, + CustomSliceRegistry.LOCATION_SLICE_URI ); } private List getSpecialCaseOemUris() { return Arrays.asList( - ZenModeSliceBuilder.ZEN_MODE_URI, - FlashlightSliceBuilder.FLASHLIGHT_URI + CustomSliceRegistry.ZEN_MODE_SLICE_URI, + CustomSliceRegistry.FLASHLIGHT_SLICE_URI ); } diff --git a/src/com/android/settings/slices/SliceDeepLinkSpringBoard.java b/src/com/android/settings/slices/SliceDeepLinkSpringBoard.java index 75317788ef3..01708af87d9 100644 --- a/src/com/android/settings/slices/SliceDeepLinkSpringBoard.java +++ b/src/com/android/settings/slices/SliceDeepLinkSpringBoard.java @@ -62,11 +62,11 @@ public class SliceDeepLinkSpringBoard extends Activity { final CustomSliceable sliceable = customSliceManager.getSliceableFromUri(sliceUri); launchIntent = sliceable.getIntent(); - } else if (ZenModeSliceBuilder.ZEN_MODE_URI.equals(sliceUri)) { + } else if (CustomSliceRegistry.ZEN_MODE_SLICE_URI.equals(sliceUri)) { launchIntent = ZenModeSliceBuilder.getIntent(this /* context */); - } else if (BluetoothSliceBuilder.BLUETOOTH_URI.equals(sliceUri)) { + } else if (CustomSliceRegistry.BLUETOOTH_URI.equals(sliceUri)) { launchIntent = BluetoothSliceBuilder.getIntent(this /* context */); - } else if (LocationSliceBuilder.LOCATION_URI.equals(sliceUri)) { + } else if (CustomSliceRegistry.LOCATION_SLICE_URI.equals(sliceUri)) { launchIntent = LocationSliceBuilder.getIntent(this /* context */); } else { final SlicesDatabaseAccessor slicesDatabaseAccessor = diff --git a/src/com/android/settings/wifi/WifiSlice.java b/src/com/android/settings/wifi/WifiSlice.java index d06d830af39..0dbbfd53289 100644 --- a/src/com/android/settings/wifi/WifiSlice.java +++ b/src/com/android/settings/wifi/WifiSlice.java @@ -19,9 +19,10 @@ package com.android.settings.wifi; import static android.app.slice.Slice.EXTRA_TOGGLE_STATE; import static android.provider.SettingsSlicesContract.KEY_WIFI; +import static com.android.settings.slices.CustomSliceRegistry.WIFI_SLICE_URI; + import android.annotation.ColorInt; import android.app.PendingIntent; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -30,7 +31,6 @@ import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.net.wifi.WifiSsid; import android.os.Bundle; -import android.provider.SettingsSlicesContract; import android.text.TextUtils; import androidx.annotation.VisibleForTesting; @@ -60,16 +60,6 @@ import java.util.List; */ public class WifiSlice implements CustomSliceable { - /** - * Backing Uri for the Wifi Slice. - */ - public static final Uri WIFI_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSlicesContract.AUTHORITY) - .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) - .appendPath(KEY_WIFI) - .build(); - @VisibleForTesting static final int DEFAULT_EXPANDED_ROW_COUNT = 3; @@ -81,7 +71,7 @@ public class WifiSlice implements CustomSliceable { @Override public Uri getUri() { - return WIFI_URI; + return WIFI_SLICE_URI; } @Override @@ -92,9 +82,6 @@ public class WifiSlice implements CustomSliceable { return filter; } - /** - * Return a Wifi Slice bound to {@link #WIFI_URI}. - */ @Override public Slice getSlice() { final boolean isWifiEnabled = isWifiEnabled(); @@ -109,7 +96,8 @@ public class WifiSlice implements CustomSliceable { final SliceAction toggleSliceAction = new SliceAction(toggleAction, null /* actionTitle */, isWifiEnabled); - final ListBuilder listBuilder = new ListBuilder(mContext, WIFI_URI, ListBuilder.INFINITY) + final ListBuilder listBuilder = new ListBuilder(mContext, WIFI_SLICE_URI, + ListBuilder.INFINITY) .setAccentColor(color) .addRow(new RowBuilder() .setTitle(title) diff --git a/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java b/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java index 0629ad34bb2..65012fc340e 100644 --- a/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java +++ b/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java @@ -18,9 +18,11 @@ package com.android.settings.wifi.calling; import static android.app.slice.Slice.EXTRA_TOGGLE_STATE; +import static com.android.settings.slices.CustomSliceRegistry.WIFI_CALLING_PREFERENCE_URI; +import static com.android.settings.slices.CustomSliceRegistry.WIFI_CALLING_URI; + import android.app.PendingIntent; import android.content.ComponentName; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -42,9 +44,7 @@ import com.android.ims.ImsConfig; import com.android.ims.ImsManager; import com.android.settings.R; import com.android.settings.Utils; -import com.android.settings.slices.SettingsSliceProvider; import com.android.settings.slices.SliceBroadcastReceiver; -import com.android.settings.slices.SliceBuilderUtils; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; @@ -103,24 +103,6 @@ public class WifiCallingSliceHelper { public static final String ACTION_WIFI_CALLING_SETTINGS_ACTIVITY = "android.settings.WIFI_CALLING_SETTINGS"; - /** - * Full {@link Uri} for the Wifi Calling Slice. - */ - public static final Uri WIFI_CALLING_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSliceProvider.SLICE_AUTHORITY) - .appendPath(PATH_WIFI_CALLING) - .build(); - - /** - * Full {@link Uri} for the Wifi Calling Preference Slice. - */ - public static final Uri WIFI_CALLING_PREFERENCE_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSliceProvider.SLICE_AUTHORITY) - .appendPath(PATH_WIFI_CALLING_PREFERENCE) - .build(); - /** * Timeout for querying wifi calling setting from ims manager. */ @@ -246,7 +228,7 @@ public class WifiCallingSliceHelper { } final boolean isWifiCallingPrefEditable = isCarrierConfigManagerKeyEnabled( - CarrierConfigManager.KEY_EDITABLE_WFC_MODE_BOOL, subId,false); + CarrierConfigManager.KEY_EDITABLE_WFC_MODE_BOOL, subId, false); final boolean isWifiOnlySupported = isCarrierConfigManagerKeyEnabled( CarrierConfigManager.KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL, subId, true); final ImsManager imsManager = getImsManager(subId); @@ -287,8 +269,8 @@ public class WifiCallingSliceHelper { * Returns actionable wifi calling preference slice. * * @param isWifiOnlySupported adds row for wifi only if this is true - * @param currentWfcPref current Preference {@link ImsConfig} - * @param sliceUri sliceUri + * @param currentWfcPref current Preference {@link ImsConfig} + * @param sliceUri sliceUri * @return Slice for actionable wifi calling preference settings */ private Slice getWifiCallingPreferenceSlice(boolean isWifiOnlySupported, @@ -299,12 +281,12 @@ public class WifiCallingSliceHelper { ListBuilder listBuilder = new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY) .setAccentColor(Utils.getColorAccentDefaultColor(mContext)); listBuilder.setHeader(new ListBuilder.HeaderBuilder() - .setTitle(mContext.getText(R.string.wifi_calling_mode_title)) - .setSubtitle(getWifiCallingPreferenceSummary(currentWfcPref)) - .setPrimaryAction(new SliceAction( - getActivityIntent(ACTION_WIFI_CALLING_SETTINGS_ACTIVITY), - icon, - mContext.getText(R.string.wifi_calling_mode_title)))); + .setTitle(mContext.getText(R.string.wifi_calling_mode_title)) + .setSubtitle(getWifiCallingPreferenceSummary(currentWfcPref)) + .setPrimaryAction(new SliceAction( + getActivityIntent(ACTION_WIFI_CALLING_SETTINGS_ACTIVITY), + icon, + mContext.getText(R.string.wifi_calling_mode_title)))); if (isWifiOnlySupported) { listBuilder.addRow(wifiPreferenceRowBuilder(listBuilder, @@ -329,9 +311,9 @@ public class WifiCallingSliceHelper { /** * Returns RowBuilder for a new row containing specific wifi calling preference. * - * @param listBuilder ListBuilder that will be the parent for this RowBuilder + * @param listBuilder ListBuilder that will be the parent for this RowBuilder * @param preferenceTitleResId resource Id for the preference row title - * @param action action to be added for the row + * @param action action to be added for the row * @return RowBuilder for the row */ private RowBuilder wifiPreferenceRowBuilder(ListBuilder listBuilder, @@ -414,8 +396,7 @@ public class WifiCallingSliceHelper { } // notify change in slice in any case to get re-queried. This would result in displaying // appropriate message with the updated setting. - final Uri uri = SliceBuilderUtils.getUri(PATH_WIFI_CALLING, false /*isPlatformSlice*/); - mContext.getContentResolver().notifyChange(uri, null); + mContext.getContentResolver().notifyChange(WIFI_CALLING_URI, null); } /** @@ -433,7 +414,7 @@ public class WifiCallingSliceHelper { if (subId > SubscriptionManager.INVALID_SUBSCRIPTION_ID) { final boolean isWifiCallingPrefEditable = isCarrierConfigManagerKeyEnabled( - CarrierConfigManager.KEY_EDITABLE_WFC_MODE_BOOL, subId,false); + CarrierConfigManager.KEY_EDITABLE_WFC_MODE_BOOL, subId, false); final boolean isWifiOnlySupported = isCarrierConfigManagerKeyEnabled( CarrierConfigManager.KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL, subId, true); @@ -470,15 +451,13 @@ public class WifiCallingSliceHelper { // notify change in slice in any case to get re-queried. This would result in displaying // appropriate message. - final Uri uri = SliceBuilderUtils.getUri(PATH_WIFI_CALLING_PREFERENCE, - false /*isPlatformSlice*/); - mContext.getContentResolver().notifyChange(uri, null); + mContext.getContentResolver().notifyChange(WIFI_CALLING_PREFERENCE_URI, null); } /** * Returns Slice with the title and subtitle provided as arguments with wifi signal Icon. * - * @param title Title of the slice + * @param title Title of the slice * @param subtitle Subtitle of the slice * @param sliceUri slice uri * @return Slice with title and subtitle diff --git a/tests/robotests/src/com/android/settings/applications/RecentAppsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/RecentAppsPreferenceControllerTest.java index 6ff0dba990d..3d3a05a9384 100644 --- a/tests/robotests/src/com/android/settings/applications/RecentAppsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/RecentAppsPreferenceControllerTest.java @@ -51,7 +51,6 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; -import com.android.settings.testutils.shadow.ShadowPowerManager; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.instantapps.InstantAppDataProvider; @@ -93,6 +92,8 @@ public class RecentAppsPreferenceControllerTest { private ApplicationsState.AppEntry mAppEntry; @Mock private ApplicationInfo mApplicationInfo; + @Mock + private PowerManager mPowerManager; private Context mContext; private RecentAppsPreferenceController mController; @@ -104,6 +105,7 @@ public class RecentAppsPreferenceControllerTest { doReturn(mUsageStatsManager).when(mContext).getSystemService(Context.USAGE_STATS_SERVICE); doReturn(mUserManager).when(mContext).getSystemService(Context.USER_SERVICE); doReturn(mPackageManager).when(mContext).getPackageManager(); + doReturn(mPowerManager).when(mContext).getSystemService(PowerManager.class); mController = new RecentAppsPreferenceController(mContext, mAppState, null); when(mScreen.findPreference(anyString())).thenReturn(mCategory); @@ -174,15 +176,15 @@ public class RecentAppsPreferenceControllerTest { // stat1, stat2 are valid apps. stat3 is invalid. when(mAppState.getEntry(stat1.mPackageName, UserHandle.myUserId())) - .thenReturn(mAppEntry); + .thenReturn(mAppEntry); when(mAppState.getEntry(stat2.mPackageName, UserHandle.myUserId())) - .thenReturn(mAppEntry); + .thenReturn(mAppEntry); when(mAppState.getEntry(stat3.mPackageName, UserHandle.myUserId())) - .thenReturn(null); + .thenReturn(null); when(mPackageManager.resolveActivity(any(Intent.class), anyInt())) - .thenReturn(new ResolveInfo()); + .thenReturn(new ResolveInfo()); when(mUsageStatsManager.queryUsageStats(anyInt(), anyLong(), anyLong())) - .thenReturn(stats); + .thenReturn(stats); mAppEntry.info = mApplicationInfo; mController.displayPreference(mScreen); @@ -199,7 +201,7 @@ public class RecentAppsPreferenceControllerTest { @Test public void display_powerSaverMode_showNoRecents() { - mContext.getSystemService(PowerManager.class).setPowerSaveMode(true); + when(mPowerManager.isPowerSaveMode()).thenReturn(true); final List stats = new ArrayList<>(); final UsageStats stat1 = new UsageStats(); @@ -251,7 +253,7 @@ public class RecentAppsPreferenceControllerTest { // Only the regular app stat1 should have its intent resolve. when(mPackageManager.resolveActivity(argThat(intentMatcher(stat1.mPackageName)), anyInt())) - .thenReturn(new ResolveInfo()); + .thenReturn(new ResolveInfo()); when(mUsageStatsManager.queryUsageStats(anyInt(), anyLong(), anyLong())) .thenReturn(stats); @@ -311,13 +313,13 @@ public class RecentAppsPreferenceControllerTest { // stat1, stat2 are not displayable when(mAppState.getEntry(stat1.mPackageName, UserHandle.myUserId())) - .thenReturn(mock(ApplicationsState.AppEntry.class)); + .thenReturn(mock(ApplicationsState.AppEntry.class)); when(mAppState.getEntry(stat2.mPackageName, UserHandle.myUserId())) - .thenReturn(mock(ApplicationsState.AppEntry.class)); + .thenReturn(mock(ApplicationsState.AppEntry.class)); when(mPackageManager.resolveActivity(any(Intent.class), anyInt())) - .thenReturn(new ResolveInfo()); + .thenReturn(new ResolveInfo()); when(mUsageStatsManager.queryUsageStats(anyInt(), anyLong(), anyLong())) - .thenReturn(stats); + .thenReturn(stats); mController.displayPreference(mScreen); @@ -336,11 +338,11 @@ public class RecentAppsPreferenceControllerTest { stats.add(stat1); when(mAppState.getEntry(stat1.mPackageName, UserHandle.myUserId())) - .thenReturn(mAppEntry); + .thenReturn(mAppEntry); when(mPackageManager.resolveActivity(any(Intent.class), anyInt())) - .thenReturn(new ResolveInfo()); + .thenReturn(new ResolveInfo()); when(mUsageStatsManager.queryUsageStats(anyInt(), anyLong(), anyLong())) - .thenReturn(stats); + .thenReturn(stats); mAppEntry.info = mApplicationInfo; mController.displayPreference(mScreen); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java index c09af2b817d..051ef399325 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java @@ -21,6 +21,8 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.content.Context; import android.os.PowerManager; @@ -37,21 +39,19 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; -import org.robolectric.shadows.ShadowPowerManager; import org.robolectric.util.ReflectionHelpers; @RunWith(SettingsRobolectricTestRunner.class) -@Config(shadows = ShadowPowerManager.class) public class BatterySaverButtonPreferenceControllerTest { private BatterySaverButtonPreferenceController mController; private Context mContext; private Button mButtonOn; private Button mButtonOff; - private PowerManager mPowerManager; private TwoStateButtonPreference mPreference; + @Mock + private PowerManager mPowerManager; @Mock private PreferenceScreen mPreferenceScreen; @@ -61,10 +61,11 @@ public class BatterySaverButtonPreferenceControllerTest { mContext = spy(RuntimeEnvironment.application); mButtonOn = new Button(mContext); mButtonOff = new Button(mContext); - mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mPreference = spy(new TwoStateButtonPreference(mContext, null /* AttributeSet */)); ReflectionHelpers.setField(mPreference, "mButtonOn", mButtonOn); ReflectionHelpers.setField(mPreference, "mButtonOff", mButtonOff); + + doReturn(mPowerManager).when(mContext).getSystemService(Context.POWER_SERVICE); doReturn(mPreference).when(mPreferenceScreen).findPreference(anyString()); mController = new BatterySaverButtonPreferenceController(mContext, "test_key"); @@ -73,7 +74,7 @@ public class BatterySaverButtonPreferenceControllerTest { @Test public void updateState_lowPowerOn_preferenceIsChecked() { - mPowerManager.setPowerSaveMode(true); + when(mPowerManager.isPowerSaveMode()).thenReturn(true); mController.updateState(mPreference); @@ -82,7 +83,7 @@ public class BatterySaverButtonPreferenceControllerTest { @Test public void testUpdateState_lowPowerOff_preferenceIsUnchecked() { - mPowerManager.setPowerSaveMode(false); + when(mPowerManager.isPowerSaveMode()).thenReturn(false); mController.updateState(mPreference); @@ -93,13 +94,13 @@ public class BatterySaverButtonPreferenceControllerTest { public void setChecked_on_setPowerSaveMode() { mController.setChecked(true); - assertThat(mPowerManager.isPowerSaveMode()).isTrue(); + verify(mPowerManager).setPowerSaveMode(true); } @Test public void setChecked_off_unsetPowerSaveMode() { mController.setChecked(false); - assertThat(mPowerManager.isPowerSaveMode()).isFalse(); + verify(mPowerManager).setPowerSaveMode(false); } } 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 e8cb67474bb..4f501970416 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java @@ -27,11 +27,9 @@ 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.CustomSliceRegistry; 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; @@ -153,7 +151,7 @@ public class ContextualCardLoaderTest { cards.add(new ContextualCard.Builder() .setName("test_wifi") .setCardType(ContextualCard.CardType.SLICE) - .setSliceUri(WifiSlice.WIFI_URI) + .setSliceUri(CustomSliceRegistry.WIFI_SLICE_URI) .build()); cards.add(new ContextualCard.Builder() .setName("test_flashlight") @@ -164,7 +162,7 @@ public class ContextualCardLoaderTest { cards.add(new ContextualCard.Builder() .setName("test_connected") .setCardType(ContextualCard.CardType.SLICE) - .setSliceUri(ConnectedDeviceSlice.CONNECTED_DEVICE_URI) + .setSliceUri(CustomSliceRegistry.CONNECTED_DEVICE_SLICE_URI) .build()); cards.add(new ContextualCard.Builder() .setName("test_gesture") @@ -175,7 +173,7 @@ public class ContextualCardLoaderTest { cards.add(new ContextualCard.Builder() .setName("test_battery") .setCardType(ContextualCard.CardType.SLICE) - .setSliceUri(BatterySlice.BATTERY_CARD_URI) + .setSliceUri(CustomSliceRegistry.BATTERY_INFO_SLICE_URI) .build()); return cards; } @@ -208,7 +206,7 @@ public class ContextualCardLoaderTest { cards.add(new ContextualCard.Builder() .setName("test_battery") .setCardType(ContextualCard.CardType.SLICE) - .setSliceUri(BatterySlice.BATTERY_CARD_URI) + .setSliceUri(CustomSliceRegistry.BATTERY_INFO_SLICE_URI) .build()); return cards; } diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java index 6b1f8b12da3..4b0b0851a9f 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java @@ -23,15 +23,13 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import android.app.slice.SliceManager; -import android.content.ContentResolver; import android.content.Context; -import android.net.Uri; import android.os.Bundle; import com.android.settings.intelligence.ContextualCardProto.ContextualCard; import com.android.settings.intelligence.ContextualCardProto.ContextualCardList; +import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.testutils.SettingsRobolectricTestRunner; -import com.android.settings.wifi.WifiSlice; import com.google.android.settings.intelligence.libs.contextualcards.ContextualCardProvider; @@ -48,18 +46,11 @@ public class SettingsContextualCardProviderTest { @Mock private SliceManager mSliceManager; - private ContentResolver mResolver; - private Uri mUri; private SettingsContextualCardProvider mProvider; @Before public void setUp() { MockitoAnnotations.initMocks(this); - mResolver = RuntimeEnvironment.application.getContentResolver(); - mUri = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsContextualCardProvider.CARD_AUTHORITY) - .build(); mProvider = spy(Robolectric.setupContentProvider(SettingsContextualCardProvider.class)); final Context context = spy(RuntimeEnvironment.application); doReturn(mSliceManager).when(context).getSystemService(SliceManager.class); @@ -83,7 +74,7 @@ public class SettingsContextualCardProviderTest { final ContextualCardList cards = mProvider.getContextualCards(); ContextualCard wifiCard = null; for (ContextualCard card : cards.getCardList()) { - if (card.getSliceUri().equals(WifiSlice.WIFI_URI.toString())) { + if (card.getSliceUri().equals(CustomSliceRegistry.WIFI_SLICE_URI.toString())) { wifiCard = card; } } diff --git a/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java b/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java index d260a9781bc..5269dd7265a 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java @@ -44,6 +44,7 @@ import androidx.slice.widget.SliceLiveData; import com.android.ims.ImsManager; import com.android.settings.R; import com.android.settings.slices.CustomSliceManager; +import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.SettingsSliceProvider; import com.android.settings.slices.SliceBroadcastReceiver; import com.android.settings.slices.SlicesFeatureProvider; @@ -107,7 +108,7 @@ public class Enhanced4gLteSliceHelperTest { mEnhanced4gLteSliceHelper.setDefaultVoiceSubId(-1); final Slice slice = mEnhanced4gLteSliceHelper.createEnhanced4gLteSlice( - Enhanced4gLteSliceHelper.SLICE_URI); + CustomSliceRegistry.ENHANCED_4G_SLICE_URI); assertThat(slice).isNull(); } @@ -117,7 +118,7 @@ public class Enhanced4gLteSliceHelperTest { when(mMockImsManager.isVolteEnabledByPlatform()).thenReturn(false); final Slice slice = mEnhanced4gLteSliceHelper.createEnhanced4gLteSlice( - Enhanced4gLteSliceHelper.SLICE_URI); + CustomSliceRegistry.ENHANCED_4G_SLICE_URI); assertThat(mEnhanced4gLteSliceHelper.getDefaultVoiceSubId()).isEqualTo(1); assertThat(slice).isNull(); @@ -132,7 +133,7 @@ public class Enhanced4gLteSliceHelperTest { when(mMockCarrierConfigManager.getConfigForSubId(1)).thenReturn(null); final Slice slice = mEnhanced4gLteSliceHelper.createEnhanced4gLteSlice( - Enhanced4gLteSliceHelper.SLICE_URI); + CustomSliceRegistry.ENHANCED_4G_SLICE_URI); assertThat(mEnhanced4gLteSliceHelper.getDefaultVoiceSubId()).isEqualTo(1); testEnhanced4gLteSettingsToggleSlice(slice); @@ -148,7 +149,7 @@ public class Enhanced4gLteSliceHelperTest { when(mSlicesFeatureProvider.getNewEnhanced4gLteSliceHelper(mContext)) .thenReturn(mEnhanced4gLteSliceHelper); - final Slice slice = mProvider.onBindSlice(Enhanced4gLteSliceHelper.SLICE_URI); + final Slice slice = mProvider.onBindSlice(CustomSliceRegistry.ENHANCED_4G_SLICE_URI); assertThat(mEnhanced4gLteSliceHelper.getDefaultVoiceSubId()).isEqualTo(1); testEnhanced4gLteSettingsToggleSlice(slice); diff --git a/tests/robotests/src/com/android/settings/panel/InternetConnectivityPanelTest.java b/tests/robotests/src/com/android/settings/panel/InternetConnectivityPanelTest.java index 3e210f5298c..243c19badab 100644 --- a/tests/robotests/src/com/android/settings/panel/InternetConnectivityPanelTest.java +++ b/tests/robotests/src/com/android/settings/panel/InternetConnectivityPanelTest.java @@ -21,8 +21,8 @@ import static com.google.common.truth.Truth.assertThat; import android.net.Uri; +import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.testutils.SettingsRobolectricTestRunner; -import com.android.settings.wifi.WifiSlice; import org.junit.Before; import org.junit.Test; @@ -46,7 +46,7 @@ public class InternetConnectivityPanelTest { public void getSlices_containsNecessarySlices() { final List uris = mPanel.getSlices(); - assertThat(uris).containsExactly(WifiSlice.WIFI_URI, - InternetConnectivityPanel.AIRPLANE_URI); + assertThat(uris).containsExactly(CustomSliceRegistry.WIFI_SLICE_URI, + CustomSliceRegistry.AIRPLANE_URI); } } diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java index 3c2cbdbb036..8e3c1c8d4d5 100644 --- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java +++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java @@ -48,10 +48,6 @@ import androidx.slice.SliceProvider; import androidx.slice.widget.SliceLiveData; import com.android.settings.R; -import com.android.settings.bluetooth.BluetoothSliceBuilder; -import com.android.settings.flashlight.FlashlightSliceBuilder; -import com.android.settings.location.LocationSliceBuilder; -import com.android.settings.notification.ZenModeSliceBuilder; import com.android.settings.testutils.DatabaseTestUtils; import com.android.settings.testutils.FakeToggleController; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -113,14 +109,14 @@ public class SettingsSliceProviderTest { private SliceManager mManager; private static final List SPECIAL_CASE_PLATFORM_URIS = Arrays.asList( - WifiSlice.WIFI_URI, - BluetoothSliceBuilder.BLUETOOTH_URI, - LocationSliceBuilder.LOCATION_URI + CustomSliceRegistry.WIFI_SLICE_URI, + CustomSliceRegistry.BLUETOOTH_URI, + CustomSliceRegistry.LOCATION_SLICE_URI ); private static final List SPECIAL_CASE_OEM_URIS = Arrays.asList( - ZenModeSliceBuilder.ZEN_MODE_URI, - FlashlightSliceBuilder.FLASHLIGHT_URI + CustomSliceRegistry.ZEN_MODE_SLICE_URI, + CustomSliceRegistry.FLASHLIGHT_SLICE_URI ); @Before @@ -472,9 +468,9 @@ public class SettingsSliceProviderTest { @Test public void bindSlice_wifiSlice_returnsWifiSlice() { - final Slice wifiSlice = mProvider.onBindSlice(WifiSlice.WIFI_URI); + final Slice wifiSlice = mProvider.onBindSlice(CustomSliceRegistry.WIFI_SLICE_URI); - assertThat(wifiSlice.getUri()).isEqualTo(WifiSlice.WIFI_URI); + assertThat(wifiSlice.getUri()).isEqualTo(CustomSliceRegistry.WIFI_SLICE_URI); } @Test @@ -482,9 +478,10 @@ public class SettingsSliceProviderTest { Settings.Secure.putInt( mContext.getContentResolver(), Settings.Secure.FLASHLIGHT_AVAILABLE, 1); - final Slice flashlightSlice = mProvider.onBindSlice(FlashlightSliceBuilder.FLASHLIGHT_URI); + final Slice flashlightSlice = mProvider.onBindSlice( + CustomSliceRegistry.FLASHLIGHT_SLICE_URI); - assertThat(flashlightSlice.getUri()).isEqualTo(FlashlightSliceBuilder.FLASHLIGHT_URI); + assertThat(flashlightSlice.getUri()).isEqualTo(CustomSliceRegistry.FLASHLIGHT_SLICE_URI); } @Test @@ -526,22 +523,22 @@ public class SettingsSliceProviderTest { @Test public void onSlicePinned_backgroundWorker_started() { - mProvider.onSlicePinned(WifiSlice.WIFI_URI); + mProvider.onSlicePinned(CustomSliceRegistry.WIFI_SLICE_URI); verify(ShadowWifiScanWorker.getWifiTracker()).onStart(); } @Test public void onSlicePinned_backgroundWorker_stopped() { - mProvider.onSlicePinned(WifiSlice.WIFI_URI); - mProvider.onSliceUnpinned(WifiSlice.WIFI_URI); + mProvider.onSlicePinned(CustomSliceRegistry.WIFI_SLICE_URI); + mProvider.onSliceUnpinned(CustomSliceRegistry.WIFI_SLICE_URI); verify(ShadowWifiScanWorker.getWifiTracker()).onStop(); } @Test public void shutdown_backgroundWorker_closed() { - mProvider.onSlicePinned(WifiSlice.WIFI_URI); + mProvider.onSlicePinned(CustomSliceRegistry.WIFI_SLICE_URI); mProvider.shutdown(); verify(ShadowWifiScanWorker.getWifiTracker()).onDestroy(); diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java index ae4c7533bbf..11dd56e6f48 100644 --- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java +++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java @@ -49,6 +49,7 @@ import com.android.ims.ImsConfig; import com.android.ims.ImsManager; import com.android.settings.R; import com.android.settings.slices.CustomSliceManager; +import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.SettingsSliceProvider; import com.android.settings.slices.SliceBroadcastReceiver; import com.android.settings.slices.SliceData; @@ -113,7 +114,7 @@ public class WifiCallingSliceHelperTest { mWfcSliceHelper.setDefaultVoiceSubId(-1); final Slice slice = mWfcSliceHelper.createWifiCallingSlice( - WifiCallingSliceHelper.WIFI_CALLING_URI); + CustomSliceRegistry.WIFI_CALLING_URI); assertThat(slice).isNull(); } @@ -123,7 +124,7 @@ public class WifiCallingSliceHelperTest { when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(false); final Slice slice = mWfcSliceHelper.createWifiCallingSlice( - WifiCallingSliceHelper.WIFI_CALLING_URI); + CustomSliceRegistry.WIFI_CALLING_URI); assertThat(mWfcSliceHelper.getDefaultVoiceSubId()).isEqualTo(1); assertThat(slice).isNull(); @@ -144,7 +145,7 @@ public class WifiCallingSliceHelperTest { mWfcSliceHelper.setActivationAppIntent(new Intent()); // dummy Intent final Slice slice = mWfcSliceHelper.createWifiCallingSlice( - WifiCallingSliceHelper.WIFI_CALLING_URI); + CustomSliceRegistry.WIFI_CALLING_URI); assertThat(mWfcSliceHelper.getDefaultVoiceSubId()).isEqualTo(1); testWifiCallingSettingsUnavailableSlice(slice, null, @@ -161,7 +162,7 @@ public class WifiCallingSliceHelperTest { when(mMockCarrierConfigManager.getConfigForSubId(1)).thenReturn(null); final Slice slice = mWfcSliceHelper.createWifiCallingSlice( - WifiCallingSliceHelper.WIFI_CALLING_URI); + CustomSliceRegistry.WIFI_CALLING_URI); assertThat(mWfcSliceHelper.getDefaultVoiceSubId()).isEqualTo(1); testWifiCallingSettingsToggleSlice(slice, null); @@ -177,7 +178,7 @@ public class WifiCallingSliceHelperTest { when(mSlicesFeatureProvider.getNewWifiCallingSliceHelper(mContext)) .thenReturn(mWfcSliceHelper); - final Slice slice = mProvider.onBindSlice(WifiCallingSliceHelper.WIFI_CALLING_URI); + final Slice slice = mProvider.onBindSlice(CustomSliceRegistry.WIFI_CALLING_URI); assertThat(mWfcSliceHelper.getDefaultVoiceSubId()).isEqualTo(1); testWifiCallingSettingsToggleSlice(slice, null); @@ -217,7 +218,7 @@ public class WifiCallingSliceHelperTest { mWfcSliceHelper.setIsWifiCallingPrefEditable(false); final Slice slice = mWfcSliceHelper.createWifiCallingPreferenceSlice( - WifiCallingSliceHelper.WIFI_CALLING_PREFERENCE_URI); + CustomSliceRegistry.WIFI_CALLING_PREFERENCE_URI); assertThat(mWfcSliceHelper.getDefaultVoiceSubId()).isEqualTo(1); assertThat(slice).isNull(); @@ -232,7 +233,7 @@ public class WifiCallingSliceHelperTest { mWfcSliceHelper.setIsWifiCallingPrefEditable(true); final Slice slice = mWfcSliceHelper.createWifiCallingPreferenceSlice( - WifiCallingSliceHelper.WIFI_CALLING_PREFERENCE_URI); + CustomSliceRegistry.WIFI_CALLING_PREFERENCE_URI); assertThat(mWfcSliceHelper.getDefaultVoiceSubId()).isEqualTo(1); testWifiCallingSettingsUnavailableSlice(slice, null, @@ -251,7 +252,7 @@ public class WifiCallingSliceHelperTest { mWfcSliceHelper.setIsWifiCallingPrefEditable(true); final Slice slice = mWfcSliceHelper.createWifiCallingPreferenceSlice( - WifiCallingSliceHelper.WIFI_CALLING_PREFERENCE_URI); + CustomSliceRegistry.WIFI_CALLING_PREFERENCE_URI); assertThat(mWfcSliceHelper.getDefaultVoiceSubId()).isEqualTo(1); testWifiCallingPreferenceSlice(slice, null, @@ -271,7 +272,7 @@ public class WifiCallingSliceHelperTest { mWfcSliceHelper.setIsWifiCallingPrefEditable(true); final Slice slice = mProvider.onBindSlice( - WifiCallingSliceHelper.WIFI_CALLING_PREFERENCE_URI); + CustomSliceRegistry.WIFI_CALLING_PREFERENCE_URI); assertThat(mWfcSliceHelper.getDefaultVoiceSubId()).isEqualTo(1); testWifiCallingPreferenceSlice(slice, null, diff --git a/tests/unit/src/com/android/settings/slices/SliceDeepLinkSpringBoardTest.java b/tests/unit/src/com/android/settings/slices/SliceDeepLinkSpringBoardTest.java index 81f1face0c3..bd8649d6bea 100644 --- a/tests/unit/src/com/android/settings/slices/SliceDeepLinkSpringBoardTest.java +++ b/tests/unit/src/com/android/settings/slices/SliceDeepLinkSpringBoardTest.java @@ -26,11 +26,6 @@ import android.support.test.InstrumentationRegistry; import android.support.test.filters.MediumTest; import android.support.test.runner.AndroidJUnit4; -import com.android.settings.bluetooth.BluetoothSliceBuilder; -import com.android.settings.location.LocationSliceBuilder; -import com.android.settings.notification.ZenModeSliceBuilder; -import com.android.settings.wifi.WifiSlice; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -57,7 +52,8 @@ public class SliceDeepLinkSpringBoardTest { @Test @Presubmit public void launchesDeepLinkIntent_wifiSlice_shouldNotCrash() { - final Intent deepLinkIntent = getSpringboardIntent(WifiSlice.WIFI_URI.toString()); + final Intent deepLinkIntent = getSpringboardIntent( + CustomSliceRegistry.WIFI_SLICE_URI.toString()); mContext.startActivity(deepLinkIntent); } @@ -66,7 +62,7 @@ public class SliceDeepLinkSpringBoardTest { @Presubmit public void launchesDeepLinkIntent_bluetoothSlice_shouldNotCrash() { final Intent deepLinkIntent = getSpringboardIntent( - BluetoothSliceBuilder.BLUETOOTH_URI.toString()); + CustomSliceRegistry.BLUETOOTH_URI.toString()); mContext.startActivity(deepLinkIntent); } @@ -75,7 +71,7 @@ public class SliceDeepLinkSpringBoardTest { @Presubmit public void launchesDeepLinkIntent_dndSlice_shouldNotCrash() { final Intent deepLinkIntent = getSpringboardIntent( - ZenModeSliceBuilder.ZEN_MODE_URI.toString()); + CustomSliceRegistry.ZEN_MODE_SLICE_URI.toString()); mContext.startActivity(deepLinkIntent); } @@ -84,7 +80,7 @@ public class SliceDeepLinkSpringBoardTest { @Presubmit public void launchesDeepLinkIntent_locationSlice_shouldNotCrash() { final Intent deepLinkIntent = getSpringboardIntent( - LocationSliceBuilder.LOCATION_URI.toString()); + CustomSliceRegistry.LOCATION_SLICE_URI.toString()); mContext.startActivity(deepLinkIntent); } From b8850fc679b7b8e0adedabb434c9c1f95327aa06 Mon Sep 17 00:00:00 2001 From: Yanting Yang Date: Fri, 30 Nov 2018 17:58:45 +0800 Subject: [PATCH 17/22] Fix NPE in slice data generation NPE will be occurred when clients gives invalid slice uri for Settings. We have defined some rules in getPathData() and it will return null object when the invalid uri was given. NPE will be happened in next. Change-Id: I6ebadd4383aee6e69b1c2eb6c84071c961fd72a7 Fixes: 120259627 Test: robotests --- src/com/android/settings/slices/SlicesDatabaseAccessor.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/android/settings/slices/SlicesDatabaseAccessor.java b/src/com/android/settings/slices/SlicesDatabaseAccessor.java index 35a0a5d14ac..c75f3ef10c0 100644 --- a/src/com/android/settings/slices/SlicesDatabaseAccessor.java +++ b/src/com/android/settings/slices/SlicesDatabaseAccessor.java @@ -71,6 +71,9 @@ public class SlicesDatabaseAccessor { */ public SliceData getSliceDataFromUri(Uri uri) { Pair pathData = SliceBuilderUtils.getPathData(uri); + if (pathData == null) { + throw new IllegalStateException("Invalid Slices uri: " + uri); + } Cursor cursor = getIndexedSliceData(pathData.second /* key */); return buildSliceData(cursor, uri, pathData.first /* isIntentOnly */); } From 47610f149a6bbc8fddf5bc8a1fd6d6c4173c2175 Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Fri, 30 Nov 2018 20:26:35 +0800 Subject: [PATCH 18/22] Update string for "Reset" screens - Update "Reset phone" to "Erase all data" Change-Id: I410fb4916ae9b0234b47d5a35a038d280b24fe0b Fixes: 79172587 Test: robotests & visual --- res/values/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index ceed0fedd1e..fb8ab201498 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3456,9 +3456,9 @@ Erase all data (factory reset) - "This will erase all data from your tablet\u2019s internal storage, including:\n\n
  • Your Google account
  • \n
  • System and app data and settings
  • \n
  • Downloaded apps
  • "
    + "This will erase all data from your tablet\u2019s internal storage, including:\n\n
  • Your Google Account
  • \n
  • System and app data and settings
  • \n
  • Downloaded apps
  • "
    - "This will erase all data from your phone\u2019s internal storage, including:\n\n
  • Your Google account
  • \n
  • System and app data and settings
  • \n
  • Downloaded apps
  • "
    + "This will erase all data from your phone\u2019s internal storage, including:\n\n
  • Your Google Account
  • \n
  • System and app data and settings
  • \n
  • Downloaded apps
  • "
    "\n\nYou are currently signed into the following accounts:\n" @@ -3488,17 +3488,17 @@ Erase all eSIMs on the tablet. This will not cancel your mobile service plan. - Reset tablet + Erase all data - Reset phone + Erase all data - Erase all your personal information and downloaded apps? You can\u2019t undo this action! + All of your personal information and downloaded apps will be deleted. You can\u2019t undo this action! Erase everything No reset was performed because the System Clear service isn\u2019t available. - Reset? + Erase all data? Factory reset is not available for this user From 86b1c7d0b171c8167dc098532f2c7e08adcdcfe7 Mon Sep 17 00:00:00 2001 From: Sunny Shao Date: Tue, 27 Nov 2018 16:29:38 +0800 Subject: [PATCH 19/22] Refined the Search Bar layout Removed the background color of the search bar. Set the background of the AppBarLayout as transparent. Set the app bar height. Bug: 118886724 Test: manual review Change-Id: I7faedc693ce61d5a5237e8a72909b77b56268a4c --- color-check-baseline.xml | 24 +++++++-- res/layout/search_bar.xml | 57 +++++++++------------- res/layout/settings_homepage_container.xml | 5 +- res/values/dimens.xml | 4 -- res/values/styles.xml | 18 +++++-- res/values/themes.xml | 5 -- 6 files changed, 61 insertions(+), 52 deletions(-) diff --git a/color-check-baseline.xml b/color-check-baseline.xml index 312e5c92503..83c0d53e7c6 100644 --- a/color-check-baseline.xml +++ b/color-check-baseline.xml @@ -2493,7 +2493,7 @@ errorLine2=" ^"> @@ -2509,7 +2509,7 @@ errorLine2=" ^"> @@ -2525,7 +2525,7 @@ errorLine2=" ^"> @@ -2541,7 +2541,23 @@ errorLine2=" ^"> + + + + diff --git a/res/layout/search_bar.xml b/res/layout/search_bar.xml index 9135ebf8f1a..be8aa3b8819 100644 --- a/res/layout/search_bar.xml +++ b/res/layout/search_bar.xml @@ -15,42 +15,33 @@ limitations under the License. --> - - - - - - - - \ No newline at end of file + android:layout_height="@dimen/search_bar_height" + android:background="?android:attr/selectableItemBackground" + android:contentInsetStartWithNavigation="@dimen/search_bar_content_inset" + android:navigationIcon="@drawable/ic_search_24dp"> + + + + diff --git a/res/layout/settings_homepage_container.xml b/res/layout/settings_homepage_container.xml index 02235738731..8d81e824642 100644 --- a/res/layout/settings_homepage_container.xml +++ b/res/layout/settings_homepage_container.xml @@ -23,11 +23,12 @@ + android:layout_height="wrap_content" + android:background="@android:color/transparent" + app:elevation="0dp"> - 72dp 16dp - 16dp - -16dp 48dp 2dp diff --git a/res/values/styles.xml b/res/values/styles.xml index 1b311aabafa..8a92eaaf2f4 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -17,7 +17,7 @@ @@ -400,9 +401,11 @@ + + - - From c14316c4a93001f2f118dda309467306a9ad386f Mon Sep 17 00:00:00 2001 From: Matthew Fritze Date: Wed, 28 Nov 2018 13:05:43 -0800 Subject: [PATCH 20/22] Update SettingsPanel UI UI changes include: - RecyclerView to host slices - Font family to headline font - Title is now centered - Added SeeMore & Done buttons - Horizontal Dividers between slices - Indented Slices - Landscape layout is fullscreen Change-Id: I3549c847fc88edd81f670ddfa2907dd3741441e0 Screenshot: https://screenshot.googleplex.com/RzWktzOZJkc Test: Robolectric Test: Manual app Bug: 118622007 --- res/layout-land/panel_layout.xml | 42 ++++++++ res/layout/panel_buttons.xml | 45 ++++++++ res/layout/panel_layout.xml | 29 +++-- res/layout/panel_slice_row.xml | 31 ++++++ res/values/themes.xml | 3 + .../panel/InternetConnectivityPanel.java | 3 +- .../android/settings/panel/PanelFragment.java | 64 ++++++----- .../settings/panel/PanelSlicesAdapter.java | 100 ++++++++++++++++++ .../settings/panel/FakePanelContent.java | 56 ++++++++++ .../panel/FakeSettingsPanelActivity.java | 34 ++++++ .../panel/InternetConnectivityPanelTest.java | 5 + .../settings/panel/PanelFragmentTest.java | 89 ++++++++++++++++ .../panel/PanelSlicesAdapterTest.java | 97 +++++++++++++++++ .../testutils/FakeFeatureFactory.java | 6 +- 14 files changed, 569 insertions(+), 35 deletions(-) create mode 100644 res/layout-land/panel_layout.xml create mode 100644 res/layout/panel_buttons.xml create mode 100644 res/layout/panel_slice_row.xml create mode 100644 src/com/android/settings/panel/PanelSlicesAdapter.java create mode 100644 tests/robotests/src/com/android/settings/panel/FakePanelContent.java create mode 100644 tests/robotests/src/com/android/settings/panel/FakeSettingsPanelActivity.java create mode 100644 tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java create mode 100644 tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java diff --git a/res/layout-land/panel_layout.xml b/res/layout-land/panel_layout.xml new file mode 100644 index 00000000000..3975bfeaa3f --- /dev/null +++ b/res/layout-land/panel_layout.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/panel_buttons.xml b/res/layout/panel_buttons.xml new file mode 100644 index 00000000000..1bb38988888 --- /dev/null +++ b/res/layout/panel_buttons.xml @@ -0,0 +1,45 @@ + + + + + +