diff --git a/app/src/main/java/org/isoron/uhabits/views/CheckmarkView.java b/app/src/main/java/org/isoron/uhabits/views/CheckmarkView.java index f63b43aed..8819e8e37 100644 --- a/app/src/main/java/org/isoron/uhabits/views/CheckmarkView.java +++ b/app/src/main/java/org/isoron/uhabits/views/CheckmarkView.java @@ -178,9 +178,7 @@ public class CheckmarkView extends View implements HabitDataView padding = 8 * leftMargin; textPaint.setTextSize(0.15f * width); - labelLayout = new StaticLayout(label, textPaint, - (int) (width - 2 * leftMargin - 2 * padding), - Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); + updateLabel(); } public void refreshData() @@ -190,8 +188,15 @@ public class CheckmarkView extends View implements HabitDataView Color.blue(habit.color)); this.label = habit.name; - textPaint.setColor(Color.WHITE); + updateLabel(); postInvalidate(); - requestLayout(); + } + + private void updateLabel() + { + textPaint.setColor(Color.WHITE); + labelLayout = new StaticLayout(label, textPaint, + (int) (width - 2 * leftMargin - 2 * padding), + Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); } } diff --git a/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java index 469ba1dae..4538a9a30 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java @@ -34,9 +34,10 @@ import android.view.View; import android.widget.ImageView; import android.widget.RemoteViews; -import org.isoron.uhabits.helpers.UIHelper; import org.isoron.uhabits.R; +import org.isoron.uhabits.helpers.UIHelper; import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.tasks.BaseTask; import java.io.FileOutputStream; import java.io.IOException; @@ -92,12 +93,12 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider } } - private void updateWidget(Context context, AppWidgetManager manager, int widgetId, Bundle options) + private void updateWidget(Context context, AppWidgetManager manager, + int widgetId, Bundle options) { updateWidgetSize(context, options); Context appContext = context.getApplicationContext(); - RemoteViews remoteViews = new RemoteViews(context.getPackageName(), getLayoutId()); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext); Long habitId = prefs.getLong(getHabitIdKey(widgetId), -1L); @@ -112,24 +113,11 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider return; } - View widgetView = buildCustomView(context, habit); - measureCustomView(context, width, height, widgetView); - - widgetView.setDrawingCacheEnabled(true); - widgetView.buildDrawingCache(true); - Bitmap drawingCache = widgetView.getDrawingCache(); - - remoteViews.setTextViewText(R.id.label, habit.name); - remoteViews.setImageViewBitmap(R.id.imageView, drawingCache); - - //savePreview(context, widgetId, drawingCache); - - PendingIntent onClickIntent = getOnClickPendingIntent(context, habit); - if(onClickIntent != null) remoteViews.setOnClickPendingIntent(R.id.imageView, onClickIntent); - - manager.updateAppWidget(widgetId, remoteViews); + new RenderWidgetTask(widgetId, context, habit, manager).execute(); } + protected abstract void refreshCustomViewData(View widgetView); + private void savePreview(Context context, int widgetId, Bitmap widgetCache) { try @@ -204,4 +192,61 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider customView.measure(specWidth, specHeight); customView.layout(0, 0, customView.getMeasuredWidth(), customView.getMeasuredHeight()); } + + private class RenderWidgetTask extends BaseTask + { + private final int widgetId; + private final Context context; + private final Habit habit; + private final AppWidgetManager manager; + public RemoteViews remoteViews; + public View widgetView; + + public RenderWidgetTask(int widgetId, Context context, Habit habit, + AppWidgetManager manager) + { + this.widgetId = widgetId; + this.context = context; + this.habit = habit; + this.manager = manager; + } + + @Override + protected void onPreExecute() + { + super.onPreExecute(); + + remoteViews = new RemoteViews(context.getPackageName(), getLayoutId()); + widgetView = buildCustomView(context, habit); + measureCustomView(context, width, height, widgetView); + manager.updateAppWidget(widgetId, remoteViews); + } + + @Override + protected Void doInBackground(Void... params) + { + refreshCustomViewData(widgetView); + return null; + } + + @Override + protected void onPostExecute(Void aVoid) + { + widgetView.invalidate(); + widgetView.setDrawingCacheEnabled(true); + widgetView.buildDrawingCache(true); + Bitmap drawingCache = widgetView.getDrawingCache(); + remoteViews.setTextViewText(R.id.label, habit.name); + remoteViews.setImageViewBitmap(R.id.imageView, drawingCache); + + savePreview(context, widgetId, drawingCache); + + PendingIntent onClickIntent = getOnClickPendingIntent(context, habit); + if(onClickIntent != null) remoteViews.setOnClickPendingIntent(R.id.imageView, onClickIntent); + + manager.updateAppWidget(widgetId, remoteViews); + + super.onPostExecute(aVoid); + } + } } diff --git a/app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java index 849fdf52e..bd04e8eb0 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java @@ -26,8 +26,9 @@ import org.isoron.uhabits.HabitBroadcastReceiver; import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; import org.isoron.uhabits.views.CheckmarkView; +import org.isoron.uhabits.views.HabitDataView; -public class CheckmarkWidgetProvider extends BaseWidgetProvider +public class CheckmarkWidgetProvider extends BaseWidgetProvider { @Override protected View buildCustomView(Context context, Habit habit) @@ -37,6 +38,12 @@ public class CheckmarkWidgetProvider extends BaseWidgetProvider return view; } + @Override + protected void refreshCustomViewData(View view) + { + ((HabitDataView) view).refreshData(); + } + @Override protected PendingIntent getOnClickPendingIntent(Context context, Habit habit) { @@ -60,4 +67,6 @@ public class CheckmarkWidgetProvider extends BaseWidgetProvider { return R.layout.widget_checkmark; } + + } diff --git a/app/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.java index 82af6dcb3..2cac07c06 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.java @@ -26,6 +26,7 @@ import android.view.View; import org.isoron.uhabits.HabitBroadcastReceiver; import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.views.HabitDataView; import org.isoron.uhabits.views.HabitFrequencyView; public class FrequencyWidgetProvider extends BaseWidgetProvider @@ -39,6 +40,12 @@ public class FrequencyWidgetProvider extends BaseWidgetProvider return view; } + @Override + protected void refreshCustomViewData(View view) + { + ((HabitDataView) view).refreshData(); + } + @Override protected PendingIntent getOnClickPendingIntent(Context context, Habit habit) { diff --git a/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java index 957e1b63c..e02cb608c 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java @@ -25,6 +25,7 @@ import android.view.View; import org.isoron.uhabits.HabitBroadcastReceiver; import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.views.HabitDataView; import org.isoron.uhabits.views.HabitHistoryView; public class HistoryWidgetProvider extends BaseWidgetProvider @@ -38,6 +39,12 @@ public class HistoryWidgetProvider extends BaseWidgetProvider return view; } + @Override + protected void refreshCustomViewData(View view) + { + ((HabitDataView) view).refreshData(); + } + @Override protected PendingIntent getOnClickPendingIntent(Context context, Habit habit) { diff --git a/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java index f1d64439b..456491efe 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java @@ -25,6 +25,7 @@ import android.view.View; import org.isoron.uhabits.HabitBroadcastReceiver; import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.views.HabitDataView; import org.isoron.uhabits.views.HabitScoreView; public class ScoreWidgetProvider extends BaseWidgetProvider @@ -38,6 +39,12 @@ public class ScoreWidgetProvider extends BaseWidgetProvider return view; } + @Override + protected void refreshCustomViewData(View view) + { + ((HabitDataView) view).refreshData(); + } + @Override protected PendingIntent getOnClickPendingIntent(Context context, Habit habit) { diff --git a/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java index 05d4af462..f5d81d4f6 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java @@ -25,6 +25,7 @@ import android.view.View; import org.isoron.uhabits.HabitBroadcastReceiver; import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.views.HabitDataView; import org.isoron.uhabits.views.HabitStreakView; public class StreakWidgetProvider extends BaseWidgetProvider @@ -38,6 +39,12 @@ public class StreakWidgetProvider extends BaseWidgetProvider return view; } + @Override + protected void refreshCustomViewData(View view) + { + ((HabitDataView) view).refreshData(); + } + @Override protected PendingIntent getOnClickPendingIntent(Context context, Habit habit) {