package me.ccrama.redditslide.Widget;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Html;
import android.view.View;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService;
import net.dean.jraw.models.Submission;
import net.dean.jraw.models.Thumbnails;
import net.dean.jraw.paginators.DomainPaginator;
import net.dean.jraw.paginators.Paginator;
import net.dean.jraw.paginators.Sorting;
import net.dean.jraw.paginators.SubredditPaginator;
import net.dean.jraw.paginators.TimePeriod;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import me.ccrama.redditslide.Activities.OpenContent;
import me.ccrama.redditslide.Authentication;
import me.ccrama.redditslide.Autocache.AutoCacheScheduler;
import me.ccrama.redditslide.Notifications.NotificationJobScheduler;
import me.ccrama.redditslide.PostMatch;
import me.ccrama.redditslide.R;
import me.ccrama.redditslide.Reddit;
import me.ccrama.redditslide.TimeUtils;
import me.ccrama.redditslide.Visuals.Palette;
import me.ccrama.redditslide.util.LogUtil;
import me.ccrama.redditslide.util.NetworkUtil;
/**
* Created by carlo_000 on 5/4/2016.
*/
public class ListViewWidgetService extends RemoteViewsService {
public RemoteViewsService.RemoteViewsFactory onGetViewFactory(Intent intent) {
return new ListViewRemoteViewsFactory(this.getApplicationContext(), intent, "android",
intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0));
}
}
class ListViewRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private Context mContext;
private ArrayList<Submission> records;
String subreddit;
int id;
public ListViewRemoteViewsFactory(Context context, Intent intent, String subreddit, int id) {
mContext = context;
this.subreddit = subreddit;
this.id = id;
}
// Initialize the data set.
public void onCreate() {
// In onCreate() you set up any connections / cursors to your data source. Heavy lifting,
// for example downloading or creating content etc, should be deferred to onDataSetChanged()
// or getViewAt(). Taking more than 20 seconds in this call will result in an ANR.
records = new ArrayList<>();
if (NetworkUtil.isConnected(mContext)) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
if (Authentication.reddit == null) {
new Authentication(mContext.getApplicationContext());
Authentication.me = Authentication.reddit.me();
Authentication.mod = Authentication.me.isMod();
Reddit.over18 = Authentication.me.isOver18();
Authentication.authentication.edit()
.putBoolean(Reddit.SHARED_PREF_IS_MOD, Authentication.mod)
.apply();
Authentication.authentication.edit()
.putBoolean(Reddit.SHARED_PREF_IS_OVER_18, Reddit.over18)
.apply();
if (Reddit.notificationTime != -1) {
Reddit.notifications = new NotificationJobScheduler(mContext);
Reddit.notifications.start(mContext.getApplicationContext());
}
if (Reddit.cachedData.contains("toCache")) {
Reddit.autoCache = new AutoCacheScheduler(mContext);
Reddit.autoCache.start(mContext.getApplicationContext());
}
final String name = Authentication.me.getFullName();
Authentication.name = name;
LogUtil.v("AUTHENTICATED");
if (Authentication.reddit.isAuthenticated()) {
final Set<String> accounts =
Authentication.authentication.getStringSet("accounts",
new HashSet<String>());
if (accounts.contains(name)) { //convert to new system
accounts.remove(name);
accounts.add(name + ":" + Authentication.refresh);
Authentication.authentication.edit()
.putStringSet("accounts", accounts)
.apply(); //force commit
}
Authentication.isLoggedIn = true;
Reddit.notFirst = true;
}
}
String sub = SubredditWidgetProvider.getSubFromId(id, mContext);
Paginator p;
if (sub.equals("frontpage")) {
p = new SubredditPaginator(Authentication.reddit);
} else if (!sub.contains(".")) {
p = new SubredditPaginator(Authentication.reddit, sub);
} else {
p = new DomainPaginator(Authentication.reddit, sub);
}
p.setLimit(50);
switch (SubredditWidgetProvider.getSorting(id, mContext)) {
case 0:
p.setSorting(Sorting.HOT);
break;
case 1:
p.setSorting(Sorting.NEW);
break;
case 2:
p.setSorting(Sorting.RISING);
break;
case 3:
p.setSorting(Sorting.TOP);
break;
case 4:
p.setSorting(Sorting.CONTROVERSIAL);
break;
}
switch (SubredditWidgetProvider.getSortingTime(id, mContext)) {
case 0:
p.setTimePeriod(TimePeriod.HOUR);
break;
case 1:
p.setTimePeriod(TimePeriod.DAY);
break;
case 2:
p.setTimePeriod(TimePeriod.WEEK);
break;
case 3:
p.setTimePeriod(TimePeriod.MONTH);
break;
case 4:
p.setTimePeriod(TimePeriod.YEAR);
break;
case 5:
p.setTimePeriod(TimePeriod.ALL);
break;
}
try {
ArrayList<Submission> s = new ArrayList<>(p.next());
records = new ArrayList<>();
for (Submission subm : s) {
if (!PostMatch.doesMatch(subm)) {
records.add(subm);
}
}
} catch (Exception e) {
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
Intent widgetUpdateIntent = new Intent(mContext, SubredditWidgetProvider.class);
widgetUpdateIntent.setAction(SubredditWidgetProvider.UPDATE_MEETING_ACTION);
widgetUpdateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id);
mContext.sendBroadcast(widgetUpdateIntent);
}
}.execute();
} else {
Intent widgetUpdateIntent = new Intent(mContext, SubredditWidgetProvider.class);
widgetUpdateIntent.setAction(SubredditWidgetProvider.UPDATE_MEETING_ACTION);
widgetUpdateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id);
mContext.sendBroadcast(widgetUpdateIntent);
}
}
// Given the position (index) of a WidgetItem in the array, use the item's text value in
// combination with the app widget item XML file to construct a RemoteViews object.
public RemoteViews getViewAt(int position) {
// position will always range from 0 to getCount() - 1.
// Construct a RemoteViews item based on the app widget item XML file, and set the
// text based on the position.
int view = R.layout.submission_widget_light;
switch (SubredditWidgetProvider.getViewType(id, mContext)) {
case 1:
case 0:
if (SubredditWidgetProvider.getThemeFromId(id, mContext) == 2) {
view = R.layout.submission_widget_light;
} else {
view = R.layout.submission_widget;
}
break;
case 2:
if (SubredditWidgetProvider.getThemeFromId(id, mContext) == 2) {
view = R.layout.submission_widget_compact_light;
} else {
view = R.layout.submission_widget_compact;
}
break;
}
final RemoteViews rv = new RemoteViews(mContext.getPackageName(), view);
try {
// feed row
Submission data = records.get(position);
rv.setTextViewText(R.id.title, Html.fromHtml(data.getTitle()));
rv.setTextViewText(R.id.score, data.getScore() + "");
rv.setTextViewText(R.id.comments, data.getCommentCount() + "");
rv.setTextViewText(R.id.information,
data.getAuthor() + " " + TimeUtils.getTimeAgo(data.getCreated().getTime(),
mContext));
rv.setTextViewText(R.id.subreddit, data.getSubredditName());
rv.setTextColor(R.id.subreddit, Palette.getColor(data.getSubredditName()));
if (SubredditWidgetProvider.getViewType(id, mContext) == 1) {
Thumbnails s = data.getThumbnails();
rv.setViewVisibility(R.id.thumbimage2, View.GONE);
if (s != null && s.getVariations() != null && s.getSource() != null) {
rv.setImageViewBitmap(R.id.bigpic,
((Reddit) mContext.getApplicationContext()).getImageLoader()
.loadImageSync(
Html.fromHtml(data.getThumbnails().getSource().getUrl())
.toString()));
rv.setViewVisibility(R.id.bigpic, View.VISIBLE);
} else {
rv.setViewVisibility(R.id.bigpic, View.GONE);
}
} else {
if (SubredditWidgetProvider.getViewType(id, mContext) != 2) {
rv.setViewVisibility(R.id.bigpic, View.GONE);
}
if (data.getThumbnailType() == Submission.ThumbnailType.URL) {
rv.setImageViewBitmap(R.id.thumbimage2,
((Reddit) mContext.getApplicationContext()).getImageLoader()
.loadImageSync(data.getThumbnail()));
rv.setViewVisibility(R.id.thumbimage2, View.VISIBLE);
} else {
rv.setViewVisibility(R.id.thumbimage2, View.GONE);
}
}
switch (SubredditWidgetProvider.getViewType(id, mContext)) {
case 1:
case 0:
if (SubredditWidgetProvider.getThemeFromId(id, mContext) == 2) {
} else {
rv.setTextColor(R.id.title, Color.WHITE);
rv.setTextColor(R.id.score, Color.WHITE);
rv.setTextColor(R.id.comments, Color.WHITE);
rv.setTextColor(R.id.information, Color.WHITE);
}
break;
case 2:
if (SubredditWidgetProvider.getThemeFromId(id, mContext) == 2) {
} else {
rv.setTextColor(R.id.title, Color.WHITE);
rv.setTextColor(R.id.score, Color.WHITE);
rv.setTextColor(R.id.comments, Color.WHITE);
rv.setTextColor(R.id.information, Color.WHITE);
}
break;
}
Bundle infos = new Bundle();
infos.putString(OpenContent.EXTRA_URL, data.getPermalink());
infos.putBoolean("popup", true);
final Intent activityIntent = new Intent();
activityIntent.putExtras(infos);
rv.setOnClickFillInIntent(R.id.card, activityIntent);
} catch (Exception e) {
}
return rv;
}
public int getCount() {
return records.size();
}
public void onDataSetChanged() {
// Fetching JSON data from server and add them to records arraylist
}
public int getViewTypeCount() {
return 1;
}
public long getItemId(int position) {
return position;
}
public void onDestroy() {
records.clear();
}
public boolean hasStableIds() {
return true;
}
public RemoteViews getLoadingView() {
return null;
}
}