package org.wikipedia.widgets; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.text.Spanned; import android.text.TextUtils; import android.text.style.URLSpan; import android.util.Log; import android.widget.RemoteViews; import org.wikipedia.Constants; import org.wikipedia.R; import org.wikipedia.WikipediaApp; import org.wikipedia.dataclient.page.PageClient; import org.wikipedia.dataclient.page.PageClientFactory; import org.wikipedia.dataclient.page.PageLead; import org.wikipedia.page.PageActivity; import org.wikipedia.page.PageTitle; import org.wikipedia.staticdata.MainPageNameData; import org.wikipedia.util.DimenUtil; import org.wikipedia.util.StringUtil; import org.wikipedia.util.log.L; import retrofit2.Call; import retrofit2.Response; import static org.wikipedia.util.UriUtil.decodeURL; public class WidgetProviderFeaturedPage extends AppWidgetProvider { private static final String TAG = "WidgetFeatured"; @Override public void onUpdate(final Context context, final AppWidgetManager appWidgetManager, int[] appWidgetIds) { ComponentName thisWidget = new ComponentName(context, WidgetProviderFeaturedPage.class); final int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); getMainPageLead(new Callback() { @Override public void onFeaturedArticleReceived(final String titleText) { for (final int widgetId : allWidgetIds) { Log.d(TAG, "updating widget..."); final RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_featured_page); if (!TextUtils.isEmpty(titleText)) { remoteViews.setTextViewText(R.id.widget_content_text, titleText); } appWidgetManager.updateAppWidget(widgetId, remoteViews); // Create a PendingIntent to act as the onClickListener Intent intent = new Intent(context, PageActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(Constants.INTENT_FEATURED_ARTICLE_FROM_WIDGET, true); PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT); // If we want to update the widget itself from the click event, then do something like this: //Intent intent = new Intent(context, WidgetProviderFeaturedPage.class); //intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); //intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); //PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.widget_container, pendingIntent); appWidgetManager.updateAppWidget(widgetId, remoteViews); } } }); } private void getMainPageLead(final Callback cb) { WikipediaApp app = WikipediaApp.getInstance(); final PageTitle title = new PageTitle( MainPageNameData.valueFor(app.getAppOrSystemLanguageCode()), app.getWikiSite()); getApiService(title) .lead(null, PageClient.CacheOption.CACHE, title.getPrefixedText(), DimenUtil.calculateLeadImageWidth(), !app.isImageDownloadEnabled()) .enqueue(new retrofit2.Callback<PageLead>() { @Override public void onResponse(Call<PageLead> call, Response<PageLead> rsp) { PageLead lead = rsp.body(); if (lead.hasError()) { lead.logError("Error while updating widget"); return; } L.d("Downloaded page " + title.getDisplayText()); String titleText = findFeaturedArticleTitle(lead.getLeadSectionContent()); cb.onFeaturedArticleReceived(titleText); } @Override public void onFailure(Call<PageLead> call, Throwable t) { L.e(t); } }); } private String findFeaturedArticleTitle(String pageLeadContent) { // Extract the actual link to the featured page in a hacky way (until we // have the correct API for it): // Parse the HTML, and look for the first link, which should be the // article of the day. Spanned text = StringUtil.fromHtml(pageLeadContent); URLSpan[] spans = text.getSpans(0, text.length(), URLSpan.class); String titleText = ""; for (URLSpan span : spans) { if (!span.getURL().startsWith("/wiki/") || (text.getSpanEnd(span) - text.getSpanStart(span) <= 1)) { continue; } PageTitle title = WikipediaApp.getInstance().getWikiSite() .titleForInternalLink(decodeURL(span.getURL())); if (!title.isFilePage() && !title.isSpecial()) { titleText = title.getDisplayText(); break; } } return titleText; } private PageClient getApiService(PageTitle title) { return PageClientFactory.create(title.getWikiSite(), title.namespace()); } private interface Callback { void onFeaturedArticleReceived(String titleText); } }