Support different types of transitions.
In Settings, some cases are not suitable to apply the shared x-axis transition, and some pages shared with SUW may need to apply other transitions. Hence, create a mechanism for flexibility. Bug: 187542491 Test: robotest & navigate though settings pages Change-Id: I041bbb5e1d9177f234860864651f618700867b96
This commit is contained in:
@@ -50,6 +50,7 @@ import com.android.settings.dashboard.CategoryManager;
|
|||||||
import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin;
|
import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin;
|
||||||
import com.android.settingslib.drawer.Tile;
|
import com.android.settingslib.drawer.Tile;
|
||||||
import com.android.settingslib.transition.SettingsTransitionHelper;
|
import com.android.settingslib.transition.SettingsTransitionHelper;
|
||||||
|
import com.android.settingslib.transition.SettingsTransitionHelper.TransitionType;
|
||||||
|
|
||||||
import com.google.android.material.appbar.CollapsingToolbarLayout;
|
import com.google.android.material.appbar.CollapsingToolbarLayout;
|
||||||
import com.google.android.material.resources.TextAppearanceConfig;
|
import com.google.android.material.resources.TextAppearanceConfig;
|
||||||
@@ -63,6 +64,11 @@ import java.util.Set;
|
|||||||
|
|
||||||
public class SettingsBaseActivity extends FragmentActivity {
|
public class SettingsBaseActivity extends FragmentActivity {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* What type of page transition should be apply.
|
||||||
|
*/
|
||||||
|
public static final String EXTRA_PAGE_TRANSITION_TYPE = "extra_page_transition_type";
|
||||||
|
|
||||||
protected static final boolean DEBUG_TIMING = false;
|
protected static final boolean DEBUG_TIMING = false;
|
||||||
private static final String TAG = "SettingsBaseActivity";
|
private static final String TAG = "SettingsBaseActivity";
|
||||||
private static final String DATA_SCHEME_PKG = "package";
|
private static final String DATA_SCHEME_PKG = "package";
|
||||||
@@ -162,26 +168,53 @@ public class SettingsBaseActivity extends FragmentActivity {
|
|||||||
super.startActivity(intent);
|
super.startActivity(intent);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final int transitionType = getTransitionType(intent);
|
||||||
|
if (transitionType == TransitionType.TRANSITION_SLIDE) {
|
||||||
|
super.startActivity(intent, null);
|
||||||
|
overridePendingTransition(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out);
|
||||||
|
return;
|
||||||
|
} else if (transitionType == TransitionType.TRANSITION_NONE) {
|
||||||
|
super.startActivity(intent, null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
super.startActivity(intent, createActivityOptionsBundleForTransition(null));
|
super.startActivity(intent, createActivityOptionsBundleForTransition(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startActivity(Intent intent, @androidx.annotation.Nullable Bundle options) {
|
public void startActivity(Intent intent, @androidx.annotation.Nullable Bundle options) {
|
||||||
if (!Utils.isPageTransitionEnabled(this)) {
|
final int transitionType = getTransitionType(intent);
|
||||||
|
if (!Utils.isPageTransitionEnabled(this) ||
|
||||||
|
transitionType == TransitionType.TRANSITION_NONE) {
|
||||||
super.startActivity(intent, options);
|
super.startActivity(intent, options);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (transitionType == TransitionType.TRANSITION_SLIDE) {
|
||||||
|
super.startActivity(intent, options);
|
||||||
|
overridePendingTransition(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out);
|
||||||
|
return;
|
||||||
|
}
|
||||||
super.startActivity(intent, createActivityOptionsBundleForTransition(options));
|
super.startActivity(intent, createActivityOptionsBundleForTransition(options));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startActivityForResult(Intent intent, int requestCode) {
|
public void startActivityForResult(Intent intent, int requestCode) {
|
||||||
|
final int transitionType = getTransitionType(intent);
|
||||||
// startActivity() will eventually calls startActivityForResult() with requestCode -1.
|
// startActivity() will eventually calls startActivityForResult() with requestCode -1.
|
||||||
// Adding this condition to avoid multiple calls.
|
// Adding this condition to avoid multiple calls.
|
||||||
if (!Utils.isPageTransitionEnabled(this) || requestCode == DEFAULT_REQUEST) {
|
if (!Utils.isPageTransitionEnabled(this) || requestCode == DEFAULT_REQUEST
|
||||||
|
|| transitionType == TransitionType.TRANSITION_NONE) {
|
||||||
super.startActivityForResult(intent, requestCode);
|
super.startActivityForResult(intent, requestCode);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (transitionType == TransitionType.TRANSITION_SLIDE) {
|
||||||
|
super.startActivityForResult(intent, requestCode, null);
|
||||||
|
overridePendingTransition(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
super.startActivityForResult(intent, requestCode,
|
super.startActivityForResult(intent, requestCode,
|
||||||
createActivityOptionsBundleForTransition(null));
|
createActivityOptionsBundleForTransition(null));
|
||||||
}
|
}
|
||||||
@@ -189,10 +222,19 @@ public class SettingsBaseActivity extends FragmentActivity {
|
|||||||
@Override
|
@Override
|
||||||
public void startActivityForResult(Intent intent, int requestCode,
|
public void startActivityForResult(Intent intent, int requestCode,
|
||||||
@androidx.annotation.Nullable Bundle options) {
|
@androidx.annotation.Nullable Bundle options) {
|
||||||
if (!Utils.isPageTransitionEnabled(this) || requestCode == DEFAULT_REQUEST) {
|
final int transitionType = getTransitionType(intent);
|
||||||
|
if (!Utils.isPageTransitionEnabled(this) || requestCode == DEFAULT_REQUEST
|
||||||
|
|| transitionType == TransitionType.TRANSITION_NONE) {
|
||||||
super.startActivityForResult(intent, requestCode, options);
|
super.startActivityForResult(intent, requestCode, options);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (transitionType == TransitionType.TRANSITION_SLIDE) {
|
||||||
|
super.startActivityForResult(intent, requestCode, options);
|
||||||
|
overridePendingTransition(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
super.startActivityForResult(intent, requestCode,
|
super.startActivityForResult(intent, requestCode,
|
||||||
createActivityOptionsBundleForTransition(options));
|
createActivityOptionsBundleForTransition(options));
|
||||||
}
|
}
|
||||||
@@ -343,6 +385,11 @@ public class SettingsBaseActivity extends FragmentActivity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int getTransitionType(Intent intent) {
|
||||||
|
return intent.getIntExtra(EXTRA_PAGE_TRANSITION_TYPE,
|
||||||
|
SettingsTransitionHelper.TransitionType.TRANSITION_SHARED_AXIS);
|
||||||
|
}
|
||||||
|
|
||||||
@androidx.annotation.Nullable
|
@androidx.annotation.Nullable
|
||||||
private Bundle createActivityOptionsBundleForTransition(
|
private Bundle createActivityOptionsBundleForTransition(
|
||||||
@androidx.annotation.Nullable Bundle options) {
|
@androidx.annotation.Nullable Bundle options) {
|
||||||
|
@@ -34,6 +34,7 @@ import com.android.settings.SettingsActivity;
|
|||||||
import com.android.settings.SubSettings;
|
import com.android.settings.SubSettings;
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||||
|
import com.android.settingslib.transition.SettingsTransitionHelper.TransitionType;
|
||||||
|
|
||||||
public class SubSettingLauncher {
|
public class SubSettingLauncher {
|
||||||
|
|
||||||
@@ -47,6 +48,7 @@ public class SubSettingLauncher {
|
|||||||
}
|
}
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mLaunchRequest = new LaunchRequest();
|
mLaunchRequest = new LaunchRequest();
|
||||||
|
mLaunchRequest.transitionType = TransitionType.TRANSITION_SHARED_AXIS;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SubSettingLauncher setDestination(String fragmentName) {
|
public SubSettingLauncher setDestination(String fragmentName) {
|
||||||
@@ -120,6 +122,11 @@ public class SubSettingLauncher {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SubSettingLauncher setTransitionType(int transitionType) {
|
||||||
|
mLaunchRequest.transitionType = transitionType;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public void launch() {
|
public void launch() {
|
||||||
if (mLaunched) {
|
if (mLaunched) {
|
||||||
throw new IllegalStateException(
|
throw new IllegalStateException(
|
||||||
@@ -166,6 +173,9 @@ public class SubSettingLauncher {
|
|||||||
mLaunchRequest.titleResId);
|
mLaunchRequest.titleResId);
|
||||||
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, mLaunchRequest.title);
|
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, mLaunchRequest.title);
|
||||||
intent.addFlags(mLaunchRequest.flags);
|
intent.addFlags(mLaunchRequest.flags);
|
||||||
|
intent.putExtra(SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE,
|
||||||
|
mLaunchRequest.transitionType);
|
||||||
|
|
||||||
return intent;
|
return intent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,6 +229,7 @@ public class SubSettingLauncher {
|
|||||||
Fragment mResultListener;
|
Fragment mResultListener;
|
||||||
int mRequestCode;
|
int mRequestCode;
|
||||||
UserHandle userHandle;
|
UserHandle userHandle;
|
||||||
|
int transitionType;
|
||||||
Bundle arguments;
|
Bundle arguments;
|
||||||
Bundle extras;
|
Bundle extras;
|
||||||
}
|
}
|
||||||
|
@@ -37,6 +37,7 @@ import androidx.fragment.app.FragmentActivity;
|
|||||||
import com.android.settings.SettingsActivity;
|
import com.android.settings.SettingsActivity;
|
||||||
import com.android.settings.testutils.shadow.ShadowUtils;
|
import com.android.settings.testutils.shadow.ShadowUtils;
|
||||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||||
|
import com.android.settingslib.transition.SettingsTransitionHelper;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -97,6 +98,7 @@ public class SubSettingLauncherTest {
|
|||||||
.setDestination(SubSettingLauncherTest.class.getName())
|
.setDestination(SubSettingLauncherTest.class.getName())
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
.setSourceMetricsCategory(123)
|
.setSourceMetricsCategory(123)
|
||||||
|
.setTransitionType(SettingsTransitionHelper.TransitionType.TRANSITION_SLIDE)
|
||||||
.launch();
|
.launch();
|
||||||
doNothing().when(launcher).launch(any(Intent.class));
|
doNothing().when(launcher).launch(any(Intent.class));
|
||||||
verify(launcher).launch(intentArgumentCaptor.capture());
|
verify(launcher).launch(intentArgumentCaptor.capture());
|
||||||
@@ -109,6 +111,8 @@ public class SubSettingLauncherTest {
|
|||||||
assertThat(intent.getFlags()).isEqualTo(Intent.FLAG_ACTIVITY_NEW_TASK);
|
assertThat(intent.getFlags()).isEqualTo(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
assertThat(intent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, -1))
|
assertThat(intent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, -1))
|
||||||
.isEqualTo(123);
|
.isEqualTo(123);
|
||||||
|
assertThat(intent.getIntExtra(SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE, -1))
|
||||||
|
.isEqualTo(SettingsTransitionHelper.TransitionType.TRANSITION_SLIDE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
Reference in New Issue
Block a user