From 44c66fe2cd912fcea2e9824eb421d5c8d9ffadbd Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Wed, 20 Oct 2010 18:32:52 -0700 Subject: [PATCH] Fix 3117937: Add simplified "recent apps". This adds a simplified recents view for devices that don't handle 3D well. Change-Id: I8307cd340caf1d65c8fce80eaf55a1d21bc64312 --- .../sysbar_panel_recents_bg.9.png | Bin 0 -> 11109 bytes .../SystemUI/res/layout-xlarge/status_bar.xml | 2 +- .../res/layout-xlarge/sysbar_panel_recent.xml | 49 +++++ .../statusbar/tablet/RecentAppsPanel.java | 167 ++++++++++++++++++ .../tablet/TabletStatusBarService.java | 82 +++++++-- .../statusbar/tablet/TabletStatusBarView.java | 10 +- 6 files changed, 289 insertions(+), 21 deletions(-) create mode 100644 packages/SystemUI/res/drawable-mdpi/sysbar_panel_recents_bg.9.png create mode 100644 packages/SystemUI/res/layout-xlarge/sysbar_panel_recent.xml create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java diff --git a/packages/SystemUI/res/drawable-mdpi/sysbar_panel_recents_bg.9.png b/packages/SystemUI/res/drawable-mdpi/sysbar_panel_recents_bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..85726d2892b8b51d210702ea8f7cfe04b4959d35 GIT binary patch literal 11109 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 literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/layout-xlarge/status_bar.xml b/packages/SystemUI/res/layout-xlarge/status_bar.xml index 429fdf2b17369..dbe41674bbb2f 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar.xml @@ -146,7 +146,7 @@ android:background="@drawable/ic_sysbar_icon_bg" systemui:keyCode="3" /> - + + + + + + + + + + + + + + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java new file mode 100644 index 0000000000000..67979589b8c4e --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2010 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.statusbar.tablet; + +import java.util.ArrayList; +import java.util.List; + +import android.app.ActivityManager; +import android.bluetooth.BluetoothAdapter; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.media.AudioManager; +import android.net.wifi.WifiManager; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.view.View.OnClickListener; +import android.widget.BaseAdapter; +import android.widget.Gallery; +import android.widget.HorizontalScrollView; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.android.systemui.R; + +public class RecentAppsPanel extends LinearLayout implements StatusBarPanel, OnClickListener { + private static final String TAG = "RecentAppsPanel"; + private static final boolean DEBUG = TabletStatusBarService.DEBUG; + private static final int MAX_RECENT_TASKS = 20; + private static final float ITEM_WIDTH = 75; + private static final float ITEM_HEIGHT = 75; + private TabletStatusBarService mBar; + private TextView mNoRecents; + private LinearLayout mRecentsContainer; + private float mDensity; + private HorizontalScrollView mScrollView; + + public boolean isInContentArea(int x, int y) { + final int l = getPaddingLeft(); + final int r = getWidth() - getPaddingRight(); + final int t = getPaddingTop(); + final int b = getHeight() - getPaddingBottom(); + return x >= l && x < r && y >= t && y < b; + } + + public void setBar(TabletStatusBarService bar) { + mBar = bar; + } + + public RecentAppsPanel(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public RecentAppsPanel(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mDensity = getResources().getDisplayMetrics().density; + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mNoRecents = (TextView) findViewById(R.id.recents_no_recents); + mRecentsContainer = (LinearLayout) findViewById(R.id.recents_container); + mScrollView = (HorizontalScrollView) findViewById(R.id.scroll_view); + mScrollView.setHorizontalFadingEdgeEnabled(true); + } + + @Override + protected void onVisibilityChanged(View changedView, int visibility) { + super.onVisibilityChanged(changedView, visibility); + Log.v(TAG, "onVisibilityChanged(" + changedView + ", " + visibility + ")"); + if (visibility == View.VISIBLE && changedView == this) { + refreshIcons(); + mRecentsContainer.setScrollbarFadingEnabled(true); + mRecentsContainer.scrollTo(0, 0); + } + } + + private void refreshIcons() { + mRecentsContainer.removeAllViews(); + final Context context = getContext(); + final PackageManager pm = context.getPackageManager(); + final ActivityManager am = (ActivityManager) + context.getSystemService(Context.ACTIVITY_SERVICE); + final List recentTasks = + am.getRecentTasks(MAX_RECENT_TASKS, ActivityManager.RECENT_IGNORE_UNAVAILABLE); + + ActivityInfo homeInfo = new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_HOME) + .resolveActivityInfo(pm, 0); + + int numTasks = recentTasks.size(); + final int width = (int) (mDensity * ITEM_WIDTH + 0.5f); + final int height = (int) (mDensity * ITEM_HEIGHT + 0.5f); + ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(width, height); + for (int i = 0; i < numTasks; ++i) { + final ActivityManager.RecentTaskInfo info = recentTasks.get(i); + + Intent intent = new Intent(info.baseIntent); + if (info.origActivity != null) { + intent.setComponent(info.origActivity); + } + + // Exclude home activity. + if (homeInfo != null + && homeInfo.packageName.equals(intent.getComponent().getPackageName()) + && homeInfo.name.equals(intent.getComponent().getClassName())) { + continue; + } + + intent.setFlags((intent.getFlags()&~Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) + | Intent.FLAG_ACTIVITY_NEW_TASK); + final ResolveInfo resolveInfo = pm.resolveActivity(intent, 0); + if (resolveInfo != null) { + final ActivityInfo activityInfo = resolveInfo.activityInfo; + final String title = activityInfo.loadLabel(pm).toString(); + Drawable icon = activityInfo.loadIcon(pm); + + if (title != null && title.length() > 0 && icon != null) { + ImageView imageView = new ImageView(mContext); + imageView.setScaleType(ImageView.ScaleType.FIT_XY); + imageView.setLayoutParams(layoutParams); + imageView.setOnClickListener(this); + imageView.setTag(intent); + imageView.setImageDrawable(icon); + mRecentsContainer.addView(imageView); + } + } + } + + int views = mRecentsContainer.getChildCount(); + mNoRecents.setVisibility(views == 0 ? View.VISIBLE : View.GONE); + mRecentsContainer.setVisibility(views > 0 ? View.VISIBLE : View.GONE); + } + + public void onClick(View v) { + Intent intent = (Intent) v.getTag(); + if (DEBUG) Log.v(TAG, "Starting activity " + intent); + getContext().startActivity(intent); + mBar.animateCollapse(); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarService.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarService.java index 9fb29ac81cc99..7234557a1538b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarService.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarService.java @@ -67,8 +67,11 @@ public class TabletStatusBarService extends StatusBarService { public static final int MSG_CLOSE_NOTIFICATION_PANEL = 1001; public static final int MSG_OPEN_SYSTEM_PANEL = 1010; public static final int MSG_CLOSE_SYSTEM_PANEL = 1011; - + public static final int MSG_OPEN_RECENTS_PANEL = 1020; + public static final int MSG_CLOSE_RECENTS_PANEL = 1021; + private static final int MAX_IMAGE_LEVEL = 10000; + private static final boolean USE_2D_RECENTS = true; int mIconSize; @@ -76,7 +79,7 @@ public class TabletStatusBarService extends StatusBarService { // tracking all current notifications private NotificationData mNotns = new NotificationData(); - + TabletStatusBarView mStatusBarView; ImageView mNotificationTrigger; NotificationIconArea mNotificationIconArea; @@ -110,6 +113,7 @@ public class TabletStatusBarService extends StatusBarService { int mDisabled = 0; boolean mNotificationsOn = true; + private RecentAppsPanel mRecentsPanel; protected void addPanelWindows() { final Context context = mContext; @@ -118,6 +122,7 @@ public class TabletStatusBarService extends StatusBarService { final int barHeight= res.getDimensionPixelSize( com.android.internal.R.dimen.status_bar_height); + // Notification Panel mNotificationPanel = (NotificationPanel)View.inflate(context, R.layout.sysbar_panel_notifications, null); mNotificationPanel.setVisibility(View.GONE); @@ -139,11 +144,11 @@ public class TabletStatusBarService extends StatusBarService { WindowManagerImpl.getDefault().addView(mNotificationPanel, lp); + // System Panel mSystemPanel = (SystemPanel) View.inflate(context, R.layout.sysbar_panel_system, null); mSystemPanel.setVisibility(View.GONE); mSystemPanel.setOnTouchListener(new TouchOutsideListener(MSG_CLOSE_SYSTEM_PANEL, - mSystemPanel)); - + mSystemPanel)); mStatusBarView.setIgnoreChildren(1, mSystemInfo, mSystemPanel); lp = new WindowManager.LayoutParams( @@ -159,6 +164,31 @@ public class TabletStatusBarService extends StatusBarService { WindowManagerImpl.getDefault().addView(mSystemPanel, lp); mSystemPanel.setBar(this); + + + // Recents Panel + if (USE_2D_RECENTS) { + mRecentsPanel = (RecentAppsPanel) View.inflate(context, R.layout.sysbar_panel_recent, + null); + mRecentsPanel.setVisibility(View.GONE); + mRecentsPanel.setOnTouchListener(new TouchOutsideListener(MSG_CLOSE_RECENTS_PANEL, + mRecentsPanel)); + mStatusBarView.setIgnoreChildren(2, mRecentButton, mRecentsPanel); + + lp = new WindowManager.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, + WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, + PixelFormat.TRANSLUCENT); + lp.gravity = Gravity.BOTTOM | Gravity.LEFT; + lp.setTitle("RecentsPanel"); + lp.windowAnimations = com.android.internal.R.style.Animation_SlidingCard; + + WindowManagerImpl.getDefault().addView(mRecentsPanel, lp); + mRecentsPanel.setBar(this); + } } @Override @@ -181,12 +211,13 @@ public class TabletStatusBarService extends StatusBarService { mBarContents = sb.findViewById(R.id.bar_contents); mCurtains = sb.findViewById(R.id.lights_out); mSystemInfo = sb.findViewById(R.id.systemInfo); + mRecentButton = sb.findViewById(R.id.recent_apps); // mSystemInfo.setOnClickListener(mOnClickListener); mSystemInfo.setOnLongClickListener(new SetLightsOnListener(false)); mSystemInfo.setOnTouchListener(new ClockTouchListener()); - mRecentButton = sb.findViewById(R.id.recent); + mRecentButton = sb.findViewById(R.id.recent_apps); mRecentButton.setOnClickListener(mOnClickListener); SetLightsOnListener on = new SetLightsOnListener(true); @@ -231,7 +262,7 @@ public class TabletStatusBarService extends StatusBarService { mPile = (ViewGroup)mNotificationPanel.findViewById(R.id.content); mPile.removeAllViews(); - + ScrollView scroller = (ScrollView)mPile.getParent(); scroller.setFillViewport(true); @@ -277,6 +308,13 @@ public class TabletStatusBarService extends StatusBarService { case MSG_CLOSE_SYSTEM_PANEL: if (DEBUG) Slog.d(TAG, "closing system panel"); mSystemPanel.setVisibility(View.GONE); + case MSG_OPEN_RECENTS_PANEL: + if (DEBUG) Slog.d(TAG, "opening recents panel"); + if (mRecentsPanel != null) mRecentsPanel.setVisibility(View.VISIBLE); + break; + case MSG_CLOSE_RECENTS_PANEL: + if (DEBUG) Slog.d(TAG, "closing recents panel"); + if (mRecentsPanel != null) mRecentsPanel.setVisibility(View.GONE); break; } } @@ -315,7 +353,7 @@ public class TabletStatusBarService extends StatusBarService { mSignalMeter.setImageResource(R.drawable.sysbar_wifimini); // adjust to permyriad mSignalMeter.setImageLevel(level * (MAX_IMAGE_LEVEL / 100)); - mSignalIcon.setImageResource(isWifi ? R.drawable.ic_sysbar_wifi_mini + mSignalIcon.setImageResource(isWifi ? R.drawable.ic_sysbar_wifi_mini : R.drawable.ic_sysbar_wifi_mini); // XXX } } @@ -362,7 +400,7 @@ public class TabletStatusBarService extends StatusBarService { public void updateNotification(IBinder key, StatusBarNotification notification) { if (DEBUG) Slog.d(TAG, "updateNotification(" + key + " -> " + notification + ") // TODO"); - + final NotificationData.Entry oldEntry = mNotns.findByKey(key); if (oldEntry == null) { Slog.w(TAG, "updateNotification for unknown key: " + key); @@ -527,6 +565,8 @@ public class TabletStatusBarService extends StatusBarService { mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PANEL); mHandler.removeMessages(MSG_CLOSE_SYSTEM_PANEL); mHandler.sendEmptyMessage(MSG_CLOSE_SYSTEM_PANEL); + mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL); + mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL); } public void setLightsOn(boolean on) { @@ -665,7 +705,7 @@ public class TabletStatusBarService extends StatusBarService { mIconLayout.setVisibility(View.VISIBLE); // TODO: animation refreshNotificationTrigger(); } else { - int msg = (mNotificationPanel.getVisibility() == View.GONE) + int msg = (mNotificationPanel.getVisibility() == View.GONE) ? MSG_OPEN_NOTIFICATION_PANEL : MSG_CLOSE_NOTIFICATION_PANEL; mHandler.removeMessages(msg); @@ -677,7 +717,7 @@ public class TabletStatusBarService extends StatusBarService { public void onClickSystemInfo() { if (DEBUG) Slog.d(TAG, "clicked system info"); if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) { - int msg = (mSystemPanel.getVisibility() == View.GONE) + int msg = (mSystemPanel.getVisibility() == View.GONE) ? MSG_OPEN_SYSTEM_PANEL : MSG_CLOSE_SYSTEM_PANEL; mHandler.removeMessages(msg); @@ -687,11 +727,21 @@ public class TabletStatusBarService extends StatusBarService { public void onClickRecentButton() { if (DEBUG) Slog.d(TAG, "clicked recent apps"); - Intent intent = new Intent(); - intent.setClass(mContext, RecentApplicationsActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); - mContext.startActivity(intent); + if (mRecentsPanel == null) { + Intent intent = new Intent(); + intent.setClass(mContext, RecentApplicationsActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + mContext.startActivity(intent); + } else { + if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) { + int msg = (mRecentsPanel.getVisibility() == View.GONE) + ? MSG_OPEN_RECENTS_PANEL + : MSG_CLOSE_RECENTS_PANEL; + mHandler.removeMessages(msg); + mHandler.sendEmptyMessage(msg); + } + } } private class NotificationClicker implements View.OnClickListener { @@ -835,7 +885,7 @@ public class TabletStatusBarService extends StatusBarService { final String _pkg = sbn.pkg; final String _tag = sbn.tag; final int _id = sbn.id; - vetoButton.setOnClickListener(new View.OnClickListener() { + vetoButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try { mBarService.onNotificationClear(_pkg, _tag, _id); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java index d836e4af88554..15866fe7c88dc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java @@ -26,8 +26,8 @@ import android.widget.FrameLayout; public class TabletStatusBarView extends FrameLayout { private Handler mHandler; - private View[] mIgnoreChildren = new View[2]; - private View[] mPanels = new View[2]; + private View[] mIgnoreChildren = new View[3]; + private View[] mPanels = new View[3]; private int[] mPos = new int[2]; public TabletStatusBarView(Context context) { @@ -44,9 +44,11 @@ public class TabletStatusBarView extends FrameLayout { mHandler.sendEmptyMessage(TabletStatusBarService.MSG_CLOSE_NOTIFICATION_PANEL); mHandler.removeMessages(TabletStatusBarService.MSG_CLOSE_SYSTEM_PANEL); mHandler.sendEmptyMessage(TabletStatusBarService.MSG_CLOSE_SYSTEM_PANEL); + mHandler.removeMessages(TabletStatusBarService.MSG_CLOSE_RECENTS_PANEL); + mHandler.sendEmptyMessage(TabletStatusBarService.MSG_CLOSE_RECENTS_PANEL); - for (int i=0; i