Add new sample for Presentation API.

Change-Id: Ia31deb9ca6ad9a4db1dd6f852c00fa9a94caa4c3
This commit is contained in:
Jeff Brown
2012-08-31 07:12:42 -07:00
parent 341b0892b7
commit 2e1fe78fbf
5 changed files with 378 additions and 0 deletions

View File

@@ -254,6 +254,14 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name=".app.PresentationActivity"
android:label="@string/activity_presentation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.SAMPLE_CODE" />
</intent-filter>
</activity>
<!-- Fragment Samples --> <!-- Fragment Samples -->
<activity android:name=".app.FragmentAlertDialog" <activity android:name=".app.FragmentAlertDialog"

View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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.
-->
<!-- Demonstrates an activity that shows content on secondary displays using
the android.app.Presentation class.
See corresponding Java code PresentationActivity.java. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- Message to show to use. -->
<TextView android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:gravity="center_vertical|center_horizontal"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/presentation_activity_text"/>
<!-- List that will show information about all connected displays. -->
<ListView android:id="@+id/display_list"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" />
</LinearLayout>

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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.
-->
<!-- The content that we show on secondary displays.
See corresponding Java code PresentationActivity.java. -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- A picture for visual interest. -->
<ImageView android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- A caption. -->
<TextView android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical|center_horizontal"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</FrameLayout>

View File

@@ -112,6 +112,10 @@
<string name="redirect_getter">Enter the text that will be used by the main activity. Press back to cancel.</string> <string name="redirect_getter">Enter the text that will be used by the main activity. Press back to cancel.</string>
<string name="apply">Apply</string> <string name="apply">Apply</string>
<string name="activity_presentation">App/Activity/Presentation</string>
<string name="presentation_activity_text">This activity demonstrates how to use the Presentation activity to show content on other Displays. Try connecting a secondary display and watch what happens.</string>
<string name="presentation_channel_text">You\'re watching channel %1$d on display %2$d.</string>
<string name="fragment_alert_dialog">App/Fragment/Alert Dialog</string> <string name="fragment_alert_dialog">App/Fragment/Alert Dialog</string>
<string name="fragment_arguments">App/Fragment/Arguments</string> <string name="fragment_arguments">App/Fragment/Arguments</string>

View File

@@ -0,0 +1,289 @@
/*
* 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;
// Need the following import to get access to the app resources, since this
// class is in a sub-package.
import com.example.android.apis.R;
import android.app.Activity;
import android.app.Presentation;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.hardware.display.DisplayManager;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseArray;
import android.view.Display;
import android.view.View;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
/**
* <h3>Presentation Activity</h3>
*
* <p>
* This demonstrates how to create an activity that shows some content
* on a secondary display using a {@link Presentation}.
* </p><p>
* The activity automatically creates and displays a {@link Presentation} whenever
* a new non-default display is detected. You can try this out by using
* the "Simulate secondary displays" feature in Development Settings to create
* a few simulated secondary displays.
* </p>
*/
public class PresentationActivity extends Activity {
private final String TAG = "PresentationActivity";
// The content that we want to show on the presentation.
private static final int[] CHANNELS = new int[] {
R.drawable.photo1, R.drawable.photo2, R.drawable.photo3,
R.drawable.photo4, R.drawable.photo5, R.drawable.photo6,
};
private DisplayManager mDisplayManager;
private ListView mDisplayList;
private DisplayListAdapter mDisplayListAdapter;
private int mNextChannelNumber;
// All active presentations indexed by display id.
private final SparseArray<DemoPresentation> mActivePresentations =
new SparseArray<DemoPresentation>();
/**
* 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);
// Get the display manager service.
mDisplayManager = (DisplayManager)getSystemService(Context.DISPLAY_SERVICE);
// See assets/res/any/layout/presentation_activity.xml for this
// view layout definition, which is being set here as
// the content of our screen.
setContentView(R.layout.presentation_activity);
mDisplayListAdapter = new DisplayListAdapter(this);
mDisplayList = (ListView)findViewById(R.id.display_list);
mDisplayList.setAdapter(mDisplayListAdapter);
mDisplayList.setOnItemClickListener(mOnItemClickListener);
}
@Override
protected void onResume() {
// Be sure to call the super class.
super.onResume();
// Update our list of displays on resume.
mDisplayListAdapter.updateContents();
// Register to receive events from the display manager.
mDisplayManager.registerDisplayListener(mDisplayListener, null);
}
@Override
protected void onPause() {
// Be sure to call the super class.
super.onPause();
// Unregister from the display manager.
mDisplayManager.unregisterDisplayListener(mDisplayListener);
// Dismiss all of our presentations.
Log.d(TAG, "Activity is being paused. Dimissing all active presentation.");
for (int i = 0; i < mActivePresentations.size(); i++) {
Presentation presentation = mActivePresentations.valueAt(i);
presentation.dismiss();
}
mActivePresentations.clear();
}
/**
* Shows a {@link Presentation} on the specified display.
*/
private void showPresentation(Display display) {
// Do nothing if there is already a presentation showing on the display.
if (mActivePresentations.get(display.getDisplayId()) != null) {
return;
}
Log.d(TAG, "Showing presentation on display " + display.getDisplayId() + ".");
int channelNumber = mNextChannelNumber;
mNextChannelNumber = (mNextChannelNumber + 1) % CHANNELS.length;
final DemoPresentation presentation = new DemoPresentation(this, display, channelNumber);
mActivePresentations.put(display.getDisplayId(), presentation);
presentation.show();
presentation.setOnDismissListener(mOnDismissListener);
}
/**
* Shows a {@link Presentation} on the specified display, or dismisses it if one
* already showing there.
*/
private void showOrDismissPresentation(Display display) {
// Dismiss if already showing.
DemoPresentation presentation = mActivePresentations.get(display.getDisplayId());
if (presentation != null) {
Log.d(TAG, "Dimissing presentation on display " + display.getDisplayId() + ".");
presentation.dismiss();
return;
}
// Otherwise show the presentation.
showPresentation(display);
}
/**
* Listens for displays to be added, changed or removed.
* We use it to update the list and show a new {@link Presentation} when a
* display is connected.
*
* Note that we don't bother dismissing the {@link Presentation} when a
* display is removed, although we could. The presentation API takes care
* of doing that automatically for us.
*/
private final DisplayManager.DisplayListener mDisplayListener =
new DisplayManager.DisplayListener() {
@Override
public void onDisplayAdded(int displayId) {
Log.d(TAG, "Display " + displayId + " added.");
mDisplayListAdapter.updateContents();
Display display = mDisplayManager.getDisplay(displayId);
if (display != null) {
showPresentation(display);
}
}
@Override
public void onDisplayChanged(int displayId) {
Log.d(TAG, "Display " + displayId + " changed.");
mDisplayListAdapter.updateContents();
}
@Override
public void onDisplayRemoved(int displayId) {
Log.d(TAG, "Display " + displayId + " removed.");
mDisplayListAdapter.updateContents();
}
};
/**
* Listens for when presentations are dismissed.
*/
private final DialogInterface.OnDismissListener mOnDismissListener =
new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
DemoPresentation presentation = (DemoPresentation)dialog;
Display display = presentation.getDisplay();
Log.d(TAG, "Presentation on display " + display.getDisplayId() + " was dismissed.");
mActivePresentations.remove(display.getDisplayId());
}
};
/**
* List adapter.
* Shows information about all displays.
*/
private final class DisplayListAdapter extends ArrayAdapter<Display> {
public DisplayListAdapter(Context context) {
super(context, android.R.layout.simple_list_item_1);
}
/**
* Update the contents of the display list adapter to show
* information about all current displays.
*/
public void updateContents() {
clear();
Display[] displays = mDisplayManager.getDisplays();
addAll(displays);
Log.d(TAG, "There are currently " + displays.length + " displays connected.");
for (Display display : displays) {
Log.d(TAG, " " + display);
}
}
}
/**
* Called when an item in the display list is clicked.
*
* Causes a presentation to be shown or dismissed on that display if already showing.
*/
private final OnItemClickListener mOnItemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Display display = (Display)parent.getItemAtPosition(position);
showOrDismissPresentation(display);
}
};
/**
* The presentation to show on the secondary display.
*
* Note that this display may have different metrics from the display on which
* the main activity is showing so we must be careful to use the presentation's
* own {@link Context} whenever we load resources.
*/
private final class DemoPresentation extends Presentation {
// Specifies the content that we want to show in this presentation.
private final int mChannelNumber;
public DemoPresentation(Context context, Display display, int channelNumber) {
super(context, display);
mChannelNumber = channelNumber;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// Be sure to call the super class.
super.onCreate(savedInstanceState);
// Get the resources for the context of the presentation.
// Notice that we are getting the resources from the context of the presentation.
Resources r = getContext().getResources();
// Inflate the layout.
setContentView(R.layout.presentation_content);
// Show a text message to describe what's going on.
TextView text = (TextView)findViewById(R.id.text);
text.setText(r.getString(R.string.presentation_channel_text, mChannelNumber + 1,
getDisplay().getDisplayId()));
// Show a n image for visual interest.
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(r.getDrawable(CHANNELS[mChannelNumber]));
}
}
}