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

Commit 76e8acde authored by Raff Tsai's avatar Raff Tsai
Browse files

Remove old format contextual card log

These logs are replaced by SettingsIntelligenceLogWriter

Test: rebuild
Fixes: 124701288
Change-Id: Id93143a1f291878b7c212c35ed8683ca38d5fe17
parent dc4f7ce2
Loading
Loading
Loading
Loading
+0 −13
Original line number Diff line number Diff line
@@ -20,17 +20,4 @@ import java.util.List;

/** Feature provider for the contextual card feature. */
public interface ContextualCardFeatureProvider {

    /** Homepage displays. */
    void logHomepageDisplay(long latency);

    /** When user clicks dismiss in contextual card */
    void logContextualCardDismiss(ContextualCard card);

    /** After ContextualCardManager decides which cards will be displayed/hidden */
    void logContextualCardDisplay(List<ContextualCard> showedCards,
            List<ContextualCard> hiddenCards);

    /** When user clicks toggle/title area of a contextual card. */
    void logContextualCardClick(ContextualCard card, int sliceRow, int tapTarget, int uiPosition);
}
+0 −149
Original line number Diff line number Diff line
@@ -16,161 +16,12 @@

package com.android.settings.homepage.contextualcards;

import android.annotation.NonNull;
import android.content.Context;
import android.content.Intent;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.VisibleForTesting;
import androidx.slice.widget.EventInfo;

import com.android.settings.R;
import com.android.settings.intelligence.ContextualCardProto.ContextualCardList;

import java.util.List;

public class ContextualCardFeatureProviderImpl implements ContextualCardFeatureProvider {
    private static final String TAG = "ContextualCardFeature";

    // Contextual card interaction logs
    // Settings Homepage shows
    private static final int CONTEXTUAL_HOME_SHOW = 38;

    // Contextual card shows, log card name and rank
    private static final int CONTEXTUAL_CARD_SHOW = 39;

    // Contextual card is dismissed, log card name
    private static final int CONTEXTUAL_CARD_DISMISS = 41;

    // Contextual card is clicked , log card name, score, tap area
    private static final int CONTEXTUAL_CARD_CLICK = 42;

    // SettingsLogBroadcastReceiver contracts
    // contextual card name
    private static final String EXTRA_CONTEXTUALCARD_NAME = "name";

    // contextual card uri
    private static final String EXTRA_CONTEXTUALCARD_URI = "uri";

    // contextual card score
    private static final String EXTRA_CONTEXTUALCARD_SCORE = "score";

    // contextual card clicked row
    private static final String EXTRA_CONTEXTUALCARD_ROW = "row";

    // contextual card tap target
    private static final String EXTRA_CONTEXTUALCARD_TAP_TARGET = "target";

    // contextual card ui position
    private static final String EXTRA_CONTEXTUALCARD_UI_POSTITION = "ui_position";

    // contextual homepage display latency
    private static final String EXTRA_LATENCY = "latency";

    // log type
    private static final String EXTRA_CONTEXTUALCARD_ACTION_TYPE = "type";

    // displayed contextual cards
    private static final String EXTRA_CONTEXTUALCARD_VISIBLE = "visible";

    // hidden contextual cards
    private static final String EXTRA_CONTEXTUALCARD_HIDDEN = "hidden";

    // Contextual card tap target
    private static final int TARGET_DEFAULT = 0;

    // Click title area
    private static final int TARGET_TITLE = 1;

    // Click toggle
    private static final int TARGET_TOGGLE = 2;

    // Click slider
    private static final int TARGET_SLIDER = 3;

    private final Context mContext;

    public ContextualCardFeatureProviderImpl(Context context) {
        mContext = context;
    }

    @Override
    public void logHomepageDisplay(long latency) {
        sendBroadcast(new Intent()
                .putExtra(EXTRA_CONTEXTUALCARD_ACTION_TYPE, CONTEXTUAL_HOME_SHOW)
                .putExtra(EXTRA_LATENCY, latency));
    }

    @Override
    public void logContextualCardDismiss(ContextualCard card) {
        final Intent intent = new Intent();
        intent.putExtra(EXTRA_CONTEXTUALCARD_ACTION_TYPE, CONTEXTUAL_CARD_DISMISS);
        intent.putExtra(EXTRA_CONTEXTUALCARD_NAME, card.getName());
        intent.putExtra(EXTRA_CONTEXTUALCARD_URI, card.getSliceUri().toString());
        intent.putExtra(EXTRA_CONTEXTUALCARD_SCORE, card.getRankingScore());
        sendBroadcast(intent);
    }

    @Override
    public void logContextualCardDisplay(List<ContextualCard> visibleCards,
            List<ContextualCard> hiddenCards) {
        final Intent intent = new Intent();
        intent.putExtra(EXTRA_CONTEXTUALCARD_ACTION_TYPE, CONTEXTUAL_CARD_SHOW);
        intent.putExtra(EXTRA_CONTEXTUALCARD_VISIBLE, serialize(visibleCards));
        intent.putExtra(EXTRA_CONTEXTUALCARD_HIDDEN, serialize(hiddenCards));
        sendBroadcast(intent);
    }

    @Override
    public void logContextualCardClick(ContextualCard card, int row,
            int actionType, int uiPosition) {
        final Intent intent = new Intent();
        intent.putExtra(EXTRA_CONTEXTUALCARD_ACTION_TYPE, CONTEXTUAL_CARD_CLICK);
        intent.putExtra(EXTRA_CONTEXTUALCARD_NAME, card.getName());
        intent.putExtra(EXTRA_CONTEXTUALCARD_URI, card.getSliceUri().toString());
        intent.putExtra(EXTRA_CONTEXTUALCARD_SCORE, card.getRankingScore());
        intent.putExtra(EXTRA_CONTEXTUALCARD_ROW, row);
        intent.putExtra(EXTRA_CONTEXTUALCARD_TAP_TARGET, actionTypeToTapTarget(actionType));
        intent.putExtra(EXTRA_CONTEXTUALCARD_UI_POSTITION, uiPosition);
        sendBroadcast(intent);
    }

    @VisibleForTesting
    void sendBroadcast(final Intent intent) {
        intent.setPackage(mContext.getString(R.string.config_settingsintelligence_package_name));
        final String action = mContext.getString(R.string.config_settingsintelligence_log_action);
        if (!TextUtils.isEmpty(action)) {
            intent.setAction(action);
            mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
        }
    }

    private int actionTypeToTapTarget(int actionType) {
        switch (actionType) {
            case EventInfo.ACTION_TYPE_CONTENT:
                return TARGET_TITLE;
            case EventInfo.ACTION_TYPE_TOGGLE:
                return TARGET_TOGGLE;
            case EventInfo.ACTION_TYPE_SLIDER:
                return TARGET_SLIDER;
            default:
                Log.w(TAG, "unknown type " + actionType);
                return TARGET_DEFAULT;
        }
    }

    @VisibleForTesting
    @NonNull
    byte[] serialize(List<ContextualCard> cards) {
        final ContextualCardList.Builder builder = ContextualCardList.newBuilder();
        cards.stream().forEach(card -> builder.addCard(
                com.android.settings.intelligence.ContextualCardProto.ContextualCard.newBuilder()
                        .setSliceUri(card.getSliceUri().toString())
                        .setCardName(card.getName())
                        .setCardScore(card.getRankingScore())
                        .build()));
        return builder.build().toByteArray();
    }
}
+0 −2
Original line number Diff line number Diff line
@@ -228,8 +228,6 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
        }
        //only log homepage display upon a fresh launch
        final long totalTime = System.currentTimeMillis() - mStartTime;
        FeatureFactory.getFactory(mContext).getContextualCardFeatureProvider(mContext)
                .logHomepageDisplay(totalTime);
        metricsFeatureProvider.action(mContext,
                SettingsEnums.ACTION_CONTEXTUAL_HOME_SHOW, (int) totalTime);

+0 −5
Original line number Diff line number Diff line
@@ -78,11 +78,6 @@
        <item>fake_package/fake_service</item>
    </string-array>

    <!-- Settings intelligence interaction log intent action -->
    <string name="config_settingsintelligence_log_action" translatable="false">
        aaa.bbb.ccc
    </string>

    <!-- List of packages that should be whitelisted for slice uri access. Do not translate -->
    <string-array name="slice_whitelist_package_names" translatable="false">
        <item>com.android.settings.slice_whitelist_package</item>
+0 −102
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.homepage.contextualcards;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.UserHandle;

import com.android.settings.intelligence.ContextualCardProto.ContextualCardList;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;

import java.util.ArrayList;
import java.util.List;

@RunWith(RobolectricTestRunner.class)
public class ContextualCardFeatureProviderImplTest {

    private Context mContext;
    private ContextualCardFeatureProviderImpl mImpl;

    @Before
    public void setUp() {
        mContext = spy(RuntimeEnvironment.application);
        mImpl = new ContextualCardFeatureProviderImpl(mContext);
    }

    @Test
    public void sendBroadcast_emptyAction_notSendBroadcast() {
        final Intent intent = new Intent();
        mImpl.sendBroadcast(intent);

        verify(mContext, never()).sendBroadcastAsUser(intent, UserHandle.CURRENT);
    }

    @Test
    @Config(qualifiers = "mcc999")
    public void sendBroadcast_hasAction_sendBroadcast() {
        final Intent intent = new Intent();
        mImpl.sendBroadcast(intent);

        verify(mContext).sendBroadcastAsUser(intent, UserHandle.CURRENT);
    }

    @Test
    @Config(qualifiers = "mcc999")
    public void logContextualCardDisplay_hasAction_sendBroadcast() {
        mImpl.logContextualCardDisplay(new ArrayList<>(), new ArrayList<>());

        verify(mContext).sendBroadcastAsUser(any(Intent.class), any());
    }

    @Test
    public void serialize_hasSizeTwo_returnSizeTwo() {
        final List<ContextualCard> cards = new ArrayList<>();
        cards.add(new ContextualCard.Builder()
                .setName("name1")
                .setSliceUri(Uri.parse("uri1"))
                .build());
        cards.add(new ContextualCard.Builder()
                .setName("name2")
                .setSliceUri(Uri.parse("uri2"))
                .build());


        final byte[] data = mImpl.serialize(cards);

        try {
            assertThat(ContextualCardList
                    .parseFrom(data).getCardCount()).isEqualTo(cards.size());
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
    }
}
 No newline at end of file
Loading