RecentsActivity.java revision c6a1623cc48581380b698ae87b43bfafb9c935ba
1303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung/*
2303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * Copyright (C) 2014 The Android Open Source Project
3303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung *
4303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * Licensed under the Apache License, Version 2.0 (the "License");
5303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * you may not use this file except in compliance with the License.
6303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * You may obtain a copy of the License at
7303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung *
8303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung *      http://www.apache.org/licenses/LICENSE-2.0
9303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung *
10303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * Unless required by applicable law or agreed to in writing, software
11303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * distributed under the License is distributed on an "AS IS" BASIS,
12303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * See the License for the specific language governing permissions and
14303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * limitations under the License.
15303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung */
16303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
17303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungpackage com.android.systemui.recents;
18303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
19303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.app.Activity;
2047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport android.content.BroadcastReceiver;
2147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport android.content.Context;
22303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.content.Intent;
2347c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport android.content.IntentFilter;
24303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.os.Bundle;
25303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.view.LayoutInflater;
26303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.view.View;
27303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.view.WindowManager;
28303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.widget.FrameLayout;
2947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungimport com.android.systemui.R;
30303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.model.SpaceNode;
31303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.model.TaskStack;
32303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport com.android.systemui.recents.views.RecentsView;
33303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
34303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport java.util.ArrayList;
35303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
36303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
37303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung/* Activity */
3847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chungpublic class RecentsActivity extends Activity implements RecentsView.RecentsViewCallbacks {
39303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    FrameLayout mContainerView;
40303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    RecentsView mRecentsView;
41303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    View mEmptyView;
4247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
43303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    boolean mVisible;
4447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    boolean mTaskLaunched;
4547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
4647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    BroadcastReceiver mServiceBroadcastReceiver = new BroadcastReceiver() {
4747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        @Override
4847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        public void onReceive(Context context, Intent intent) {
4947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            String action = intent.getAction();
5047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            Console.log(Constants.DebugFlags.App.SystemUIHandshake,
5147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung                    "[RecentsActivity|serviceBroadcast]", action, Console.AnsiRed);
5247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            if (action.equals(RecentsService.ACTION_FINISH_RECENTS_ACTIVITY)) {
5347c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung                if (Constants.DebugFlags.App.EnableToggleNewRecentsActivity) {
5447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung                    finish();
5547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung                }
5647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            } else if (action.equals(RecentsService.ACTION_TOGGLE_RECENTS_ACTIVITY)) {
57c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                // Try and unfilter and filtered stacks
58c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                if (!mRecentsView.unfilterFilteredStacks()) {
59c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                    // If there are no filtered stacks, dismiss recents and launch the first task
60c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                    dismissRecentsIfVisible();
61c6a1623cc48581380b698ae87b43bfafb9c935baWinson Chung                }
6247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            }
6347c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        }
6447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    };
65303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
66303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Updates the set of recent tasks */
67303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    void updateRecentsTasks() {
68303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
69303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        SpaceNode root = loader.reload(this, Constants.Values.RecentsTaskLoader.PreloadFirstTasksCount);
70303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        ArrayList<TaskStack> stacks = root.getStacks();
71303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        if (!stacks.isEmpty()) {
72303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mRecentsView.setBSP(root);
73303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
74303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
75303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Add the default no-recents layout
76303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        if (stacks.size() == 1 && stacks.get(0).getTaskCount() == 0) {
77303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mEmptyView.setVisibility(View.VISIBLE);
78303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
79303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            // Dim the background even more
80303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            WindowManager.LayoutParams wlp = getWindow().getAttributes();
81303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            wlp.dimAmount = Constants.Values.Window.DarkBackgroundDim;
82303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            getWindow().setAttributes(wlp);
83303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
84303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        } else {
85303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            mEmptyView.setVisibility(View.GONE);
86303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
87303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
88303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
89303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Dismisses recents if we are already visible and the intent is to toggle the recents view */
9047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    boolean dismissRecentsIfVisible() {
9147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        if (mVisible) {
9247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            if (!mRecentsView.launchFirstTask()) {
9347c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung                finish();
94303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            }
9547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            return true;
96303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
97303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        return false;
98303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
99303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
100303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    /** Called with the activity is first created. */
101303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
102303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public void onCreate(Bundle savedInstanceState) {
103303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onCreate(savedInstanceState);
104303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        Console.logDivider(Constants.DebugFlags.App.SystemUIHandshake);
105303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        Console.log(Constants.DebugFlags.App.SystemUIHandshake, "[RecentsActivity|onCreate]",
106303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung                getIntent().getAction() + " visible: " + mVisible, Console.AnsiRed);
107bd91297e895410bb27df3e930be5d9eab30129afWinson Chung        Console.logTraceTime(Constants.DebugFlags.App.TimeRecentsStartup,
108bd91297e895410bb27df3e930be5d9eab30129afWinson Chung                Constants.DebugFlags.App.TimeRecentsStartupKey, "onCreate");
109303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
110303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Initialize the loader and the configuration
111303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        RecentsTaskLoader.initialize(this);
112303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        RecentsConfiguration.reinitialize(this);
113303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
114303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Set the background dim
115303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        WindowManager.LayoutParams wlp = getWindow().getAttributes();
116303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        wlp.dimAmount = Constants.Values.Window.BackgroundDim;
117303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        getWindow().setAttributes(wlp);
118303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
119303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
120303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Create the view hierarchy
121303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mRecentsView = new RecentsView(this);
12247c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        mRecentsView.setCallbacks(this);
123303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mRecentsView.setLayoutParams(new FrameLayout.LayoutParams(
124303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung                FrameLayout.LayoutParams.MATCH_PARENT,
125303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung                FrameLayout.LayoutParams.MATCH_PARENT));
126303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
127303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Create the empty view
128303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        LayoutInflater inflater = LayoutInflater.from(this);
129303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mEmptyView = inflater.inflate(R.layout.recents_empty, mContainerView, false);
130303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
131303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mContainerView = new FrameLayout(this);
132303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mContainerView.addView(mRecentsView);
133303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mContainerView.addView(mEmptyView);
134303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        setContentView(mContainerView);
135303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
136303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Update the recent tasks
137303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        updateRecentsTasks();
138303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
139303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
140303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
141303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onNewIntent(Intent intent) {
142303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onNewIntent(intent);
14347c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        // Reset the task launched flag if we encounter an onNewIntent() before onStop()
14447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        mTaskLaunched = false;
14547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
146303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        Console.logDivider(Constants.DebugFlags.App.SystemUIHandshake);
147303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        Console.log(Constants.DebugFlags.App.SystemUIHandshake, "[RecentsActivity|onNewIntent]",
148303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung                intent.getAction() + " visible: " + mVisible, Console.AnsiRed);
149bd91297e895410bb27df3e930be5d9eab30129afWinson Chung        Console.logTraceTime(Constants.DebugFlags.App.TimeRecentsStartup,
150bd91297e895410bb27df3e930be5d9eab30129afWinson Chung                Constants.DebugFlags.App.TimeRecentsStartupKey, "onNewIntent");
151303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
152303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Initialize the loader and the configuration
153303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        RecentsTaskLoader.initialize(this);
154303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        RecentsConfiguration.reinitialize(this);
155303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
156303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        // Update the recent tasks
157303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        updateRecentsTasks();
158303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
159303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
160303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
161303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onStart() {
162303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        Console.log(Constants.DebugFlags.App.SystemUIHandshake, "[RecentsActivity|onStart]", "",
163303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung                Console.AnsiRed);
164303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onStart();
165303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mVisible = true;
166303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
167303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
168303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
169303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onResume() {
170303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        Console.log(Constants.DebugFlags.App.SystemUIHandshake, "[RecentsActivity|onResume]", "",
171303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung                Console.AnsiRed);
172303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onResume();
17347c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
17447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        // Register the broadcast receiver to handle messages from our service
17547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        IntentFilter filter = new IntentFilter();
17647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        filter.addAction(RecentsService.ACTION_TOGGLE_RECENTS_ACTIVITY);
17747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        filter.addAction(RecentsService.ACTION_FINISH_RECENTS_ACTIVITY);
17847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        registerReceiver(mServiceBroadcastReceiver, filter);
179303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
180303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
181303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
182303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onPause() {
183303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        Console.log(Constants.DebugFlags.App.SystemUIHandshake, "[RecentsActivity|onPause]", "",
184303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung                Console.AnsiRed);
185303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onPause();
186303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
18747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        // Unregister any broadcast receivers we have registered
18847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        unregisterReceiver(mServiceBroadcastReceiver);
189303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
190303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
191303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
192303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    protected void onStop() {
193303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        Console.log(Constants.DebugFlags.App.SystemUIHandshake, "[RecentsActivity|onStop]", "",
194303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung                Console.AnsiRed);
195303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        super.onStop();
19647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
19747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        // Finish the current recents activity after we have launched a task
19847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        if (mTaskLaunched && Constants.DebugFlags.App.EnableToggleNewRecentsActivity) {
19947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung            finish();
20047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        }
20147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
202303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        mVisible = false;
20347c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        mTaskLaunched = false;
20447c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    }
20547c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
20647c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    @Override
20747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    protected void onDestroy() {
20847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        Console.log(Constants.DebugFlags.App.SystemUIHandshake, "[RecentsActivity|onDestroy]", "",
20947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung                Console.AnsiRed);
21047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        super.onDestroy();
211303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
212303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung
213303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    @Override
2144d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    public void onTrimMemory(int level) {
2154d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
2164d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        if (loader != null) {
2174d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung            loader.onTrimMemory(level);
2184d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung        }
2194d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    }
2204d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung
2214d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung    @Override
222303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    public void onBackPressed() {
223303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        if (!mRecentsView.unfilterFilteredStacks()) {
224303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung            super.onBackPressed();
225303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung        }
226303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung    }
22747c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung
22847c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    @Override
22947c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    public void onTaskLaunching() {
23047c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung        mTaskLaunched = true;
23147c4c69575e94635a9356e8a1faf4b56a0120452Winson Chung    }
232303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung}
233