OSDN Git Service

Added survey triggering mechanisms
authorSalvador Martinez <dehboxturtle@google.com>
Thu, 8 Dec 2016 20:44:47 +0000 (12:44 -0800)
committerSalvador Martinez <dehboxturtle@google.com>
Thu, 12 Jan 2017 00:27:11 +0000 (16:27 -0800)
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

src/com/android/settings/InstrumentedFragment.java
src/com/android/settings/InstrumentedPreferenceFragment.java
src/com/android/settings/overlay/SurveyFeatureProvider.java

index 8bab2cf..4dedb98 100644 (file)
 
 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());
     }
index 243e0bc..ee2c629 100644 (file)
 
 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());
     }
index 79e907f..907bed8 100644 (file)
@@ -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);
 }