Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3881e298 authored by Raff Tsai's avatar Raff Tsai
Browse files

Do not log Contextual card display when card is dismissed

If the db change comes from dismiss card uri. We don't
need to log card display again.

Fixes: 121196921
Test: Robolectric
Change-Id: I4e222187fafa8325e803fa6ee17ebb0b51fb8cb2
parent d5a04e19
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -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);
+2 −2
Original line number Diff line number Diff line
@@ -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;
    }
}
+14 −6
Original line number Diff line number Diff line
@@ -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) {
@@ -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);
    }

@@ -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() {
+2 −1
Original line number Diff line number Diff line
@@ -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.
+25 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -52,6 +55,7 @@ public class ContextualCardLoaderTest {
    private Context mContext;
    private ContextualCardLoader mContextualCardLoader;
    private EligibleCardChecker mEligibleCardChecker;
    private FakeFeatureFactory mFakeFeatureFactory;

    @Before
    public void setUp() {
@@ -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
@@ -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