Apply settings page transition

This change applies Shared X-Axis transition across settings pages. For
injected settings, the injected apps have to also apply the same
transition to take effect.

Fixes: 177479937
Test: robotests and navigate through settings pages
Change-Id: I6241860766f5969428faf9a5b3730a7614fdcd92
This commit is contained in:
Yi-Ling Chuang
2021-04-23 17:10:53 +08:00
parent e37695c89d
commit 58813f7b6c
7 changed files with 143 additions and 5 deletions

View File

@@ -18,6 +18,7 @@ package com.android.settings.core;
import android.annotation.LayoutRes;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -27,6 +28,7 @@ import android.content.pm.PackageManager;
import android.content.res.TypedArray;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.FeatureFlagUtils;
@@ -43,8 +45,10 @@ import androidx.fragment.app.FragmentActivity;
import com.android.settings.R;
import com.android.settings.SubSettings;
import com.android.settings.Utils;
import com.android.settings.dashboard.CategoryManager;
import com.android.settingslib.drawer.Tile;
import com.android.settingslib.transition.SettingsTransitionHelper;
import com.google.android.material.appbar.CollapsingToolbarLayout;
import com.google.android.setupcompat.util.WizardManagerHelper;
@@ -60,6 +64,7 @@ public class SettingsBaseActivity extends FragmentActivity {
protected static final boolean DEBUG_TIMING = false;
private static final String TAG = "SettingsBaseActivity";
private static final String DATA_SCHEME_PKG = "package";
private static final int DEFAULT_REQUEST = -1;
// Serves as a temporary list of tiles to ignore until we heard back from the PM that they
// are disabled.
@@ -73,6 +78,13 @@ public class SettingsBaseActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
if (Utils.isPageTransitionEnabled(this)) {
// Enable Activity transitions
getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
SettingsTransitionHelper.applyForwardTransition(this);
SettingsTransitionHelper.applyBackwardTransition(this);
}
super.onCreate(savedInstanceState);
if (isLockTaskModePinned() && !isSettingsRunOnTop()) {
Log.w(TAG, "Devices lock task mode pinned.");
@@ -122,6 +134,57 @@ public class SettingsBaseActivity extends FragmentActivity {
return true;
}
@Override
public void startActivity(Intent intent) {
if (!Utils.isPageTransitionEnabled(this)) {
super.startActivity(intent);
return;
}
super.startActivity(intent, getActivityOptionsBundle());
}
@Override
public void startActivity(Intent intent, @androidx.annotation.Nullable Bundle options) {
if (!Utils.isPageTransitionEnabled(this) || options != null) {
super.startActivity(intent, options);
return;
}
super.startActivity(intent, getActivityOptionsBundle());
}
@Override
public void startActivityForResult(Intent intent, int requestCode) {
// startActivity() will eventually calls startActivityForResult() with requestCode -1.
// Adding this condition to avoid multiple calls.
if (!Utils.isPageTransitionEnabled(this) || requestCode == DEFAULT_REQUEST) {
super.startActivityForResult(intent, requestCode);
return;
}
super.startActivityForResult(intent, requestCode, getActivityOptionsBundle());
}
@Override
public void startActivityForResult(Intent intent, int requestCode,
@androidx.annotation.Nullable Bundle options) {
if (!Utils.isPageTransitionEnabled(this) || requestCode == DEFAULT_REQUEST
|| options != null) {
super.startActivityForResult(intent, requestCode, options);
return;
}
super.startActivityForResult(intent, requestCode, getActivityOptionsBundle());
}
@Override
public void startActivityForResultAsUser(Intent intent, int requestCode,
UserHandle userHandle) {
if (!Utils.isPageTransitionEnabled(this) || requestCode == DEFAULT_REQUEST) {
super.startActivityForResultAsUser(intent, requestCode, userHandle);
return;
}
super.startActivityForResultAsUser(intent, requestCode, getActivityOptionsBundle(),
userHandle);
}
@Override
protected void onResume() {
super.onResume();
@@ -267,10 +330,16 @@ public class SettingsBaseActivity extends FragmentActivity {
}
}
private Bundle getActivityOptionsBundle() {
final Toolbar toolbar = findViewById(R.id.action_bar);
return ActivityOptions.makeSceneTransitionAnimation(this, toolbar,
"shared_element_view").toBundle();
}
public interface CategoryListener {
/**
* @param categories the changed categories that have to be refreshed, or null to force
* refreshing all.
* refreshing all.
*/
void onCategoriesChanged(@Nullable Set<String> categories);
}

View File

@@ -17,18 +17,22 @@
package com.android.settings.core;
import android.annotation.StringRes;
import android.app.Activity;
import android.app.ActivityOptions;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.UserHandle;
import android.text.TextUtils;
import android.widget.Toolbar;
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.SubSettings;
import com.android.settings.Utils;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class SubSettingLauncher {
@@ -183,7 +187,16 @@ public class SubSettingLauncher {
resultListener.getActivity().startActivityForResultAsUser(intent, requestCode, userHandle);
}
private void launchForResult(Fragment listener, Intent intent, int requestCode) {
@VisibleForTesting
void launchForResult(Fragment listener, Intent intent, int requestCode) {
if (Utils.isPageTransitionEnabled(mContext)) {
final Activity activity = listener.getActivity();
final Toolbar toolbar = activity.findViewById(R.id.action_bar);
final Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(activity, toolbar,
"shared_element_view").toBundle();
listener.startActivityForResult(intent, requestCode, bundle);
return;
}
listener.startActivityForResult(intent, requestCode);
}
@@ -192,6 +205,7 @@ public class SubSettingLauncher {
intent.replaceExtras(mLaunchRequest.extras);
}
}
/**
* Simple container that has information about how to launch a subsetting.
*/