Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2cb82c55 authored by Salvador Martinez's avatar Salvador Martinez
Browse files

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
parent cd0fe608
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -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());
    }
+31 −0
Original line number Diff line number Diff line
@@ -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());
    }
+33 −3
Original line number Diff line number Diff line
@@ -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);
}