diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index d22a38117a2..b6729179d11 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -309,6 +309,7 @@ public class SettingsActivity extends SettingsBaseActivity mMainSwitch = findViewById(R.id.switch_bar); if (mMainSwitch != null) { mMainSwitch.setMetricsTag(getMetricsTag()); + mMainSwitch.setTranslationZ(findViewById(R.id.main_content).getTranslationZ() + 1); } // see if we should show Back/Next buttons diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java index 367e7c5086a..e34ae9b6ef7 100644 --- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java +++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java @@ -200,8 +200,6 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra mSwitchBar = ((SettingsActivity) getActivity()).getSwitchBar(); mSwitchBar.setTitle(getContext().getString(R.string.developer_options_main_switch_title)); mSwitchBar.show(); - mSwitchBar.setTranslationZ( - getActivity().findViewById(R.id.main_content).getTranslationZ() + 1); mSwitchBarController = new DevelopmentSwitchBarController( this /* DevelopmentSettings */, mSwitchBar, mIsAvailable, getSettingsLifecycle()); diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java index b5186462b3b..b187c876ac8 100644 --- a/src/com/android/settings/display/ScreenTimeoutSettings.java +++ b/src/com/android/settings/display/ScreenTimeoutSettings.java @@ -26,8 +26,13 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.UserHandle; import android.provider.Settings; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.style.ClickableSpan; import android.util.Log; +import android.view.View; +import androidx.annotation.NonNull; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; @@ -97,15 +102,6 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements mPrivacyPreference.setTitle(R.string.adaptive_sleep_privacy); mPrivacyPreference.setSelectable(false); mPrivacyPreference.setLayoutResource(R.layout.preference_footer); - - mDisableOptionsPreference = new FooterPreference(context); - mDisableOptionsPreference.setLayoutResource(R.layout.preference_footer); - mDisableOptionsPreference.setTitle(R.string.admin_disabled_other_options); - mDisableOptionsPreference.setIcon(R.drawable.ic_info_outline_24dp); - - // The 'disabled by admin' preference should always be at the end of the setting page. - mDisableOptionsPreference.setOrder(DEFAULT_ORDER_OF_LOWEST_PREFERENCE); - mPrivacyPreference.setOrder(DEFAULT_ORDER_OF_LOWEST_PREFERENCE - 1); } @Override @@ -138,14 +134,6 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements final PreferenceScreen screen = getPreferenceScreen(); screen.removeAll(); - if (mAdmin != null) { - mDisableOptionsPreference.setOnPreferenceClickListener(p -> { - RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(), mAdmin); - return true; - }); - screen.addPreference(mDisableOptionsPreference); - } - final List candidateList = getCandidates(); if (candidateList == null) { return; @@ -165,14 +153,43 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements } if (mAdmin != null) { - mDisableOptionsPreference.setOnPreferenceClickListener(p -> { - RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(), mAdmin); - return true; - }); + setupDisabledFooterPreference(); screen.addPreference(mDisableOptionsPreference); } } + @VisibleForTesting + void setupDisabledFooterPreference() { + final String textDisabledByAdmin = getResources().getString( + R.string.admin_disabled_other_options); + final String textMoreDetails = getResources().getString(R.string.admin_more_details); + + final SpannableString spannableString = new SpannableString( + textDisabledByAdmin + System.lineSeparator() + textMoreDetails); + final ClickableSpan clickableSpan = new ClickableSpan() { + @Override + public void onClick(@NonNull View widget) { + RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(), mAdmin); + } + }; + + if (textDisabledByAdmin != null && textMoreDetails != null) { + spannableString.setSpan(clickableSpan, textDisabledByAdmin.length() + 1, + textDisabledByAdmin.length() + textMoreDetails.length() + 1, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + + mDisableOptionsPreference = new FooterPreference(getContext()); + mDisableOptionsPreference.setLayoutResource(R.layout.preference_footer); + mDisableOptionsPreference.setTitle(spannableString); + mDisableOptionsPreference.setSelectable(false); + mDisableOptionsPreference.setIcon(R.drawable.ic_info_outline_24dp); + + // The 'disabled by admin' preference should always be at the end of the setting page. + mDisableOptionsPreference.setOrder(DEFAULT_ORDER_OF_LOWEST_PREFERENCE); + mPrivacyPreference.setOrder(DEFAULT_ORDER_OF_LOWEST_PREFERENCE - 1); + } + @Override protected String getDefaultKey() { return getCurrentSystemScreenTimeout(getContext()); diff --git a/src/com/android/settings/network/ims/VolteQueryImsState.java b/src/com/android/settings/network/ims/VolteQueryImsState.java index 167b4b13a3e..b09a1304136 100644 --- a/src/com/android/settings/network/ims/VolteQueryImsState.java +++ b/src/com/android/settings/network/ims/VolteQueryImsState.java @@ -16,11 +16,14 @@ package com.android.settings.network.ims; +import static android.telephony.ims.ProvisioningManager.KEY_VOIMS_OPT_IN_STATUS; + import android.content.Context; import android.telecom.TelecomManager; import android.telephony.AccessNetworkConstants; import android.telephony.SubscriptionManager; import android.telephony.ims.ImsException; +import android.telephony.ims.ProvisioningManager; import android.telephony.ims.feature.MmTelFeature; import android.telephony.ims.stub.ImsRegistrationImplBase; import android.util.Log; @@ -133,4 +136,15 @@ public class VolteQueryImsState extends ImsQueryController { } return isEnabledByUser(mSubId); } + + /** + * Get VoIMS opt-in configuration. + * + * @return true when VoIMS opt-in has been enabled, otherwise false + */ + public boolean isVoImsOptInEnabled() { + int voImsOptInStatus = ProvisioningManager.createForSubscriptionId(mSubId) + .getProvisioningIntValue(KEY_VOIMS_OPT_IN_STATUS); + return voImsOptInStatus == ProvisioningManager.PROVISIONING_VALUE_ENABLED; + } } diff --git a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java index fbbdabc701d..c2b1fc4f453 100644 --- a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java +++ b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java @@ -107,12 +107,18 @@ public class Enhanced4gBasePreferenceController extends TelephonyTogglePreferenc if (!isModeMatched()) { return CONDITIONALLY_UNAVAILABLE; } + final VolteQueryImsState queryState = queryImsState(subId); + // Show VoLTE settings if VoIMS opt-in has been enabled irrespective of other VoLTE settings + if (queryState.isVoImsOptInEnabled()) { + return AVAILABLE; + } + final PersistableBundle carrierConfig = getCarrierConfigForSubId(subId); if ((carrierConfig == null) || carrierConfig.getBoolean(CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL)) { return CONDITIONALLY_UNAVAILABLE; } - final VolteQueryImsState queryState = queryImsState(subId); + if (!queryState.isReadyToVoLte()) { return CONDITIONALLY_UNAVAILABLE; } diff --git a/src/com/android/settings/widget/SettingsMainSwitchPreference.java b/src/com/android/settings/widget/SettingsMainSwitchPreference.java index 76f9b41d807..80a0021e44e 100644 --- a/src/com/android/settings/widget/SettingsMainSwitchPreference.java +++ b/src/com/android/settings/widget/SettingsMainSwitchPreference.java @@ -176,6 +176,7 @@ public class SettingsMainSwitchPreference extends TwoStatePreference { * Update the status of switch but doesn't notify the mOnBeforeListener. */ public void setCheckedInternal(boolean checked) { + super.setChecked(checked); if (mMainSwitchBar != null) { mMainSwitchBar.setCheckedInternal(checked); } diff --git a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java index efc45e02fe8..f0bf95c38fd 100644 --- a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java +++ b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java @@ -23,6 +23,7 @@ import static androidx.test.core.app.ApplicationProvider.getApplicationContext; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -138,6 +139,7 @@ public class ScreenTimeoutSettingsTest { public void updateCandidates_enforcedAdmin_showDisabledByAdminPreference() { mSettings.mAdmin = new RestrictedLockUtils.EnforcedAdmin(); mSettings.mDisableOptionsPreference = mDisableOptionsPreference; + doNothing().when(mSettings).setupDisabledFooterPreference(); mSettings.updateCandidates();