Added survey triggering mechanisms
Surveys can now be triggered on a subset of Settings screens.
Surveys can also be modified/created for this subset of
screens remotely.
Test: RoboTests(master) && JUnitTests
Bug: 27823357
Change-Id: I1534af5573bef6f6c65c9c99b6f5a2917c3325b9
diff --git a/src/com/android/settings/InstrumentedFragment.java b/src/com/android/settings/InstrumentedFragment.java
index 8bab2cf..4dedb98 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 @@
* {@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 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 243e0bc..ee2c629 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 @@
* {@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 79e907f..907bed8 100644
--- a/src/com/android/settings/overlay/SurveyFeatureProvider.java
+++ b/src/com/android/settings/overlay/SurveyFeatureProvider.java
@@ -40,16 +40,46 @@
*
* @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);
}