Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0d6ceb67 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Improve SettingsTransitionActivity for standalone usage." into sc-dev

parents 14bc81b9 32a20b39
Loading
Loading
Loading
Loading
+3 −9
Original line number Diff line number Diff line
@@ -35,7 +35,6 @@ import com.google.android.material.resources.TextAppearanceConfig;
public class CollapsingToolbarBaseActivity extends SettingsTransitionActivity {

    private CollapsingToolbarLayout mCollapsingToolbarLayout;
    private Toolbar mToolbar;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -45,8 +44,8 @@ public class CollapsingToolbarBaseActivity extends SettingsTransitionActivity {
        super.setContentView(R.layout.collapsing_toolbar_base_layout);
        mCollapsingToolbarLayout = findViewById(R.id.collapsing_toolbar);

        mToolbar = findViewById(R.id.action_bar);
        setActionBar(mToolbar);
        final Toolbar toolbar = findViewById(R.id.action_bar);
        setActionBar(toolbar);

        // Enable title and home button by default
        final ActionBar actionBar = getActionBar();
@@ -97,16 +96,11 @@ public class CollapsingToolbarBaseActivity extends SettingsTransitionActivity {
    @Override
    public boolean onNavigateUp() {
        if (!super.onNavigateUp()) {
            finish();
            finishAfterTransition();
        }
        return true;
    }

    @Override
    public Toolbar getToolbar() {
        return mToolbar;
    }

    /**
     * Returns an instance of collapsing toolbar.
     */
+37 −72
Original line number Diff line number Diff line
@@ -18,14 +18,11 @@ 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.core.os.BuildCompat;
import androidx.fragment.app.FragmentActivity;
@@ -40,117 +37,85 @@ public abstract class SettingsTransitionActivity extends FragmentActivity {
    private static final String TAG = "SettingsTransitionActivity";
    private static final int DEFAULT_REQUEST = -1;

    private Toolbar mToolbar;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        if (BuildCompat.isAtLeastS()) {
        if (isSettingsTransitionEnabled()) {
            getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
            SettingsTransitionHelper.applyForwardTransition(this);
            SettingsTransitionHelper.applyBackwardTransition(this);
        }

        super.onCreate(savedInstanceState);
    }

    @Override
    public void startActivity(Intent intent) {
        if (!BuildCompat.isAtLeastS()) {
            super.startActivity(intent);
            return;
    public void setActionBar(@Nullable Toolbar toolbar) {
        super.setActionBar(toolbar);

        mToolbar = toolbar;
    }
        final Toolbar toolbar = getToolbar();
        if (toolbar == null) {
            Log.w(TAG, "Toolbar is null. Cannot apply settings transition!");

    @Override
    public void startActivity(Intent intent) {
        if (!isSettingsTransitionEnabled()) {
            super.startActivity(intent);
            return;
        }
        super.startActivity(intent, getActivityOptionsBundle(toolbar));

        super.startActivity(intent, createActivityOptionsBundleForTransition(null));
    }

    @Override
    public void startActivity(Intent intent, @Nullable Bundle options) {
        if (!BuildCompat.isAtLeastS()) {
            super.startActivity(intent, options);
            return;
        }
        final Toolbar toolbar = getToolbar();
        if (toolbar == null) {
            Log.w(TAG, "Toolbar is null. Cannot apply settings transition!");
        if (!isSettingsTransitionEnabled()) {
            super.startActivity(intent, options);
            return;
        }
        if (options != null) {
            super.startActivity(intent, getMergedBundleForTransition(options));
            return;
        }
        super.startActivity(intent, getActivityOptionsBundle(toolbar));

        super.startActivity(intent, createActivityOptionsBundleForTransition(options));
    }

    @Override
    public void startActivityForResult(Intent intent, int requestCode) {
        if (!BuildCompat.isAtLeastS() || requestCode == DEFAULT_REQUEST) {
        if (!isSettingsTransitionEnabled() || 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));
        super.startActivityForResult(intent, requestCode, createActivityOptionsBundleForTransition(
                null));
    }

    @Override
    public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
        if (!BuildCompat.isAtLeastS() || requestCode == DEFAULT_REQUEST) {
        if (!isSettingsTransitionEnabled() || 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;
        }
        if (options != null) {
            super.startActivityForResult(intent, requestCode,
                    getMergedBundleForTransition(options));
            return;
        }
        super.startActivityForResult(intent, requestCode, getActivityOptionsBundle(toolbar));
        super.startActivityForResult(intent, requestCode, createActivityOptionsBundleForTransition(
                options));
    }

    @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);
    protected boolean isSettingsTransitionEnabled() {
        return BuildCompat.isAtLeastS();
    }

    /**
     * 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();
    @Nullable
    private Bundle createActivityOptionsBundleForTransition(@Nullable Bundle options) {
        if (mToolbar == null) {
            Log.w(TAG, "setActionBar(Toolbar) is not called. Cannot apply settings transition!");
            return options;
        }

    private Bundle getMergedBundleForTransition(@NonNull Bundle options) {
        final Toolbar toolbar = getToolbar();
        final Bundle mergedBundle = new Bundle();
        mergedBundle.putAll(options);
        final Bundle activityOptionsBundle = getActivityOptionsBundle(toolbar);
        if (activityOptionsBundle != null) {
            mergedBundle.putAll(activityOptionsBundle);
        final Bundle transitionOptions = ActivityOptions.makeSceneTransitionAnimation(this,
                mToolbar, "shared_element_view").toBundle();
        if (options == null) {
            return transitionOptions;
        }
        return mergedBundle;
        final Bundle mergedOptions = new Bundle(options);
        mergedOptions.putAll(transitionOptions);
        return mergedOptions;
    }
}