Disable SmartSuggestion conditionally

The smart suggestion flag should be treated as false when dismissing
first impression type suggestions. Smart suggestion and first impression
suggestions have different dismiss rules.

Change-Id: Ia99d310ddea7baf58b6eadacee8ccda5bf33f311
Fix: 63094854
Test: robotests
This commit is contained in:
Fan Zhang
2017-06-28 14:32:39 -07:00
parent db62b52119
commit e199f50d65
2 changed files with 55 additions and 11 deletions

View File

@@ -17,13 +17,14 @@
package com.android.settings.dashboard.suggestions; package com.android.settings.dashboard.suggestions;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.content.ContentResolver;
import android.provider.Settings.Secure; import android.provider.Settings.Secure;
import android.support.annotation.NonNull;
import android.support.annotation.VisibleForTesting; import android.support.annotation.VisibleForTesting;
import android.text.format.DateUtils;
import android.util.Log; import android.util.Log;
import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto;
@@ -43,6 +44,12 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider
private static final String SHARED_PREF_FILENAME = "suggestions"; 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 SuggestionRanker mSuggestionRanker;
private final MetricsFeatureProvider mMetricsFeatureProvider; private final MetricsFeatureProvider mMetricsFeatureProvider;
@@ -101,7 +108,11 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider
context, MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION, context, MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION,
getSuggestionIdentifier(context, 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)) { if (!parser.dismissSuggestion(suggestion, isSmartSuggestionEnabled)) {
return; return;
} }
@@ -111,6 +122,19 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider
PackageManager.DONT_KILL_APP); 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 @Override
public String getSuggestionIdentifier(Context context, Tile suggestion) { public String getSuggestionIdentifier(Context context, Tile suggestion) {
if (suggestion.intent == null || suggestion.intent.getComponent() == null if (suggestion.intent == null || suggestion.intent.getComponent() == null

View File

@@ -19,15 +19,15 @@ package com.android.settings.dashboard.suggestions;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.provider.Settings.Secure; import android.provider.Settings.Secure;
import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.Settings.NightDisplaySuggestionActivity; 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.TestConfig;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowSecureSettings; import com.android.settings.testutils.shadow.ShadowSecureSettings;
import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.Tile;
import com.android.settingslib.suggestions.SuggestionParser; 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.anyString;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -139,6 +140,25 @@ public class SuggestionFeatureProviderImplTest {
verify(mContext, never()).getPackageManager(); 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 @Test
public void dismissSuggestion_noContext_shouldDoNothing() { public void dismissSuggestion_noContext_shouldDoNothing() {
mProvider.dismissSuggestion(null, mSuggestionParser, mSuggestion); mProvider.dismissSuggestion(null, mSuggestionParser, mSuggestion);