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

Commit 15365666 authored by Winson Chung's avatar Winson Chung Committed by Android (Google) Code Review
Browse files

Merge "Refactoring RecentsActivity and TaskStackViewTouchHandler."

parents 9d5b08ea cdbbb7e3
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ public class DozeTrigger {

    /** Starts dozing. This also resets the trigger flag. */
    public void startDozing() {
        poke();
        forcePoke();
        mHasTriggered = false;
    }

@@ -59,8 +59,15 @@ public class DozeTrigger {
        mIsDozing = false;
    }

    /** Poke this dozer to wake it up for a little bit. */
    /** Poke this dozer to wake it up for a little bit, if it is dozing. */
    public void poke() {
        if (mIsDozing) {
            forcePoke();
        }
    }

    /** Poke this dozer to wake it up for a little bit. */
    void forcePoke() {
        mHandler.removeCallbacks(mDozeRunnable);
        mHandler.postDelayed(mDozeRunnable, mDozeDurationSeconds * 1000);
        mIsDozing = true;
+34 −93
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ import android.content.IntentFilter;
import android.os.Bundle;
import android.os.UserHandle;
import android.util.Pair;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
@@ -39,6 +38,7 @@ import com.android.systemui.recents.model.SpaceNode;
import com.android.systemui.recents.model.TaskStack;
import com.android.systemui.recents.views.FullScreenTransitionView;
import com.android.systemui.recents.views.RecentsView;
import com.android.systemui.recents.views.SystemBarScrimViews;
import com.android.systemui.recents.views.ViewAnimation;

import java.lang.reflect.InvocationTargetException;
@@ -50,6 +50,26 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
        RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks,
        FullScreenTransitionView.FullScreenTransitionViewCallbacks {

    FrameLayout mContainerView;
    RecentsView mRecentsView;
    SystemBarScrimViews mScrimViews;
    View mEmptyView;
    FullScreenTransitionView mFullScreenshotView;

    RecentsConfiguration mConfig;

    RecentsAppWidgetHost mAppWidgetHost;
    AppWidgetProviderInfo mSearchAppWidgetInfo;
    AppWidgetHostView mSearchAppWidgetHostView;

    boolean mVisible;
    boolean mTaskLaunched;

    // Runnables to finish the Recents activity
    FinishRecentsRunnable mFinishRunnable = new FinishRecentsRunnable(true);
    FinishRecentsRunnable mFinishWithoutAnimationRunnable = new FinishRecentsRunnable(false);
    FinishRecentsRunnable mFinishLaunchHomeRunnable;

    /**
     * A Runnable to finish Recents either with/without a transition, and either by calling finish()
     * or just launching the specified intent.
@@ -90,40 +110,6 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
        }
    }

    FrameLayout mContainerView;
    RecentsView mRecentsView;
    View mEmptyView;
    View mStatusBarScrimView;
    View mNavBarScrimView;
    FullScreenTransitionView mFullScreenshotView;

    RecentsConfiguration mConfig;

    RecentsAppWidgetHost mAppWidgetHost;
    AppWidgetProviderInfo mSearchAppWidgetInfo;
    AppWidgetHostView mSearchAppWidgetHostView;

    boolean mVisible;
    boolean mTaskLaunched;

    // Runnables to finish the Recents activity
    FinishRecentsRunnable mFinishRunnable = new FinishRecentsRunnable(true);
    FinishRecentsRunnable mFinishWithoutAnimationRunnable = new FinishRecentsRunnable(false);
    FinishRecentsRunnable mFinishLaunchHomeRunnable;

    private static Method sPropertyMethod;
    static {
        try {
            Class<?> c = Class.forName("android.view.GLES20Canvas");
            sPropertyMethod = c.getDeclaredMethod("setProperty", String.class, String.class);
            if (!sPropertyMethod.isAccessible()) sPropertyMethod.setAccessible(true);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    // Broadcast receiver to handle messages from our RecentsService
    BroadcastReceiver mServiceBroadcastReceiver = new BroadcastReceiver() {
        @Override
@@ -192,10 +178,7 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
        mConfig.launchedWithNoRecentTasks = !root.hasTasks();

        // Show the scrim if we animate into Recents without window transitions
        mNavBarScrimView.setVisibility(mConfig.hasNavBarScrim() &&
                !mConfig.shouldAnimateNavBarScrim() ? View.VISIBLE : View.INVISIBLE);
        mStatusBarScrimView.setVisibility(mConfig.hasStatusBarScrim() &&
                !mConfig.shouldAnimateStatusBarScrim() ? View.VISIBLE : View.INVISIBLE);
        mScrimViews.prepareEnterRecentsAnimation();

        // Add the default no-recents layout
        if (mConfig.launchedWithNoRecentTasks) {
@@ -348,14 +331,8 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
        // Create the empty view
        LayoutInflater inflater = LayoutInflater.from(this);
        mEmptyView = inflater.inflate(R.layout.recents_empty, mContainerView, false);
        mStatusBarScrimView = inflater.inflate(R.layout.recents_status_bar_scrim, mContainerView, false);
        mStatusBarScrimView.setLayoutParams(new FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.TOP));
        mNavBarScrimView = inflater.inflate(R.layout.recents_nav_bar_scrim, mContainerView, false);
        mNavBarScrimView.setLayoutParams(new FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM));
        mScrimViews = new SystemBarScrimViews(mConfig);
        mScrimViews.inflate(inflater, mContainerView);
        if (Constants.DebugFlags.App.EnableScreenshotAppTransition) {
            mFullScreenshotView = new FullScreenTransitionView(this, this);
            mFullScreenshotView.setLayoutParams(new FrameLayout.LayoutParams(
@@ -364,13 +341,13 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView

        // Add the views to the layout
        mContainerView = new FrameLayout(this);
        mContainerView.addView(mStatusBarScrimView);
        mContainerView.addView(mScrimViews.getStatusBarScrimView());
        mContainerView.addView(mRecentsView);
        mContainerView.addView(mEmptyView);
        if (Constants.DebugFlags.App.EnableScreenshotAppTransition) {
            mContainerView.addView(mFullScreenshotView);
        }
        mContainerView.addView(mNavBarScrimView);
        mContainerView.addView(mScrimViews.getNavBarScrimView());
        setContentView(mContainerView);

        // Update the recent tasks
@@ -391,10 +368,10 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
            onConfigurationChange();
        }

        // XXX: Update the shadows
        // Private API calls to make the shadows look better
        try {
            sPropertyMethod.invoke(null, "ambientShadowStrength", String.valueOf(35f));
            sPropertyMethod.invoke(null, "ambientRatio", String.valueOf(0.5f));
            Utilities.setShadowProperty("ambientShadowStrength", String.valueOf(35f));
            Utilities.setShadowProperty("ambientRatio", String.valueOf(0.5f));
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
@@ -589,37 +566,8 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
    }

    public void onEnterAnimationTriggered() {
        // Fade in the scrims
        if (mConfig.hasStatusBarScrim() && mConfig.shouldAnimateStatusBarScrim()) {
            mStatusBarScrimView.setTranslationY(-mStatusBarScrimView.getMeasuredHeight());
            mStatusBarScrimView.animate()
                    .translationY(0)
                    .setStartDelay(mConfig.taskBarEnterAnimDelay)
                    .setDuration(mConfig.navBarScrimEnterDuration)
                    .setInterpolator(mConfig.quintOutInterpolator)
                    .withStartAction(new Runnable() {
                        @Override
                        public void run() {
                            mStatusBarScrimView.setVisibility(View.VISIBLE);
                        }
                    })
                    .start();
        }
        if (mConfig.hasNavBarScrim() && mConfig.shouldAnimateNavBarScrim()) {
            mNavBarScrimView.setTranslationY(mNavBarScrimView.getMeasuredHeight());
            mNavBarScrimView.animate()
                    .translationY(0)
                    .setStartDelay(mConfig.taskBarEnterAnimDelay)
                    .setDuration(mConfig.navBarScrimEnterDuration)
                    .setInterpolator(mConfig.quintOutInterpolator)
                    .withStartAction(new Runnable() {
                        @Override
                        public void run() {
                            mNavBarScrimView.setVisibility(View.VISIBLE);
                        }
                    })
                    .start();
        }
        // Animate the scrims in
        mScrimViews.startEnterRecentsAnimation();
    }

    /**** FullScreenTransitionView.FullScreenTransitionViewCallbacks Implementation ****/
@@ -642,16 +590,9 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
    /**** RecentsView.RecentsViewCallbacks Implementation ****/

    @Override
    public void onExitAnimationTriggered() {
        // Fade out the scrim
        if (mConfig.hasNavBarScrim() && mConfig.shouldAnimateNavBarScrim()) {
            mNavBarScrimView.animate()
                    .translationY(mNavBarScrimView.getMeasuredHeight())
                    .setStartDelay(0)
                    .setDuration(mConfig.taskBarExitAnimDuration)
                    .setInterpolator(mConfig.fastOutSlowInInterpolator)
                    .start();
        }
    public void onExitToHomeAnimationTriggered() {
        // Animate the scrims out
        mScrimViews.startExitRecentsAnimation();
    }

    @Override
+24 −0
Original line number Diff line number Diff line
@@ -20,8 +20,26 @@ import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/* Common code */
public class Utilities {

    // Reflection methods for altering shadows
    private static Method sPropertyMethod;
    static {
        try {
            Class<?> c = Class.forName("android.view.GLES20Canvas");
            sPropertyMethod = c.getDeclaredMethod("setProperty", String.class, String.class);
            if (!sPropertyMethod.isAccessible()) sPropertyMethod.setAccessible(true);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    /**
     * Calculates a consistent animation duration (ms) for all animations depending on the movement
     * of the object being animated.
@@ -66,4 +84,10 @@ public class Utilities {
        int greyscale = colorToGreyscale(color);
        return (greyscale < 128) ? lightRes : darkRes;
    }

    /** Sets some private shadow properties. */
    public static void setShadowProperty(String property, String value)
            throws IllegalAccessException, InvocationTargetException {
        sPropertyMethod.invoke(null, property, value);
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
    /** The RecentsView callbacks */
    public interface RecentsViewCallbacks {
        public void onTaskLaunching();
        public void onExitAnimationTriggered();
        public void onExitToHomeAnimationTriggered();
    }

    RecentsConfiguration mConfig;
@@ -194,7 +194,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
        ctx.postAnimationTrigger.decrement();

        // Notify of the exit animation
        mCb.onExitAnimationTriggered();
        mCb.onExitToHomeAnimationTriggered();
    }

    /** Adds the search bar */
+132 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 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.systemui.recents.views;

import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import com.android.systemui.R;
import com.android.systemui.recents.RecentsConfiguration;

/** Manages the scrims for the various system bars. */
public class SystemBarScrimViews {

    RecentsConfiguration mConfig;

    View mStatusBarScrimView;
    View mNavBarScrimView;

    boolean mHasNavBarScrim;
    boolean mShouldAnimateStatusBarScrim;
    boolean mHasStatusBarScrim;
    boolean mShouldAnimateNavBarScrim;

    public SystemBarScrimViews(RecentsConfiguration config) {
        mConfig = config;
    }

    /** Inflates the scrim views */
    public void inflate(LayoutInflater inflater, ViewGroup parent) {
        mStatusBarScrimView = inflater.inflate(R.layout.recents_status_bar_scrim, parent, false);
        mStatusBarScrimView.setLayoutParams(new FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.TOP));
        mNavBarScrimView = inflater.inflate(R.layout.recents_nav_bar_scrim, parent, false);
        mNavBarScrimView.setLayoutParams(new FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM));
    }

    /**
     * Prepares the scrim views for animating when entering Recents. This will be called before
     * the first draw.
     */
    public void prepareEnterRecentsAnimation() {
        mHasNavBarScrim = mConfig.hasNavBarScrim();
        mShouldAnimateNavBarScrim = mConfig.shouldAnimateNavBarScrim();
        mHasStatusBarScrim = mConfig.hasStatusBarScrim();
        mShouldAnimateStatusBarScrim = mConfig.shouldAnimateStatusBarScrim();

        mNavBarScrimView.setVisibility(mHasNavBarScrim && !mShouldAnimateNavBarScrim ?
                View.VISIBLE : View.INVISIBLE);
        mStatusBarScrimView.setVisibility(mHasStatusBarScrim && !mShouldAnimateStatusBarScrim ?
                View.VISIBLE : View.INVISIBLE);
    }

    /**
     * Starts animating the scrim views when entering Recents.
     */
    public void startEnterRecentsAnimation() {
        if (mHasStatusBarScrim && mShouldAnimateStatusBarScrim) {
            mStatusBarScrimView.setTranslationY(-mStatusBarScrimView.getMeasuredHeight());
            mStatusBarScrimView.animate()
                    .translationY(0)
                    .setStartDelay(mConfig.taskBarEnterAnimDelay)
                    .setDuration(mConfig.navBarScrimEnterDuration)
                    .setInterpolator(mConfig.quintOutInterpolator)
                    .withStartAction(new Runnable() {
                        @Override
                        public void run() {
                            mStatusBarScrimView.setVisibility(View.VISIBLE);
                        }
                    })
                    .start();
        }
        if (mHasNavBarScrim && mShouldAnimateNavBarScrim) {
            mNavBarScrimView.setTranslationY(mNavBarScrimView.getMeasuredHeight());
            mNavBarScrimView.animate()
                    .translationY(0)
                    .setStartDelay(mConfig.taskBarEnterAnimDelay)
                    .setDuration(mConfig.navBarScrimEnterDuration)
                    .setInterpolator(mConfig.quintOutInterpolator)
                    .withStartAction(new Runnable() {
                        @Override
                        public void run() {
                            mNavBarScrimView.setVisibility(View.VISIBLE);
                        }
                    })
                    .start();
        }
    }

    /**
     * Starts animating the scrim views when leaving Recents (either via launching a task, or
     * going home).
     */
    public void startExitRecentsAnimation() {
        if (mHasNavBarScrim && mShouldAnimateNavBarScrim) {
            mNavBarScrimView.animate()
                    .translationY(mNavBarScrimView.getMeasuredHeight())
                    .setStartDelay(0)
                    .setDuration(mConfig.taskBarExitAnimDuration)
                    .setInterpolator(mConfig.fastOutSlowInInterpolator)
                    .start();
        }
    }

    /** Returns the status bar scrim view. */
    public View getStatusBarScrimView() {
        return mStatusBarScrimView;
    }

    /** Returns the nav bar scrim view. */
    public View getNavBarScrimView() {
        return mNavBarScrimView;
    }
}
Loading