Create SettingsTransitionActivity
SettingsTransitionActivity is an abstract activity being in charge of
the transition feature. Activities extending it will get settings
transition applied.
We make CollapsingToolbarBaseActivity extend this activity. Clients
extending CollapsingToolbarBaseActivity will have both app bar behaviour
and the transition applied.
Also add android:transitionName into the collapsing layout, so the
transition would start from the back arrow on the action bar.
And bump the min_sdk to 29 to relevant dependencies.
Bug: 177480673
Test: rebuild and apply it on NotificationHistoryActivity
Change-Id: I8e070a0f07080d027fec7b944bdcdbb758ae44b7
diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp
index 5e69a4e..69cee00 100644
--- a/packages/SettingsLib/Android.bp
+++ b/packages/SettingsLib/Android.bp
@@ -32,7 +32,7 @@
"src/**/*.kt",
],
- min_sdk_version: "21",
+ min_sdk_version: "29",
}
diff --git a/packages/SettingsLib/AndroidManifest.xml b/packages/SettingsLib/AndroidManifest.xml
index a347345..ad62f6e 100644
--- a/packages/SettingsLib/AndroidManifest.xml
+++ b/packages/SettingsLib/AndroidManifest.xml
@@ -18,4 +18,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.settingslib">
+ <uses-sdk android:minSdkVersion="29" />
+
</manifest>
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp b/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp
index dd9fc2c..e500196 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp
@@ -17,9 +17,10 @@
"androidx.annotation_annotation",
"androidx.core_core",
"com.google.android.material_material",
+ "SettingsLibSettingsTransition",
],
sdk_version: "system_current",
- min_sdk_version: "21",
+ min_sdk_version: "29",
apex_available: [
"//apex_available:platform",
"com.android.cellbroadcast",
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/AndroidManifest.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/AndroidManifest.xml
index dabba68..1c47f5f 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/AndroidManifest.xml
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/AndroidManifest.xml
@@ -18,6 +18,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.settingslib.collapsingtoolbar">
- <uses-sdk android:minSdkVersion="21" />
+ <uses-sdk android:minSdkVersion="29" />
</manifest>
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v31/collapsing_toolbar_base_layout.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v31/collapsing_toolbar_base_layout.xml
index 24d53ab..62dfc51 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v31/collapsing_toolbar_base_layout.xml
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v31/collapsing_toolbar_base_layout.xml
@@ -19,8 +19,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/content_parent"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:transitionGroup="true">
+ android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar"
@@ -47,6 +46,7 @@
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:theme="?android:attr/actionBarTheme"
+ android:transitionName="shared_element_view"
app:layout_collapseMode="pin"/>
</com.android.settingslib.collapsingtoolbar.AdjustableToolbarLayout>
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java
index 957bac7..b29205d 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java
@@ -24,7 +24,6 @@
import android.widget.Toolbar;
import androidx.annotation.Nullable;
-import androidx.fragment.app.FragmentActivity;
import com.google.android.material.appbar.CollapsingToolbarLayout;
@@ -32,9 +31,10 @@
* A base Activity that has a collapsing toolbar layout is used for the activities intending to
* enable the collapsing toolbar function.
*/
-public class CollapsingToolbarBaseActivity extends FragmentActivity {
+public class CollapsingToolbarBaseActivity extends SettingsTransitionActivity {
private CollapsingToolbarLayout mCollapsingToolbarLayout;
+ private Toolbar mToolbar;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -43,8 +43,8 @@
super.setContentView(R.layout.collapsing_toolbar_base_layout);
mCollapsingToolbarLayout = findViewById(R.id.collapsing_toolbar);
- final Toolbar toolbar = findViewById(R.id.action_bar);
- setActionBar(toolbar);
+ mToolbar = findViewById(R.id.action_bar);
+ setActionBar(mToolbar);
// Enable title and home button by default
final ActionBar actionBar = getActionBar();
@@ -98,6 +98,11 @@
return true;
}
+ @Override
+ public Toolbar getToolbar() {
+ return mToolbar;
+ }
+
/**
* Returns an instance of collapsing toolbar.
*/
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/SettingsTransitionActivity.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/SettingsTransitionActivity.java
new file mode 100644
index 0000000..47551df
--- /dev/null
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/SettingsTransitionActivity.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2021 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.settingslib.collapsingtoolbar;
+
+import android.app.ActivityOptions;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.MenuItem;
+import android.view.Window;
+import android.widget.Toolbar;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.FragmentActivity;
+
+import com.android.settingslib.transition.SettingsTransitionHelper;
+
+/**
+ * A base Activity for Settings-specific page transition. Activities extending it will get
+ * Settings transition applied.
+ */
+public abstract class SettingsTransitionActivity extends FragmentActivity {
+ private static final String TAG = "SettingsTransitionActivity";
+ private static final int DEFAULT_REQUEST = -1;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
+ SettingsTransitionHelper.applyForwardTransition(this);
+ SettingsTransitionHelper.applyBackwardTransition(this);
+ }
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public void startActivity(Intent intent) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
+ super.startActivity(intent);
+ return;
+ }
+ final Toolbar toolbar = getToolbar();
+ if (toolbar == null) {
+ Log.w(TAG, "Toolbar is null. Cannot apply settings transition!");
+ super.startActivity(intent);
+ return;
+ }
+ super.startActivity(intent, getActivityOptionsBundle(toolbar));
+
+ }
+
+ @Override
+ public void startActivity(Intent intent, @Nullable Bundle options) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
+ super.startActivity(intent, options);
+ return;
+ }
+ final Toolbar toolbar = getToolbar();
+ if (toolbar == null) {
+ Log.w(TAG, "Toolbar is null. Cannot apply settings transition!");
+ super.startActivity(intent, options);
+ return;
+ }
+ super.startActivity(intent, getActivityOptionsBundle(toolbar));
+ }
+
+ @Override
+ public void startActivityForResult(Intent intent, int requestCode) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S || requestCode == DEFAULT_REQUEST) {
+ super.startActivityForResult(intent, requestCode);
+ return;
+ }
+
+ final Toolbar toolbar = getToolbar();
+ if (toolbar == null) {
+ Log.w(TAG, "Toolbar is null. Cannot apply settings transition!");
+ super.startActivityForResult(intent, requestCode);
+ return;
+ }
+ super.startActivityForResult(intent, requestCode, getActivityOptionsBundle(toolbar));
+ }
+
+ @Override
+ public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S || requestCode == DEFAULT_REQUEST) {
+ super.startActivityForResult(intent, requestCode, options);
+ return;
+ }
+
+ final Toolbar toolbar = getToolbar();
+ if (toolbar == null) {
+ Log.w(TAG, "Toolbar is null. Cannot apply settings transition!");
+ super.startActivityForResult(intent, requestCode, options);
+ return;
+ }
+ super.startActivityForResult(intent, requestCode, getActivityOptionsBundle(toolbar));
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ final int id = item.getItemId();
+ if (id == android.R.id.home) {
+ // Make the up button behave the same as the back button.
+ onBackPressed();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ /**
+ * Subclasses should implement this method and return their {@link Toolbar}.
+ */
+ public abstract Toolbar getToolbar();
+
+ private Bundle getActivityOptionsBundle(Toolbar toolbar) {
+ return ActivityOptions.makeSceneTransitionAnimation(this, toolbar,
+ "shared_element_view").toBundle();
+ }
+}
diff --git a/packages/SettingsLib/SettingsTransition/Android.bp b/packages/SettingsLib/SettingsTransition/Android.bp
index c12f6f7..d8cd556 100644
--- a/packages/SettingsLib/SettingsTransition/Android.bp
+++ b/packages/SettingsLib/SettingsTransition/Android.bp
@@ -18,5 +18,10 @@
],
sdk_version: "system_current",
- min_sdk_version: "21",
+ min_sdk_version: "29",
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.cellbroadcast",
+ "com.android.permission",
+ ],
}
diff --git a/packages/SettingsLib/SettingsTransition/AndroidManifest.xml b/packages/SettingsLib/SettingsTransition/AndroidManifest.xml
index 11660a5f..b6aff53 100644
--- a/packages/SettingsLib/SettingsTransition/AndroidManifest.xml
+++ b/packages/SettingsLib/SettingsTransition/AndroidManifest.xml
@@ -18,6 +18,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.settingslib.transition">
- <uses-sdk android:minSdkVersion="21" />
+ <uses-sdk android:minSdkVersion="29" />
</manifest>