mirror of
https://github.com/iSoron/uhabits.git
synced 2025-12-06 09:08:52 -06:00
Render widgets in background
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user