From adb7429e9cb9f1b00aef34d57cdc279f7c8794f5 Mon Sep 17 00:00:00 2001 From: Gabor Keszthelyi Date: Tue, 17 Oct 2017 21:23:08 +0200 Subject: [PATCH] Progress background SmartView. #474 --- .../java/org/dmfs/tasks/ViewTaskFragment.java | 4 +- .../org/dmfs/tasks/groupings/ByDueDate.java | 23 ++----- .../java/org/dmfs/tasks/groupings/ByList.java | 23 ++----- .../org/dmfs/tasks/groupings/ByPriority.java | 23 ++----- .../org/dmfs/tasks/groupings/ByProgress.java | 23 ++----- .../org/dmfs/tasks/groupings/BySearch.java | 23 ++----- .../org/dmfs/tasks/groupings/ByStartDate.java | 23 ++----- .../tasks/widget/ProgressBackgroundView.java | 61 +++++++++++++++++++ .../java/org/dmfs/tasks/widget/SmartView.java | 36 +++++++++++ 9 files changed, 129 insertions(+), 110 deletions(-) create mode 100644 opentasks/src/main/java/org/dmfs/tasks/widget/ProgressBackgroundView.java create mode 100644 opentasks/src/main/java/org/dmfs/tasks/widget/SmartView.java diff --git a/opentasks/src/main/java/org/dmfs/tasks/ViewTaskFragment.java b/opentasks/src/main/java/org/dmfs/tasks/ViewTaskFragment.java index 4f2d5f5df..b40ed003c 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/ViewTaskFragment.java +++ b/opentasks/src/main/java/org/dmfs/tasks/ViewTaskFragment.java @@ -400,7 +400,7 @@ public void loadUri(Uri uri) if ((oldUri == null) != (uri == null)) { - /* + /* * getActivity().invalidateOptionsMenu() doesn't work in Android 2.x so use the compat lib */ ActivityCompat.invalidateOptionsMenu(getActivity()); @@ -491,7 +491,7 @@ public void onModelLoaded(Model model) @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - /* + /* * Don't show any options if we don't have a task to show. */ if (mTaskUri != null) diff --git a/opentasks/src/main/java/org/dmfs/tasks/groupings/ByDueDate.java b/opentasks/src/main/java/org/dmfs/tasks/groupings/ByDueDate.java index 223c034e5..de0409900 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/groupings/ByDueDate.java +++ b/opentasks/src/main/java/org/dmfs/tasks/groupings/ByDueDate.java @@ -22,11 +22,11 @@ import android.database.Cursor; import android.graphics.Paint; import android.os.Build; -import android.os.Build.VERSION; import android.view.View; import android.widget.BaseExpandableListAdapter; import android.widget.TextView; +import org.dmfs.optional.NullSafe; import org.dmfs.tasks.R; import org.dmfs.tasks.contract.TaskContract.Instances; import org.dmfs.tasks.groupings.cursorloaders.TimeRangeCursorFactory; @@ -37,6 +37,7 @@ import org.dmfs.tasks.utils.ExpandableGroupDescriptor; import org.dmfs.tasks.utils.ExpandableGroupDescriptorAdapter; import org.dmfs.tasks.utils.ViewDescriptor; +import org.dmfs.tasks.widget.ProgressBackgroundView; import java.text.DateFormatSymbols; @@ -123,23 +124,9 @@ public void populateView(View view, Cursor cursor, BaseExpandableListAdapter ada { priorityView.setBackgroundResource(R.color.priority_green); } - if (VERSION.SDK_INT >= 11) - { - // update percentage background - View background = getView(view, R.id.percentage_background_view); - background.setPivotX(0); - Integer percentComplete = TaskFieldAdapters.PERCENT_COMPLETE.get(cursor); - if (percentComplete < 100) - { - background.setScaleX(percentComplete == null ? 0 : percentComplete / 100f); - background.setBackgroundResource(R.drawable.task_progress_background_shade); - } - else - { - background.setScaleX(1); - background.setBackgroundResource(R.drawable.complete_task_background_overlay); - } - } + + new ProgressBackgroundView(getView(view, R.id.percentage_background_view)) + .update(new NullSafe<>(TaskFieldAdapters.PERCENT_COMPLETE.get(cursor))); setColorBar(view, cursor); setDescription(view, cursor); diff --git a/opentasks/src/main/java/org/dmfs/tasks/groupings/ByList.java b/opentasks/src/main/java/org/dmfs/tasks/groupings/ByList.java index c301c203f..23756aaa6 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/groupings/ByList.java +++ b/opentasks/src/main/java/org/dmfs/tasks/groupings/ByList.java @@ -21,13 +21,13 @@ import android.content.res.Resources; import android.database.Cursor; import android.graphics.Paint; -import android.os.Build.VERSION; import android.support.v4.app.FragmentActivity; import android.view.View; import android.view.View.OnClickListener; import android.widget.BaseExpandableListAdapter; import android.widget.TextView; +import org.dmfs.optional.NullSafe; import org.dmfs.tasks.QuickAddDialogFragment; import org.dmfs.tasks.R; import org.dmfs.tasks.contract.TaskContract.Instances; @@ -38,6 +38,7 @@ import org.dmfs.tasks.utils.ExpandableGroupDescriptor; import org.dmfs.tasks.utils.ExpandableGroupDescriptorAdapter; import org.dmfs.tasks.utils.ViewDescriptor; +import org.dmfs.tasks.widget.ProgressBackgroundView; /** @@ -120,23 +121,9 @@ public void populateView(View view, Cursor cursor, BaseExpandableListAdapter ada priorityView.setBackgroundResource(R.color.priority_green); } - if (VERSION.SDK_INT >= 11) - { - // update percentage background - View background = getView(view, R.id.percentage_background_view); - background.setPivotX(0); - Integer percentComplete = TaskFieldAdapters.PERCENT_COMPLETE.get(cursor); - if (percentComplete < 100) - { - background.setScaleX(percentComplete == null ? 0 : percentComplete / 100f); - background.setBackgroundResource(R.drawable.task_progress_background_shade); - } - else - { - background.setScaleX(1); - background.setBackgroundResource(R.drawable.complete_task_background_overlay); - } - } + new ProgressBackgroundView(getView(view, R.id.percentage_background_view)) + .update(new NullSafe<>(TaskFieldAdapters.PERCENT_COMPLETE.get(cursor))); + setColorBar(view, cursor); setDescription(view, cursor); setOverlay(view, cursor.getPosition(), cursor.getCount()); diff --git a/opentasks/src/main/java/org/dmfs/tasks/groupings/ByPriority.java b/opentasks/src/main/java/org/dmfs/tasks/groupings/ByPriority.java index fe2ddc6d7..c25b81be6 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/groupings/ByPriority.java +++ b/opentasks/src/main/java/org/dmfs/tasks/groupings/ByPriority.java @@ -21,13 +21,13 @@ import android.content.res.Resources; import android.database.Cursor; import android.graphics.Paint; -import android.os.Build.VERSION; import android.support.v4.app.FragmentActivity; import android.view.View; import android.view.View.OnClickListener; import android.widget.BaseExpandableListAdapter; import android.widget.TextView; +import org.dmfs.optional.NullSafe; import org.dmfs.provider.tasks.AuthorityUtil; import org.dmfs.tasks.QuickAddDialogFragment; import org.dmfs.tasks.R; @@ -41,6 +41,7 @@ import org.dmfs.tasks.utils.ExpandableGroupDescriptor; import org.dmfs.tasks.utils.ExpandableGroupDescriptorAdapter; import org.dmfs.tasks.utils.ViewDescriptor; +import org.dmfs.tasks.widget.ProgressBackgroundView; /** @@ -112,23 +113,9 @@ public void populateView(View view, Cursor cursor, BaseExpandableListAdapter ada priorityView.setBackgroundResource(R.color.priority_green); } - if (VERSION.SDK_INT >= 11) - { - // update percentage background - View background = getView(view, R.id.percentage_background_view); - background.setPivotX(0); - Integer percentComplete = TaskFieldAdapters.PERCENT_COMPLETE.get(cursor); - if (percentComplete < 100) - { - background.setScaleX(percentComplete == null ? 0 : percentComplete / 100f); - background.setBackgroundResource(R.drawable.task_progress_background_shade); - } - else - { - background.setScaleX(1); - background.setBackgroundResource(R.drawable.complete_task_background_overlay); - } - } + new ProgressBackgroundView(getView(view, R.id.percentage_background_view)) + .update(new NullSafe<>(TaskFieldAdapters.PERCENT_COMPLETE.get(cursor))); + setColorBar(view, cursor); setDescription(view, cursor); setOverlay(view, cursor.getPosition(), cursor.getCount()); diff --git a/opentasks/src/main/java/org/dmfs/tasks/groupings/ByProgress.java b/opentasks/src/main/java/org/dmfs/tasks/groupings/ByProgress.java index 3d86bfe76..7b02dc056 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/groupings/ByProgress.java +++ b/opentasks/src/main/java/org/dmfs/tasks/groupings/ByProgress.java @@ -21,11 +21,11 @@ import android.content.res.Resources; import android.database.Cursor; import android.graphics.Paint; -import android.os.Build.VERSION; import android.view.View; import android.widget.BaseExpandableListAdapter; import android.widget.TextView; +import org.dmfs.optional.NullSafe; import org.dmfs.tasks.R; import org.dmfs.tasks.contract.TaskContract.Instances; import org.dmfs.tasks.groupings.cursorloaders.ProgressCursorFactory; @@ -35,6 +35,7 @@ import org.dmfs.tasks.utils.ExpandableGroupDescriptor; import org.dmfs.tasks.utils.ExpandableGroupDescriptorAdapter; import org.dmfs.tasks.utils.ViewDescriptor; +import org.dmfs.tasks.widget.ProgressBackgroundView; /** @@ -105,23 +106,9 @@ public void populateView(View view, Cursor cursor, BaseExpandableListAdapter ada priorityView.setBackgroundResource(R.color.priority_green); } - if (VERSION.SDK_INT >= 11) - { - // update percentage background - View background = getView(view, R.id.percentage_background_view); - background.setPivotX(0); - Integer percentComplete = TaskFieldAdapters.PERCENT_COMPLETE.get(cursor); - if (percentComplete < 100) - { - background.setScaleX(percentComplete == null ? 0 : percentComplete / 100f); - background.setBackgroundResource(R.drawable.task_progress_background_shade); - } - else - { - background.setScaleX(1); - background.setBackgroundResource(R.drawable.complete_task_background_overlay); - } - } + new ProgressBackgroundView(getView(view, R.id.percentage_background_view)) + .update(new NullSafe<>(TaskFieldAdapters.PERCENT_COMPLETE.get(cursor))); + setColorBar(view, cursor); setDescription(view, cursor); setOverlay(view, cursor.getPosition(), cursor.getCount()); diff --git a/opentasks/src/main/java/org/dmfs/tasks/groupings/BySearch.java b/opentasks/src/main/java/org/dmfs/tasks/groupings/BySearch.java index b7ac86f4c..613039ba8 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/groupings/BySearch.java +++ b/opentasks/src/main/java/org/dmfs/tasks/groupings/BySearch.java @@ -22,7 +22,6 @@ import android.database.Cursor; import android.graphics.Paint; import android.graphics.Typeface; -import android.os.Build.VERSION; import android.text.format.DateUtils; import android.view.View; import android.view.View.OnClickListener; @@ -31,6 +30,7 @@ import android.widget.TextView; import android.widget.Toast; +import org.dmfs.optional.NullSafe; import org.dmfs.tasks.R; import org.dmfs.tasks.contract.TaskContract.Instances; import org.dmfs.tasks.contract.TaskContract.Tasks; @@ -44,6 +44,7 @@ import org.dmfs.tasks.utils.SearchHistoryDatabaseHelper.SearchHistoryColumns; import org.dmfs.tasks.utils.SearchHistoryHelper; import org.dmfs.tasks.utils.ViewDescriptor; +import org.dmfs.tasks.widget.ProgressBackgroundView; /** @@ -116,23 +117,9 @@ public void populateView(View view, Cursor cursor, BaseExpandableListAdapter ada priorityView.setBackgroundResource(R.color.priority_green); } - if (VERSION.SDK_INT >= 11) - { - // update percentage background - View background = getView(view, R.id.percentage_background_view); - background.setPivotX(0); - Integer percentComplete = TaskFieldAdapters.PERCENT_COMPLETE.get(cursor); - if (percentComplete < 100) - { - background.setScaleX(percentComplete == null ? 0 : percentComplete / 100f); - background.setBackgroundResource(R.drawable.task_progress_background_shade); - } - else - { - background.setScaleX(1); - background.setBackgroundResource(R.drawable.complete_task_background_overlay); - } - } + new ProgressBackgroundView(getView(view, R.id.percentage_background_view)) + .update(new NullSafe<>(TaskFieldAdapters.PERCENT_COMPLETE.get(cursor))); + setColorBar(view, cursor); setDescription(view, cursor); setOverlay(view, cursor.getPosition(), cursor.getCount()); diff --git a/opentasks/src/main/java/org/dmfs/tasks/groupings/ByStartDate.java b/opentasks/src/main/java/org/dmfs/tasks/groupings/ByStartDate.java index ff08c50f2..9b85efacf 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/groupings/ByStartDate.java +++ b/opentasks/src/main/java/org/dmfs/tasks/groupings/ByStartDate.java @@ -22,13 +22,13 @@ import android.database.Cursor; import android.graphics.Paint; import android.os.Build; -import android.os.Build.VERSION; import android.text.format.Time; import android.view.View; import android.widget.BaseExpandableListAdapter; import android.widget.ImageView; import android.widget.TextView; +import org.dmfs.optional.NullSafe; import org.dmfs.tasks.R; import org.dmfs.tasks.contract.TaskContract.Instances; import org.dmfs.tasks.groupings.cursorloaders.TimeRangeCursorFactory; @@ -41,6 +41,7 @@ import org.dmfs.tasks.utils.ExpandableGroupDescriptor; import org.dmfs.tasks.utils.ExpandableGroupDescriptorAdapter; import org.dmfs.tasks.utils.ViewDescriptor; +import org.dmfs.tasks.widget.ProgressBackgroundView; /** @@ -138,23 +139,9 @@ public void populateView(View view, Cursor cursor, BaseExpandableListAdapter ada priorityView.setBackgroundResource(R.color.priority_green); } - if (VERSION.SDK_INT >= 11) - { - // update percentage background - View background = getView(view, R.id.percentage_background_view); - background.setPivotX(0); - Integer percentComplete = TaskFieldAdapters.PERCENT_COMPLETE.get(cursor); - if (percentComplete < 100) - { - background.setScaleX(percentComplete == null ? 0 : percentComplete / 100f); - background.setBackgroundResource(R.drawable.task_progress_background_shade); - } - else - { - background.setScaleX(1); - background.setBackgroundResource(R.drawable.complete_task_background_overlay); - } - } + new ProgressBackgroundView(getView(view, R.id.percentage_background_view)) + .update(new NullSafe<>(TaskFieldAdapters.PERCENT_COMPLETE.get(cursor))); + setColorBar(view, cursor); setDescription(view, cursor); setOverlay(view, cursor.getPosition(), cursor.getCount()); diff --git a/opentasks/src/main/java/org/dmfs/tasks/widget/ProgressBackgroundView.java b/opentasks/src/main/java/org/dmfs/tasks/widget/ProgressBackgroundView.java new file mode 100644 index 000000000..1569263b4 --- /dev/null +++ b/opentasks/src/main/java/org/dmfs/tasks/widget/ProgressBackgroundView.java @@ -0,0 +1,61 @@ +/* + * Copyright 2017 dmfs GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dmfs.tasks.widget; + +import android.os.Build; +import android.view.View; + +import org.dmfs.optional.Optional; +import org.dmfs.tasks.R; + + +/** + * {@link SmartView} adapting any {@link View} so that its background can be updated with a progress in percent, + * so that it shows the value as a proportionate horizontal overlay. + * + * @author Gabor Keszthelyi + */ +public final class ProgressBackgroundView implements SmartView> +{ + private final View mBackgroundView; + + + public ProgressBackgroundView(View backgroundView) + { + mBackgroundView = backgroundView; + } + + + @Override + public void update(Optional percentComplete) + { + if (Build.VERSION.SDK_INT >= 11 && percentComplete.isPresent()) + { + mBackgroundView.setPivotX(0); + if (percentComplete.value() < 100) + { + mBackgroundView.setScaleX(percentComplete.value() / 100f); + mBackgroundView.setBackgroundResource(R.drawable.task_progress_background_shade); + } + else + { + mBackgroundView.setScaleX(1); + mBackgroundView.setBackgroundResource(R.drawable.complete_task_background_overlay); + } + } + } +} diff --git a/opentasks/src/main/java/org/dmfs/tasks/widget/SmartView.java b/opentasks/src/main/java/org/dmfs/tasks/widget/SmartView.java new file mode 100644 index 000000000..af9f8c27c --- /dev/null +++ b/opentasks/src/main/java/org/dmfs/tasks/widget/SmartView.java @@ -0,0 +1,36 @@ +/* + * Copyright 2017 dmfs GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dmfs.tasks.widget; + +import android.view.View; + + +/** + * Interface that can be implemented by any {@link View} that is 'smart', i.e. that takes care of how to update itself + * from data/model and may also initiate actions, when clicked for example, instead of calling back. + * + * @author Gabor Keszthelyi + */ +public interface SmartView +{ + + /** + * Called to update the View's content with the provided data. + */ + void update(D data); + +}