diff --git a/src/com/android/settings/InstrumentedFragment.java b/src/com/android/settings/InstrumentedFragment.java index 8bab2cf15f2..4dedb98860d 100644 --- a/src/com/android/settings/InstrumentedFragment.java +++ b/src/com/android/settings/InstrumentedFragment.java @@ -16,10 +16,14 @@ package com.android.settings; +import android.app.Activity; +import android.content.BroadcastReceiver; import android.os.Bundle; import android.support.v14.preference.PreferenceFragment; import com.android.internal.logging.MetricsLogger; +import com.android.settings.overlay.FeatureFactory; +import com.android.settings.overlay.SurveyFeatureProvider; /** * Instrumented fragment that logs visibility state. @@ -39,6 +43,7 @@ public abstract class InstrumentedFragment extends PreferenceFragment { * {@link com.android.settings.InstrumentedFragment}. */ protected abstract int getMetricsCategory(); + private BroadcastReceiver mReceiver; @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { @@ -48,10 +53,36 @@ public abstract class InstrumentedFragment extends PreferenceFragment { public void onResume() { super.onResume(); MetricsLogger.visible(getActivity(), getMetricsCategory()); + + Activity activity = getActivity(); + // guard against the activity not existing yet or the feature being disabled + if (activity != null) { + SurveyFeatureProvider provider = + FeatureFactory.getFactory(activity).getSurveyFeatureProvider(activity); + if (provider != null) { + // Try to download a survey if there is none available, show the survey otherwise + String id = provider.getSurveyId(activity, getClass().getSimpleName()); + if (provider.getSurveyExpirationDate(activity, id) <= -1) { + // register the receiver to show the survey on completion. + mReceiver = provider.createAndRegisterReceiver(activity); + provider.downloadSurvey(activity, id, "fakeData"); + } else { + provider.showSurveyIfAvailable(activity, id); + } + } + } } @Override public void onPause() { + Activity activity = getActivity(); + if (mReceiver != null && activity != null) { + SurveyFeatureProvider provider = + FeatureFactory.getFactory(activity).getSurveyFeatureProvider(activity); + provider.unregisterReceiver(activity, mReceiver); + mReceiver = null; + } + super.onPause(); MetricsLogger.hidden(getActivity(), getMetricsCategory()); } diff --git a/src/com/android/settings/InstrumentedPreferenceFragment.java b/src/com/android/settings/InstrumentedPreferenceFragment.java index 243e0bcced5..ee2c629ff95 100644 --- a/src/com/android/settings/InstrumentedPreferenceFragment.java +++ b/src/com/android/settings/InstrumentedPreferenceFragment.java @@ -16,9 +16,13 @@ package com.android.settings; +import android.app.Activity; +import android.content.BroadcastReceiver; import android.support.v14.preference.PreferenceFragment; import com.android.internal.logging.MetricsLogger; +import com.android.settings.overlay.FeatureFactory; +import com.android.settings.overlay.SurveyFeatureProvider; /** * Instrumented preference fragment that logs visibility state. @@ -32,15 +36,42 @@ public abstract class InstrumentedPreferenceFragment extends PreferenceFragment * {@link com.android.settings.InstrumentedFragment}. */ protected abstract int getMetricsCategory(); + private BroadcastReceiver mReceiver; @Override public void onResume() { super.onResume(); MetricsLogger.visible(getActivity(), getMetricsCategory()); + + Activity activity = getActivity(); + // guard against the activity not existing yet or the feature being disabled + if (activity != null) { + SurveyFeatureProvider provider = + FeatureFactory.getFactory(activity).getSurveyFeatureProvider(activity); + if (provider != null) { + // Try to download a survey if there is none available, show the survey otherwise + String id = provider.getSurveyId(activity, getClass().getSimpleName()); + if (provider.getSurveyExpirationDate(activity, id) <= -1) { + // register the receiver to show the survey on completion. + mReceiver = provider.createAndRegisterReceiver(activity); + provider.downloadSurvey(activity, id, "fakeData"); + } else { + provider.showSurveyIfAvailable(activity, id); + } + } + } } @Override public void onPause() { + Activity activity = getActivity(); + if (mReceiver != null && activity != null) { + SurveyFeatureProvider provider = + FeatureFactory.getFactory(activity).getSurveyFeatureProvider(activity); + provider.unregisterReceiver(activity, mReceiver); + mReceiver = null; + } + super.onPause(); MetricsLogger.hidden(getActivity(), getMetricsCategory()); } diff --git a/src/com/android/settings/overlay/SurveyFeatureProvider.java b/src/com/android/settings/overlay/SurveyFeatureProvider.java index 79e907f74b3..907bed8f7bf 100644 --- a/src/com/android/settings/overlay/SurveyFeatureProvider.java +++ b/src/com/android/settings/overlay/SurveyFeatureProvider.java @@ -40,16 +40,46 @@ public interface SurveyFeatureProvider { * * @param activity The host activity to show the survey in. * @param surveyId A unique Id representing a survey to download. + * @return A boolean indicating if a survey was shown or not. */ - void showSurveyIfAvailable(Activity activity, String surveyId); + boolean showSurveyIfAvailable(Activity activity, String surveyId); /** * A helper method to get the surveyId. Implementers should create a mapping of * keys to surveyIds and provide them via this function. * * @param context A valid context. - * @param key The key to get the surveyId for. + * @param simpleKey The simple name of the key to get the surveyId for. * @return The unique Id as a string or null on error. */ - String getSurveyId(Context context, String key); + String getSurveyId(Context context, String simpleKey); + + /** + * Removes the survey for {@code siteId} if it expired, then returns the expiration date (as a + * unix timestamp) for the remaining survey should it exist and be ready to show. Returns -1 if + * no valid survey exists after removing the potentially expired one. + * + * @param context the calling context. + * @param surveyId the site ID. + * @return the unix timestamp for the available survey for the given {@coe siteId} or -1 if + * there is none available. + */ + long getSurveyExpirationDate(Context context, String surveyId); + + /** + * Registers an activity to show surveys/prompts as soon as they are downloaded. The receiver + * should be unregistered prior to destroying the activity to avoid undefined behavior by + * calling {@link #unregisterReceiver(Activity, BroadcastReceiver)}. + * @param activity The activity that should show surveys once they are downloaded. + * @return the broadcast receiver listening for survey downloads. Must be unregistered before + * leaving the activity. + */ + BroadcastReceiver createAndRegisterReceiver(Activity activity); + + /** + * Unregisters the broadcast receiver for this activity. Should only be called once per activity + * after a call to {@link #createAndRegisterReceiver(Activity)}. + * @param activity The activity that was used to register the BroadcastReceiver. + */ + void unregisterReceiver(Activity activity, BroadcastReceiver receiver); }