diff --git a/src/com/android/settings/SettingsApplication.java b/src/com/android/settings/SettingsApplication.java index c0d2445821f..169e0462545 100644 --- a/src/com/android/settings/SettingsApplication.java +++ b/src/com/android/settings/SettingsApplication.java @@ -28,6 +28,7 @@ import androidx.annotation.NonNull; import com.android.settings.activityembedding.ActivityEmbeddingRulesController; import com.android.settings.activityembedding.ActivityEmbeddingUtils; import com.android.settings.core.instrumentation.ElapsedTimeUtils; +import com.android.settings.development.DeveloperOptionsActivityLifecycle; import com.android.settings.fuelgauge.BatterySettingsStorage; import com.android.settings.homepage.SettingsHomepageActivity; import com.android.settings.localepicker.LocaleNotificationDataManager; @@ -79,6 +80,8 @@ public class SettingsApplication extends Application { new DeviceProvisionedObserver().registerContentObserver(); } } + + registerActivityLifecycleCallbacks(new DeveloperOptionsActivityLifecycle()); } @Override diff --git a/src/com/android/settings/applications/ProcessStatsSummary.java b/src/com/android/settings/applications/ProcessStatsSummary.java index ef76cd5840b..cdec9267a28 100644 --- a/src/com/android/settings/applications/ProcessStatsSummary.java +++ b/src/com/android/settings/applications/ProcessStatsSummary.java @@ -35,13 +35,15 @@ import com.android.settings.SummaryPreference; import com.android.settings.Utils; import com.android.settings.applications.ProcStatsData.MemInfo; import com.android.settings.core.SubSettingLauncher; +import com.android.settings.development.DeveloperOptionAwareMixin; import com.android.settings.development.DisableDevSettingsDialogFragment; import java.util.HashMap; import java.util.Locale; import java.util.Map; -public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenceClickListener { +public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenceClickListener, + DeveloperOptionAwareMixin { private static final String KEY_PREF_SCREEN = "app_list"; private static final String KEY_MEMORY_INFO_PREF_GROUP = "memory_info"; diff --git a/src/com/android/settings/applications/RunningServices.java b/src/com/android/settings/applications/RunningServices.java index c75fe0698bc..4d1c166f904 100644 --- a/src/com/android/settings/applications/RunningServices.java +++ b/src/com/android/settings/applications/RunningServices.java @@ -26,9 +26,11 @@ import android.view.ViewGroup; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.development.DeveloperOptionAwareMixin; import com.android.settings.widget.LoadingViewController; -public class RunningServices extends SettingsPreferenceFragment { +public class RunningServices extends SettingsPreferenceFragment implements + DeveloperOptionAwareMixin { private static final int SHOW_RUNNING_SERVICES = 1; private static final int SHOW_BACKGROUND_PROCESSES = 2; diff --git a/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java b/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java index 276e7aaa728..88cb819bd8d 100644 --- a/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java +++ b/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java @@ -38,6 +38,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.applications.defaultapps.DefaultAppPickerFragment; +import com.android.settings.development.DeveloperOptionAwareMixin; import com.android.settingslib.applications.DefaultAppInfo; import com.android.settingslib.development.DevelopmentSettingsEnabler; import com.android.settingslib.widget.CandidateInfo; @@ -50,7 +51,8 @@ import java.util.List; /** * Picker for BugReportHandler. */ -public class BugReportHandlerPicker extends DefaultAppPickerFragment { +public class BugReportHandlerPicker extends DefaultAppPickerFragment implements + DeveloperOptionAwareMixin { private static final String TAG = "BugReportHandlerPicker"; private BugReportHandlerUtil mBugReportHandlerUtil; diff --git a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java index b5a9e5a9317..5f3e4cddafe 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java +++ b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java @@ -33,6 +33,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.Utils; +import com.android.settings.development.DeveloperOptionAwareMixin; import com.android.settings.widget.RadioButtonPickerFragment; import com.android.settingslib.widget.CandidateInfo; import com.android.settingslib.widget.FooterPreference; @@ -45,7 +46,8 @@ import java.util.List; /** * Provides options for selecting the default USB mode. */ -public class UsbDefaultFragment extends RadioButtonPickerFragment { +public class UsbDefaultFragment extends RadioButtonPickerFragment implements + DeveloperOptionAwareMixin { private static final String TAG = "UsbDefaultFragment"; diff --git a/src/com/android/settings/development/AdbDeviceDetailsFragment.java b/src/com/android/settings/development/AdbDeviceDetailsFragment.java index 98613452692..f5c71b620be 100644 --- a/src/com/android/settings/development/AdbDeviceDetailsFragment.java +++ b/src/com/android/settings/development/AdbDeviceDetailsFragment.java @@ -32,7 +32,8 @@ import java.util.List; * Fragment shown when clicking on a paired device in the Wireless * Debugging fragment. */ -public class AdbDeviceDetailsFragment extends DashboardFragment { +public class AdbDeviceDetailsFragment extends DashboardFragment implements + DeveloperOptionAwareMixin { private static final String TAG = "AdbDeviceDetailsFrag"; private PairDevice mPairedDevice; diff --git a/src/com/android/settings/development/DeveloperOptionAwareMixin.java b/src/com/android/settings/development/DeveloperOptionAwareMixin.java new file mode 100644 index 00000000000..f5a05afe81e --- /dev/null +++ b/src/com/android/settings/development/DeveloperOptionAwareMixin.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2024 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.development; + +/** A fragment mixin that should aware the state of developer options */ +public interface DeveloperOptionAwareMixin {} diff --git a/src/com/android/settings/development/DeveloperOptionsActivityLifecycle.java b/src/com/android/settings/development/DeveloperOptionsActivityLifecycle.java new file mode 100644 index 00000000000..de5c52b90a7 --- /dev/null +++ b/src/com/android/settings/development/DeveloperOptionsActivityLifecycle.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2024 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.development; + +import android.app.Activity; +import android.app.Application; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; + +import com.android.settings.SettingsActivity; +import com.android.settingslib.development.DevelopmentSettingsEnabler; + +public class DeveloperOptionsActivityLifecycle implements Application.ActivityLifecycleCallbacks { + + private FragmentManager.FragmentLifecycleCallbacks mFragmentCallback = + new FragmentManager.FragmentLifecycleCallbacks() { + @Override + public void onFragmentResumed(@NonNull FragmentManager fm, @NonNull Fragment f) { + if (!(f instanceof DeveloperOptionAwareMixin)) { + return; + } + + Activity activity = f.getActivity(); + if (activity == null) { + return; + } + + if (DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(activity)) { + return; + } + + if (fm.getBackStackEntryCount() > 0) { + fm.popBackStack(); + } else { + activity.finish(); + } + } + }; + + public DeveloperOptionsActivityLifecycle() {} + + @Override + public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { + if (!(activity instanceof SettingsActivity)) { + return; + } + + FragmentManager fm = ((SettingsActivity) activity).getSupportFragmentManager(); + fm.registerFragmentLifecycleCallbacks(mFragmentCallback, /* recursive= */ true); + } + + @Override + public void onActivityStarted(@NonNull Activity activity) {} + + @Override + public void onActivityResumed(@NonNull Activity activity) {} + + @Override + public void onActivityPaused(@NonNull Activity activity) {} + + @Override + public void onActivityStopped(@NonNull Activity activity) {} + + @Override + public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {} + + @Override + public void onActivityDestroyed(@NonNull Activity activity) {} +} diff --git a/src/com/android/settings/development/DevelopmentAppPicker.java b/src/com/android/settings/development/DevelopmentAppPicker.java index 7ef0869be72..5ac8d2f65f9 100644 --- a/src/com/android/settings/development/DevelopmentAppPicker.java +++ b/src/com/android/settings/development/DevelopmentAppPicker.java @@ -39,7 +39,8 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; -public class DevelopmentAppPicker extends DefaultAppPickerFragment { +public class DevelopmentAppPicker extends DefaultAppPickerFragment implements + DeveloperOptionAwareMixin { public static final String EXTRA_REQUESTING_PERMISSION = "REQUESTING_PERMISSION"; public static final String EXTRA_DEBUGGABLE = "DEBUGGABLE"; public static final String EXTRA_SELECTING_APP = "SELECTING_APP"; diff --git a/src/com/android/settings/development/DevelopmentMemtagPage.java b/src/com/android/settings/development/DevelopmentMemtagPage.java index df983f3d4ed..230e5db95e6 100644 --- a/src/com/android/settings/development/DevelopmentMemtagPage.java +++ b/src/com/android/settings/development/DevelopmentMemtagPage.java @@ -25,7 +25,7 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.search.SearchIndexable; @SearchIndexable -public class DevelopmentMemtagPage extends DashboardFragment { +public class DevelopmentMemtagPage extends DashboardFragment implements DeveloperOptionAwareMixin { private static final String TAG = "DevelopmentMemtagPage"; @Override diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java index 43aa783b7e1..d3bf8d83be1 100644 --- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java +++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java @@ -218,6 +218,14 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra super.onStart(); final ContentResolver cr = getContext().getContentResolver(); cr.registerContentObserver(mDevelopEnabled, false, mDeveloperSettingsObserver); + + // Restore UI state based on whether developer options is enabled + if (DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(getContext())) { + enableDeveloperOptions(); + handleQsTileLongPressActionIfAny(); + } else { + disableDeveloperOptions(); + } } @Override @@ -274,14 +282,6 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra mSwitchBarController = new DevelopmentSwitchBarController( this /* DevelopmentSettings */, mSwitchBar, mIsAvailable, getSettingsLifecycle()); - - // Restore UI state based on whether developer options is enabled - if (DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(getContext())) { - enableDeveloperOptions(); - handleQsTileLongPressActionIfAny(); - } else { - disableDeveloperOptions(); - } } @Override diff --git a/src/com/android/settings/development/WirelessDebuggingFragment.java b/src/com/android/settings/development/WirelessDebuggingFragment.java index 8be8d913a98..fede1f117e3 100644 --- a/src/com/android/settings/development/WirelessDebuggingFragment.java +++ b/src/com/android/settings/development/WirelessDebuggingFragment.java @@ -61,7 +61,7 @@ import java.util.Map; */ @SearchIndexable public class WirelessDebuggingFragment extends DashboardFragment - implements WirelessDebuggingEnabler.OnEnabledListener { + implements WirelessDebuggingEnabler.OnEnabledListener, DeveloperOptionAwareMixin { private static final String TAG = "WirelessDebuggingFrag"; diff --git a/src/com/android/settings/development/featureflags/FeatureFlagsDashboard.java b/src/com/android/settings/development/featureflags/FeatureFlagsDashboard.java index 0483dce7dca..def449bd353 100644 --- a/src/com/android/settings/development/featureflags/FeatureFlagsDashboard.java +++ b/src/com/android/settings/development/featureflags/FeatureFlagsDashboard.java @@ -22,8 +22,8 @@ import android.provider.SearchIndexableResource; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.development.DeveloperOptionAwareMixin; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settingslib.search.Indexable; import com.android.settingslib.development.DevelopmentSettingsEnabler; import com.android.settingslib.search.SearchIndexable; @@ -31,7 +31,8 @@ import java.util.ArrayList; import java.util.List; @SearchIndexable -public class FeatureFlagsDashboard extends DashboardFragment { +public class FeatureFlagsDashboard extends DashboardFragment implements + DeveloperOptionAwareMixin { private static final String TAG = "FeatureFlagsDashboard"; @@ -50,11 +51,6 @@ public class FeatureFlagsDashboard extends DashboardFragment { return R.xml.feature_flags_settings; } - @Override - public void onAttach(Context context) { - super.onAttach(context); - } - @Override public int getHelpResource() { return 0; diff --git a/src/com/android/settings/development/graphicsdriver/GraphicsDriverDashboard.java b/src/com/android/settings/development/graphicsdriver/GraphicsDriverDashboard.java index 87678f96164..364a3b03815 100644 --- a/src/com/android/settings/development/graphicsdriver/GraphicsDriverDashboard.java +++ b/src/com/android/settings/development/graphicsdriver/GraphicsDriverDashboard.java @@ -23,6 +23,7 @@ import android.os.Bundle; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.development.DeveloperOptionAwareMixin; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.MainSwitchBarController; import com.android.settings.widget.SettingsMainSwitchBar; @@ -33,7 +34,8 @@ import com.android.settingslib.search.SearchIndexable; * Dashboard for Graphics Driver preferences. */ @SearchIndexable -public class GraphicsDriverDashboard extends DashboardFragment { +public class GraphicsDriverDashboard extends DashboardFragment implements + DeveloperOptionAwareMixin { private static final String TAG = "GraphicsDriverDashboard"; diff --git a/src/com/android/settings/development/qstile/DevelopmentTileConfigFragment.java b/src/com/android/settings/development/qstile/DevelopmentTileConfigFragment.java index 0ca189d9acd..076930a00ee 100644 --- a/src/com/android/settings/development/qstile/DevelopmentTileConfigFragment.java +++ b/src/com/android/settings/development/qstile/DevelopmentTileConfigFragment.java @@ -25,6 +25,7 @@ import android.os.SystemProperties; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.development.DeveloperOptionAwareMixin; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.development.DevelopmentSettingsEnabler; import com.android.settingslib.search.SearchIndexable; @@ -35,7 +36,8 @@ import java.util.List; import java.util.Map; @SearchIndexable -public class DevelopmentTileConfigFragment extends DashboardFragment { +public class DevelopmentTileConfigFragment extends DashboardFragment implements + DeveloperOptionAwareMixin { private static final String TAG = "DevelopmentTileConfig"; private static final String QS_TILE_PERF = "develop_qs_tile"; diff --git a/src/com/android/settings/development/snooplogger/SnoopLoggerFiltersDashboard.java b/src/com/android/settings/development/snooplogger/SnoopLoggerFiltersDashboard.java index 6f1ede2582b..50e00dc3c4e 100644 --- a/src/com/android/settings/development/snooplogger/SnoopLoggerFiltersDashboard.java +++ b/src/com/android/settings/development/snooplogger/SnoopLoggerFiltersDashboard.java @@ -22,6 +22,7 @@ import android.provider.SearchIndexableResource; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.development.DeveloperOptionAwareMixin; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.development.DevelopmentSettingsEnabler; import com.android.settingslib.search.SearchIndexable; @@ -32,7 +33,8 @@ import java.util.List; * Bluetooth Snoop Logger Filters Dashboard */ @SearchIndexable -public class SnoopLoggerFiltersDashboard extends DashboardFragment { +public class SnoopLoggerFiltersDashboard extends DashboardFragment implements + DeveloperOptionAwareMixin { private static final String TAG = "SnoopLoggerFiltersDashboard"; diff --git a/src/com/android/settings/development/transcode/TranscodeSettingsFragment.java b/src/com/android/settings/development/transcode/TranscodeSettingsFragment.java index e3dc9bfc8eb..8abe4246e00 100644 --- a/src/com/android/settings/development/transcode/TranscodeSettingsFragment.java +++ b/src/com/android/settings/development/transcode/TranscodeSettingsFragment.java @@ -21,6 +21,7 @@ import android.content.Context; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.development.DeveloperOptionAwareMixin; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.development.DevelopmentSettingsEnabler; import com.android.settingslib.search.SearchIndexable; @@ -29,7 +30,8 @@ import com.android.settingslib.search.SearchIndexable; * Fragment for native transcode settings in Developer options. */ @SearchIndexable -public class TranscodeSettingsFragment extends DashboardFragment { +public class TranscodeSettingsFragment extends DashboardFragment implements + DeveloperOptionAwareMixin { private static final String TAG = "TranscodeSettings"; @Override diff --git a/src/com/android/settings/development/widevine/WidevineSettingsFragment.java b/src/com/android/settings/development/widevine/WidevineSettingsFragment.java index 058aa40e44b..9eab9f50cca 100644 --- a/src/com/android/settings/development/widevine/WidevineSettingsFragment.java +++ b/src/com/android/settings/development/widevine/WidevineSettingsFragment.java @@ -21,6 +21,7 @@ import android.content.Context; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.development.DeveloperOptionAwareMixin; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.development.DevelopmentSettingsEnabler; import com.android.settingslib.search.SearchIndexable; @@ -29,7 +30,8 @@ import com.android.settingslib.search.SearchIndexable; * Fragment for native widevine settings in Developer options. */ @SearchIndexable -public class WidevineSettingsFragment extends DashboardFragment { +public class WidevineSettingsFragment extends DashboardFragment implements + DeveloperOptionAwareMixin { private static final String TAG = "WidevineSettings"; @Override diff --git a/src/com/android/settings/fuelgauge/InactiveApps.java b/src/com/android/settings/fuelgauge/InactiveApps.java index 465a9d847e6..44f41cd055b 100644 --- a/src/com/android/settings/fuelgauge/InactiveApps.java +++ b/src/com/android/settings/fuelgauge/InactiveApps.java @@ -40,12 +40,13 @@ import androidx.preference.PreferenceGroup; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.development.DeveloperOptionAwareMixin; import java.util.Arrays; import java.util.List; public class InactiveApps extends SettingsPreferenceFragment - implements Preference.OnPreferenceChangeListener { + implements Preference.OnPreferenceChangeListener, DeveloperOptionAwareMixin { private static final CharSequence[] FULL_SETTABLE_BUCKETS_NAMES = { "ACTIVE", "WORKING_SET", "FREQUENT", "RARE", "RESTRICTED" diff --git a/src/com/android/settings/webview/WebViewAppPicker.java b/src/com/android/settings/webview/WebViewAppPicker.java index b1dfd1454f9..0060fa0c7b7 100644 --- a/src/com/android/settings/webview/WebViewAppPicker.java +++ b/src/com/android/settings/webview/WebViewAppPicker.java @@ -33,12 +33,14 @@ import androidx.annotation.VisibleForTesting; import com.android.settings.R; import com.android.settings.applications.defaultapps.DefaultAppPickerFragment; +import com.android.settings.development.DeveloperOptionAwareMixin; import com.android.settingslib.applications.DefaultAppInfo; import java.util.ArrayList; import java.util.List; -public class WebViewAppPicker extends DefaultAppPickerFragment { +public class WebViewAppPicker extends DefaultAppPickerFragment implements + DeveloperOptionAwareMixin { private WebViewUpdateServiceWrapper mWebViewUpdateServiceWrapper; private WebViewUpdateServiceWrapper getWebViewUpdateServiceWrapper() {