diff --git a/DoNExt/app/build.gradle b/DoNExt/app/build.gradle index 894dda8..082391d 100644 --- a/DoNExt/app/build.gradle +++ b/DoNExt/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "com.wismna.geoffroy.donext" minSdkVersion 15 targetSdkVersion 23 - versionCode 7 - versionName "0.7" + versionCode 8 + versionName "0.8" } buildTypes { release { diff --git a/DoNExt/app/src/main/AndroidManifest.xml b/DoNExt/app/src/main/AndroidManifest.xml index 2f858af..246d258 100644 --- a/DoNExt/app/src/main/AndroidManifest.xml +++ b/DoNExt/app/src/main/AndroidManifest.xml @@ -14,12 +14,13 @@ android:theme="@style/AppTheme.NoActionBar"> + + + + diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/AboutActivity.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/AboutActivity.java new file mode 100644 index 0000000..a39c4b3 --- /dev/null +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/AboutActivity.java @@ -0,0 +1,20 @@ +package com.wismna.geoffroy.donext.activities; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.widget.TextView; + +import com.wismna.geoffroy.donext.BuildConfig; +import com.wismna.geoffroy.donext.R; + +public class AboutActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_about); + + TextView version = (TextView) findViewById(R.id.version); + version.setText(getResources().getString(R.string.about_version, BuildConfig.VERSION_NAME)); + } +} diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java index aee6a12..aae61de 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java @@ -2,6 +2,7 @@ package com.wismna.geoffroy.donext.activities; import android.content.Intent; import android.content.SharedPreferences; +import android.graphics.Point; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.design.widget.FloatingActionButton; @@ -79,8 +80,26 @@ public class MainActivity extends AppCompatActivity implements TasksFragment.Tas PreferenceManager.getDefaultSharedPreferences(MainActivity.this); mViewPager.setCurrentItem(sharedPref.getInt("last_opened_tab", 0)); - TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); + // TODO: hide arrows on start when not needed + final TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(mViewPager); + tabLayout.setOnScrollChangeListener(new View.OnScrollChangeListener() { + @Override + public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { + // Hide left arrow when scrolled to the left + View leftArrow = findViewById(R.id.left_arrow); + if (scrollX <= 1) leftArrow.setVisibility(View.GONE); + else leftArrow.setVisibility(View.VISIBLE); + + // Hide right arrow when scrolled to the right + View rightArrow = findViewById(R.id.right_arrow); + Point size = new Point(); + getWindowManager().getDefaultDisplay().getSize(size); + if (scrollX == tabLayout.getChildAt(0).getMeasuredWidth() - size.x) + rightArrow.setVisibility(View.GONE); + else rightArrow.setVisibility(View.VISIBLE); + } + }); // Hide or show new task floating button FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); @@ -183,6 +202,12 @@ public class MainActivity extends AppCompatActivity implements TasksFragment.Tas startActivity(intent); } + /** Called when the user clicks the About button */ + public void openAbout(MenuItem menuItem) { + Intent intent = new Intent(this, AboutActivity.class); + startActivity(intent); + } + private TaskRecyclerViewAdapter getSpecificTabAdapter(int position) { TasksFragment taskFragment = (TasksFragment) mSectionsPagerAdapter.getRegisteredFragment(position); if (taskFragment == null) return null; diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java index 3a644f2..8ee8d5d 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java @@ -3,6 +3,7 @@ package com.wismna.geoffroy.donext.fragments; import android.app.Dialog; import android.content.Context; import android.content.SharedPreferences; +import android.content.res.Resources; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.design.widget.Snackbar; @@ -122,7 +123,7 @@ public class TasksFragment extends Fragment implements ((MainActivity.SectionsPagerAdapter) viewPager.getAdapter()).getAllItems(), TasksFragment.this); taskDialogFragment.setArguments(args); - taskDialogFragment.show(manager, "Edit task"); + taskDialogFragment.show(manager, getResources().getString(R.string.action_edit_task)); } }) ); @@ -131,27 +132,29 @@ public class TasksFragment extends Fragment implements recyclerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { + // isAdded is tested to prevent an IllegalStateException when fast switching between tabs + if (!isAdded()) return true; + Resources resources = getResources(); + // Update total cycle count int totalCycles = taskRecyclerViewAdapter.getCycleCount(); - if (totalCycles != 0) { - TextView totalCyclesView = (TextView) view.findViewById(R.id.total_task_cycles); - totalCyclesView.setText(String.valueOf(totalCycles + " cycles")); - } + TextView totalCyclesView = (TextView) view.findViewById(R.id.total_task_cycles); + if (totalCycles != 0) + totalCyclesView.setText(resources.getString(R.string.task_total_cycles, totalCycles, (totalCycles > 1 ? "s" : ""))); + else totalCyclesView.setText(""); // Update total tasks int totalTasks = taskRecyclerViewAdapter.getItemCount(); TextView totalTasksView = (TextView) view.findViewById(R.id.total_task_count); - // isAdded is to prevent an IllegalStateException when fast switching between tabs - if (totalTasks == 0 && isAdded()) totalTasksView.setText(getResources().getText(R.string.task_no_tasks)); - else totalTasksView.setText(String.valueOf(totalTasks + " task" + (totalTasks > 1 ? "s" : ""))); + if (totalTasks == 0) totalTasksView.setText(resources.getText(R.string.task_no_tasks)); + else totalTasksView.setText(resources.getString(R.string.task_total, totalTasks, (totalTasks > 1 ? "s" : ""))); // Update remaining tasks TextView remainingTasksView = (TextView) view.findViewById(R.id.remaining_task_count); NoScrollingLayoutManager layoutManager = (NoScrollingLayoutManager) recyclerView.getLayoutManager(); int remainingTaskCount = totalTasks - layoutManager.findLastVisibleItemPosition() - 1; if (remainingTaskCount == 0) remainingTasksView.setText(""); - else remainingTasksView.setText(String.valueOf( - remainingTaskCount + " more task" + (remainingTaskCount > 1 ? "s" : ""))); + else remainingTasksView.setText(resources.getString(R.string.task_remaining, remainingTaskCount, (remainingTaskCount > 1 ? "s" : ""))); //recyclerView.getViewTreeObserver().removeOnPreDrawListener(this); return true; @@ -180,28 +183,30 @@ public class TasksFragment extends Fragment implements final long itemId = taskRecyclerViewAdapter.getItemId(itemPosition); final Task task = taskRecyclerViewAdapter.getItem(itemPosition); String action = ""; + Resources resources = getResources(); + taskRecyclerViewAdapter.remove(itemPosition); switch (direction) { // Mark item as Done case ItemTouchHelper.LEFT: - action = "done"; + action = resources.getString(R.string.snackabar_action_done); break; // Increase task cycle count case ItemTouchHelper.RIGHT: - action = "nexted"; + action = resources.getString(R.string.snackabar_action_next); task.setCycle(task.getCycle() + 1); taskRecyclerViewAdapter.add(task, taskRecyclerViewAdapter.getItemCount()); break; case -1: - action = "deleted"; + action = resources.getString(R.string.snackabar_action_deleted); break; } // Setup the snack bar - snackbar = Snackbar.make(view, "Task " + action, Snackbar.LENGTH_LONG) - .setAction("Undo", new View.OnClickListener() { + 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 public void onClick(View v) { // Undo adapter changes @@ -231,6 +236,7 @@ public class TasksFragment extends Fragment implements // When clicked on undo, do not write to DB if (event == DISMISS_EVENT_ACTION) return; + // TODO: correct bug when fast switching between tabs // Commit the changes to DB switch (direction) { diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/helpers/TaskListTouchHelper.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/helpers/TaskListTouchHelper.java index f0ba787..627b959 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/helpers/TaskListTouchHelper.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/helpers/TaskListTouchHelper.java @@ -33,7 +33,7 @@ public class TaskListTouchHelper extends ItemTouchHelper.SimpleCallback { @Override public boolean isLongPressDragEnabled() { - return true; + return false; } @Override diff --git a/DoNExt/app/src/main/res/layout/activity_about.xml b/DoNExt/app/src/main/res/layout/activity_about.xml new file mode 100644 index 0000000..1e16d29 --- /dev/null +++ b/DoNExt/app/src/main/res/layout/activity_about.xml @@ -0,0 +1,15 @@ + + + + diff --git a/DoNExt/app/src/main/res/layout/activity_main.xml b/DoNExt/app/src/main/res/layout/activity_main.xml index ba2ab0d..7fc86c5 100644 --- a/DoNExt/app/src/main/res/layout/activity_main.xml +++ b/DoNExt/app/src/main/res/layout/activity_main.xml @@ -23,12 +23,33 @@ app:layout_scrollFlags="enterAlways" app:popupTheme="@style/AppTheme.PopupOverlay" /> - - + + + + + - - + - - - - - - - - - - - + + + + + - - + + - - - + android:layout_height="wrap_content" + android:hint="@string/new_task_description_hint" + android:gravity="top|start" + android:lines="3"/> + + + + + + + + + + + \ No newline at end of file diff --git a/DoNExt/app/src/main/res/layout/fragment_tasklists.xml b/DoNExt/app/src/main/res/layout/fragment_tasklists.xml index 84ee3a6..315207a 100644 --- a/DoNExt/app/src/main/res/layout/fragment_tasklists.xml +++ b/DoNExt/app/src/main/res/layout/fragment_tasklists.xml @@ -27,6 +27,7 @@ android:id="@+id/new_task_list_button" android:layout_width="80dp" android:layout_height="wrap_content" + style="@style/Widget.AppCompat.Button.Colored" android:text="@string/task_list_new_list_create"/> diff --git a/DoNExt/app/src/main/res/values/strings.xml b/DoNExt/app/src/main/res/values/strings.xml index 781a581..578189b 100644 --- a/DoNExt/app/src/main/res/values/strings.xml +++ b/DoNExt/app/src/main/res/values/strings.xml @@ -6,8 +6,12 @@ Edit lists About New task + Edit task Change layout - Settings + + + Left scroll arrow + Right scroll arrow New list name @@ -35,6 +39,16 @@ Details Yeah! No more tasks! + %1$d cycle%2$s + %1$d task%2$s + %1$d more task%2$s + + + Task %s + done + nexted + deleted + Undo Mark task as Done? @@ -74,4 +88,7 @@ 7 TaskListActivity + + + Version %s diff --git a/DoNExt/app/src/main/res/values/styles.xml b/DoNExt/app/src/main/res/values/styles.xml index 545b9c6..66831e5 100644 --- a/DoNExt/app/src/main/res/values/styles.xml +++ b/DoNExt/app/src/main/res/values/styles.xml @@ -17,4 +17,8 @@