Merge changes I6387c999,I470e5c6e into main
* changes: Update illustrations in Private Space setup & settings Replace autoadvance screens with waiting screen in PS setup
This commit is contained in:
committed by
Android (Google) Code Review
commit
db315e642b
@@ -17,10 +17,10 @@
|
|||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:viewportWidth="24"
|
android:viewportWidth="960"
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="960"
|
||||||
|
android:tint="?android:attr/colorAccent">
|
||||||
<path
|
<path
|
||||||
android:pathData="M5,3H19C20.1,3 21,3.9 21,5V19C21,20.1 20.1,21 19,21H5C3.9,21 3,20.1 3,19V5C3,3.9 3.9,3 5,3ZM13.5,15.501L12.93,12.271C13.57,11.941 14,11.271 14,10.501C14,9.401 13.1,8.501 12,8.501C10.9,8.501 10,9.401 10,10.501C10,11.271 10.43,11.941 11.07,12.271L10.5,15.501H13.5Z"
|
|
||||||
android:fillColor="?android:attr/colorAccent"
|
android:fillColor="?android:attr/colorAccent"
|
||||||
android:fillType="evenOdd"/>
|
android:pathData="M480,440Q455,440 437.5,422.5Q420,405 420,380Q420,355 437.5,337.5Q455,320 480,320Q505,320 522.5,337.5Q540,355 540,380Q540,405 522.5,422.5Q505,440 480,440ZM480,880Q341,845 250.5,720.5Q160,596 160,444L160,200L480,80L800,200L800,444Q800,596 709.5,720.5Q619,845 480,880ZM440,720L520,720L520,680L600,680L600,600L520,600L520,514Q564,501 592,464.5Q620,428 620,380Q620,322 579,281Q538,240 480,240Q422,240 381,281Q340,322 340,380Q340,428 368,464.5Q396,501 440,514L440,720Z"/>
|
||||||
</vector>
|
</vector>
|
||||||
|
@@ -1,46 +0,0 @@
|
|||||||
<!--
|
|
||||||
~ Copyright (C) 2023 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<com.google.android.setupdesign.GlifLayout
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
android:id="@+id/private_space_autoadvance_screen"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:icon="@drawable/ic_private_space_icon">
|
|
||||||
<LinearLayout style="@style/SudContentFrame"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:orientation="vertical">
|
|
||||||
<com.airbnb.lottie.LottieAnimationView
|
|
||||||
android:id="@+id/lottie_animation"
|
|
||||||
style="@style/SudContentIllustration"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="0dp"
|
|
||||||
android:layout_weight="1"
|
|
||||||
app:lottie_rawRes="@null"/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/createMessage"
|
|
||||||
style="@style/PrivateSpaceSetupTextFontStyle"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textSize="14sp"
|
|
||||||
android:text="@string/private_space_setting_up_text"
|
|
||||||
android:layout_marginBottom="24dp"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</com.google.android.setupdesign.GlifLayout>
|
|
@@ -25,6 +25,6 @@
|
|||||||
android:icon="@drawable/ic_delete_accent"
|
android:icon="@drawable/ic_delete_accent"
|
||||||
app:sudUsePartnerHeavyTheme="true"
|
app:sudUsePartnerHeavyTheme="true"
|
||||||
app:sudIllustrationType="default"
|
app:sudIllustrationType="default"
|
||||||
app:sudDescriptionText = "@string/private_space_confirm_deletion_summary"
|
app:sudDescriptionText = "@string/private_space_few_moments_text"
|
||||||
app:sucHeaderText="@string/private_space_confirm_deletion_header">
|
app:sucHeaderText="@string/private_space_confirm_deletion_header">
|
||||||
</com.google.android.setupdesign.GlifLoadingLayout>
|
</com.google.android.setupdesign.GlifLoadingLayout>
|
30
res/layout/private_space_create_screen.xml
Normal file
30
res/layout/private_space_create_screen.xml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<com.google.android.setupdesign.GlifLoadingLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/private_space_create_screen"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:icon="@drawable/ic_private_space_icon"
|
||||||
|
app:sudUsePartnerHeavyTheme="true"
|
||||||
|
app:sudIllustrationType="default"
|
||||||
|
app:sudDescriptionText = "@string/private_space_few_moments_text"
|
||||||
|
app:sucHeaderText="@string/private_space_setting_up_text">
|
||||||
|
</com.google.android.setupdesign.GlifLoadingLayout>
|
@@ -23,14 +23,14 @@
|
|||||||
android:name="com.android.settings.privatespace.PrivateSpaceEducation"
|
android:name="com.android.settings.privatespace.PrivateSpaceEducation"
|
||||||
android:label="fragment_ps_education">
|
android:label="fragment_ps_education">
|
||||||
<action
|
<action
|
||||||
android:id="@+id/action_education_to_auto_advance"
|
android:id="@+id/action_education_to_create"
|
||||||
app:destination="@id/ps_auto_advance_fragment"/>
|
app:destination="@id/ps_create_fragment"/>
|
||||||
</fragment>
|
</fragment>
|
||||||
<fragment android:id="@+id/ps_auto_advance_fragment"
|
<fragment android:id="@+id/ps_create_fragment"
|
||||||
android:name="com.android.settings.privatespace.AutoAdvanceSetupFragment"
|
android:name="com.android.settings.privatespace.PrivateSpaceCreationFragment"
|
||||||
android:label="fragment_ps_auto_advance">
|
android:label="fragment_ps_create">
|
||||||
<action
|
<action
|
||||||
android:id="@+id/action_advance_profile_error"
|
android:id="@+id/action_create_profile_error"
|
||||||
app:destination="@id/ps_profile_error_fragment"/>
|
app:destination="@id/ps_profile_error_fragment"/>
|
||||||
<action
|
<action
|
||||||
android:id="@+id/action_set_lock_fragment"
|
android:id="@+id/action_set_lock_fragment"
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
android:label="fragment_ps_error">
|
android:label="fragment_ps_error">
|
||||||
<action
|
<action
|
||||||
android:id="@+id/action_retry_profile_creation"
|
android:id="@+id/action_retry_profile_creation"
|
||||||
app:destination="@id/ps_auto_advance_fragment"/>
|
app:destination="@id/ps_create_fragment"/>
|
||||||
</fragment>
|
</fragment>
|
||||||
<fragment android:id="@+id/ps_pre_finish_delay_fragment"
|
<fragment android:id="@+id/ps_pre_finish_delay_fragment"
|
||||||
android:name="com.android.settings.privatespace.SetupPreFinishDelayFragment"
|
android:name="com.android.settings.privatespace.SetupPreFinishDelayFragment"
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1295,8 +1295,6 @@
|
|||||||
<string name="private_space_delete_button_label">Delete</string>
|
<string name="private_space_delete_button_label">Delete</string>
|
||||||
<!-- Title for the private space delete confirmation page. [CHAR LIMIT=40] -->
|
<!-- Title for the private space delete confirmation page. [CHAR LIMIT=40] -->
|
||||||
<string name="private_space_confirm_deletion_header">Deleting private space\u2026</string>
|
<string name="private_space_confirm_deletion_header">Deleting private space\u2026</string>
|
||||||
<!-- Description for private space delete confirmation page that mentions it will take a few moments. [CHAR LIMIT=40] -->
|
|
||||||
<string name="private_space_confirm_deletion_summary">This will take a few moments</string>
|
|
||||||
<!-- Toast to show when the private space was deleted. [CHAR LIMIT=NONE] -->
|
<!-- Toast to show when the private space was deleted. [CHAR LIMIT=NONE] -->
|
||||||
<string name="private_space_deleted">Private space deleted</string>
|
<string name="private_space_deleted">Private space deleted</string>
|
||||||
<!-- Toast to show when the private space could not be deleted. [CHAR LIMIT=NONE] -->
|
<!-- Toast to show when the private space could not be deleted. [CHAR LIMIT=NONE] -->
|
||||||
@@ -1332,14 +1330,10 @@
|
|||||||
<!-- Private space footer link content description [CHAR LIMIT=40] -->
|
<!-- Private space footer link content description [CHAR LIMIT=40] -->
|
||||||
<string name="private_space_learn_more_text">Learn more about private space</string>
|
<string name="private_space_learn_more_text">Learn more about private space</string>
|
||||||
<string name="private_space_learn_more_url" translatable="false">https://support.google.com/android?p=private_space</string>
|
<string name="private_space_learn_more_url" translatable="false">https://support.google.com/android?p=private_space</string>
|
||||||
<!-- Text shown at the bottom in private space auto advancing screens. [CHAR LIMIT=60] -->
|
<!-- Description for private space loading page that mentions it will take a few moments. [CHAR LIMIT=40] -->
|
||||||
|
<string name="private_space_few_moments_text">This will take a few moments</string>
|
||||||
|
<!-- Title shown in private space creation screen. [CHAR LIMIT=60] -->
|
||||||
<string name="private_space_setting_up_text">Setting up private space\u2026</string>
|
<string name="private_space_setting_up_text">Setting up private space\u2026</string>
|
||||||
<!-- Title for private space setup in auto advancing screen informing private space notifications are hidden when locked. [CHAR LIMIT=NONE] -->
|
|
||||||
<string name="private_space_notifications_hidden_title">Notifications from private space apps are hidden when it\u2019s locked</string>
|
|
||||||
<!-- Title for private space setup in auto advancing screen informing to explore private space settings for hide and auto lock. [CHAR LIMIT=NONE] -->
|
|
||||||
<string name="private_space_explore_settings_title">Explore private space settings to hide private space and set up automatic locking</string>
|
|
||||||
<!-- Title for private space setup in auto advancing screen informing some system apps are already installed in private space. [CHAR LIMIT=NONE] -->
|
|
||||||
<string name="private_space_apps_installed_title">Required apps are already installed in your private space</string>
|
|
||||||
<!-- Title for private space creation error screen. [CHAR LIMIT=60] -->
|
<!-- Title for private space creation error screen. [CHAR LIMIT=60] -->
|
||||||
<string name="private_space_error_screen_title">Couldn\u2019t set up a private space</string>
|
<string name="private_space_error_screen_title">Couldn\u2019t set up a private space</string>
|
||||||
<!-- Label for button to retry creating private space again on creation error. [CHAR LIMIT=30] -->
|
<!-- Label for button to retry creating private space again on creation error. [CHAR LIMIT=30] -->
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
android:title="@string/private_space_hide_page_title">
|
android:title="@string/private_space_hide_page_title">
|
||||||
|
|
||||||
<com.android.settingslib.widget.IllustrationPreference
|
<com.android.settingslib.widget.IllustrationPreference
|
||||||
android:key="privatespace_hide_video"
|
android:key="private_space_hide_illustration"
|
||||||
settings:searchable="false"
|
settings:searchable="false"
|
||||||
settings:lottie_rawRes="@raw/private_space_hide_when_locked_illustration"/>
|
settings:lottie_rawRes="@raw/private_space_hide_when_locked_illustration"/>
|
||||||
|
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
settings:searchable="false">
|
settings:searchable="false">
|
||||||
|
|
||||||
<com.android.settingslib.widget.IllustrationPreference
|
<com.android.settingslib.widget.IllustrationPreference
|
||||||
android:key="private_space_settings"
|
android:key="private_space_illustration"
|
||||||
settings:searchable="false"
|
settings:searchable="false"
|
||||||
settings:lottie_rawRes="@raw/private_space_illustration"/>
|
settings:lottie_rawRes="@raw/private_space_illustration"/>
|
||||||
|
|
||||||
|
@@ -1,218 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 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 android.text.Layout.BREAK_STRATEGY_SIMPLE;
|
|
||||||
import static android.view.View.ACCESSIBILITY_LIVE_REGION_POLITE;
|
|
||||||
|
|
||||||
import android.animation.Animator;
|
|
||||||
import android.animation.AnimatorListenerAdapter;
|
|
||||||
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;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.util.Pair;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
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;
|
|
||||||
|
|
||||||
import com.airbnb.lottie.LottieAnimationView;
|
|
||||||
import com.google.android.setupdesign.GlifLayout;
|
|
||||||
import com.google.common.collect.ImmutableList;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/** Fragment to show screens that auto advance during private space setup flow */
|
|
||||||
public class AutoAdvanceSetupFragment extends InstrumentedFragment {
|
|
||||||
private static final String TAG = "AutoAdvanceFragment";
|
|
||||||
private static final String TITLE_INDEX = "title_index";
|
|
||||||
private static final int DELAY_BETWEEN_SCREENS = 5000; // 5 seconds in millis
|
|
||||||
private static final int ANIMATION_DURATION_MILLIS = 500;
|
|
||||||
private static final int HEADER_TEXT_MAX_LINES = 4;
|
|
||||||
private GlifLayout mRootView;
|
|
||||||
private static final Handler sHandler = new Handler(Looper.getMainLooper());
|
|
||||||
private int mScreenTitleIndex;
|
|
||||||
private static final List<Pair<Integer, Integer>> HEADER_ILLUSTRATION_PAIRS =
|
|
||||||
ImmutableList.of(
|
|
||||||
new Pair(R.string.private_space_notifications_hidden_title,
|
|
||||||
R.raw.private_space_notifications_illustration),
|
|
||||||
new Pair(R.string.private_space_apps_installed_title,
|
|
||||||
R.raw.private_space_unlock_to_share_illustration),
|
|
||||||
new Pair(R.string.private_space_explore_settings_title,
|
|
||||||
R.raw.private_space_placeholder_illustration));
|
|
||||||
|
|
||||||
private Runnable mUpdateScreenResources =
|
|
||||||
new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (getActivity() != null) {
|
|
||||||
if (++mScreenTitleIndex < HEADER_ILLUSTRATION_PAIRS.size()) {
|
|
||||||
startFadeOutAnimation();
|
|
||||||
sHandler.postDelayed(mUpdateScreenResources, DELAY_BETWEEN_SCREENS);
|
|
||||||
} else if (PrivateSpaceMaintainer.getInstance(getActivity())
|
|
||||||
.doesPrivateSpaceExist()) {
|
|
||||||
mMetricsFeatureProvider.action(
|
|
||||||
getContext(),
|
|
||||||
SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_SPACE_CREATED,
|
|
||||||
true);
|
|
||||||
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(),
|
|
||||||
SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_SPACE_CREATED,
|
|
||||||
false);
|
|
||||||
showPrivateSpaceErrorScreen();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
|
||||||
if (android.os.Flags.allowPrivateProfile()
|
|
||||||
&& android.multiuser.Flags.enablePrivateSpaceFeatures()) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View onCreateView(
|
|
||||||
LayoutInflater inflater,
|
|
||||||
@Nullable ViewGroup container,
|
|
||||||
@Nullable Bundle savedInstanceState) {
|
|
||||||
if (savedInstanceState == null) {
|
|
||||||
if (PrivateSpaceMaintainer.getInstance(getActivity()).createPrivateSpace()) {
|
|
||||||
Log.i(TAG, "Private Space created");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
mScreenTitleIndex = savedInstanceState.getInt(TITLE_INDEX);
|
|
||||||
if (mScreenTitleIndex >= HEADER_ILLUSTRATION_PAIRS.size()) {
|
|
||||||
return super.onCreateView(inflater, container, savedInstanceState);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mRootView =
|
|
||||||
(GlifLayout)
|
|
||||||
inflater.inflate(R.layout.private_space_advancing_screen, container, false);
|
|
||||||
mRootView.getHeaderTextView().setMaxLines(HEADER_TEXT_MAX_LINES);
|
|
||||||
mRootView.getHeaderTextView().setBreakStrategy(BREAK_STRATEGY_SIMPLE);
|
|
||||||
mRootView.getHeaderTextView().setAccessibilityLiveRegion(ACCESSIBILITY_LIVE_REGION_POLITE);
|
|
||||||
updateHeaderAndIllustration();
|
|
||||||
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 mRootView;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSaveInstanceState(@NotNull Bundle outState) {
|
|
||||||
super.onSaveInstanceState(outState);
|
|
||||||
outState.putInt(TITLE_INDEX, mScreenTitleIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDestroy() {
|
|
||||||
sHandler.removeCallbacks(mUpdateScreenResources);
|
|
||||||
super.onDestroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
sHandler.postDelayed(mUpdateScreenResources, DELAY_BETWEEN_SCREENS);
|
|
||||||
super.onResume();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getMetricsCategory() {
|
|
||||||
return SettingsEnums.PRIVATE_SPACE_SETUP_SPACE_CREATION;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void showPrivateSpaceErrorScreen() {
|
|
||||||
NavHostFragment.findNavController(AutoAdvanceSetupFragment.this)
|
|
||||||
.navigate(R.id.action_advance_profile_error);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateHeaderAndIllustration() {
|
|
||||||
mRootView.setHeaderText(HEADER_ILLUSTRATION_PAIRS.get(mScreenTitleIndex).first);
|
|
||||||
LottieAnimationView animationView = mRootView.findViewById(R.id.lottie_animation);
|
|
||||||
animationView.setAnimation(HEADER_ILLUSTRATION_PAIRS.get(mScreenTitleIndex).second);
|
|
||||||
animationView.playAnimation();
|
|
||||||
startFadeInAnimation();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void startFadeInAnimation() {
|
|
||||||
ValueAnimator textView = ObjectAnimator.ofFloat(
|
|
||||||
mRootView.getHeaderTextView(), View.ALPHA, 0f, 1f);
|
|
||||||
ValueAnimator lottieView = ObjectAnimator.ofFloat(
|
|
||||||
mRootView.findViewById(R.id.lottie_animation), View.ALPHA, 0, 1f);
|
|
||||||
AnimatorSet fadeIn = new AnimatorSet();
|
|
||||||
fadeIn.playTogether(textView, lottieView);
|
|
||||||
fadeIn.setDuration(ANIMATION_DURATION_MILLIS).start();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void startFadeOutAnimation() {
|
|
||||||
AnimatorSet fadeOut = new AnimatorSet();
|
|
||||||
ValueAnimator textView = ObjectAnimator.ofFloat(
|
|
||||||
mRootView.getHeaderTextView(), View.ALPHA, 1f, 0f);
|
|
||||||
ValueAnimator lottieView = ObjectAnimator.ofFloat(
|
|
||||||
mRootView.findViewById(R.id.lottie_animation), View.ALPHA, 1f, 0f);
|
|
||||||
fadeOut.playTogether(textView, lottieView);
|
|
||||||
fadeOut.setDuration(ANIMATION_DURATION_MILLIS).start();
|
|
||||||
fadeOut.addListener(new AnimatorListenerAdapter() {
|
|
||||||
@Override
|
|
||||||
public void onAnimationEnd(Animator animation) {
|
|
||||||
updateHeaderAndIllustration();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 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();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -21,9 +21,12 @@ import android.os.Bundle;
|
|||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.dashboard.DashboardFragment;
|
import com.android.settings.dashboard.DashboardFragment;
|
||||||
|
import com.android.settingslib.widget.IllustrationPreference;
|
||||||
|
|
||||||
public class HidePrivateSpaceSettings extends DashboardFragment {
|
public class HidePrivateSpaceSettings extends DashboardFragment {
|
||||||
private static final String TAG = "HidePrivateSpaceSettings";
|
private static final String TAG = "HidePrivateSpaceSettings";
|
||||||
|
private static final String PRIVATE_SPACE_HIDE_ILLUSTRATION_KEY =
|
||||||
|
"private_space_hide_illustration";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle icicle) {
|
public void onCreate(Bundle icicle) {
|
||||||
@@ -41,6 +44,14 @@ public class HidePrivateSpaceSettings extends DashboardFragment{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
final IllustrationPreference illustrationPreference =
|
||||||
|
getPreferenceScreen().findPreference(PRIVATE_SPACE_HIDE_ILLUSTRATION_KEY);
|
||||||
|
illustrationPreference.applyDynamicColor();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMetricsCategory() {
|
public int getMetricsCategory() {
|
||||||
return SettingsEnums.PRIVATE_SPACE_SETTINGS;
|
return SettingsEnums.PRIVATE_SPACE_SETTINGS;
|
||||||
|
@@ -0,0 +1,130 @@
|
|||||||
|
/*
|
||||||
|
* 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 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;
|
||||||
|
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.setupdesign.GlifLayout;
|
||||||
|
|
||||||
|
/** Fragment to a show loading screen and create private profile during private space setup flow */
|
||||||
|
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 Handler sHandler = new Handler(Looper.getMainLooper());
|
||||||
|
private Runnable mRunnable =
|
||||||
|
() -> {
|
||||||
|
createPrivateSpace();
|
||||||
|
};
|
||||||
|
|
||||||
|
@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_create_screen, container, false);
|
||||||
|
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 void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
// Ensures screen visibility to user by introducing a 1-second delay before creating private
|
||||||
|
// space.
|
||||||
|
sHandler.postDelayed(mRunnable, PRIVATE_SPACE_CREATE_POST_DELAY_MS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
sHandler.removeCallbacks(mRunnable);
|
||||||
|
super.onDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createPrivateSpace() {
|
||||||
|
if (PrivateSpaceMaintainer.getInstance(getActivity()).createPrivateSpace()) {
|
||||||
|
Log.i(TAG, "Private Space created");
|
||||||
|
mMetricsFeatureProvider.action(
|
||||||
|
getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_SPACE_CREATED, true);
|
||||||
|
if (isConnectedToInternet()) {
|
||||||
|
NavHostFragment.findNavController(PrivateSpaceCreationFragment.this)
|
||||||
|
.navigate(R.id.action_account_intro_fragment);
|
||||||
|
} else {
|
||||||
|
NavHostFragment.findNavController(PrivateSpaceCreationFragment.this)
|
||||||
|
.navigate(R.id.action_set_lock_fragment);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mMetricsFeatureProvider.action(
|
||||||
|
getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_SPACE_CREATED, false);
|
||||||
|
showPrivateSpaceErrorScreen();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMetricsCategory() {
|
||||||
|
return SettingsEnums.PRIVATE_SPACE_SETUP_SPACE_CREATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showPrivateSpaceErrorScreen() {
|
||||||
|
NavHostFragment.findNavController(PrivateSpaceCreationFragment.this)
|
||||||
|
.navigate(R.id.action_create_profile_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 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();
|
||||||
|
}
|
||||||
|
}
|
@@ -26,10 +26,12 @@ import android.widget.Toast;
|
|||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.dashboard.DashboardFragment;
|
import com.android.settings.dashboard.DashboardFragment;
|
||||||
|
import com.android.settingslib.widget.IllustrationPreference;
|
||||||
|
|
||||||
/** Fragment representing the Private Space dashboard in Settings. */
|
/** Fragment representing the Private Space dashboard in Settings. */
|
||||||
public class PrivateSpaceDashboardFragment extends DashboardFragment {
|
public class PrivateSpaceDashboardFragment extends DashboardFragment {
|
||||||
private static final String TAG = "PSDashboardFragment";
|
private static final String TAG = "PSDashboardFragment";
|
||||||
|
private static final String PRIVATE_SPACE_ILLUSTRATION_KEY = "private_space_illustration";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle icicle) {
|
public void onCreate(Bundle icicle) {
|
||||||
@@ -60,6 +62,14 @@ public class PrivateSpaceDashboardFragment extends DashboardFragment {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
final IllustrationPreference illustrationPreference =
|
||||||
|
getPreferenceScreen().findPreference(PRIVATE_SPACE_ILLUSTRATION_KEY);
|
||||||
|
illustrationPreference.applyDynamicColor();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int getPreferenceScreenResId() {
|
protected int getPreferenceScreenResId() {
|
||||||
return R.xml.private_space_settings;
|
return R.xml.private_space_settings;
|
||||||
|
@@ -31,7 +31,9 @@ import androidx.navigation.fragment.NavHostFragment;
|
|||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.core.InstrumentedFragment;
|
import com.android.settings.core.InstrumentedFragment;
|
||||||
|
import com.android.settingslib.widget.LottieColorUtils;
|
||||||
|
|
||||||
|
import com.airbnb.lottie.LottieAnimationView;
|
||||||
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;
|
||||||
@@ -69,6 +71,8 @@ public class PrivateSpaceEducation extends InstrumentedFragment {
|
|||||||
.setButtonType(FooterButton.ButtonType.CANCEL)
|
.setButtonType(FooterButton.ButtonType.CANCEL)
|
||||||
.setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary)
|
.setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary)
|
||||||
.build());
|
.build());
|
||||||
|
LottieAnimationView lottieAnimationView = rootView.findViewById(R.id.lottie_animation);
|
||||||
|
LottieColorUtils.applyDynamicColors(getContext(), lottieAnimationView);
|
||||||
|
|
||||||
TextView infoTextView = rootView.findViewById(R.id.learn_more);
|
TextView infoTextView = rootView.findViewById(R.id.learn_more);
|
||||||
Pattern pattern = Pattern.compile(infoTextView.getText().toString());
|
Pattern pattern = Pattern.compile(infoTextView.getText().toString());
|
||||||
@@ -91,7 +95,7 @@ public class PrivateSpaceEducation extends InstrumentedFragment {
|
|||||||
getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_START);
|
getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_START);
|
||||||
Log.i(TAG, "Starting private space setup");
|
Log.i(TAG, "Starting private space setup");
|
||||||
NavHostFragment.findNavController(PrivateSpaceEducation.this)
|
NavHostFragment.findNavController(PrivateSpaceEducation.this)
|
||||||
.navigate(R.id.action_education_to_auto_advance);
|
.navigate(R.id.action_education_to_create);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -83,7 +83,7 @@ public class PrivateSpaceMaintainer {
|
|||||||
*
|
*
|
||||||
* <p> This method should be used by the Private Space Setup Flow ONLY.
|
* <p> This method should be used by the Private Space Setup Flow ONLY.
|
||||||
*/
|
*/
|
||||||
@VisibleForTesting
|
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
|
||||||
public final synchronized boolean createPrivateSpace() {
|
public final synchronized boolean createPrivateSpace() {
|
||||||
if (!Flags.allowPrivateProfile()
|
if (!Flags.allowPrivateProfile()
|
||||||
|| !android.multiuser.Flags.enablePrivateSpaceFeatures()) {
|
|| !android.multiuser.Flags.enablePrivateSpaceFeatures()) {
|
||||||
|
@@ -34,7 +34,9 @@ import androidx.navigation.fragment.NavHostFragment;
|
|||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.core.InstrumentedFragment;
|
import com.android.settings.core.InstrumentedFragment;
|
||||||
|
import com.android.settingslib.widget.LottieColorUtils;
|
||||||
|
|
||||||
|
import com.airbnb.lottie.LottieAnimationView;
|
||||||
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;
|
||||||
@@ -82,6 +84,8 @@ public class PrivateSpaceSetLockFragment extends InstrumentedFragment {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
|
requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
|
||||||
|
LottieAnimationView lottieAnimationView = rootView.findViewById(R.id.lottie_animation);
|
||||||
|
LottieColorUtils.applyDynamicColors(getContext(), lottieAnimationView);
|
||||||
|
|
||||||
return rootView;
|
return rootView;
|
||||||
}
|
}
|
||||||
|
@@ -35,7 +35,9 @@ import androidx.annotation.Nullable;
|
|||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.core.InstrumentedFragment;
|
import com.android.settings.core.InstrumentedFragment;
|
||||||
|
import com.android.settingslib.widget.LottieColorUtils;
|
||||||
|
|
||||||
|
import com.airbnb.lottie.LottieAnimationView;
|
||||||
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;
|
||||||
@@ -75,6 +77,8 @@ public class SetupSuccessFragment extends InstrumentedFragment {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
|
requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
|
||||||
|
LottieAnimationView lottieAnimationView = rootView.findViewById(R.id.lottie_animation);
|
||||||
|
LottieColorUtils.applyDynamicColors(getContext(), lottieAnimationView);
|
||||||
|
|
||||||
return rootView;
|
return rootView;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user