summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/current.txt1
-rw-r--r--api/system-current.txt1
-rw-r--r--core/java/android/app/Activity.java12
-rw-r--r--core/java/android/app/ActivityManagerNative.java21
-rw-r--r--core/java/android/app/IActivityManager.java3
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java12
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java13
-rw-r--r--tests/LockTaskTests/res/layout/activity_main.xml10
-rw-r--r--tests/LockTaskTests/res/values/strings.xml1
-rw-r--r--tests/LockTaskTests/src/com/google/android/example/locktasktests/LaunchActivity.java42
-rw-r--r--tests/LockTaskTests/src/com/google/android/example/locktasktests/MainActivity.java17
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();
}
}