package me.ccrama.redditslide.Widget; /** * Created by carlo_000 on 5/4/2016. */ import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.view.View; import android.widget.RemoteViews; import me.ccrama.redditslide.Activities.OpenContent; import me.ccrama.redditslide.Activities.SetupWidget; import me.ccrama.redditslide.Activities.SubredditView; import me.ccrama.redditslide.R; import me.ccrama.redditslide.Visuals.Palette; public class SubredditWidgetProvider extends AppWidgetProvider { public static final String UPDATE_MEETING_ACTION = "android.appwidget.action.APPWIDGET_UPDATE"; public static final String SUBMISSION = "SUBMISSION"; public static final String REFRESH = "REFRESH"; @Override public void onReceive(Context context, Intent intent) { AppWidgetManager mgr = AppWidgetManager.getInstance(context); if (intent.getAction().equals(UPDATE_MEETING_ACTION)) { int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0); mgr.notifyAppWidgetViewDataChanged(appWidgetId, R.id.list_view); int view = R.layout.widget; switch(getThemeFromId(appWidgetId, context)){ case 1: view = R.layout.widget_dark; break; case 2: view = R.layout.widget_light; break; } RemoteViews rv = new RemoteViews(context.getPackageName(), view); rv.setViewVisibility(R.id.loading, View.GONE); rv.setViewVisibility(R.id.refresh, View.VISIBLE); mgr.partiallyUpdateAppWidget(appWidgetId, rv); } else if (intent.getAction().contains(REFRESH)) { int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0); updateFromIdPartially(appWidgetId, context, mgr); } else if (intent.getAction().contains(SUBMISSION)) { int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0); Intent i = new Intent(context, SubredditView.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.putExtra(SubredditView.EXTRA_SUBREDDIT, getSubFromId(appWidgetId, context)); context.startActivity(i); } super.onReceive(context, intent); } public static String lastDone; public static String getSubFromId(int id, Context mContext) { String sub = mContext.getSharedPreferences("widget", 0).getString(id + "_sub", ""); if (sub.isEmpty() && lastDone != null) { return lastDone; } else { return sub; } } public static int getThemeFromId(int id, Context mContext) { return mContext.getSharedPreferences("widget", 0).getInt(id + "_sub_theme", 0); } public static int getViewType(int id, Context mContext) { return mContext.getSharedPreferences("widget", 0).getInt(id + "_sub_view", 0); } public static void setSubFromid(int id, String sub, Context mContext) { mContext.getSharedPreferences("widget", 0).edit().putString(id + "_sub", sub).apply(); } public static void setThemeToId(int id, int theme, Context mContext) { mContext.getSharedPreferences("widget", 0).edit().putInt(id + "_sub_theme", theme).apply(); } public static void setViewType(int id, int checked, SetupWidget mContext) { mContext.getSharedPreferences("widget", 0).edit().putInt(id + "_sub_view", checked).apply(); } public static void setSorting(int id, int sorting, SetupWidget mContext) { mContext.getSharedPreferences("widget", 0).edit().putInt(id + "_sub_sort", sorting).apply(); } public static int getSorting(int id, Context mContext) { return mContext.getSharedPreferences("widget", 0).getInt(id + "_sub_sort", 0); } public static void setSortingTime(int id, int sorting, SetupWidget mContext) { mContext.getSharedPreferences("widget", 0).edit().putInt(id + "_sub_time", sorting).apply(); } public static int getSortingTime(int id, Context mContext) { return mContext.getSharedPreferences("widget", 0).getInt(id + "_sub_time", 0); } public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // update each of the app widgets with the remote adapter for (int appWidgetId : appWidgetIds) { updateFromId(appWidgetId, context, appWidgetManager); } super.onUpdate(context, appWidgetManager, appWidgetIds); } public void updateFromId(int appWidgetId, Context context, AppWidgetManager appWidgetManager) { // Set up the intent that starts the ListViewService, which will // provide the views for this collection. Intent intent = new Intent(context, ListViewWidgetService.class); // Add the app widget ID to the intent extras. Uri data = Uri.withAppendedPath( Uri.parse("slide" + "://widget/id/") , String.valueOf(appWidgetId)); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); // Instantiate the RemoteViews object for the app widget layout. int view = R.layout.widget; switch(getThemeFromId(appWidgetId, context)){ case 1: view = R.layout.widget_dark; break; case 2: view = R.layout.widget_light; break; } RemoteViews rv = new RemoteViews(context.getPackageName(), view); // Set up the RemoteViews object to use a RemoteViews adapter. // This adapter connects // to a RemoteViewsService through the specified intent. // This is how you populate the data. rv.setRemoteAdapter(appWidgetId, R.id.list_view, intent); // Trigger listview item click String sub = getSubFromId(appWidgetId, context); Intent startActivityIntent = new Intent(context, SubredditView.class); startActivityIntent.putExtra(SubredditView.EXTRA_SUBREDDIT, sub); //todo go to sub { Intent refreshIntent = new Intent(context, SubredditWidgetProvider.class); refreshIntent.setData(data); refreshIntent.setAction(SUBMISSION); refreshIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); PendingIntent pendingRefresh = PendingIntent.getBroadcast(context, 0, refreshIntent, PendingIntent.FLAG_CANCEL_CURRENT); rv.setOnClickPendingIntent(R.id.open, pendingRefresh); } { Intent refreshIntent = new Intent(context, SubredditWidgetProvider.class); refreshIntent.setAction(REFRESH); refreshIntent.setData(data); refreshIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); PendingIntent pendingRefresh = PendingIntent.getBroadcast(context, 0, refreshIntent, PendingIntent.FLAG_CANCEL_CURRENT); rv.setOnClickPendingIntent(R.id.refresh, pendingRefresh); } // The empty view is displayed when the collection has no items. // It should be in the same layout used to instantiate the RemoteViews object above. rv.setEmptyView(R.id.list_view, R.id.empty_view); rv.setTextViewText(R.id.subreddit, sub); rv.setTextColor(R.id.subreddit, Palette.getColor(sub)); // // Do additional processing specific to this app widget... // final Intent activityIntent = new Intent(context, OpenContent.class); final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT); rv.setPendingIntentTemplate(R.id.list_view, pendingIntent); appWidgetManager.updateAppWidget(appWidgetId, rv); } public void updateFromIdPartially(int appWidgetId, Context context, AppWidgetManager appWidgetManager) { // Set up the intent that starts the ListViewService, which will // provide the views for this collection. Intent intent = new Intent(context, ListViewWidgetService.class); // Add the app widget ID to the intent extras. Uri data = Uri.withAppendedPath( Uri.parse("slide" + "://widget/id/") , String.valueOf(appWidgetId)+ System.currentTimeMillis()); intent.setData(data); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); // Instantiate the RemoteViews object for the app widget layout. int view = R.layout.widget; switch(getThemeFromId(appWidgetId, context)){ case 1: view = R.layout.widget_dark; break; case 2: view = R.layout.widget_light; break; } RemoteViews rv = new RemoteViews(context.getPackageName(), view); // Set up the RemoteViews object to use a RemoteViews adapter. // This adapter connects // to a RemoteViewsService through the specified intent. // This is how you populate the data. rv.setRemoteAdapter(appWidgetId, R.id.list_view, intent); rv.setViewVisibility(R.id.loading, View.VISIBLE); rv.setViewVisibility(R.id.refresh, View.GONE); // Trigger listview item click String sub = getSubFromId(appWidgetId, context); Intent startActivityIntent = new Intent(context, SubredditView.class); startActivityIntent.putExtra(SubredditView.EXTRA_SUBREDDIT, sub); //todo go to sub { Intent refreshIntent = new Intent(context, SubredditWidgetProvider.class); refreshIntent.setAction(SUBMISSION); refreshIntent.setData(data); refreshIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); PendingIntent pendingRefresh = PendingIntent.getBroadcast(context, 0, refreshIntent, PendingIntent.FLAG_CANCEL_CURRENT); rv.setOnClickPendingIntent(R.id.open, pendingRefresh); } { Intent refreshIntent = new Intent(context, SubredditWidgetProvider.class); refreshIntent.setAction(REFRESH); refreshIntent.setData(data); refreshIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); PendingIntent pendingRefresh = PendingIntent.getBroadcast(context, 0, refreshIntent, PendingIntent.FLAG_CANCEL_CURRENT); rv.setOnClickPendingIntent(R.id.refresh, pendingRefresh); } // The empty view is displayed when the collection has no items. // It should be in the same layout used to instantiate the RemoteViews object above. rv.setEmptyView(R.id.list_view, R.id.empty_view); rv.setTextViewText(R.id.subreddit, sub); rv.setTextColor(R.id.subreddit, Palette.getColor(sub)); // // Do additional processing specific to this app widget... // final Intent activityIntent = new Intent(context, OpenContent.class); final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT); rv.setPendingIntentTemplate(R.id.list_view, pendingIntent); appWidgetManager.updateAppWidget(appWidgetId, rv); } }