summaryrefslogtreecommitdiffstats
path: root/packages
diff options
context:
space:
mode:
authorDaniel Sandler <dsandler@android.com>2012-04-04 14:04:21 -0400
committerDaniel Sandler <dsandler@android.com>2012-04-19 11:39:49 -0400
commitf7a1956b06faeb6025fdea331f81d66edda58b3c (patch)
treedfba6fe76ce0bab0a964959cb04980972e4424b1 /packages
parent3dfc82b5677a77e805511c263197c95c52a1665e (diff)
downloadframeworks_base-f7a1956b06faeb6025fdea331f81d66edda58b3c.zip
frameworks_base-f7a1956b06faeb6025fdea331f81d66edda58b3c.tar.gz
frameworks_base-f7a1956b06faeb6025fdea331f81d66edda58b3c.tar.bz2
Long-press a notification to find out who sent it.
Bug: 5547401 Change-Id: I8d5d73723b3f03f5b0f8717faaca826b1530df7a
Diffstat (limited to 'packages')
-rw-r--r--packages/SystemUI/res/menu/notification_popup_menu.xml22
-rw-r--r--packages/SystemUI/res/values/strings.xml4
-rw-r--r--packages/SystemUI/src/com/android/systemui/SwipeHelper.java49
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java40
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java6
7 files changed, 123 insertions, 3 deletions
diff --git a/packages/SystemUI/res/menu/notification_popup_menu.xml b/packages/SystemUI/res/menu/notification_popup_menu.xml
new file mode 100644
index 0000000..8923fb6
--- /dev/null
+++ b/packages/SystemUI/res/menu/notification_popup_menu.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* apps/common/assets/default/default/skins/StatusBar.xml
+**
+** Copyright 2012, 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.
+*/
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@+id/notification_inspect_item" android:title="@string/status_bar_notification_inspect_item_title" />
+</menu>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 6dbe9d3..236ca6b 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -365,4 +365,8 @@
<!-- Description of the desk dock action that invokes the Android Dreams screen saver feature -->
<string name="dreams_dock_launcher">Activate screen saver</string>
+
+ <!-- Title shown in notification popup for inspecting the responsible
+ application -->
+ <string name="status_bar_notification_inspect_item_title">App info</string>
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
index 19657a9..414af89 100644
--- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
@@ -23,11 +23,14 @@ import android.animation.Animator.AnimatorListener;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.graphics.RectF;
+import android.os.Handler;
import android.util.Log;
+import android.view.accessibility.AccessibilityEvent;
import android.view.animation.LinearInterpolator;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
+import android.view.ViewConfiguration;
public class SwipeHelper implements Gefingerpoken {
static final String TAG = "com.android.systemui.SwipeHelper";
@@ -57,6 +60,7 @@ public class SwipeHelper implements Gefingerpoken {
private float mPagingTouchSlop;
private Callback mCallback;
+ private Handler mHandler;
private int mSwipeDirection;
private VelocityTracker mVelocityTracker;
@@ -67,15 +71,24 @@ public class SwipeHelper implements Gefingerpoken {
private boolean mCanCurrViewBeDimissed;
private float mDensityScale;
+ private boolean mLongPressSent;
+ private View.OnLongClickListener mLongPressListener;
+ private Runnable mWatchLongPress;
+
public SwipeHelper(int swipeDirection, Callback callback, float densityScale,
float pagingTouchSlop) {
mCallback = callback;
+ mHandler = new Handler();
mSwipeDirection = swipeDirection;
mVelocityTracker = VelocityTracker.obtain();
mDensityScale = densityScale;
mPagingTouchSlop = pagingTouchSlop;
}
+ public void setLongPressListener(View.OnLongClickListener listener) {
+ mLongPressListener = listener;
+ }
+
public void setDensityScale(float densityScale) {
mDensityScale = densityScale;
}
@@ -167,12 +180,19 @@ public class SwipeHelper implements Gefingerpoken {
}
}
+ private void removeLongPressCallback() {
+ if (mWatchLongPress != null) {
+ mHandler.removeCallbacks(mWatchLongPress);
+ }
+ }
+
public boolean onInterceptTouchEvent(MotionEvent ev) {
final int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
mDragging = false;
+ mLongPressSent = false;
mCurrView = mCallback.getChildAtPosition(ev);
mVelocityTracker.clear();
if (mCurrView != null) {
@@ -180,10 +200,28 @@ public class SwipeHelper implements Gefingerpoken {
mCanCurrViewBeDimissed = mCallback.canChildBeDismissed(mCurrView);
mVelocityTracker.addMovement(ev);
mInitialTouchPos = getPos(ev);
+
+ if (mLongPressListener != null) {
+ if (mWatchLongPress == null) {
+ mWatchLongPress = new Runnable() {
+ @Override
+ public void run() {
+ if (mCurrView != null && !mLongPressSent) {
+ mLongPressSent = true;
+ mCurrView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_LONG_CLICKED);
+ mLongPressListener.onLongClick(mCurrView);
+ }
+ }
+ };
+ }
+ mHandler.postDelayed(mWatchLongPress, ViewConfiguration.getLongPressTimeout());
+ }
+
}
break;
+
case MotionEvent.ACTION_MOVE:
- if (mCurrView != null) {
+ if (mCurrView != null && !mLongPressSent) {
mVelocityTracker.addMovement(ev);
float pos = getPos(ev);
float delta = pos - mInitialTouchPos;
@@ -191,14 +229,19 @@ public class SwipeHelper implements Gefingerpoken {
mCallback.onBeginDrag(mCurrView);
mDragging = true;
mInitialTouchPos = getPos(ev) - getTranslation(mCurrAnimView);
+
+ removeLongPressCallback();
}
}
+
break;
+
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mDragging = false;
mCurrView = null;
mCurrAnimView = null;
+ mLongPressSent = false;
break;
}
return mDragging;
@@ -269,6 +312,10 @@ public class SwipeHelper implements Gefingerpoken {
}
public boolean onTouchEvent(MotionEvent ev) {
+ if (mLongPressSent) {
+ return true;
+ }
+
if (!mDragging) {
return false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index dba70be..3803092 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -26,17 +26,20 @@ import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Rect;
+import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.provider.Settings;
import android.util.Log;
import android.util.Slog;
import android.view.Display;
import android.view.IWindowManager;
import android.view.LayoutInflater;
+import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
@@ -45,6 +48,7 @@ import android.view.WindowManager;
import android.view.WindowManagerImpl;
import android.widget.LinearLayout;
import android.widget.RemoteViews;
+import android.widget.PopupMenu;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.StatusBarIcon;
@@ -214,6 +218,39 @@ public abstract class BaseStatusBar extends SystemUI implements
}
}
+ private void startApplicationDetailsActivity(String packageName) {
+ Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
+ Uri.fromParts("package", packageName, null));
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(intent);
+ }
+
+ protected View.OnLongClickListener getNotificationLongClicker() {
+ return new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ final String packageNameF = (String) v.getTag();
+ if (packageNameF == null) return false;
+ PopupMenu popup = new PopupMenu(mContext, v);
+ popup.getMenuInflater().inflate(R.menu.notification_popup_menu, popup.getMenu());
+ popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ if (item.getItemId() == R.id.notification_inspect_item) {
+ startApplicationDetailsActivity(packageNameF);
+ animateCollapse();
+ } else {
+ return false;
+ }
+ return true;
+ }
+ });
+ popup.show();
+
+ return true;
+ }
+ };
+ }
+
public void dismissIntruder() {
// pass
}
@@ -355,6 +392,9 @@ public abstract class BaseStatusBar extends SystemUI implements
Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.status_bar_notification_row, parent, false);
+ // for blaming (see SwipeHelper.setLongPressListener)
+ row.setTag(sbn.pkg);
+
// XXX: temporary: while testing big notifications, auto-expand all of them
ViewGroup.LayoutParams lp = row.getLayoutParams();
if (large != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 76f7ea6..b7becf3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -314,6 +314,7 @@ public class PhoneStatusBar extends BaseStatusBar {
mExpandedDialog = new ExpandedDialog(context);
mPile = (NotificationRowLayout)expanded.findViewById(R.id.latestItems);
+ mPile.setLongPressListener(getNotificationLongClicker());
mExpandedContents = mPile; // was: expanded.findViewById(R.id.notificationLinearLayout);
mClearButton = expanded.findViewById(R.id.clear_all_button);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
index 5369317..5c38db5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
@@ -104,6 +104,10 @@ public class NotificationRowLayout
mExpandHelper = new ExpandHelper(mContext, this, minHeight, maxHeight);
}
+ public void setLongPressListener(View.OnLongClickListener listener) {
+ mSwipeHelper.setLongPressListener(listener);
+ }
+
public void setAnimateBounds(boolean anim) {
mAnimateBounds = anim;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
index 8c1509b..c868f78 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -74,6 +74,7 @@ import com.android.systemui.statusbar.policy.BluetoothController;
import com.android.systemui.statusbar.policy.CompatModeButton;
import com.android.systemui.statusbar.policy.LocationController;
import com.android.systemui.statusbar.policy.NetworkController;
+import com.android.systemui.statusbar.policy.NotificationRowLayout;
import com.android.systemui.statusbar.policy.Prefs;
import java.io.FileDescriptor;
@@ -153,7 +154,7 @@ public class TabletStatusBar extends BaseStatusBar implements
int mNotificationPeekTapDuration;
int mNotificationFlingVelocity;
- ViewGroup mPile;
+ NotificationRowLayout mPile;
BatteryController mBatteryController;
BluetoothController mBluetoothController;
@@ -375,8 +376,9 @@ public class TabletStatusBar extends BaseStatusBar implements
mRecentButton.setOnTouchListener(mRecentsPanel);
- mPile = (ViewGroup)mNotificationPanel.findViewById(R.id.content);
+ mPile = (NotificationRowLayout)mNotificationPanel.findViewById(R.id.content);
mPile.removeAllViews();
+ mPile.setLongPressListener(getNotificationLongClicker());
ScrollView scroller = (ScrollView)mPile.getParent();
scroller.setFillViewport(true);