Fix NPE when building suggestion identifier.
And refactored the getIdent logic into feature provider. Change-Id: Id6f66a6942cbaf6d26ae4dca62037a6cf01179a5 Fix: 36314240 Test: make RunSettingsRoboTests
This commit is contained in:
@@ -40,8 +40,8 @@ import com.android.settings.core.instrumentation.MetricsFeatureProvider;
|
||||
import com.android.settings.dashboard.conditional.Condition;
|
||||
import com.android.settings.dashboard.conditional.ConditionAdapterUtils;
|
||||
import com.android.settings.dashboard.suggestions.SuggestionDismissController;
|
||||
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settingslib.SuggestionParser;
|
||||
import com.android.settingslib.drawer.DashboardCategory;
|
||||
import com.android.settingslib.drawer.Tile;
|
||||
|
||||
@@ -60,6 +60,7 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
||||
private final Context mContext;
|
||||
private final MetricsFeatureProvider mMetricsFeatureProvider;
|
||||
private final DashboardFeatureProvider mDashboardFeatureProvider;
|
||||
private final SuggestionFeatureProvider mSuggestionFeatureProvider;
|
||||
private final ArrayList<String> mSuggestionsShownLogged;
|
||||
private boolean mFirstFrameDrawn;
|
||||
|
||||
@@ -97,17 +98,17 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
||||
}
|
||||
};
|
||||
|
||||
public DashboardAdapter(Context context, SuggestionParser parser,
|
||||
MetricsFeatureProvider metricsFeatureProvider, Bundle savedInstanceState,
|
||||
public DashboardAdapter(Context context, Bundle savedInstanceState,
|
||||
List<Condition> conditions) {
|
||||
List<Tile> suggestions = null;
|
||||
List<DashboardCategory> categories = null;
|
||||
int suggestionMode = DashboardData.SUGGESTION_MODE_DEFAULT;
|
||||
|
||||
mContext = context;
|
||||
mMetricsFeatureProvider = metricsFeatureProvider;
|
||||
mDashboardFeatureProvider = FeatureFactory.getFactory(context)
|
||||
.getDashboardFeatureProvider(context);
|
||||
final FeatureFactory factory = FeatureFactory.getFactory(context);
|
||||
mMetricsFeatureProvider = factory.getMetricsFeatureProvider();
|
||||
mDashboardFeatureProvider = factory.getDashboardFeatureProvider(context);
|
||||
mSuggestionFeatureProvider = factory.getSuggestionFeatureProvider(context);
|
||||
mCache = new IconCache(context);
|
||||
|
||||
setHasStableIds(true);
|
||||
@@ -120,7 +121,7 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
||||
mSuggestionsShownLogged = savedInstanceState.getStringArrayList(
|
||||
STATE_SUGGESTIONS_SHOWN_LOGGED);
|
||||
} else {
|
||||
mSuggestionsShownLogged = new ArrayList<String>();
|
||||
mSuggestionsShownLogged = new ArrayList<>();
|
||||
}
|
||||
|
||||
mDashboardData = new DashboardData.Builder()
|
||||
@@ -173,11 +174,11 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
||||
}
|
||||
if (shownSuggestions != null) {
|
||||
for (Tile suggestion : shownSuggestions) {
|
||||
String suggestionId = getSuggestionIdentifier(mContext, suggestion);
|
||||
final String identifier = mSuggestionFeatureProvider.getSuggestionIdentifier(
|
||||
mContext, suggestion);
|
||||
mMetricsFeatureProvider.action(
|
||||
mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
|
||||
getSuggestionIdentifier(mContext, suggestion));
|
||||
mSuggestionsShownLogged.add(getSuggestionIdentifier(mContext, suggestion));
|
||||
mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, identifier);
|
||||
mSuggestionsShownLogged.add(identifier);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -237,7 +238,8 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
||||
break;
|
||||
case R.layout.suggestion_tile:
|
||||
final Tile suggestion = (Tile) mDashboardData.getItemEntityByPosition(position);
|
||||
String suggestionId = getSuggestionIdentifier(mContext, suggestion);
|
||||
final String suggestionId = mSuggestionFeatureProvider.getSuggestionIdentifier(
|
||||
mContext, suggestion);
|
||||
// This is for cases when a suggestion is dismissed and the next one comes to view
|
||||
if (!mSuggestionsShownLogged.contains(suggestionId)) {
|
||||
mMetricsFeatureProvider.action(
|
||||
@@ -245,14 +247,10 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
||||
mSuggestionsShownLogged.add(suggestionId);
|
||||
}
|
||||
onBindTile(holder, suggestion);
|
||||
holder.itemView.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
mMetricsFeatureProvider.action(mContext,
|
||||
MetricsEvent.ACTION_SETTINGS_SUGGESTION,
|
||||
DashboardAdapter.getSuggestionIdentifier(mContext, suggestion));
|
||||
((SettingsActivity) mContext).startSuggestion(suggestion.intent);
|
||||
}
|
||||
holder.itemView.setOnClickListener(v -> {
|
||||
mMetricsFeatureProvider.action(mContext,
|
||||
MetricsEvent.ACTION_SETTINGS_SUGGESTION, suggestionId);
|
||||
((SettingsActivity) mContext).startSuggestion(suggestion.intent);
|
||||
});
|
||||
break;
|
||||
case R.layout.condition_card:
|
||||
@@ -260,13 +258,7 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
||||
== mDashboardData.getExpandedCondition();
|
||||
ConditionAdapterUtils.bindViews(
|
||||
(Condition) mDashboardData.getItemEntityByPosition(position),
|
||||
holder, isExpanded, mConditionClickListener,
|
||||
new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
onExpandClick(v);
|
||||
}
|
||||
});
|
||||
holder, isExpanded, mConditionClickListener, v -> onExpandClick(v));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -291,7 +283,8 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
||||
return;
|
||||
}
|
||||
for (Tile suggestion : mDashboardData.getSuggestions()) {
|
||||
String suggestionId = getSuggestionIdentifier(mContext, suggestion);
|
||||
String suggestionId = mSuggestionFeatureProvider.getSuggestionIdentifier(
|
||||
mContext, suggestion);
|
||||
if (mSuggestionsShownLogged.contains(suggestionId)) {
|
||||
mMetricsFeatureProvider.action(
|
||||
mContext, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, suggestionId);
|
||||
@@ -320,16 +313,6 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
||||
return mDashboardData.getItemEntityById(itemId);
|
||||
}
|
||||
|
||||
public static String getSuggestionIdentifier(Context context, Tile suggestion) {
|
||||
String packageName = suggestion.intent.getComponent().getPackageName();
|
||||
if (packageName.equals(context.getPackageName())) {
|
||||
// Since Settings provides several suggestions, fill in the class instead of the
|
||||
// package for these.
|
||||
packageName = suggestion.intent.getComponent().getClassName();
|
||||
}
|
||||
return packageName;
|
||||
}
|
||||
|
||||
private void notifyDashboardDataChanged(DashboardData prevData) {
|
||||
if (mFirstFrameDrawn && prevData != null) {
|
||||
final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DashboardData
|
||||
@@ -394,33 +377,30 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
||||
holder.summary.setText(
|
||||
mContext.getString(R.string.suggestions_summary, undisplayedSuggestionCount));
|
||||
}
|
||||
holder.itemView.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
final int suggestionMode;
|
||||
if (moreSuggestions) {
|
||||
suggestionMode = DashboardData.SUGGESTION_MODE_EXPANDED;
|
||||
holder.itemView.setOnClickListener(v -> {
|
||||
final int suggestionMode;
|
||||
if (moreSuggestions) {
|
||||
suggestionMode = DashboardData.SUGGESTION_MODE_EXPANDED;
|
||||
|
||||
for (Tile suggestion : mDashboardData.getSuggestions()) {
|
||||
String suggestionId =
|
||||
DashboardAdapter.getSuggestionIdentifier(mContext, suggestion);
|
||||
if (!mSuggestionsShownLogged.contains(suggestionId)) {
|
||||
mMetricsFeatureProvider.action(
|
||||
mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
|
||||
suggestionId);
|
||||
mSuggestionsShownLogged.add(suggestionId);
|
||||
}
|
||||
for (Tile suggestion : mDashboardData.getSuggestions()) {
|
||||
final String suggestionId = mSuggestionFeatureProvider.getSuggestionIdentifier(
|
||||
mContext, suggestion);
|
||||
if (!mSuggestionsShownLogged.contains(suggestionId)) {
|
||||
mMetricsFeatureProvider.action(
|
||||
mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
|
||||
suggestionId);
|
||||
mSuggestionsShownLogged.add(suggestionId);
|
||||
}
|
||||
} else {
|
||||
suggestionMode = DashboardData.SUGGESTION_MODE_COLLAPSED;
|
||||
}
|
||||
|
||||
DashboardData prevData = mDashboardData;
|
||||
mDashboardData = new DashboardData.Builder(prevData)
|
||||
.setSuggestionMode(suggestionMode)
|
||||
.build();
|
||||
notifyDashboardDataChanged(prevData);
|
||||
} else {
|
||||
suggestionMode = DashboardData.SUGGESTION_MODE_COLLAPSED;
|
||||
}
|
||||
|
||||
DashboardData prevData = mDashboardData;
|
||||
mDashboardData = new DashboardData.Builder(prevData)
|
||||
.setSuggestionMode(suggestionMode)
|
||||
.build();
|
||||
notifyDashboardDataChanged(prevData);
|
||||
});
|
||||
}
|
||||
|
||||
|
@@ -190,8 +190,7 @@ public class DashboardSummary extends InstrumentedFragment
|
||||
mDashboard.addItemDecoration(new DashboardDecorator(getContext()));
|
||||
mDashboard.setListener(this);
|
||||
Log.d(TAG, "adapter created");
|
||||
mAdapter = new DashboardAdapter(getContext(), mSuggestionParser, mMetricsFeatureProvider,
|
||||
bundle, mConditionManager.getConditions());
|
||||
mAdapter = new DashboardAdapter(getContext(), bundle, mConditionManager.getConditions());
|
||||
mDashboard.setAdapter(mAdapter);
|
||||
mSuggestionDismissHandler = new SuggestionDismissController(
|
||||
getContext(), mDashboard, mSuggestionParser, mAdapter);
|
||||
@@ -245,8 +244,8 @@ public class DashboardSummary extends InstrumentedFragment
|
||||
if (isSmartSuggestionEnabled) {
|
||||
List<String> suggestionIds = new ArrayList<>(suggestions.size());
|
||||
for (Tile suggestion : suggestions) {
|
||||
suggestionIds.add(
|
||||
DashboardAdapter.getSuggestionIdentifier(context, suggestion));
|
||||
suggestionIds.add(mSuggestionFeatureProvider.getSuggestionIdentifier(
|
||||
context, suggestion));
|
||||
}
|
||||
// TODO: create a Suggestion class to maintain the id and other info
|
||||
mSuggestionFeatureProvider.rankSuggestions(suggestions, suggestionIds);
|
||||
|
@@ -49,4 +49,9 @@ public interface SuggestionFeatureProvider {
|
||||
* Dismisses a suggestion.
|
||||
*/
|
||||
void dismissSuggestion(Context context, SuggestionParser parser, Tile suggestion);
|
||||
|
||||
/**
|
||||
* Returns an identifier for the suggestion
|
||||
*/
|
||||
String getSuggestionIdentifier(Context context, Tile suggestion);
|
||||
}
|
||||
|
@@ -21,7 +21,6 @@ import android.content.pm.PackageManager;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
|
||||
import com.android.settings.dashboard.DashboardAdapter;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settingslib.SuggestionParser;
|
||||
import com.android.settingslib.drawer.Tile;
|
||||
@@ -50,9 +49,10 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider
|
||||
|
||||
|
||||
public SuggestionFeatureProviderImpl(Context context) {
|
||||
final Context appContext = context.getApplicationContext();
|
||||
mSuggestionRanker = new SuggestionRanker(
|
||||
new SuggestionFeaturizer(new EventStore(context.getApplicationContext())));
|
||||
mMetricsFeatureProvider = FeatureFactory.getFactory(context)
|
||||
new SuggestionFeaturizer(new EventStore(appContext)));
|
||||
mMetricsFeatureProvider = FeatureFactory.getFactory(appContext)
|
||||
.getMetricsFeatureProvider();
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider
|
||||
}
|
||||
mMetricsFeatureProvider.action(
|
||||
context, MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION,
|
||||
DashboardAdapter.getSuggestionIdentifier(context, suggestion));
|
||||
getSuggestionIdentifier(context, suggestion));
|
||||
|
||||
final boolean isSmartSuggestionEnabled = isSmartSuggestionEnabled(context);
|
||||
if (!parser.dismissSuggestion(suggestion, isSmartSuggestionEnabled)) {
|
||||
@@ -81,4 +81,18 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider
|
||||
parser.markCategoryDone(suggestion.category);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSuggestionIdentifier(Context context, Tile suggestion) {
|
||||
if (suggestion.intent == null || suggestion.intent.getComponent() == null) {
|
||||
return "unknown_suggestion";
|
||||
}
|
||||
String packageName = suggestion.intent.getComponent().getPackageName();
|
||||
if (packageName.equals(context.getPackageName())) {
|
||||
// Since Settings provides several suggestions, fill in the class instead of the
|
||||
// package for these.
|
||||
packageName = suggestion.intent.getComponent().getClassName();
|
||||
}
|
||||
return packageName;
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user