From 2d0b3447360666847c483e6ce2521846c66c25c1 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Mon, 5 Dec 2016 17:02:33 -0800 Subject: [PATCH] Add InstrumentFragment for non-PreferenceFragment types. This allows app fragment use a less heavyweight fragment as super class if they don't need PreferenceFragment. Using this class as base is generally easier to set up robolectric tests too. Bug: 33354536 Test: RunSettingsRoboTests Change-Id: I91c4d242ea0333c76c8767c03c3f18dee6b6e104 --- .../android/settings/ChooseLockPassword.java | 4 +- .../android/settings/ChooseLockPattern.java | 4 +- .../android/settings/CryptKeeperConfirm.java | 4 +- .../android/settings/CryptKeeperSettings.java | 4 +- .../android/settings/OptionsMenuFragment.java | 4 +- src/com/android/settings/ProxySelector.java | 4 +- .../settings/SettingsPreferenceFragment.java | 4 +- .../settings/applications/AppOpsDetails.java | 4 +- .../settings/applications/AppOpsSummary.java | 4 +- .../applications/BackgroundCheckSummary.java | 4 +- .../applications/ManageApplications.java | 4 +- .../applications/ProcessStatsMemDetail.java | 4 +- .../applications/RunningServiceDetails.java | 4 +- .../settings/core/InstrumentedFragment.java | 30 +------ .../core/InstrumentedPreferenceFragment.java | 65 ++++++++++++++ .../core/lifecycle/ObservableFragment.java | 87 +++++++++++++++++++ .../settings/dashboard/DashboardSummary.java | 4 +- .../dashboard/SearchResultsSummary.java | 4 +- .../deviceinfo/PrivateVolumeFormat.java | 4 +- .../fingerprint/FingerprintEnrollSidecar.java | 4 +- .../UserDictionaryAddWordFragment.java | 4 +- src/com/android/settings/nfc/AndroidBeam.java | 4 +- ...randfather_not_implementing_instrumentable | 1 + .../core/lifecycle/LifecycleTest.java | 31 ++++++- 24 files changed, 224 insertions(+), 66 deletions(-) create mode 100644 src/com/android/settings/core/InstrumentedPreferenceFragment.java create mode 100644 src/com/android/settings/core/lifecycle/ObservableFragment.java diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java index 3c66b7ec397..351c2a204eb 100644 --- a/src/com/android/settings/ChooseLockPassword.java +++ b/src/com/android/settings/ChooseLockPassword.java @@ -51,7 +51,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternUtils.RequestThrottledException; import com.android.internal.widget.TextViewInputDisabler; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.notification.RedactionInterstitial; import com.android.settings.password.PasswordRequirementAdapter; import com.android.setupwizardlib.GlifLayout; @@ -157,7 +157,7 @@ public class ChooseLockPassword extends SettingsActivity { layout.setFitsSystemWindows(false); } - public static class ChooseLockPasswordFragment extends InstrumentedFragment + public static class ChooseLockPasswordFragment extends InstrumentedPreferenceFragment implements OnClickListener, OnEditorActionListener, TextWatcher, SaveAndFinishWorker.Listener { private static final String KEY_FIRST_PIN = "first_pin"; diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java index d92e6aa9bc8..4afeae02408 100644 --- a/src/com/android/settings/ChooseLockPattern.java +++ b/src/com/android/settings/ChooseLockPattern.java @@ -37,7 +37,7 @@ import com.android.internal.widget.LockPatternUtils.RequestThrottledException; import com.android.internal.widget.LockPatternView; import com.android.internal.widget.LockPatternView.Cell; import com.android.internal.widget.LockPatternView.DisplayMode; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.notification.RedactionInterstitial; import com.android.setupwizardlib.GlifLayout; import com.google.android.collect.Lists; @@ -127,7 +127,7 @@ public class ChooseLockPattern extends SettingsActivity { return super.onKeyDown(keyCode, event); } - public static class ChooseLockPatternFragment extends InstrumentedFragment + public static class ChooseLockPatternFragment extends InstrumentedPreferenceFragment implements View.OnClickListener, SaveAndFinishWorker.Listener { public static final int CONFIRM_EXISTING_REQUEST = 55; diff --git a/src/com/android/settings/CryptKeeperConfirm.java b/src/com/android/settings/CryptKeeperConfirm.java index e12ebe07ac8..d61fd983f3c 100644 --- a/src/com/android/settings/CryptKeeperConfirm.java +++ b/src/com/android/settings/CryptKeeperConfirm.java @@ -35,11 +35,11 @@ import android.widget.Button; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.widget.LockPatternUtils; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; import java.util.Locale; -public class CryptKeeperConfirm extends InstrumentedFragment { +public class CryptKeeperConfirm extends InstrumentedPreferenceFragment { private static final String TAG = "CryptKeeperConfirm"; diff --git a/src/com/android/settings/CryptKeeperSettings.java b/src/com/android/settings/CryptKeeperSettings.java index cdeb55f7c88..d9b98f0f5aa 100644 --- a/src/com/android/settings/CryptKeeperSettings.java +++ b/src/com/android/settings/CryptKeeperSettings.java @@ -36,9 +36,9 @@ import android.view.ViewGroup; import android.widget.Button; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; -public class CryptKeeperSettings extends InstrumentedFragment { +public class CryptKeeperSettings extends InstrumentedPreferenceFragment { private static final String TAG = "CryptKeeper"; private static final String TYPE = "type"; private static final String PASSWORD = "password"; diff --git a/src/com/android/settings/OptionsMenuFragment.java b/src/com/android/settings/OptionsMenuFragment.java index d1e3db2cb99..c8dcc8eb9bd 100644 --- a/src/com/android/settings/OptionsMenuFragment.java +++ b/src/com/android/settings/OptionsMenuFragment.java @@ -17,7 +17,7 @@ package com.android.settings; import android.os.Bundle; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; /** * Base class for a fragment that has the options menu. @@ -25,7 +25,7 @@ import com.android.settings.core.InstrumentedFragment; * preferences, and we need to call setHasOptionsMenu(true) for the back button on action bar. * For preference fragments, use SettingsPreferenceFragment. */ -public abstract class OptionsMenuFragment extends InstrumentedFragment { +public abstract class OptionsMenuFragment extends InstrumentedPreferenceFragment { @Override public void onActivityCreated(Bundle savedInstanceState) { diff --git a/src/com/android/settings/ProxySelector.java b/src/com/android/settings/ProxySelector.java index b272637e8c4..a72525c2640 100644 --- a/src/com/android/settings/ProxySelector.java +++ b/src/com/android/settings/ProxySelector.java @@ -41,9 +41,9 @@ import android.widget.TextView; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; -public class ProxySelector extends InstrumentedFragment implements DialogCreatable { +public class ProxySelector extends InstrumentedPreferenceFragment implements DialogCreatable { private static final String TAG = "ProxySelector"; EditText mHostnameField; diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java index 8118dab7fe2..5f425797756 100644 --- a/src/com/android/settings/SettingsPreferenceFragment.java +++ b/src/com/android/settings/SettingsPreferenceFragment.java @@ -45,7 +45,7 @@ import android.view.ViewGroup; import android.widget.Button; import com.android.settings.applications.LayoutPreference; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.core.instrumentation.Instrumentable; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settingslib.HelpUtils; @@ -55,7 +55,7 @@ import java.util.UUID; /** * Base class for Settings fragments, with some helper functions and dialog management. */ -public abstract class SettingsPreferenceFragment extends InstrumentedFragment +public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceFragment implements DialogCreatable { /** diff --git a/src/com/android/settings/applications/AppOpsDetails.java b/src/com/android/settings/applications/AppOpsDetails.java index ba60302bf79..e6c040b4ab4 100644 --- a/src/com/android/settings/applications/AppOpsDetails.java +++ b/src/com/android/settings/applications/AppOpsDetails.java @@ -39,14 +39,14 @@ import android.widget.Switch; import android.widget.TextView; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.Utils; import java.util.List; -public class AppOpsDetails extends InstrumentedFragment { +public class AppOpsDetails extends InstrumentedPreferenceFragment { static final String TAG = "AppOpsDetails"; public static final String ARG_PACKAGE_NAME = "package"; diff --git a/src/com/android/settings/applications/AppOpsSummary.java b/src/com/android/settings/applications/AppOpsSummary.java index ac0a856b219..ba2a3c911cb 100644 --- a/src/com/android/settings/applications/AppOpsSummary.java +++ b/src/com/android/settings/applications/AppOpsSummary.java @@ -29,10 +29,10 @@ import android.view.View; import android.view.ViewGroup; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.R; -public class AppOpsSummary extends InstrumentedFragment { +public class AppOpsSummary extends InstrumentedPreferenceFragment { // layout inflater object used to inflate views private LayoutInflater mInflater; diff --git a/src/com/android/settings/applications/BackgroundCheckSummary.java b/src/com/android/settings/applications/BackgroundCheckSummary.java index 1ff43c81e01..dd5c89c4a0b 100644 --- a/src/com/android/settings/applications/BackgroundCheckSummary.java +++ b/src/com/android/settings/applications/BackgroundCheckSummary.java @@ -24,10 +24,10 @@ import android.view.View; import android.view.ViewGroup; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.R; -public class BackgroundCheckSummary extends InstrumentedFragment { +public class BackgroundCheckSummary extends InstrumentedPreferenceFragment { // layout inflater object used to inflate views private LayoutInflater mInflater; diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java index 0ec9f1b37bc..37b4b9658ac 100644 --- a/src/com/android/settings/applications/ManageApplications.java +++ b/src/com/android/settings/applications/ManageApplications.java @@ -67,7 +67,7 @@ import com.android.settings.SettingsActivity; import com.android.settings.Utils; import com.android.settings.applications.AppStateAppOpsBridge.PermissionState; import com.android.settings.applications.AppStateUsageBridge.UsageState; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.dashboard.SummaryLoader; import com.android.settings.fuelgauge.HighPowerDetail; import com.android.settings.fuelgauge.PowerWhitelistBackend; @@ -95,7 +95,7 @@ import java.util.Locale; * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE * intent. */ -public class ManageApplications extends InstrumentedFragment +public class ManageApplications extends InstrumentedPreferenceFragment implements OnItemClickListener, OnItemSelectedListener { static final String TAG = "ManageApplications"; diff --git a/src/com/android/settings/applications/ProcessStatsMemDetail.java b/src/com/android/settings/applications/ProcessStatsMemDetail.java index 46a707bc384..b38aaf6246f 100644 --- a/src/com/android/settings/applications/ProcessStatsMemDetail.java +++ b/src/com/android/settings/applications/ProcessStatsMemDetail.java @@ -26,12 +26,12 @@ import android.widget.TextView; import com.android.internal.app.procstats.ProcessStats; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.R; import static com.android.settings.Utils.prepareCustomPreferencesList; -public class ProcessStatsMemDetail extends InstrumentedFragment { +public class ProcessStatsMemDetail extends InstrumentedPreferenceFragment { public static final String EXTRA_MEM_TIMES = "mem_times"; public static final String EXTRA_MEM_STATE_WEIGHTS = "mem_state_weights"; public static final String EXTRA_MEM_CACHED_WEIGHT = "mem_cached_weight"; diff --git a/src/com/android/settings/applications/RunningServiceDetails.java b/src/com/android/settings/applications/RunningServiceDetails.java index 28a80296d5f..9a173bca588 100644 --- a/src/com/android/settings/applications/RunningServiceDetails.java +++ b/src/com/android/settings/applications/RunningServiceDetails.java @@ -33,7 +33,7 @@ import android.widget.Button; import android.widget.TextView; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; @@ -45,7 +45,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; -public class RunningServiceDetails extends InstrumentedFragment +public class RunningServiceDetails extends InstrumentedPreferenceFragment implements RunningState.OnRefreshUiListener { static final String TAG = "RunningServicesDetails"; diff --git a/src/com/android/settings/core/InstrumentedFragment.java b/src/com/android/settings/core/InstrumentedFragment.java index 45e855eb1db..e55cc276e12 100644 --- a/src/com/android/settings/core/InstrumentedFragment.java +++ b/src/com/android/settings/core/InstrumentedFragment.java @@ -17,37 +17,17 @@ package com.android.settings.core; import android.content.Context; -import android.os.Bundle; import com.android.settings.core.instrumentation.Instrumentable; import com.android.settings.core.instrumentation.MetricsFeatureProvider; import com.android.settings.core.instrumentation.VisibilityLoggerMixin; -import com.android.settings.core.lifecycle.ObservablePreferenceFragment; +import com.android.settings.core.lifecycle.ObservableFragment; import com.android.settings.overlay.FeatureFactory; -/** - * Instrumented fragment that logs visibility state. - */ -public abstract class InstrumentedFragment extends ObservablePreferenceFragment - implements Instrumentable { +public abstract class InstrumentedFragment extends ObservableFragment implements Instrumentable { protected MetricsFeatureProvider mMetricsFeatureProvider; - // metrics placeholder value. Only use this for development. - protected final int PLACEHOLDER_METRIC = 10000; - protected final int SYSTEM_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 1; - protected final int STORAGE_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 2; - protected final int NETWORK_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 3; - protected final int CONNECTED_DEVICE_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 4; - protected final int APP_AND_NOTIFICATION_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 5; - protected final int INPUT_AND_GESTURE_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 6; - protected final int LANGUAGE_AND_REGION_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 7; - protected final int GESTURE_SWIPE_TO_NOTIFICATION = PLACEHOLDER_METRIC + 8; - protected final int GESTURE_DOUBLE_TAP_POWER = PLACEHOLDER_METRIC + 9; - protected final int GESTURE_PICKUP = PLACEHOLDER_METRIC + 10; - protected final int GESTURE_DOUBLE_TAP_SCREEN = PLACEHOLDER_METRIC + 11; - protected final int GESTURE_DOUBLE_TWIST = PLACEHOLDER_METRIC + 12; - public InstrumentedFragment() { // Mixin that logs visibility change for activity. getLifecycle().addObserver(new VisibilityLoggerMixin(getMetricsCategory())); @@ -58,8 +38,4 @@ public abstract class InstrumentedFragment extends ObservablePreferenceFragment super.onAttach(context); mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider(); } - - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - } -} +} \ No newline at end of file diff --git a/src/com/android/settings/core/InstrumentedPreferenceFragment.java b/src/com/android/settings/core/InstrumentedPreferenceFragment.java new file mode 100644 index 00000000000..1724d0ce471 --- /dev/null +++ b/src/com/android/settings/core/InstrumentedPreferenceFragment.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2016 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.core; + +import android.content.Context; +import android.os.Bundle; + +import com.android.settings.core.instrumentation.Instrumentable; +import com.android.settings.core.instrumentation.MetricsFeatureProvider; +import com.android.settings.core.instrumentation.VisibilityLoggerMixin; +import com.android.settings.core.lifecycle.ObservablePreferenceFragment; +import com.android.settings.overlay.FeatureFactory; + +/** + * Instrumented fragment that logs visibility state. + */ +public abstract class InstrumentedPreferenceFragment extends ObservablePreferenceFragment + implements Instrumentable { + + protected MetricsFeatureProvider mMetricsFeatureProvider; + + // metrics placeholder value. Only use this for development. + protected final int PLACEHOLDER_METRIC = 10000; + protected final int SYSTEM_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 1; + protected final int STORAGE_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 2; + protected final int NETWORK_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 3; + protected final int CONNECTED_DEVICE_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 4; + protected final int APP_AND_NOTIFICATION_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 5; + protected final int INPUT_AND_GESTURE_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 6; + protected final int LANGUAGE_AND_REGION_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 7; + protected final int GESTURE_SWIPE_TO_NOTIFICATION = PLACEHOLDER_METRIC + 8; + protected final int GESTURE_DOUBLE_TAP_POWER = PLACEHOLDER_METRIC + 9; + protected final int GESTURE_PICKUP = PLACEHOLDER_METRIC + 10; + protected final int GESTURE_DOUBLE_TAP_SCREEN = PLACEHOLDER_METRIC + 11; + protected final int GESTURE_DOUBLE_TWIST = PLACEHOLDER_METRIC + 12; + + public InstrumentedPreferenceFragment() { + // Mixin that logs visibility change for activity. + getLifecycle().addObserver(new VisibilityLoggerMixin(getMetricsCategory())); + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider(); + } + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + } +} diff --git a/src/com/android/settings/core/lifecycle/ObservableFragment.java b/src/com/android/settings/core/lifecycle/ObservableFragment.java new file mode 100644 index 00000000000..b1463250cbc --- /dev/null +++ b/src/com/android/settings/core/lifecycle/ObservableFragment.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2016 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.core.lifecycle; + +import android.annotation.CallSuper; +import android.app.Fragment; +import android.content.Context; +import android.os.Bundle; + +public class ObservableFragment extends Fragment { + + private final Lifecycle mLifecycle = new Lifecycle(); + + protected Lifecycle getLifecycle() { + return mLifecycle; + } + + @CallSuper + @Override + public void onAttach(Context context) { + super.onAttach(context); + mLifecycle.onAttach(context); + } + + @CallSuper + @Override + public void onCreate(Bundle savedInstanceState) { + mLifecycle.onCreate(savedInstanceState); + super.onCreate(savedInstanceState); + } + + @CallSuper + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + mLifecycle.onSaveInstanceState(outState); + } + + @CallSuper + @Override + public void onStart() { + mLifecycle.onStart(); + super.onStart(); + } + + @CallSuper + @Override + public void onStop() { + mLifecycle.onStop(); + super.onStop(); + } + + @CallSuper + @Override + public void onResume() { + mLifecycle.onResume(); + super.onResume(); + } + + @CallSuper + @Override + public void onPause() { + mLifecycle.onPause(); + super.onPause(); + } + + @CallSuper + @Override + public void onDestroy() { + mLifecycle.onDestroy(); + super.onDestroy(); + } +} \ No newline at end of file diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java index 0b3cc327955..de32b30ab1d 100644 --- a/src/com/android/settings/dashboard/DashboardSummary.java +++ b/src/com/android/settings/dashboard/DashboardSummary.java @@ -32,7 +32,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.Settings; import com.android.settings.SettingsActivity; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.dashboard.conditional.Condition; import com.android.settings.dashboard.conditional.ConditionAdapterUtils; import com.android.settings.dashboard.conditional.ConditionManager; @@ -47,7 +47,7 @@ import com.android.settingslib.drawer.Tile; import java.util.ArrayList; import java.util.List; -public class DashboardSummary extends InstrumentedFragment +public class DashboardSummary extends InstrumentedPreferenceFragment implements SettingsDrawerActivity.CategoryListener, ConditionManager.ConditionListener, FocusRecyclerView.FocusListener { public static final boolean DEBUG = false; diff --git a/src/com/android/settings/dashboard/SearchResultsSummary.java b/src/com/android/settings/dashboard/SearchResultsSummary.java index 70974855830..ef84f8befcc 100644 --- a/src/com/android/settings/dashboard/SearchResultsSummary.java +++ b/src/com/android/settings/dashboard/SearchResultsSummary.java @@ -41,12 +41,12 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.Utils; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.search.Index; import java.util.HashMap; -public class SearchResultsSummary extends InstrumentedFragment { +public class SearchResultsSummary extends InstrumentedPreferenceFragment { private static final String LOG_TAG = "SearchResultsSummary"; diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeFormat.java b/src/com/android/settings/deviceinfo/PrivateVolumeFormat.java index c4ca880ba05..319a09cd7a2 100644 --- a/src/com/android/settings/deviceinfo/PrivateVolumeFormat.java +++ b/src/com/android/settings/deviceinfo/PrivateVolumeFormat.java @@ -30,10 +30,10 @@ import android.widget.Button; import android.widget.TextView; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.R; -public class PrivateVolumeFormat extends InstrumentedFragment { +public class PrivateVolumeFormat extends InstrumentedPreferenceFragment { private VolumeInfo mVolume; private DiskInfo mDisk; diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java b/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java index c0c0d33a5ca..e0c5d654f45 100644 --- a/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java +++ b/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java @@ -28,12 +28,12 @@ import android.os.UserHandle; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.ChooseLockSettingsHelper; import com.android.settings.Utils; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; /** * Sidecar fragment to handle the state around fingerprint enrollment. */ -public class FingerprintEnrollSidecar extends InstrumentedFragment { +public class FingerprintEnrollSidecar extends InstrumentedPreferenceFragment { private int mEnrollmentSteps = -1; private int mEnrollmentRemaining = 0; diff --git a/src/com/android/settings/inputmethod/UserDictionaryAddWordFragment.java b/src/com/android/settings/inputmethod/UserDictionaryAddWordFragment.java index 65b40a3d3d5..0d30bccdf04 100644 --- a/src/com/android/settings/inputmethod/UserDictionaryAddWordFragment.java +++ b/src/com/android/settings/inputmethod/UserDictionaryAddWordFragment.java @@ -27,7 +27,7 @@ import android.widget.AdapterView; import android.widget.ArrayAdapter; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.inputmethod.UserDictionaryAddWordContents.LocaleRenderer; @@ -41,7 +41,7 @@ import java.util.Locale; * As opposed to the UserDictionaryActivity, this is only invoked within Settings * from the UserDictionarySettings. */ -public class UserDictionaryAddWordFragment extends InstrumentedFragment +public class UserDictionaryAddWordFragment extends InstrumentedPreferenceFragment implements AdapterView.OnItemSelectedListener, com.android.internal.app.LocalePicker.LocaleSelectionListener { diff --git a/src/com/android/settings/nfc/AndroidBeam.java b/src/com/android/settings/nfc/AndroidBeam.java index 76b67e8f5aa..fe264f3b9ba 100644 --- a/src/com/android/settings/nfc/AndroidBeam.java +++ b/src/com/android/settings/nfc/AndroidBeam.java @@ -29,7 +29,7 @@ import android.widget.Switch; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settingslib.HelpUtils; -import com.android.settings.core.InstrumentedFragment; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.ShowAdminSupportDetailsDialog; @@ -38,7 +38,7 @@ import com.android.settingslib.RestrictedLockUtils; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; -public class AndroidBeam extends InstrumentedFragment +public class AndroidBeam extends InstrumentedPreferenceFragment implements SwitchBar.OnSwitchChangeListener { private View mView; private NfcAdapter mNfcAdapter; diff --git a/tests/robotests/assets/grandfather_not_implementing_instrumentable b/tests/robotests/assets/grandfather_not_implementing_instrumentable index 5bd96affec5..c1f0d6096be 100644 --- a/tests/robotests/assets/grandfather_not_implementing_instrumentable +++ b/tests/robotests/assets/grandfather_not_implementing_instrumentable @@ -1,4 +1,5 @@ com.android.settings.deletionhelper.ActivationWarningFragment com.android.settings.core.lifecycle.ObservableDialogFragment +com.android.settings.core.lifecycle.ObservableFragment com.android.settings.applications.AppOpsCategory com.android.settings.inputmethod.UserDictionaryLocalePicker diff --git a/tests/robotests/src/com/android/settings/core/lifecycle/LifecycleTest.java b/tests/robotests/src/com/android/settings/core/lifecycle/LifecycleTest.java index 6aae543159a..db83bbb459b 100644 --- a/tests/robotests/src/com/android/settings/core/lifecycle/LifecycleTest.java +++ b/tests/robotests/src/com/android/settings/core/lifecycle/LifecycleTest.java @@ -16,6 +16,7 @@ package com.android.settings.core.lifecycle; import android.content.Context; + import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.core.lifecycle.events.OnAttach; @@ -24,6 +25,7 @@ import com.android.settings.core.lifecycle.events.OnPause; import com.android.settings.core.lifecycle.events.OnResume; import com.android.settings.core.lifecycle.events.OnStart; import com.android.settings.core.lifecycle.events.OnStop; + import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; @@ -47,6 +49,16 @@ public class LifecycleTest { } } + public static class TestFragment extends ObservableFragment { + + final TestObserver mFragObserver; + + public TestFragment() { + mFragObserver = new TestObserver(); + getLifecycle().addObserver(mFragObserver); + } + } + public static class TestActivity extends ObservableActivity { final TestObserver mActObserver; @@ -119,7 +131,7 @@ public class LifecycleTest { } @Test - public void runThroughFragmentLifecycles_shouldObserveEverything() { + public void runThroughDialogFragmentLifecycles_shouldObserveEverything() { FragmentController fragmentController = Robolectric.buildFragment(TestDialogFragment.class); TestDialogFragment fragment = fragmentController.get(); @@ -134,4 +146,21 @@ public class LifecycleTest { assertThat(fragment.mFragObserver.mOnStopObserved).isTrue(); assertThat(fragment.mFragObserver.mOnDestroyObserved).isTrue(); } + + @Test + public void runThroughFragmentLifecycles_shouldObserveEverything() { + FragmentController fragmentController = + Robolectric.buildFragment(TestFragment.class); + TestFragment fragment = fragmentController.get(); + + fragmentController.attach().create().start().resume().pause().stop().destroy(); + + assertThat(fragment.mFragObserver.mOnAttachObserved).isTrue(); + assertThat(fragment.mFragObserver.mOnAttachHasContext).isTrue(); + assertThat(fragment.mFragObserver.mOnStartObserved).isTrue(); + assertThat(fragment.mFragObserver.mOnResumeObserved).isTrue(); + assertThat(fragment.mFragObserver.mOnPauseObserved).isTrue(); + assertThat(fragment.mFragObserver.mOnStopObserved).isTrue(); + assertThat(fragment.mFragObserver.mOnDestroyObserved).isTrue(); + } }