From 46a0777195c3d7de8890e2df8a82dd9611fc0312 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Mon, 29 Aug 2016 20:53:48 -0400 Subject: [PATCH] Restore progress bars --- .../habits/list/ListHabitsRootView.java | 53 +++++++++++++++---- .../uhabits/tasks/AndroidTaskRunner.java | 27 +++++++++- .../uhabits/tasks/SingleThreadTaskRunner.java | 19 ++++++- .../org/isoron/uhabits/tasks/TaskRunner.java | 13 +++++ 4 files changed, 99 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.java index 8a4cd2257..fa55ee863 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.java @@ -23,15 +23,17 @@ import android.content.*; import android.content.res.*; import android.support.annotation.*; import android.support.v7.widget.Toolbar; +import android.util.*; import android.view.*; import android.widget.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; import org.isoron.uhabits.activities.*; import org.isoron.uhabits.activities.habits.list.controllers.*; import org.isoron.uhabits.activities.habits.list.model.*; import org.isoron.uhabits.activities.habits.list.views.*; +import org.isoron.uhabits.models.*; +import org.isoron.uhabits.tasks.*; import org.isoron.uhabits.utils.*; import javax.inject.*; @@ -40,7 +42,7 @@ import butterknife.*; @ActivityScope public class ListHabitsRootView extends BaseRootView - implements ModelObservable.Listener + implements ModelObservable.Listener, TaskRunner.Listener { public static final int MAX_CHECKMARK_COUNT = 21; @@ -68,10 +70,13 @@ public class ListHabitsRootView extends BaseRootView @NonNull private final HabitCardListAdapter listAdapter; + private final TaskRunner runner; + @Inject public ListHabitsRootView(@ActivityContext Context context, @NonNull HintListFactory hintListFactory, - @NonNull HabitCardListAdapter listAdapter) + @NonNull HabitCardListAdapter listAdapter, + @NonNull TaskRunner runner) { super(context); addView(inflate(getContext(), R.layout.list_habits, null)); @@ -81,13 +86,16 @@ public class ListHabitsRootView extends BaseRootView listView.setAdapter(listAdapter); listAdapter.setListView(listView); + this.runner = runner; + progressBar.setIndeterminate(true); tvStarEmpty.setTypeface(InterfaceUtils.getFontAwesome(getContext())); - initToolbar(); String hints[] = getContext().getResources().getStringArray(R.array.hints); HintList hintList = hintListFactory.create(hints); hintView.setHints(hintList); + + initToolbar(); } @NonNull @@ -103,6 +111,20 @@ public class ListHabitsRootView extends BaseRootView updateEmptyView(); } + @Override + public void onTaskFinished(Task task) + { + updateProgressBar(); + Log.d("RootView", "onTaskFinished"); + } + + @Override + public void onTaskStarted(Task task) + { + updateProgressBar(); + Log.d("RootView", "onTaskStarted"); + } + public void setController(@NonNull ListHabitsController controller, @NonNull ListHabitsSelectionMenu menu) { @@ -119,6 +141,8 @@ public class ListHabitsRootView extends BaseRootView protected void onAttachedToWindow() { super.onAttachedToWindow(); + runner.addListener(this); + updateProgressBar(); listAdapter.getObservable().addListener(this); } @@ -126,9 +150,19 @@ public class ListHabitsRootView extends BaseRootView protected void onDetachedFromWindow() { listAdapter.getObservable().removeListener(this); + runner.removeListener(this); super.onDetachedFromWindow(); } + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) + { + int count = getCheckmarkCount(); + header.setButtonCount(count); + listView.setCheckmarkCount(count); + super.onSizeChanged(w, h, oldw, oldh); + } + private int getCheckmarkCount() { Resources res = getResources(); @@ -144,12 +178,11 @@ public class ListHabitsRootView extends BaseRootView listAdapter.getItemCount() > 0 ? View.GONE : View.VISIBLE); } - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) + private void updateProgressBar() { - int count = getCheckmarkCount(); - header.setButtonCount(count); - listView.setCheckmarkCount(count); - super.onSizeChanged(w, h, oldw, oldh); + postDelayed(() -> { + progressBar.setVisibility( + runner.getActiveTaskCount() > 0 ? VISIBLE : GONE); + }, 500); } } diff --git a/app/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java b/app/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java index 72ed08457..e1626fe34 100644 --- a/app/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java +++ b/app/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java @@ -28,25 +28,34 @@ import java.util.*; import dagger.*; @Module -@AppScope public class AndroidTaskRunner implements TaskRunner { private final LinkedList activeTasks; private final HashMap taskToAsyncTask; + private LinkedList listeners; + public AndroidTaskRunner() { activeTasks = new LinkedList<>(); taskToAsyncTask = new HashMap<>(); + listeners = new LinkedList<>(); } @Provides + @AppScope public static TaskRunner provideTaskRunner() { return new AndroidTaskRunner(); } + @Override + public void addListener(Listener listener) + { + listeners.add(listener); + } + @Override public void execute(Task task) { @@ -54,14 +63,26 @@ public class AndroidTaskRunner implements TaskRunner new CustomAsyncTask(task).execute(); } + @Override + public int getActiveTaskCount() + { + return activeTasks.size(); + } + @Override public void publishProgress(Task task, int progress) { CustomAsyncTask asyncTask = taskToAsyncTask.get(task); - if(asyncTask == null) return; + if (asyncTask == null) return; asyncTask.publish(progress); } + @Override + public void removeListener(Listener listener) + { + listeners.remove(listener); + } + private class CustomAsyncTask extends AsyncTask { private final Task task; @@ -94,11 +115,13 @@ public class AndroidTaskRunner implements TaskRunner task.onPostExecute(); activeTasks.remove(this); taskToAsyncTask.remove(task); + for (Listener l : listeners) l.onTaskFinished(task); } @Override protected void onPreExecute() { + for (Listener l : listeners) l.onTaskStarted(task); activeTasks.add(this); taskToAsyncTask.put(task, this); task.onPreExecute(); diff --git a/app/src/main/java/org/isoron/uhabits/tasks/SingleThreadTaskRunner.java b/app/src/main/java/org/isoron/uhabits/tasks/SingleThreadTaskRunner.java index e289e7530..db05b0955 100644 --- a/app/src/main/java/org/isoron/uhabits/tasks/SingleThreadTaskRunner.java +++ b/app/src/main/java/org/isoron/uhabits/tasks/SingleThreadTaskRunner.java @@ -28,11 +28,17 @@ public class SingleThreadTaskRunner implements TaskRunner { @Provides @AppScope - public static TaskRunner getInstance() + public static TaskRunner provideTaskRunner() { return new SingleThreadTaskRunner(); } + @Override + public void addListener(Listener listener) + { + throw new UnsupportedOperationException(); + } + @Override public void execute(Task task) { @@ -42,10 +48,21 @@ public class SingleThreadTaskRunner implements TaskRunner task.onPostExecute(); } + @Override + public int getActiveTaskCount() + { + return 0; + } + @Override public void publishProgress(Task task, int progress) { task.onProgressUpdate(progress); } + @Override + public void removeListener(Listener listener) + { + throw new UnsupportedOperationException(); + } } diff --git a/app/src/main/java/org/isoron/uhabits/tasks/TaskRunner.java b/app/src/main/java/org/isoron/uhabits/tasks/TaskRunner.java index 898d196f6..c5c38d7c0 100644 --- a/app/src/main/java/org/isoron/uhabits/tasks/TaskRunner.java +++ b/app/src/main/java/org/isoron/uhabits/tasks/TaskRunner.java @@ -21,7 +21,20 @@ package org.isoron.uhabits.tasks; public interface TaskRunner { + void addListener(Listener listener); + + void removeListener(Listener listener); + void execute(Task task); void publishProgress(Task task, int progress); + + int getActiveTaskCount(); + + interface Listener + { + void onTaskStarted(Task task); + + void onTaskFinished(Task task); + } }