151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook/* 2bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Copyright (C) 2010 The Android Open Source Project 351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * 451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * Licensed under the Apache License, Version 2.0 (the "License"); 551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * you may not use this file except in compliance with the License. 651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * You may obtain a copy of the License at 751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * 851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * http://www.apache.org/licenses/LICENSE-2.0 951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * 1051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * Unless required by applicable law or agreed to in writing, software 1151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * distributed under the License is distributed on an "AS IS" BASIS, 1251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * See the License for the specific language governing permissions and 1451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook * limitations under the License. 1551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook */ 1651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 1751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookpackage com.android.email.provider; 1851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 19bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.app.Service; 2051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookimport android.appwidget.AppWidgetManager; 21bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.appwidget.AppWidgetProvider; 22bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.content.ComponentName; 2351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookimport android.content.Context; 2451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrookimport android.content.Intent; 25bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.util.Log; 26bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.widget.RemoteViewsService; 2751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 28bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.email.Email; 29bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.email.R; 30bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.email.widget.EmailWidget; 31bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.email.widget.WidgetManager; 32bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.emailcommon.Logging; 3351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 34bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.FileDescriptor; 35bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.PrintWriter; 3651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 37bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookpublic class WidgetProvider extends AppWidgetProvider { 3851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook @Override 39bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onEnabled(final Context context) { 40bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) { 41bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Log.d(EmailWidget.TAG, "onEnabled"); 4251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 43bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook super.onEnabled(context); 4451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 4551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 4651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook @Override 47bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onDisabled(Context context) { 48bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) { 49bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Log.d(EmailWidget.TAG, "onDisabled"); 50bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 51bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook context.stopService(new Intent(context, WidgetService.class)); 52bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook super.onDisabled(context); 5351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 5451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 5551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook @Override 56bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 57bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) { 58bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Log.d(EmailWidget.TAG, "onUpdate"); 5951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 60bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook super.onUpdate(context, appWidgetManager, appWidgetIds); 61bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook WidgetManager.getInstance().updateWidgets(context, appWidgetIds); 6251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 6351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 6421959b3f297fe96c33b22b623a6c426e95d7effcPaul Westbrook @Override 65bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onDeleted(Context context, int[] appWidgetIds) { 66bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) { 67bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Log.d(EmailWidget.TAG, "onDeleted"); 6851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 69bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook WidgetManager.getInstance().deleteWidgets(context, appWidgetIds); 70bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook super.onDeleted(context, appWidgetIds); 7151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 7251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 73bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 74bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onReceive(final Context context, Intent intent) { 75bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) { 76bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Log.d(EmailWidget.TAG, "onReceive"); 7751693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 78bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook super.onReceive(context, intent); 7951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 80bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (EmailProvider.ACTION_NOTIFY_MESSAGE_LIST_DATASET_CHANGED.equals(intent.getAction())) { 81bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // Retrieve the list of current widgets. 82bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 83bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook final ComponentName component = new ComponentName(context, WidgetProvider.class); 84bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook final int[] widgetIds = appWidgetManager.getAppWidgetIds(component); 8551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 86bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // Ideally, this would only call notify AppWidgetViewDataChanged for the widgets, where 87bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // the account had the change, but the current intent doesn't include this information. 8851693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 89bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // Calling notifyAppWidgetViewDataChanged will cause onDataSetChanged() to be called 90bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // on the RemoteViewsService.RemoteViewsFactory, starting the service if necessary. 91bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook appWidgetManager.notifyAppWidgetViewDataChanged(widgetIds, R.id.message_list); 9251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 9351693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 9451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 9551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook /** 96bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * We use the WidgetService for two purposes: 97bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * 1) To provide a widget factory for RemoteViews, and 98bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * 2) Catch our command Uri's (i.e. take actions on user clicks) and let EmailWidget 99bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * handle them. 10051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook */ 101bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public static class WidgetService extends RemoteViewsService { 10251693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook @Override 103bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public RemoteViewsFactory onGetViewFactory(Intent intent) { 104bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // Which widget do we want (nice alliteration, huh?) 105bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook int widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); 106bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (widgetId == -1) return null; 107bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // Find the existing widget or create it 108bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return WidgetManager.getInstance().getOrCreateWidget(this, widgetId); 10951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 11051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 11151693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook @Override 112bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public int onStartCommand(Intent intent, int flags, int startId) { 113bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return Service.START_NOT_STICKY; 11451693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 11551693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook 11651693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook @Override 117bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) { 118bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook WidgetManager.getInstance().dump(fd, writer, args); 11951693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 12051693c5a4ca3553f0a02a91fe1805fb895380e3ePaul Westbrook } 121bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 122