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">