diff --git a/res/layout/private_space_gaia_education_screen.xml b/res/layout/private_space_gaia_education_screen.xml deleted file mode 100644 index e5c0f857998..00000000000 --- a/res/layout/private_space_gaia_education_screen.xml +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/res/layout/private_space_pre_finish_delay.xml b/res/layout/private_space_wait_screen.xml similarity index 90% rename from res/layout/private_space_pre_finish_delay.xml rename to res/layout/private_space_wait_screen.xml index 3b620bf256a..83b4806a431 100644 --- a/res/layout/private_space_pre_finish_delay.xml +++ b/res/layout/private_space_wait_screen.xml @@ -25,5 +25,5 @@ android:icon="@drawable/ic_private_space_icon" app:sudUsePartnerHeavyTheme="true" app:sudIllustrationType="default" - app:sucHeaderText="@string/private_space_pre_finish_title"> - \ No newline at end of file + app:sucHeaderText="@string/private_space_wait_screen_title"> + diff --git a/res/navigation/privatespace_main_context_nav.xml b/res/navigation/privatespace_main_context_nav.xml index 0de5d9132ad..3eb57d3ecda 100644 --- a/res/navigation/privatespace_main_context_nav.xml +++ b/res/navigation/privatespace_main_context_nav.xml @@ -35,9 +35,6 @@ - - @@ -73,16 +67,10 @@ android:id="@+id/action_lock_success_fragment" app:destination="@id/ps_pre_finish_delay_fragment"/> - - - - + + diff --git a/res/values/strings.xml b/res/values/strings.xml index f15137a66e8..736b2bb3954 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1374,7 +1374,7 @@ Choose new lock - Just a sec\u2026 + Just a sec\u2026 All set! @@ -1401,22 +1401,6 @@ Set a password for your private space Set a pattern for your private space - - 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 Lock diff --git a/src/com/android/settings/privatespace/PrivateProfileContextHelperActivity.java b/src/com/android/settings/privatespace/PrivateProfileContextHelperActivity.java index ef33d11f012..cba3b77f32a 100644 --- a/src/com/android/settings/privatespace/PrivateProfileContextHelperActivity.java +++ b/src/com/android/settings/privatespace/PrivateProfileContextHelperActivity.java @@ -29,6 +29,7 @@ import static com.android.settings.privatespace.PrivateSpaceSetupActivity.SET_LO import android.content.Intent; import android.os.Bundle; +import android.os.UserHandle; import android.util.Log; import androidx.activity.result.ActivityResult; @@ -70,11 +71,20 @@ public class PrivateProfileContextHelperActivity extends FragmentActivity { if (savedInstanceState == null) { int action = getIntent().getIntExtra(EXTRA_ACTION_TYPE, -1); if (action == ACCOUNT_LOGIN_ACTION) { + setContentView(R.layout.private_space_wait_screen); PrivateSpaceLoginFeatureProvider privateSpaceLoginFeatureProvider = FeatureFactory.getFeatureFactory().getPrivateSpaceLoginFeatureProvider(); - if (!privateSpaceLoginFeatureProvider.initiateAccountLogin( - this, mAddAccountToPrivateProfile)) { - setResult(RESULT_OK); + UserHandle userHandle = + PrivateSpaceMaintainer.getInstance(this).getPrivateProfileHandle(); + if (userHandle != null) { + if (!privateSpaceLoginFeatureProvider.initiateAccountLogin( + createContextAsUser(userHandle, 0), mAddAccountToPrivateProfile)) { + setResult(RESULT_OK); + finish(); + } + } else { + Log.w(TAG, "Private profile user handle is null"); + setResult(RESULT_CANCELED); finish(); } } else if (action == SET_LOCK_ACTION) { diff --git a/src/com/android/settings/privatespace/PrivateSpaceAccountLoginError.java b/src/com/android/settings/privatespace/PrivateSpaceAccountLoginError.java index 48a5a7feb58..f0b960a7880 100644 --- a/src/com/android/settings/privatespace/PrivateSpaceAccountLoginError.java +++ b/src/com/android/settings/privatespace/PrivateSpaceAccountLoginError.java @@ -16,8 +16,12 @@ 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.view.LayoutInflater; import android.view.View; @@ -85,8 +89,7 @@ public class PrivateSpaceAccountLoginError extends InstrumentedFragment { mMetricsFeatureProvider.action( getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_TRY_CREATE_ACCOUNT_AGAIN); - NavHostFragment.findNavController(PrivateSpaceAccountLoginError.this) - .navigate(R.id.action_advance_login_error); + startAccountLogin(); }; } @@ -102,4 +105,13 @@ public class PrivateSpaceAccountLoginError extends InstrumentedFragment { .navigate(R.id.action_skip_account_login); }; } + + /** Start new activity in private profile to add an account to private profile */ + private void startAccountLogin() { + 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().startActivityForResult(intent, ACCOUNT_LOGIN_ACTION); + } } diff --git a/src/com/android/settings/privatespace/PrivateSpaceCreationFragment.java b/src/com/android/settings/privatespace/PrivateSpaceCreationFragment.java index 1e0c65e0844..eb8864467b2 100644 --- a/src/com/android/settings/privatespace/PrivateSpaceCreationFragment.java +++ b/src/com/android/settings/privatespace/PrivateSpaceCreationFragment.java @@ -16,8 +16,14 @@ 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.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; @@ -42,12 +48,31 @@ import com.google.android.setupdesign.GlifLayout; public class PrivateSpaceCreationFragment extends InstrumentedFragment { private static final String TAG = "PrivateSpaceCreateFrag"; private static final int PRIVATE_SPACE_CREATE_POST_DELAY_MS = 1000; + private static final int PRIVATE_SPACE_ACCOUNT_LOGIN_POST_DELAY_MS = 5000; private static final Handler sHandler = new Handler(Looper.getMainLooper()); private Runnable mRunnable = () -> { createPrivateSpace(); }; + private Runnable mAccountLoginRunnable = + () -> { + unRegisterReceiver(); + startAccountLogin(); + }; + + final BroadcastReceiver mProfileAccessReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + if (action.equals(Intent.ACTION_PROFILE_ACCESSIBLE)) { + Log.i(TAG, "onReceive " + action); + sHandler.removeCallbacks(mAccountLoginRunnable); + sHandler.post(mAccountLoginRunnable); + } + } + }; + @Override public void onCreate(@Nullable Bundle savedInstanceState) { if (android.os.Flags.allowPrivateProfile() @@ -82,6 +107,7 @@ public class PrivateSpaceCreationFragment extends InstrumentedFragment { super.onResume(); // Ensures screen visibility to user by introducing a 1-second delay before creating private // space. + sHandler.removeCallbacks(mRunnable); sHandler.postDelayed(mRunnable, PRIVATE_SPACE_CREATE_POST_DELAY_MS); } @@ -97,8 +123,9 @@ public class PrivateSpaceCreationFragment extends InstrumentedFragment { mMetricsFeatureProvider.action( getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_SPACE_CREATED, true); if (isConnectedToInternet()) { - NavHostFragment.findNavController(PrivateSpaceCreationFragment.this) - .navigate(R.id.action_account_intro_fragment); + registerReceiver(); + sHandler.postDelayed( + mAccountLoginRunnable, PRIVATE_SPACE_ACCOUNT_LOGIN_POST_DELAY_MS); } else { NavHostFragment.findNavController(PrivateSpaceCreationFragment.this) .navigate(R.id.action_set_lock_fragment); @@ -127,4 +154,25 @@ public class PrivateSpaceCreationFragment extends InstrumentedFragment { NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); } + + /** Start new activity in private profile to add an account to private profile */ + private void startAccountLogin() { + 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().startActivityForResult(intent, ACCOUNT_LOGIN_ACTION); + } + + private void registerReceiver() { + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_PROFILE_ACCESSIBLE); + getActivity().registerReceiver(mProfileAccessReceiver, filter); + } + + private void unRegisterReceiver() { + if (mProfileAccessReceiver != null) { + getActivity().unregisterReceiver(mProfileAccessReceiver); + } + } } diff --git a/src/com/android/settings/privatespace/PrivateSpaceGaiaEducationFragment.java b/src/com/android/settings/privatespace/PrivateSpaceGaiaEducationFragment.java deleted file mode 100644 index 6c26186f982..00000000000 --- a/src/com/android/settings/privatespace/PrivateSpaceGaiaEducationFragment.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * 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() - && android.multiuser.Flags.enablePrivateSpaceFeatures()) { - 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/PrivateSpaceSetupActivity.java b/src/com/android/settings/privatespace/PrivateSpaceSetupActivity.java index 4cbcac74646..d67ce55892a 100644 --- a/src/com/android/settings/privatespace/PrivateSpaceSetupActivity.java +++ b/src/com/android/settings/privatespace/PrivateSpaceSetupActivity.java @@ -65,7 +65,7 @@ public class PrivateSpaceSetupActivity extends FragmentActivity { if (resultCode == RESULT_OK) { mMetricsFeatureProvider.action( this, SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_ACCOUNT_LOGIN_SUCCESS, true); - mNavHostFragment.getNavController().navigate(R.id.action_account_lock_fragment); + mNavHostFragment.getNavController().navigate(R.id.show_set_lock_fragment); } else { mMetricsFeatureProvider.action( this, diff --git a/src/com/android/settings/privatespace/SetupPreFinishDelayFragment.java b/src/com/android/settings/privatespace/SetupPreFinishDelayFragment.java index 4f2634eb775..89e2db1c41e 100644 --- a/src/com/android/settings/privatespace/SetupPreFinishDelayFragment.java +++ b/src/com/android/settings/privatespace/SetupPreFinishDelayFragment.java @@ -92,7 +92,7 @@ public class SetupPreFinishDelayFragment extends InstrumentedFragment { @Nullable Bundle savedInstanceState) { GlifLayout rootView = (GlifLayout) - inflater.inflate(R.layout.private_space_pre_finish_delay, container, false); + inflater.inflate(R.layout.private_space_wait_screen, container, false); OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) { @Override