diff --git a/res/xml/network_provider_internet.xml b/res/xml/network_provider_internet.xml index 1d1bf16dbb0..7a333672317 100644 --- a/res/xml/network_provider_internet.xml +++ b/res/xml/network_provider_internet.xml @@ -81,6 +81,7 @@ android:title="@string/data_saver_title" android:icon="@drawable/ic_settings_data_usage" android:order="10" + android:persistent="false" settings:isPreferenceVisible="@bool/config_show_data_saver" android:fragment="com.android.settings.datausage.DataSaverSummary"/> diff --git a/src/com/android/settings/datausage/DataSaverPreference.java b/src/com/android/settings/datausage/DataSaverPreference.java index 305d061be88..0c3c1aac890 100644 --- a/src/com/android/settings/datausage/DataSaverPreference.java +++ b/src/com/android/settings/datausage/DataSaverPreference.java @@ -17,29 +17,39 @@ package com.android.settings.datausage; import android.content.Context; import android.util.AttributeSet; +import androidx.annotation.Nullable; import androidx.preference.Preference; import com.android.settings.R; +import com.android.settings.flags.Flags; public class DataSaverPreference extends Preference implements DataSaverBackend.Listener { - private final DataSaverBackend mDataSaverBackend; + private final @Nullable DataSaverBackend mDataSaverBackend; public DataSaverPreference(Context context, AttributeSet attrs) { super(context, attrs); - mDataSaverBackend = new DataSaverBackend(context); + mDataSaverBackend = isCatalystEnabled() ? null : new DataSaverBackend(context); + } + + private boolean isCatalystEnabled() { + return Flags.catalyst() && Flags.catalystRestrictBackgroundParentEntry(); } @Override public void onAttached() { super.onAttached(); - mDataSaverBackend.addListener(this); + if (mDataSaverBackend != null) { + mDataSaverBackend.addListener(this); + } } @Override public void onDetached() { super.onDetached(); - mDataSaverBackend.remListener(this); + if (mDataSaverBackend != null) { + mDataSaverBackend.remListener(this); + } } @Override diff --git a/src/com/android/settings/datausage/DataSaverScreen.kt b/src/com/android/settings/datausage/DataSaverScreen.kt index 9a9b79018a1..a0b579c3294 100644 --- a/src/com/android/settings/datausage/DataSaverScreen.kt +++ b/src/com/android/settings/datausage/DataSaverScreen.kt @@ -17,14 +17,27 @@ package com.android.settings.datausage import android.content.Context +import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID import com.android.settings.R import com.android.settings.flags.Flags +import com.android.settingslib.metadata.PreferenceAvailabilityProvider +import com.android.settingslib.metadata.PreferenceLifecycleContext +import com.android.settingslib.metadata.PreferenceLifecycleProvider +import com.android.settingslib.metadata.PreferenceSummaryProvider import com.android.settingslib.metadata.ProvidePreferenceScreen import com.android.settingslib.metadata.preferenceHierarchy import com.android.settingslib.preference.PreferenceScreenCreator @ProvidePreferenceScreen -class DataSaverScreen : PreferenceScreenCreator { +class DataSaverScreen : + PreferenceScreenCreator, + PreferenceAvailabilityProvider, + PreferenceSummaryProvider, + PreferenceLifecycleProvider { + + private var dataSaverBackend: DataSaverBackend? = null + private var dataSaverBackendListener: DataSaverBackend.Listener? = null + override val key get() = KEY @@ -34,6 +47,20 @@ class DataSaverScreen : PreferenceScreenCreator { override val icon: Int get() = R.drawable.ic_settings_data_usage + override fun isIndexable(context: Context) = + DataUsageUtils.hasMobileData(context) && + DataUsageUtils.getDefaultSubscriptionId(context) != INVALID_SUBSCRIPTION_ID + + override fun getSummary(context: Context): CharSequence? = + when { + DataSaverBackend(context).isDataSaverEnabled -> + context.getString(R.string.data_saver_on) + else -> context.getString(R.string.data_saver_off) + } + + override fun isAvailable(context: Context) = + context.resources.getBoolean(R.bool.config_show_data_saver) + override fun isFlagEnabled(context: Context) = Flags.catalystRestrictBackgroundParentEntry() override fun fragmentClass() = DataSaverSummary::class.java @@ -43,6 +70,18 @@ class DataSaverScreen : PreferenceScreenCreator { override fun hasCompleteHierarchy() = false + override fun onStart(context: PreferenceLifecycleContext) { + val listener = DataSaverBackend.Listener { context.notifyPreferenceChange(this) } + dataSaverBackendListener = listener + dataSaverBackend = DataSaverBackend(context).apply { addListener(listener) } + } + + override fun onStop(context: PreferenceLifecycleContext) { + dataSaverBackend?.remListener(dataSaverBackendListener) + dataSaverBackend = null + dataSaverBackendListener = null + } + companion object { const val KEY = "restrict_background_parent_entry" } diff --git a/src/com/android/settings/network/NetworkDashboardScreen.kt b/src/com/android/settings/network/NetworkDashboardScreen.kt index ad4ca41f251..3fb2cbefdbe 100644 --- a/src/com/android/settings/network/NetworkDashboardScreen.kt +++ b/src/com/android/settings/network/NetworkDashboardScreen.kt @@ -17,6 +17,7 @@ package com.android.settings.network import android.content.Context import com.android.settings.R +import com.android.settings.datausage.DataSaverScreen import com.android.settings.flags.Flags import com.android.settingslib.metadata.PreferenceIconProvider import com.android.settingslib.metadata.ProvidePreferenceScreen @@ -43,7 +44,10 @@ class NetworkDashboardScreen : PreferenceScreenCreator, PreferenceIconProvider { override fun fragmentClass() = NetworkDashboardFragment::class.java - override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(this) {} + override fun getPreferenceHierarchy(context: Context) = + preferenceHierarchy(this) { + +DataSaverScreen.KEY order 10 + } companion object { const val KEY = "network_provider_and_internet_screen"