diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 0a40c89d84b..570b53d5fbe 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -713,7 +713,8 @@ + android:label="@string/assist_and_voice_input_title" + android:theme="@style/Theme.SubSettings"> 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/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/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/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); 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; 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/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); 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) { 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/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(); 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()); } 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); - } -}