diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml new file mode 100644 index 0000000..bc8736c --- /dev/null +++ b/.idea/assetWizardSettings.xml @@ -0,0 +1,47 @@ + + + + + + \ No newline at end of file diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 531e415..d2c15c1 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/app/build.gradle b/app/build.gradle index f8a0872..7935ce6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,7 +9,7 @@ android { minSdkVersion 19 targetSdkVersion 28 versionCode 27 - versionName "1.6" + versionName "1.7" } buildTypes { release { diff --git a/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java b/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java index 8abe79e..6a53894 100644 --- a/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java +++ b/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java @@ -75,22 +75,6 @@ public class MainActivity extends AppCompatActivity { startActivity(intent); } - /** Called when the user clicks on the Change Layout button */ - public void changeLayout(MenuItem item) { - SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); - SharedPreferences.Editor editor = sharedPref.edit(); - String layoutTypeString = sharedPref.getString("pref_conf_task_layout", "1"); - int layoutType = Integer.parseInt(layoutTypeString); - editor.putString("pref_conf_task_layout", String.valueOf(layoutType % 2 + 1)); - editor.apply(); - - // Update the ViewPagerAdapter to refresh all tabs - ViewPager viewPager = getMainFragmentViewPager(); - if (viewPager != null) { - Objects.requireNonNull(viewPager.getAdapter()).notifyDataSetChanged(); - } - } - /** Called when the user clicks the Edit Lists button */ public void openTaskLists(MenuItem menuItem) { FragmentManager fragmentManager = getSupportFragmentManager(); diff --git a/app/src/main/java/com/wismna/geoffroy/donext/activities/TodayActivity.java b/app/src/main/java/com/wismna/geoffroy/donext/activities/TodayActivity.java index bdddd32..5e194d2 100644 --- a/app/src/main/java/com/wismna/geoffroy/donext/activities/TodayActivity.java +++ b/app/src/main/java/com/wismna/geoffroy/donext/activities/TodayActivity.java @@ -1,15 +1,12 @@ package com.wismna.geoffroy.donext.activities; -import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; -import android.preference.PreferenceManager; import android.support.design.widget.FloatingActionButton; import android.support.v4.app.FragmentManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.Menu; -import android.view.MenuItem; import android.view.View; import android.widget.TextView; @@ -21,6 +18,7 @@ import com.wismna.geoffroy.donext.fragments.TodayFormDialogFragment; import org.joda.time.LocalDate; import java.util.Locale; +import java.util.Objects; public class TodayActivity extends ToolBarActivityBase implements TodayFormDialogFragment.TodayTaskListener { @@ -66,24 +64,10 @@ public class TodayActivity extends ToolBarActivityBase fab.setEnabled(true); try (TaskDataAccess taskDataAccess = new TaskDataAccess(this)) { RecyclerView recyclerView = findViewById(R.id.task_list_view); - ((TaskRecyclerViewAdapter)recyclerView.getAdapter()).setItems(taskDataAccess.getTodayTasks()); + ((TaskRecyclerViewAdapter)Objects.requireNonNull(recyclerView.getAdapter())).setItems(taskDataAccess.getTodayTasks()); } } - /** Called when the user clicks on the Change Layout button */ - public void changeLayout(MenuItem item) { - SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); - SharedPreferences.Editor editor = sharedPref.edit(); - String layoutTypeString = sharedPref.getString("pref_conf_task_layout", "1"); - int layoutType = Integer.parseInt(layoutTypeString); - editor.putString("pref_conf_task_layout", String.valueOf(layoutType % 2 + 1)); - editor.apply(); - - // TODO: find a less ugly way to refresh the list - // Update the ViewPagerAdapter to refresh all tabs - this.recreate(); - } - public void onNewTaskClick(View view) { TodayFormDialogFragment taskDialogFragment = TodayFormDialogFragment.newInstance(TodayActivity.this); diff --git a/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskRecyclerViewAdapter.java b/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskRecyclerViewAdapter.java index 966a991..b88a1bb 100644 --- a/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskRecyclerViewAdapter.java +++ b/app/src/main/java/com/wismna/geoffroy/donext/adapters/TaskRecyclerViewAdapter.java @@ -21,48 +21,53 @@ import java.util.List; /** * {@link RecyclerView.Adapter} that can display a {@link Task}. */ -public class TaskRecyclerViewAdapter extends RecyclerView.Adapter { +public class TaskRecyclerViewAdapter extends RecyclerView.Adapter { private List mValues; - private int viewType; private boolean mIsToday; + private boolean mIsHistory; - public TaskRecyclerViewAdapter(List items, int viewType, boolean isToday) { + public TaskRecyclerViewAdapter(List items, boolean isToday, boolean isHistory) { mValues = items; mIsToday = isToday; - this.viewType = viewType; + mIsHistory = isHistory; } @NonNull @Override - public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view; - switch (viewType) - { - case 2: - view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.fragment_task_detailed, parent, false); - return new DetailedViewHolder(view); - default: - view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.fragment_task_simple, parent, false); - return new SimpleViewHolder(view); - } + public StandardViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(viewType, parent, false); + return new StandardViewHolder(view); } @Override - public void onBindViewHolder(@NonNull final SimpleViewHolder holder, int position) { + public void onBindViewHolder(@NonNull final StandardViewHolder holder, int position) { // Set basic information holder.mItem = mValues.get(position); holder.mIdView.setText(String.valueOf(holder.mItem.getId())); holder.mCycleView.setText(String.valueOf(holder.mItem.getCycle())); holder.mTitleView.setText(holder.mItem.getName()); - // Set optional description - if (holder instanceof DetailedViewHolder) - ((DetailedViewHolder)holder).mDescriptionView.setText(holder.mItem.getDescription()); + holder.mDescriptionView.setText(holder.mItem.getDescription()); // Set task rendering - holder.mTitleView.setTypeface(Typeface.DEFAULT); - holder.mTitleView.setTextColor(Color.BLACK); + if (position > 0) { + holder.mTitleView.setTypeface(Typeface.DEFAULT); + holder.mTitleView.setTextColor(Color.BLACK); + } + + // Set priority + switch (holder.mItem.getPriority()) + { + case 0: + holder.mIconView.setImageResource(R.drawable.ic_low_priority_lightgray_24dp); + break; + case 2: + holder.mIconView.setImageResource(R.drawable.ic_priority_high_red_24dp); + break; + default: + holder.mIconView.setImageDrawable(null); + break; + } // Additional information will not be displayed in Today view if (mIsToday) return; @@ -74,21 +79,7 @@ public class TaskRecyclerViewAdapter extends RecyclerView.Adapter taskLists; Task task = taskRecyclerViewAdapter.getItem(position); if (viewPager != null) { - taskLists = ((SectionsPagerAdapter) viewPager.getAdapter()).getAllItems(); + taskLists = ((SectionsPagerAdapter) Objects.requireNonNull(viewPager.getAdapter())).getAllItems(); args.putInt("list", viewPager.getCurrentItem()); } else { @@ -215,7 +212,7 @@ public class TasksFragment extends Fragment implements // Update remaining tasks - only when needed TextView remainingTasksView = view.findViewById(R.id.remaining_task_count); NoScrollingLayoutManager noScrollingLayoutManager = (NoScrollingLayoutManager)layoutManager; - int remainingTaskCount = totalTasks - noScrollingLayoutManager.findLastVisibleItemPosition() - 1; + int remainingTaskCount = totalTasks - (noScrollingLayoutManager != null ? noScrollingLayoutManager.findLastVisibleItemPosition() : 1) - 1; if (remainingTaskCount == 0) remainingTasksView.setText(""); else remainingTasksView.setText(resources.getQuantityString(R.plurals.task_remaining, remainingTaskCount, remainingTaskCount)); @@ -223,7 +220,7 @@ public class TasksFragment extends Fragment implements } }); - recyclerView.addItemDecoration(new DividerItemDecoration(getActivity())); + //recyclerView.addItemDecoration(new DividerItemDecoration(getActivity())); return view; } @@ -319,8 +316,7 @@ public class TasksFragment extends Fragment implements } // Update the task else { - assert args != null; - int position = args.getInt("position"); + int position = args != null ? args.getInt("position") : 0; // Check if task list was changed if ((isTodayView && !isToday) || (!isTodayView && task.getTaskListId() != taskList.getId())) { @@ -356,7 +352,10 @@ public class TasksFragment extends Fragment implements confirmArgs.putInt("ItemPosition", itemPosition); confirmArgs.putInt("Direction", -1); confirmDialogFragment.setArguments(confirmArgs); - confirmDialogFragment.show(getFragmentManager(), title); + FragmentManager fragmentManager = getFragmentManager(); + if (fragmentManager != null) { + confirmDialogFragment.show(fragmentManager, title); + } } else { PerformTaskAction(itemPosition, -1); @@ -394,7 +393,10 @@ public class TasksFragment extends Fragment implements args.putInt("ItemPosition", itemPosition); args.putInt("Direction", direction); confirmDialogFragment.setArguments(args); - confirmDialogFragment.show(getFragmentManager(), title); + FragmentManager fragmentManager = getFragmentManager(); + if (fragmentManager != null) { + confirmDialogFragment.show(fragmentManager, title); + } } else PerformTaskAction(itemPosition, direction); } @@ -430,6 +432,7 @@ public class TasksFragment extends Fragment implements } // Setup the snack bar + // TODO: use the main activity view instead snackbar = Snackbar.make(view, resources.getString(R.string.snackabar_label, action), Snackbar.LENGTH_LONG) .setAction(resources.getString(R.string.snackabar_button), new View.OnClickListener() { @Override diff --git a/app/src/main/java/com/wismna/geoffroy/donext/helpers/TaskTouchHelper.java b/app/src/main/java/com/wismna/geoffroy/donext/helpers/TaskTouchHelper.java index 4152523..f0027bf 100644 --- a/app/src/main/java/com/wismna/geoffroy/donext/helpers/TaskTouchHelper.java +++ b/app/src/main/java/com/wismna/geoffroy/donext/helpers/TaskTouchHelper.java @@ -4,6 +4,7 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; +import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; import android.text.Layout; @@ -35,7 +36,7 @@ public class TaskTouchHelper extends ItemTouchHelper.SimpleCallback { } @Override - public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { + public int getSwipeDirs(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { // Allow both directions swiping on first item, only left on the others if (viewHolder.getAdapterPosition() == 0) return ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; @@ -43,17 +44,17 @@ public class TaskTouchHelper extends ItemTouchHelper.SimpleCallback { } @Override - public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { + public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { return false; } @Override - public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { mAdapter.onItemSwiped(viewHolder.getAdapterPosition(), direction); } @Override - public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, + public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { // Get RecyclerView item from the ViewHolder View itemView = viewHolder.itemView; diff --git a/app/src/main/java/com/wismna/geoffroy/donext/listeners/RecyclerItemClickListener.java b/app/src/main/java/com/wismna/geoffroy/donext/listeners/RecyclerItemClickListener.java index 22f3aba..325d996 100644 --- a/app/src/main/java/com/wismna/geoffroy/donext/listeners/RecyclerItemClickListener.java +++ b/app/src/main/java/com/wismna/geoffroy/donext/listeners/RecyclerItemClickListener.java @@ -1,6 +1,7 @@ package com.wismna.geoffroy.donext.listeners; import android.content.Context; +import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.GestureDetector; import android.view.MotionEvent; @@ -30,7 +31,7 @@ public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListen } @Override - public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { + public boolean onInterceptTouchEvent(@NonNull RecyclerView view, @NonNull MotionEvent e) { View childView = view.findChildViewUnder(e.getX(), e.getY()); if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { mListener.onItemClick(childView, view.getChildAdapterPosition(childView)); @@ -40,7 +41,7 @@ public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListen } @Override - public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { + public void onTouchEvent(@NonNull RecyclerView view, @NonNull MotionEvent motionEvent) { } diff --git a/app/src/main/java/com/wismna/geoffroy/donext/widgets/DividerItemDecoration.java b/app/src/main/java/com/wismna/geoffroy/donext/widgets/DividerItemDecoration.java index e2751b7..93ebc8d 100644 --- a/app/src/main/java/com/wismna/geoffroy/donext/widgets/DividerItemDecoration.java +++ b/app/src/main/java/com/wismna/geoffroy/donext/widgets/DividerItemDecoration.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.drawable.Drawable; +import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.View; @@ -34,7 +35,7 @@ public class DividerItemDecoration extends RecyclerView.ItemDecoration { }*/ @Override - public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { + public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); diff --git a/app/src/main/res/drawable/ic_low_priority_lightgray_24dp.xml b/app/src/main/res/drawable/ic_low_priority_lightgray_24dp.xml new file mode 100644 index 0000000..812517c --- /dev/null +++ b/app/src/main/res/drawable/ic_low_priority_lightgray_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_priority_high_red_24dp.xml b/app/src/main/res/drawable/ic_priority_high_red_24dp.xml new file mode 100644 index 0000000..b526720 --- /dev/null +++ b/app/src/main/res/drawable/ic_priority_high_red_24dp.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 1010560..b5dc49f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -19,7 +19,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end|bottom" - android:layout_margin="@dimen/fab_margin" + android:layout_margin="16dp" android:onClick="onNewTaskClick" android:src="@drawable/ic_add" /> diff --git a/app/src/main/res/layout/fragment_task_detailed.xml b/app/src/main/res/layout/fragment_task_detailed.xml index 0dab5c5..a0b821b 100644 --- a/app/src/main/res/layout/fragment_task_detailed.xml +++ b/app/src/main/res/layout/fragment_task_detailed.xml @@ -10,7 +10,7 @@ android:id="@+id/task_cycle" android:layout_width="30dp" android:layout_height="wrap_content" - android:paddingTop="10dp" + android:layout_margin="10dp" android:textAppearance="?attr/textAppearanceListItem" /> + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_tasks.xml b/app/src/main/res/layout/fragment_tasks.xml index c1e72ed..8bf512e 100644 --- a/app/src/main/res/layout/fragment_tasks.xml +++ b/app/src/main/res/layout/fragment_tasks.xml @@ -6,15 +6,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/task_select" > - - - + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index ab93660..7776e1f 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -2,30 +2,17 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".activities.MainActivity"> - - - \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 7c90b86..917ff1a 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,6 +2,7 @@ #3F51B5 #303F9F + #dde2ff #FF4081 @color/colorPrimaryDark diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0f986c9..3ef3cd8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -74,7 +74,7 @@ DoNext is a new kind of task manager, based on the premise that creating too many tasks is counterproductive. Instead, swipe tasks left and right to push them back to the bottom of your backlog to work on them at a later time! DoNext version %s Android version %d - https://github.com/wismna + https://wismna.github.io/DoNext/ Today @@ -84,7 +84,7 @@ Select tasks List name Sorry, your Android version is not supported. - Noting to do today + Nothing to do today Add some tasks there