Implemented the CardContentLoader
- Implemented the CardContentLoader
- Refactored the CardLoader and increased the code readable
- Added try-with-resource
- Removed all custom card codes
- Modified ContextualCardManager to add CardContentLoaderCallbacks
Bug: 112521307
Test: robotest
Change-Id: Ieb9cdeaacdfb8fdae9747c60395206d15af034c1
diff --git a/src/com/android/settings/homepage/CardContentLoader.java b/src/com/android/settings/homepage/CardContentLoader.java
index 47ba59a..2a2ebad 100644
--- a/src/com/android/settings/homepage/CardContentLoader.java
+++ b/src/com/android/settings/homepage/CardContentLoader.java
@@ -17,46 +17,58 @@
package com.android.settings.homepage;
import android.content.Context;
+import android.database.Cursor;
import androidx.annotation.Nullable;
import com.android.settingslib.utils.AsyncLoaderCompat;
+import java.util.ArrayList;
import java.util.List;
-//TODO(b/112521307): Implement this to make it work with the card database.
-public class CardContentLoader {
+public class CardContentLoader extends AsyncLoaderCompat<List<ContextualCard>> {
+ static final int CARD_CONTENT_LOADER_ID = 1;
- private static final String TAG = "CardContentLoader";
-
- private CardContentLoaderListener mListener;
+ private Context mContext;
public interface CardContentLoaderListener {
void onFinishCardLoading(List<ContextualCard> contextualCards);
}
- public CardContentLoader() {
+ CardContentLoader(Context context) {
+ super(context);
+ mContext = context.getApplicationContext();
}
- void setListener(CardContentLoaderListener listener) {
- mListener = listener;
+ @Override
+ protected void onDiscardResult(List<ContextualCard> result) {
+
}
- private static class CardLoader extends AsyncLoaderCompat<List<ContextualCard>> {
-
- public CardLoader(Context context) {
- super(context);
+ @Nullable
+ @Override
+ public List<ContextualCard> loadInBackground() {
+ List<ContextualCard> result;
+ try (Cursor cursor = CardDatabaseHelper.getInstance(mContext).getAllContextualCards()) {
+ if (cursor.getCount() == 0) {
+ //TODO(b/113372471): Load Default static cards and return 3 static cards
+ return new ArrayList<>();
+ }
+ result = buildContextualCardList(cursor);
}
+ return result;
+ }
- @Override
- protected void onDiscardResult(List<ContextualCard> result) {
-
+ private List<ContextualCard> buildContextualCardList(Cursor cursor) {
+ final List<ContextualCard> result = new ArrayList<>();
+ 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);
+ }
}
-
- @Nullable
- @Override
- public List<ContextualCard> loadInBackground() {
- return null;
- }
+ return result;
}
}
diff --git a/src/com/android/settings/homepage/CardDatabaseHelper.java b/src/com/android/settings/homepage/CardDatabaseHelper.java
index 382b71f..f0a3471 100644
--- a/src/com/android/settings/homepage/CardDatabaseHelper.java
+++ b/src/com/android/settings/homepage/CardDatabaseHelper.java
@@ -17,6 +17,7 @@
package com.android.settings.homepage;
import android.content.Context;
+import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
@@ -190,4 +191,12 @@
}
return sCardDatabaseHelper;
}
+
+ Cursor getAllContextualCards() {
+ final SQLiteDatabase db = this.getReadableDatabase();
+ Cursor cursor = db.query(CARD_TABLE, null /* columns */, null /* selection */,
+ null /* selectionArgs */, null /* groupBy */, null /* having */,
+ null /* orderBy */);
+ return cursor;
+ }
}
diff --git a/src/com/android/settings/homepage/ContextualCard.java b/src/com/android/settings/homepage/ContextualCard.java
index f5083d8..174a437 100644
--- a/src/com/android/settings/homepage/ContextualCard.java
+++ b/src/com/android/settings/homepage/ContextualCard.java
@@ -17,6 +17,7 @@
package com.android.settings.homepage;
import android.annotation.IntDef;
+import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.text.TextUtils;
@@ -58,8 +59,8 @@
private final int mIconResId;
private final int mCardAction;
private final long mExpireTimeMS;
- private final Drawable mIconDrawable;
private final boolean mIsHalfWidth;
+ private final Drawable mIconDrawable;
String getName() {
return mName;
@@ -137,6 +138,10 @@
return mIsHalfWidth;
}
+ boolean isCustomCard() {
+ return TextUtils.isEmpty(mSliceUri);
+ }
+
public ContextualCard(Builder builder) {
mName = builder.mName;
mCardType = builder.mCardType;
@@ -158,6 +163,31 @@
mIsHalfWidth = builder.mIsHalfWidth;
}
+ ContextualCard(Cursor c) {
+ mName = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.NAME));
+ mCardType = c.getInt(c.getColumnIndex(CardDatabaseHelper.CardColumns.TYPE));
+ mRankingScore = c.getDouble(c.getColumnIndex(CardDatabaseHelper.CardColumns.SCORE));
+ mSliceUri = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.SLICE_URI));
+ mCategory = c.getInt(c.getColumnIndex(CardDatabaseHelper.CardColumns.CATEGORY));
+ mLocalizedToLocale = c.getString(
+ c.getColumnIndex(CardDatabaseHelper.CardColumns.LOCALIZED_TO_LOCALE));
+ mPackageName = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.PACKAGE_NAME));
+ mAppVersion = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.APP_VERSION));
+ mTitleResName = c.getString(
+ c.getColumnIndex(CardDatabaseHelper.CardColumns.TITLE_RES_NAME));
+ mTitleText = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.TITLE_TEXT));
+ mSummaryResName = c.getString(
+ c.getColumnIndex(CardDatabaseHelper.CardColumns.SUMMARY_RES_NAME));
+ mSummaryText = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.SUMMARY_TEXT));
+ mIconResName = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.ICON_RES_NAME));
+ mIconResId = c.getInt(c.getColumnIndex(CardDatabaseHelper.CardColumns.ICON_RES_ID));
+ mCardAction = c.getInt(c.getColumnIndex(CardDatabaseHelper.CardColumns.CARD_ACTION));
+ mExpireTimeMS = c.getLong(c.getColumnIndex(CardDatabaseHelper.CardColumns.EXPIRE_TIME_MS));
+ mIsHalfWidth = (c.getInt(
+ c.getColumnIndex(CardDatabaseHelper.CardColumns.SUPPORT_HALF_WIDTH)) == 1);
+ mIconDrawable = null;
+ }
+
@Override
public int hashCode() {
return mName.hashCode();
diff --git a/src/com/android/settings/homepage/ContextualCardManager.java b/src/com/android/settings/homepage/ContextualCardManager.java
index aa2f576..df20a6c 100644
--- a/src/com/android/settings/homepage/ContextualCardManager.java
+++ b/src/com/android/settings/homepage/ContextualCardManager.java
@@ -16,9 +16,17 @@
package com.android.settings.homepage;
+import static com.android.settings.homepage.CardContentLoader.CARD_CONTENT_LOADER_ID;
+
import android.content.Context;
+import android.os.Bundle;
import android.widget.BaseAdapter;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.loader.app.LoaderManager;
+import androidx.loader.content.Loader;
+
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
@@ -60,9 +68,12 @@
mControllerRendererPool = new ControllerRendererPool();
}
- void startCardContentLoading() {
- final CardContentLoader cardContentLoader = new CardContentLoader();
- cardContentLoader.setListener(this);
+ void startCardContentLoading(PersonalSettingsFragment fragment) {
+ final CardContentLoaderCallbacks cardContentLoaderCallbacks =
+ new CardContentLoaderCallbacks(mContext);
+ cardContentLoaderCallbacks.setListener(this);
+ LoaderManager.getInstance(fragment).initLoader(CARD_CONTENT_LOADER_ID, null /* bundle */,
+ cardContentLoaderCallbacks);
}
private void loadCardControllers() {
@@ -140,4 +151,43 @@
public ControllerRendererPool getControllerRendererPool() {
return mControllerRendererPool;
}
+
+
+ static class CardContentLoaderCallbacks implements
+ LoaderManager.LoaderCallbacks<List<ContextualCard>> {
+
+ private Context mContext;
+ private CardContentLoader.CardContentLoaderListener mListener;
+
+ CardContentLoaderCallbacks(Context context) {
+ mContext = context.getApplicationContext();
+ }
+
+ protected void setListener(CardContentLoader.CardContentLoaderListener listener) {
+ mListener = listener;
+ }
+
+ @NonNull
+ @Override
+ public Loader<List<ContextualCard>> onCreateLoader(int id, @Nullable Bundle bundle) {
+ if (id == CARD_CONTENT_LOADER_ID) {
+ return new CardContentLoader(mContext);
+ } else {
+ throw new IllegalArgumentException("Unknown loader id: " + id);
+ }
+ }
+
+ @Override
+ public void onLoadFinished(@NonNull Loader<List<ContextualCard>> loader,
+ List<ContextualCard> contextualCards) {
+ if (mListener != null) {
+ mListener.onFinishCardLoading(contextualCards);
+ }
+ }
+
+ @Override
+ public void onLoaderReset(@NonNull Loader<List<ContextualCard>> loader) {
+
+ }
+ }
}
diff --git a/src/com/android/settings/homepage/PersonalSettingsFragment.java b/src/com/android/settings/homepage/PersonalSettingsFragment.java
index 2eb9663..da41cd7 100644
--- a/src/com/android/settings/homepage/PersonalSettingsFragment.java
+++ b/src/com/android/settings/homepage/PersonalSettingsFragment.java
@@ -43,7 +43,7 @@
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContextualCardManager = new ContextualCardManager(getContext(), getSettingsLifecycle());
- mContextualCardManager.startCardContentLoading();
+ mContextualCardManager.startCardContentLoading(this);
}
@Override