From fc7ab5c3195ceab261596d09cb5773fed775d12b Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 9 Sep 2016 21:19:51 +0200 Subject: [PATCH] Initial version for Avatar Stats Widget --- Habitica/AndroidManifest.xml | 9 + Habitica/res/drawable/exp_progress.xml | 20 ++ Habitica/res/drawable/hp_progress.xml | 20 ++ Habitica/res/drawable/mp_progress.xml | 20 ++ Habitica/res/drawable/widget_background.xml | 16 ++ Habitica/res/layout/widget_avatar_stats.xml | 263 ++++++++++++++++++ Habitica/res/values/colors.xml | 2 + Habitica/res/values/dimens.xml | 2 + Habitica/res/xml/avatar_widget_info.xml | 9 + Habitica/res/xml/widget_info.xml | 8 - .../habitrpg/android/habitica/APIHelper.java | 9 +- .../habitica/components/AppComponent.java | 4 +- .../habitica/ui/AvatarWithBarsViewModel.java | 3 - .../habitica/ui/activities/MainActivity.java | 17 ++ .../widget/AvatarStatsWidgetProvider.java | 105 +++++++ .../widget/AvatarStatsWidgetService.java | 122 ++++++++ .../android/habitica/widget/SimpleWidget.java | 25 +- .../habitica/widget/UpdateWidgetService.java | 118 -------- 18 files changed, 625 insertions(+), 147 deletions(-) create mode 100644 Habitica/res/drawable/exp_progress.xml create mode 100644 Habitica/res/drawable/hp_progress.xml create mode 100644 Habitica/res/drawable/mp_progress.xml create mode 100644 Habitica/res/drawable/widget_background.xml create mode 100644 Habitica/res/layout/widget_avatar_stats.xml create mode 100644 Habitica/res/xml/avatar_widget_info.xml delete mode 100644 Habitica/res/xml/widget_info.xml create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/widget/UpdateWidgetService.java diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index a2800297a..0bf60f924 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -170,6 +170,15 @@ android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> + + + + + + + + diff --git a/Habitica/res/drawable/exp_progress.xml b/Habitica/res/drawable/exp_progress.xml new file mode 100644 index 000000000..3cdc424d6 --- /dev/null +++ b/Habitica/res/drawable/exp_progress.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/drawable/hp_progress.xml b/Habitica/res/drawable/hp_progress.xml new file mode 100644 index 000000000..541d378f2 --- /dev/null +++ b/Habitica/res/drawable/hp_progress.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/drawable/mp_progress.xml b/Habitica/res/drawable/mp_progress.xml new file mode 100644 index 000000000..4936c0975 --- /dev/null +++ b/Habitica/res/drawable/mp_progress.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/drawable/widget_background.xml b/Habitica/res/drawable/widget_background.xml new file mode 100644 index 000000000..c617bca2d --- /dev/null +++ b/Habitica/res/drawable/widget_background.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/layout/widget_avatar_stats.xml b/Habitica/res/layout/widget_avatar_stats.xml new file mode 100644 index 000000000..c4623f7ff --- /dev/null +++ b/Habitica/res/layout/widget_avatar_stats.xml @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Habitica/res/values/colors.xml b/Habitica/res/values/colors.xml index 74827ffd9..7c449349a 100644 --- a/Habitica/res/values/colors.xml +++ b/Habitica/res/values/colors.xml @@ -100,4 +100,6 @@ #fff0ad4e #ffd9534f + #c8432874 + diff --git a/Habitica/res/values/dimens.xml b/Habitica/res/values/dimens.xml index 8d7327927..24fcffd16 100644 --- a/Habitica/res/values/dimens.xml +++ b/Habitica/res/values/dimens.xml @@ -17,6 +17,7 @@ 15dp 5dp + 2dp 5dp 140dp 147dp @@ -77,4 +78,5 @@ 5dp 7dp 40dp + 13dp \ No newline at end of file diff --git a/Habitica/res/xml/avatar_widget_info.xml b/Habitica/res/xml/avatar_widget_info.xml new file mode 100644 index 000000000..c2a678663 --- /dev/null +++ b/Habitica/res/xml/avatar_widget_info.xml @@ -0,0 +1,9 @@ + + + + diff --git a/Habitica/res/xml/widget_info.xml b/Habitica/res/xml/widget_info.xml deleted file mode 100644 index f9be3f9d6..000000000 --- a/Habitica/res/xml/widget_info.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java index 7369fba79..63d12c879 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java @@ -17,8 +17,6 @@ import com.magicmicky.habitrpgwrapper.lib.models.Customization; import com.magicmicky.habitrpgwrapper.lib.models.FAQArticle; import com.magicmicky.habitrpgwrapper.lib.models.Group; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; -import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationRequest; -import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationResult; import com.magicmicky.habitrpgwrapper.lib.models.Purchases; import com.magicmicky.habitrpgwrapper.lib.models.Skill; import com.magicmicky.habitrpgwrapper.lib.models.TutorialStep; @@ -68,13 +66,12 @@ import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; -import android.os.Build; import android.support.v7.app.AlertDialog; +import android.util.Log; import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import java.net.ConnectException; import java.net.SocketException; import java.net.SocketTimeoutException; import java.net.UnknownHostException; @@ -82,11 +79,9 @@ import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import javax.net.ssl.SSLException; -import javax.net.ssl.SSLHandshakeException; import okhttp3.Interceptor; import okhttp3.MediaType; @@ -95,8 +90,6 @@ import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; import okhttp3.logging.HttpLoggingInterceptor; -import okio.Buffer; -import retrofit2.Call; import retrofit2.Converter; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.HttpException; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java index 41996eac5..1392be208 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java @@ -53,7 +53,7 @@ import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragme import com.habitrpg.android.habitica.ui.fragments.social.party.PartyMemberListFragment; import com.habitrpg.android.habitica.ui.fragments.tasks.TaskRecyclerViewFragment; import com.habitrpg.android.habitica.ui.fragments.tasks.TasksFragment; -import com.habitrpg.android.habitica.widget.UpdateWidgetService; +import com.habitrpg.android.habitica.widget.AvatarStatsWidgetService; import javax.inject.Singleton; @@ -62,7 +62,7 @@ import dagger.Component; @Singleton @Component(modules = {AppModule.class, ApiModule.class}) public interface AppComponent { - void inject(UpdateWidgetService target); + void inject(AvatarStatsWidgetService target); void inject(ClassSelectionActivity classSelectionActivity); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.java index 8d5005b8d..55c18f293 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.java @@ -117,18 +117,15 @@ public class AvatarWithBarsViewModel implements View.OnClickListener { switch (stats.get_class()) { case warrior: drawable = ResourcesCompat.getDrawable(res, R.drawable.ic_header_warrior, null); - break; case rogue: drawable = ResourcesCompat.getDrawable(res, R.drawable.ic_header_rogue, null); break; case wizard: drawable = ResourcesCompat.getDrawable(res, R.drawable.ic_header_mage, null); - break; case healer: drawable = ResourcesCompat.getDrawable(res, R.drawable.ic_header_healer, null); - break; case base: default: diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java index a2978fc9b..713771be6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java @@ -46,6 +46,7 @@ import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils; import com.habitrpg.android.habitica.ui.helpers.UiUtils; import com.habitrpg.android.habitica.ui.menu.MainDrawerBuilder; import com.habitrpg.android.habitica.userpicture.BitmapUtils; +import com.habitrpg.android.habitica.widget.AvatarStatsWidgetProvider; import com.magicmicky.habitrpgwrapper.lib.api.MaintenanceApiService; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.magicmicky.habitrpgwrapper.lib.models.Preferences; @@ -97,6 +98,8 @@ import org.solovyev.android.checkout.Checkout; import android.app.AlarmManager; import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -286,6 +289,20 @@ public class MainActivity extends BaseActivity implements Action1, Ha } } + @Override + protected void onPause() { + updateWidgets(AvatarStatsWidgetProvider.class); + super.onPause(); + } + + private void updateWidgets(Class widgetClass) { + Intent intent = new Intent(this,widgetClass); + intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); + int ids[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), widgetClass)); + intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids); + sendBroadcast(intent); + } + private void setupCheckout() { checkout = Checkout.forActivity(this, HabiticaApplication.getInstance(this).getCheckout()); checkout.start(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java new file mode 100644 index 000000000..c73be3831 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java @@ -0,0 +1,105 @@ +package com.habitrpg.android.habitica.widget; + +import com.habitrpg.android.habitica.R; + +import android.annotation.TargetApi; +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.RemoteViews; + +public class AvatarStatsWidgetProvider extends AppWidgetProvider { + private static final String LOG = AvatarStatsWidgetProvider.class.getName(); + + /** + * Returns number of cells needed for given size of the widget.
+ * see http://stackoverflow.com/questions/14270138/dynamically-adjusting-widgets-content-and-layout-to-the-size-the-user-defined-t + * + * @param size Widget size in dp. + * @return Size in number of cells. + */ + private static int getCellsForSize(int size) { + int n = 2; + while (70 * n - 30 < size) { + ++n; + } + return n - 1; + } + + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + // Get all ids + ComponentName thisWidget = new ComponentName(context, + AvatarStatsWidgetProvider.class); + int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); + + if (Build.VERSION.SDK_INT >= 16) { + for (int widgetId : allWidgetIds) { + Bundle options = appWidgetManager.getAppWidgetOptions(widgetId); + appWidgetManager.partiallyUpdateAppWidget(widgetId, + configureRemoteViews(context, options)); + } + } + + // Build the intent to call the service + Intent intent = new Intent(context.getApplicationContext(), + AvatarStatsWidgetService.class); + intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); + + context.startService(intent); + } + + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) + @Override + public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { + Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId); + + appWidgetManager.partiallyUpdateAppWidget(appWidgetId, + configureRemoteViews(context, options)); + + super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, + newOptions); + + } + + /** + * Determine appropriate view based on width provided.
+ * see http://stackoverflow.com/questions/14270138/dynamically-adjusting-widgets-content-and-layout-to-the-size-the-user-defined-t + */ + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) + private RemoteViews configureRemoteViews(Context context, Bundle options) { + + int minWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH); + int minHeight = options + .getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT); + + // First find out rows and columns based on width provided. + int rows = getCellsForSize(minHeight); + int columns = getCellsForSize(minWidth); + RemoteViews remoteViews = new RemoteViews(context.getPackageName(), + R.layout.widget_avatar_stats); + + if (columns > 3) { + remoteViews.setViewVisibility(R.id.avatar_view, View.VISIBLE); + } else { + remoteViews.setViewVisibility(R.id.avatar_view, View.GONE); + } + + if (rows > 1) { + remoteViews.setViewVisibility(R.id.mp_wrapper, View.VISIBLE); + remoteViews.setViewVisibility(R.id.detail_info_view, View.VISIBLE); + } else { + remoteViews.setViewVisibility(R.id.mp_wrapper, View.GONE); + remoteViews.setViewVisibility(R.id.detail_info_view, View.GONE); + } + + return remoteViews; + + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java new file mode 100644 index 000000000..a767aa6dc --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java @@ -0,0 +1,122 @@ +package com.habitrpg.android.habitica.widget; + +import com.habitrpg.android.habitica.APIHelper; +import com.habitrpg.android.habitica.HabiticaApplication; +import com.habitrpg.android.habitica.HostConfig; +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; +import com.habitrpg.android.habitica.ui.AvatarView; +import com.habitrpg.android.habitica.ui.activities.MainActivity; +import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; +import com.magicmicky.habitrpgwrapper.lib.models.Stats; +import com.raizlabs.android.dbflow.runtime.transaction.BaseTransaction; +import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener; +import com.raizlabs.android.dbflow.sql.builder.Condition; +import com.raizlabs.android.dbflow.sql.language.Select; + +import android.app.PendingIntent; +import android.app.Service; +import android.appwidget.AppWidgetManager; +import android.content.ComponentName; +import android.content.Intent; +import android.graphics.Bitmap; +import android.os.IBinder; +import android.util.Log; +import android.view.View; +import android.widget.RemoteViews; + +import javax.inject.Inject; + +/** + * The service that should update the simple widget + * + * @see com.habitrpg.android.habitica.widget.SimpleWidget + * Created by Mickael on 01/11/13. + */ +public class AvatarStatsWidgetService extends Service { + private static final String LOG = ".avatarwidget.service"; + @Inject + public HostConfig hostConfig; + private AppWidgetManager appWidgetManager; + + + @Override + public int onStartCommand(final Intent intent, int flags, int startId) { + HabiticaApplication application = (HabiticaApplication) getApplication(); + application.getComponent().inject(this); + this.appWidgetManager = AppWidgetManager.getInstance(this); + + new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).async().querySingle(userTransactionListener); + + stopSelf(); + + return START_STICKY; + } + + private TransactionListener userTransactionListener = new TransactionListener() { + @Override + public void onResultReceived(HabitRPGUser habitRPGUser) { + updateData(habitRPGUser); + } + + @Override + public boolean onReady(BaseTransaction baseTransaction) { + return true; + } + + @Override + public boolean hasResult(BaseTransaction baseTransaction, HabitRPGUser habitRPGUser) { + return true; + } + }; + + private void updateData(HabitRPGUser user) { + if (user == null || user.getStats() == null) { + return; + } + Stats stats = user.getStats(); + ComponentName thisWidget = new ComponentName(this, AvatarStatsWidgetProvider.class); + int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); + String healthValueString = "" + stats.getHp().intValue() + "/" + stats.getMaxHealth(); + String expValueString = "" + stats.getExp().intValue() + "/" + stats.getToNextLevel(); + String mpValueString = "" + stats.getMp().intValue() + "/" + stats.getMaxMP(); + + RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.widget_avatar_stats); + + remoteViews.setTextViewText(R.id.TV_hp_value, healthValueString); + remoteViews.setTextViewText(R.id.exp_TV_value, expValueString); + remoteViews.setTextViewText(R.id.mp_TV_value, mpValueString); + + remoteViews.setProgressBar(R.id.hp_bar, stats.getMaxHealth(), stats.getHp().intValue(), false); + remoteViews.setProgressBar(R.id.exp_bar, stats.getToNextLevel(), stats.getExp().intValue(), false); + remoteViews.setProgressBar(R.id.mp_bar, stats.getMaxMP(), stats.getMp().intValue(), false); + remoteViews.setViewVisibility(R.id.mp_wrapper, (stats.get_class() == null || stats.getLvl() < 10 || user.getPreferences().getDisableClasses()) ? View.GONE : View.VISIBLE); + + int gp = (stats.getGp().intValue()); + int sp = (int) ((stats.getGp() - gp) * 100); + remoteViews.setTextViewText(R.id.gold_tv, String.valueOf(gp)); + remoteViews.setTextViewText(R.id.silver_tv, String.valueOf(sp)); + remoteViews.setTextViewText(R.id.gems_tv, String.valueOf((int)(user.getBalance() * 4))); + remoteViews.setTextViewText(R.id.lvl_tv, getString(R.string.user_level, user.getStats().getLvl())); + + AvatarView avatarView = new AvatarView(this, true, true, true);; + avatarView.setUser(user); + avatarView.onAvatarImageReady(bitmap -> { + Log.e("AVATAR BITMAP", bitmap.toString()); + remoteViews.setImageViewBitmap(R.id.avatar_view, bitmap); + appWidgetManager.partiallyUpdateAppWidget(allWidgetIds, remoteViews); + }); + Log.e("AVATAR THING", "BLA"); + + //If user click on life and xp: open the app + Intent openAppIntent = new Intent(this.getApplicationContext(), MainActivity.class); + PendingIntent openApp = PendingIntent.getActivity(this, 0, openAppIntent, PendingIntent.FLAG_UPDATE_CURRENT); + remoteViews.setOnClickPendingIntent(R.id.widget_main_view, openApp); + appWidgetManager.partiallyUpdateAppWidget(allWidgetIds, remoteViews); + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/SimpleWidget.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/SimpleWidget.java index 681a72c00..005f978bd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/SimpleWidget.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/SimpleWidget.java @@ -43,9 +43,17 @@ public class SimpleWidget extends AppWidgetProvider { ComponentName thisWidget = new ComponentName(context, SimpleWidget.class); int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); + + if (Build.VERSION.SDK_INT >= 16) { + for (int widgetId : allWidgetIds) { + Bundle options = appWidgetManager.getAppWidgetOptions(widgetId); + appWidgetManager.updateAppWidget(widgetId, + getRemoteViews(context, options)); + } + } // Build the intent to call the service Intent intent = new Intent(context.getApplicationContext(), - UpdateWidgetService.class); + AvatarStatsWidgetService.class); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); // Update the widgets via the service @@ -58,12 +66,8 @@ public class SimpleWidget extends AppWidgetProvider { Log.v(LOG, "onAppWidgetOptionChanged call"); Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId); - int minWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH); - int minHeight = options - .getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT); - appWidgetManager.updateAppWidget(appWidgetId, - getRemoteViews(context, minWidth, minHeight)); + getRemoteViews(context, options)); super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); @@ -74,8 +78,13 @@ public class SimpleWidget extends AppWidgetProvider { * Determine appropriate view based on width provided.
* see http://stackoverflow.com/questions/14270138/dynamically-adjusting-widgets-content-and-layout-to-the-size-the-user-defined-t */ - private RemoteViews getRemoteViews(Context context, int minWidth, - int minHeight) { + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) + private RemoteViews getRemoteViews(Context context, Bundle options) { + + int minWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH); + int minHeight = options + .getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT); + // First find out rows and columns based on width provided. int rows = getCellsForSize(minHeight); int columns = getCellsForSize(minWidth); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/UpdateWidgetService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/UpdateWidgetService.java deleted file mode 100644 index 4d48dad35..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/UpdateWidgetService.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.habitrpg.android.habitica.widget; - -import com.habitrpg.android.habitica.APIHelper; -import com.habitrpg.android.habitica.HabiticaApplication; -import com.habitrpg.android.habitica.R; -import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; -import com.habitrpg.android.habitica.ui.activities.MainActivity; -import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; - -import android.app.PendingIntent; -import android.app.Service; -import android.appwidget.AppWidgetManager; -import android.content.ComponentName; -import android.content.Intent; -import android.os.IBinder; -import android.widget.RemoteViews; - -import javax.inject.Inject; - -/** - * The service that should update the simple widget - * - * @see com.habitrpg.android.habitica.widget.SimpleWidget - * Created by Mickael on 01/11/13. - */ -public class UpdateWidgetService extends Service implements HabitRPGUserCallback.OnUserReceived { - private static final String LOG = ".simplewidget.service"; - @Inject - public APIHelper apiHelper; - private AppWidgetManager appWidgetManager; - - public UpdateWidgetService() { - super(); - ((HabiticaApplication) getApplication()).getComponent().inject(this); - } - - @Override - public int onStartCommand(final Intent intent, int flags, int startId) { - this.appWidgetManager = AppWidgetManager.getInstance(this); - int[] allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); - ComponentName thisWidget = new ComponentName(this, - SimpleWidget.class); - int[] allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget); - - if (apiHelper != null) { - apiHelper.retrieveUser(true).subscribe(new HabitRPGUserCallback(this)); - for (int widgetId : allWidgetIds) { - RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.simple_widget); - appWidgetManager.updateAppWidget(widgetId, remoteViews); - } - } else { - for (int widgetId : allWidgetIds) { - RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.simple_widget); - RemoteViews textConnect = new RemoteViews(this.getPackageName(), R.layout.simple_textview); - textConnect.setTextViewText(R.id.TV_simple_textview, getString(R.string.please_connect)); - remoteViews.removeAllViews(R.id.LL_header); - remoteViews.addView(R.id.LL_header, textConnect); - - - Intent clickIntent = new Intent(this.getApplicationContext(), SimpleWidget.class); - clickIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); - clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); - PendingIntent updateIntent = PendingIntent.getBroadcast(this, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT); - remoteViews.setOnClickPendingIntent(R.id.BT_refresh, updateIntent); - - Intent openAppIntent = new Intent(this.getApplicationContext(), MainActivity.class); - PendingIntent openApp = PendingIntent.getActivity(this, 0, openAppIntent, PendingIntent.FLAG_UPDATE_CURRENT); - remoteViews.setOnClickPendingIntent(R.id.widget_main_view, openApp); - appWidgetManager.updateAppWidget(widgetId, remoteViews); - - } - } - stopSelf(); - - return START_STICKY; - } - - private void updateData(HabitRPGUser user, AppWidgetManager appWidgetManager) { - ComponentName thisWidget = new ComponentName(this, SimpleWidget.class); - int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); - for (int widgetId : allWidgetIds) { - RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.simple_widget); - remoteViews.setTextViewText(R.id.TV_HP, "" + user.getStats().getHp().intValue() + "/" + (int) user.getStats().getMaxHealth() + " " + this.getString(R.string.HP_default)); - remoteViews.setTextViewText(R.id.TV_XP, "" + user.getStats().getExp().intValue() + "/" + (int) user.getStats().getToNextLevel() + " " + this.getString(R.string.XP_default)); - //remoteViews.setImageViewBitmap(R.id.IMG_ProfilePicture, dealWithUserPicture(user,this)); - remoteViews.setProgressBar(R.id.V_HPBar, (int) user.getStats().getMaxHealth(), user.getStats().getHp().intValue(), false); - remoteViews.setProgressBar(R.id.V_XPBar, (int) user.getStats().getToNextLevel(), user.getStats().getExp().intValue(), false); - - // If user click on refresh: refresh - Intent clickIntent = new Intent(this.getApplicationContext(), SimpleWidget.class); - clickIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); - clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); - PendingIntent updateIntent = PendingIntent.getBroadcast(this, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT); - remoteViews.setOnClickPendingIntent(R.id.BT_refresh, updateIntent); - - //If user click on life and xp: open the app - Intent openAppIntent = new Intent(this.getApplicationContext(), MainActivity.class); - PendingIntent openApp = PendingIntent.getActivity(this, 0, openAppIntent, PendingIntent.FLAG_UPDATE_CURRENT); - remoteViews.setOnClickPendingIntent(R.id.LL_header, openApp); - remoteViews.setOnClickPendingIntent(R.id.IMG_ProfilePicture, openApp); - - appWidgetManager.updateAppWidget(widgetId, remoteViews); - } - - - } - - @Override - public IBinder onBind(Intent intent) { - return null; - } - - @Override - public void onUserReceived(HabitRPGUser user) { - this.updateData(user, appWidgetManager); - - } -}