| /* |
| * Copyright (C) 2015 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.android.messaging.widget; |
| |
| import android.app.PendingIntent; |
| import android.appwidget.AppWidgetManager; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.net.Uri; |
| import android.widget.RemoteViews; |
| |
| import com.android.messaging.R; |
| import com.android.messaging.ui.UIIntents; |
| import com.android.messaging.util.LogUtil; |
| import com.android.messaging.util.OsUtil; |
| import com.android.messaging.util.SafeAsyncTask; |
| import com.android.messaging.util.UiUtils; |
| |
| public class BugleWidgetProvider extends BaseWidgetProvider { |
| public static final String ACTION_NOTIFY_CONVERSATIONS_CHANGED = |
| "com.android.Bugle.intent.action.ACTION_NOTIFY_CONVERSATIONS_CHANGED"; |
| |
| public static final int WIDGET_NEW_CONVERSATION_REQUEST_CODE = 986; |
| |
| /** |
| * Update the widget appWidgetId |
| */ |
| @Override |
| protected void updateWidget(final Context context, final int appWidgetId) { |
| if (OsUtil.hasRequiredPermissions()) { |
| SafeAsyncTask.executeOnThreadPool(new Runnable() { |
| @Override |
| public void run() { |
| rebuildWidget(context, appWidgetId); |
| } |
| }); |
| } else { |
| AppWidgetManager.getInstance(context).updateAppWidget(appWidgetId, |
| UiUtils.getWidgetMissingPermissionView(context)); |
| } |
| } |
| |
| @Override |
| protected String getAction() { |
| return ACTION_NOTIFY_CONVERSATIONS_CHANGED; |
| } |
| |
| @Override |
| protected int getListId() { |
| return R.id.conversation_list; |
| } |
| |
| public static void rebuildWidget(final Context context, final int appWidgetId) { |
| if (LogUtil.isLoggable(TAG, LogUtil.VERBOSE)) { |
| LogUtil.v(TAG, "BugleWidgetProvider.rebuildWidget appWidgetId: " + appWidgetId); |
| } |
| final RemoteViews remoteViews = new RemoteViews(context.getPackageName(), |
| R.layout.widget_conversation_list); |
| PendingIntent clickIntent; |
| |
| // Launch an intent to avoid ANRs |
| final Intent intent = new Intent(context, WidgetConversationListService.class); |
| intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); |
| intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); |
| remoteViews.setRemoteAdapter(appWidgetId, R.id.conversation_list, intent); |
| |
| remoteViews.setTextViewText(R.id.widget_label, context.getString(R.string.app_name)); |
| |
| // Open Bugle's app conversation list when click on header |
| clickIntent = UIIntents.get().getWidgetPendingIntentForConversationListActivity(context); |
| remoteViews.setOnClickPendingIntent(R.id.widget_header, clickIntent); |
| |
| // On click intent for Compose |
| clickIntent = UIIntents.get().getWidgetPendingIntentForConversationActivity(context, |
| null /*conversationId*/, WIDGET_NEW_CONVERSATION_REQUEST_CODE); |
| remoteViews.setOnClickPendingIntent(R.id.widget_compose, clickIntent); |
| |
| // On click intent for Conversation |
| // Note: the template intent has to be a "naked" intent without any extras. It turns out |
| // that if the template intent does have extras, those particular extras won't get |
| // replaced by the fill-in intent on each list item. |
| clickIntent = UIIntents.get().getWidgetPendingIntentForConversationActivity(context, |
| null /*conversationId*/, WIDGET_CONVERSATION_REQUEST_CODE); |
| remoteViews.setPendingIntentTemplate(R.id.conversation_list, clickIntent); |
| |
| AppWidgetManager.getInstance(context).updateAppWidget(appWidgetId, remoteViews); |
| } |
| |
| /* |
| * notifyDatasetChanged call when the conversation list changes so the Bugle widget will |
| * update and reflect the changes |
| */ |
| public static void notifyConversationListChanged(final Context context) { |
| if (LogUtil.isLoggable(TAG, LogUtil.VERBOSE)) { |
| LogUtil.v(TAG, "notifyConversationListChanged"); |
| } |
| final Intent intent = new Intent(ACTION_NOTIFY_CONVERSATIONS_CHANGED); |
| context.sendBroadcast(intent); |
| } |
| } |