diff --git a/src/com/android/settings/homepage/CardContentLoader.java b/src/com/android/settings/homepage/CardContentLoader.java index 47ba59afe8e..2a2ebad6f58 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> { + 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 contextualCards); } - public CardContentLoader() { + CardContentLoader(Context context) { + super(context); + mContext = context.getApplicationContext(); } - void setListener(CardContentLoaderListener listener) { - mListener = listener; + @Override + protected void onDiscardResult(List result) { + } - private static class CardLoader extends AsyncLoaderCompat> { - - public CardLoader(Context context) { - super(context); + @Nullable + @Override + public List loadInBackground() { + List 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 result) { - - } - - @Nullable - @Override - public List loadInBackground() { - return null; + private List buildContextualCardList(Cursor cursor) { + final List 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); + } } + return result; } } diff --git a/src/com/android/settings/homepage/CardDatabaseHelper.java b/src/com/android/settings/homepage/CardDatabaseHelper.java index 382b71f7919..f0a347187ae 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 @@ public class CardDatabaseHelper extends SQLiteOpenHelper { } 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 f5083d80e6c..174a4372078 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 @@ public class ContextualCard { 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 @@ public class ContextualCard { return mIsHalfWidth; } + boolean isCustomCard() { + return TextUtils.isEmpty(mSliceUri); + } + public ContextualCard(Builder builder) { mName = builder.mName; mCardType = builder.mCardType; @@ -158,6 +163,31 @@ public class ContextualCard { 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 aa2f576ef11..df20a6c2a4a 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 @@ public class ContextualCardManager implements CardContentLoader.CardContentLoade 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 class ContextualCardManager implements CardContentLoader.CardContentLoade public ControllerRendererPool getControllerRendererPool() { return mControllerRendererPool; } + + + static class CardContentLoaderCallbacks implements + LoaderManager.LoaderCallbacks> { + + 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> 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> loader, + List contextualCards) { + if (mListener != null) { + mListener.onFinishCardLoading(contextualCards); + } + } + + @Override + public void onLoaderReset(@NonNull Loader> loader) { + + } + } } diff --git a/src/com/android/settings/homepage/PersonalSettingsFragment.java b/src/com/android/settings/homepage/PersonalSettingsFragment.java index 2eb9663cfda..da41cd72f68 100644 --- a/src/com/android/settings/homepage/PersonalSettingsFragment.java +++ b/src/com/android/settings/homepage/PersonalSettingsFragment.java @@ -43,7 +43,7 @@ public class PersonalSettingsFragment extends InstrumentedFragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContextualCardManager = new ContextualCardManager(getContext(), getSettingsLifecycle()); - mContextualCardManager.startCardContentLoading(); + mContextualCardManager.startCardContentLoading(this); } @Override