Log events during PS setup flow.

Log pages and user clicks during private
space setup flow.

Bug: 313170618
Test: statd_testdrive 97, output: https://paste.googleplex.com/4874404496932864
Change-Id: I1f59e9720ee4bdd21670b86a4f1f0f98a91fa0db
This commit is contained in:
Anna Zhuravleva
2023-11-25 17:02:19 +00:00
parent 4b2a052628
commit b1fdd55707
7 changed files with 112 additions and 30 deletions

View File

@@ -25,6 +25,7 @@ import android.animation.AnimatorSet;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.animation.ValueAnimator; import android.animation.ValueAnimator;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.settings.SettingsEnums;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
@@ -39,10 +40,10 @@ import android.widget.ImageView;
import androidx.activity.OnBackPressedCallback; import androidx.activity.OnBackPressedCallback;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.fragment.NavHostFragment; import androidx.navigation.fragment.NavHostFragment;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.InstrumentedFragment;
import com.google.android.setupdesign.GlifLayout; import com.google.android.setupdesign.GlifLayout;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
@@ -52,7 +53,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
/** Fragment to show screens that auto advance during private space setup flow */ /** Fragment to show screens that auto advance during private space setup flow */
public class AutoAdvanceSetupFragment extends Fragment { public class AutoAdvanceSetupFragment extends InstrumentedFragment {
private static final String TAG = "AutoAdvanceFragment"; private static final String TAG = "AutoAdvanceFragment";
private static final String TITLE_INDEX = "title_index"; private static final String TITLE_INDEX = "title_index";
private static final int DELAY_BETWEEN_SCREENS = 5000; // 5 seconds in millis private static final int DELAY_BETWEEN_SCREENS = 5000; // 5 seconds in millis
@@ -78,13 +79,24 @@ public class AutoAdvanceSetupFragment extends Fragment {
startFadeOutAnimation(); startFadeOutAnimation();
mHandler.postDelayed(mUpdateScreenResources, DELAY_BETWEEN_SCREENS); mHandler.postDelayed(mUpdateScreenResources, DELAY_BETWEEN_SCREENS);
} else { } else {
PrivateSpaceMaintainer privateSpaceMaintainer = PrivateSpaceMaintainer PrivateSpaceMaintainer privateSpaceMaintainer =
.getInstance(getActivity()); PrivateSpaceMaintainer.getInstance(getActivity());
UserHandle userHandle; UserHandle userHandle;
if (privateSpaceMaintainer.doesPrivateSpaceExist() && (userHandle = if (privateSpaceMaintainer.doesPrivateSpaceExist()
privateSpaceMaintainer.getPrivateProfileHandle()) != null) { && (userHandle =
privateSpaceMaintainer
.getPrivateProfileHandle())
!= null) {
mMetricsFeatureProvider.action(
getContext(),
SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_SPACE_CREATED,
true);
startActivityInPrivateUser(userHandle); startActivityInPrivateUser(userHandle);
} else { } else {
mMetricsFeatureProvider.action(
getContext(),
SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_SPACE_CREATED,
false);
showPrivateSpaceErrorScreen(); showPrivateSpaceErrorScreen();
} }
} }
@@ -144,6 +156,11 @@ public class AutoAdvanceSetupFragment extends Fragment {
super.onDestroy(); super.onDestroy();
} }
@Override
public int getMetricsCategory() {
return SettingsEnums.PRIVATE_SPACE_SETUP_SPACE_CREATION;
}
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
private void startActivityInPrivateUser(UserHandle userHandle) { private void startActivityInPrivateUser(UserHandle userHandle) {
/* Start new activity in private profile which is needed to set private profile lock */ /* Start new activity in private profile which is needed to set private profile lock */

View File

@@ -17,6 +17,7 @@
package com.android.settings.privatespace; package com.android.settings.privatespace;
import android.app.Activity; import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@@ -24,17 +25,17 @@ import android.view.ViewGroup;
import androidx.activity.OnBackPressedCallback; import androidx.activity.OnBackPressedCallback;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.fragment.NavHostFragment; import androidx.navigation.fragment.NavHostFragment;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.InstrumentedFragment;
import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupcompat.template.FooterBarMixin;
import com.google.android.setupcompat.template.FooterButton; import com.google.android.setupcompat.template.FooterButton;
import com.google.android.setupdesign.GlifLayout; import com.google.android.setupdesign.GlifLayout;
/** Fragment to display error screen if creation of private profile failed for any reason. */ /** Fragment to display error screen if creation of private profile failed for any reason. */
public class PrivateProfileCreationError extends Fragment { public class PrivateProfileCreationError extends InstrumentedFragment {
@Override @Override
public View onCreateView( public View onCreateView(
LayoutInflater inflater, LayoutInflater inflater,
@@ -73,8 +74,15 @@ public class PrivateProfileCreationError extends Fragment {
return rootView; return rootView;
} }
@Override
public int getMetricsCategory() {
return SettingsEnums.PRIVATE_SPACE_SETUP_SPACE_CREATION_ERROR;
}
private View.OnClickListener onTryAgain() { private View.OnClickListener onTryAgain() {
return v -> { return v -> {
mMetricsFeatureProvider.action(
getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_TRY_CREATE_SPACE_AGAIN);
NavHostFragment.findNavController(PrivateProfileCreationError.this) NavHostFragment.findNavController(PrivateProfileCreationError.this)
.navigate(R.id.action_retry_profile_creation); .navigate(R.id.action_retry_profile_creation);
}; };
@@ -84,6 +92,8 @@ public class PrivateProfileCreationError extends Fragment {
return v -> { return v -> {
Activity activity = getActivity(); Activity activity = getActivity();
if (activity != null) { if (activity != null) {
mMetricsFeatureProvider.action(
getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_CANCEL_CREATE_SPACE);
activity.finish(); activity.finish();
} }
}; };

View File

@@ -20,6 +20,7 @@ import static com.android.settings.privatespace.PrivateSpaceSetupActivity.ACCOUN
import static com.android.settings.privatespace.PrivateSpaceSetupActivity.EXTRA_ACTION_TYPE; import static com.android.settings.privatespace.PrivateSpaceSetupActivity.EXTRA_ACTION_TYPE;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.settings.SettingsEnums;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.UserHandle; import android.os.UserHandle;
@@ -29,16 +30,16 @@ import android.view.ViewGroup;
import androidx.activity.OnBackPressedCallback; import androidx.activity.OnBackPressedCallback;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.InstrumentedFragment;
import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupcompat.template.FooterBarMixin;
import com.google.android.setupcompat.template.FooterButton; import com.google.android.setupcompat.template.FooterButton;
import com.google.android.setupdesign.GlifLayout; import com.google.android.setupdesign.GlifLayout;
/** Fragment to display error screen if the profile is not signed in with a Google account. */ /** Fragment to display error screen if the profile is not signed in with a Google account. */
public class PrivateSpaceAccountLoginError extends Fragment { public class PrivateSpaceAccountLoginError extends InstrumentedFragment {
@Override @Override
public View onCreateView( public View onCreateView(
LayoutInflater inflater, LayoutInflater inflater,
@@ -67,18 +68,26 @@ public class PrivateSpaceAccountLoginError extends Fragment {
return rootView; return rootView;
} }
@Override
public int getMetricsCategory() {
return SettingsEnums.PRIVATE_SPACE_SETUP_ACCOUNT_LOGIN_ERROR;
}
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
private View.OnClickListener nextScreen() { private View.OnClickListener nextScreen() {
return v -> { return v -> {
PrivateSpaceMaintainer privateSpaceMaintainer = PrivateSpaceMaintainer mMetricsFeatureProvider.action(
.getInstance(getActivity()); getContext(),
SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_TRY_CREATE_ACCOUNT_AGAIN);
PrivateSpaceMaintainer privateSpaceMaintainer =
PrivateSpaceMaintainer.getInstance(getActivity());
UserHandle userHandle; UserHandle userHandle;
if (privateSpaceMaintainer.doesPrivateSpaceExist() && (userHandle = if (privateSpaceMaintainer.doesPrivateSpaceExist()
privateSpaceMaintainer.getPrivateProfileHandle()) != null) { && (userHandle = privateSpaceMaintainer.getPrivateProfileHandle()) != null) {
Intent intent = new Intent(getContext(), PrivateProfileContextHelperActivity.class); Intent intent = new Intent(getContext(), PrivateProfileContextHelperActivity.class);
intent.putExtra(EXTRA_ACTION_TYPE, ACCOUNT_LOGIN_ACTION); intent.putExtra(EXTRA_ACTION_TYPE, ACCOUNT_LOGIN_ACTION);
getActivity().startActivityForResultAsUser(intent, ACCOUNT_LOGIN_ACTION, getActivity()
userHandle); .startActivityForResultAsUser(intent, ACCOUNT_LOGIN_ACTION, userHandle);
} }
}; };
} }

View File

@@ -17,23 +17,25 @@
package com.android.settings.privatespace; package com.android.settings.privatespace;
import android.app.Activity; import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.fragment.NavHostFragment; import androidx.navigation.fragment.NavHostFragment;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.InstrumentedFragment;
import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupcompat.template.FooterBarMixin;
import com.google.android.setupcompat.template.FooterButton; import com.google.android.setupcompat.template.FooterButton;
import com.google.android.setupdesign.GlifLayout; import com.google.android.setupdesign.GlifLayout;
/** Fragment educating about the usage of Private Space. */ /** Fragment educating about the usage of Private Space. */
public class PrivateSpaceEducation extends Fragment { public class PrivateSpaceEducation extends InstrumentedFragment {
@Override @Override
public View onCreateView( public View onCreateView(
LayoutInflater inflater, LayoutInflater inflater,
@@ -66,11 +68,17 @@ public class PrivateSpaceEducation extends Fragment {
return rootView; return rootView;
} }
@Override
public int getMetricsCategory() {
return SettingsEnums.PRIVATE_SPACE_SETUP_EDUCATION;
}
private View.OnClickListener onSetup() { private View.OnClickListener onSetup() {
return v -> { return v -> {
mMetricsFeatureProvider.action(
getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_START);
NavHostFragment.findNavController(PrivateSpaceEducation.this) NavHostFragment.findNavController(PrivateSpaceEducation.this)
.navigate(R.id.action_education_to_auto_advance); .navigate(R.id.action_education_to_auto_advance);
}; };
} }
@@ -78,6 +86,8 @@ public class PrivateSpaceEducation extends Fragment {
return v -> { return v -> {
Activity activity = getActivity(); Activity activity = getActivity();
if (activity != null) { if (activity != null) {
mMetricsFeatureProvider.action(
getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_CANCEL);
activity.finish(); activity.finish();
} }
}; };

View File

@@ -20,6 +20,7 @@ import static com.android.settings.privatespace.PrivateSpaceSetupActivity.EXTRA_
import static com.android.settings.privatespace.PrivateSpaceSetupActivity.SET_LOCK_ACTION; import static com.android.settings.privatespace.PrivateSpaceSetupActivity.SET_LOCK_ACTION;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.settings.SettingsEnums;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.UserHandle; import android.os.UserHandle;
@@ -29,18 +30,20 @@ import android.view.ViewGroup;
import androidx.activity.OnBackPressedCallback; import androidx.activity.OnBackPressedCallback;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.fragment.NavHostFragment; import androidx.navigation.fragment.NavHostFragment;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.InstrumentedFragment;
import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupcompat.template.FooterBarMixin;
import com.google.android.setupcompat.template.FooterButton; import com.google.android.setupcompat.template.FooterButton;
import com.google.android.setupdesign.GlifLayout; import com.google.android.setupdesign.GlifLayout;
/** Fragment that provides an option to user to choose between the existing screen lock or set a /**
* separate private profile lock. */ * Fragment that provides an option to user to choose between the existing screen lock or set a
public class PrivateSpaceSetLockFragment extends Fragment { * separate private profile lock.
*/
public class PrivateSpaceSetLockFragment extends InstrumentedFragment {
@Override @Override
public View onCreateView( public View onCreateView(
@@ -83,8 +86,15 @@ public class PrivateSpaceSetLockFragment extends Fragment {
return rootView; return rootView;
} }
@Override
public int getMetricsCategory() {
return SettingsEnums.PRIVATE_SPACE_SETUP_LOCK;
}
private View.OnClickListener onClickUse() { private View.OnClickListener onClickUse() {
return v -> { return v -> {
mMetricsFeatureProvider.action(
getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_USE_SCREEN_LOCK);
// Simply Use default screen lock. No need to handle // Simply Use default screen lock. No need to handle
NavHostFragment.findNavController(PrivateSpaceSetLockFragment.this) NavHostFragment.findNavController(PrivateSpaceSetLockFragment.this)
.navigate(R.id.action_success_fragment); .navigate(R.id.action_success_fragment);
@@ -93,6 +103,8 @@ public class PrivateSpaceSetLockFragment extends Fragment {
private View.OnClickListener onClickNewLock() { private View.OnClickListener onClickNewLock() {
return v -> { return v -> {
mMetricsFeatureProvider.action(
getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_NEW_LOCK);
createPrivateSpaceLock(); createPrivateSpaceLock();
}; };
} }

View File

@@ -16,6 +16,7 @@
package com.android.settings.privatespace; package com.android.settings.privatespace;
import android.app.settings.SettingsEnums;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
@@ -25,6 +26,8 @@ import androidx.navigation.fragment.NavHostFragment;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SetupWizardUtils; import com.android.settings.SetupWizardUtils;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.google.android.setupdesign.util.ThemeHelper; import com.google.android.setupdesign.util.ThemeHelper;
@@ -34,6 +37,8 @@ public class PrivateSpaceSetupActivity extends FragmentActivity {
public static final int ACCOUNT_LOGIN_ACTION = 2; public static final int ACCOUNT_LOGIN_ACTION = 2;
public static final String EXTRA_ACTION_TYPE = "action_type"; public static final String EXTRA_ACTION_TYPE = "action_type";
private NavHostFragment mNavHostFragment; private NavHostFragment mNavHostFragment;
private MetricsFeatureProvider mMetricsFeatureProvider;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
if (!android.os.Flags.allowPrivateProfile()) { if (!android.os.Flags.allowPrivateProfile()) {
@@ -42,6 +47,7 @@ public class PrivateSpaceSetupActivity extends FragmentActivity {
setTheme(SetupWizardUtils.getTheme(this, getIntent())); setTheme(SetupWizardUtils.getTheme(this, getIntent()));
ThemeHelper.trySetDynamicColor(this); ThemeHelper.trySetDynamicColor(this);
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
setContentView(R.layout.privatespace_setup_root); setContentView(R.layout.privatespace_setup_root);
mNavHostFragment = (NavHostFragment) getSupportFragmentManager() mNavHostFragment = (NavHostFragment) getSupportFragmentManager()
.findFragmentById(R.id.ps_nav_host_fragment); .findFragmentById(R.id.ps_nav_host_fragment);
@@ -54,8 +60,14 @@ public class PrivateSpaceSetupActivity extends FragmentActivity {
mNavHostFragment.getNavController().navigate(R.id.action_success_fragment); mNavHostFragment.getNavController().navigate(R.id.action_success_fragment);
} else if (requestCode == ACCOUNT_LOGIN_ACTION) { } else if (requestCode == ACCOUNT_LOGIN_ACTION) {
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
mMetricsFeatureProvider.action(
this, SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_ACCOUNT_LOGIN_SUCCESS, true);
mNavHostFragment.getNavController().navigate(R.id.action_set_lock_fragment); mNavHostFragment.getNavController().navigate(R.id.action_set_lock_fragment);
} else { } else {
mMetricsFeatureProvider.action(
this,
SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_ACCOUNT_LOGIN_SUCCESS,
false);
mNavHostFragment.getNavController().navigate(R.id.action_advance_login_error); mNavHostFragment.getNavController().navigate(R.id.action_advance_login_error);
} }
} }

View File

@@ -17,6 +17,7 @@
package com.android.settings.privatespace; package com.android.settings.privatespace;
import android.app.Activity; import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
@@ -28,16 +29,16 @@ import android.widget.Toast;
import androidx.activity.OnBackPressedCallback; import androidx.activity.OnBackPressedCallback;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.InstrumentedFragment;
import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupcompat.template.FooterBarMixin;
import com.google.android.setupcompat.template.FooterButton; import com.google.android.setupcompat.template.FooterButton;
import com.google.android.setupdesign.GlifLayout; import com.google.android.setupdesign.GlifLayout;
/** Fragment for the final screen shown on successful completion of private space setup. */ /** Fragment for the final screen shown on successful completion of private space setup. */
public class SetupSuccessFragment extends Fragment { public class SetupSuccessFragment extends InstrumentedFragment {
private static final String TAG = "SetupSuccessFragment"; private static final String TAG = "SetupSuccessFragment";
@Override @Override
@@ -72,14 +73,25 @@ public class SetupSuccessFragment extends Fragment {
return rootView; return rootView;
} }
@Override
public int getMetricsCategory() {
return SettingsEnums.PRIVATE_SPACE_SETUP_FINISH;
}
private View.OnClickListener onClickNext() { private View.OnClickListener onClickNext() {
return v -> { return v -> {
Activity activity = getActivity(); Activity activity = getActivity();
if (activity != null) { if (activity != null) {
mMetricsFeatureProvider.action(
getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_DONE);
Intent allAppsIntent = new Intent(Intent.ACTION_ALL_APPS); Intent allAppsIntent = new Intent(Intent.ACTION_ALL_APPS);
ResolveInfo resolveInfo = activity.getPackageManager().resolveActivityAsUser( ResolveInfo resolveInfo =
new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), activity.getPackageManager()
PackageManager.MATCH_SYSTEM_ONLY, activity.getUserId()); .resolveActivityAsUser(
new Intent(Intent.ACTION_MAIN)
.addCategory(Intent.CATEGORY_HOME),
PackageManager.MATCH_SYSTEM_ONLY,
activity.getUserId());
if (resolveInfo != null) { if (resolveInfo != null) {
allAppsIntent.setPackage(resolveInfo.activityInfo.packageName); allAppsIntent.setPackage(resolveInfo.activityInfo.packageName);
allAppsIntent.setComponent(resolveInfo.activityInfo.getComponentName()); allAppsIntent.setComponent(resolveInfo.activityInfo.getComponentName());