diff --git a/samples/ApiDemos/AndroidManifest.xml b/samples/ApiDemos/AndroidManifest.xml
index 6d13ce6a1..b7f681993 100644
--- a/samples/ApiDemos/AndroidManifest.xml
+++ b/samples/ApiDemos/AndroidManifest.xml
@@ -262,6 +262,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ApiDemos/res/layout/secure_surface_view_activity.xml b/samples/ApiDemos/res/layout/secure_surface_view_activity.xml
new file mode 100644
index 000000000..b7657b4bd
--- /dev/null
+++ b/samples/ApiDemos/res/layout/secure_surface_view_activity.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ApiDemos/res/layout/secure_window_activity.xml b/samples/ApiDemos/res/layout/secure_window_activity.xml
new file mode 100644
index 000000000..6d086da0c
--- /dev/null
+++ b/samples/ApiDemos/res/layout/secure_window_activity.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ApiDemos/res/values/strings.xml b/samples/ApiDemos/res/values/strings.xml
index e1e8adbbf..9d8616d7e 100644
--- a/samples/ApiDemos/res/values/strings.xml
+++ b/samples/ApiDemos/res/values/strings.xml
@@ -122,6 +122,32 @@
Display %1$d InfoOK
+ App/Activity/Secure Surfaces/Secure Window
+ This activity demonstrates how to make an activity
+ use a secure surface so that its contents will only be visible on secure displays.
+ The activity\'s window has been marked with FLAG_SECURE to make it use a secure surface.
+ Consequently, the contents of the activity will not appear in screenshots and will not
+ be mirrored to non-secure displays.\n
+ \n
+ I am a secure activity!
+
+ App/Activity/Secure Surfaces/Secure Dialog
+ This activity demonstrates how to make a dialog use
+ a secure surface so that its contents will only be visible on secure displays.
+ The dialog\'s window has been marked with FLAG_SECURE to make it use a secure surface.
+ Consequently, the contents of the dialog will not appear in screenshots and will not
+ be mirrored to non-secure displays.
+ Show secure dialog
+ I am a secure dialog!
+
+ App/Activity/Secure Surfaces/Secure Surface View
+ This activity demonstrates how to make a
+ SurfaceView use a secure surface so that its contents will only be visible on
+ secure displays.
+ The surface view\'s window has been made secure using setSecure(true) to make it use
+ a secure surface. Consequently, the contents of the surface view will not appear in
+ screenshots and will not be mirrored to non-secure displays.
+
App/Fragment/Alert DialogApp/Fragment/Arguments
diff --git a/samples/ApiDemos/src/com/example/android/apis/app/PresentationActivity.java b/samples/ApiDemos/src/com/example/android/apis/app/PresentationActivity.java
index 93647bf21..3e561aa90 100644
--- a/samples/ApiDemos/src/com/example/android/apis/app/PresentationActivity.java
+++ b/samples/ApiDemos/src/com/example/android/apis/app/PresentationActivity.java
@@ -64,9 +64,10 @@ public class PresentationActivity extends Activity
// The content that we want to show on the presentation.
private static final int[] CHANNELS = new int[] {
- R.drawable.sample_4, R.drawable.frantic, R.drawable.beach,
+ R.drawable.frantic,
R.drawable.photo1, R.drawable.photo2, R.drawable.photo3,
R.drawable.photo4, R.drawable.photo5, R.drawable.photo6,
+ R.drawable.sample_4,
};
private DisplayManager mDisplayManager;
@@ -182,8 +183,9 @@ public class PresentationActivity extends Activity
}
private int getNextChannel() {
+ final int channel = mNextChannelNumber;
mNextChannelNumber = (mNextChannelNumber + 1) % CHANNELS.length;
- return mNextChannelNumber;
+ return channel;
}
@Override
diff --git a/samples/ApiDemos/src/com/example/android/apis/app/SecureDialogActivity.java b/samples/ApiDemos/src/com/example/android/apis/app/SecureDialogActivity.java
new file mode 100644
index 000000000..fe871aa8a
--- /dev/null
+++ b/samples/ApiDemos/src/com/example/android/apis/app/SecureDialogActivity.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 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.
+ */
+
+package com.example.android.apis.app;
+
+import com.example.android.apis.R;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.os.Bundle;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.Button;
+
+/**
+ *
Secure Dialog Activity
+ *
+ *
+ * This activity demonstrates how to create a dialog whose window is backed by
+ * a secure surface using {@link WindowManager.LayoutParams#FLAG_SECURE}.
+ * Because the surface is secure, its contents cannot be captured in screenshots
+ * and will not be visible on non-secure displays even when mirrored.
+ *
+ * Here are a few things you can do to experiment with secure surfaces and
+ * observe their behavior.
+ *
+ *
Try taking a screenshot. Either the system will prevent you from taking
+ * a screenshot altogether or the screenshot should not contain the contents
+ * of the secure surface.
+ *
Try mirroring the secure surface onto a non-secure display such as an
+ * "Overlay Display" created using the "Simulate secondary displays" option in
+ * the "Developer options" section of the Settings application. The non-secure
+ * secondary display should not show the contents of the secure surface.
+ *
Try mirroring the secure surface onto a secure display such as an
+ * HDMI display with HDCP enabled. The contents of the secure surface should appear
+ * on the display.
+ *
+ *
+ */
+public class SecureDialogActivity extends Activity
+ implements View.OnClickListener {
+ /**
+ * Initialization of the Activity after it is first created. Must at least
+ * call {@link android.app.Activity#setContentView setContentView()} to
+ * describe what is to be displayed in the screen.
+ */
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ // Be sure to call the super class.
+ super.onCreate(savedInstanceState);
+
+ // See assets/res/any/layout/secure_dialog_activity.xml for this
+ // view layout definition, which is being set here as
+ // the content of our screen.
+ setContentView(R.layout.secure_dialog_activity);
+
+ // Handle click events on the button to show the dialog.
+ Button button = (Button)findViewById(R.id.show);
+ button.setOnClickListener(this);
+ }
+
+ /**
+ * Called when the button to show the dialog is clicked.
+ */
+ @Override
+ public void onClick(View v) {
+ // Create a dialog.
+ AlertDialog dialog = new AlertDialog.Builder(this)
+ .setPositiveButton(android.R.string.ok, null)
+ .setMessage(R.string.secure_dialog_dialog_text)
+ .create();
+
+ // Make the dialog secure. This must be done at the time the dialog is
+ // created. It cannot be changed after the dialog has been shown.
+ dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
+ WindowManager.LayoutParams.FLAG_SECURE);
+
+ // Show the dialog.
+ dialog.show();
+ }
+}
diff --git a/samples/ApiDemos/src/com/example/android/apis/app/SecureSurfaceViewActivity.java b/samples/ApiDemos/src/com/example/android/apis/app/SecureSurfaceViewActivity.java
new file mode 100644
index 000000000..2c3abed22
--- /dev/null
+++ b/samples/ApiDemos/src/com/example/android/apis/app/SecureSurfaceViewActivity.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 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.
+ */
+
+package com.example.android.apis.app;
+
+import com.example.android.apis.R;
+import com.example.android.apis.graphics.CubeRenderer;
+
+import android.app.Activity;
+import android.opengl.GLSurfaceView;
+import android.os.Bundle;
+import android.view.SurfaceView;
+import android.view.WindowManager;
+
+/**
+ *
Secure Window Activity
+ *
+ *
+ * This activity demonstrates how to create a {@link SurfaceView} backed by
+ * a secure surface using {@link SurfaceView#setSecure}.
+ * Because the surface is secure, its contents cannot be captured in screenshots
+ * and will not be visible on non-secure displays even when mirrored.
+ *
+ * Here are a few things you can do to experiment with secure surfaces and
+ * observe their behavior.
+ *
+ *
Try taking a screenshot. Either the system will prevent you from taking
+ * a screenshot altogether or the screenshot should not contain the contents
+ * of the secure surface.
+ *
Try mirroring the secure surface onto a non-secure display such as an
+ * "Overlay Display" created using the "Simulate secondary displays" option in
+ * the "Developer options" section of the Settings application. The non-secure
+ * secondary display should not show the contents of the secure surface.
+ *
Try mirroring the secure surface onto a secure display such as an
+ * HDMI display with HDCP enabled. The contents of the secure surface should appear
+ * on the display.
+ *
+ *
+ */
+public class SecureSurfaceViewActivity extends Activity {
+ /**
+ * Initialization of the Activity after it is first created. Must at least
+ * call {@link android.app.Activity#setContentView setContentView()} to
+ * describe what is to be displayed in the screen.
+ */
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ // Be sure to call the super class.
+ super.onCreate(savedInstanceState);
+
+ // See assets/res/any/layout/secure_surface_view_activity.xml for this
+ // view layout definition, which is being set here as
+ // the content of our screen.
+ setContentView(R.layout.secure_surface_view_activity);
+
+ // Set up the surface view.
+ // We use a GLSurfaceView in this demonstration but ordinary
+ // SurfaceViews also support the same secure surface functionality.
+ GLSurfaceView surfaceView = (GLSurfaceView)findViewById(R.id.surface_view);
+ surfaceView.setRenderer(new CubeRenderer(false));
+
+ // Make the surface view secure. This must be done at the time the surface view
+ // is created before the surface view's containing window is attached to
+ // the window manager which happens after onCreate returns.
+ // It cannot be changed later.
+ surfaceView.setSecure(true);
+ }
+}
diff --git a/samples/ApiDemos/src/com/example/android/apis/app/SecureWindowActivity.java b/samples/ApiDemos/src/com/example/android/apis/app/SecureWindowActivity.java
new file mode 100644
index 000000000..4b5e8b672
--- /dev/null
+++ b/samples/ApiDemos/src/com/example/android/apis/app/SecureWindowActivity.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 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.
+ */
+
+package com.example.android.apis.app;
+
+import com.example.android.apis.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.WindowManager;
+
+/**
+ *
Secure Window Activity
+ *
+ *
+ * This activity demonstrates how to create an activity whose window is backed by
+ * a secure surface using {@link WindowManager.LayoutParams#FLAG_SECURE}.
+ * Because the surface is secure, its contents cannot be captured in screenshots
+ * and will not be visible on non-secure displays even when mirrored.
+ *
+ * Here are a few things you can do to experiment with secure surfaces and
+ * observe their behavior.
+ *
+ *
Try taking a screenshot. Either the system will prevent you from taking
+ * a screenshot altogether or the screenshot should not contain the contents
+ * of the secure surface.
+ *
Try mirroring the secure surface onto a non-secure display such as an
+ * "Overlay Display" created using the "Simulate secondary displays" option in
+ * the "Developer options" section of the Settings application. The non-secure
+ * secondary display should not show the contents of the secure surface.
+ *
Try mirroring the secure surface onto a secure display such as an
+ * HDMI display with HDCP enabled. The contents of the secure surface should appear
+ * on the display.
+ *
+ *
+ */
+public class SecureWindowActivity extends Activity {
+ /**
+ * Initialization of the Activity after it is first created. Must at least
+ * call {@link android.app.Activity#setContentView setContentView()} to
+ * describe what is to be displayed in the screen.
+ */
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ // Be sure to call the super class.
+ super.onCreate(savedInstanceState);
+
+ // See assets/res/any/layout/secure_window_activity.xml for this
+ // view layout definition, which is being set here as
+ // the content of our screen.
+ setContentView(R.layout.secure_window_activity);
+
+ // Make the window secure. This must be done at the time the activity
+ // is created. It cannot be changed later.
+ getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
+ WindowManager.LayoutParams.FLAG_SECURE);
+ }
+}
diff --git a/samples/ApiDemos/src/com/example/android/apis/graphics/CubeRenderer.java b/samples/ApiDemos/src/com/example/android/apis/graphics/CubeRenderer.java
index ac0ae27e3..b30808c53 100644
--- a/samples/ApiDemos/src/com/example/android/apis/graphics/CubeRenderer.java
+++ b/samples/ApiDemos/src/com/example/android/apis/graphics/CubeRenderer.java
@@ -25,7 +25,7 @@ import android.opengl.GLSurfaceView;
* Render a pair of tumbling cubes.
*/
-class CubeRenderer implements GLSurfaceView.Renderer {
+public class CubeRenderer implements GLSurfaceView.Renderer {
public CubeRenderer(boolean useTranslucentBackground) {
mTranslucentBackground = useTranslucentBackground;
mCube = new Cube();