RecentsActivity.java revision 482f159dc46c2aab5990b4a12294623d28447e2e
1cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka/*
2cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka * Copyright (C) 2012 The Android Open Source Project
3cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka *
4cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka * Licensed under the Apache License, Version 2.0 (the "License");
5cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka * you may not use this file except in compliance with the License.
6cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka * You may obtain a copy of the License at
7cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka *
8cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka *      http://www.apache.org/licenses/LICENSE-2.0
9cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka *
10cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka * Unless required by applicable law or agreed to in writing, software
11cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka * distributed under the License is distributed on an "AS IS" BASIS,
12cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka * See the License for the specific language governing permissions and
14cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka * limitations under the License.
15cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka */
16cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
17cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurkapackage com.android.systemui.recent;
18cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
19cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurkaimport android.app.Activity;
20cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurkaimport android.content.BroadcastReceiver;
21cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurkaimport android.content.Context;
22cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurkaimport android.content.Intent;
23cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurkaimport android.content.IntentFilter;
24cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurkaimport android.os.Bundle;
25cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurkaimport android.os.UserHandle;
26cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurkaimport android.view.MotionEvent;
27cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurkaimport android.view.View;
28cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
29cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurkaimport com.android.systemui.R;
30cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurkaimport com.android.systemui.SystemUIApplication;
31cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurkaimport com.android.systemui.statusbar.tablet.StatusBarPanel;
32cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
33cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurkapublic class RecentsActivity extends Activity {
34cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    public static final String TOGGLE_RECENTS_INTENT = "com.android.systemui.TOGGLE_RECENTS";
35cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    public static final String CLOSE_RECENTS_INTENT = "com.android.systemui.CLOSE_RECENTS";
36cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
37cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    private RecentsPanelView mRecentsPanel;
38cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    private IntentFilter mIntentFilter;
39cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    private boolean mShowing;
40cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    private boolean mForeground;
41cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
42cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        @Override
43cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        public void onReceive(Context context, Intent intent) {
44cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            if (mRecentsPanel != null && mRecentsPanel.isShowing()) {
45cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka                if (mShowing && !mForeground) {
46cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka                    // Captures the case right before we transition to another activity
47cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka                    mRecentsPanel.show(false);
48cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka                }
49cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            }
50cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        }
51cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    };
52cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
53cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    public class TouchOutsideListener implements View.OnTouchListener {
54cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        private StatusBarPanel mPanel;
55cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
56cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        public TouchOutsideListener(StatusBarPanel panel) {
57cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            mPanel = panel;
58cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        }
59cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
60cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        public boolean onTouch(View v, MotionEvent ev) {
61cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            final int action = ev.getAction();
62cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            if (action == MotionEvent.ACTION_OUTSIDE
63cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka                    || (action == MotionEvent.ACTION_DOWN
64cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka                    && !mPanel.isInContentArea((int) ev.getX(), (int) ev.getY()))) {
65cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka                dismissAndGoHome();
66cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka                return true;
67cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            }
68cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            return false;
69cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        }
70cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    }
71cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
72cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    @Override
73cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    public void onPause() {
74cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        mForeground = false;
75cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        super.onPause();
76cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    }
77cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
78cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    @Override
79cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    public void onStop() {
80cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        mShowing = false;
81cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        if (mRecentsPanel != null) {
82cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            mRecentsPanel.onUiHidden();
83cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        }
84cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        super.onStop();
85cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    }
86cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
87cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    @Override
88cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    public void onStart() {
89cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        mShowing = true;
90cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        super.onStart();
91cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    }
92cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
93cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    @Override
94cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    public void onResume() {
95cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        mForeground = true;
96cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        super.onResume();
97cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    }
98cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
99cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    @Override
100cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    public void onBackPressed() {
101cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        dismissAndGoBack();
102cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    }
103cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
104cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    public void dismissAndGoHome() {
105cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        if (mRecentsPanel != null) {
106cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            Intent homeIntent = new Intent(Intent.ACTION_MAIN, null);
107cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            homeIntent.addCategory(Intent.CATEGORY_HOME);
108cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
109cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka                    | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
110cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            startActivityAsUser(homeIntent, new UserHandle(UserHandle.USER_CURRENT));
111cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            mRecentsPanel.show(false);
112cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        }
113cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    }
114cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
115cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    public void dismissAndGoBack() {
116cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        if (mRecentsPanel != null) {
117cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            final SystemUIApplication app = (SystemUIApplication) getApplication();
118cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            final RecentTasksLoader recentTasksLoader = app.getRecentTasksLoader();
119cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            TaskDescription firstTask = recentTasksLoader.getFirstTask();
120cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            if (firstTask != null && mRecentsPanel.simulateClick(firstTask)) {
121cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka                // recents panel will take care of calling show(false);
122cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka                return;
123cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            }
124cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            mRecentsPanel.show(false);
125cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        }
126cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        finish();
127cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    }
128cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
129cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    @Override
130cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    protected void onCreate(Bundle savedInstanceState) {
131cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        final SystemUIApplication app = (SystemUIApplication) getApplication();
132cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        final RecentTasksLoader recentTasksLoader = app.getRecentTasksLoader();
133cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
134cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        setContentView(R.layout.status_bar_recent_panel);
135cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        mRecentsPanel = (RecentsPanelView) findViewById(R.id.recents_root);
136cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        mRecentsPanel.setOnTouchListener(new TouchOutsideListener(mRecentsPanel));
137cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        mRecentsPanel.setRecentTasksLoader(recentTasksLoader);
138cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        recentTasksLoader.setRecentsPanel(mRecentsPanel, mRecentsPanel);
139adf0b215908f8fd921fcb734b9809c806cb67042Michael Jurka        mRecentsPanel.setMinSwipeAlpha(
140adf0b215908f8fd921fcb734b9809c806cb67042Michael Jurka                getResources().getInteger(R.integer.config_recent_item_min_alpha) / 100f);
141cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
142cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        handleIntent(getIntent());
143cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        mIntentFilter = new IntentFilter();
144cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        mIntentFilter.addAction(CLOSE_RECENTS_INTENT);
145cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        registerReceiver(mIntentReceiver, mIntentFilter);
146cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        super.onCreate(savedInstanceState);
147cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    }
148cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
149cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    @Override
150cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    protected void onDestroy() {
151cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        final SystemUIApplication app = (SystemUIApplication) getApplication();
152cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        final RecentTasksLoader recentTasksLoader = app.getRecentTasksLoader();
153cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        recentTasksLoader.setRecentsPanel(null, mRecentsPanel);
154cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        unregisterReceiver(mIntentReceiver);
155cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        super.onDestroy();
156cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    }
157cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
158cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    @Override
159cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    protected void onNewIntent(Intent intent) {
160cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        handleIntent(intent);
161cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    }
162cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
163cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    private void handleIntent(Intent intent) {
164cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        super.onNewIntent(intent);
165cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
166cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        if (TOGGLE_RECENTS_INTENT.equals(intent.getAction())) {
167482f159dc46c2aab5990b4a12294623d28447e2eMichael Jurka            if (mRecentsPanel != null) {
168482f159dc46c2aab5990b4a12294623d28447e2eMichael Jurka                if (mRecentsPanel.isShowing() && mForeground) {
169482f159dc46c2aab5990b4a12294623d28447e2eMichael Jurka                    dismissAndGoBack();
170482f159dc46c2aab5990b4a12294623d28447e2eMichael Jurka                } else {
171482f159dc46c2aab5990b4a12294623d28447e2eMichael Jurka                    final SystemUIApplication app = (SystemUIApplication) getApplication();
172482f159dc46c2aab5990b4a12294623d28447e2eMichael Jurka                    final RecentTasksLoader recentTasksLoader = app.getRecentTasksLoader();
173482f159dc46c2aab5990b4a12294623d28447e2eMichael Jurka                    mRecentsPanel.show(true, recentTasksLoader.getLoadedTasks(),
174482f159dc46c2aab5990b4a12294623d28447e2eMichael Jurka                            recentTasksLoader.isFirstScreenful());
175482f159dc46c2aab5990b4a12294623d28447e2eMichael Jurka                }
176cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka            }
177cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka        }
178cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka    }
179cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka
180cb2522c86d75fff277dc38ec7e444a5b5f5130eaMichael Jurka}
181