| /* |
| * 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. |
| } |
| } |