diff options
| author | 2021-03-30 17:46:57 +0800 | |
|---|---|---|
| committer | 2021-04-09 11:09:52 +0800 | |
| commit | c9cd83a1933a663b67518f1de16a940df5b7a238 (patch) | |
| tree | 3eea06839dacb25cd9f1625288ea8cccae88d12a | |
| parent | 1618a4df4732c787e0513927526d11807d4f1656 (diff) | |
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
9 files changed, 159 insertions, 11 deletions
diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp index 5e69a4ee395c..69cee00041ad 100644 --- a/packages/SettingsLib/Android.bp +++ b/packages/SettingsLib/Android.bp @@ -32,7 +32,7 @@ android_library { "src/**/*.kt", ], - min_sdk_version: "21", + min_sdk_version: "29", } diff --git a/packages/SettingsLib/AndroidManifest.xml b/packages/SettingsLib/AndroidManifest.xml index a3473459948d..ad62f6e23ef0 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 dd9fc2c7c142..e50019680deb 100644 --- a/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp +++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp @@ -17,9 +17,10 @@ android_library { "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 dabba6832134..1c47f5ff862a 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 24d53ab84653..62dfc51b5b30 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 957bac742703..b29205d3bce2 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.view.ViewGroup; import android.widget.Toolbar; import androidx.annotation.Nullable; -import androidx.fragment.app.FragmentActivity; import com.google.android.material.appbar.CollapsingToolbarLayout; @@ -32,9 +31,10 @@ import com.google.android.material.appbar.CollapsingToolbarLayout; * 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 @@ public class CollapsingToolbarBaseActivity extends FragmentActivity { 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 @@ public class CollapsingToolbarBaseActivity extends FragmentActivity { 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 000000000000..47551dfe8422 --- /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 c12f6f748cba..d8cd556ba85d 100644 --- a/packages/SettingsLib/SettingsTransition/Android.bp +++ b/packages/SettingsLib/SettingsTransition/Android.bp @@ -18,5 +18,10 @@ android_library { ], 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 11660a5fe444..b6aff53e0290 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> |