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

Commit 1f477fb2 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Updates reportChooserSelection to be synchronized with queryUsageStats...

Merge "Updates reportChooserSelection to be synchronized with queryUsageStats in UsageStatsService, to fix a flaky test." into oc-dev
parents 8f395a16 7c37964c
Loading
Loading
Loading
Loading
+0 −31
Original line number Diff line number Diff line
@@ -153,22 +153,6 @@ public class ChooserActivityTest {
        assertThat(activity.getIsSelected(), is(true));
    }

    @Test
    public void reportChooserSelection() throws InterruptedException {
        Intent sendIntent = createSendImageIntent();
        final ChooserWrapperActivity activity = mActivityRule
                .launchActivity(Intent.createChooser(sendIntent, null));
        waitForIdle();
        UsageStatsManager usm = activity.getUsageStatsManager();
        String packageName = "test_package";
        String action = "test_action";
        String annotation = "test_annotation";
        long beforeReport = getCount(usm, packageName, action, annotation);
        usm.reportChooserSelection(packageName, activity.getUserId(), annotation, null, action);
        long afterReport = getCount(usm, packageName, action, annotation);
        assertThat(afterReport, is(beforeReport + 1l));
    }

    @Test
    public void noResultsFromPackageManager() {
        when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
@@ -356,19 +340,4 @@ public class ChooserActivityTest {
    private void waitForIdle() {
        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
    }

    private Integer getCount(
            UsageStatsManager usm, String packageName, String action, String annotation) {
        if (usm == null) {
            return 0;
        }
        Map<String, UsageStats> stats =
                usm.queryAndAggregateUsageStats(Long.MIN_VALUE, Long.MAX_VALUE);
        UsageStats packageStats = stats.get(packageName);
        if (packageStats == null || packageStats.mChooserCounts == null
                || packageStats.mChooserCounts.get(action) == null) {
            return 0;
        }
        return packageStats.mChooserCounts.get(action).getOrDefault(annotation, 0);
    }
}
 No newline at end of file
+162 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 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.internal.app;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.when;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.mockito.invocation.InvocationOnMock;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.stubbing.Answer;

import android.app.usage.IUsageStatsManager;
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.Intent;
import android.os.RemoteException;
import android.os.UserHandle;
import android.support.test.runner.AndroidJUnit4;
import android.util.ArrayMap;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

/**
 * ResolverListController Test.
 */
@RunWith(AndroidJUnit4.class)
public class ResolverListControllerTest {

    @Mock private Context mMockContext;
    @Mock private PackageManager mMockPackageManager;
    @Mock private Resources mMockResources;
    @Mock private IUsageStatsManager mMockService;

    private ResolverListController mController;
    private UsageStatsManager mUsm;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        Configuration config = new Configuration();
        config.locale = Locale.getDefault();
        List<ResolveInfo> services = new ArrayList<>();
        when(mMockPackageManager.queryIntentServices(any(), anyInt())).thenReturn(services);
        when(mMockResources.getConfiguration()).thenReturn(config);
        when(mMockContext.getResources()).thenReturn(mMockResources);
        when(mMockContext.getPackageName()).thenReturn("android");
        when(mMockContext.getUserId()).thenReturn(54321);
        when(mMockContext.getSharedPreferences(anyString(), anyInt())).thenReturn(null);
        when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager);
    }

    @Test
    public void reportChooserSelection() throws InterruptedException, RemoteException {
        String annotation = "test_annotation";
        Intent sendIntent = createSendImageIntent(annotation);
        String refererPackage = "test_referer_package";
        String packageName = "test_package";
        String action = "test_action";
        final int initialCount = 1234;
        UsageStats packageStats = initStats(packageName, action, annotation, initialCount);
        UsageStats oneClickStats = initStats(packageName, action, annotation, 1);
        final List<UsageStats> slices = new ArrayList<>();
        slices.add(packageStats);
        ParceledListSlice<UsageStats> stats = new ParceledListSlice<>(slices);
        when(mMockService.queryUsageStats(anyInt(), anyLong(), anyLong(), anyString()))
                .thenReturn(stats);
        Answer<Void> answer = new Answer<Void>() {
            @Override
            public Void answer(InvocationOnMock invocation) throws Throwable {
                slices.add(oneClickStats);
                return null;
            }
        };
        doAnswer(answer).when(mMockService).reportChooserSelection(
                anyString(), anyInt(), anyString(), any(), anyString());
        when(mMockContext.getOpPackageName()).thenReturn(refererPackage);
        mUsm = new UsageStatsManager(mMockContext, mMockService);
        when(mMockContext.getSystemService(Context.USAGE_STATS_SERVICE)).thenReturn(mUsm);
        mController = new ResolverListController(mMockContext, mMockPackageManager, sendIntent,
                refererPackage, UserHandle.USER_CURRENT);
        mController.sort(new ArrayList<ResolverActivity.ResolvedComponentInfo>());
        long beforeReport = getCount(mUsm, packageName, action, annotation);
        mController.updateChooserCounts(packageName, UserHandle.USER_CURRENT, action);
        long afterReport = getCount(mUsm, packageName, action, annotation);
        assertThat(afterReport, is(beforeReport + 1l));
    }

    private UsageStats initStats(String packageName, String action,
                                 String annotation, int count) {
        ArrayMap<String, ArrayMap<String, Integer>> chooserCounts = new ArrayMap<>();
        ArrayMap<String, Integer> counts = new ArrayMap<>();
        counts.put(annotation, count);
        chooserCounts.put(action, counts);
        UsageStats packageStats = new UsageStats();
        packageStats.mPackageName = packageName;
        packageStats.mChooserCounts = chooserCounts;
        return packageStats;
    }

    private Intent createSendImageIntent(String annotation) {
        Intent sendIntent = new Intent();
        sendIntent.setAction(Intent.ACTION_SEND);
        sendIntent.putExtra(Intent.EXTRA_TEXT, "testing intent sending");
        sendIntent.setType("image/jpeg");
        ArrayList<String> annotations = new ArrayList<>();
        annotations.add(annotation);
        sendIntent.putStringArrayListExtra(Intent.EXTRA_CONTENT_ANNOTATIONS, annotations);
        return sendIntent;
    }

    private Integer getCount(
            UsageStatsManager usm, String packageName, String action, String annotation) {
        if (usm == null) {
            return 0;
        }
        Map<String, UsageStats> stats =
                usm.queryAndAggregateUsageStats(Long.MIN_VALUE, Long.MAX_VALUE);
        UsageStats packageStats = stats.get(packageName);
        if (packageStats == null || packageStats.mChooserCounts == null
                || packageStats.mChooserCounts.get(action) == null) {
            return 0;
        }
        return packageStats.mChooserCounts.get(action).getOrDefault(annotation, 0);
    }
}
 No newline at end of file