Merge "Revert "Prevent apps to overlay other apps via toast windows"" into nyc-mr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
78fa7a1b3f
@@ -19,7 +19,7 @@ package android.app;
|
||||
|
||||
/** @hide */
|
||||
oneway interface ITransientNotification {
|
||||
void show(IBinder windowToken);
|
||||
void show();
|
||||
void hide();
|
||||
}
|
||||
|
||||
|
||||
@@ -24,10 +24,7 @@ import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.os.Binder;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.os.Message;
|
||||
import android.os.RemoteException;
|
||||
import android.os.ServiceManager;
|
||||
import android.util.Log;
|
||||
@@ -329,6 +326,13 @@ public class Toast {
|
||||
}
|
||||
|
||||
private static class TN extends ITransientNotification.Stub {
|
||||
final Runnable mShow = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
handleShow();
|
||||
}
|
||||
};
|
||||
|
||||
final Runnable mHide = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
@@ -339,13 +343,7 @@ public class Toast {
|
||||
};
|
||||
|
||||
private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
|
||||
final Handler mHandler = new Handler() {
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
IBinder token = (IBinder) msg.obj;
|
||||
handleShow(token);
|
||||
}
|
||||
};
|
||||
final Handler mHandler = new Handler();
|
||||
|
||||
int mGravity;
|
||||
int mX, mY;
|
||||
@@ -381,9 +379,9 @@ public class Toast {
|
||||
* schedule handleShow into the right thread
|
||||
*/
|
||||
@Override
|
||||
public void show(IBinder windowToken) {
|
||||
public void show() {
|
||||
if (localLOGV) Log.v(TAG, "SHOW: " + this);
|
||||
mHandler.obtainMessage(0, windowToken).sendToTarget();
|
||||
mHandler.post(mShow);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -395,7 +393,7 @@ public class Toast {
|
||||
mHandler.post(mHide);
|
||||
}
|
||||
|
||||
public void handleShow(IBinder windowToken) {
|
||||
public void handleShow() {
|
||||
if (localLOGV) Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + mView
|
||||
+ " mNextView=" + mNextView);
|
||||
if (mView != mNextView) {
|
||||
@@ -426,7 +424,6 @@ public class Toast {
|
||||
mParams.packageName = packageName;
|
||||
mParams.removeTimeoutMilliseconds = mDuration ==
|
||||
Toast.LENGTH_LONG ? LONG_DURATION_TIMEOUT : SHORT_DURATION_TIMEOUT;
|
||||
mParams.token = windowToken;
|
||||
if (mView.getParent() != null) {
|
||||
if (localLOGV) Log.v(TAG, "REMOVE! " + mView + " in " + this);
|
||||
mWM.removeView(mView);
|
||||
|
||||
@@ -58,6 +58,7 @@ import android.app.Notification;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.NotificationManager.Policy;
|
||||
import android.app.PendingIntent;
|
||||
import android.app.RemoteInput;
|
||||
import android.app.StatusBarManager;
|
||||
import android.app.backup.BackupManager;
|
||||
import android.app.usage.UsageEvents;
|
||||
@@ -92,6 +93,7 @@ import android.os.IBinder;
|
||||
import android.os.IInterface;
|
||||
import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.os.Parcelable;
|
||||
import android.os.Process;
|
||||
import android.os.RemoteException;
|
||||
import android.os.SystemClock;
|
||||
@@ -120,8 +122,6 @@ import android.util.Log;
|
||||
import android.util.Slog;
|
||||
import android.util.SparseArray;
|
||||
import android.util.Xml;
|
||||
import android.view.WindowManager;
|
||||
import android.view.WindowManagerInternal;
|
||||
import android.view.accessibility.AccessibilityEvent;
|
||||
import android.view.accessibility.AccessibilityManager;
|
||||
import android.widget.Toast;
|
||||
@@ -232,7 +232,6 @@ public class NotificationManagerService extends SystemService {
|
||||
@Nullable StatusBarManagerInternal mStatusBar;
|
||||
Vibrator mVibrator;
|
||||
private VrManagerInternal mVrManagerInternal;
|
||||
private WindowManagerInternal mWindowManagerInternal;
|
||||
|
||||
final IBinder mForegroundToken = new Binder();
|
||||
private Handler mHandler;
|
||||
@@ -453,15 +452,13 @@ public class NotificationManagerService extends SystemService {
|
||||
final String pkg;
|
||||
final ITransientNotification callback;
|
||||
int duration;
|
||||
Binder token;
|
||||
|
||||
ToastRecord(int pid, String pkg, ITransientNotification callback, int duration,
|
||||
Binder token) {
|
||||
ToastRecord(int pid, String pkg, ITransientNotification callback, int duration)
|
||||
{
|
||||
this.pid = pid;
|
||||
this.pkg = pkg;
|
||||
this.callback = callback;
|
||||
this.duration = duration;
|
||||
this.token = token;
|
||||
}
|
||||
|
||||
void update(int duration) {
|
||||
@@ -1128,7 +1125,6 @@ public class NotificationManagerService extends SystemService {
|
||||
mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
|
||||
mAudioManagerInternal = getLocalService(AudioManagerInternal.class);
|
||||
mVrManagerInternal = getLocalService(VrManagerInternal.class);
|
||||
mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
|
||||
mZenModeHelper.onSystemReady();
|
||||
} else if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) {
|
||||
// This observer will force an update when observe is called, causing us to
|
||||
@@ -1329,13 +1325,10 @@ public class NotificationManagerService extends SystemService {
|
||||
}
|
||||
}
|
||||
|
||||
Binder token = new Binder();
|
||||
mWindowManagerInternal.addWindowToken(token,
|
||||
WindowManager.LayoutParams.TYPE_TOAST);
|
||||
record = new ToastRecord(callingPid, pkg, callback, duration, token);
|
||||
record = new ToastRecord(callingPid, pkg, callback, duration);
|
||||
mToastQueue.add(record);
|
||||
index = mToastQueue.size() - 1;
|
||||
keepProcessAliveIfNeededLocked(callingPid);
|
||||
keepProcessAliveLocked(callingPid);
|
||||
}
|
||||
// If it's at index 0, it's the current toast. It doesn't matter if it's
|
||||
// new or just been updated. Call back and tell it to show itself.
|
||||
@@ -2994,7 +2987,7 @@ public class NotificationManagerService extends SystemService {
|
||||
while (record != null) {
|
||||
if (DBG) Slog.d(TAG, "Show pkg=" + record.pkg + " callback=" + record.callback);
|
||||
try {
|
||||
record.callback.show(record.token);
|
||||
record.callback.show();
|
||||
scheduleTimeoutLocked(record);
|
||||
return;
|
||||
} catch (RemoteException e) {
|
||||
@@ -3005,7 +2998,7 @@ public class NotificationManagerService extends SystemService {
|
||||
if (index >= 0) {
|
||||
mToastQueue.remove(index);
|
||||
}
|
||||
keepProcessAliveIfNeededLocked(record.pid);
|
||||
keepProcessAliveLocked(record.pid);
|
||||
if (mToastQueue.size() > 0) {
|
||||
record = mToastQueue.get(0);
|
||||
} else {
|
||||
@@ -3025,11 +3018,8 @@ public class NotificationManagerService extends SystemService {
|
||||
// don't worry about this, we're about to remove it from
|
||||
// the list anyway
|
||||
}
|
||||
|
||||
ToastRecord lastToast = mToastQueue.remove(index);
|
||||
mWindowManagerInternal.removeWindowToken(lastToast.token, true);
|
||||
|
||||
keepProcessAliveIfNeededLocked(record.pid);
|
||||
mToastQueue.remove(index);
|
||||
keepProcessAliveLocked(record.pid);
|
||||
if (mToastQueue.size() > 0) {
|
||||
// Show the next one. If the callback fails, this will remove
|
||||
// it from the list, so don't assume that the list hasn't changed
|
||||
@@ -3073,7 +3063,7 @@ public class NotificationManagerService extends SystemService {
|
||||
}
|
||||
|
||||
// lock on mToastQueue
|
||||
void keepProcessAliveIfNeededLocked(int pid)
|
||||
void keepProcessAliveLocked(int pid)
|
||||
{
|
||||
int toastCount = 0; // toasts from this pid
|
||||
ArrayList<ToastRecord> list = mToastQueue;
|
||||
|
||||
@@ -200,7 +200,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_QS_DIALOG;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
|
||||
import static android.view.WindowManagerGlobal.RELAYOUT_DEFER_SURFACE_DESTROY;
|
||||
@@ -1951,11 +1950,6 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
+ attrs.token + ". Aborting.");
|
||||
return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
|
||||
}
|
||||
if (type == TYPE_TOAST) {
|
||||
Slog.w(TAG_WM, "Attempted to add a toast window with unknown token "
|
||||
+ attrs.token + ". Aborting.");
|
||||
return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
|
||||
}
|
||||
token = new WindowToken(this, attrs.token, -1, false);
|
||||
addToken = true;
|
||||
} else if (type >= FIRST_APPLICATION_WINDOW && type <= LAST_APPLICATION_WINDOW) {
|
||||
@@ -2005,12 +1999,6 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
+ attrs.token + ". Aborting.");
|
||||
return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
|
||||
}
|
||||
} else if (type == TYPE_TOAST) {
|
||||
if (token.windowType != TYPE_TOAST) {
|
||||
Slog.w(TAG_WM, "Attempted to add a toast window with bad token "
|
||||
+ attrs.token + ". Aborting.");
|
||||
return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
|
||||
}
|
||||
} else if (type == TYPE_QS_DIALOG) {
|
||||
if (token.windowType != TYPE_QS_DIALOG) {
|
||||
Slog.w(TAG_WM, "Attempted to add QS dialog window with bad token "
|
||||
|
||||
Reference in New Issue
Block a user