Add a filter to take out unnecessary homepage data.

After getting the full list from CardContentProvider, at render side
(Settings side) we should perform final filtering to filter out those
data that are not applicable at that moment. Apart from that, we should
also perform slice URI check in this stage to take out invalid slices.

Bug: 116063073
Test: robotests
Change-Id: Idfa94ec6176a9d9cb3379543e0a23858941af742
This commit is contained in:
Emily Chuang
2018-10-01 19:21:23 +08:00
parent bf421af90f
commit 9f25efc4d8
3 changed files with 179 additions and 104 deletions

View File

@@ -16,13 +16,21 @@
package com.android.settings.homepage;
import static android.app.slice.Slice.HINT_ERROR;
import static androidx.slice.widget.SliceLiveData.SUPPORTED_SPECS;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.slice.Slice;
import com.android.settings.homepage.deviceinfo.DataUsageSlice;
import com.android.settings.homepage.deviceinfo.DeviceInfoSlice;
@@ -30,6 +38,7 @@ import com.android.settingslib.utils.AsyncLoaderCompat;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class CardContentLoader extends AsyncLoaderCompat<List<ContextualCard>> {
private static final String TAG = "CardContentLoader";
@@ -58,18 +67,18 @@ public class CardContentLoader extends AsyncLoaderCompat<List<ContextualCard>> {
try (Cursor cursor = getContextualCardsFromProvider()) {
if (cursor.getCount() == 0) {
result.addAll(createStaticCards());
return result;
}
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
final ContextualCard card = new ContextualCard(cursor);
if (card.isCustomCard()) {
//TODO(b/114688391): Load and generate custom card,then add into list
} else {
result.add(card);
} else {
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
final ContextualCard card = new ContextualCard(cursor);
if (card.isCustomCard()) {
//TODO(b/114688391): Load and generate custom card,then add into list
} else {
result.add(card);
}
}
}
}
return result;
return filter(result);
}
@VisibleForTesting
@@ -94,15 +103,15 @@ public class CardContentLoader extends AsyncLoaderCompat<List<ContextualCard>> {
.build());
//TODO(b/115971399): Will change following values of SliceUri and Name
// after landing these slice cards.
add(new ContextualCard.Builder()
.setSliceUri("content://com.android.settings.slices/intent/battery_card")
.setName(packageName + "/" + "battery_card")
.setPackageName(packageName)
.setRankingScore(rankingScore)
.setAppVersion(appVersionCode)
.setCardType(ContextualCard.CardType.SLICE)
.setIsHalfWidth(true)
.build());
// add(new ContextualCard.Builder()
// .setSliceUri("content://com.android.settings.slices/battery_card")
// .setName(packageName + "/" + "battery_card")
// .setPackageName(packageName)
// .setRankingScore(rankingScore)
// .setAppVersion(appVersionCode)
// .setCardType(ContextualCard.CardType.SLICE)
// .setIsHalfWidth(true)
// .build());
add(new ContextualCard.Builder()
.setSliceUri(DeviceInfoSlice.DEVICE_INFO_CARD_URI.toString())
.setName(packageName + "/" + DeviceInfoSlice.PATH_DEVICE_INFO_CARD)
@@ -116,6 +125,41 @@ public class CardContentLoader extends AsyncLoaderCompat<List<ContextualCard>> {
return result;
}
@VisibleForTesting
List<ContextualCard> filter(List<ContextualCard> candidates) {
return candidates.stream().filter(card -> isCardEligibleToDisplay(card)).collect(
Collectors.toList());
}
@VisibleForTesting
boolean isCardEligibleToDisplay(ContextualCard card) {
if (card.isCustomCard()) {
return true;
}
final Uri uri = card.getSliceUri();
if (!ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
return false;
}
//check if the uri has a provider associated with.
final ContentProviderClient provider =
mContext.getContentResolver().acquireContentProviderClient(uri);
if (provider == null) {
return false;
}
//release contentProviderClient to prevent from memory leak.
provider.release();
final Slice slice = Slice.bindSlice(mContext, uri, SUPPORTED_SPECS);
if (slice == null || slice.hasHint(HINT_ERROR)) {
return false;
}
return true;
}
private long getAppVersionCode() {
try {
return mContext.getPackageManager().getPackageInfo(mContext.getPackageName(),