diff --git a/app/build.gradle b/app/build.gradle
index a670b52..6ee06b2 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,6 +10,7 @@ android {
targetSdkVersion 24
versionCode 2
versionName "2.0"
+ vectorDrawables.useSupportLibrary = true
}
buildTypes {
release {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b8b1620..5cf9a2d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -12,7 +12,7 @@
android:supportsRtl="true"
android:theme="@style/AppTheme">
+ android:value="org.secuso.privacyfriendlybreakreminder.activities.old.BreakReminder" />
+ android:name=".activities.SplashActivity"
+ android:icon="@mipmap/splash_icon"
+ android:theme="@style/SplashTheme">
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/assets/exercises.sqlite b/app/src/main/assets/exercises.sqlite
index 6aa2396..c5a29e6 100644
Binary files a/app/src/main/assets/exercises.sqlite and b/app/src/main/assets/exercises.sqlite differ
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/ExerciseLocale.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/ExerciseLocale.java
new file mode 100644
index 0000000..0fdba78
--- /dev/null
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/ExerciseLocale.java
@@ -0,0 +1,30 @@
+package org.secuso.privacyfriendlybreakreminder;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Locale;
+
+/**
+ * This class saves the available languages for the exercises.
+ * @author Christopher Beckmann
+ */
+public class ExerciseLocale {
+
+ private static final HashSet AVAILABLE_LOCALE = new HashSet<>();
+
+ static {
+ AVAILABLE_LOCALE.addAll(
+ Arrays.asList(
+ "en", "de"
+ )
+ );
+ };
+
+ /**
+ * @return the available language. If the default language of the device is not available. {@code "en"} will be returned.
+ */
+ public static String getLocale() {
+ String locale = Locale.getDefault().getLanguage();
+ return AVAILABLE_LOCALE.contains(locale) ? locale : "en";
+ }
+}
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/AboutActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/AboutActivity.java
index 7a326e0..d50d10e 100644
--- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/AboutActivity.java
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/AboutActivity.java
@@ -17,12 +17,6 @@ public class AboutActivity extends AppCompatActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.about);
-
- ActionBar ab = getSupportActionBar();
- if(ab != null) {
- ab.setDisplayHomeAsUpEnabled(true);
- }
-
View mainContent = findViewById(R.id.main_content);
if (mainContent != null) {
mainContent.setAlpha(0);
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/EditExerciseSetActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/EditExerciseSetActivity.java
new file mode 100644
index 0000000..d959f26
--- /dev/null
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/EditExerciseSetActivity.java
@@ -0,0 +1,218 @@
+package org.secuso.privacyfriendlybreakreminder.activities;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.support.v4.content.AsyncTaskLoader;
+import android.support.v4.content.Loader;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.Toolbar;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import org.secuso.privacyfriendlybreakreminder.ExerciseLocale;
+import org.secuso.privacyfriendlybreakreminder.R;
+import org.secuso.privacyfriendlybreakreminder.activities.adapter.ExerciseSetAdapter;
+import org.secuso.privacyfriendlybreakreminder.database.SQLiteHelper;
+import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet;
+
+public class EditExerciseSetActivity extends AppCompatActivity implements android.support.v4.app.LoaderManager.LoaderCallbacks {
+
+ // extras
+ public static final String EXTRA_EXERCISE_SET_ID = "EXTRA_EXERCISE_SET_ID";
+ public static final String EXTRA_EXERCISE_SET_NAME = "EXTRA_EXERCISE_SET_NAME";
+
+ // UI
+ private TextView exerciseSetNameText;
+ private RecyclerView exerciseList;
+ private ProgressBar loadingSpinner;
+
+ private ExerciseSetAdapter exerciseSetAdapter;
+ private ActionBar actionBar;
+ private Toolbar toolbar;
+
+ // exercise set information
+ private long exerciseSetId = -1L;
+ private String exerciseSetName = "";
+ private boolean modificationsDone = false;
+
+ //methods
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_edit_exercise_set);
+
+ Intent i = getIntent();
+ exerciseSetId = i.getLongExtra(EXTRA_EXERCISE_SET_ID, -1L);
+ exerciseSetName = i.getStringExtra(EXTRA_EXERCISE_SET_NAME);
+
+ if(exerciseSetId < 0L || TextUtils.isEmpty(exerciseSetName)) {
+ // no valid exercise
+ super.onBackPressed();
+ }
+
+ initResources();
+
+ getSupportLoaderManager().initLoader(0, null, this);
+ }
+
+ private void initResources() {
+ toolbar = (Toolbar) findViewById(R.id.toolbar);
+ exerciseSetNameText = (TextView) findViewById(R.id.exercise_set_name);
+ exerciseList = (RecyclerView) findViewById(R.id.exercise_list);
+ exerciseSetAdapter = new ExerciseSetAdapter(this, null);
+ exerciseList.setAdapter(exerciseSetAdapter);
+ //exerciseList.setLayoutManager(new GridLayoutManager(this, 2));
+ exerciseList.setLayoutManager(new LinearLayoutManager(this));
+ loadingSpinner = (ProgressBar) findViewById(R.id.loading_spinner);
+
+ exerciseSetNameText.setText(exerciseSetName);
+ exerciseSetNameText.addTextChangedListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
+
+ @Override
+ public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
+
+ @Override
+ public void afterTextChanged(Editable editable) {
+ modificationsDone = true;
+ }
+ });
+
+ setupActionBar();
+ }
+
+ private void setupActionBar() {
+ if (getSupportActionBar() == null) {
+ setSupportActionBar(toolbar);
+ }
+
+ actionBar = getSupportActionBar();
+
+ if(actionBar != null) {
+ actionBar.setTitle(R.string.activity_title_edit_exercise_set);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setHomeAsUpIndicator(R.drawable.ic_close_white);
+ }
+ }
+
+ @Override
+ public Loader onCreateLoader(int id, final Bundle args) {
+ return new AsyncTaskLoader(this) {
+ @Override
+ public ExerciseSet loadInBackground() {
+ SQLiteHelper helper = new SQLiteHelper(getContext());
+
+ return helper.getExerciseListForSet((int)exerciseSetId, ExerciseLocale.getLocale());
+ }
+
+ @Override
+ protected void onStartLoading() {
+ loadingSpinner.setVisibility(View.VISIBLE);
+ forceLoad();
+ }
+
+ @Override
+ protected void onReset() {}
+ };
+ }
+
+ @Override
+ public void onLoadFinished(Loader loader, ExerciseSet set) {
+ loadingSpinner.animate().alpha(0.0f).setDuration(500).setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ loadingSpinner.setVisibility(View.GONE);
+ }
+ });
+
+ exerciseSetAdapter.updateData(set);
+ }
+
+ @Override
+ public void onLoaderReset(Loader loader) {}
+
+// @Override
+// protected void onResume() {
+// super.onResume();
+//
+// getSupportLoaderManager().restartLoader(0, null, this);
+// }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ if(modificationsDone) {
+ showDiscardDialog();
+ } else {
+ super.onBackPressed();
+ }
+ return true;
+ case R.id.save:
+ saveChanges();
+ super.onBackPressed();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void saveChanges() {
+ ExerciseSet set = exerciseSetAdapter.getExerciseSet();
+
+ // TODO: save changes to database
+ // man könnte den unterschied, der gespeichert werden muss rausfinden, indem man nur die änderungen speichert..
+ // man könnte auch einfach alle dateneinträge zu dem set löschen und neu eintragen
+ // man könnte das exerciseSet clonable machen und eine original kopie abspeichern und dann mit dem aus dem adapter vergleichen
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.menu_edit_exercise_sets, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public void onBackPressed() {
+ if(modificationsDone) {
+ showDiscardDialog();
+ } else {
+ super.onBackPressed();
+ }
+ }
+
+ private void showDiscardDialog() {
+ new AlertDialog.Builder(this)
+ .setPositiveButton(R.string.keep_editing, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ dialogInterface.dismiss();
+ }
+ })
+ .setNegativeButton(R.string.discard, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ EditExerciseSetActivity.super.onBackPressed();
+ }
+ })
+ .setMessage(R.string.dialog_discard_confirmation)
+ .create().show();
+ }
+}
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseActivity.java
index 4b938a9..92073dc 100644
--- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseActivity.java
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseActivity.java
@@ -26,7 +26,7 @@ public class ExerciseActivity extends AppCompatActivity {
if(isRunning) {
playButton.setImageResource(R.drawable.ic_pause_black_48dp);
} else {
- playButton.setImageResource(R.drawable.ic_play_arrow_black_48dp);
+ playButton.setImageResource(R.drawable.ic_play_arrow_black);
}
}
}
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseSetOverviewActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseSetOverviewActivity.java
deleted file mode 100644
index c2047e2..0000000
--- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseSetOverviewActivity.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.secuso.privacyfriendlybreakreminder.activities;
-
-import android.database.Cursor;
-import android.support.v4.content.AsyncTaskLoader;
-import android.support.v4.content.Loader;
-import android.support.v7.app.AppCompatActivity;
-import android.os.Bundle;
-import android.support.v7.widget.GridLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.widget.TextView;
-
-import org.secuso.privacyfriendlybreakreminder.R;
-import org.secuso.privacyfriendlybreakreminder.activities.adapter.ExerciseAdapter;
-import org.secuso.privacyfriendlybreakreminder.database.SQLiteHelper;
-
-public class ExerciseSetOverviewActivity extends AppCompatActivity implements android.support.v4.app.LoaderManager.LoaderCallbacks{
-
- private TextView exerciseSetName;
- private RecyclerView exerciseList;
-
- private ExerciseAdapter exerciseAdapter;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_exercise_set);
-
- initResources();
- }
-
- private void initResources() {
- exerciseSetName = (TextView) findViewById(R.id.exercise_set_name);
- exerciseList = (RecyclerView) findViewById(R.id.exercise_list);
- exerciseAdapter = new ExerciseAdapter(this, null);
- exerciseList.setAdapter(exerciseAdapter);
- exerciseList.setLayoutManager(new GridLayoutManager(this, 2));
-
- getSupportLoaderManager().initLoader(0, null, this);
- }
-
- @Override
- public Loader onCreateLoader(int id, final Bundle args) {
- return new AsyncTaskLoader(this) {
- @Override
- public Cursor loadInBackground() {
- SQLiteHelper helper = new SQLiteHelper(getContext());
- return helper.getExerciseCursorForSet(2, "de"); // TODO; get correct subset list
- }
-
- @Override
- protected void onStartLoading() {
- forceLoad();
- }
-
- @Override
- protected void onReset() {}
- };
- }
-
- @Override
- public void onLoadFinished(Loader loader, Cursor cursor) {
- cursor.moveToFirst();
- exerciseAdapter.changeCursor(cursor);
- }
-
- @Override
- public void onLoaderReset(Loader loader) {
- ((ExerciseAdapter) exerciseList.getAdapter()).changeCursor(null);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
-
- getSupportLoaderManager().restartLoader(0, null, this);
- }
-}
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/HelpActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/HelpActivity.java
index 38f1a60..b83a1d6 100644
--- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/HelpActivity.java
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/HelpActivity.java
@@ -7,36 +7,21 @@ import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import org.secuso.privacyfriendlybreakreminder.R;
+import org.secuso.privacyfriendlybreakreminder.activities.helper.BaseActivity;
-public class HelpActivity extends AppCompatActivity {
+public class HelpActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_help);
- setupActionBar();
- }
-
- private void setupActionBar() {
- ActionBar actionBar = getSupportActionBar();
- actionBar.setTitle(R.string.help);
- if (actionBar != null) {
- // Show the Up button in the action bar.
- actionBar.setDisplayHomeAsUpEnabled(true);
- }
}
@Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- // Respond to the action bar's Up/Home button
- case android.R.id.home:
- finish();
- return true;
- }
- return super.onOptionsItemSelected(item);
+ protected int getNavigationDrawerID() {
+ return R.id.nav_help;
}
public static class HelpFragment extends PreferenceFragment {
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ManageExerciseSetsActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ManageExerciseSetsActivity.java
new file mode 100644
index 0000000..de04c28
--- /dev/null
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ManageExerciseSetsActivity.java
@@ -0,0 +1,352 @@
+package org.secuso.privacyfriendlybreakreminder.activities;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.res.ColorStateList;
+import android.graphics.drawable.ColorDrawable;
+import android.support.annotation.NonNull;
+import android.support.design.widget.FloatingActionButton;
+import android.support.design.widget.TextInputEditText;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.app.DialogFragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.content.AsyncTaskLoader;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.content.Loader;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AlertDialog;
+import android.os.Bundle;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import org.secuso.privacyfriendlybreakreminder.ExerciseLocale;
+import org.secuso.privacyfriendlybreakreminder.R;
+import org.secuso.privacyfriendlybreakreminder.activities.adapter.ExerciseSetListAdapter;
+import org.secuso.privacyfriendlybreakreminder.activities.helper.BaseActivity;
+import org.secuso.privacyfriendlybreakreminder.database.SQLiteHelper;
+import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet;
+
+import java.util.List;
+
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+
+public class ManageExerciseSetsActivity extends BaseActivity implements android.support.v4.app.LoaderManager.LoaderCallbacks> {
+
+ private RecyclerView exerciseSetList;
+ private ProgressBar loadingSpinner;
+ private TextView noExerciseSetsText;
+ private FloatingActionButton fabButton;
+ private MenuItem toolbarDeleteIcon;
+
+ private ExerciseSetListAdapter exerciseSetAdapter;
+
+ private boolean deleteMode = false;
+ private ColorStateList fabDefaultBackgroundTint;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_manage_exercise_set);
+
+ initResources();
+ getSupportLoaderManager().initLoader(0, null, this);
+ }
+
+ private void initResources() {
+ exerciseSetAdapter = new ExerciseSetListAdapter(this, null);
+ exerciseSetList = (RecyclerView) findViewById(R.id.exercise_set_list);
+ loadingSpinner = (ProgressBar) findViewById(R.id.loading_spinner);
+ loadingSpinner.setAlpha(1.0f);
+ noExerciseSetsText = (TextView) findViewById(R.id.no_exercise_sets_text);
+ fabButton = (FloatingActionButton) findViewById(R.id.add_button);
+
+ fabDefaultBackgroundTint = fabButton.getBackgroundTintList();
+
+ exerciseSetList.setLayoutManager(new LinearLayoutManager(this));
+ exerciseSetList.setAdapter(exerciseSetAdapter);
+ }
+
+ @Override
+ public Loader> onCreateLoader(int id, final Bundle args) {
+ return new AsyncTaskLoader>(this) {
+ @Override
+ public List loadInBackground() {
+ SQLiteHelper helper = new SQLiteHelper(getContext());
+ return helper.getExerciseSetsWithExercises(ExerciseLocale.getLocale());
+ }
+
+ @Override
+ protected void onStartLoading() {
+ setLoading(true, false);
+ forceLoad();
+ }
+
+ @Override
+ protected void onReset() {}
+ };
+ }
+
+ @Override
+ public void onLoadFinished(Loader> loader, List data) {
+
+ boolean hasElements = data.size() > 0;
+
+ setLoading(false, hasElements);
+
+ exerciseSetAdapter.setData(data);
+ }
+
+ @Override
+ public void onLoaderReset(Loader> loader) {}
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ getSupportLoaderManager().restartLoader(0, null, this);
+ }
+
+ private void setLoading(boolean isLoading, boolean hasElements) {
+ if(isLoading) {
+ loadingSpinner.setVisibility(VISIBLE);
+ loadingSpinner.animate().alpha(1.0f).setDuration(1000).start();
+
+ noExerciseSetsText.setVisibility(GONE);
+ exerciseSetList.setVisibility(GONE);
+ } else {
+ loadingSpinner.animate().alpha(0.0f).setDuration(500).setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ loadingSpinner.setVisibility(GONE);
+ }
+ });
+
+ if(hasElements) {
+ noExerciseSetsText.setVisibility(GONE);
+ exerciseSetList.setVisibility(VISIBLE);
+ } else {
+ noExerciseSetsText.setVisibility(VISIBLE);
+ exerciseSetList.setVisibility(GONE);
+ }
+ }
+ }
+
+ @Override
+ protected void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+
+ mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ if(deleteMode)
+ disableDeleteMode();
+ }
+ });
+ }
+
+ public void setDrawerEnabled(final boolean enabled) {
+
+ int lockMode = enabled ?
+ DrawerLayout.LOCK_MODE_UNLOCKED :
+ DrawerLayout.LOCK_MODE_LOCKED_CLOSED;
+
+ mDrawerLayout.setDrawerLockMode(lockMode);
+
+ mDrawerToggle.setDrawerIndicatorEnabled(enabled);
+
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(!enabled);
+ actionBar.setDefaultDisplayHomeAsUpEnabled(!enabled);
+ actionBar.setDisplayShowHomeEnabled(enabled);
+ actionBar.setHomeButtonEnabled(enabled);
+ }
+
+ mDrawerToggle.syncState();
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ if(deleteMode)
+ disableDeleteMode();
+ else
+ finish();
+ return true;
+ case R.id.action_delete:
+ enableDeleteMode();
+ return true;
+ default:
+ Toast.makeText(this, "option selected", Toast.LENGTH_SHORT).show();
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ @Override
+ public boolean onSupportNavigateUp() {
+ onBackPressed();
+ return true;
+ }
+
+ @Override
+ public void onBackPressed() {
+ if(deleteMode)
+ disableDeleteMode();
+ else
+ super.onBackPressed();
+ }
+
+ @Override
+ protected int getNavigationDrawerID() {
+ return R.id.nav_manage_exercise_sets;
+ }
+
+ public void onClick(View view) {
+ switch(view.getId()) {
+ case R.id.add_button:
+ if(deleteMode) {
+ SQLiteHelper helper = new SQLiteHelper(this);
+
+ List deleteIds = exerciseSetAdapter.getDeleteIdList();
+
+ if(deleteIds.size() == 0) {
+ Toast.makeText(this, "Please select an item to delete.", Toast.LENGTH_SHORT).show();
+ } else {
+ for (Long l : deleteIds) {
+ helper.deleteExerciseSet(l);
+ }
+ disableDeleteMode();
+ getSupportLoaderManager().restartLoader(0, null, this);
+ }
+
+ } else {
+ AddExerciseSetDialogFragment dialog = new AddExerciseSetDialogFragment();
+ dialog.show(this.getSupportFragmentManager(), AddExerciseSetDialogFragment.TAG);
+ }
+ break;
+ }
+ }
+
+ public void enableDeleteMode() {
+ deleteMode = true;
+
+ setDrawerEnabled(false);
+
+ exerciseSetAdapter.enableDeleteMode();
+
+ if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
+ getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.middlegrey));
+ }
+ getSupportActionBar().setBackgroundDrawable(new ColorDrawable(ActivityCompat.getColor(this, R.color.middlegrey)));
+ getSupportActionBar().setTitle(R.string.activity_title_manage_exercise_sets);
+
+ if(toolbarDeleteIcon != null) {
+ toolbarDeleteIcon.setVisible(false);
+ }
+
+ fabButton.setBackgroundTintList(ColorStateList.valueOf(ActivityCompat.getColor(this, R.color.red)));
+ fabButton.setImageResource(R.drawable.ic_delete_white);
+ }
+
+ public void disableDeleteMode() {
+ deleteMode = false;
+
+ setDrawerEnabled(true);
+
+ exerciseSetAdapter.disableDeleteMode();
+
+ if(toolbarDeleteIcon != null) {
+ toolbarDeleteIcon.setVisible(true);
+ }
+ if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
+ getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.colorPrimary));
+ }
+ getSupportActionBar().setBackgroundDrawable(new ColorDrawable(ActivityCompat.getColor(this, R.color.colorPrimary)));
+ getSupportActionBar().setTitle(R.string.activity_title_manage_exercise_sets);
+
+ fabButton.setBackgroundTintList(fabDefaultBackgroundTint);
+ fabButton.setImageResource(R.drawable.ic_add_white_24dp);
+ }
+
+ public static class AddExerciseSetDialogFragment extends DialogFragment {
+
+ static final String TAG = AddExerciseSetDialogFragment.class.getSimpleName();
+
+ TextInputEditText exerciseSetName;
+ ManageExerciseSetsActivity activity;
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+
+ activity = (ManageExerciseSetsActivity)context;
+ }
+
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), 0);
+
+ LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(FragmentActivity.LAYOUT_INFLATER_SERVICE);
+ View v = inflater.inflate(R.layout.dialog_add_exercise_set, null);
+
+ exerciseSetName = (TextInputEditText) v.findViewById(R.id.dialog_add_exercise_set_name);
+
+ builder.setView(v);
+ builder.setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ String text = exerciseSetName.getText().toString();
+
+ if(TextUtils.isEmpty(text)) {
+ Toast.makeText(getActivity(), "Please specify a name.", Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ SQLiteHelper sqLiteHelper = new SQLiteHelper(getActivity());
+ long id = sqLiteHelper.addExerciseSet(text);
+
+ Intent intent = new Intent(getActivity(), EditExerciseSetActivity.class);
+ intent.putExtra(EditExerciseSetActivity.EXTRA_EXERCISE_SET_ID, id);
+ intent.putExtra(EditExerciseSetActivity.EXTRA_EXERCISE_SET_NAME, text);
+ startActivity(intent);
+
+ dismiss();
+ }
+ });
+ builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ dismiss();
+ }
+ });
+ builder.setTitle(R.string.dialog_add_exercise_set_title);
+
+ return builder.create();
+ }
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.menu_manage_exercise_sets, menu);
+ toolbarDeleteIcon = menu.findItem(R.id.action_delete);
+ return true;
+ }
+
+}
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/SplashActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/SplashActivity.java
new file mode 100644
index 0000000..5bfa318
--- /dev/null
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/SplashActivity.java
@@ -0,0 +1,35 @@
+package org.secuso.privacyfriendlybreakreminder.activities;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+
+import org.secuso.privacyfriendlybreakreminder.activities.tutorial.PrefManager;
+import org.secuso.privacyfriendlybreakreminder.activities.tutorial.TutorialActivity;
+
+/**
+ * Created by yonjuni on 22.10.16.
+ */
+
+public class SplashActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ Intent mainIntent = null;
+
+ PrefManager firstStartPref = new PrefManager(this);
+
+ if(firstStartPref.isFirstTimeLaunch()) {
+ mainIntent = new Intent(this, TutorialActivity.class);
+ } else {
+ mainIntent = new Intent(this, TimerActivity.class);
+ mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ }
+
+ SplashActivity.this.startActivity(mainIntent);
+ SplashActivity.this.finish();
+ }
+
+}
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/TimerActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/TimerActivity.java
index 24b4abd..b75f07d 100644
--- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/TimerActivity.java
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/TimerActivity.java
@@ -2,7 +2,6 @@ package org.secuso.privacyfriendlybreakreminder.activities;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -11,30 +10,39 @@ import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.res.Resources;
-import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.IBinder;
import android.preference.PreferenceManager;
import android.support.annotation.ColorRes;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.ContextCompat;
+import android.support.v4.content.Loader;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.LinearInterpolator;
+import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.NumberPicker;
import android.widget.ProgressBar;
+import android.widget.Spinner;
import android.widget.TextView;
+import org.secuso.privacyfriendlybreakreminder.ExerciseLocale;
import org.secuso.privacyfriendlybreakreminder.R;
+import org.secuso.privacyfriendlybreakreminder.activities.adapter.ExerciseSetSpinnerAdapter;
+import org.secuso.privacyfriendlybreakreminder.activities.helper.BaseActivity;
+import org.secuso.privacyfriendlybreakreminder.database.SQLiteHelper;
+import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet;
import org.secuso.privacyfriendlybreakreminder.service.TimerService;
+import java.util.LinkedList;
+import java.util.List;
import java.util.Locale;
-public class TimerActivity extends AppCompatActivity {
+public class TimerActivity extends BaseActivity implements android.support.v4.app.LoaderManager.LoaderCallbacks> {
private static final String TAG = TimerActivity.class.getSimpleName();
private static final String PREF_PICKER_SECONDS = TAG + ".PREF_PICKER_SECONDS";
private static final String PREF_PICKER_MINUTES = TAG + ".PREF_PICKER_MINUTES";
@@ -49,6 +57,8 @@ public class TimerActivity extends AppCompatActivity {
private NumberPicker minutesPicker;
private NumberPicker hoursPicker;
private LinearLayout pickerLayout;
+ private Spinner exerciseSetSpinner;
+ private ExerciseSetSpinnerAdapter exerciseSetAdapter;
// animation
private int mShortAnimationDuration;
@@ -109,6 +119,12 @@ public class TimerActivity extends AppCompatActivity {
setContentView(R.layout.activity_timer);
initResources();
+ getSupportLoaderManager().initLoader(0, null, this);
+ }
+
+ @Override
+ protected int getNavigationDrawerID() {
+ return R.id.nav_timer;
}
@Override
@@ -136,6 +152,8 @@ public class TimerActivity extends AppCompatActivity {
updateProgress(mTimerService.getInitialDuration());
}
updateUI();
+
+ getSupportLoaderManager().restartLoader(0, null, this);
}
@Override
@@ -160,15 +178,18 @@ public class TimerActivity extends AppCompatActivity {
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
mShortAnimationDuration = getResources().getInteger(android.R.integer.config_shortAnimTime);
+ exerciseSetAdapter = new ExerciseSetSpinnerAdapter(this, R.layout.layout_exercise_set, new LinkedList());
progressBar = (ProgressBar) findViewById(R.id.progressBar);
timerText = (TextView) findViewById(R.id.timerText);
playButton = (ImageButton) findViewById(R.id.button_playPause);
resetButton = (ImageButton) findViewById(R.id.button_reset);
-
+ exerciseSetSpinner = (Spinner) findViewById(R.id.spinner_choose_exercise_set);
+ exerciseSetSpinner.setAdapter(exerciseSetAdapter);
secondsPicker = (NumberPicker) findViewById(R.id.seconds_picker);
minutesPicker = (NumberPicker) findViewById(R.id.minutes_picker);
hoursPicker = (NumberPicker) findViewById(R.id.hours_picker);
+ pickerLayout = (LinearLayout) findViewById(R.id.picker_layout);
secondsPicker.setDisplayedValues(SECONDS_MINUTES);
secondsPicker.setMinValue(0);
@@ -189,7 +210,6 @@ public class TimerActivity extends AppCompatActivity {
setDividerColor(minutesPicker, R.color.transparent);
setDividerColor(hoursPicker, R.color.transparent);
- pickerLayout = (LinearLayout) findViewById(R.id.picker_layout);
}
private void updateProgress(long millisUntilFinished) {
@@ -222,9 +242,9 @@ public class TimerActivity extends AppCompatActivity {
case R.id.button_reset:
mTimerService.stopAndResetTimer();
break;
- case R.id.button_chooseExercise:
- startActivity(new Intent(this, ExerciseSetOverviewActivity.class));
- break;
+ //case R.id.button_chooseExercise:
+ // startActivity(new Intent(this, ManageExerciseSetsActivity.class));
+ // break;
}
updateUI();
@@ -338,7 +358,7 @@ public class TimerActivity extends AppCompatActivity {
if(isRunning) {
playButton.setImageResource(R.drawable.ic_pause_black_48dp);
} else {
- playButton.setImageResource(R.drawable.ic_play_arrow_black_48dp);
+ playButton.setImageResource(R.drawable.ic_play_arrow_black);
}
}
@@ -357,4 +377,31 @@ public class TimerActivity extends AppCompatActivity {
}
}
}
+
+ @Override
+ public Loader> onCreateLoader(int id, final Bundle args) {
+ return new AsyncTaskLoader>(this) {
+ @Override
+ public List loadInBackground() {
+ SQLiteHelper helper = new SQLiteHelper(getContext());
+ return helper.getExerciseSetsWithExercises(ExerciseLocale.getLocale());
+ }
+
+ @Override
+ protected void onStartLoading() {
+ forceLoad();
+ }
+
+ @Override
+ protected void onReset() {}
+ };
+ }
+
+ @Override
+ public void onLoadFinished(Loader> loader, List data) {
+ exerciseSetAdapter.updateData(data);
+ }
+
+ @Override
+ public void onLoaderReset(Loader> loader) {}
}
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseAdapter.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetAdapter.java
similarity index 65%
rename from app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseAdapter.java
rename to app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetAdapter.java
index 79a7ec2..4519337 100644
--- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseAdapter.java
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetAdapter.java
@@ -2,6 +2,7 @@ package org.secuso.privacyfriendlybreakreminder.activities.adapter;
import android.content.Context;
import android.database.Cursor;
+import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
import android.view.View;
@@ -10,18 +11,23 @@ import android.widget.ImageView;
import android.widget.TextView;
import org.secuso.privacyfriendlybreakreminder.R;
+import org.secuso.privacyfriendlybreakreminder.activities.ManageExerciseSetsActivity;
import org.secuso.privacyfriendlybreakreminder.activities.helper.CursorRecyclerViewAdapter;
import org.secuso.privacyfriendlybreakreminder.database.columns.ExerciseColumns;
import org.secuso.privacyfriendlybreakreminder.database.data.Exercise;
+import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet;
/**
* Created by Christopher Beckmann on 30.08.2017.
*/
-public class ExerciseAdapter extends CursorRecyclerViewAdapter {
+public class ExerciseSetAdapter extends RecyclerView.Adapter {
+ private ExerciseSet set;
+ private Context mContext;
- public ExerciseAdapter(Context context, Cursor cursor) {
- super(context, cursor, ExerciseColumns._ID);
+ public ExerciseSetAdapter(Context context, ExerciseSet set) {
+ this.mContext = context;
+ this.set = set;
}
@Override
@@ -31,10 +37,12 @@ public class ExerciseAdapter extends CursorRecyclerViewAdapter {
}
@Override
- public void onBindViewHolder(ViewHolder viewHolder, Cursor cursor) {
- final Exercise exercise = ExerciseColumns.fromCursor(cursor);
+ public void onBindViewHolder(ViewHolder holder, int position) {
+ if(set == null) return;
- ExerciseViewHolder vh = (ExerciseViewHolder) viewHolder;
+ final Exercise exercise = set.get(position);
+
+ ExerciseViewHolder vh = (ExerciseViewHolder) holder;
String imageID = exercise.getImageID();
String[] imageIDSplit = imageID.split(",");
@@ -54,6 +62,32 @@ public class ExerciseAdapter extends CursorRecyclerViewAdapter {
vh.section.setText(exercise.getSection());
}
+ @Override
+ public int getItemCount() {
+ if(set != null)
+ return set.size();
+ else
+ return 0;
+ }
+
+ public void updateData(ExerciseSet set) {
+ this.set = set;
+ notifyDataSetChanged();
+ }
+
+ public void add(Exercise e) {
+ if(set.add(e)) notifyItemInserted(set.size()-1);
+ }
+
+ public void remove(Exercise e) {
+ int index = set.indexOf(e);
+ if(set.remove(e)) notifyItemRemoved(index);
+ }
+
+ public ExerciseSet getExerciseSet() {
+ return set;
+ }
+
public class ExerciseViewHolder extends ViewHolder {
ImageView image;
@@ -70,7 +104,6 @@ public class ExerciseAdapter extends CursorRecyclerViewAdapter {
executionText = (TextView) itemView.findViewById(R.id.exercise_execution);
descriptionText = (TextView) itemView.findViewById(R.id.exercise_description);
section = (TextView) itemView.findViewById(R.id.exercise_section);
-
}
}
}
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetListAdapter.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetListAdapter.java
new file mode 100644
index 0000000..5f6e4a0
--- /dev/null
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetListAdapter.java
@@ -0,0 +1,188 @@
+package org.secuso.privacyfriendlybreakreminder.activities.adapter;
+
+import android.content.Intent;
+import android.support.v7.widget.CardView;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import org.secuso.privacyfriendlybreakreminder.R;
+import org.secuso.privacyfriendlybreakreminder.activities.EditExerciseSetActivity;
+import org.secuso.privacyfriendlybreakreminder.activities.ManageExerciseSetsActivity;
+import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet;
+
+import java.util.LinkedList;
+import java.util.List;
+
+
+/**
+ * Created by Christopher Beckmann on 04.09.2017.
+ */
+
+public class ExerciseSetListAdapter extends RecyclerView.Adapter {
+
+ List data = new LinkedList();
+ List deleteIds = new LinkedList<>();
+ ManageExerciseSetsActivity mContext = null;
+
+ private boolean deleteMode = false;
+
+ public ExerciseSetListAdapter(ManageExerciseSetsActivity context, List data) {
+ if(context == null) throw new IllegalArgumentException("Context may not be null");
+
+ mContext = context;
+
+ if(data != null) {
+ this.data = data;
+ }
+
+ setHasStableIds(true);
+ }
+
+ public void setData(List data) {
+ if(data != null) {
+ this.data = data;
+ }
+ notifyDataSetChanged();
+ }
+
+ public void enableDeleteMode() {
+ deleteMode = true;
+ notifyDataSetChanged();
+ }
+
+ public void disableDeleteMode() {
+ deleteMode = false;
+ notifyDataSetChanged();
+ }
+
+ public List getDeleteIdList() {
+ return deleteIds;
+ }
+
+ @Override
+ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+ final ExerciseSetViewHolder vh = (ExerciseSetViewHolder) holder;
+
+ final ExerciseSet set = data.get(position);
+
+ vh.deleteCheckBox.setVisibility(deleteMode ? View.VISIBLE : View.GONE);
+ vh.deleteCheckBox.setChecked(false);
+
+ vh.name.setText(set.getName());
+ vh.card.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ if(deleteMode) {
+
+ if(vh.deleteCheckBox.isChecked()) {
+ deleteIds.remove(set.getId());
+ vh.deleteCheckBox.setChecked(false);
+ } else {
+ if (!deleteIds.contains(set.getId())) deleteIds.add(set.getId());
+ vh.deleteCheckBox.setChecked(true);
+ }
+
+ } else {
+ Intent i = new Intent(mContext, EditExerciseSetActivity.class);
+ i.putExtra(EditExerciseSetActivity.EXTRA_EXERCISE_SET_ID, set.getId());
+ i.putExtra(EditExerciseSetActivity.EXTRA_EXERCISE_SET_NAME, set.getName());
+ mContext.startActivity(i);
+ }
+ }
+ });
+ vh.card.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View view) {
+ if(deleteMode) {
+
+ if(vh.deleteCheckBox.isChecked()) {
+ deleteIds.remove(set.getId());
+ vh.deleteCheckBox.setChecked(false);
+ } else {
+ if (!deleteIds.contains(set.getId())) deleteIds.add(set.getId());
+ vh.deleteCheckBox.setChecked(true);
+ }
+
+ } else {
+ mContext.enableDeleteMode();
+ }
+ return false;
+ }
+ });
+
+ vh.exerciseList.removeAllViews();
+
+ for(int i = 0; i < set.size(); ++i) {
+ View view = LayoutInflater.from(mContext).inflate(R.layout.layout_round_exercise_image, null, false);
+ ImageView image = (ImageView) view.findViewById(R.id.exercise_image);
+
+ String imageID = set.get(i).getImageID();
+ String[] imageIDSplit = imageID.split(",");
+
+ if(imageIDSplit.length > 1) {
+ imageID = imageIDSplit[0]; // only take the first image as a display image
+ }
+
+ int imageResID = mContext.getResources().getIdentifier(
+ "exercise_" + imageID,
+ "drawable",
+ mContext.getPackageName());
+
+ image.setImageResource(imageResID);
+ vh.exerciseList.addView(view);
+ }
+
+ if(set.size() == 0) {
+ vh.noExercisesText.setVisibility(View.VISIBLE);
+ } else {
+ vh.noExercisesText.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_exercise_set, parent, false);
+ return new ExerciseSetViewHolder(itemView);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ if(data != null) {
+ return data.get(position).getId();
+ }
+ return super.getItemId(position);
+ }
+
+ @Override
+ public int getItemCount() {
+ if(data != null) {
+ return data.size();
+ }
+ return 0;
+ }
+
+ public class ExerciseSetViewHolder extends RecyclerView.ViewHolder {
+
+ LinearLayout exerciseList;
+ TextView name;
+ CardView card;
+ TextView noExercisesText;
+ CheckBox deleteCheckBox;
+
+ public ExerciseSetViewHolder(View itemView) {
+ super(itemView);
+
+ card = (CardView) itemView.findViewById(R.id.exercise_set_card);
+ name = (TextView) itemView.findViewById(R.id.exercise_set_name);
+ exerciseList = (LinearLayout) itemView.findViewById(R.id.exercise_list);
+ noExercisesText = (TextView) itemView.findViewById(R.id.exercise_none_available);
+ deleteCheckBox = (CheckBox) itemView.findViewById(R.id.delete_check_box);
+ }
+ }
+}
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetSpinnerAdapter.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetSpinnerAdapter.java
new file mode 100644
index 0000000..f9b10e4
--- /dev/null
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetSpinnerAdapter.java
@@ -0,0 +1,126 @@
+package org.secuso.privacyfriendlybreakreminder.activities.adapter;
+
+import android.content.Context;
+import android.support.annotation.LayoutRes;
+import android.support.annotation.NonNull;
+import android.support.v7.widget.CardView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import org.secuso.privacyfriendlybreakreminder.R;
+import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet;
+
+import java.util.List;
+
+/**
+ * Created by Christopher Beckmann on 05.09.2017.
+ */
+
+public class ExerciseSetSpinnerAdapter extends ArrayAdapter {
+
+ private int resource;
+ private List sets;
+
+ public ExerciseSetSpinnerAdapter(@NonNull Context context, @LayoutRes int resource, List data) {
+ super(context, resource, data);
+ this.resource = resource;
+ this.sets = data;
+ }
+
+ @Override
+ public View getDropDownView(int position, View convertView, ViewGroup parent) {
+ return getCustomView(position, convertView, parent);
+ }
+
+ @Override @NonNull
+ public View getView(int position, View convertView, ViewGroup parent) {
+ return getCustomView(position, convertView, parent);
+ }
+
+ private View getCustomView(int position, View cv, ViewGroup parent) {
+
+ final ExerciseSet set = sets.get(position);
+
+ View row = null;
+ if(cv == null) {
+ LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ row = inflater.inflate(resource, parent, false);
+ } else {
+ row = cv;
+ }
+
+ if(set == null) return row;
+
+ CardView card = (CardView) row.findViewById(R.id.exercise_set_card);
+ TextView name = (TextView) row.findViewById(R.id.exercise_set_name);
+ LinearLayout exerciseList = (LinearLayout) row.findViewById(R.id.exercise_list);
+ TextView noExercisesText = (TextView) row.findViewById(R.id.exercise_none_available);
+
+ card.setClickable(false);
+ card.setLongClickable(false);
+
+ name.setText(set.getName());
+
+ exerciseList.removeAllViews();
+
+ for(int i = 0; i < set.size(); ++i) {
+ View view = LayoutInflater.from(getContext()).inflate(R.layout.layout_round_exercise_image, null, false);
+ ImageView image = (ImageView) view.findViewById(R.id.exercise_image);
+
+ String imageID = set.get(i).getImageID();
+ String[] imageIDSplit = imageID.split(",");
+
+ if(imageIDSplit.length > 1) {
+ imageID = imageIDSplit[0]; // only take the first image as a display image
+ }
+
+ int imageResID = getContext().getResources().getIdentifier(
+ "exercise_" + imageID,
+ "drawable",
+ getContext().getPackageName());
+
+ image.setImageResource(imageResID);
+ exerciseList.addView(view);
+ }
+
+ if(set.size() == 0) {
+ noExercisesText.setVisibility(View.VISIBLE);
+ } else {
+ noExercisesText.setVisibility(View.GONE);
+ }
+ //LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE);
+ //View row = inflater.inflate(resource, parent, false);
+
+// ImageView image = (ImageView) row.findViewById(R.id.browserIcon);
+// TextView label= (TextView) row.findViewById(R.id.browserName);
+
+ return row;
+ }
+
+ public void updateData(@NonNull List data) {
+ this.sets = data;
+ notifyDataSetChanged();
+ }
+
+ @Override
+ public int getCount() {
+ return this.sets.size();
+ }
+
+
+ @Override
+ public ExerciseSet getItem(int location) {
+ return this.sets.get(location);
+ }
+
+
+ @Override
+ public long getItemId(int position) {
+ return sets.get(position).getId();
+ }
+}
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/helper/BaseActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/helper/BaseActivity.java
new file mode 100644
index 0000000..c447937
--- /dev/null
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/helper/BaseActivity.java
@@ -0,0 +1,214 @@
+package org.secuso.privacyfriendlybreakreminder.activities.helper;
+
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.os.Handler;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceManager;
+import android.support.design.widget.NavigationView;
+import android.support.design.widget.NavigationView.OnNavigationItemSelectedListener;
+import android.support.v4.app.TaskStackBuilder;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v7.app.ActionBarDrawerToggle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.MenuItem;
+import android.view.View;
+
+import org.secuso.privacyfriendlybreakreminder.R;
+import org.secuso.privacyfriendlybreakreminder.activities.AboutActivity;
+import org.secuso.privacyfriendlybreakreminder.activities.HelpActivity;
+import org.secuso.privacyfriendlybreakreminder.activities.ManageExerciseSetsActivity;
+import org.secuso.privacyfriendlybreakreminder.activities.SettingsActivity;
+import org.secuso.privacyfriendlybreakreminder.activities.TimerActivity;
+import org.secuso.privacyfriendlybreakreminder.activities.tutorial.TutorialActivity;
+
+import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
+
+/**
+ * @author Chris
+ * @version 20161225
+ * This class is a parent class of all activities that can be accessed from the
+ * Navigation Drawer (example see MainActivity.java)
+ */
+public abstract class BaseActivity extends AppCompatActivity implements OnNavigationItemSelectedListener {
+
+ // delay to launch nav drawer item, to allow close animation to play
+ protected static final int NAVDRAWER_LAUNCH_DELAY = 250;
+ // fade in and fade out durations for the main content when switching between
+ // different Activities of the app through the Nav Drawer
+ protected static final int MAIN_CONTENT_FADEOUT_DURATION = 150;
+ protected static final int MAIN_CONTENT_FADEIN_DURATION = 250;
+
+ // Navigation drawer:
+ protected DrawerLayout mDrawerLayout;
+ private NavigationView mNavigationView;
+ protected Toolbar toolbar;
+ protected ActionBarDrawerToggle mDrawerToggle;
+
+ // Helper
+ private Handler mHandler;
+ protected SharedPreferences mSharedPreferences;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
+ mHandler = new Handler();
+
+ overridePendingTransition(0, 0);
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
+ mDrawerLayout.closeDrawer(GravityCompat.START);
+ } else {
+ super.onBackPressed();
+ }
+ }
+
+ protected abstract int getNavigationDrawerID();
+
+ @Override
+ public boolean onNavigationItemSelected(MenuItem item) {
+ final int itemId = item.getItemId();
+
+ return goToNavigationItem(itemId);
+ }
+
+ protected boolean goToNavigationItem(final int itemId) {
+
+ if(itemId == getNavigationDrawerID()) {
+ // just close drawer because we are already in this activity
+ mDrawerLayout.closeDrawer(GravityCompat.START);
+ return true;
+ }
+
+ // delay transition so the drawer can close
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ callDrawerItem(itemId);
+ }
+ }, NAVDRAWER_LAUNCH_DELAY);
+
+ mDrawerLayout.closeDrawer(GravityCompat.START);
+
+ selectNavigationItem(itemId);
+
+ // fade out the active activity
+ View mainContent = findViewById(R.id.main_content);
+ if (mainContent != null) {
+ mainContent.animate().alpha(0).setDuration(MAIN_CONTENT_FADEOUT_DURATION);
+ }
+ return true;
+ }
+
+ // set active navigation item
+ private void selectNavigationItem(int itemId) {
+ for(int i = 0 ; i < mNavigationView.getMenu().size(); i++) {
+ boolean b = itemId == mNavigationView.getMenu().getItem(i).getItemId();
+ mNavigationView.getMenu().getItem(i).setChecked(b);
+ }
+ }
+
+ /**
+ * Enables back navigation for activities that are launched from the NavBar. See
+ * {@code AndroidManifest.xml} to find out the parent activity names for each activity.
+ * @param intent
+ */
+ private void createBackStack(Intent intent) {
+ TaskStackBuilder builder = TaskStackBuilder.create(this);
+ builder.addNextIntentWithParentStack(intent);
+ builder.startActivities();
+ }
+
+ /**
+ * This method manages the behaviour of the navigation drawer
+ * Add your menu items (ids) to res/menu/activity_main_drawer.xml
+ * @param itemId Item that has been clicked by the user
+ */
+ private void callDrawerItem(final int itemId) {
+
+ Intent intent;
+
+ switch(itemId) {
+ case R.id.nav_timer:
+ intent = new Intent(this, TimerActivity.class);
+ intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
+ startActivity(intent);
+ break;
+ case R.id.nav_manage_exercise_sets:
+ intent = new Intent(this, ManageExerciseSetsActivity.class);
+ createBackStack(intent);
+ break;
+ case R.id.nav_tutorial:
+ intent = new Intent(this, TutorialActivity.class);
+ startActivity(intent);
+ break;
+ case R.id.nav_about:
+ intent = new Intent(this, AboutActivity.class);
+ createBackStack(intent);
+ break;
+ case R.id.nav_help:
+ intent = new Intent(this, HelpActivity.class);
+ createBackStack(intent);
+ break;
+ case R.id.nav_settings:
+ intent = new Intent(this, SettingsActivity.class);
+ intent.putExtra( PreferenceActivity.EXTRA_SHOW_FRAGMENT, SettingsActivity.GeneralPreferenceFragment.class.getName() );
+ intent.putExtra( PreferenceActivity.EXTRA_NO_HEADERS, true );
+ createBackStack(intent);
+ break;
+ default:
+ }
+ overridePendingTransition(0,0);
+ }
+
+ @Override
+ protected void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+
+ toolbar = (Toolbar) findViewById(R.id.toolbar);
+ if(getSupportActionBar() == null) {
+ setSupportActionBar(toolbar);
+ }
+
+ mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+ mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
+ mDrawerLayout.addDrawerListener(mDrawerToggle);
+ mDrawerToggle.syncState();
+
+ mNavigationView = (NavigationView) findViewById(R.id.nav_view);
+ mNavigationView.setNavigationItemSelectedListener(this);
+
+ showContent();
+ }
+
+ private void showContent() {
+ selectNavigationItem(getNavigationDrawerID());
+
+ View mainContent = findViewById(R.id.main_content);
+ if (mainContent != null) {
+ mainContent.setAlpha(0);
+ mainContent.animate().alpha(1).setDuration(MAIN_CONTENT_FADEIN_DURATION);
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ selectNavigationItem(getNavigationDrawerID());
+
+ View mainContent = findViewById(R.id.main_content);
+ if (mainContent != null) {
+ mainContent.setAlpha(0);
+ mainContent.animate().alpha(1).setDuration(MAIN_CONTENT_FADEIN_DURATION);
+ }
+ }
+}
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakActivity.java
similarity index 99%
rename from app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakActivity.java
rename to app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakActivity.java
index b9c82c9..28f73e8 100644
--- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakActivity.java
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakActivity.java
@@ -1,4 +1,4 @@
-package org.secuso.privacyfriendlybreakreminder.activities;
+package org.secuso.privacyfriendlybreakreminder.activities.old;
import android.content.SharedPreferences;
import android.os.CountDownTimer;
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakDeciderActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakDeciderActivity.java
similarity index 88%
rename from app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakDeciderActivity.java
rename to app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakDeciderActivity.java
index 4d4c014..d34cb83 100644
--- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakDeciderActivity.java
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakDeciderActivity.java
@@ -1,4 +1,4 @@
-package org.secuso.privacyfriendlybreakreminder.activities;
+package org.secuso.privacyfriendlybreakreminder.activities.old;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
@@ -7,6 +7,7 @@ import android.view.View;
import android.widget.Button;
import org.secuso.privacyfriendlybreakreminder.R;
+import org.secuso.privacyfriendlybreakreminder.activities.old.BreakActivity;
public class BreakDeciderActivity extends AppCompatActivity implements View.OnClickListener {
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakReminder.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakReminder.java
similarity index 98%
rename from app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakReminder.java
rename to app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakReminder.java
index 8c94346..2f7fa54 100644
--- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakReminder.java
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakReminder.java
@@ -1,4 +1,4 @@
-package org.secuso.privacyfriendlybreakreminder.activities;
+package org.secuso.privacyfriendlybreakreminder.activities.old;
import android.app.Activity;
import android.app.Dialog;
@@ -37,6 +37,9 @@ import android.widget.Spinner;
import android.widget.TextView;
import org.secuso.privacyfriendlybreakreminder.R;
+import org.secuso.privacyfriendlybreakreminder.activities.AboutActivity;
+import org.secuso.privacyfriendlybreakreminder.activities.HelpActivity;
+import org.secuso.privacyfriendlybreakreminder.activities.SettingsActivity;
import org.secuso.privacyfriendlybreakreminder.widget.*;
import java.util.Locale;
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseTypeActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/ExerciseTypeActivity.java
similarity index 97%
rename from app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseTypeActivity.java
rename to app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/ExerciseTypeActivity.java
index cd10348..8aedf79 100644
--- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseTypeActivity.java
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/ExerciseTypeActivity.java
@@ -1,4 +1,4 @@
-package org.secuso.privacyfriendlybreakreminder.activities;
+package org.secuso.privacyfriendlybreakreminder.activities.old;
import android.content.SharedPreferences;
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ProfileActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/ProfileActivity.java
similarity index 97%
rename from app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ProfileActivity.java
rename to app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/ProfileActivity.java
index 1653b1d..2e989c0 100644
--- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ProfileActivity.java
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/ProfileActivity.java
@@ -1,4 +1,4 @@
-package org.secuso.privacyfriendlybreakreminder.activities;
+package org.secuso.privacyfriendlybreakreminder.activities.old;
import android.content.Intent;
@@ -15,6 +15,7 @@ import android.widget.TextView;
import android.widget.Toast;
import org.secuso.privacyfriendlybreakreminder.R;
+import org.secuso.privacyfriendlybreakreminder.activities.old.ExerciseTypeActivity;
public class ProfileActivity extends AppCompatActivity implements View.OnClickListener {
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/PrefManager.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/PrefManager.java
new file mode 100644
index 0000000..7c5612e
--- /dev/null
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/PrefManager.java
@@ -0,0 +1,29 @@
+package org.secuso.privacyfriendlybreakreminder.activities.tutorial;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+/**
+ * Class structure taken from tutorial at http://www.androidhive.info/2016/05/android-build-intro-slider-app/
+ */
+public class PrefManager {
+ private SharedPreferences pref;
+
+ // Shared preferences file name
+ private static final String PREF_NAME = "welcome";
+
+ private static final String IS_FIRST_TIME_LAUNCH = "IsFirstTimeLaunch";
+
+ public PrefManager(Context context) {
+ pref = context.getSharedPreferences(PREF_NAME, 0);
+ }
+
+ public void setFirstTimeLaunch(boolean isFirstTime) {
+ pref.edit().putBoolean(IS_FIRST_TIME_LAUNCH, isFirstTime).apply();
+ }
+
+ public boolean isFirstTimeLaunch() {
+ return pref.getBoolean(IS_FIRST_TIME_LAUNCH, true);
+ }
+
+}
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/TutorialActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/TutorialActivity.java
new file mode 100644
index 0000000..0c5a891
--- /dev/null
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/TutorialActivity.java
@@ -0,0 +1,219 @@
+package org.secuso.privacyfriendlybreakreminder.activities.tutorial;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.view.PagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.support.v7.app.AppCompatActivity;
+import android.text.Html;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import org.secuso.privacyfriendlybreakreminder.R;
+import org.secuso.privacyfriendlybreakreminder.activities.TimerActivity;
+
+/**
+ * Class structure taken from tutorial at http://www.androidhive.info/2016/05/android-build-intro-slider-app/
+ *
+ * @author Karola Marky, Christopher Beckmann
+ * @version 20161214
+ */
+
+public class TutorialActivity extends AppCompatActivity {
+
+ private int[] layouts = new int[] {
+ R.layout.tutorial_slide1,
+ R.layout.tutorial_slide2,
+ R.layout.tutorial_slide3,
+ };
+
+ private ViewPager viewPager;
+ private MyViewPagerAdapter myViewPagerAdapter;
+ private LinearLayout dotsLayout;
+ private TextView[] dots;
+ private Button btnSkip, btnNext;
+ private PrefManager prefManager;
+
+ private static final String TAG = TutorialActivity.class.getSimpleName();
+ public static final String ACTION_SHOW_ANYWAYS = TAG + ".ACTION_SHOW_ANYWAYS";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Checking for first time launch - before calling setContentView()
+ prefManager = new PrefManager(this);
+ Intent i = getIntent();
+
+ // Making notification bar transparent
+ if(Build.VERSION.SDK_INT >=21) {
+ getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
+ }
+
+ setContentView(R.layout.activity_tutorial);
+
+ viewPager = (ViewPager) findViewById(R.id.view_pager);
+ dotsLayout = (LinearLayout) findViewById(R.id.layoutDots);
+ btnSkip = (Button) findViewById(R.id.btn_skip);
+ btnNext = (Button) findViewById(R.id.btn_next);
+
+ // adding bottom dots
+ addBottomDots(0);
+
+ // making notification bar transparent
+ changeStatusBarColor();
+
+ myViewPagerAdapter =new MyViewPagerAdapter();
+ viewPager.setAdapter(myViewPagerAdapter);
+ viewPager.addOnPageChangeListener(viewPagerPageChangeListener);
+
+ btnSkip.setOnClickListener(new View.OnClickListener()
+
+ {
+ @Override
+ public void onClick (View v){
+ launchHomeScreen();
+ }
+ });
+
+ btnNext.setOnClickListener(new View.OnClickListener()
+
+ {
+ @Override
+ public void onClick (View v){
+ // checking for last page
+ // if last page home screen will be launched
+ int current = getItem(+1);
+ if (current < layouts.length) {
+ // move to next screen
+ viewPager.setCurrentItem(current);
+ } else {
+ launchHomeScreen();
+ }
+ }
+ });
+}
+
+ private void addBottomDots(int currentPage) {
+ dots = new TextView[layouts.length];
+
+ int activeColor = ContextCompat.getColor(this, R.color.dot_light_screen);
+ int inactiveColor = ContextCompat.getColor(this, R.color.dot_dark_screen);
+
+ dotsLayout.removeAllViews();
+ for (int i = 0; i < dots.length; i++) {
+ dots[i] = new TextView(this);
+ dots[i].setText(Html.fromHtml("•"));
+ dots[i].setTextSize(35);
+ dots[i].setTextColor(inactiveColor);
+ dotsLayout.addView(dots[i]);
+ }
+
+ if (dots.length > 0)
+ dots[currentPage].setTextColor(activeColor);
+ }
+
+ private int getItem(int i) {
+ return viewPager.getCurrentItem() + i;
+ }
+
+ private void launchHomeScreen() {
+
+ if(prefManager.isFirstTimeLaunch()) {
+ Intent intent = new Intent(TutorialActivity.this, TimerActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ prefManager.setFirstTimeLaunch(false);
+ startActivity(intent);
+ }
+
+ finish();
+ }
+
+ // viewpager change listener
+ ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() {
+
+ @Override
+ public void onPageSelected(int position) {
+ addBottomDots(position);
+
+ // changing the next button text 'NEXT' / 'GOT IT'
+ if (position == layouts.length - 1) {
+ // last page. make button text to GOT IT
+ btnNext.setText(getString(R.string.okay));
+ btnSkip.setVisibility(View.GONE);
+ } else {
+ // still pages are left
+ btnNext.setText(getString(R.string.next));
+ btnSkip.setVisibility(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void onPageScrolled(int arg0, float arg1, int arg2) {
+
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int arg0) {
+
+ }
+ };
+
+ /**
+ * Making notification bar transparent
+ */
+ private void changeStatusBarColor() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ Window window = getWindow();
+ window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+ window.setStatusBarColor(Color.TRANSPARENT);
+ }
+ }
+
+/**
+ * View pager adapter
+ */
+public class MyViewPagerAdapter extends PagerAdapter {
+ private LayoutInflater layoutInflater;
+
+ public MyViewPagerAdapter() {
+ }
+
+ @Override
+ public View instantiateItem(ViewGroup container, int position) {
+ layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ View view = layoutInflater.inflate(layouts[position], container, false);
+ container.addView(view);
+
+ return view;
+ }
+
+ @Override
+ public int getCount() {
+ return layouts.length;
+ }
+
+ @Override
+ public boolean isViewFromObject(View view, Object obj) {
+ return view == obj;
+ }
+
+
+ @Override
+ public void destroyItem(ViewGroup container, int position, Object object) {
+ View view = (View) object;
+ container.removeView(view);
+ }
+}
+}
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/SQLiteHelper.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/SQLiteHelper.java
index 284a5dd..fec20cb 100644
--- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/SQLiteHelper.java
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/SQLiteHelper.java
@@ -1,6 +1,7 @@
package org.secuso.privacyfriendlybreakreminder.database;
+import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
@@ -18,6 +19,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
+import java.util.LinkedList;
import java.util.List;
public class SQLiteHelper extends SQLiteOpenHelper {
@@ -27,7 +29,7 @@ public class SQLiteHelper extends SQLiteOpenHelper {
private Context mContext;
private static final String DATABASE_NAME = "exercises.sqlite";
private static final String DATABASE_PATH = "/data/data/org.secuso.privacyfriendlybreakreminder/databases/";
- private static final int DATABASE_VERSION = 4;
+ private static final int DATABASE_VERSION = 2;
private static final String[] deleteQueryList = {
ExerciseColumns.SQL_DELETE_ENTRIES,
@@ -64,6 +66,76 @@ public class SQLiteHelper extends SQLiteOpenHelper {
}
+ public synchronized void deleteExerciseSet(long id) {
+ SQLiteDatabase database = getReadableDatabase();
+ database.delete(ExerciseSetColumns.TABLE_NAME, ExerciseSetColumns._ID + " = ?", new String[]{String.valueOf(id)});
+ database.close();
+ }
+
+ public synchronized long addExerciseSet(String name) {
+ SQLiteDatabase database = getReadableDatabase();
+
+ ContentValues cv = new ContentValues();
+ cv.put(ExerciseSetColumns.NAME, name);
+
+ return database.insert(ExerciseSetColumns.TABLE_NAME, null, cv);
+ }
+
+ public synchronized void addExerciseToExerciseSet(int exerciseSetId, int exerciseId) {
+ SQLiteDatabase database = getReadableDatabase();
+
+ ContentValues cv = new ContentValues();
+ cv.put(ExerciseSetColumns._ID, exerciseSetId);
+ cv.put(ExerciseColumns._ID, exerciseId);
+
+ database.insert("exercise_set_exercises", null, cv);
+ database.close();
+ }
+
+ public synchronized Cursor getExerciseSetsCursor() {
+ SQLiteDatabase database = getReadableDatabase();
+
+ return database.query(
+ ExerciseSetColumns.TABLE_NAME,
+ ExerciseSetColumns.PROJECTION,
+ null,
+ null,
+ null,
+ null,
+ null);
+ }
+
+ public synchronized List getExerciseSetsWithExercises(String language) {
+
+ List result = new LinkedList<>();
+
+ Cursor c = getExerciseSetsCursor();
+
+ if(c != null) {
+ c.moveToFirst();
+
+ while(!c.isAfterLast()) {
+
+ int id = c.getInt(c.getColumnIndex(ExerciseSetColumns._ID));
+
+ ExerciseSet set = getExerciseListForSet(id, language);
+
+ if(set != null) {
+ result.add(set);
+
+ } else {
+ ExerciseSet e = new ExerciseSet();
+ e.setId(id);
+ e.setName(c.getString(c.getColumnIndexOrThrow(ExerciseSetColumns.NAME)));
+ result.add(e);
+ }
+ c.moveToNext();
+ }
+ }
+ return result;
+ }
+
+
public synchronized Cursor getExerciseCursor(String language) {
SQLiteDatabase database = getReadableDatabase();
return database.rawQuery(buildQuery(false), new String[]{language});
@@ -78,27 +150,27 @@ public class SQLiteHelper extends SQLiteOpenHelper {
SQLiteDatabase database = getReadableDatabase();
String sql = "SELECT *\n" +
- "FROM exercise_set ES LEFT OUTER JOIN exercise_set_exercises ESE\n" +
- "\tON ES.exercise_set_id = ESE.exercise_set_id\n" +
- "LEFT OUTER JOIN exercises E\n" +
- "\tON ESE.exercise_id = E.exercise_id\n" +
- "LEFT OUTER JOIN exercises_local L\n" +
- "\tON E.exercise_id = L.exercise_id\n" +
- "WHERE ES.exercise_set_id = ? AND L.language = ?\n" +
- "ORDER BY ESE.exercise_id ASC";
+ "FROM "+ExerciseSetColumns.TABLE_NAME+" ES LEFT OUTER JOIN exercise_set_exercises ESE\n" +
+ "\tON ES."+ExerciseSetColumns._ID+" = ESE."+ExerciseSetColumns._ID+"\n" +
+ "LEFT OUTER JOIN "+ExerciseColumns.TABLE_NAME+" E\n" +
+ "\tON ESE."+ExerciseColumns._ID+" = E."+ExerciseColumns._ID+"\n" +
+ "LEFT OUTER JOIN "+ExerciseLocalColumns.TABLE_NAME+" L\n" +
+ "\tON E."+ExerciseColumns._ID+" = L."+ExerciseLocalColumns.EXERCISE_ID+"\n" +
+ "WHERE ES."+ExerciseSetColumns._ID+" = ? AND L."+ExerciseLocalColumns.LANGUAGE+" = ?\n" +
+ "ORDER BY ESE."+ExerciseColumns._ID+" ASC";
- String sql2 = "SELECT *\n" +
- "\tFROM (SELECT * \n" +
- "\t\t\tFROM (SELECT *\n" +
- "\t\t\t\tFROM "+ExerciseSetColumns.TABLE_NAME+" ES LEFT OUTER JOIN exercise_set_exercises ESE\n" +
- "\t\t\t\tON ES."+ExerciseSetColumns._ID+" = ESE."+ExerciseSetColumns._ID+"\n" +
- "\t\t\t\tWHERE ES."+ExerciseSetColumns._ID+" = ?\n" +
- "\t\t\t\tORDER BY ESE."+ExerciseColumns._ID+" ASC) ES_ESE \n" +
- "\t\t\tLEFT OUTER JOIN "+ExerciseColumns.TABLE_NAME+" E\n" +
- "\t\t\tON ES_ESE."+ExerciseColumns._ID+" = E."+ExerciseColumns._ID+") ES_ESE_E \n" +
- "\t\tLEFT OUTER JOIN "+ExerciseLocalColumns.TABLE_NAME+" L\n" +
- "\t\tON ES_ESE_E."+ExerciseColumns._ID+" = L."+ExerciseLocalColumns.EXERCISE_ID+"\n" +
- "\t\tWHERE L."+ExerciseLocalColumns.LANGUAGE+" = ?";
+// String sql2 = "SELECT *\n" +
+// "\tFROM (SELECT * \n" +
+// "\t\t\tFROM (SELECT *\n" +
+// "\t\t\t\tFROM "+ExerciseSetColumns.TABLE_NAME+" ES LEFT OUTER JOIN exercise_set_exercises ESE\n" +
+// "\t\t\t\tON ES."+ExerciseSetColumns._ID+" = ESE."+ExerciseSetColumns._ID+"\n" +
+// "\t\t\t\tWHERE ES."+ExerciseSetColumns._ID+" = ?\n" +
+// "\t\t\t\tORDER BY ESE."+ExerciseColumns._ID+" ASC) ES_ESE \n" +
+// "\t\t\tLEFT OUTER JOIN "+ExerciseColumns.TABLE_NAME+" E\n" +
+// "\t\t\tON ES_ESE."+ExerciseColumns._ID+" = E."+ExerciseColumns._ID+") ES_ESE_E \n" +
+// "\t\tLEFT OUTER JOIN "+ExerciseLocalColumns.TABLE_NAME+" L\n" +
+// "\t\tON ES_ESE_E."+ExerciseColumns._ID+" = L."+ExerciseLocalColumns.EXERCISE_ID+"\n" +
+// "\t\tWHERE L."+ExerciseLocalColumns.LANGUAGE+" = ?";
return database.rawQuery(sql, new String[]{String.valueOf(setId), language});
}
@@ -112,7 +184,9 @@ public class SQLiteHelper extends SQLiteOpenHelper {
c.moveToFirst();
- result = ExerciseSetColumns.fromCursor(c);
+ if(!c.isAfterLast()) {
+ result = ExerciseSetColumns.fromCursor(c);
+ }
while(!c.isAfterLast()) {
result.add(ExerciseColumns.fromCursor(c));
@@ -251,6 +325,8 @@ public class SQLiteHelper extends SQLiteOpenHelper {
OutputStream myOutput = null;
try {
// Open db packaged as asset as the input stream
+ mContext.deleteDatabase(DATABASE_NAME);
+
myInput = mContext.getAssets().open(DATABASE_NAME);
// Open the db in the application package context:
@@ -288,4 +364,5 @@ public class SQLiteHelper extends SQLiteOpenHelper {
}
}
}
+
}
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/columns/ExerciseSetColumns.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/columns/ExerciseSetColumns.java
index e14306b..b33cc68 100644
--- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/columns/ExerciseSetColumns.java
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/columns/ExerciseSetColumns.java
@@ -16,7 +16,7 @@ public final class ExerciseSetColumns {
public static final String TABLE_NAME = "exercise_set";
public static final String _ID = "exercise_set_id";
- public static final String NAME = "name";
+ public static final String NAME = "exercise_set_name";
public static final String[] PROJECTION = {
_ID,
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/data/Exercise.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/data/Exercise.java
index d43b898..ff5c0b2 100644
--- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/data/Exercise.java
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/data/Exercise.java
@@ -82,13 +82,13 @@ public class Exercise {
if(!(object instanceof Exercise)) return false;
Exercise other = (Exercise) object;
- return this.id != other.id
- || this.localId != other.localId
- || !this.section.equals(other.section)
- || !this.execution.equals(other.execution)
- || !this.description.equals(other.description)
- || !this.name.equals(other.name)
- || !this.imageID.equals(other.imageID)
- || !this.language.equals(other.language);
+ return this.id == other.id
+ && this.localId == other.localId
+ && this.section.equals(other.section)
+ && this.execution.equals(other.execution)
+ && this.description.equals(other.description)
+ && this.name.equals(other.name)
+ && this.imageID.equals(other.imageID)
+ && this.language.equals(other.language);
}
}
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/data/ExerciseSet.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/data/ExerciseSet.java
index acf1568..8766078 100644
--- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/data/ExerciseSet.java
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/data/ExerciseSet.java
@@ -8,17 +8,17 @@ import java.util.List;
*/
public class ExerciseSet {
- private int id = -1;
+ private long id = -1L;
private String name = null;
private List exercises = new ArrayList<>();
public ExerciseSet() {}
- public int getId() {
+ public long getId() {
return id;
}
- public void setId(int id) {
+ public void setId(long id) {
this.id = id;
}
@@ -30,20 +30,26 @@ public class ExerciseSet {
this.name = name;
}
- public void add(Exercise exercise) {
+ public boolean add(Exercise exercise) {
if(!exercises.contains(exercise)) {
exercises.add(exercise);
+ return true;
}
+ return false;
}
- public void remove(Exercise exercise) {
+ public boolean remove(Exercise exercise) {
if(exercises.contains(exercise)) {
exercises.remove(exercise);
+ return true;
}
+ return false;
}
- public void get(int index) {
- exercises.get(index);
+ public int indexOf(Exercise e) { return exercises.indexOf(e); }
+
+ public Exercise get(int index) {
+ return exercises.get(index);
}
public int size() {
diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/widget/AppWidget.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/widget/AppWidget.java
index 6203f57..f13b1c5 100644
--- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/widget/AppWidget.java
+++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/widget/AppWidget.java
@@ -10,7 +10,7 @@ import android.os.Bundle;
import android.preference.PreferenceManager;
import android.widget.RemoteViews;
-import org.secuso.privacyfriendlybreakreminder.activities.BreakReminder;
+import org.secuso.privacyfriendlybreakreminder.activities.old.BreakReminder;
import org.secuso.privacyfriendlybreakreminder.R;
/**
diff --git a/app/src/main/res/drawable-hdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_add_white_24dp.png
new file mode 100644
index 0000000..694179b
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_add_white_24dp.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_delete_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_delete_black_24dp.png
new file mode 100644
index 0000000..dbbb602
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_delete_black_24dp.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_home_black_48dp.png b/app/src/main/res/drawable-hdpi/ic_home_black_48dp.png
deleted file mode 100644
index 2e86cc2..0000000
Binary files a/app/src/main/res/drawable-hdpi/ic_home_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_info_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_info_black_24dp.png
deleted file mode 100644
index da56077..0000000
Binary files a/app/src/main/res/drawable-hdpi/ic_info_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_list_white_24dp.png
new file mode 100644
index 0000000..f8f7e7d
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_list_white_24dp.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_mode_edit_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_mode_edit_black_24dp.png
new file mode 100644
index 0000000..e531d72
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_mode_edit_black_24dp.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_notifications_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_notifications_black_24dp.png
deleted file mode 100644
index e200012..0000000
Binary files a/app/src/main/res/drawable-hdpi/ic_notifications_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_pause_black_48dp.png b/app/src/main/res/drawable-hdpi/ic_pause_black_48dp.png
deleted file mode 100644
index bb707ea..0000000
Binary files a/app/src/main/res/drawable-hdpi/ic_pause_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_play_arrow_black_48dp.png b/app/src/main/res/drawable-hdpi/ic_play_arrow_black_48dp.png
deleted file mode 100644
index 5345ee3..0000000
Binary files a/app/src/main/res/drawable-hdpi/ic_play_arrow_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_sync_black_24dp.png
deleted file mode 100644
index a5ebdbd..0000000
Binary files a/app/src/main/res/drawable-hdpi/ic_sync_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_add_white_24dp.png
new file mode 100644
index 0000000..3856041
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_add_white_24dp.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_delete_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_delete_black_24dp.png
new file mode 100644
index 0000000..999aa4c
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_delete_black_24dp.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_home_black_48dp.png b/app/src/main/res/drawable-mdpi/ic_home_black_48dp.png
deleted file mode 100644
index dcdcfc0..0000000
Binary files a/app/src/main/res/drawable-mdpi/ic_home_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/ic_info_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_info_black_24dp.png
deleted file mode 100644
index 5ef3dc0..0000000
Binary files a/app/src/main/res/drawable-mdpi/ic_info_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_list_white_24dp.png
new file mode 100644
index 0000000..15d8fc2
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_list_white_24dp.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_mode_edit_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_mode_edit_black_24dp.png
new file mode 100644
index 0000000..9efbaae
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_mode_edit_black_24dp.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_notifications_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_notifications_black_24dp.png
deleted file mode 100644
index b36475d..0000000
Binary files a/app/src/main/res/drawable-mdpi/ic_notifications_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/ic_pause_black_48dp.png b/app/src/main/res/drawable-mdpi/ic_pause_black_48dp.png
deleted file mode 100644
index 74068ea..0000000
Binary files a/app/src/main/res/drawable-mdpi/ic_pause_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/ic_play_arrow_black_48dp.png b/app/src/main/res/drawable-mdpi/ic_play_arrow_black_48dp.png
deleted file mode 100644
index f208795..0000000
Binary files a/app/src/main/res/drawable-mdpi/ic_play_arrow_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_sync_black_24dp.png
deleted file mode 100644
index 9685e8e..0000000
Binary files a/app/src/main/res/drawable-mdpi/ic_sync_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-v21/ic_menu_manage.xml b/app/src/main/res/drawable-v21/ic_menu_manage.xml
deleted file mode 100644
index c1be60b..0000000
--- a/app/src/main/res/drawable-v21/ic_menu_manage.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable-xhdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_add_white_24dp.png
new file mode 100644
index 0000000..67bb598
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_add_white_24dp.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_delete_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_delete_black_24dp.png
new file mode 100644
index 0000000..796ccd2
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_delete_black_24dp.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_home_black_48dp.png b/app/src/main/res/drawable-xhdpi/ic_home_black_48dp.png
deleted file mode 100644
index 04e2b26..0000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_home_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_info_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_info_black_24dp.png
deleted file mode 100644
index 46ed12a..0000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_info_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_list_white_24dp.png
new file mode 100644
index 0000000..2b72539
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_list_white_24dp.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_create_black_48dp.png b/app/src/main/res/drawable-xhdpi/ic_mode_edit_black_24dp.png
similarity index 100%
rename from app/src/main/res/drawable-mdpi/ic_create_black_48dp.png
rename to app/src/main/res/drawable-xhdpi/ic_mode_edit_black_24dp.png
diff --git a/app/src/main/res/drawable-xhdpi/ic_notifications_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_notifications_black_24dp.png
deleted file mode 100644
index 7de8581..0000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_notifications_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_pause_black_48dp.png b/app/src/main/res/drawable-xhdpi/ic_pause_black_48dp.png
deleted file mode 100644
index 792104f..0000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_pause_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_play_arrow_black_48dp.png b/app/src/main/res/drawable-xhdpi/ic_play_arrow_black_48dp.png
deleted file mode 100644
index d12d495..0000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_play_arrow_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_sync_black_24dp.png
deleted file mode 100644
index 860a5db..0000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_sync_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png
new file mode 100644
index 0000000..0fdced8
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_create_black_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_create_black_48dp.png
deleted file mode 100644
index 9160023..0000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_create_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_delete_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_delete_black_24dp.png
new file mode 100644
index 0000000..6d7cb81
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_delete_black_24dp.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_home_black_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_home_black_48dp.png
deleted file mode 100644
index d66401c..0000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_home_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_info_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_info_black_24dp.png
deleted file mode 100644
index a81eeb9..0000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_info_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png
new file mode 100644
index 0000000..4d2807e
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_create_black_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_mode_edit_black_24dp.png
similarity index 100%
rename from app/src/main/res/drawable-hdpi/ic_create_black_48dp.png
rename to app/src/main/res/drawable-xxhdpi/ic_mode_edit_black_24dp.png
diff --git a/app/src/main/res/drawable-xxhdpi/ic_notifications_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_notifications_black_24dp.png
deleted file mode 100644
index ab8a9c4..0000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_notifications_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_pause_black_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_pause_black_48dp.png
deleted file mode 100644
index dc63538..0000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_pause_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_play_arrow_black_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_play_arrow_black_48dp.png
deleted file mode 100644
index 1c57756..0000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_play_arrow_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_sync_black_24dp.png
deleted file mode 100644
index f799008..0000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_sync_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png
new file mode 100644
index 0000000..d64c22e
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_create_black_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_create_black_48dp.png
deleted file mode 100644
index a09d362..0000000
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_create_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_delete_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_delete_black_24dp.png
new file mode 100644
index 0000000..f2b75c3
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_delete_black_24dp.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_home_black_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_home_black_48dp.png
deleted file mode 100644
index 8fac2c3..0000000
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_home_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_info_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_info_black_24dp.png
deleted file mode 100644
index c8f86b9..0000000
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_info_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_list_white_24dp.png
new file mode 100644
index 0000000..2a6d3b0
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_list_white_24dp.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_create_black_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_mode_edit_black_24dp.png
similarity index 100%
rename from app/src/main/res/drawable-xhdpi/ic_create_black_48dp.png
rename to app/src/main/res/drawable-xxxhdpi/ic_mode_edit_black_24dp.png
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_notifications_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_notifications_black_24dp.png
deleted file mode 100644
index 86f89d7..0000000
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_notifications_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_pause_black_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_pause_black_48dp.png
deleted file mode 100644
index 66178aa..0000000
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_pause_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_play_arrow_black_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_play_arrow_black_48dp.png
deleted file mode 100644
index 904bbdb..0000000
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_play_arrow_black_48dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_sync_black_24dp.png
deleted file mode 100644
index b9f56f3..0000000
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_sync_black_24dp.png and /dev/null differ
diff --git a/app/src/main/res/drawable/bg_splash_screen.xml b/app/src/main/res/drawable/bg_splash_screen.xml
new file mode 100644
index 0000000..5ee60fc
--- /dev/null
+++ b/app/src/main/res/drawable/bg_splash_screen.xml
@@ -0,0 +1,11 @@
+
+
+
+
+ -
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_alarm_black.xml b/app/src/main/res/drawable/ic_alarm_black.xml
new file mode 100644
index 0000000..87e80a6
--- /dev/null
+++ b/app/src/main/res/drawable/ic_alarm_black.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_check_white.xml b/app/src/main/res/drawable/ic_check_white.xml
new file mode 100644
index 0000000..6541ee3
--- /dev/null
+++ b/app/src/main/res/drawable/ic_check_white.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_close_white.xml b/app/src/main/res/drawable/ic_close_white.xml
new file mode 100644
index 0000000..d11cc5c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_close_white.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_create_black.xml b/app/src/main/res/drawable/ic_create_black.xml
new file mode 100644
index 0000000..7575f1a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_create_black.xml
@@ -0,0 +1,4 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_delete_white.xml b/app/src/main/res/drawable/ic_delete_white.xml
new file mode 100644
index 0000000..2b8ab5b
--- /dev/null
+++ b/app/src/main/res/drawable/ic_delete_white.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_home_black.xml b/app/src/main/res/drawable/ic_home_black.xml
new file mode 100644
index 0000000..31e1a7a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_home_black.xml
@@ -0,0 +1,4 @@
+
+
+
diff --git a/app/src/main/res/drawable-v21/ic_info_black_24dp.xml b/app/src/main/res/drawable/ic_info_black.xml
similarity index 100%
rename from app/src/main/res/drawable-v21/ic_info_black_24dp.xml
rename to app/src/main/res/drawable/ic_info_black.xml
diff --git a/app/src/main/res/drawable/ic_list_black_24px.xml b/app/src/main/res/drawable/ic_list_black_24px.xml
new file mode 100644
index 0000000..5ab5d87
--- /dev/null
+++ b/app/src/main/res/drawable/ic_list_black_24px.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_list_white_24px.xml b/app/src/main/res/drawable/ic_list_white_24px.xml
new file mode 100644
index 0000000..f5ea0e9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_list_white_24px.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_tutorial.xml b/app/src/main/res/drawable/ic_menu_tutorial.xml
new file mode 100644
index 0000000..f8d18b2
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_tutorial.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_pause_black_48dp.xml b/app/src/main/res/drawable/ic_pause_black_48dp.xml
new file mode 100644
index 0000000..0887d64
--- /dev/null
+++ b/app/src/main/res/drawable/ic_pause_black_48dp.xml
@@ -0,0 +1,4 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_play_arrow_black.xml b/app/src/main/res/drawable/ic_play_arrow_black.xml
new file mode 100644
index 0000000..54a30db
--- /dev/null
+++ b/app/src/main/res/drawable/ic_play_arrow_black.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_settings_black_24dp.xml b/app/src/main/res/drawable/ic_settings_black_24dp.xml
new file mode 100644
index 0000000..ace746c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_settings_black_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_view_list_black_24px.xml b/app/src/main/res/drawable/ic_view_list_black_24px.xml
new file mode 100644
index 0000000..0873a39
--- /dev/null
+++ b/app/src/main/res/drawable/ic_view_list_black_24px.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/drawable/progress_circular.xml b/app/src/main/res/drawable/progress_circular.xml
new file mode 100644
index 0000000..d448196
--- /dev/null
+++ b/app/src/main/res/drawable/progress_circular.xml
@@ -0,0 +1,22 @@
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/circular_small.xml b/app/src/main/res/drawable/progress_circular_small.xml
similarity index 100%
rename from app/src/main/res/drawable/circular_small.xml
rename to app/src/main/res/drawable/progress_circular_small.xml
diff --git a/app/src/main/res/layout/activity_break.xml b/app/src/main/res/layout/activity_break.xml
index 000b62f..e1d5dbc 100644
--- a/app/src/main/res/layout/activity_break.xml
+++ b/app/src/main/res/layout/activity_break.xml
@@ -4,7 +4,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="15dp"
- tools:context="org.secuso.privacyfriendlybreakreminder.activities.BreakActivity">
+ tools:context="org.secuso.privacyfriendlybreakreminder.activities.old.BreakActivity">
+ tools:context=".activities.old.BreakDeciderActivity">
+ app:headerLayout="@layout/nav_header"
+ app:menu="@menu/nav_drawer" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_edit_exercise_set.xml b/app/src/main/res/layout/activity_edit_exercise_set.xml
new file mode 100644
index 0000000..447584b
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit_exercise_set.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_exercise.xml b/app/src/main/res/layout/activity_exercise.xml
index 00ec4a7..d398027 100644
--- a/app/src/main/res/layout/activity_exercise.xml
+++ b/app/src/main/res/layout/activity_exercise.xml
@@ -23,7 +23,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
- app:srcCompat="@drawable/ic_play_arrow_black_48dp" />
+ app:srcCompat="@drawable/ic_play_arrow_black" />
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/activity_help.xml b/app/src/main/res/layout/activity_help.xml
index 8c60bd9..e9d21e4 100644
--- a/app/src/main/res/layout/activity_help.xml
+++ b/app/src/main/res/layout/activity_help.xml
@@ -41,6 +41,6 @@
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
- app:menu="@menu/activity_break_reminder_drawer" />
+ app:menu="@menu/nav_drawer" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_manage_exercise_set.xml b/app/src/main/res/layout/activity_manage_exercise_set.xml
new file mode 100644
index 0000000..ff54d8b
--- /dev/null
+++ b/app/src/main/res/layout/activity_manage_exercise_set.xml
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_timer.xml b/app/src/main/res/layout/activity_timer.xml
index 5d1f4be..faa97f3 100644
--- a/app/src/main/res/layout/activity_timer.xml
+++ b/app/src/main/res/layout/activity_timer.xml
@@ -1,170 +1,226 @@
-
+ android:fitsSystemWindows="true"
+ tools:openDrawer="start">
-
+
-
+
-
+
-
+
+
-
-
-
+ android:layout_marginBottom="8dp"
+ android:layout_marginRight="24dp"
+ android:layout_marginTop="16dp"
+ android:clickable="true"
+ android:onClick="onClick"
+ android:src="@drawable/ic_list_white_24dp"
+ android:visibility="gone"
+ app:fabSize="mini"
+ app:layout_constraintBottom_toTopOf="@+id/relativeLayout"
+ app:layout_constraintRight_toRightOf="parent"
+ app:layout_constraintTop_toTopOf="@id/spinner_choose_exercise_set"
+ app:layout_constraintVertical_bias="0.0" /> -->
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:onClick="onClick"
+ android:layout_height="wrap_content"
+ app:srcCompat="@drawable/ic_replay_black_48dp"
+ android:hapticFeedbackEnabled="true"
+ android:tint="@color/darkblue"
+ android:background="?android:selectableItemBackgroundBorderless"
+ android:layout_marginTop="8dp"
+ app:layout_constraintTop_toBottomOf="@+id/relativeLayout"
+ android:layout_marginRight="8dp"
+ app:layout_constraintRight_toRightOf="@+id/relativeLayout"
+ android:layout_marginLeft="8dp"
+ app:layout_constraintLeft_toLeftOf="@+id/relativeLayout"
+ app:layout_constraintHorizontal_bias="0.332"
+ android:layout_marginStart="8dp"
+ android:layout_marginEnd="8dp"
+ app:layout_constraintBottom_toBottomOf="parent"
+ android:layout_marginBottom="8dp" />
-
+ android:onClick="onClick"
+ android:background="?android:selectableItemBackgroundBorderless"
+ android:hapticFeedbackEnabled="true"
+ android:scaleType="fitXY"
+ android:tint="@color/darkblue"
+ app:srcCompat="@drawable/ic_play_arrow_black"
+ android:layout_marginRight="8dp"
+ app:layout_constraintRight_toRightOf="@+id/relativeLayout"
+ android:layout_marginTop="8dp"
+ app:layout_constraintTop_toBottomOf="@+id/relativeLayout"
+ android:layout_marginLeft="8dp"
+ app:layout_constraintLeft_toLeftOf="@+id/relativeLayout"
+ app:layout_constraintHorizontal_bias="0.654"
+ android:layout_marginStart="8dp"
+ android:layout_marginEnd="8dp"
+ app:layout_constraintBottom_toBottomOf="parent"
+ android:layout_marginBottom="8dp" />
-
+
-
+
-
-
-
-
-
-
-
-
+ android:layout_height="match_parent"
+ android:layout_gravity="start"
+ android:fitsSystemWindows="true"
+ app:headerLayout="@layout/nav_header"
+ app:menu="@menu/nav_drawer" />
-
-
-
+
diff --git a/app/src/main/res/layout/activity_tutorial.xml b/app/src/main/res/layout/activity_tutorial.xml
new file mode 100644
index 0000000..8b5cb57
--- /dev/null
+++ b/app/src/main/res/layout/activity_tutorial.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/content_break_reminder.xml b/app/src/main/res/layout/content_break_reminder.xml
index 44c683f..30b35d3 100644
--- a/app/src/main/res/layout/content_break_reminder.xml
+++ b/app/src/main/res/layout/content_break_reminder.xml
@@ -10,7 +10,7 @@
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
- tools:context="org.secuso.privacyfriendlybreakreminder.activities.BreakReminder"
+ tools:context="org.secuso.privacyfriendlybreakreminder.activities.old.BreakReminder"
tools:showIn="@layout/app_bar_break_reminder">
diff --git a/app/src/main/res/layout/dialog_add_exercise_set.xml b/app/src/main/res/layout/dialog_add_exercise_set.xml
new file mode 100644
index 0000000..0262e33
--- /dev/null
+++ b/app/src/main/res/layout/dialog_add_exercise_set.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_exercise.xml b/app/src/main/res/layout/layout_exercise.xml
index 0448b91..6f86842 100644
--- a/app/src/main/res/layout/layout_exercise.xml
+++ b/app/src/main/res/layout/layout_exercise.xml
@@ -16,11 +16,11 @@
android:text="Name"
android:textAlignment="viewStart"
android:textStyle="bold"
- app:layout_constraintLeft_toRightOf="@+id/cardView2"
- app:layout_constraintTop_toTopOf="@+id/cardView2" />
+ app:layout_constraintLeft_toRightOf="@+id/exercise_image_card"
+ app:layout_constraintTop_toTopOf="@+id/exercise_image_card" />
+ android:padding="0dp">
@@ -27,40 +29,77 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
+
+
+
+
-
-
+ app:layout_constraintTop_toTopOf="parent" />
-
-
+
+
+
+
diff --git a/app/src/main/res/layout/layout_round_exercise_image.xml b/app/src/main/res/layout/layout_round_exercise_image.xml
new file mode 100644
index 0000000..ea8b9c2
--- /dev/null
+++ b/app/src/main/res/layout/layout_round_exercise_image.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_toolbar.xml b/app/src/main/res/layout/layout_toolbar.xml
new file mode 100644
index 0000000..def7a29
--- /dev/null
+++ b/app/src/main/res/layout/layout_toolbar.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/nav_header_break_reminder.xml b/app/src/main/res/layout/nav_header.xml
similarity index 69%
rename from app/src/main/res/layout/nav_header_break_reminder.xml
rename to app/src/main/res/layout/nav_header.xml
index 1417c47..8121887 100644
--- a/app/src/main/res/layout/nav_header_break_reminder.xml
+++ b/app/src/main/res/layout/nav_header.xml
@@ -2,38 +2,39 @@
+ android:src="@mipmap/ic_drawer_logo"/>
+ android:layout_centerVertical="true"
+ android:layout_toEndOf="@+id/imageView" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/tutorial_slide1.xml b/app/src/main/res/layout/tutorial_slide1.xml
new file mode 100644
index 0000000..5122fa5
--- /dev/null
+++ b/app/src/main/res/layout/tutorial_slide1.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/tutorial_slide2.xml b/app/src/main/res/layout/tutorial_slide2.xml
new file mode 100644
index 0000000..f8d7125
--- /dev/null
+++ b/app/src/main/res/layout/tutorial_slide2.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/tutorial_slide3.xml b/app/src/main/res/layout/tutorial_slide3.xml
new file mode 100644
index 0000000..5198873
--- /dev/null
+++ b/app/src/main/res/layout/tutorial_slide3.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/activity_break_reminder_drawer.xml b/app/src/main/res/menu/activity_break_reminder_drawer.xml
deleted file mode 100644
index 11d5e41..0000000
--- a/app/src/main/res/menu/activity_break_reminder_drawer.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
diff --git a/app/src/main/res/menu/menu_edit_exercise_sets.xml b/app/src/main/res/menu/menu_edit_exercise_sets.xml
new file mode 100644
index 0000000..21d05b5
--- /dev/null
+++ b/app/src/main/res/menu/menu_edit_exercise_sets.xml
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_manage_exercise_sets.xml b/app/src/main/res/menu/menu_manage_exercise_sets.xml
new file mode 100644
index 0000000..5847e7d
--- /dev/null
+++ b/app/src/main/res/menu/menu_manage_exercise_sets.xml
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/nav_drawer.xml b/app/src/main/res/menu/nav_drawer.xml
new file mode 100644
index 0000000..7f90ced
--- /dev/null
+++ b/app/src/main/res/menu/nav_drawer.xml
@@ -0,0 +1,35 @@
+
+
diff --git a/app/src/main/res/mipmap-hdpi/splash_icon.png b/app/src/main/res/mipmap-hdpi/splash_icon.png
new file mode 100644
index 0000000..318f94d
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/splash_icon.png differ
diff --git a/app/src/main/res/mipmap-mdpi/splash_icon.png b/app/src/main/res/mipmap-mdpi/splash_icon.png
new file mode 100644
index 0000000..73626a4
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/splash_icon.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/splash_icon.png b/app/src/main/res/mipmap-xhdpi/splash_icon.png
new file mode 100644
index 0000000..5c866fc
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/splash_icon.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/splash_icon.png b/app/src/main/res/mipmap-xxhdpi/splash_icon.png
new file mode 100644
index 0000000..fe40929
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/splash_icon.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/splash_icon.png b/app/src/main/res/mipmap-xxxhdpi/splash_icon.png
new file mode 100644
index 0000000..465165a
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/splash_icon.png differ
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 646487c..af67f14 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -13,4 +13,9 @@
#f6d126
#B71C1C
#388E3C
+
+
+ #026499
+
+ #448bb2
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 404a0ab..5455e5c 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -13,4 +13,14 @@ Refer to App Widget Documentation for margin information
http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout
-->
8dp
+
+ 30dp
+ 20dp
+ 120dp
+ 30dp
+ 16dp
+ 20dp
+ 40dp
+ 180dp
+ 16dp
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c4edacd..17aa162 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -174,5 +174,125 @@
By clicking on the \'next\' button, the app will choose a new exercise in the current body region. At the same time the clock will be reset on the next full minute, so the time will be spend fully on the exercises.
Instruction manual
This application belongs to the group of Privacy Friendly Apps developed by Technische Universität Darmstadt. Sourcecode licensed under GPLv3. Images copyright TU Darmstadt and Google Inc.
+ No exercise sets available. Please create a new one.
+ Exercise Sets
+ Edit Exercise Set
+ New Exercise Set
+ exercise set name
+ Add New Exercise Set
+ @string/app_name
+ Exercise Set Name
+ keep editing
+ discard
+ Are you sure you want to discard the changes?
+ Exercise
+ Tutorial
+
+ Okay
+ Next
+ Skip
+
+
+ Welcome!
+ This App serves as a guideline to see the basic design of Privacy Friendly Apps. Here introduce your app in one or two sentences.
+
+ Key Elements
+ Introduce key elements of your app. Do not introduce too many details.
+
+ Github and Guide
+ The sourcecode of this app is available at GitHub. For further explanations have a look at the Privacy Friendly App Guide.
+ Edit Exercise Set
+
+ "Material is the metaphor.\n\n"
+
+ "A material metaphor is the unifying theory of a rationalized space and a system of motion."
+ "The material is grounded in tactile reality, inspired by the study of paper and ink, yet "
+ "technologically advanced and open to imagination and magic.\n"
+ "Surfaces and edges of the material provide visual cues that are grounded in reality. The "
+ "use of familiar tactile attributes helps users quickly understand affordances. Yet the "
+ "flexibility of the material creates new affordances that supercede those in the physical "
+ "world, without breaking the rules of physics.\n"
+ "The fundamentals of light, surface, and movement are key to conveying how objects move, "
+ "interact, and exist in space and in relation to each other. Realistic lighting shows "
+ "seams, divides space, and indicates moving parts.\n\n"
+
+ "Bold, graphic, intentional.\n\n"
+
+ "The foundational elements of print based design typography, grids, space, scale, color, "
+ "and use of imagery guide visual treatments. These elements do far more than please the "
+ "eye. They create hierarchy, meaning, and focus. Deliberate color choices, edge to edge "
+ "imagery, large scale typography, and intentional white space create a bold and graphic "
+ "interface that immerse the user in the experience.\n"
+ "An emphasis on user actions makes core functionality immediately apparent and provides "
+ "waypoints for the user.\n\n"
+
+ "Motion provides meaning.\n\n"
+
+ "Motion respects and reinforces the user as the prime mover. Primary user actions are "
+ "inflection points that initiate motion, transforming the whole design.\n"
+ "All action takes place in a single environment. Objects are presented to the user without "
+ "breaking the continuity of experience even as they transform and reorganize.\n"
+ "Motion is meaningful and appropriate, serving to focus attention and maintain continuity. "
+ "Feedback is subtle yet clear. Transitions are efficient yet coherent.\n\n"
+
+ "3D world.\n\n"
+
+ "The material environment is a 3D space, which means all objects have x, y, and z "
+ "dimensions. The z-axis is perpendicularly aligned to the plane of the display, with the "
+ "positive z-axis extending towards the viewer. Every sheet of material occupies a single "
+ "position along the z-axis and has a standard 1dp thickness.\n"
+ "On the web, the z-axis is used for layering and not for perspective. The 3D world is "
+ "emulated by manipulating the y-axis.\n\n"
+
+ "Light and shadow.\n\n"
+
+ "Within the material environment, virtual lights illuminate the scene. Key lights create "
+ "directional shadows, while ambient light creates soft shadows from all angles.\n"
+ "Shadows in the material environment are cast by these two light sources. In Android "
+ "development, shadows occur when light sources are blocked by sheets of material at "
+ "various positions along the z-axis. On the web, shadows are depicted by manipulating the "
+ "y-axis only. The following example shows the card with a height of 6dp.\n\n"
+
+ "Resting elevation.\n\n"
+
+ "All material objects, regardless of size, have a resting elevation, or default elevation "
+ "that does not change. If an object changes elevation, it should return to its resting "
+ "elevation as soon as possible.\n\n"
+
+ "Component elevations.\n\n"
+
+ "The resting elevation for a component type is consistent across apps (e.g., FAB elevation "
+ "does not vary from 6dp in one app to 16dp in another app).\n"
+ "Components may have different resting elevations across platforms, depending on the depth "
+ "of the environment (e.g., TV has a greater depth than mobile or desktop).\n\n"
+
+ "Responsive elevation and dynamic elevation offsets.\n\n"
+
+ "Some component types have responsive elevation, meaning they change elevation in response "
+ "to user input (e.g., normal, focused, and pressed) or system events. These elevation "
+ "changes are consistently implemented using dynamic elevation offsets.\n"
+ "Dynamic elevation offsets are the goal elevation that a component moves towards, relative "
+ "to the component’s resting state. They ensure that elevation changes are consistent "
+ "across actions and component types. For example, all components that lift on press have "
+ "the same elevation change relative to their resting elevation.\n"
+ "Once the input event is completed or cancelled, the component will return to its resting "
+ "elevation.\n\n"
+
+ "Avoiding elevation interference.\n\n"
+
+ "Components with responsive elevations may encounter other components as they move between "
+ "their resting elevations and dynamic elevation offsets. Because material cannot pass "
+ "through other material, components avoid interfering with one another any number of ways, "
+ "whether on a per component basis or using the entire app layout.\n"
+ "On a component level, components can move or be removed before they cause interference. "
+ "For example, a floating action button (FAB) can disappear or move off screen before a "
+ "user picks up a card, or it can move if a snackbar appears.\n"
+ "On the layout level, design your app layout to minimize opportunities for interference. "
+ "For example, position the FAB to one side of stream of a cards so the FAB won’t interfere "
+ "when a user tries to pick up one of cards.\n\n"
+
+ Settings
+ Enter a name …
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 4934cf3..ff425f6 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -24,4 +24,9 @@
+
+
diff --git a/app/src/main/res/xml/pref_headers.xml b/app/src/main/res/xml/pref_headers.xml
index 3d2750f..ea23f02 100644
--- a/app/src/main/res/xml/pref_headers.xml
+++ b/app/src/main/res/xml/pref_headers.xml
@@ -4,7 +4,7 @@