From c9cd83a1933a663b67518f1de16a940df5b7a238 Mon Sep 17 00:00:00 2001 From: Yi-Ling Chuang Date: Tue, 30 Mar 2021 17:46:57 +0800 Subject: [PATCH] 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 --- packages/SettingsLib/Android.bp | 2 +- packages/SettingsLib/AndroidManifest.xml | 2 + .../CollapsingToolbarBaseActivity/Android.bp | 3 +- .../AndroidManifest.xml | 2 +- .../collapsing_toolbar_base_layout.xml | 4 +- .../CollapsingToolbarBaseActivity.java | 13 +- .../SettingsTransitionActivity.java | 135 ++++++++++++++++++ .../SettingsLib/SettingsTransition/Android.bp | 7 +- .../SettingsTransition/AndroidManifest.xml | 2 +- 9 files changed, 159 insertions(+), 11 deletions(-) create mode 100644 packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/SettingsTransitionActivity.java diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp index 5e69a4ee395cd..69cee00041ad9 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 a3473459948d8..ad62f6e23ef0d 100644 --- a/packages/SettingsLib/AndroidManifest.xml +++ b/packages/SettingsLib/AndroidManifest.xml @@ -18,4 +18,6 @@ + + diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp b/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp index dd9fc2c7c142d..e50019680deba 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 dabba68321340..1c47f5ff862ae 100644 --- a/packages/SettingsLib/CollapsingToolbarBaseActivity/AndroidManifest.xml +++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/AndroidManifest.xml @@ -18,6 +18,6 @@ - + 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 24d53ab846531..62dfc51b5b30c 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"> 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 957bac7427039..b29205d3bce2b 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 0000000000000..47551dfe84226 --- /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 c12f6f748cba1..d8cd556ba85df 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 11660a5fe4444..b6aff53e0290f 100644 --- a/packages/SettingsLib/SettingsTransition/AndroidManifest.xml +++ b/packages/SettingsLib/SettingsTransition/AndroidManifest.xml @@ -18,6 +18,6 @@ - +