Merge "Add metrics for work tab in intent resolver and share sheet."
diff --git a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java
index e8f84aa..b4a0208 100644
--- a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java
+++ b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java
@@ -20,6 +20,7 @@
import android.annotation.Nullable;
import android.annotation.StringRes;
import android.app.AppGlobals;
+import android.app.admin.DevicePolicyEventLogger;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
@@ -27,6 +28,7 @@
import android.content.pm.ResolveInfo;
import android.os.UserHandle;
import android.os.UserManager;
+import android.stats.devicepolicy.DevicePolicyEnums;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
@@ -251,6 +253,8 @@
abstract @Nullable ViewGroup getInactiveAdapterView();
+ abstract String getMetricsCategory();
+
/**
* Rebuilds the tab that is currently visible to the user.
* <p>Returns {@code true} if rebuild has completed.
@@ -282,6 +286,10 @@
UserHandle listUserHandle = activeListAdapter.getUserHandle();
if (listUserHandle == mWorkProfileUserHandle
&& mInjector.isQuietModeEnabled(mWorkProfileUserHandle)) {
+ DevicePolicyEventLogger
+ .createEvent(DevicePolicyEnums.RESOLVER_EMPTY_STATE_WORK_APPS_DISABLED)
+ .setStrings(getMetricsCategory())
+ .write();
showEmptyState(activeListAdapter,
R.drawable.ic_work_apps_off,
R.string.resolver_turn_on_work_apps,
@@ -294,11 +302,19 @@
if (!mInjector.hasCrossProfileIntents(activeListAdapter.getIntents(),
UserHandle.myUserId(), listUserHandle.getIdentifier())) {
if (listUserHandle == mPersonalProfileUserHandle) {
+ DevicePolicyEventLogger.createEvent(
+ DevicePolicyEnums.RESOLVER_EMPTY_STATE_NO_SHARING_TO_PERSONAL)
+ .setStrings(getMetricsCategory())
+ .write();
showEmptyState(activeListAdapter,
R.drawable.ic_sharing_disabled,
R.string.resolver_cant_share_with_personal_apps,
R.string.resolver_cant_share_cross_profile_explanation);
} else {
+ DevicePolicyEventLogger.createEvent(
+ DevicePolicyEnums.RESOLVER_EMPTY_STATE_NO_SHARING_TO_WORK)
+ .setStrings(getMetricsCategory())
+ .write();
showEmptyState(activeListAdapter,
R.drawable.ic_sharing_disabled,
R.string.resolver_cant_share_with_work_apps,
@@ -315,6 +331,12 @@
UserHandle listUserHandle = listAdapter.getUserHandle();
if (UserHandle.myUserId() == listUserHandle.getIdentifier()
|| !hasAppsInOtherProfile(listAdapter)) {
+ if (mWorkProfileUserHandle != null) {
+ DevicePolicyEventLogger.createEvent(
+ DevicePolicyEnums.RESOLVER_EMPTY_STATE_NO_APPS_RESOLVED)
+ .setStrings(getMetricsCategory())
+ .write();
+ }
showEmptyState(listAdapter,
R.drawable.ic_no_apps,
R.string.resolver_no_apps_available,
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 8618bcf..61d22d1 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -2698,6 +2698,11 @@
@Override
protected void resetButtonBar() {}
+ @Override
+ protected String getMetricsCategory() {
+ return METRICS_CATEGORY_CHOOSER;
+ }
+
/**
* Adapter for all types of items and targets in ShareSheet.
* Note that ranked sections like Direct Share - while appearing grid-like - are handled on the
diff --git a/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java
index e350142..d440402 100644
--- a/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java
+++ b/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java
@@ -165,6 +165,11 @@
return getListViewForIndex(1 - getCurrentPage());
}
+ @Override
+ String getMetricsCategory() {
+ return ResolverActivity.METRICS_CATEGORY_CHOOSER;
+ }
+
class ChooserProfileDescriptor extends ProfileDescriptor {
private ChooserActivity.ChooserGridAdapter chooserGridAdapter;
private RecyclerView recyclerView;
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index 409ae34..f168215 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -33,6 +33,7 @@
import android.app.VoiceInteractor.PickOptionRequest;
import android.app.VoiceInteractor.PickOptionRequest.Option;
import android.app.VoiceInteractor.Prompt;
+import android.app.admin.DevicePolicyEventLogger;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -60,6 +61,7 @@
import android.os.UserManager;
import android.provider.MediaStore;
import android.provider.Settings;
+import android.stats.devicepolicy.DevicePolicyEnums;
import android.text.TextUtils;
import android.util.Log;
import android.util.Slog;
@@ -84,6 +86,7 @@
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.AbstractMultiProfilePagerAdapter.Profile;
+import com.android.internal.app.chooser.ChooserTargetInfo;
import com.android.internal.app.chooser.DisplayResolveInfo;
import com.android.internal.app.chooser.TargetInfo;
import com.android.internal.content.PackageMonitor;
@@ -99,6 +102,7 @@
import java.util.Objects;
import java.util.Set;
+
/**
* This activity is displayed when the system attempts to start an Intent for
* which there is more than one matching activity, allowing the user to decide
@@ -152,6 +156,8 @@
private static final String EXTRA_SHOW_FRAGMENT_ARGS = ":settings:show_fragment_args";
private static final String EXTRA_FRAGMENT_ARG_KEY = ":settings:fragment_args_key";
private static final String OPEN_LINKS_COMPONENT_KEY = "app_link_state";
+ protected static final String METRICS_CATEGORY_RESOLVER = "intent_resolver";
+ protected static final String METRICS_CATEGORY_CHOOSER = "intent_chooser";
/**
* TODO(arangelov): Remove a couple of weeks after work/personal tabs are finalized.
@@ -1201,12 +1207,14 @@
if (!mSafeForwardingMode) {
if (cti.startAsUser(this, null, currentUserHandle)) {
onActivityStarted(cti);
+ maybeLogCrossProfileTargetLaunch(cti, currentUserHandle);
}
return;
}
try {
if (cti.startAsCaller(this, null, currentUserHandle.getIdentifier())) {
onActivityStarted(cti);
+ maybeLogCrossProfileTargetLaunch(cti, currentUserHandle);
}
} catch (RuntimeException e) {
String launchedFromPackage;
@@ -1222,6 +1230,18 @@
}
}
+ private void maybeLogCrossProfileTargetLaunch(TargetInfo cti, UserHandle currentUserHandle) {
+ if (!hasWorkProfile() || currentUserHandle == getUser()) {
+ return;
+ }
+ DevicePolicyEventLogger
+ .createEvent(DevicePolicyEnums.RESOLVER_CROSS_PROFILE_TARGET_OPENED)
+ .setBoolean(currentUserHandle == getPersonalProfileUserHandle())
+ .setStrings(getMetricsCategory(),
+ cti instanceof ChooserTargetInfo ? "direct_share" : "other_target")
+ .write();
+ }
+
public boolean startAsCallerImpl(Intent intent, Bundle options, boolean ignoreTargetSecurity,
int userId) {
@@ -1425,7 +1445,8 @@
* - The target app has declared it supports cross-profile communication via manifest metadata
*/
private boolean maybeAutolaunchIfCrossProfileSupported() {
- int count = mMultiProfilePagerAdapter.getActiveListAdapter().getUnfilteredCount();
+ ResolverListAdapter activeListAdapter = mMultiProfilePagerAdapter.getActiveListAdapter();
+ int count = activeListAdapter.getUnfilteredCount();
if (count != 1) {
return false;
}
@@ -1434,7 +1455,7 @@
if (inactiveListAdapter.getUnfilteredCount() != 1) {
return false;
}
- TargetInfo activeProfileTarget = mMultiProfilePagerAdapter.getActiveListAdapter()
+ TargetInfo activeProfileTarget = activeListAdapter
.targetInfoForPosition(0, false);
TargetInfo inactiveProfileTarget = inactiveListAdapter.targetInfoForPosition(0, false);
if (!Objects.equals(activeProfileTarget.getResolvedComponentName(),
@@ -1449,6 +1470,11 @@
return false;
}
+ DevicePolicyEventLogger
+ .createEvent(DevicePolicyEnums.RESOLVER_AUTOLAUNCH_CROSS_PROFILE_TARGET)
+ .setBoolean(activeListAdapter.getUserHandle() == getPersonalProfileUserHandle())
+ .setStrings(getMetricsCategory())
+ .write();
safelyStartActivity(activeProfileTarget);
finish();
return true;
@@ -1530,6 +1556,11 @@
viewPager.setCurrentItem(1);
}
setupViewVisibilities();
+ DevicePolicyEventLogger
+ .createEvent(DevicePolicyEnums.RESOLVER_SWITCH_TABS)
+ .setInt(viewPager.getCurrentItem())
+ .setStrings(getMetricsCategory())
+ .write();
});
viewPager.setVisibility(View.VISIBLE);
@@ -1697,6 +1728,10 @@
&& Objects.equals(lhs.activityInfo.packageName, rhs.activityInfo.packageName);
}
+ protected String getMetricsCategory() {
+ return METRICS_CATEGORY_RESOLVER;
+ }
+
@Override // ResolverListCommunicator
public void onHandlePackagesChanged(ResolverListAdapter listAdapter) {
if (listAdapter == mMultiProfilePagerAdapter.getActiveListAdapter()) {
diff --git a/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java
index 96dc83a..21e7fd9 100644
--- a/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java
+++ b/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java
@@ -150,6 +150,11 @@
return getListViewForIndex(1 - getCurrentPage());
}
+ @Override
+ String getMetricsCategory() {
+ return ResolverActivity.METRICS_CATEGORY_RESOLVER;
+ }
+
class ResolverProfileDescriptor extends ProfileDescriptor {
private ResolverListAdapter resolverListAdapter;
final ListView listView;
diff --git a/core/proto/android/stats/devicepolicy/device_policy_enums.proto b/core/proto/android/stats/devicepolicy/device_policy_enums.proto
index 782b269..3d8108d 100644
--- a/core/proto/android/stats/devicepolicy/device_policy_enums.proto
+++ b/core/proto/android/stats/devicepolicy/device_policy_enums.proto
@@ -179,4 +179,11 @@
PROVISIONING_DPC_SETUP_STARTED = 152;
PROVISIONING_DPC_SETUP_COMPLETED = 153;
PROVISIONING_ORGANIZATION_OWNED_MANAGED_PROFILE = 154;
+ RESOLVER_CROSS_PROFILE_TARGET_OPENED = 155;
+ RESOLVER_SWITCH_TABS = 156;
+ RESOLVER_EMPTY_STATE_WORK_APPS_DISABLED = 157;
+ RESOLVER_EMPTY_STATE_NO_SHARING_TO_PERSONAL= 158;
+ RESOLVER_EMPTY_STATE_NO_SHARING_TO_WORK= 159;
+ RESOLVER_EMPTY_STATE_NO_APPS_RESOLVED= 160;
+ RESOLVER_AUTOLAUNCH_CROSS_PROFILE_TARGET = 161;
}