Loading src/com/android/settings/homepage/contextualcards/CardContentProvider.java +7 −1 Original line number Diff line number Diff line Loading @@ -39,12 +39,18 @@ public class CardContentProvider extends ContentProvider { public static final String CARD_AUTHORITY = "com.android.settings.homepage.CardContentProvider"; public static final Uri URI = new Uri.Builder() public static final Uri REFRESH_CARD_URI = new Uri.Builder() .scheme(ContentResolver.SCHEME_CONTENT) .authority(CardContentProvider.CARD_AUTHORITY) .appendPath(CardDatabaseHelper.CARD_TABLE) .build(); public static final Uri DELETE_CARD_URI = new Uri.Builder() .scheme(ContentResolver.SCHEME_CONTENT) .authority(CardContentProvider.CARD_AUTHORITY) .appendPath(CardDatabaseHelper.CardColumns.CARD_DISMISSED) .build(); private static final String TAG = "CardContentProvider"; /** URI matcher for ContentProvider queries. */ private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); Loading src/com/android/settings/homepage/contextualcards/CardDatabaseHelper.java +2 −2 Original line number Diff line number Diff line Loading @@ -220,7 +220,7 @@ public class CardDatabaseHelper extends SQLiteOpenHelper { final String[] selectionArgs = {cardName}; final int rowsUpdated = database.update(CARD_TABLE, values, selection, selectionArgs); database.close(); context.getContentResolver().notifyChange(CardContentProvider.URI, null); context.getContentResolver().notifyChange(CardContentProvider.DELETE_CARD_URI, null); return rowsUpdated; } } src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java +14 −6 Original line number Diff line number Diff line Loading @@ -59,13 +59,16 @@ public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard> private final ContentObserver mObserver = new ContentObserver( new Handler(Looper.getMainLooper())) { @Override public void onChange(boolean selfChange) { public void onChange(boolean selfChange, Uri uri) { if (isStarted()) { mNotifyUri = uri; forceLoad(); } } }; @VisibleForTesting Uri mNotifyUri; private Context mContext; ContextualCardLoader(Context context) { Loading @@ -77,7 +80,10 @@ public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard> @Override protected void onStartLoading() { super.onStartLoading(); mContext.getContentResolver().registerContentObserver(CardContentProvider.URI, mNotifyUri = null; mContext.getContentResolver().registerContentObserver(CardContentProvider.REFRESH_CARD_URI, false /*notifyForDescendants*/, mObserver); mContext.getContentResolver().registerContentObserver(CardContentProvider.DELETE_CARD_URI, false /*notifyForDescendants*/, mObserver); } Loading Loading @@ -156,12 +162,14 @@ public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard> // Two large cards return visibleCards; } finally { //TODO(b/121196921): Should not call this if user click dismiss if (!CardContentProvider.DELETE_CARD_URI.equals(mNotifyUri)) { final ContextualCardFeatureProvider contextualCardFeatureProvider = FeatureFactory.getFactory(mContext).getContextualCardFeatureProvider(mContext); FeatureFactory.getFactory(mContext) .getContextualCardFeatureProvider(mContext); contextualCardFeatureProvider.logContextualCardDisplay(visibleCards, hiddenCards); } } } @VisibleForTesting Cursor getContextualCardsFromProvider() { Loading src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java +2 −1 Original line number Diff line number Diff line Loading @@ -118,7 +118,8 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, Life sliceLiveData.observe(mLifecycleOwner, slice -> { if (slice == null) { Log.w(TAG, "Slice is null"); mContext.getContentResolver().notifyChange(CardContentProvider.URI, null); mContext.getContentResolver().notifyChange(CardContentProvider.REFRESH_CARD_URI, null); return; } else { //TODO(b/120629936): Take this out once blank card issue is fixed. Loading tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java +25 −0 Original line number Diff line number Diff line Loading @@ -24,7 +24,9 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import android.content.Context; import android.net.Uri; Loading @@ -33,6 +35,7 @@ import androidx.slice.Slice; import com.android.settings.R; import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.testutils.FakeFeatureFactory; import org.junit.Before; import org.junit.Test; Loading @@ -52,6 +55,7 @@ public class ContextualCardLoaderTest { private Context mContext; private ContextualCardLoader mContextualCardLoader; private EligibleCardChecker mEligibleCardChecker; private FakeFeatureFactory mFakeFeatureFactory; @Before public void setUp() { Loading @@ -59,6 +63,7 @@ public class ContextualCardLoaderTest { mContextualCardLoader = spy(new ContextualCardLoader(mContext)); mEligibleCardChecker = spy(new EligibleCardChecker(mContext, getContextualCard(TEST_SLICE_URI))); mFakeFeatureFactory = FakeFeatureFactory.setupForTest(); } @Test Loading Loading @@ -158,6 +163,26 @@ public class ContextualCardLoaderTest { assertThat(mContextualCardLoader.loadInBackground()).isEmpty(); } @Test public void getDisplayableCards_refreshCardUri_shouldLogContextualCardDisplay() { mContextualCardLoader.mNotifyUri = CardContentProvider.REFRESH_CARD_URI; mContextualCardLoader.getDisplayableCards(new ArrayList<ContextualCard>()); verify(mFakeFeatureFactory.mContextualCardFeatureProvider).logContextualCardDisplay( any(List.class), any(List.class)); } @Test public void getDisplayableCards_deleteCardUri_shouldNotLogContextualCardDisplay() { mContextualCardLoader.mNotifyUri = CardContentProvider.DELETE_CARD_URI; mContextualCardLoader.getDisplayableCards(new ArrayList<ContextualCard>()); verify(mFakeFeatureFactory.mContextualCardFeatureProvider, never()) .logContextualCardDisplay(any(List.class), any(List.class)); } private ContextualCard getContextualCard(String sliceUri) { return new ContextualCard.Builder() .setName("test_card") Loading Loading
src/com/android/settings/homepage/contextualcards/CardContentProvider.java +7 −1 Original line number Diff line number Diff line Loading @@ -39,12 +39,18 @@ public class CardContentProvider extends ContentProvider { public static final String CARD_AUTHORITY = "com.android.settings.homepage.CardContentProvider"; public static final Uri URI = new Uri.Builder() public static final Uri REFRESH_CARD_URI = new Uri.Builder() .scheme(ContentResolver.SCHEME_CONTENT) .authority(CardContentProvider.CARD_AUTHORITY) .appendPath(CardDatabaseHelper.CARD_TABLE) .build(); public static final Uri DELETE_CARD_URI = new Uri.Builder() .scheme(ContentResolver.SCHEME_CONTENT) .authority(CardContentProvider.CARD_AUTHORITY) .appendPath(CardDatabaseHelper.CardColumns.CARD_DISMISSED) .build(); private static final String TAG = "CardContentProvider"; /** URI matcher for ContentProvider queries. */ private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); Loading
src/com/android/settings/homepage/contextualcards/CardDatabaseHelper.java +2 −2 Original line number Diff line number Diff line Loading @@ -220,7 +220,7 @@ public class CardDatabaseHelper extends SQLiteOpenHelper { final String[] selectionArgs = {cardName}; final int rowsUpdated = database.update(CARD_TABLE, values, selection, selectionArgs); database.close(); context.getContentResolver().notifyChange(CardContentProvider.URI, null); context.getContentResolver().notifyChange(CardContentProvider.DELETE_CARD_URI, null); return rowsUpdated; } }
src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java +14 −6 Original line number Diff line number Diff line Loading @@ -59,13 +59,16 @@ public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard> private final ContentObserver mObserver = new ContentObserver( new Handler(Looper.getMainLooper())) { @Override public void onChange(boolean selfChange) { public void onChange(boolean selfChange, Uri uri) { if (isStarted()) { mNotifyUri = uri; forceLoad(); } } }; @VisibleForTesting Uri mNotifyUri; private Context mContext; ContextualCardLoader(Context context) { Loading @@ -77,7 +80,10 @@ public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard> @Override protected void onStartLoading() { super.onStartLoading(); mContext.getContentResolver().registerContentObserver(CardContentProvider.URI, mNotifyUri = null; mContext.getContentResolver().registerContentObserver(CardContentProvider.REFRESH_CARD_URI, false /*notifyForDescendants*/, mObserver); mContext.getContentResolver().registerContentObserver(CardContentProvider.DELETE_CARD_URI, false /*notifyForDescendants*/, mObserver); } Loading Loading @@ -156,12 +162,14 @@ public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard> // Two large cards return visibleCards; } finally { //TODO(b/121196921): Should not call this if user click dismiss if (!CardContentProvider.DELETE_CARD_URI.equals(mNotifyUri)) { final ContextualCardFeatureProvider contextualCardFeatureProvider = FeatureFactory.getFactory(mContext).getContextualCardFeatureProvider(mContext); FeatureFactory.getFactory(mContext) .getContextualCardFeatureProvider(mContext); contextualCardFeatureProvider.logContextualCardDisplay(visibleCards, hiddenCards); } } } @VisibleForTesting Cursor getContextualCardsFromProvider() { Loading
src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java +2 −1 Original line number Diff line number Diff line Loading @@ -118,7 +118,8 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, Life sliceLiveData.observe(mLifecycleOwner, slice -> { if (slice == null) { Log.w(TAG, "Slice is null"); mContext.getContentResolver().notifyChange(CardContentProvider.URI, null); mContext.getContentResolver().notifyChange(CardContentProvider.REFRESH_CARD_URI, null); return; } else { //TODO(b/120629936): Take this out once blank card issue is fixed. Loading
tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java +25 −0 Original line number Diff line number Diff line Loading @@ -24,7 +24,9 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import android.content.Context; import android.net.Uri; Loading @@ -33,6 +35,7 @@ import androidx.slice.Slice; import com.android.settings.R; import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.testutils.FakeFeatureFactory; import org.junit.Before; import org.junit.Test; Loading @@ -52,6 +55,7 @@ public class ContextualCardLoaderTest { private Context mContext; private ContextualCardLoader mContextualCardLoader; private EligibleCardChecker mEligibleCardChecker; private FakeFeatureFactory mFakeFeatureFactory; @Before public void setUp() { Loading @@ -59,6 +63,7 @@ public class ContextualCardLoaderTest { mContextualCardLoader = spy(new ContextualCardLoader(mContext)); mEligibleCardChecker = spy(new EligibleCardChecker(mContext, getContextualCard(TEST_SLICE_URI))); mFakeFeatureFactory = FakeFeatureFactory.setupForTest(); } @Test Loading Loading @@ -158,6 +163,26 @@ public class ContextualCardLoaderTest { assertThat(mContextualCardLoader.loadInBackground()).isEmpty(); } @Test public void getDisplayableCards_refreshCardUri_shouldLogContextualCardDisplay() { mContextualCardLoader.mNotifyUri = CardContentProvider.REFRESH_CARD_URI; mContextualCardLoader.getDisplayableCards(new ArrayList<ContextualCard>()); verify(mFakeFeatureFactory.mContextualCardFeatureProvider).logContextualCardDisplay( any(List.class), any(List.class)); } @Test public void getDisplayableCards_deleteCardUri_shouldNotLogContextualCardDisplay() { mContextualCardLoader.mNotifyUri = CardContentProvider.DELETE_CARD_URI; mContextualCardLoader.getDisplayableCards(new ArrayList<ContextualCard>()); verify(mFakeFeatureFactory.mContextualCardFeatureProvider, never()) .logContextualCardDisplay(any(List.class), any(List.class)); } private ContextualCard getContextualCard(String sliceUri) { return new ContextualCard.Builder() .setName("test_card") Loading