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

Commit 9f49df93 authored by Winson Chung's avatar Winson Chung
Browse files

Listening for system changes to active recent tasks. (Bug 14260718)

parent 814086db
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -121,6 +121,8 @@
    <integer name="recents_animate_task_bar_exit_duration">150</integer>
    <!-- The animation duration for animating in the info pane. -->
    <integer name="recents_animate_task_view_info_pane_duration">150</integer>
    <!-- The animation duration for animating the removal of a task view. -->
    <integer name="recents_animate_task_view_remove_duration">150</integer>
    <!-- The minimum alpha for the dim applied to cards that go deeper into the stack. -->
    <integer name="recents_max_task_stack_view_dim">96</integer>
    <!-- Transposes the search bar layout in landscape -->
+3 −0
Original line number Diff line number Diff line
@@ -233,6 +233,9 @@
    <!-- The translation in the Z index for each task above the last task. -->
    <dimen name="recents_task_view_z_increment">5dp</dimen>

    <!-- The amount to translate when animating the removal of a task. -->
    <dimen name="recents_task_view_remove_anim_translation_x">75dp</dimen>

    <!-- The amount of space a user has to scroll to dismiss any info panes. -->
    <dimen name="recents_task_stack_scroll_dismiss_info_pane_distance">50dp</dimen>

+7 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -37,6 +38,7 @@ import com.android.systemui.recents.model.TaskStack;
import com.android.systemui.recents.views.RecentsView;

import java.util.ArrayList;
import java.util.Set;

/** Our special app widget host */
class RecentsAppWidgetHost extends AppWidgetHost {
@@ -308,6 +310,9 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
        filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        registerReceiver(mScreenOffReceiver, filter);

        // Register any broadcast receivers for the task loader
        RecentsTaskLoader.getInstance().registerReceivers(this, mRecentsView);
    }

    @Override
@@ -320,6 +325,7 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
        // Unregister any broadcast receivers we have registered
        unregisterReceiver(mServiceBroadcastReceiver);
        unregisterReceiver(mScreenOffReceiver);
        RecentsTaskLoader.getInstance().unregisterReceivers();
    }

    @Override
+6 −0
Original line number Diff line number Diff line
@@ -49,6 +49,8 @@ public class RecentsConfiguration {
    public int taskStackScrollDismissInfoPaneDistance;
    public int taskStackMaxDim;
    public int taskViewInfoPaneAnimDuration;
    public int taskViewRemoveAnimDuration;
    public int taskViewRemoveAnimTranslationXPx;
    public int taskViewTranslationZMinPx;
    public int taskViewTranslationZIncrementPx;
    public int taskViewRoundedCornerRadiusPx;
@@ -108,6 +110,10 @@ public class RecentsConfiguration {
        taskStackMaxDim = res.getInteger(R.integer.recents_max_task_stack_view_dim);
        taskViewInfoPaneAnimDuration =
                res.getInteger(R.integer.recents_animate_task_view_info_pane_duration);
        taskViewRemoveAnimDuration =
                res.getInteger(R.integer.recents_animate_task_view_remove_duration);
        taskViewRemoveAnimTranslationXPx =
                res.getDimensionPixelSize(R.dimen.recents_task_view_remove_anim_translation_x);
        taskViewRoundedCornerRadiusPx =
                res.getDimensionPixelSize(R.dimen.recents_task_view_rounded_corners_radius);
        taskViewTranslationZMinPx = res.getDimensionPixelSize(R.dimen.recents_task_view_z_min);
+112 −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;

import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
import android.os.Looper;
import com.android.internal.content.PackageMonitor;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * The package monitor listens for changes from PackageManager to update the contents of the Recents
 * list.
 */
public class RecentsPackageMonitor extends PackageMonitor {
    public interface PackageCallbacks {
        public void onComponentRemoved(Set<ComponentName> cns);
    }

    PackageCallbacks mCb;
    List<ActivityManager.RecentTaskInfo> mTasks;
    SystemServicesProxy mSsp;

    public RecentsPackageMonitor(Context context) {
        mSsp = new SystemServicesProxy(context);
    }

    /** Registers the broadcast receivers with the specified callbacks. */
    public void register(Context context, PackageCallbacks cb) {
        mCb = cb;
        register(context, Looper.getMainLooper(), false);
    }

    /** Unregisters the broadcast receivers. */
    @Override
    public void unregister() {
        super.unregister();
        mTasks.clear();
    }

    /** Sets the list of tasks to match against package broadcast changes. */
    void setTasks(List<ActivityManager.RecentTaskInfo> tasks) {
        mTasks = tasks;
    }

    @Override
    public void onPackageRemoved(String packageName, int uid) {
        if (mCb == null) return;

        // Identify all the tasks that should be removed as a result of the package being removed.
        // Using a set to ensure that we callback once per unique component.
        HashSet<ComponentName> componentsToRemove = new HashSet<ComponentName>();
        for (ActivityManager.RecentTaskInfo t : mTasks) {
            ComponentName cn = t.baseIntent.getComponent();
            if (cn.getPackageName().equals(packageName)) {
                componentsToRemove.add(cn);
            }
        }
        // Notify our callbacks that the components no longer exist
        mCb.onComponentRemoved(componentsToRemove);
    }

    @Override
    public boolean onPackageChanged(String packageName, int uid, String[] components) {
        onPackageModified(packageName);
        return true;
    }

    @Override
    public void onPackageModified(String packageName) {
        if (mCb == null) return;

        // Identify all the tasks that should be removed as a result of the package being removed.
        // Using a set to ensure that we callback once per unique component.
        HashSet<ComponentName> componentsKnownToExist = new HashSet<ComponentName>();
        HashSet<ComponentName> componentsToRemove = new HashSet<ComponentName>();
        for (ActivityManager.RecentTaskInfo t : mTasks) {
            ComponentName cn = t.baseIntent.getComponent();
            if (cn.getPackageName().equals(packageName)) {
                if (componentsKnownToExist.contains(cn)) {
                    // If we know that the component still exists in the package, then skip
                    continue;
                }
                if (mSsp.getActivityInfo(cn) != null) {
                    componentsKnownToExist.add(cn);
                } else {
                    componentsToRemove.add(cn);
                }
            }
        }
        // Notify our callbacks that the components no longer exist
        mCb.onComponentRemoved(componentsToRemove);
    }
}
Loading