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