package yuku.alkitab.base.br;
import android.app.AlarmManager;
import android.app.IntentService;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.RemoteViews;
import yuku.afw.App;
import yuku.alkitab.base.IsiActivity;
import yuku.alkitab.base.sv.DailyVerseAppWidgetService;
import yuku.alkitab.base.util.DailyVerseData;
import yuku.alkitab.base.widget.Localized;
import yuku.alkitab.debug.BuildConfig;
import yuku.alkitab.debug.R;
import yuku.alkitab.model.Version;
import yuku.alkitabintegration.display.Launcher;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class DailyVerseAppWidgetReceiver extends AppWidgetProvider {
public static final String TAG = DailyVerseAppWidgetReceiver.class.getSimpleName();
public static class UpdateService extends IntentService {
public UpdateService() {
super("Widget updater (temporary)");
}
@Override
protected void onHandleIntent(final Intent intent) {
final int[] appWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
if (appWidgetIds == null) {
Log.e(TAG, "appWidgetIds is null");
return;
}
for (int appWidgetId : appWidgetIds) {
buildUpdate(this, appWidgetId, 1);
}
final AppWidgetManager mgr = AppWidgetManager.getInstance(this);
final ComponentName componentName = new ComponentName(this, DailyVerseAppWidgetReceiver.class);
final int[] allWidgetIds = mgr.getAppWidgetIds(componentName);
setAlarm(this, allWidgetIds);
}
}
@Override
public void onUpdate(final Context context, final AppWidgetManager appWidgetManager, final int[] appWidgetIds) {
final Intent intent = new Intent(App.context, UpdateService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
context.startService(intent);
}
@Override
public void onDeleted(final Context context, final int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
for (int appWidgetId : appWidgetIds) {
DailyVerseData.saveSavedState(appWidgetId, null);
}
}
public static void buildUpdate(final Context context, final int appWidgetId, final int direction) {
// get saved state
final DailyVerseData.SavedState savedState = DailyVerseData.loadSavedState(appWidgetId);
// prepare remote views
final RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.daily_verse_app_widget);
if (savedState.transparentBackground) {
rv.setInt(R.id.background, "setAlpha", savedState.backgroundAlpha);
}
if (savedState.darkText) {
rv.setTextColor(R.id.tReference, Color.BLACK);
rv.setImageViewResource(R.id.bPrev, R.drawable.ic_nav_left_dark);
rv.setImageViewResource(R.id.bNext, R.drawable.ic_nav_right_dark);
} else {
rv.setTextColor(R.id.tReference, Color.WHITE);
}
rv.setFloat(R.id.tReference, "setTextSize", savedState.textSize);
final Intent svcIntent = new Intent(context, DailyVerseAppWidgetService.class);
svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));
rv.setRemoteAdapter(R.id.lsVerse, svcIntent);
final Version version = DailyVerseData.getVersion(savedState.versionId);
final int[] aris = DailyVerseData.getAris(appWidgetId, savedState, version, direction);
if (aris != null) {
rv.setTextViewText(R.id.tReference, version.referenceWithVerseCount(aris[0], aris.length));
final Intent viewVerseIntent = Launcher.openAppAtBibleLocation(aris[0]);
rv.setOnClickPendingIntent(R.id.tReference, PendingIntent.getActivity(context, appWidgetId + 10000, viewVerseIntent, PendingIntent.FLAG_UPDATE_CURRENT));
} else {
rv.setTextViewText(R.id.tReference, Localized.string(R.string.generic_verse_not_available_in_this_version));
}
//------Set Intent to update widget
final int[] appWidgetIds = {appWidgetId};
//--App logo button
{
Intent intent = new Intent(App.context, IsiActivity.class);
PendingIntent pi = PendingIntent.getActivity(context, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT);
rv.setOnClickPendingIntent(R.id.imgLogo, pi);
}
//--Prev button
{
Intent intentPrev = new Intent(context, ClickReceiver.class);
Bundle bundle = new Bundle();
bundle.putIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
bundle.putString("app_widget_action", "update_widget");
bundle.putInt("app_widget_button", 1);
intentPrev.putExtras(bundle);
PendingIntent pendingIntentPrev = PendingIntent.getBroadcast(context, appWidgetId * 10 + 1, intentPrev, PendingIntent.FLAG_CANCEL_CURRENT);
rv.setOnClickPendingIntent(R.id.bPrev, pendingIntentPrev);
}
//--Next button
{
Intent intentNext = new Intent(context, ClickReceiver.class);
Bundle bundle = new Bundle();
bundle.putIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
bundle.putString("app_widget_action", "update_widget");
bundle.putInt("app_widget_button", 2);
intentNext.putExtras(bundle);
PendingIntent pendingIntentNext = PendingIntent.getBroadcast(context, appWidgetId * 10 + 2, intentNext, PendingIntent.FLAG_CANCEL_CURRENT);
rv.setOnClickPendingIntent(R.id.bNext, pendingIntentNext);
}
//------End set Intent to update widget
//-----Set Intent to open bible
final Intent viewVerseIntent = Launcher.getBaseViewIntent();
rv.setPendingIntentTemplate(R.id.lsVerse, PendingIntent.getActivity(context, appWidgetId, viewVerseIntent, PendingIntent.FLAG_CANCEL_CURRENT));
// Lastly, update and notify listview as well
final AppWidgetManager mgr = AppWidgetManager.getInstance(context);
mgr.updateAppWidget(appWidgetId, rv);
mgr.notifyAppWidgetViewDataChanged(appWidgetId, R.id.lsVerse);
}
public static class ClickReceiver extends BroadcastReceiver {
public static final String TAG = ClickReceiver.class.getSimpleName();
@Override
public void onReceive(final Context context, final Intent intent) {
final Bundle bundle = intent.getExtras();
if (bundle == null) {
return;
}
final String appWidgetAction = bundle.getString("app_widget_action");
if (!"update_widget".equals(appWidgetAction)) {
return;
}
final int[] appWidgetIds = bundle.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
if (appWidgetIds != null) {
final int buttonRequest = intent.getIntExtra("app_widget_button", 0);
final int direction;
if (buttonRequest == 1) {
direction = -1;
} else if (buttonRequest == 2) {
direction = 1;
} else {
throw new RuntimeException("No such widget button");
}
for (int appWidgetId : appWidgetIds) {
final DailyVerseData.SavedState savedState = DailyVerseData.loadSavedState(appWidgetId);
savedState.click += direction; // manually adjust
// pass in through this method to verify that verses exist
DailyVerseData.getAris(appWidgetId, savedState, DailyVerseData.getVersion(savedState.versionId), direction);
DailyVerseData.saveSavedState(appWidgetId, savedState);
}
}
final Intent i = new Intent(context, DailyVerseAppWidgetReceiver.class);
i.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
i.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
context.sendBroadcast(i);
}
}
public static void setAlarm(Context context, int[] ids) {
final Intent intent = new Intent(context, DailyVerseAppWidgetReceiver.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
final PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
final AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
final Calendar c = GregorianCalendar.getInstance();
if (BuildConfig.DEBUG) {
// 15 seconds for debugging
final int interval = 15 * 1000;
mgr.setRepeating(AlarmManager.RTC, c.getTimeInMillis() + interval, interval, pi);
} else {
// normal: daily
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.add(Calendar.DAY_OF_YEAR, 1);
mgr.setRepeating(AlarmManager.RTC, c.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);
}
}
}