From 133df4c414399a9fac7e52f854bf8c49f1604670 Mon Sep 17 00:00:00 2001 From: geoffroy Date: Tue, 26 Jan 2016 17:50:19 -0500 Subject: [PATCH] About page update to show SDK version TaskDataAccess now implements AutoCloseable Correction of TaskDataAccess exception due to closing when SnackBar was present and tabs were fast switched Detection of initial scroll value to toggle arrows visibility (but there is still an issue with right arrow) --- .../donext/activities/AboutActivity.java | 9 +- .../donext/activities/MainActivity.java | 49 ++++++--- .../donext/database/TaskDataAccess.java | 17 ++- .../donext/fragments/TasksFragment.java | 103 +++++++++--------- .../src/main/res/layout/activity_about.xml | 11 +- DoNExt/app/src/main/res/values/strings.xml | 3 +- 6 files changed, 111 insertions(+), 81 deletions(-) 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 index a39c4b3..6f7e88a 100644 --- 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 @@ -1,5 +1,6 @@ package com.wismna.geoffroy.donext.activities; +import android.os.Build; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; @@ -14,7 +15,11 @@ public class AboutActivity extends AppCompatActivity { 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)); + TextView versionDonext = (TextView) findViewById(R.id.version_donext); + versionDonext.setText(getResources().getString(R.string.about_version_donext, BuildConfig.VERSION_NAME)); + + TextView versionAndroid = (TextView) findViewById(R.id.version_android); + versionAndroid.setText(getResources().getString(R.string.about_version_android, Build.VERSION.SDK_INT)); + } } 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 aae61de..93d4cf9 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 @@ -3,6 +3,7 @@ package com.wismna.geoffroy.donext.activities; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Point; +import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.design.widget.FloatingActionButton; @@ -44,6 +45,7 @@ public class MainActivity extends AppCompatActivity implements TasksFragment.Tas * The {@link ViewPager} that will host the section contents. */ private ViewPager mViewPager; + private TabLayout tabLayout; private List taskLists; @Override @@ -80,26 +82,20 @@ public class MainActivity extends AppCompatActivity implements TasksFragment.Tas PreferenceManager.getDefaultSharedPreferences(MainActivity.this); mViewPager.setCurrentItem(sharedPref.getInt("last_opened_tab", 0)); - // TODO: hide arrows on start when not needed - final TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); + 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); - } - }); + toggleTabLayoutArrows(tabLayout.getScrollX()); + // Handles scroll detection (only available for SDK version >=23) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + //tabLayout.setScrollIndicators(TabLayout.SCROLL_INDICATOR_LEFT | TabLayout.SCROLL_INDICATOR_RIGHT); + tabLayout.setOnScrollChangeListener(new View.OnScrollChangeListener() { + @Override + public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { + toggleTabLayoutArrows(scrollX); + } + }); + } // Hide or show new task floating button FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); @@ -218,6 +214,23 @@ public class MainActivity extends AppCompatActivity implements TasksFragment.Tas return (TaskRecyclerViewAdapter) recyclerView.getAdapter(); } + /** Toggles scrolling arrows visibility */ + private void toggleTabLayoutArrows(int scrollX){ + // 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); + + // TODO: hide right arrow when no need to scroll + // 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); + } + /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to * one of the sections/tabs/pages. diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/TaskDataAccess.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/TaskDataAccess.java index 8f377c0..bdce0cd 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/TaskDataAccess.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/database/TaskDataAccess.java @@ -16,7 +16,12 @@ import java.util.List; * Created by geoffroy on 15-11-27. * Data access class that handles Tasks */ -public class TaskDataAccess { +public class TaskDataAccess implements AutoCloseable { + public enum MODE { + READ, + WRITE + } + private SQLiteDatabase database; private DatabaseHelper dbHelper; private String[] taskColumns = { @@ -27,15 +32,21 @@ public class TaskDataAccess { private List priorities = new ArrayList<>(); public TaskDataAccess(Context context) { + this(context, MODE.READ); + } + public TaskDataAccess(Context context, MODE writeMode) { dbHelper = new DatabaseHelper(context); priorities.add(context.getString(R.string.new_task_priority_low)); priorities.add(context.getString(R.string.new_task_priority_normal)); priorities.add(context.getString(R.string.new_task_priority_high)); + + open(writeMode); } - public void open() throws SQLException { - database = dbHelper.getWritableDatabase(); + public void open(MODE writeMode) throws SQLException { + if (writeMode == MODE.WRITE) database = dbHelper.getWritableDatabase(); + else database = dbHelper.getReadableDatabase(); } public void close() { 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 8ee8d5d..9104206 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 @@ -48,7 +48,7 @@ public class TasksFragment extends Fragment implements private static final String TASK_LIST_ID = "task_list_id"; private long taskListId = -1; - private TaskDataAccess taskDataAccess; + //private TaskDataAccess taskDataAccess; private TaskRecyclerViewAdapter taskRecyclerViewAdapter; private View view; private RecyclerView recyclerView; @@ -86,8 +86,6 @@ public class TasksFragment extends Fragment implements view = inflater.inflate(R.layout.fragment_tasks, container, false); final Context context = view.getContext(); - taskDataAccess = new TaskDataAccess(view.getContext()); - taskDataAccess.open(); // Set the Recycler view recyclerView = (RecyclerView) view.findViewById(R.id.task_list_view); @@ -95,9 +93,11 @@ public class TasksFragment extends Fragment implements // Set RecyclerView Adapter SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext()); - taskRecyclerViewAdapter = new TaskRecyclerViewAdapter( - taskDataAccess.getAllTasks(taskListId), - Integer.valueOf(sharedPref.getString("pref_conf_task_layout", "1"))); + try (TaskDataAccess taskDataAccess = new TaskDataAccess(view.getContext())) { + taskRecyclerViewAdapter = new TaskRecyclerViewAdapter( + taskDataAccess.getAllTasks(taskListId), + Integer.valueOf(sharedPref.getString("pref_conf_task_layout", "1"))); + } recyclerView.setAdapter(taskRecyclerViewAdapter); // Set ItemTouch helper in RecyclerView to handle swipe move on elements @@ -166,16 +166,9 @@ public class TasksFragment extends Fragment implements } @Override - public void onDestroy() { - super.onDestroy(); + public void onPause() { + super.onPause(); if (snackbar != null) snackbar.dismiss(); - taskDataAccess.close(); - } - - @Override - public void onResume() { - super.onResume(); - taskDataAccess.open(); } /** Performs an action on a task: done, next or delete */ @@ -236,21 +229,21 @@ 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) - { - // Mark item as Done - case ItemTouchHelper.LEFT: - taskDataAccess.setDone(itemId); - break; - // Increase task cycle count - case ItemTouchHelper.RIGHT: - taskDataAccess.increaseCycle(task.getCycle(), itemId); - break; - case -1: - // Commit the changes to DB - taskDataAccess.deleteTask(itemId); + try (TaskDataAccess taskDataAccess = new TaskDataAccess(view.getContext(), TaskDataAccess.MODE.WRITE)) { + switch (direction) { + // Mark item as Done + case ItemTouchHelper.LEFT: + taskDataAccess.setDone(itemId); + break; + // Increase task cycle count + case ItemTouchHelper.RIGHT: + taskDataAccess.increaseCycle(task.getCycle(), itemId); + break; + case -1: + // Commit the changes to DB + taskDataAccess.deleteTask(itemId); + } } } }).show(); @@ -308,34 +301,36 @@ public class TasksFragment extends Fragment implements TaskList taskList = (TaskList) listSpinner.getSelectedItem(); // Add the task to the database - Task newTask = taskDataAccess.createOrUpdateTask(id, - nameText.getText().toString(), - descText.getText().toString(), - priorityRadio.getText().toString(), - taskList.getId()); + try (TaskDataAccess taskDataAccess = new TaskDataAccess(view.getContext(), TaskDataAccess.MODE.WRITE)) { + Task newTask = taskDataAccess.createOrUpdateTask(id, + nameText.getText().toString(), + descText.getText().toString(), + priorityRadio.getText().toString(), + taskList.getId()); - Bundle args = dialog.getArguments(); - // Should never happen because we will have to be on this tab to open the dialog - if (taskRecyclerViewAdapter == null) return; + Bundle args = dialog.getArguments(); + // Should never happen because we will have to be on this tab to open the dialog + if (taskRecyclerViewAdapter == null) return; - // Add the task - if (task == null) { - taskRecyclerViewAdapter.add(newTask, 0); - recyclerView.scrollToPosition(0); - } - // Update the task - else { - int position = args.getInt("position"); - // Check if task list was changed - if (task.getTaskListId() != taskList.getId()) - { - // Remove item from current tab - taskRecyclerViewAdapter.remove(position); - //UpdateCycleCount(); + // Add the task + if (task == null) { + taskRecyclerViewAdapter.add(newTask, 0); + recyclerView.scrollToPosition(0); + } + // Update the task + else { + int position = args.getInt("position"); + // Check if task list was changed + if (task.getTaskListId() != taskList.getId()) + { + // Remove item from current tab + taskRecyclerViewAdapter.remove(position); + //UpdateCycleCount(); - // Add it to the corresponding tab provided it is already instanciated - mAdapter.onTaskListChanged(newTask, listSpinner.getSelectedItemPosition()); - } else taskRecyclerViewAdapter.update(newTask, position); + // Add it to the corresponding tab provided it is already instantiated + mAdapter.onTaskListChanged(newTask, listSpinner.getSelectedItemPosition()); + } else taskRecyclerViewAdapter.update(newTask, position); + } } } diff --git a/DoNExt/app/src/main/res/layout/activity_about.xml b/DoNExt/app/src/main/res/layout/activity_about.xml index 1e16d29..b5ce4c7 100644 --- a/DoNExt/app/src/main/res/layout/activity_about.xml +++ b/DoNExt/app/src/main/res/layout/activity_about.xml @@ -1,5 +1,5 @@ - - + + diff --git a/DoNExt/app/src/main/res/values/strings.xml b/DoNExt/app/src/main/res/values/strings.xml index 578189b..7c6187e 100644 --- a/DoNExt/app/src/main/res/values/strings.xml +++ b/DoNExt/app/src/main/res/values/strings.xml @@ -90,5 +90,6 @@ TaskListActivity - Version %s + DoNext version %s + Android version %s