Add ranking to SuggestionFeatureProvider interface.

Test: RunSettingsRoboTests
Fixes: b/35363662

Change-Id: Ib786e6b2733e2b151f73fb68e174a21aedb2b20a
This commit is contained in:
Soroosh Mariooryad
2017-02-14 16:40:31 -08:00
parent 25d8049bb2
commit e457e35ec0
10 changed files with 46 additions and 23 deletions

View File

@@ -225,7 +225,7 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
return; return;
} }
boolean isSmartSuggestionEnabled = FeatureFactory.getFactory(mContext) boolean isSmartSuggestionEnabled = FeatureFactory.getFactory(mContext)
.getSuggestionFeatureProvider().isSmartSuggestionEnabled(mContext); .getSuggestionFeatureProvider(mContext).isSmartSuggestionEnabled(mContext);
if (mSuggestionParser.dismissSuggestion(suggestion, isSmartSuggestionEnabled)) { if (mSuggestionParser.dismissSuggestion(suggestion, isSmartSuggestionEnabled)) {
mContext.getPackageManager().setComponentEnabledSetting( mContext.getPackageManager().setComponentEnabledSetting(
suggestion.intent.getComponent(), suggestion.intent.getComponent(),

View File

@@ -37,9 +37,7 @@ import com.android.settings.dashboard.conditional.ConditionAdapterUtils;
import com.android.settings.dashboard.conditional.ConditionManager; import com.android.settings.dashboard.conditional.ConditionManager;
import com.android.settings.dashboard.conditional.FocusRecyclerView; import com.android.settings.dashboard.conditional.FocusRecyclerView;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.suggestions.EventStore; import com.android.settings.suggestions.SuggestionFeatureProvider;
import com.android.settings.suggestions.SuggestionFeaturizer;
import com.android.settings.suggestions.SuggestionRanker;
import com.android.settingslib.SuggestionParser; import com.android.settingslib.SuggestionParser;
import com.android.settingslib.drawer.CategoryKey; import com.android.settingslib.drawer.CategoryKey;
import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.DashboardCategory;
@@ -68,7 +66,6 @@ public class DashboardSummary extends InstrumentedFragment
private SummaryLoader mSummaryLoader; private SummaryLoader mSummaryLoader;
private ConditionManager mConditionManager; private ConditionManager mConditionManager;
private SuggestionParser mSuggestionParser; private SuggestionParser mSuggestionParser;
private SuggestionRanker mSuggestionRanker;
private LinearLayoutManager mLayoutManager; private LinearLayoutManager mLayoutManager;
private SuggestionsChecks mSuggestionsChecks; private SuggestionsChecks mSuggestionsChecks;
private DashboardFeatureProvider mDashboardFeatureProvider; private DashboardFeatureProvider mDashboardFeatureProvider;
@@ -87,7 +84,7 @@ public class DashboardSummary extends InstrumentedFragment
mDashboardFeatureProvider = FeatureFactory.getFactory(activity) mDashboardFeatureProvider = FeatureFactory.getFactory(activity)
.getDashboardFeatureProvider(activity); .getDashboardFeatureProvider(activity);
mSuggestionFeatureProvider = FeatureFactory.getFactory(activity) mSuggestionFeatureProvider = FeatureFactory.getFactory(activity)
.getSuggestionFeatureProvider(); .getSuggestionFeatureProvider(activity);
if (mDashboardFeatureProvider.isEnabled()) { if (mDashboardFeatureProvider.isEnabled()) {
mSummaryLoader = new SummaryLoader(activity, CategoryKey.CATEGORY_HOMEPAGE); mSummaryLoader = new SummaryLoader(activity, CategoryKey.CATEGORY_HOMEPAGE);
@@ -99,8 +96,6 @@ public class DashboardSummary extends InstrumentedFragment
mConditionManager = ConditionManager.get(activity, false); mConditionManager = ConditionManager.get(activity, false);
mSuggestionParser = new SuggestionParser(activity, mSuggestionParser = new SuggestionParser(activity,
activity.getSharedPreferences(SUGGESTIONS, 0), R.xml.suggestion_ordering); activity.getSharedPreferences(SUGGESTIONS, 0), R.xml.suggestion_ordering);
mSuggestionRanker = new SuggestionRanker(
new SuggestionFeaturizer(new EventStore(activity)));
mSuggestionsChecks = new SuggestionsChecks(getContext()); mSuggestionsChecks = new SuggestionsChecks(getContext());
if (DEBUG_TIMING) { if (DEBUG_TIMING) {
Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime) Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime)
@@ -254,7 +249,7 @@ public class DashboardSummary extends InstrumentedFragment
DashboardAdapter.getSuggestionIdentifier(context, suggestion)); DashboardAdapter.getSuggestionIdentifier(context, suggestion));
} }
// TODO: create a Suggestion class to maintain the id and other info // TODO: create a Suggestion class to maintain the id and other info
mSuggestionRanker.rank(suggestions, suggestionIds); mSuggestionFeatureProvider.rankSuggestions(suggestions, suggestionIds);
} }
for (int i = 0; i < suggestions.size(); i++) { for (int i = 0; i < suggestions.size(); i++) {
Tile suggestion = suggestions.get(i); Tile suggestion = suggestions.get(i);

View File

@@ -38,6 +38,7 @@ import com.android.settings.Settings.ZenModeAutomationSuggestionActivity;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.WallpaperSuggestionActivity; import com.android.settings.WallpaperSuggestionActivity;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.suggestions.SuggestionFeatureProvider;
import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.Tile;
import java.util.Collection; import java.util.Collection;
@@ -70,7 +71,7 @@ public class SuggestionsChecks {
} }
SuggestionFeatureProvider provider = SuggestionFeatureProvider provider =
FeatureFactory.getFactory(mContext).getSuggestionFeatureProvider(); FeatureFactory.getFactory(mContext).getSuggestionFeatureProvider(mContext);
if (provider != null && provider.isPresent(className)) { if (provider != null && provider.isPresent(className)) {
return provider.isSuggestionCompleted(mContext); return provider.isSuggestionCompleted(mContext);
} }

View File

@@ -24,13 +24,13 @@ import com.android.settings.R;
import com.android.settings.applications.ApplicationFeatureProvider; import com.android.settings.applications.ApplicationFeatureProvider;
import com.android.settings.core.instrumentation.MetricsFeatureProvider; import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.SuggestionFeatureProvider;
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider; import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
import com.android.settings.gestures.AssistGestureFeatureProvider; import com.android.settings.gestures.AssistGestureFeatureProvider;
import com.android.settings.localepicker.LocaleFeatureProvider; import com.android.settings.localepicker.LocaleFeatureProvider;
import com.android.settings.security.SecurityFeatureProvider; import com.android.settings.security.SecurityFeatureProvider;
import com.android.settings.search2.SearchFeatureProvider; import com.android.settings.search2.SearchFeatureProvider;
import com.android.settings.suggestions.SuggestionFeatureProvider;
/** /**
* Abstract class for creating feature controllers. Allows OEM implementations to define their own * Abstract class for creating feature controllers. Allows OEM implementations to define their own
@@ -71,7 +71,7 @@ public abstract class FeatureFactory {
public abstract AssistGestureFeatureProvider getAssistGestureFeatureProvider(); public abstract AssistGestureFeatureProvider getAssistGestureFeatureProvider();
public abstract SuggestionFeatureProvider getSuggestionFeatureProvider(); public abstract SuggestionFeatureProvider getSuggestionFeatureProvider(Context context);
public abstract SupportFeatureProvider getSupportFeatureProvider(Context context); public abstract SupportFeatureProvider getSupportFeatureProvider(Context context);

View File

@@ -30,8 +30,6 @@ import com.android.settings.applications.PackageManagerWrapperImpl;
import com.android.settings.core.instrumentation.MetricsFeatureProvider; import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.DashboardFeatureProviderImpl; import com.android.settings.dashboard.DashboardFeatureProviderImpl;
import com.android.settings.dashboard.SuggestionFeatureProvider;
import com.android.settings.dashboard.SuggestionFeatureProviderImpl;
import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl; import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider; import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
import com.android.settings.enterprise.EnterprisePrivacyFeatureProviderImpl; import com.android.settings.enterprise.EnterprisePrivacyFeatureProviderImpl;
@@ -45,6 +43,8 @@ import com.android.settings.search2.SearchFeatureProvider;
import com.android.settings.search2.SearchFeatureProviderImpl; import com.android.settings.search2.SearchFeatureProviderImpl;
import com.android.settings.security.SecurityFeatureProvider; import com.android.settings.security.SecurityFeatureProvider;
import com.android.settings.security.SecurityFeatureProviderImpl; import com.android.settings.security.SecurityFeatureProviderImpl;
import com.android.settings.suggestions.SuggestionFeatureProvider;
import com.android.settings.suggestions.SuggestionFeatureProviderImpl;
import com.android.settings.vpn2.ConnectivityManagerWrapperImpl; import com.android.settings.vpn2.ConnectivityManagerWrapperImpl;
/** /**
@@ -150,9 +150,9 @@ public class FeatureFactoryImpl extends FeatureFactory {
} }
@Override @Override
public SuggestionFeatureProvider getSuggestionFeatureProvider() { public SuggestionFeatureProvider getSuggestionFeatureProvider(Context context) {
if (mSuggestionFeatureProvider == null) { if (mSuggestionFeatureProvider == null) {
mSuggestionFeatureProvider = new SuggestionFeatureProviderImpl(); mSuggestionFeatureProvider = new SuggestionFeatureProviderImpl(context);
} }
return mSuggestionFeatureProvider; return mSuggestionFeatureProvider;
} }

View File

@@ -14,10 +14,14 @@
* limitations under the License * limitations under the License
*/ */
package com.android.settings.dashboard; package com.android.settings.suggestions;
import android.content.Context; import android.content.Context;
import com.android.settingslib.drawer.Tile;
import java.util.List;
/** Interface should be implemented if you have added new suggestions */ /** Interface should be implemented if you have added new suggestions */
public interface SuggestionFeatureProvider { public interface SuggestionFeatureProvider {
@@ -32,4 +36,10 @@ public interface SuggestionFeatureProvider {
/** Return true if the suggestion has already been completed and does not need to be shown */ /** Return true if the suggestion has already been completed and does not need to be shown */
boolean isSuggestionCompleted(Context context); boolean isSuggestionCompleted(Context context);
/**
* Ranks the list of suggestions in place.
* @param suggestions: List of suggestion Tiles
* @param suggestionIds: List of suggestion ids corresponding to the suggestion tiles.
*/
void rankSuggestions(final List<Tile> suggestions, List<String> suggestionIds);
} }

View File

@@ -14,12 +14,18 @@
* limitations under the License. * limitations under the License.
*/ */
package com.android.settings.dashboard; package com.android.settings.suggestions;
import android.content.Context; import android.content.Context;
import com.android.settingslib.drawer.Tile;
import java.util.List;
public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider { public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider {
private final SuggestionRanker mSuggestionRanker;
@Override @Override
public boolean isSmartSuggestionEnabled(Context context) { public boolean isSmartSuggestionEnabled(Context context) {
return false; return false;
@@ -35,4 +41,15 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider
return false; return false;
} }
public SuggestionFeatureProviderImpl(Context context) {
mSuggestionRanker = new SuggestionRanker(
new SuggestionFeaturizer(new EventStore(context.getApplicationContext())));
}
@Override
public void rankSuggestions(final List<Tile> suggestions, List<String> suggestionIds) {
mSuggestionRanker.rankSuggestions(suggestions, suggestionIds);
}
} }

View File

@@ -40,7 +40,7 @@ public class SuggestionRanker {
put(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_SHOWN, 3.18832024515); put(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_SHOWN, 3.18832024515);
put(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_DISMISSED, 1.09902706645); put(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_DISMISSED, 1.09902706645);
put(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_CLICKED, 0.262631082877); put(SuggestionFeaturizer.FEATURE_TIME_FROM_LAST_CLICKED, 0.262631082877);
put(SuggestionFeaturizer.FEATURE_SHOWN_COUNT, -0.918484103748 * 240); put(SuggestionFeaturizer.FEATURE_SHOWN_COUNT, -220.4361849);
}}; }};
private final SuggestionFeaturizer mSuggestionFeaturizer; private final SuggestionFeaturizer mSuggestionFeaturizer;
@@ -59,7 +59,7 @@ public class SuggestionRanker {
relevanceMetrics = new HashMap<Tile, Double>(); relevanceMetrics = new HashMap<Tile, Double>();
} }
public void rank(final List<Tile> suggestions, List<String> suggestionIds) { public void rankSuggestions(final List<Tile> suggestions, List<String> suggestionIds) {
relevanceMetrics.clear(); relevanceMetrics.clear();
Map<String, Map<String, Double>> features = mSuggestionFeaturizer.featurize(suggestionIds); Map<String, Map<String, Double>> features = mSuggestionFeaturizer.featurize(suggestionIds);
for (int i = 0; i < suggestionIds.size(); i++) { for (int i = 0; i < suggestionIds.size(); i++) {

View File

@@ -87,7 +87,7 @@ public class SuggestionRankerTest {
add(mSuggestions.get(1)); // relevance = 0.1 add(mSuggestions.get(1)); // relevance = 0.1
} }
}; };
mSuggestionRanker.rank(mSuggestions, mPkgNames); mSuggestionRanker.rankSuggestions(mSuggestions, mPkgNames);
assertThat(mSuggestions).isEqualTo(expectedOrderdList); assertThat(mSuggestions).isEqualTo(expectedOrderdList);
} }
} }

View File

@@ -20,7 +20,6 @@ import android.content.Context;
import com.android.settings.applications.ApplicationFeatureProvider; import com.android.settings.applications.ApplicationFeatureProvider;
import com.android.settings.core.instrumentation.MetricsFeatureProvider; import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.SuggestionFeatureProvider;
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider; import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
import com.android.settings.gestures.AssistGestureFeatureProvider; import com.android.settings.gestures.AssistGestureFeatureProvider;
@@ -28,6 +27,7 @@ import com.android.settings.localepicker.LocaleFeatureProvider;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.overlay.SupportFeatureProvider; import com.android.settings.overlay.SupportFeatureProvider;
import com.android.settings.security.SecurityFeatureProvider; import com.android.settings.security.SecurityFeatureProvider;
import com.android.settings.suggestions.SuggestionFeatureProvider;
import com.android.settings.search2.SearchFeatureProvider; import com.android.settings.search2.SearchFeatureProvider;
import com.android.settings.overlay.SurveyFeatureProvider; import com.android.settings.overlay.SurveyFeatureProvider;
@@ -90,7 +90,7 @@ public class FakeFeatureFactory extends FeatureFactory {
} }
@Override @Override
public SuggestionFeatureProvider getSuggestionFeatureProvider() { public SuggestionFeatureProvider getSuggestionFeatureProvider(Context context) {
return suggestionsFeatureProvider; return suggestionsFeatureProvider;
} }