am 37e86acb: am 0d9ac4f2: Merge "Making StackWidget sample code stand alone as opposed to bundled with HoneycombGallery" into honeycomb
* commit '37e86acbd516386770b87da036bd21003c6e84ee': Making StackWidget sample code stand alone as opposed to bundled with HoneycombGallery
This commit is contained in:
@@ -47,19 +47,5 @@
|
|||||||
<activity android:name=".CameraSample"
|
<activity android:name=".CameraSample"
|
||||||
android:label="@string/camera_sample"
|
android:label="@string/camera_sample"
|
||||||
android:screenOrientation="landscape" />
|
android:screenOrientation="landscape" />
|
||||||
|
|
||||||
<!-- StackView widget sample code -->
|
|
||||||
<receiver android:name=".widget.WidgetProvider"
|
|
||||||
android:label="@string/app_widget_name">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
|
||||||
</intent-filter>
|
|
||||||
<meta-data android:name="android.appwidget.provider"
|
|
||||||
android:resource="@xml/widget_info" />
|
|
||||||
</receiver>
|
|
||||||
<service android:name=".widget.WidgetService"
|
|
||||||
android:exported="true"
|
|
||||||
android:permission="android.permission.BIND_REMOTEVIEWS" />
|
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ Honeycomb, including:</p>
|
|||||||
<li>The new <a href="../../../reference/android/animation/package-summary.html"><code>android.animation</code></a>
|
<li>The new <a href="../../../reference/android/animation/package-summary.html"><code>android.animation</code></a>
|
||||||
framework</li>
|
framework</li>
|
||||||
<li>Custom notifications</li>
|
<li>Custom notifications</li>
|
||||||
<li><a href="../../../reference/android/widget/StackView.html"><code>StackView</code></a>
|
<li>For information on how to implement <a href="../../../reference/android/widget/StackView.html"><code>StackView</code></a>
|
||||||
and other adapter-based app widgets</li>
|
and other adapter-based app widgets, see <a href="../StackWidget/index.html">StackView App Widget</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>The image gallery shows how all these pieces can work together in one application.</p>
|
<p>The image gallery shows how all these pieces can work together in one application.</p>
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.5 KiB |
@@ -1,19 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
Copyright (C) 2011 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.
|
|
||||||
-->
|
|
||||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
|
|
||||||
<gradient android:startColor="#ff666666" android:endColor="#ff333333" android:angle="270" />
|
|
||||||
</shape>
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
Copyright (C) 2011 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.
|
|
||||||
-->
|
|
||||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:id="@+id/widget_item"
|
|
||||||
android:layout_width="120dp"
|
|
||||||
android:layout_height="120dp"
|
|
||||||
android:gravity="center"
|
|
||||||
android:background="@drawable/widget_item_background"
|
|
||||||
android:textColor="#ffffff"
|
|
||||||
android:textStyle="bold"
|
|
||||||
android:textSize="44sp" />
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
Copyright (C) 2011 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.
|
|
||||||
-->
|
|
||||||
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:minWidth="150dp"
|
|
||||||
android:minHeight="150dp"
|
|
||||||
android:updatePeriodMillis="3600000"
|
|
||||||
android:initialLayout="@layout/widget_layout"
|
|
||||||
android:previewImage="@drawable/widget_preview"
|
|
||||||
android:autoAdvanceViewId="@id/stack_view" />
|
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2007 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.hcgallery.widget;
|
|
||||||
|
|
||||||
import com.example.android.hcgallery.R;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import android.appwidget.AppWidgetManager;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.widget.RemoteViews;
|
|
||||||
import android.widget.RemoteViewsService;
|
|
||||||
|
|
||||||
public class WidgetService extends RemoteViewsService {
|
|
||||||
|
|
||||||
private class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
|
|
||||||
private static final int mCount = 10;
|
|
||||||
private List<WidgetItem> mWidgetItems = new ArrayList<WidgetItem>();
|
|
||||||
private Context mContext;
|
|
||||||
private int mAppWidgetId;
|
|
||||||
|
|
||||||
public StackRemoteViewsFactory(Context context, Intent intent) {
|
|
||||||
mContext = context;
|
|
||||||
mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
|
|
||||||
AppWidgetManager.INVALID_APPWIDGET_ID);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onCreate() {
|
|
||||||
// In onCreate() you setup any connections / cursors to your data source. Heavy lifting,
|
|
||||||
// for example downloading or creating content etc, should be deferred to getViewAt() or
|
|
||||||
// onDataSetChanged(). Taking more than 20 seconds in this call will result in an ANR.
|
|
||||||
for (int i = 0; i < mCount; i++) {
|
|
||||||
mWidgetItems.add(new WidgetItem(i + "!"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// We sleep for 3 seconds here to show how the empty view appears in the interim.
|
|
||||||
// The empty view is set in the WidgetProvider and should be a sibling of the
|
|
||||||
// collection view.
|
|
||||||
try {
|
|
||||||
Thread.sleep(3000);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onDestroy() {
|
|
||||||
// In onDestroy() you should tear down anything that was setup for your data source,
|
|
||||||
// eg. cursors, connections, etc.
|
|
||||||
mWidgetItems.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getCount() {
|
|
||||||
return mCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
public RemoteViews getViewAt(int position) {
|
|
||||||
// position will always range from 0 to getCount() - 1.
|
|
||||||
|
|
||||||
// We construct a remote views item based on our widget item xml file, and set the
|
|
||||||
// text based on the position.
|
|
||||||
RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_item);
|
|
||||||
rv.setTextViewText(R.id.widget_item, mWidgetItems.get(position).text);
|
|
||||||
|
|
||||||
// Next, we set an intent so that clicking on this view will result in a toast message
|
|
||||||
Bundle extras = new Bundle();
|
|
||||||
extras.putInt(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
|
|
||||||
extras.putInt("numberToToast", position);
|
|
||||||
Intent fillInIntent = new Intent();
|
|
||||||
fillInIntent.putExtras(extras);
|
|
||||||
rv.setOnClickFillInIntent(R.id.widget_item, fillInIntent);
|
|
||||||
|
|
||||||
// You can do heaving lifting in here, synchronously. For example, if you need to
|
|
||||||
// process an image, fetch something from the network, etc., it is ok to do it here,
|
|
||||||
// synchronously. A loading view will show up in lieu of the actual contents in the
|
|
||||||
// interim.
|
|
||||||
try {
|
|
||||||
Log.d("WidgetService/getViewAt", "Loading view " + position);
|
|
||||||
// Simulating a time-consuming operation. NO NEED to include this call in your app!
|
|
||||||
Thread.sleep(500);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return our remote views object.
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
public RemoteViews getLoadingView() {
|
|
||||||
// You can create a custom loading view (for instance when getViewAt() is slow. If you
|
|
||||||
// return null here, you will get the default loading view.
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getViewTypeCount() {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getItemId(int position) {
|
|
||||||
return position;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasStableIds() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onDataSetChanged() {
|
|
||||||
// This is triggered when you call AppWidgetManager notifyAppWidgetViewDataChanged
|
|
||||||
// on the collection view corresponding to this factory. You can do heaving lifting in
|
|
||||||
// here, synchronously. For example, if you need to process an image, fetch something
|
|
||||||
// from the network, etc., it is ok to do it here, synchronously. The widget will remain
|
|
||||||
// in its current state while work is being done here, so you don't need to worry about
|
|
||||||
// locking up the widget.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public RemoteViewsFactory onGetViewFactory(Intent intent) {
|
|
||||||
return new StackRemoteViewsFactory(this.getApplicationContext(), intent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
16
samples/StackWidget/Android.mk
Normal file
16
samples/StackWidget/Android.mk
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
LOCAL_PATH:= $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_MODULE_TAGS := tests
|
||||||
|
|
||||||
|
# Only compile source java files in this apk.
|
||||||
|
LOCAL_SRC_FILES := $(call all-java-files-under, src)
|
||||||
|
|
||||||
|
LOCAL_PACKAGE_NAME := StackWidget
|
||||||
|
|
||||||
|
LOCAL_SDK_VERSION := current
|
||||||
|
|
||||||
|
include $(BUILD_PACKAGE)
|
||||||
|
|
||||||
|
# Use the following include to make our test apk.
|
||||||
|
include $(call all-makefiles-under,$(LOCAL_PATH))
|
||||||
39
samples/StackWidget/AndroidManifest.xml
Normal file
39
samples/StackWidget/AndroidManifest.xml
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2011 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Declare the contents of this Android application. The namespace
|
||||||
|
attribute brings in the Android platform namespace, and the package
|
||||||
|
supplies a unique name for the application. When writing your
|
||||||
|
own application, the package name must be changed from "com.example.*"
|
||||||
|
to come from a domain that you own or have control over. -->
|
||||||
|
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="com.example.android.stackwidget">
|
||||||
|
<uses-sdk android:targetSdkVersion="11" android:minSdkVersion="11"/>
|
||||||
|
<application android:label="StackWidget">
|
||||||
|
<receiver android:name="StackWidgetProvider">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||||
|
</intent-filter>
|
||||||
|
<meta-data android:name="android.appwidget.provider"
|
||||||
|
android:resource="@xml/stackwidgetinfo" />
|
||||||
|
</receiver>
|
||||||
|
|
||||||
|
<service android:name="StackWidgetService"
|
||||||
|
android:permission="android.permission.BIND_REMOTEVIEWS"
|
||||||
|
android:exported="false" />
|
||||||
|
</application>
|
||||||
|
</manifest>
|
||||||
31
samples/StackWidget/_index.html
Normal file
31
samples/StackWidget/_index.html
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<p>
|
||||||
|
This sample shows how to construct a simple collection widget. This particular example shows how
|
||||||
|
to create a widget containing a <a href="../../../reference/android/widget/StackView.html"><code>StackView</code></a>
|
||||||
|
; however, only minimal changes are required to include
|
||||||
|
a <a href="../../../reference/android/widget/ListView.html"><code>ListView</code></a>,
|
||||||
|
<a href="../../../reference/android/widget/GridView.html"><code>GridView</code></a> or
|
||||||
|
<a href="../../../reference/android/widget/AdapterViewFlipper.html"><code>AdapterViewFlipper</code></a> instead.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The sample demonstrates the following:
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
The pattern for creating and wiring a <a href="../../../reference/android/widget/RemoteViewsService.html"><code>RemoteViewsService</code></a>
|
||||||
|
and <a href="../../../reference/android/widget/RemoteViewsService.RemoteViewsFactory.html"><code>RemoteViewsFactory</code></a> which
|
||||||
|
serve the function of an adapter for the widget collection.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
The pattern for setting an intent template and fill-in intents in order to
|
||||||
|
provide children of the collection with click behaviour.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
How to make a widget with a <a href="../../../reference/android/widget/StackView.html"><code>StackView</code></a>
|
||||||
|
(or <a href="../../../reference/android/widget/AdapterViewFlipper.html"><code>AdapterViewFlipper</code></a>) auto-advance.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
How to set a widget preview image.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<img alt="The widget."
|
||||||
|
src="../images/StackWidget.png"/>
|
||||||
BIN
samples/StackWidget/res/drawable-hdpi/icon.png
Normal file
BIN
samples/StackWidget/res/drawable-hdpi/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.0 KiB |
BIN
samples/StackWidget/res/drawable-ldpi/icon.png
Normal file
BIN
samples/StackWidget/res/drawable-ldpi/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
BIN
samples/StackWidget/res/drawable-mdpi/icon.png
Normal file
BIN
samples/StackWidget/res/drawable-mdpi/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.5 KiB |
BIN
samples/StackWidget/res/drawable-nodpi/preview.png
Normal file
BIN
samples/StackWidget/res/drawable-nodpi/preview.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.5 KiB |
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2011 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.
|
||||||
|
-->
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
|
||||||
|
<gradient android:startColor="#ff666666" android:endColor="#ff333333" android:angle="270" />
|
||||||
|
</shape>
|
||||||
24
samples/StackWidget/res/layout/widget_item.xml
Normal file
24
samples/StackWidget/res/layout/widget_item.xml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2011 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.
|
||||||
|
-->
|
||||||
|
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/widget_item"
|
||||||
|
android:layout_width="120dp"
|
||||||
|
android:layout_height="120dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:background="@drawable/widget_item_background"
|
||||||
|
android:textColor="#ffffff"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:textSize="44sp" />
|
||||||
@@ -1,19 +1,18 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--
|
<!-- Copyright (C) 2011 The Android Open Source Project
|
||||||
Copyright (C) 2011 The Android Open Source Project
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
See the License for the specific language governing permissions and
|
See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
-->
|
-->
|
||||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
@@ -31,6 +30,6 @@
|
|||||||
android:background="@drawable/widget_item_background"
|
android:background="@drawable/widget_item_background"
|
||||||
android:textColor="#ffffff"
|
android:textColor="#ffffff"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
android:text="@string/widget_empty_view_text"
|
android:text="@string/empty_view_text"
|
||||||
android:textSize="20sp" />
|
android:textSize="20sp" />
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
18
samples/StackWidget/res/values/strings.xml
Normal file
18
samples/StackWidget/res/values/strings.xml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2011 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.
|
||||||
|
-->
|
||||||
|
<resources>
|
||||||
|
<string name="empty_view_text">This is the empty view</string>
|
||||||
|
</resources>
|
||||||
24
samples/StackWidget/res/xml/stackwidgetinfo.xml
Normal file
24
samples/StackWidget/res/xml/stackwidgetinfo.xml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2011 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.
|
||||||
|
-->
|
||||||
|
<appwidget-provider
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:minWidth="150dip"
|
||||||
|
android:minHeight="150dip"
|
||||||
|
android:updatePeriodMillis="3600000"
|
||||||
|
android:previewImage="@drawable/preview"
|
||||||
|
android:initialLayout="@layout/widget_layout"
|
||||||
|
android:autoAdvanceViewId="@id/stack_view">
|
||||||
|
</appwidget-provider>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2007 The Android Open Source Project
|
* Copyright (C) 2011 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -14,9 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.example.android.hcgallery.widget;
|
package com.example.android.stackwidget;
|
||||||
|
|
||||||
import com.example.android.hcgallery.R;
|
|
||||||
|
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.appwidget.AppWidgetManager;
|
import android.appwidget.AppWidgetManager;
|
||||||
@@ -27,8 +25,9 @@ import android.net.Uri;
|
|||||||
import android.widget.RemoteViews;
|
import android.widget.RemoteViews;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
public class WidgetProvider extends AppWidgetProvider {
|
public class StackWidgetProvider extends AppWidgetProvider {
|
||||||
public static String TOAST_ACTION = "com.example.android.widget.action.TOAST";
|
public static final String TOAST_ACTION = "com.example.android.stackwidget.TOAST_ACTION";
|
||||||
|
public static final String EXTRA_ITEM = "com.example.android.stackwidget.EXTRA_ITEM";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDeleted(Context context, int[] appWidgetIds) {
|
public void onDeleted(Context context, int[] appWidgetIds) {
|
||||||
@@ -47,12 +46,11 @@ public class WidgetProvider extends AppWidgetProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
|
||||||
AppWidgetManager mgr = AppWidgetManager.getInstance(context);
|
AppWidgetManager mgr = AppWidgetManager.getInstance(context);
|
||||||
if (intent.getAction().equals(TOAST_ACTION)) {
|
if (intent.getAction().equals(TOAST_ACTION)) {
|
||||||
int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
|
int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
|
||||||
AppWidgetManager.INVALID_APPWIDGET_ID);
|
AppWidgetManager.INVALID_APPWIDGET_ID);
|
||||||
int viewIndex = intent.getIntExtra("numberToToast", 0);
|
int viewIndex = intent.getIntExtra(EXTRA_ITEM, 0);
|
||||||
Toast.makeText(context, "Touched view " + viewIndex, Toast.LENGTH_SHORT).show();
|
Toast.makeText(context, "Touched view " + viewIndex, Toast.LENGTH_SHORT).show();
|
||||||
}
|
}
|
||||||
super.onReceive(context, intent);
|
super.onReceive(context, intent);
|
||||||
@@ -65,7 +63,7 @@ public class WidgetProvider extends AppWidgetProvider {
|
|||||||
|
|
||||||
// Here we setup the intent which points to the StackViewService which will
|
// Here we setup the intent which points to the StackViewService which will
|
||||||
// provide the views for this collection.
|
// provide the views for this collection.
|
||||||
Intent intent = new Intent(context, WidgetService.class);
|
Intent intent = new Intent(context, StackWidgetService.class);
|
||||||
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
|
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
|
||||||
// When intents are compared, the extras are ignored, so we need to embed the extras
|
// When intents are compared, the extras are ignored, so we need to embed the extras
|
||||||
// into the data so that the extras will not be ignored.
|
// into the data so that the extras will not be ignored.
|
||||||
@@ -81,10 +79,10 @@ public class WidgetProvider extends AppWidgetProvider {
|
|||||||
// cannot setup their own pending intents, instead, the collection as a whole can
|
// cannot setup their own pending intents, instead, the collection as a whole can
|
||||||
// setup a pending intent template, and the individual items can set a fillInIntent
|
// setup a pending intent template, and the individual items can set a fillInIntent
|
||||||
// to create unique before on an item to item basis.
|
// to create unique before on an item to item basis.
|
||||||
Intent toastIntent = new Intent(context, WidgetProvider.class);
|
Intent toastIntent = new Intent(context, StackWidgetProvider.class);
|
||||||
toastIntent.setAction(WidgetProvider.TOAST_ACTION);
|
toastIntent.setAction(StackWidgetProvider.TOAST_ACTION);
|
||||||
toastIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
|
toastIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
|
||||||
toastIntent.setData(Uri.parse("widgetid" + appWidgetIds[i]));
|
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
|
||||||
PendingIntent toastPendingIntent = PendingIntent.getBroadcast(context, 0, toastIntent,
|
PendingIntent toastPendingIntent = PendingIntent.getBroadcast(context, 0, toastIntent,
|
||||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||||
rv.setPendingIntentTemplate(R.id.stack_view, toastPendingIntent);
|
rv.setPendingIntentTemplate(R.id.stack_view, toastPendingIntent);
|
||||||
@@ -93,4 +91,4 @@ public class WidgetProvider extends AppWidgetProvider {
|
|||||||
}
|
}
|
||||||
super.onUpdate(context, appWidgetManager, appWidgetIds);
|
super.onUpdate(context, appWidgetManager, appWidgetIds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2011 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.stackwidget;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import android.appwidget.AppWidgetManager;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.widget.RemoteViews;
|
||||||
|
import android.widget.RemoteViewsService;
|
||||||
|
|
||||||
|
public class StackWidgetService extends RemoteViewsService {
|
||||||
|
@Override
|
||||||
|
public RemoteViewsFactory onGetViewFactory(Intent intent) {
|
||||||
|
return new StackRemoteViewsFactory(this.getApplicationContext(), intent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
|
||||||
|
private static final int mCount = 10;
|
||||||
|
private List<WidgetItem> mWidgetItems = new ArrayList<WidgetItem>();
|
||||||
|
private Context mContext;
|
||||||
|
private int mAppWidgetId;
|
||||||
|
|
||||||
|
public StackRemoteViewsFactory(Context context, Intent intent) {
|
||||||
|
mContext = context;
|
||||||
|
mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
|
||||||
|
AppWidgetManager.INVALID_APPWIDGET_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onCreate() {
|
||||||
|
// In onCreate() you setup any connections / cursors to your data source. Heavy lifting,
|
||||||
|
// for example downloading or creating content etc, should be deferred to onDataSetChanged()
|
||||||
|
// or getViewAt(). Taking more than 20 seconds in this call will result in an ANR.
|
||||||
|
for (int i = 0; i < mCount; i++) {
|
||||||
|
mWidgetItems.add(new WidgetItem(i + "!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// We sleep for 3 seconds here to show how the empty view appears in the interim.
|
||||||
|
// The empty view is set in the StackWidgetProvider and should be a sibling of the
|
||||||
|
// collection view.
|
||||||
|
try {
|
||||||
|
Thread.sleep(3000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onDestroy() {
|
||||||
|
// In onDestroy() you should tear down anything that was setup for your data source,
|
||||||
|
// eg. cursors, connections, etc.
|
||||||
|
mWidgetItems.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCount() {
|
||||||
|
return mCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RemoteViews getViewAt(int position) {
|
||||||
|
// position will always range from 0 to getCount() - 1.
|
||||||
|
|
||||||
|
// We construct a remote views item based on our widget item xml file, and set the
|
||||||
|
// text based on the position.
|
||||||
|
RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_item);
|
||||||
|
rv.setTextViewText(R.id.widget_item, mWidgetItems.get(position).text);
|
||||||
|
|
||||||
|
// Next, we set a fill-intent which will be used to fill-in the pending intent template
|
||||||
|
// which is set on the collection view in StackWidgetProvider.
|
||||||
|
Bundle extras = new Bundle();
|
||||||
|
extras.putInt(StackWidgetProvider.EXTRA_ITEM, position);
|
||||||
|
Intent fillInIntent = new Intent();
|
||||||
|
fillInIntent.putExtras(extras);
|
||||||
|
rv.setOnClickFillInIntent(R.id.widget_item, fillInIntent);
|
||||||
|
|
||||||
|
// You can do heaving lifting in here, synchronously. For example, if you need to
|
||||||
|
// process an image, fetch something from the network, etc., it is ok to do it here,
|
||||||
|
// synchronously. A loading view will show up in lieu of the actual contents in the
|
||||||
|
// interim.
|
||||||
|
try {
|
||||||
|
System.out.println("Loading view " + position);
|
||||||
|
Thread.sleep(500);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the remote views object.
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RemoteViews getLoadingView() {
|
||||||
|
// You can create a custom loading view (for instance when getViewAt() is slow.) If you
|
||||||
|
// return null here, you will get the default loading view.
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getViewTypeCount() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getItemId(int position) {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasStableIds() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onDataSetChanged() {
|
||||||
|
// This is triggered when you call AppWidgetManager notifyAppWidgetViewDataChanged
|
||||||
|
// on the collection view corresponding to this factory. You can do heaving lifting in
|
||||||
|
// here, synchronously. For example, if you need to process an image, fetch something
|
||||||
|
// from the network, etc., it is ok to do it here, synchronously. The widget will remain
|
||||||
|
// in its current state while work is being done here, so you don't need to worry about
|
||||||
|
// locking up the widget.
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.example.android.hcgallery.widget;
|
package com.example.android.stackwidget;
|
||||||
|
|
||||||
public class WidgetItem {
|
public class WidgetItem {
|
||||||
public String text;
|
public String text;
|
||||||
Reference in New Issue
Block a user