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

Commit 6a820f22 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Remove logic for parsing dismiss rule" into oc-mr1-dev

parents 8c009ebf c07ae9cf
Loading
Loading
Loading
Loading
+29 −44
Original line number Diff line number Diff line
@@ -91,28 +91,25 @@ public class SuggestionParser {

    // Shared prefs keys for storing dismissed state.
    // Index into current dismissed state.
    @VisibleForTesting
    static final String DISMISS_INDEX = "_dismiss_index";
    public static final String SETUP_TIME = "_setup_time";
    private static final String IS_DISMISSED = "_is_dismissed";

    // Default dismiss control for smart suggestions.
    private static final String DEFAULT_SMART_DISMISS_CONTROL = "0,10";
    private static final String DEFAULT_SMART_DISMISS_CONTROL = "0";

    private final Context mContext;
    private final List<SuggestionCategory> mSuggestionList;
    private final ArrayMap<Pair<String, String>, Tile> mAddCache = new ArrayMap<>();
    private final SharedPreferences mSharedPrefs;
    private final String mSmartDismissControl;

    private final String mDefaultDismissControl;

    public SuggestionParser(Context context, SharedPreferences sharedPrefs, int orderXml,
            String smartDismissControl) {
            String defaultDismissControl) {
        this(
                context,
                sharedPrefs,
                (List<SuggestionCategory>) new SuggestionOrderInflater(context).parse(orderXml),
                smartDismissControl);
                defaultDismissControl);
    }

    public SuggestionParser(Context context, SharedPreferences sharedPrefs, int orderXml) {
@@ -124,11 +121,11 @@ public class SuggestionParser {
            Context context,
            SharedPreferences sharedPrefs,
            List<SuggestionCategory> suggestionList,
            String smartDismissControl) {
            String defaultDismissControl) {
        mContext = context;
        mSuggestionList = suggestionList;
        mSharedPrefs = sharedPrefs;
        mSmartDismissControl = smartDismissControl;
        mDefaultDismissControl = defaultDismissControl;
    }

    public SuggestionList getSuggestions(boolean isSmartSuggestionEnabled) {
@@ -161,25 +158,16 @@ public class SuggestionParser {
        return suggestionList;
    }

    public boolean dismissSuggestion(Tile suggestion) {
        return dismissSuggestion(suggestion, false);
    }

    /**
     * Dismisses a suggestion, returns true if the suggestion has no more dismisses left and should
     * be disabled.
     */
    public boolean dismissSuggestion(Tile suggestion, boolean isSmartSuggestionEnabled) {
        String keyBase = suggestion.intent.getComponent().flattenToShortString();
        int index = mSharedPrefs.getInt(keyBase + DISMISS_INDEX, 0);
        String dismissControl = getDismissControl(suggestion, isSmartSuggestionEnabled);
        if (dismissControl == null || parseDismissString(dismissControl).length == index) {
            return true;
        }
    public boolean dismissSuggestion(Tile suggestion) {
        final String keyBase = suggestion.intent.getComponent().flattenToShortString();
        mSharedPrefs.edit()
                .putBoolean(keyBase + IS_DISMISSED, true)
                .commit();
        return false;
        return true;
    }

    @VisibleForTesting
@@ -357,32 +345,29 @@ public class SuggestionParser {
    @VisibleForTesting
    boolean isDismissed(Tile suggestion, boolean isSmartSuggestionEnabled) {
        String dismissControl = getDismissControl(suggestion, isSmartSuggestionEnabled);
        if (dismissControl == null) {
            return false;
        }
        String keyBase = suggestion.intent.getComponent().flattenToShortString();
        if (!mSharedPrefs.contains(keyBase + SETUP_TIME)) {
            mSharedPrefs.edit()
                    .putLong(keyBase + SETUP_TIME, System.currentTimeMillis())
                    .commit();
        }
        // Default to dismissed, so that we can have suggestions that only first appear after
        // some number of days.
        if (!mSharedPrefs.getBoolean(keyBase + IS_DISMISSED, true)) {
            return false;
        }
        int index = mSharedPrefs.getInt(keyBase + DISMISS_INDEX, 0);
        int[] dismissRules = parseDismissString(dismissControl);
        if (dismissRules.length <= index) {
        // Check if it's already manually dismissed
        final boolean isDismissed = mSharedPrefs.getBoolean(keyBase + IS_DISMISSED, false);
        if (isDismissed) {
            return true;
        }
        int currentDismiss = dismissRules[index];
        long time = getEndTime(mSharedPrefs.getLong(keyBase + SETUP_TIME, 0), currentDismiss);
        if (System.currentTimeMillis() >= time) {
        if (dismissControl == null) {
            return false;
        }
        // Parse when suggestion should first appear. return true to artificially hide suggestion
        // before then.
        int firstAppearDay = parseDismissString(dismissControl);
        long firstAppearDayInMs = getEndTime(mSharedPrefs.getLong(keyBase + SETUP_TIME, 0),
                firstAppearDay);
        if (System.currentTimeMillis() >= firstAppearDayInMs) {
            // Dismiss timeout has passed, undismiss it.
            mSharedPrefs.edit()
                    .putBoolean(keyBase + IS_DISMISSED, false)
                    .putInt(keyBase + DISMISS_INDEX, index + 1)
                    .commit();
            return false;
        }
@@ -394,18 +379,18 @@ public class SuggestionParser {
        return startTime + days;
    }

    private int[] parseDismissString(String dismissControl) {
        String[] dismissStrs = dismissControl.split(",");
        int[] dismisses = new int[dismissStrs.length];
        for (int i = 0; i < dismissStrs.length; i++) {
            dismisses[i] = Integer.parseInt(dismissStrs[i]);
        }
        return dismisses;
    /**
     * Parse the first int from a string formatted as "0,1,2..."
     * The value means suggestion should first appear on Day X.
     */
    private int parseDismissString(String dismissControl) {
        final String[] dismissStrs = dismissControl.split(",");
        return Integer.parseInt(dismissStrs[0]);
    }

    private String getDismissControl(Tile suggestion, boolean isSmartSuggestionEnabled) {
        if (isSmartSuggestionEnabled) {
            return mSmartDismissControl;
            return mDefaultDismissControl;
        } else {
            return suggestion.metaData.getString(META_DATA_DISMISS_CONTROL);
        }
+9 −19
Original line number Diff line number Diff line
@@ -83,7 +83,7 @@ public class SuggestionParserTest {

        mSuggestionParser = new SuggestionParser(mContext, mPrefs,
                Arrays.asList(mMultipleCategory, mExclusiveCategory, mExpiredExclusiveCategory),
                "0,0");
                "0");

        ResolveInfo info1 = TileUtilsTest.newInfo(true, null);
        info1.activityInfo.packageName = "pkg";
@@ -109,17 +109,12 @@ public class SuggestionParserTest {
    }

    @Test
    public void testDismissSuggestion_withoutSmartSuggestion() {
        assertThat(mSuggestionParser.dismissSuggestion(mSuggestion, false)).isTrue();
    public void dismissSuggestion_shouldDismiss() {
        assertThat(mSuggestionParser.dismissSuggestion(mSuggestion)).isTrue();
    }

    @Test
    public void testDismissSuggestion_withSmartSuggestion() {
        assertThat(mSuggestionParser.dismissSuggestion(mSuggestion, true)).isFalse();
    }

    @Test
    public void testGetSuggestions_withoutSmartSuggestions() {
    public void testGetSuggestions_withoutSmartSuggestions_shouldDismiss() {
        readAndDismissSuggestion(false);
        mSuggestionParser.readSuggestions(mMultipleCategory, mSuggestionsAfterDismiss, false);
        assertThat(mSuggestionsBeforeDismiss).hasSize(2);
@@ -128,11 +123,10 @@ public class SuggestionParserTest {
    }

    @Test
    public void testGetSuggestions_withSmartSuggestions() {
    public void testGetSuggestions_withSmartSuggestions_shouldDismiss() {
        readAndDismissSuggestion(true);
        assertThat(mSuggestionsBeforeDismiss).hasSize(2);
        assertThat(mSuggestionsAfterDismiss).hasSize(2);
        assertThat(mSuggestionsBeforeDismiss).isEqualTo(mSuggestionsAfterDismiss);
        assertThat(mSuggestionsAfterDismiss).hasSize(1);
    }

    @Test
@@ -191,19 +185,15 @@ public class SuggestionParserTest {
    }

    @Test
    public void isSuggestionDismissed_mismatchRule_shouldDismiss() {
    public void isSuggestionDismissed_dismissedSuggestion_shouldReturnTrue() {
        final Tile suggestion = new Tile();
        suggestion.metaData = new Bundle();
        suggestion.metaData.putString(SuggestionParser.META_DATA_DISMISS_CONTROL, "1,2,3");
        suggestion.intent = new Intent().setComponent(new ComponentName("pkg", "cls"));

        // Dismiss suggestion when smart suggestion is not enabled.
        mSuggestionParser.dismissSuggestion(suggestion, false /* isSmartSuggestionEnabled */);
        final String suggestionKey = suggestion.intent.getComponent().flattenToShortString();
        // And point to last rule in dismiss control
        mPrefs.edit().putInt(suggestionKey + SuggestionParser.DISMISS_INDEX, 2).apply();
        mSuggestionParser.dismissSuggestion(suggestion);

        // Turn on smart suggestion, and check if suggestion is enabled.
        assertThat(mSuggestionParser.isDismissed(suggestion, true /* isSmartSuggestionEnabled */))
                .isTrue();
    }
@@ -215,7 +205,7 @@ public class SuggestionParserTest {
                mMultipleCategory, mSuggestionsBeforeDismiss, isSmartSuggestionEnabled);

        final Tile suggestion = mSuggestionsBeforeDismiss.get(0);
        if (mSuggestionParser.dismissSuggestion(suggestion, isSmartSuggestionEnabled)) {
        if (mSuggestionParser.dismissSuggestion(suggestion)) {
            RuntimeEnvironment.getRobolectricPackageManager().removeResolveInfosForIntent(
                    new Intent(Intent.ACTION_MAIN).addCategory(mMultipleCategory.category),
                    suggestion.intent.getComponent().getPackageName());