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

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

Merge "Disable SmartSuggestion conditionally"

parents 0e852e41 e199f50d
Loading
Loading
Loading
Loading
+28 −4
Original line number Diff line number Diff line
@@ -17,13 +17,14 @@
package com.android.settings.dashboard.suggestions;

import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.content.ContentResolver;
import android.provider.Settings.Secure;
import android.support.annotation.NonNull;
import android.support.annotation.VisibleForTesting;
import android.text.format.DateUtils;
import android.util.Log;

import com.android.internal.logging.nano.MetricsProto;
@@ -43,6 +44,12 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider

    private static final String SHARED_PREF_FILENAME = "suggestions";

    // Suggestion category name and expiration threshold for first impression type. Needs to keep
    // in sync with suggestion_ordering.xml
    private static final String CATEGORY_FIRST_IMPRESSION =
            "com.android.settings.suggested.category.FIRST_IMPRESSION";
    private static final long FIRST_IMPRESSION_EXPIRE_DAY_IN_MILLIS = 14 * DateUtils.DAY_IN_MILLIS;

    private final SuggestionRanker mSuggestionRanker;
    private final MetricsFeatureProvider mMetricsFeatureProvider;

@@ -101,7 +108,11 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider
                context, MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION,
                getSuggestionIdentifier(context, suggestion));

        final boolean isSmartSuggestionEnabled = isSmartSuggestionEnabled(context);
        boolean isSmartSuggestionEnabled = isSmartSuggestionEnabled(context);
        if (isSmartSuggestionEnabled) {
            // Disable smart suggestion if we are still showing first impression suggestions.
            isSmartSuggestionEnabled = !isShowingFirstImpressionSuggestion(context);
        }
        if (!parser.dismissSuggestion(suggestion, isSmartSuggestionEnabled)) {
            return;
        }
@@ -111,6 +122,19 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider
                PackageManager.DONT_KILL_APP);
    }

    private boolean isShowingFirstImpressionSuggestion(Context context) {
        final String keySetupTime = CATEGORY_FIRST_IMPRESSION + SuggestionParser.SETUP_TIME;
        final long currentTime = System.currentTimeMillis();
        final SharedPreferences sharedPrefs = getSharedPrefs(context);
        if (!sharedPrefs.contains(keySetupTime)) {
            return true;
        }
        final long setupTime = sharedPrefs.getLong(keySetupTime, 0);
        final long elapsedTime = currentTime - setupTime;
        Log.d(TAG, "Day " + elapsedTime / DateUtils.DAY_IN_MILLIS + " for first impression");
        return elapsedTime <= FIRST_IMPRESSION_EXPIRE_DAY_IN_MILLIS;
    }

    @Override
    public String getSuggestionIdentifier(Context context, Tile suggestion) {
        if (suggestion.intent == null || suggestion.intent.getComponent() == null
+27 −7
Original line number Diff line number Diff line
@@ -19,15 +19,15 @@ package com.android.settings.dashboard.suggestions;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;

import android.provider.Settings.Secure;

import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.Settings.NightDisplaySuggestionActivity;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.Settings;
import com.android.settings.TestConfig;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowSecureSettings;
import com.android.settingslib.drawer.Tile;
import com.android.settingslib.suggestions.SuggestionParser;
@@ -50,6 +50,7 @@ import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
@@ -139,6 +140,25 @@ public class SuggestionFeatureProviderImplTest {
        verify(mContext, never()).getPackageManager();
    }

    @Test
    public void dismissSuggestion_isShowingFirstImpressionType_dismissWithoutSmartSuggestionRule() {
        mProvider = spy(mProvider);
        when(mProvider.isSmartSuggestionEnabled(any(Context.class))).thenReturn(true);
        final SharedPreferences pref = RuntimeEnvironment.application.getSharedPreferences(
                "test_pref", Context.MODE_PRIVATE);
        when(mProvider.getSharedPrefs(mContext)).thenReturn(pref);
        when(mSuggestionParser.dismissSuggestion(any(Tile.class), anyBoolean()))
                .thenReturn(false);

        mProvider.dismissSuggestion(mContext, mSuggestionParser, mSuggestion);

        verify(mFactory.metricsFeatureProvider).action(
                eq(mContext),
                eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION),
                anyString());
        verify(mSuggestionParser).dismissSuggestion(any(Tile.class), eq(false));
    }

    @Test
    public void dismissSuggestion_noContext_shouldDoNothing() {
        mProvider.dismissSuggestion(null, mSuggestionParser, mSuggestion);