From 6546d6821709dd2acdda193e39aab0aa8b14172e Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Wed, 2 Jun 2021 22:06:42 +0800 Subject: [PATCH 1/8] [Settings] Change API for backup calling supporting status Change API for detecting backup calling supporting status. Bug: 182326102 Test: local Change-Id: I4bda5f518e042ba23f48cddd3b4c8baebc5e2330 --- .../BackupCallingPreferenceController.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/com/android/settings/network/telephony/BackupCallingPreferenceController.java b/src/com/android/settings/network/telephony/BackupCallingPreferenceController.java index d1c9f7b1ea2..4f64399f524 100644 --- a/src/com/android/settings/network/telephony/BackupCallingPreferenceController.java +++ b/src/com/android/settings/network/telephony/BackupCallingPreferenceController.java @@ -31,6 +31,7 @@ import androidx.preference.SwitchPreference; import com.android.settings.R; import com.android.settings.network.SubscriptionUtil; +import com.android.settings.network.ims.WifiCallingQueryImsState; import java.util.List; import java.util.Objects; @@ -147,16 +148,20 @@ public class BackupCallingPreferenceController extends TelephonyTogglePreference } private boolean hasBackupCallingFeature(int subscriptionId) { - PersistableBundle carrierConfig = getCarrierConfigForSubId(subscriptionId); - Boolean featureEnableStatus = null; - if (carrierConfig != null) { - featureEnableStatus = carrierConfig.getBoolean( - CarrierConfigManager.KEY_CARRIER_CROSS_SIM_IMS_AVAILABLE_BOOL, false); + return isCrossSimEnabledByPlatform(mContext, subscriptionId); + } + + protected boolean isCrossSimEnabledByPlatform(Context context, int subscriptionId) { + // TODO : Change into API which created for accessing + // com.android.ims.ImsManager#isCrossSimEnabledByPlatform() + if ((new WifiCallingQueryImsState(context, subscriptionId)).isWifiCallingSupported()) { + PersistableBundle bundle = getCarrierConfigForSubId(subscriptionId); + return (bundle != null) && bundle.getBoolean( + CarrierConfigManager.KEY_CARRIER_CROSS_SIM_IMS_AVAILABLE_BOOL, + false /*default*/); } - // TODO: remove log after fixing b/182326102 - Log.d(LOG_TAG, "config " + CarrierConfigManager.KEY_CARRIER_CROSS_SIM_IMS_AVAILABLE_BOOL - + "=" + featureEnableStatus + " for subId=" + subscriptionId); - return (featureEnableStatus != null) && featureEnableStatus.booleanValue(); + Log.d(LOG_TAG, "Not supported by framework. subId = " + subscriptionId); + return false; } private ImsMmTelManager getImsMmTelManager(int subId) { From 8af8dfd83ad7936fb11d07f2c8b0d0c11f7db823 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Wed, 9 Jun 2021 16:07:11 +0800 Subject: [PATCH 2/8] [Provider Model] Update the no internet unavailable icon - Show the no internet unavailable icon when Airplane mode is turned on Bug: 189205157 Test: manual test Change-Id: I0f630708fa60fe85177b23a833d40321fcfbffda --- res/drawable/ic_no_internet_airplane.xml | 28 ------------------- res/drawable/ic_no_internet_unavailable.xml | 28 +++++++++++++++++++ .../network/InternetPreferenceController.java | 2 +- 3 files changed, 29 insertions(+), 29 deletions(-) delete mode 100644 res/drawable/ic_no_internet_airplane.xml create mode 100644 res/drawable/ic_no_internet_unavailable.xml diff --git a/res/drawable/ic_no_internet_airplane.xml b/res/drawable/ic_no_internet_airplane.xml deleted file mode 100644 index 3b22811e7d2..00000000000 --- a/res/drawable/ic_no_internet_airplane.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - \ No newline at end of file diff --git a/res/drawable/ic_no_internet_unavailable.xml b/res/drawable/ic_no_internet_unavailable.xml new file mode 100644 index 00000000000..049034a25b2 --- /dev/null +++ b/res/drawable/ic_no_internet_unavailable.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/src/com/android/settings/network/InternetPreferenceController.java b/src/com/android/settings/network/InternetPreferenceController.java index 639bab5322c..a58e69a7d6d 100644 --- a/src/com/android/settings/network/InternetPreferenceController.java +++ b/src/com/android/settings/network/InternetPreferenceController.java @@ -65,7 +65,7 @@ public class InternetPreferenceController extends AbstractPreferenceController i @VisibleForTesting static Map sIconMap = new HashMap<>(); static { - sIconMap.put(INTERNET_OFF, R.drawable.ic_no_internet_airplane); + sIconMap.put(INTERNET_OFF, R.drawable.ic_no_internet_unavailable); sIconMap.put(INTERNET_NETWORKS_AVAILABLE, R.drawable.ic_no_internet_available); sIconMap.put(INTERNET_WIFI, R.drawable.ic_wifi_signal_4); sIconMap.put(INTERNET_CELLULAR, R.drawable.ic_network_cell); From 1e2f161950b92c35ba04ffb3e91dfc890c3cfc72 Mon Sep 17 00:00:00 2001 From: Yanting Yang Date: Wed, 9 Jun 2021 17:20:14 +0800 Subject: [PATCH 3/8] Correct the app bar color theme of Digital Assistant app Fixes: 190450049 Test: visual Change-Id: Ib3ff19bd8a00060400960fd92060ac7b136fd3d5 --- AndroidManifest.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index c4bf977f0b8..f6bd6f2204d 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -712,7 +712,8 @@ + android:label="@string/assist_and_voice_input_title" + android:theme="@style/Theme.SubSettings"> From 5a23ca7c21b4fb08b2c45b35931e4443facdeb10 Mon Sep 17 00:00:00 2001 From: changbetty Date: Thu, 10 Jun 2021 17:15:04 +0800 Subject: [PATCH 4/8] Disable EntityHeaderController animation for item move down issue EntityHeaderController include the RecyclerView and it has animation by default. When RecyclerView do the animation first then update the UI, it will cause the issue. Bug: 189071671 Test: manaul test Test: make RunSettingsRoboTests ROBOTEST_FILTER=WifiDetailPreferenceController2Test Change-Id: Ieb7e0a8f7658bface9af090ea061ca7265099fcd --- .../wifi/details2/WifiDetailPreferenceController2.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java index ced198bb887..7bf680da103 100644 --- a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java +++ b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java @@ -63,6 +63,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceScreen; +import androidx.recyclerview.widget.RecyclerView; import com.android.net.module.util.Inet4AddressUtils; import com.android.settings.R; @@ -513,6 +514,12 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle @Override public void onResume() { + // Disable the animation of the EntityHeaderController + final RecyclerView recyclerView = mFragment.getListView(); + if (recyclerView != null) { + recyclerView.setItemAnimator(null); + } + // Ensure mNetwork is set before any callbacks above are delivered, since our // NetworkCallback only looks at changes to mNetwork. updateNetworkInfo(); From a6eb37b215ab6c7a52cc5bf0c45325ad8fc1f8d6 Mon Sep 17 00:00:00 2001 From: Sunny Shao Date: Thu, 10 Jun 2021 15:46:58 +0800 Subject: [PATCH 5/8] Fix Learn more link placement is wrong problem - Use the new style of the FooterPreference. Fixes: 189389674 Test: Robo test Change-Id: I1529952181cca0eccd18f911eaa265b19dbb97f7 --- ...erpriseDisclosurePreferenceController.java | 37 ++++++++++++++----- .../EnterprisePrivacyFeatureProviderImpl.java | 3 -- ...iseDisclosurePreferenceControllerTest.java | 24 ++++++++---- 3 files changed, 45 insertions(+), 19 deletions(-) diff --git a/src/com/android/settings/accounts/EnterpriseDisclosurePreferenceController.java b/src/com/android/settings/accounts/EnterpriseDisclosurePreferenceController.java index b4dbf3d2c8a..238e93790d3 100644 --- a/src/com/android/settings/accounts/EnterpriseDisclosurePreferenceController.java +++ b/src/com/android/settings/accounts/EnterpriseDisclosurePreferenceController.java @@ -17,16 +17,19 @@ package com.android.settings.accounts; import android.content.Context; +import android.content.Intent; +import android.provider.Settings; import androidx.annotation.VisibleForTesting; -import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; +import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider; import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.widget.FooterPreference; public class EnterpriseDisclosurePreferenceController extends BasePreferenceController { - private final EnterprisePrivacyFeatureProvider mFeatureProvider; public EnterpriseDisclosurePreferenceController(Context context, String key) { @@ -36,6 +39,16 @@ public class EnterpriseDisclosurePreferenceController extends BasePreferenceCont .getEnterprisePrivacyFeatureProvider(mContext); } + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + final CharSequence disclosure = getDisclosure(); + if (disclosure == null) { + return; + } + updateFooterPreference(screen, disclosure); + } + @Override public int getAvailabilityStatus() { if (getDisclosure() == null) { @@ -49,12 +62,18 @@ public class EnterpriseDisclosurePreferenceController extends BasePreferenceCont return mFeatureProvider.getDeviceOwnerDisclosure(); } - @Override - public void updateState(Preference preference) { - final CharSequence disclosure = getDisclosure(); - if (disclosure == null) { - return; - } - preference.setTitle(disclosure); + void updateFooterPreference(PreferenceScreen screen, CharSequence disclosure) { + final FooterPreference footerPreference = screen.findPreference(getPreferenceKey()); + footerPreference.setTitle(disclosure); + footerPreference.setLearnMoreAction(view -> { + mContext.startActivity(new Intent(Settings.ACTION_ENTERPRISE_PRIVACY_SETTINGS)); + }); + final String learnMoreContentDescription = mContext.getString( + R.string.footer_learn_more_content_description, getLabelName()); + footerPreference.setLearnMoreContentDescription(learnMoreContentDescription); + } + + private String getLabelName() { + return mContext.getString(R.string.header_add_an_account); } } diff --git a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java index f461fe1e556..7d722fcd1b0 100644 --- a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java +++ b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java @@ -100,9 +100,6 @@ public class EnterprisePrivacyFeatureProviderImpl implements EnterprisePrivacyFe } else { disclosure.append(mResources.getString(R.string.do_disclosure_generic)); } - disclosure.append(mResources.getString(R.string.do_disclosure_learn_more_separator)); - disclosure.append(mResources.getString(R.string.learn_more), - new EnterprisePrivacySpan(mContext), 0); return disclosure; } diff --git a/tests/robotests/src/com/android/settings/accounts/EnterpriseDisclosurePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/EnterpriseDisclosurePreferenceControllerTest.java index b10a7292b5f..8860cfe9b75 100644 --- a/tests/robotests/src/com/android/settings/accounts/EnterpriseDisclosurePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accounts/EnterpriseDisclosurePreferenceControllerTest.java @@ -19,20 +19,25 @@ package com.android.settings.accounts; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.content.Context; -import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; import com.android.settings.core.BasePreferenceController; +import com.android.settingslib.widget.FooterPreference; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; @@ -42,13 +47,18 @@ public class EnterpriseDisclosurePreferenceControllerTest { private Context mContext; private EnterpriseDisclosurePreferenceController mController; - private Preference mPreference; + private FooterPreference mPreference; + + @Mock + private PreferenceScreen mPreferenceScreen; @Before public void setUp() { + MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; mController = spy(new EnterpriseDisclosurePreferenceController(mContext, "my_key")); - mPreference = spy(new Preference(mContext)); + mPreference = spy(new FooterPreference(mContext)); + when(mPreferenceScreen.findPreference(anyString())).thenReturn(mPreference); } @Test @@ -68,19 +78,19 @@ public class EnterpriseDisclosurePreferenceControllerTest { } @Test - public void updateState_hasDisclosure_shouldSetTitle() { + public void displayPreference_hasDisclosure_shouldSetTitle() { doReturn(TEST_DISCLOSURE).when(mController).getDisclosure(); - mController.updateState(mPreference); + mController.displayPreference(mPreferenceScreen); assertThat(mPreference.getTitle()).isEqualTo(TEST_DISCLOSURE); } @Test - public void updateState_noDisclosure_shouldBeInvisible() { + public void displayPreference_noDisclosure_shouldBeInvisible() { doReturn(null).when(mController).getDisclosure(); - mController.updateState(mPreference); + mController.displayPreference(mPreferenceScreen); verify(mPreference, never()).setTitle(any()); } From 467c7e81ea3e51c45f4dd14fa929f497138ccfac Mon Sep 17 00:00:00 2001 From: Yanting Yang Date: Thu, 10 Jun 2021 18:42:39 +0800 Subject: [PATCH 6/8] Left aligned the dropdown list of ManageApplications Based on the Android S design, left aligned the dropdown list of ManageApplications, e.g., All apps, App notifications Bug: 178774987 Test: visual Change-Id: I04143798475d20319980396d6bd755193ae2b1f0 --- res/layout/manage_apps_filter_spinner.xml | 32 +++++++++++++++++++ .../ManageApplications.java | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 res/layout/manage_apps_filter_spinner.xml diff --git a/res/layout/manage_apps_filter_spinner.xml b/res/layout/manage_apps_filter_spinner.xml new file mode 100644 index 00000000000..8283bb84d11 --- /dev/null +++ b/res/layout/manage_apps_filter_spinner.xml @@ -0,0 +1,32 @@ + + + + + + + diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index 62513db94d0..7509a788918 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -434,7 +434,7 @@ public class ManageApplications extends InstrumentedFragment final Activity activity = getActivity(); final FrameLayout pinnedHeader = mRootView.findViewById(R.id.pinned_header); mSpinnerHeader = activity.getLayoutInflater() - .inflate(R.layout.apps_filter_spinner, pinnedHeader, false); + .inflate(R.layout.manage_apps_filter_spinner, pinnedHeader, false); mFilterSpinner = mSpinnerHeader.findViewById(R.id.filter_spinner); mFilterAdapter = new FilterSpinnerAdapter(this); mFilterSpinner.setAdapter(mFilterAdapter); From 908d4ffadfd6e73316b6906c18fd6aa69e66acdf Mon Sep 17 00:00:00 2001 From: Weng Su Date: Wed, 9 Jun 2021 17:39:53 +0000 Subject: [PATCH 7/8] Revert "[Provider Model] Replace WiFi panel to Internet panel" This reverts commit c33f69673a6392d0def60b7c8d6f6129f417db0c. Reason for revert: Because Wi-Fi toggle design is rollback, resume the Wi-Fi panel as well. Bug: 190563749 Merged-In: Ia214ff9abaa7f4f33c485ca9aa72f73749ce7fc3 Change-Id: Ia214ff9abaa7f4f33c485ca9aa72f73749ce7fc3 (cherry picked from commit 368852424cfaa0b0f4e5d5d01e14699cb90278c4) --- .../panel/PanelFeatureProviderImpl.java | 5 -- .../panel/PanelFeatureProviderImplTest.java | 26 ------- .../testutils/FeatureFlagUtilsRule.java | 68 ------------------- 3 files changed, 99 deletions(-) delete mode 100644 tests/unit/src/com/android/settings/testutils/FeatureFlagUtilsRule.java diff --git a/src/com/android/settings/panel/PanelFeatureProviderImpl.java b/src/com/android/settings/panel/PanelFeatureProviderImpl.java index 28c4ba1bfbf..ca30952a72d 100644 --- a/src/com/android/settings/panel/PanelFeatureProviderImpl.java +++ b/src/com/android/settings/panel/PanelFeatureProviderImpl.java @@ -20,8 +20,6 @@ import android.content.Context; import android.os.Bundle; import android.provider.Settings; -import com.android.settings.Utils; - public class PanelFeatureProviderImpl implements PanelFeatureProvider { @Override @@ -41,9 +39,6 @@ public class PanelFeatureProviderImpl implements PanelFeatureProvider { case Settings.Panel.ACTION_NFC: return NfcPanel.create(context); case Settings.Panel.ACTION_WIFI: - if (Utils.isProviderModelEnabled(context)) { - return InternetConnectivityPanel.create(context); - } return WifiPanel.create(context); case Settings.Panel.ACTION_VOLUME: return VolumePanel.create(context); diff --git a/tests/unit/src/com/android/settings/panel/PanelFeatureProviderImplTest.java b/tests/unit/src/com/android/settings/panel/PanelFeatureProviderImplTest.java index 2199023ec93..3b61a734af1 100644 --- a/tests/unit/src/com/android/settings/panel/PanelFeatureProviderImplTest.java +++ b/tests/unit/src/com/android/settings/panel/PanelFeatureProviderImplTest.java @@ -27,10 +27,7 @@ import android.provider.Settings; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; -import com.android.settings.testutils.FeatureFlagUtilsRule; - import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -39,9 +36,6 @@ public class PanelFeatureProviderImplTest { private static final String TEST_PACKAGENAME = "com.test.packagename"; - @Rule - public final FeatureFlagUtilsRule mFeatureFlagUtilsRule = new FeatureFlagUtilsRule(); - private Context mContext; private PanelFeatureProviderImpl mProvider; private Bundle mBundle; @@ -71,24 +65,4 @@ public class PanelFeatureProviderImplTest { assertThat(panel).isInstanceOf(VolumePanel.class); } - - @Test - public void getPanel_wifi_returnsWifiPanelWhenProviderModelDisable() { - mFeatureFlagUtilsRule.setProviderModelEnabled(false); - mBundle.putString(KEY_PANEL_TYPE_ARGUMENT, Settings.Panel.ACTION_WIFI); - - final PanelContent panel = mProvider.getPanel(mContext, mBundle); - - assertThat(panel).isInstanceOf(WifiPanel.class); - } - - @Test - public void getPanel_wifi_returnsInternetConnectivityPanelWhenProviderModelDisable() { - mFeatureFlagUtilsRule.setProviderModelEnabled(true); - mBundle.putString(KEY_PANEL_TYPE_ARGUMENT, Settings.Panel.ACTION_WIFI); - - final PanelContent panel = mProvider.getPanel(mContext, mBundle); - - assertThat(panel).isInstanceOf(InternetConnectivityPanel.class); - } } diff --git a/tests/unit/src/com/android/settings/testutils/FeatureFlagUtilsRule.java b/tests/unit/src/com/android/settings/testutils/FeatureFlagUtilsRule.java deleted file mode 100644 index 910073eccdd..00000000000 --- a/tests/unit/src/com/android/settings/testutils/FeatureFlagUtilsRule.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settings.testutils; - -import android.content.Context; -import android.util.FeatureFlagUtils; - -import androidx.test.core.app.ApplicationProvider; - -import org.junit.rules.ExternalResource; - -import java.util.HashMap; -import java.util.Map; - -/** - * A test rule that is used to automatically recover the FeatureFlagUtils resource after testing. - * - * Example: - *

- * public class ExampleTest {
- *
- *     @Rule
- *     public final FeatureFlagUtilsRule mFeatureFlagUtilsRule = new FeatureFlagUtilsRule();
- *
- * }
- * 
- */ -public class FeatureFlagUtilsRule extends ExternalResource { - - private Context mContext; - private Map mBackupFeatureFlags = new HashMap(); - - @Override - protected void before() throws Throwable { - mContext = ApplicationProvider.getApplicationContext(); - } - - @Override - protected void after() { - mBackupFeatureFlags.forEach((k, v) -> FeatureFlagUtils.setEnabled(mContext, k, v)); - } - - public void setEnabled(String feature, boolean enabled) { - if (enabled == FeatureFlagUtils.isEnabled(mContext, feature)) { - return; - } - mBackupFeatureFlags.putIfAbsent(feature, !enabled); - FeatureFlagUtils.setEnabled(mContext, feature, enabled); - } - - public void setProviderModelEnabled(boolean enabled) { - setEnabled(FeatureFlagUtils.SETTINGS_PROVIDER_MODEL, enabled); - } -} From da06cec1734d9fd1360fdade3756e8e1db395587 Mon Sep 17 00:00:00 2001 From: Yanting Yang Date: Thu, 10 Jun 2021 23:20:38 +0800 Subject: [PATCH 8/8] Improve flicker when enter Security page The flicker preferences are injected from external apps and the text shifting is due to it needing time to load the icon from the content uri. To avoid flicker, put a transparent icon as default to wait for icon update. Fixes: 189165518 Test: robotests & visual Change-Id: I727eeefd5455711a53d3fd9ccd5356a15b9daae4 --- .../settings/dashboard/DashboardFeatureProviderImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index 0de86f5b668..a03a4f9b301 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -360,6 +360,11 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { // Icon provided by the content provider overrides any static icon. if (tile.getMetaData() != null && tile.getMetaData().containsKey(META_DATA_PREFERENCE_ICON_URI)) { + // Set a transparent color before starting to fetch the real icon, this is necessary + // to avoid preference padding change. + setPreferenceIcon(preference, tile, forceRoundedIcon, mContext.getPackageName(), + Icon.createWithResource(mContext, android.R.color.transparent)); + ThreadUtils.postOnBackgroundThread(() -> { final Intent intent = tile.getIntent(); String packageName = null;