Adds tests for b/34095835.

Bug: 34095835

Test: reproduced the bug in b/34095835 to ensure that it is covered by
the test. Manually ran the tests.

Change-Id: I28a887341906dc443e1a854ddba51cd1b4daeead
This commit is contained in:
Kang Li
2017-01-05 17:30:06 -08:00
parent ed76b34c42
commit 64b018e0eb
5 changed files with 95 additions and 8 deletions

View File

@@ -99,7 +99,7 @@ public class ChooserActivity extends ResolverActivity {
private Intent mReferrerFillInIntent;
private long mChooserShownTime;
private boolean mIsSuccessfullySelected;
protected boolean mIsSuccessfullySelected;
private ChooserListAdapter mChooserListAdapter;
private ChooserRowAdapter mChooserRowAdapter;
@@ -418,7 +418,7 @@ public class ChooserActivity extends ResolverActivity {
}
}
}
updateChooserCounts(target, mContentType);
updateChooserCounts(target);
return super.onTargetSelected(target, alwaysCheck);
}
@@ -575,7 +575,7 @@ public class ChooserActivity extends ResolverActivity {
// Do nothing. We'll send the voice stuff ourselves.
}
void updateChooserCounts(TargetInfo info, String annotation) {
void updateChooserCounts(TargetInfo info) {
if (info != null) {
UsageStatsManager usageStatsManager =
(UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
@@ -586,14 +586,17 @@ public class ChooserActivity extends ResolverActivity {
return;
}
final ResolveInfo ri = info.getResolveInfo();
if (ri != null && ri.activityInfo != null) {
Intent targetIntent = getTargetIntent();
if (ri != null && ri.activityInfo != null && targetIntent != null) {
usageStatsManager.reportChooserSelection(ri.activityInfo.packageName, getUserId(),
annotation, null, info.getResolvedIntent().getAction());
targetIntent.getType(), null, targetIntent.getAction());
if (mAdapter != null) {
mAdapter.updateModel(info.getResolvedComponentName());
}
if (DEBUG) {
Log.d(TAG, "ResolveInfo Package is" + ri.activityInfo.packageName);
Log.d(TAG, "ResolveInfo Package is " + ri.activityInfo.packageName);
Log.d(TAG, "Annotation to be updated is " + targetIntent.getType());
Log.d(TAG, "Action to be updated is " + targetIntent.getAction());
}
} else if(DEBUG) {
Log.d(TAG, "Can not log Chooser Counts of null ResovleInfo");
@@ -615,7 +618,7 @@ public class ChooserActivity extends ResolverActivity {
} else {
TargetInfo clonedTarget = selectedTarget.cloneFilledIn(matchingIntent, 0);
if (super.onTargetSelected(clonedTarget, false)) {
updateChooserCounts(clonedTarget, mContentType);
updateChooserCounts(clonedTarget);
finish();
return;
}

View File

@@ -110,7 +110,6 @@ public class ResolverActivity extends Activity {
private int mDefaultTitleResId;
protected ResolverDrawerLayout mResolverDrawerLayout;
protected String mContentType;
protected PackageManager mPm;
protected int mLaunchedFromUid;

View File

@@ -85,6 +85,8 @@
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
<!-- location test permissions -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>

View File

@@ -25,14 +25,18 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.os.UserHandle;
import android.support.test.InstrumentationRegistry;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
@@ -45,6 +49,8 @@ import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.times;
/**
* Chooser activity instrumentation tests
@@ -114,6 +120,56 @@ public class ChooserActivityTest {
assertThat(chosen[0], is(toChoose));
}
@Test
public void updateChooserCountsAfterUserSelection() throws InterruptedException {
Intent sendIntent = createSendImageIntent();
List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
Mockito.anyBoolean(),
Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
final ChooserWrapperActivity activity = mActivityRule
.launchActivity(Intent.createChooser(sendIntent, null));
waitForIdle();
UsageStatsManager usm = activity.getUsageStatsManager();
verify(sOverrides.resolverListController, times(1))
.sort(Mockito.any(List.class));
assertThat(activity.getIsSelected(), is(false));
sOverrides.onSafelyStartCallback = targetInfo -> {
return true;
};
String action = sendIntent.getAction();
String annotation = sendIntent.getType();
ResolveInfo toChoose = resolvedComponentInfos.get(0).getResolveInfoAt(0);
String packageName = toChoose.activityInfo.packageName;
long toChooseCount = getCount(usm, packageName, action, annotation);
onView(withText(toChoose.activityInfo.name))
.perform(click());
waitForIdle();
verify(sOverrides.resolverListController, times(1))
.updateModel(toChoose.activityInfo.getComponentName());
assertThat(activity.getIsSelected(), is(true));
long updatedCount = getCount(usm, packageName, action, annotation);
assertThat(updatedCount, is(toChooseCount + 1l));
}
@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(),
@@ -175,4 +231,19 @@ 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);
}
}

View File

@@ -16,6 +16,8 @@
package com.android.internal.app;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.content.pm.PackageManager;
import java.util.function.Function;
@@ -28,11 +30,21 @@ import static org.mockito.Mockito.mock;
*/
public class ChooserWrapperActivity extends ChooserActivity {
static final OverrideData sOverrides = new OverrideData();
private UsageStatsManager mUsm;
ResolveListAdapter getAdapter() {
return mAdapter;
}
boolean getIsSelected() { return mIsSuccessfullySelected; }
UsageStatsManager getUsageStatsManager() {
if (mUsm == null) {
mUsm = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
}
return mUsm;
}
@Override
public boolean isVoiceInteraction() {
if (sOverrides.isVoiceInteraction != null) {