am 0d9ac4f2: Merge "Making StackWidget sample code stand alone as opposed to bundled with HoneycombGallery" into honeycomb
* commit '0d9ac4f209289982380bc91ffed010c184f9e0f4': 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"
|
||||
android:label="@string/camera_sample"
|
||||
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>
|
||||
</manifest>
|
||||
|
||||
@@ -9,8 +9,8 @@ Honeycomb, including:</p>
|
||||
<li>The new <a href="../../../reference/android/animation/package-summary.html"><code>android.animation</code></a>
|
||||
framework</li>
|
||||
<li>Custom notifications</li>
|
||||
<li><a href="../../../reference/android/widget/StackView.html"><code>StackView</code></a>
|
||||
and other adapter-based app widgets</li>
|
||||
<li>For information on how to implement <a href="../../../reference/android/widget/StackView.html"><code>StackView</code></a>
|
||||
and other adapter-based app widgets, see <a href="../StackWidget/index.html">StackView App Widget</a></li>
|
||||
</ul>
|
||||
|
||||
<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"?>
|
||||
<!--
|
||||
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");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
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
|
||||
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.
|
||||
-->
|
||||
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.
|
||||
-->
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
@@ -31,6 +30,6 @@
|
||||
android:background="@drawable/widget_item_background"
|
||||
android:textColor="#ffffff"
|
||||
android:textStyle="bold"
|
||||
android:text="@string/widget_empty_view_text"
|
||||
android:text="@string/empty_view_text"
|
||||
android:textSize="20sp" />
|
||||
</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");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -14,9 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.hcgallery.widget;
|
||||
|
||||
import com.example.android.hcgallery.R;
|
||||
package com.example.android.stackwidget;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.appwidget.AppWidgetManager;
|
||||
@@ -27,8 +25,9 @@ import android.net.Uri;
|
||||
import android.widget.RemoteViews;
|
||||
import android.widget.Toast;
|
||||
|
||||
public class WidgetProvider extends AppWidgetProvider {
|
||||
public static String TOAST_ACTION = "com.example.android.widget.action.TOAST";
|
||||
public class StackWidgetProvider extends AppWidgetProvider {
|
||||
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
|
||||
public void onDeleted(Context context, int[] appWidgetIds) {
|
||||
@@ -47,12 +46,11 @@ public class WidgetProvider extends AppWidgetProvider {
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
|
||||
AppWidgetManager mgr = AppWidgetManager.getInstance(context);
|
||||
if (intent.getAction().equals(TOAST_ACTION)) {
|
||||
int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_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();
|
||||
}
|
||||
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
|
||||
// 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]);
|
||||
// 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.
|
||||
@@ -81,10 +79,10 @@ public class WidgetProvider extends AppWidgetProvider {
|
||||
// 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
|
||||
// to create unique before on an item to item basis.
|
||||
Intent toastIntent = new Intent(context, WidgetProvider.class);
|
||||
toastIntent.setAction(WidgetProvider.TOAST_ACTION);
|
||||
Intent toastIntent = new Intent(context, StackWidgetProvider.class);
|
||||
toastIntent.setAction(StackWidgetProvider.TOAST_ACTION);
|
||||
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.FLAG_UPDATE_CURRENT);
|
||||
rv.setPendingIntentTemplate(R.id.stack_view, toastPendingIntent);
|
||||
@@ -93,4 +91,4 @@ public class WidgetProvider extends AppWidgetProvider {
|
||||
}
|
||||
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.
|
||||
*/
|
||||
|
||||
package com.example.android.hcgallery.widget;
|
||||
package com.example.android.stackwidget;
|
||||
|
||||
public class WidgetItem {
|
||||
public String text;
|
||||
Reference in New Issue
Block a user