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