set todo list widget title, if tapped - open app, show unchecked todo icon

This commit is contained in:
Negue 2016-11-19 19:13:39 +01:00
parent a084d776e9
commit 4356bbd63a
10 changed files with 112 additions and 41 deletions

View file

@ -1,35 +1,40 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dailies_list_row" android:id="@+id/widget_list_row"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent" <LinearLayout
android:layout_height="wrap_content" android:layout_width="match_parent"
android:background="@color/white"> android:layout_height="wrap_content"
<FrameLayout android:background="@color/white">
android:id="@+id/checkbox_background"
android:layout_width="@dimen/button_compact_width" <FrameLayout
android:layout_height="match_parent" android:id="@+id/checkbox_background"
android:layout_gravity="center"> android:layout_width="@dimen/button_compact_width"
<ImageView android:layout_height="match_parent"
android:layout_width="@dimen/checkbox_compact_size" android:layout_gravity="center">
android:layout_height="@dimen/checkbox_compact_size"
android:src="@drawable/daily_unchecked" <ImageView
android:layout_gravity="center" /> android:layout_width="@dimen/checkbox_compact_size"
</FrameLayout> android:layout_height="@dimen/checkbox_compact_size"
<TextView android:layout_gravity="center"
android:paddingLeft="@dimen/task_text_padding" android:src="@drawable/daily_unchecked" />
android:paddingStart="@dimen/task_text_padding" </FrameLayout>
android:paddingRight="@dimen/task_text_padding"
android:paddingEnd="@dimen/task_text_padding" <TextView
android:paddingBottom="@dimen/task_top_bottom_compact_padding" android:id="@+id/dailies_text"
android:paddingTop="@dimen/task_top_bottom_compact_padding" android:layout_width="match_parent"
android:id="@+id/dailies_text" android:layout_height="wrap_content"
android:layout_width="match_parent" android:paddingBottom="@dimen/task_top_bottom_compact_padding"
android:layout_height="wrap_content" android:paddingEnd="@dimen/task_text_padding"
android:textColor="@color/primary_text_light" /> android:paddingLeft="@dimen/task_text_padding"
</LinearLayout> android:paddingRight="@dimen/task_text_padding"
android:paddingStart="@dimen/task_text_padding"
android:paddingTop="@dimen/task_top_bottom_compact_padding"
android:textColor="@color/primary_text_light" />
</LinearLayout>
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"

View file

@ -6,10 +6,10 @@
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/dailies"
android:background="@drawable/rounded_purple_square" android:background="@drawable/rounded_purple_square"
android:padding="4dp" android:padding="4dp"
android:textSize="18sp" android:textSize="18sp"
android:id="@+id/widget_title"
android:textColor="@android:color/white"/> android:textColor="@android:color/white"/>
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget_list_row"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white">
<FrameLayout
android:id="@+id/checkbox_background"
android:layout_width="@dimen/button_compact_width"
android:layout_height="match_parent"
android:layout_gravity="center">
<ImageView
android:layout_width="@dimen/checkbox_compact_size"
android:layout_height="@dimen/checkbox_compact_size"
android:layout_gravity="center"
android:src="@drawable/todo_unchecked" />
</FrameLayout>
<TextView
android:id="@+id/dailies_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/task_top_bottom_compact_padding"
android:paddingEnd="@dimen/task_text_padding"
android:paddingLeft="@dimen/task_text_padding"
android:paddingRight="@dimen/task_text_padding"
android:paddingStart="@dimen/task_text_padding"
android:paddingTop="@dimen/task_top_bottom_compact_padding"
android:textColor="@color/primary_text_light" />
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/selection_highlight" />
</FrameLayout>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/widget_dailies" android:initialLayout="@layout/widget_task_list"
android:minHeight="120dp" android:minHeight="120dp"
android:minWidth="120dp" android:minWidth="120dp"
android:updatePeriodMillis="1800000" android:updatePeriodMillis="1800000"

View file

@ -3,12 +3,12 @@ package com.habitrpg.android.habitica.widget;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import com.habitrpg.android.habitica.R;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task;
public class DailiesListFactory extends TaskListFactory { public class DailiesListFactory extends TaskListFactory {
public DailiesListFactory(Context context, Intent intent) { public DailiesListFactory(Context context, Intent intent) {
super(context, intent, Task.TYPE_DAILY); super(context, intent, Task.TYPE_DAILY, R.layout.widget_dailies_list_row);
} }
} }

View file

@ -1,5 +1,7 @@
package com.habitrpg.android.habitica.widget; package com.habitrpg.android.habitica.widget;
import com.habitrpg.android.habitica.R;
public class DailiesWidgetProvider extends TaskListWidgetProvider{ public class DailiesWidgetProvider extends TaskListWidgetProvider{
@Override @Override
@ -11,5 +13,10 @@ public class DailiesWidgetProvider extends TaskListWidgetProvider{
protected Class getProviderClass() { protected Class getProviderClass() {
return DailiesWidgetProvider.class; return DailiesWidgetProvider.class;
} }
@Override
protected int getTitleResId() {
return R.string.dailies;
}
} }

View file

@ -26,14 +26,16 @@ import rx.schedulers.Schedulers;
public abstract class TaskListFactory implements RemoteViewsService.RemoteViewsFactory { public abstract class TaskListFactory implements RemoteViewsService.RemoteViewsFactory {
private final int widgetId; private final int widgetId;
private int listItemResId;
private String taskType; private String taskType;
private List<Task> taskList = new ArrayList<>(); private List<Task> taskList = new ArrayList<>();
private Context context = null; private Context context = null;
private boolean reloadData; private boolean reloadData;
public TaskListFactory(Context context, Intent intent, String taskType) { public TaskListFactory(Context context, Intent intent, String taskType, int listItemResId) {
this.context = context; this.context = context;
this.widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0); this.widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0);
this.listItemResId = listItemResId;
this.reloadData = false; this.reloadData = false;
this.taskType = taskType; this.taskType = taskType;
@ -85,7 +87,7 @@ public abstract class TaskListFactory implements RemoteViewsService.RemoteViewsF
@Override @Override
public RemoteViews getViewAt(int position) { public RemoteViews getViewAt(int position) {
final RemoteViews remoteView = new RemoteViews( final RemoteViews remoteView = new RemoteViews(
context.getPackageName(), R.layout.widget_dailies_list_row); context.getPackageName(), listItemResId);
if (taskList.size() > position) { if (taskList.size() > position) {
Task task = taskList.get(position); Task task = taskList.get(position);
@ -98,14 +100,14 @@ public abstract class TaskListFactory implements RemoteViewsService.RemoteViewsF
remoteView.setInt(R.id.checkbox_background, "setBackgroundResource", task.getLightTaskColor()); remoteView.setInt(R.id.checkbox_background, "setBackgroundResource", task.getLightTaskColor());
Intent fillInIntent = new Intent(); Intent fillInIntent = new Intent();
fillInIntent.putExtra(TaskListWidgetProvider.TASK_ID_ITEM, task.getId()); fillInIntent.putExtra(TaskListWidgetProvider.TASK_ID_ITEM, task.getId());
remoteView.setOnClickFillInIntent(R.id.dailies_list_row, fillInIntent); remoteView.setOnClickFillInIntent(R.id.widget_list_row, fillInIntent);
} }
return remoteView; return remoteView;
} }
@Override @Override
public RemoteViews getLoadingView() { public RemoteViews getLoadingView() {
return new RemoteViews(context.getPackageName(), R.layout.widget_dailies_list_row); return new RemoteViews(context.getPackageName(), listItemResId);
} }
@Override @Override

View file

@ -5,7 +5,6 @@ import android.appwidget.AppWidgetManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
@ -15,6 +14,7 @@ import com.habitrpg.android.habitica.APIHelper;
import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.HabiticaApplication;
import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.HostConfig;
import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.ui.activities.MainActivity;
import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection; import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task;
import com.raizlabs.android.dbflow.sql.builder.Condition; import com.raizlabs.android.dbflow.sql.builder.Condition;
@ -40,6 +40,7 @@ public abstract class TaskListWidgetProvider extends BaseWidgetProvider {
protected abstract Class getServiceClass(); protected abstract Class getServiceClass();
protected abstract Class getProviderClass(); protected abstract Class getProviderClass();
protected abstract int getTitleResId();
@Override @Override
@ -86,9 +87,15 @@ public abstract class TaskListWidgetProvider extends BaseWidgetProvider {
Intent intent = new Intent(context, getServiceClass()); Intent intent = new Intent(context, getServiceClass());
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_dailies); RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_task_list);
rv.setRemoteAdapter(appWidgetIds[i], R.id.list_view, intent); rv.setRemoteAdapter(appWidgetIds[i], R.id.list_view, intent);
rv.setEmptyView(R.id.list, R.id.empty_view); rv.setEmptyView(R.id.list, R.id.empty_view);
rv.setTextViewText(R.id.widget_title, context.getString(getTitleResId()));
// if the user click on the title: open App
Intent openAppIntent = new Intent(context.getApplicationContext(), MainActivity.class);
PendingIntent openApp = PendingIntent.getActivity(context, 0, openAppIntent, PendingIntent.FLAG_UPDATE_CURRENT);
rv.setOnClickPendingIntent(R.id.widget_title, openApp);
Intent taskIntent = new Intent(context, getProviderClass()); Intent taskIntent = new Intent(context, getProviderClass());
taskIntent.setAction(DAILY_ACTION); taskIntent.setAction(DAILY_ACTION);
@ -108,7 +115,7 @@ public abstract class TaskListWidgetProvider extends BaseWidgetProvider {
@Override @Override
public int layoutResourceId() { public int layoutResourceId() {
return R.layout.widget_dailies; return R.layout.widget_task_list;
} }
@Override @Override

View file

@ -3,10 +3,11 @@ package com.habitrpg.android.habitica.widget;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import com.habitrpg.android.habitica.R;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task;
public class TodoListFactory extends TaskListFactory { public class TodoListFactory extends TaskListFactory {
public TodoListFactory(Context context, Intent intent) { public TodoListFactory(Context context, Intent intent) {
super(context, intent, Task.TYPE_TODO); super(context, intent, Task.TYPE_TODO, R.layout.widget_todo_list_row);
} }
} }

View file

@ -1,5 +1,7 @@
package com.habitrpg.android.habitica.widget; package com.habitrpg.android.habitica.widget;
import com.habitrpg.android.habitica.R;
public class TodoListWidgetProvider extends TaskListWidgetProvider{ public class TodoListWidgetProvider extends TaskListWidgetProvider{
@Override @Override
@ -11,4 +13,9 @@ public class TodoListWidgetProvider extends TaskListWidgetProvider{
protected Class getProviderClass() { protected Class getProviderClass() {
return TodoListWidgetProvider.class; return TodoListWidgetProvider.class;
} }
@Override
protected int getTitleResId() {
return R.string.todos;
}
} }