From c1fd5ad1eca1495f96c3a7e1328742ebbbb754af Mon Sep 17 00:00:00 2001 From: josephpv Date: Thu, 22 Feb 2024 18:22:48 +0000 Subject: [PATCH] Change to add temp GAIA education screen and swap account and lock flow The change does below things: - Interchange account and lock setup in PS setup - After profile creation checks if network is present and starts new GAIA education screen If network is not present on device skips account login and shows lock setup screen. - Adds a temp GAIA education screen before starting of account login which can skip to lock setup or start account login Recording link : b/326389818#comment5 Screenshot : go/ss/7qWLUF4WDHFBQzi.png go/ss/A8EvoCFJwihaTQP.png Bug: 326389818 Test: Manual Change-Id: I91e3591c60aae22fc10058fb94dcb624573d2e37 --- .../ic_security_privacy_alert_primary.xml | 25 ++++ .../private_space_gaia_education_screen.xml | 111 ++++++++++++++++ .../privatespace_main_context_nav.xml | 19 ++- res/values/strings.xml | 18 ++- .../AutoAdvanceSetupFragment.java | 21 ++- .../PrivateSpaceAccountLoginError.java | 21 +-- .../PrivateSpaceGaiaEducationFragment.java | 124 ++++++++++++++++++ .../PrivateSpaceSetLockFragment.java | 8 +- .../PrivateSpaceSetupActivity.java | 17 +-- 9 files changed, 320 insertions(+), 44 deletions(-) create mode 100644 res/drawable/ic_security_privacy_alert_primary.xml create mode 100644 res/layout/private_space_gaia_education_screen.xml create mode 100644 src/com/android/settings/privatespace/PrivateSpaceGaiaEducationFragment.java diff --git a/res/drawable/ic_security_privacy_alert_primary.xml b/res/drawable/ic_security_privacy_alert_primary.xml new file mode 100644 index 00000000000..3ec0c93bbb0 --- /dev/null +++ b/res/drawable/ic_security_privacy_alert_primary.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/res/layout/private_space_gaia_education_screen.xml b/res/layout/private_space_gaia_education_screen.xml new file mode 100644 index 00000000000..e5c0f857998 --- /dev/null +++ b/res/layout/private_space_gaia_education_screen.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/navigation/privatespace_main_context_nav.xml b/res/navigation/privatespace_main_context_nav.xml index f76afac4df1..80cd3997c4b 100644 --- a/res/navigation/privatespace_main_context_nav.xml +++ b/res/navigation/privatespace_main_context_nav.xml @@ -35,6 +35,9 @@ + + app:destination="@id/ps_account_intro_fragment"/> + android:id="@+id/action_skip_account_login" + app:destination="@id/ps_profile_lock_fragment"/> + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 6dafbd264fd..cbab588115b 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1333,7 +1333,7 @@ Explore private space settings to hide private space and set up automatic locking - Some apps are already installed in your private space + Required apps are already installed in your private space Couldn\u2019t set up a private space @@ -1378,6 +1378,22 @@ Sensitive notifications on lock screen Show sensitive content when private space is unlocked + + Create a Google Account to help keep your data private + + On the next screen you can sign in to an account to use with your private space + + Create a dedicated account to help stop data appearing outside private space, such as: + + Synced photos, files, emails, contacts, calendar events, and other data + + App download history and recommendations + + Browsing history, bookmarks, and saved passwords + + Suggested content related to your activity in private space apps + + Got it You can add up to %d fingerprints diff --git a/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java b/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java index 74e843160fe..3af1bf70d53 100644 --- a/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java +++ b/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java @@ -24,6 +24,9 @@ import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.app.settings.SettingsEnums; +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -81,8 +84,13 @@ public class AutoAdvanceSetupFragment extends InstrumentedFragment { getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_SPACE_CREATED, true); - NavHostFragment.findNavController(AutoAdvanceSetupFragment.this) - .navigate(R.id.action_set_lock_fragment); + if (isConnectedToInternet()) { + NavHostFragment.findNavController(AutoAdvanceSetupFragment.this) + .navigate(R.id.action_account_intro_fragment); + } else { + NavHostFragment.findNavController(AutoAdvanceSetupFragment.this) + .navigate(R.id.action_set_lock_fragment); + } } else { mMetricsFeatureProvider.action( getContext(), @@ -190,4 +198,13 @@ public class AutoAdvanceSetupFragment extends InstrumentedFragment { } }); } + + /** Returns true if device has an active internet connection, false otherwise. */ + private boolean isConnectedToInternet() { + ConnectivityManager cm = + (ConnectivityManager) + getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); + return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); + } } diff --git a/src/com/android/settings/privatespace/PrivateSpaceAccountLoginError.java b/src/com/android/settings/privatespace/PrivateSpaceAccountLoginError.java index fcb93b1c38e..fa901fc8ac4 100644 --- a/src/com/android/settings/privatespace/PrivateSpaceAccountLoginError.java +++ b/src/com/android/settings/privatespace/PrivateSpaceAccountLoginError.java @@ -16,15 +16,9 @@ package com.android.settings.privatespace; -import static com.android.settings.privatespace.PrivateSpaceSetupActivity.ACCOUNT_LOGIN_ACTION; -import static com.android.settings.privatespace.PrivateSpaceSetupActivity.EXTRA_ACTION_TYPE; - import android.annotation.SuppressLint; import android.app.settings.SettingsEnums; -import android.content.Intent; import android.os.Bundle; -import android.os.UserHandle; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -93,17 +87,8 @@ public class PrivateSpaceAccountLoginError extends InstrumentedFragment { mMetricsFeatureProvider.action( getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_TRY_CREATE_ACCOUNT_AGAIN); - PrivateSpaceMaintainer privateSpaceMaintainer = - PrivateSpaceMaintainer.getInstance(getActivity()); - UserHandle userHandle; - if (privateSpaceMaintainer.doesPrivateSpaceExist() - && (userHandle = privateSpaceMaintainer.getPrivateProfileHandle()) != null) { - Intent intent = new Intent(getContext(), PrivateProfileContextHelperActivity.class); - intent.putExtra(EXTRA_ACTION_TYPE, ACCOUNT_LOGIN_ACTION); - Log.d(TAG, "Start private space activity for account login"); - getActivity() - .startActivityForResultAsUser(intent, ACCOUNT_LOGIN_ACTION, userHandle); - } + NavHostFragment.findNavController(PrivateSpaceAccountLoginError.this) + .navigate(R.id.action_advance_login_error); }; } @@ -116,7 +101,7 @@ public class PrivateSpaceAccountLoginError extends InstrumentedFragment { SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_ACCOUNT_LOGIN_SUCCESS, false); NavHostFragment.findNavController(PrivateSpaceAccountLoginError.this) - .navigate(R.id.action_success_fragment); + .navigate(R.id.action_skip_account_login); }; } } diff --git a/src/com/android/settings/privatespace/PrivateSpaceGaiaEducationFragment.java b/src/com/android/settings/privatespace/PrivateSpaceGaiaEducationFragment.java new file mode 100644 index 00000000000..0fa04834537 --- /dev/null +++ b/src/com/android/settings/privatespace/PrivateSpaceGaiaEducationFragment.java @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2024 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.privatespace; + +import static com.android.settings.privatespace.PrivateSpaceSetupActivity.ACCOUNT_LOGIN_ACTION; +import static com.android.settings.privatespace.PrivateSpaceSetupActivity.EXTRA_ACTION_TYPE; + +import android.app.settings.SettingsEnums; +import android.content.Intent; +import android.os.Bundle; +import android.os.UserHandle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.activity.OnBackPressedCallback; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.navigation.fragment.NavHostFragment; + +import com.android.settings.R; +import com.android.settings.core.InstrumentedFragment; + +import com.google.android.setupcompat.template.FooterBarMixin; +import com.google.android.setupcompat.template.FooterButton; +import com.google.android.setupdesign.GlifLayout; + +/** Fragment for GAIA education screen */ +public class PrivateSpaceGaiaEducationFragment extends InstrumentedFragment { + private static final String TAG = "PrivateSpaceGaiaEduFrag"; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + if (android.os.Flags.allowPrivateProfile()) { + super.onCreate(savedInstanceState); + } + } + + @NonNull + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + GlifLayout rootView = + (GlifLayout) + inflater.inflate( + R.layout.private_space_gaia_education_screen, container, false); + final FooterBarMixin mixin = rootView.getMixin(FooterBarMixin.class); + mixin.setPrimaryButton( + new FooterButton.Builder(getContext()) + .setText(R.string.private_space_gaia_education_got_it) + .setListener(onStartLogin()) + .setButtonType(FooterButton.ButtonType.NEXT) + .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Primary) + .build()); + mixin.setSecondaryButton( + new FooterButton.Builder(getContext()) + .setText(R.string.skip_label) + .setListener(onSkip()) + .setButtonType(FooterButton.ButtonType.NEXT) + .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary) + .build()); + OnBackPressedCallback callback = + new OnBackPressedCallback(true /* enabled by default */) { + @Override + public void handleOnBackPressed() { + // Handle the back button event. We intentionally don't want to allow back + // button to work in this screen during the setup flow. + } + }; + requireActivity().getOnBackPressedDispatcher().addCallback(this, callback); + + return rootView; + } + + @Override + public int getMetricsCategory() { + return METRICS_CATEGORY_UNKNOWN; + } + + private View.OnClickListener onSkip() { + return v -> { + NavHostFragment.findNavController(PrivateSpaceGaiaEducationFragment.this) + .navigate(R.id.action_account_lock_fragment); + }; + } + + private View.OnClickListener onStartLogin() { + return v -> { + startAccountLogin(); + }; + } + + /** Start new activity in private profile to add an account to private profile */ + private void startAccountLogin() { + UserHandle userHandle = + PrivateSpaceMaintainer.getInstance(getActivity()).getPrivateProfileHandle(); + if (userHandle != null) { + Intent intent = new Intent(getContext(), PrivateProfileContextHelperActivity.class); + intent.putExtra(EXTRA_ACTION_TYPE, ACCOUNT_LOGIN_ACTION); + mMetricsFeatureProvider.action( + getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_ACCOUNT_LOGIN_START); + getActivity().startActivityForResultAsUser(intent, ACCOUNT_LOGIN_ACTION, userHandle); + } else { + Log.w(TAG, "Private profile user handle is null"); + } + } +} diff --git a/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java b/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java index 56add6d807e..8d66987a2fa 100644 --- a/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java +++ b/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java @@ -16,7 +16,6 @@ package com.android.settings.privatespace; -import static com.android.settings.privatespace.PrivateSpaceSetupActivity.ACCOUNT_LOGIN_ACTION; import static com.android.settings.privatespace.PrivateSpaceSetupActivity.EXTRA_ACTION_TYPE; import static com.android.settings.privatespace.PrivateSpaceSetupActivity.SET_LOCK_ACTION; @@ -31,6 +30,7 @@ import android.view.ViewGroup; import androidx.activity.OnBackPressedCallback; import androidx.annotation.Nullable; +import androidx.navigation.fragment.NavHostFragment; import com.android.settings.R; import com.android.settings.core.InstrumentedFragment; @@ -97,10 +97,8 @@ public class PrivateSpaceSetLockFragment extends InstrumentedFragment { mMetricsFeatureProvider.action( getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_USE_SCREEN_LOCK); // Simply Use default screen lock. No need to handle - mMetricsFeatureProvider.action( - getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_ACCOUNT_LOGIN_START); - Log.d(TAG, "Use device lock for private profile"); - launchActivityForAction(ACCOUNT_LOGIN_ACTION); + NavHostFragment.findNavController(PrivateSpaceSetLockFragment.this) + .navigate(R.id.action_lock_success_fragment); }; } diff --git a/src/com/android/settings/privatespace/PrivateSpaceSetupActivity.java b/src/com/android/settings/privatespace/PrivateSpaceSetupActivity.java index 75b69cd81a0..78c96dcc5f3 100644 --- a/src/com/android/settings/privatespace/PrivateSpaceSetupActivity.java +++ b/src/com/android/settings/privatespace/PrivateSpaceSetupActivity.java @@ -19,8 +19,6 @@ package com.android.settings.privatespace; import android.app.settings.SettingsEnums; import android.content.Intent; import android.os.Bundle; -import android.os.UserHandle; -import android.util.Log; import androidx.annotation.Nullable; import androidx.fragment.app.FragmentActivity; @@ -61,23 +59,12 @@ public class PrivateSpaceSetupActivity extends FragmentActivity { @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (requestCode == SET_LOCK_ACTION && resultCode == RESULT_OK) { - /* Start new activity in private profile to add an account to private profile */ - UserHandle userHandle = - PrivateSpaceMaintainer.getInstance(this).getPrivateProfileHandle(); - if (userHandle != null) { - Intent intent = new Intent(this, PrivateProfileContextHelperActivity.class); - intent.putExtra(EXTRA_ACTION_TYPE, ACCOUNT_LOGIN_ACTION); - mMetricsFeatureProvider.action( - this, SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_ACCOUNT_LOGIN_START); - startActivityForResultAsUser(intent, ACCOUNT_LOGIN_ACTION, userHandle); - } else { - Log.w(TAG, "Private profile user handle is null"); - } + mNavHostFragment.getNavController().navigate(R.id.action_success_fragment); } else if (requestCode == ACCOUNT_LOGIN_ACTION) { if (resultCode == RESULT_OK) { mMetricsFeatureProvider.action( this, SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_ACCOUNT_LOGIN_SUCCESS, true); - mNavHostFragment.getNavController().navigate(R.id.action_success_fragment); + mNavHostFragment.getNavController().navigate(R.id.action_account_lock_fragment); } else { mMetricsFeatureProvider.action( this,