package com.dwdesign.tweetings.appwidget.provider;
import static com.dwdesign.tweetings.util.Utils.parseInt;
import com.dwdesign.tweetings.activity.LinkHandlerActivity;
import com.dwdesign.tweetings.appwidget.Constants;
import com.dwdesign.tweetings.appwidget.ExtensionApplication;
import com.dwdesign.tweetings.R;
import com.dwdesign.tweetings.appwidget.service.ListWidgetHomeTimelineService;
import com.dwdesign.tweetings.appwidget.service.ListWidgetMentionsService;
import com.dwdesign.tweetings.util.ServiceInterface;
import com.dwdesign.tweetings.appwidget.util.SetRemoteAdapterAccessor;
import com.dwdesign.tweetings.app.TweetingsApplication;
import android.annotation.TargetApi;
import android.app.AlarmManager;
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.content.SharedPreferences;
import android.net.Uri;
import android.os.Build;
import android.os.SystemClock;
import android.view.View;
import android.widget.RemoteViews;
@TargetApi(11)
public class ListWidgetProvider extends AppWidgetProvider implements Constants {
public static final String BROADCAST_REFRESH_ALL = "com.dwdesign.tweetings.appwidget.REFRESH_ALL";
protected PendingIntent refresh_intent;
@Override
public void onDeleted(final Context context, final int[] appWidgetIds) {
final SharedPreferences.Editor editor = context.getSharedPreferences(WIDGETS_PREFERENCES_NAME,
Context.MODE_PRIVATE).edit();
for (final int id : appWidgetIds) {
editor.remove(String.valueOf(id));
}
editor.apply();
final SharedPreferences preferencesShared = context.getSharedPreferences(com.dwdesign.tweetings.Constants.SHARED_PREFERENCES_NAME,
Context.MODE_PRIVATE);
if (preferencesShared.getBoolean(com.dwdesign.tweetings.Constants.PREFERENCE_KEY_WIDGET_AUTO_REFRESH, false)) {
final AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
m.cancel(refresh_intent);
}
super.onDeleted(context, appWidgetIds);
}
@TargetApi(11)
@Override
public void onReceive(final Context context, final Intent intent) {
final SharedPreferences preferences = context.getSharedPreferences(WIDGETS_PREFERENCES_NAME,
Context.MODE_PRIVATE);
final String action = intent.getAction();
final AppWidgetManager manager = AppWidgetManager.getInstance(context);
final int[] ids = manager.getAppWidgetIds(new ComponentName(context, getClass()));
if (com.dwdesign.tweetings.Constants.BROADCAST_HOME_TIMELINE_DATABASE_UPDATED.equals(action)
|| com.dwdesign.tweetings.Constants.BROADCAST_MENTIONS_DATABASE_UPDATED.equals(action)) {
for (final int id : ids) {
final int list_widget_type = preferences.getInt(String.valueOf(id), WIDGET_TYPE_HOME_TIMELINE);
switch (list_widget_type) {
case WIDGET_TYPE_MENTIONS:
if (com.dwdesign.tweetings.Constants.BROADCAST_MENTIONS_DATABASE_UPDATED.equals(action)) {
manager.notifyAppWidgetViewDataChanged(id, R.id.list_view);
}
break;
case WIDGET_TYPE_HOME_TIMELINE:
if (com.dwdesign.tweetings.Constants.BROADCAST_HOME_TIMELINE_DATABASE_UPDATED.equals(action)) {
manager.notifyAppWidgetViewDataChanged(id, R.id.list_view);
}
break;
}
}
} else if (com.dwdesign.tweetings.Constants.BROADCAST_ACCOUNT_LIST_DATABASE_UPDATED.equals(action)) {
manager.notifyAppWidgetViewDataChanged(ids, R.id.list_view);
} else if (com.dwdesign.tweetings.Constants.BROADCAST_REFRESHSTATE_CHANGED.equals(action)) {
onUpdate(context, manager, ids);
} else if (com.dwdesign.tweetings.Constants.BROADCAST_WIDGET_CHANGED.equals(action)) {
onUpdate(context, manager, ids);
} else if (BROADCAST_REFRESH_ALL.equals(action)) {
final ServiceInterface service = ((TweetingsApplication) context.getApplicationContext())
.getServiceInterface();
new Thread() {
@Override
public void run() {
service.waitForService();
service.refreshAll();
}
}.start();
}
super.onReceive(context, intent);
}
@SuppressWarnings("deprecation")
@Override
public void onUpdate(final Context context, final AppWidgetManager manager, final int[] ids) {
final SharedPreferences preferences = context.getSharedPreferences(WIDGETS_PREFERENCES_NAME,
Context.MODE_PRIVATE);
final SharedPreferences preferencesShared = context.getSharedPreferences(com.dwdesign.tweetings.Constants.SHARED_PREFERENCES_NAME,
Context.MODE_PRIVATE);
//final ServiceInterface service = ((TweetingsApplication) context.getApplicationContext()).getServiceInterface();
final ServiceInterface service = TweetingsApplication.getInstance(context).getServiceInterface();
service.waitForService();
final boolean is_mentions_refreshing = service.isMentionsRefreshing();
final boolean is_home_timeline_refreshing = service.isHomeTimelineRefreshing();
for (final int id : ids) {
final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.list_widget);
if (preferencesShared.getString(com.dwdesign.tweetings.Constants.PREFERENCE_KEY_WIDGET_BACKGROUND, null) != null) {
views.setInt(R.id.widget_container, "setBackgroundResource", R.drawable.stack_item_background);
}
else {
views.setInt(R.id.widget_container, "setBackgroundResource", R.drawable.stack_item_background_black);
}
final PendingIntent compose_intent = PendingIntent.getActivity(context, 0, new Intent(
com.dwdesign.tweetings.Constants.INTENT_ACTION_COMPOSE), 0);
final PendingIntent home_intent = PendingIntent.getActivity(context, 0, new Intent(
com.dwdesign.tweetings.Constants.INTENT_ACTION_HOME), Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
if (refresh_intent == null) {
refresh_intent = PendingIntent.getBroadcast(context, 0, new Intent(
BROADCAST_REFRESH_ALL), 0);
}
views.setOnClickPendingIntent(R.id.compose, compose_intent);
views.setOnClickPendingIntent(R.id.refresh, refresh_intent);
views.setOnClickPendingIntent(R.id.top_bar, home_intent);
final Intent adapter_intent;
final int widget_type = preferences.getInt(String.valueOf(id), WIDGET_TYPE_HOME_TIMELINE);
switch (widget_type) {
case WIDGET_TYPE_MENTIONS:
views.setViewVisibility(R.id.refresh_progress, is_mentions_refreshing ? View.VISIBLE : View.GONE);
views.setViewVisibility(R.id.refresh, !is_mentions_refreshing ? View.VISIBLE : View.GONE);
views.setInt(R.id.title, "setText", R.string.mentions);
adapter_intent = new Intent(context, ListWidgetMentionsService.class);
break;
default:
views.setViewVisibility(R.id.refresh_progress, is_home_timeline_refreshing ? View.VISIBLE
: View.GONE);
views.setViewVisibility(R.id.refresh, !is_home_timeline_refreshing ? View.VISIBLE : View.GONE);
views.setInt(R.id.title, "setText", R.string.home_timeline);
adapter_intent = new Intent(context, ListWidgetHomeTimelineService.class);
break;
}
/*final Uri.Builder uri_builder = new Uri.Builder();
uri_builder.scheme(com.dwdesign.tweetings.Constants.SCHEME_TWEETINGS);
uri_builder.authority(com.dwdesign.tweetings.Constants.AUTHORITY_STATUS);
final Intent intent = new Intent(Intent.ACTION_VIEW, uri_builder.build());
final PendingIntent pending_intent = PendingIntent.getActivity(context, 0, intent,
Intent.FLAG_ACTIVITY_NEW_TASK);*/
final Intent intent = new Intent(context, LinkHandlerActivity.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id);
final PendingIntent pending_intent = PendingIntent.getActivity(context, 0, intent,
Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
views.setPendingIntentTemplate(R.id.list_view, pending_intent);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
SetRemoteAdapterAccessor.setRemoteAdapter(views, R.id.list_view, adapter_intent);
} else {
views.setRemoteAdapter(id, R.id.list_view, adapter_intent);
}
manager.updateAppWidget(id, views);
if (preferencesShared.getBoolean(com.dwdesign.tweetings.Constants.PREFERENCE_KEY_WIDGET_AUTO_REFRESH, false)) {
long interval = 1000*60;
interval = parseInt(preferencesShared.getString(com.dwdesign.tweetings.Constants.PREFERENCE_KEY_WIDGET_REFRESH_INTERVAL, "30")) * 60 * 1000;
final AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + interval, interval, refresh_intent);
}
else {
final AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
m.cancel(refresh_intent);
}
}
}
}