diff options
11 files changed, 106 insertions, 27 deletions
diff --git a/api/current.txt b/api/current.txt index c18eafb..1b45ccd 100644 --- a/api/current.txt +++ b/api/current.txt @@ -3500,6 +3500,7 @@ package android.app { method public boolean shouldUpRecreateTask(android.content.Intent); method public final deprecated void showDialog(int); method public final deprecated boolean showDialog(int, android.os.Bundle); + method public void showLockTaskEscapeMessage(); method public android.view.ActionMode startActionMode(android.view.ActionMode.Callback); method public android.view.ActionMode startActionMode(android.view.ActionMode.Callback, int); method public void startActivityForResult(android.content.Intent, int); diff --git a/api/system-current.txt b/api/system-current.txt index 256a12f..853aa76 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3584,6 +3584,7 @@ package android.app { method public boolean shouldUpRecreateTask(android.content.Intent); method public final deprecated void showDialog(int); method public final deprecated boolean showDialog(int, android.os.Bundle); + method public void showLockTaskEscapeMessage(); method public android.view.ActionMode startActionMode(android.view.ActionMode.Callback); method public android.view.ActionMode startActionMode(android.view.ActionMode.Callback, int); method public void startActivityForResult(android.content.Intent, int); diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 4ccde1c..69cba78 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -6483,6 +6483,18 @@ public class Activity extends ContextThemeWrapper } /** + * Shows the user the system defined message for telling the user how to exit + * lock task mode. The task containing this activity must be in lock task mode at the time + * of this call for the message to be displayed. + */ + public void showLockTaskEscapeMessage() { + try { + ActivityManagerNative.getDefault().showLockTaskEscapeMessage(mToken); + } catch (RemoteException e) { + } + } + + /** * Interface for informing a translucent {@link Activity} once all visible activities below it * have completed drawing. This is necessary only after an {@link Activity} has been made * opaque using {@link Activity#convertFromTranslucent()} and before it has been drawn diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 256d87d..e0de156 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -2340,6 +2340,14 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } + case SHOW_LOCK_TASK_ESCAPE_MESSAGE_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + final IBinder token = data.readStrongBinder(); + showLockTaskEscapeMessage(token); + reply.writeNoException(); + return true; + } + case SET_TASK_DESCRIPTION_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder token = data.readStrongBinder(); @@ -5547,6 +5555,19 @@ class ActivityManagerProxy implements IActivityManager } @Override + public void showLockTaskEscapeMessage(IBinder token) throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + data.writeStrongBinder(token); + mRemote.transact(SHOW_LOCK_TASK_ESCAPE_MESSAGE_TRANSACTION, data, reply, + IBinder.FLAG_ONEWAY); + reply.readException(); + data.recycle(); + reply.recycle(); + } + + @Override public void setTaskDescription(IBinder token, ActivityManager.TaskDescription values) throws RemoteException { Parcel data = Parcel.obtain(); diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 59de281..7e03faa 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -467,6 +467,8 @@ public interface IActivityManager extends IInterface { public int getLockTaskModeState() throws RemoteException; + public void showLockTaskEscapeMessage(IBinder token) throws RemoteException; + public void setTaskDescription(IBinder token, ActivityManager.TaskDescription values) throws RemoteException; public void setTaskResizeable(int taskId, boolean resizeable) throws RemoteException; @@ -834,4 +836,5 @@ public interface IActivityManager extends IInterface { int NOTE_ALARM_START_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+291; int NOTE_ALARM_FINISH_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+292; int GET_PACKAGE_PROCESS_STATE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+293; + int SHOW_LOCK_TASK_ESCAPE_MESSAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+294; } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f25808b..faba838 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -33,7 +33,6 @@ import static com.android.server.am.TaskRecord.INVALID_TASK_ID; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_DONT_LOCK; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_PINNABLE; -import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_WHITELISTED; import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; import static org.xmlpull.v1.XmlPullParser.START_TAG; @@ -8661,6 +8660,17 @@ public final class ActivityManagerService extends ActivityManagerNative } } + @Override + public void showLockTaskEscapeMessage(IBinder token) { + synchronized (this) { + final ActivityRecord r = ActivityRecord.forTokenLocked(token); + if (r == null) { + return; + } + mStackSupervisor.showLockTaskEscapeMessageLocked(r.task); + } + } + // ========================================================= // CONTENT PROVIDERS // ========================================================= diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 6908483..eb1b1d8 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -165,6 +165,7 @@ public final class ActivityStackSupervisor implements DisplayListener { static final int LOCK_TASK_END_MSG = FIRST_SUPERVISOR_STACK_MSG + 10; static final int CONTAINER_CALLBACK_TASK_LIST_EMPTY = FIRST_SUPERVISOR_STACK_MSG + 11; static final int LAUNCH_TASK_BEHIND_COMPLETE = FIRST_SUPERVISOR_STACK_MSG + 12; + static final int SHOW_LOCK_TASK_ESCAPE_MESSAGE_MSG = FIRST_SUPERVISOR_STACK_MSG + 13; private final static String VIRTUAL_DISPLAY_BASE_NAME = "ActivityViewVirtualDisplay"; @@ -3634,6 +3635,12 @@ public final class ActivityStackSupervisor implements DisplayListener { mLockTaskNotify.showToast(mLockTaskModeState); } + void showLockTaskEscapeMessageLocked(TaskRecord task) { + if (mLockTaskModeTasks.contains(task)) { + mHandler.sendEmptyMessage(SHOW_LOCK_TASK_ESCAPE_MESSAGE_MSG); + } + } + void setLockTaskModeLocked(TaskRecord task, int lockTaskModeState, String reason) { if (task == null) { // Take out of lock task mode if necessary @@ -3879,6 +3886,12 @@ public final class ActivityStackSupervisor implements DisplayListener { mLockTaskModeState = LOCK_TASK_MODE_NONE; } } break; + case SHOW_LOCK_TASK_ESCAPE_MESSAGE_MSG: { + if (mLockTaskNotify == null) { + mLockTaskNotify = new LockTaskNotify(mService.mContext); + } + mLockTaskNotify.showToast(LOCK_TASK_MODE_PINNED); + } break; case CONTAINER_CALLBACK_TASK_LIST_EMPTY: { final ActivityContainer container = (ActivityContainer) msg.obj; final IActivityContainerCallback callback = container.mCallback; diff --git a/tests/LockTaskTests/res/layout/activity_main.xml b/tests/LockTaskTests/res/layout/activity_main.xml index c2e93c4..dbdc9fa 100644 --- a/tests/LockTaskTests/res/layout/activity_main.xml +++ b/tests/LockTaskTests/res/layout/activity_main.xml @@ -2,7 +2,7 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/root_launch" android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="wrap_content" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" @@ -37,5 +37,11 @@ android:layout_marginTop="16dp" android:onClick="onButtonPressed" android:text="@string/launch_always" /> - + <Button + android:id="@+id/toast_pinned" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:onClick="onToast" + android:text="@string/toast_pinned" /> </LinearLayout> diff --git a/tests/LockTaskTests/res/values/strings.xml b/tests/LockTaskTests/res/values/strings.xml index ae7768e..61c029f 100644 --- a/tests/LockTaskTests/res/values/strings.xml +++ b/tests/LockTaskTests/res/values/strings.xml @@ -22,4 +22,5 @@ <string name="try_lock">Call startLockMode()</string> <string name="try_unlock">Call stopLockMode()</string> + <string name="toast_pinned">Show pinned toast message</string> </resources> diff --git a/tests/LockTaskTests/src/com/google/android/example/locktasktests/LaunchActivity.java b/tests/LockTaskTests/src/com/google/android/example/locktasktests/LaunchActivity.java index 1fc53cb..ab60d485 100644 --- a/tests/LockTaskTests/src/com/google/android/example/locktasktests/LaunchActivity.java +++ b/tests/LockTaskTests/src/com/google/android/example/locktasktests/LaunchActivity.java @@ -21,47 +21,61 @@ import android.app.ActivityManager; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.view.View; import android.widget.EditText; public class LaunchActivity extends Activity { - EditText mEditText; + Runnable mBackgroundPolling; + boolean mRunning; + Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_launch); - setBackgroundOnLockTaskMode(); + mBackgroundPolling = new Runnable() { + @Override + public void run() { + if (!mRunning) { + return; + } + ActivityManager activityManager = + (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + final int color = activityManager.getLockTaskModeState() != + ActivityManager.LOCK_TASK_MODE_NONE ? 0xFFFFC0C0 : 0xFFFFFFFF; + findViewById(R.id.root_launch).setBackgroundColor(color); + mHandler.postDelayed(this, 1000); + } + }; + mHandler = new Handler(Looper.getMainLooper()); } @Override public void onResume() { super.onResume(); - setBackgroundOnLockTaskMode(); + mRunning = true; + mBackgroundPolling.run(); + } + + @Override + public void onPause() { + super.onPause(); + mRunning = false; } public void onTryLock(View view) { startLockTask(); - setBackgroundOnLockTaskMode(); } public void onTryUnlock(View view) { stopLockTask(); - setBackgroundOnLockTaskMode(); } public void onLaunchMain(View view) { Intent intent = new Intent(this, MainActivity.class); startActivity(intent); } - - private void setBackgroundOnLockTaskMode() { - ActivityManager activityManager = - (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); - final int color = - activityManager.getLockTaskModeState() != ActivityManager.LOCK_TASK_MODE_NONE ? - 0xFFFFC0C0 : 0xFFFFFFFF; - findViewById(R.id.root_launch).setBackgroundColor(color); - } } diff --git a/tests/LockTaskTests/src/com/google/android/example/locktasktests/MainActivity.java b/tests/LockTaskTests/src/com/google/android/example/locktasktests/MainActivity.java index 82fac03..c2275c8 100644 --- a/tests/LockTaskTests/src/com/google/android/example/locktasktests/MainActivity.java +++ b/tests/LockTaskTests/src/com/google/android/example/locktasktests/MainActivity.java @@ -6,7 +6,6 @@ import android.app.ActivityManager; import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.util.Log; import android.view.View; public class MainActivity extends Activity { @@ -17,13 +16,16 @@ public class MainActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - setBackgroundOnLockTaskMode(); } @Override public void onResume() { super.onResume(); - setBackgroundOnLockTaskMode(); + ActivityManager activityManager = + (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + final int color = activityManager.getLockTaskModeState() != + ActivityManager.LOCK_TASK_MODE_NONE ? 0xFFFFC0C0 : 0xFFFFFFFF; + findViewById(R.id.root_launch).setBackgroundColor(color); } public void onButtonPressed(View v) { @@ -47,12 +49,7 @@ public class MainActivity extends Activity { startActivity(intent); } - private void setBackgroundOnLockTaskMode() { - ActivityManager activityManager = - (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); - final int color = - activityManager.getLockTaskModeState() != ActivityManager.LOCK_TASK_MODE_NONE ? - 0xFFFFC0C0 : 0xFFFFFFFF; - findViewById(R.id.root_launch).setBackgroundColor(color); + public void onToast(View v) { + showLockTaskEscapeMessage(); } } |