diff --git a/.idea/misc.xml b/.idea/misc.xml index 5d19981..bcd50de 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -27,19 +27,7 @@ - - - - - - - - - - - - - + diff --git a/app/build.gradle b/app/build.gradle index b914eed..17f2084 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ android { defaultConfig { applicationId "org.secuso.privacyfriendlybreakreminder" - minSdkVersion 17 - targetSdkVersion 24 + minSdkVersion 21 + targetSdkVersion 25 versionCode 2 versionName "2.0" vectorDrawables.useSupportLibrary = true @@ -18,12 +18,22 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } +} + +repositories{ + mavenCentral() + mavenLocal() } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support:design:25.3.1' + compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.android.support:support-v4:25.3.1' compile 'com.android.support:support-annotations:25.3.1' compile 'com.android.support:cardview-v7:25.3.1' @@ -31,4 +41,5 @@ dependencies { compile 'com.nex3z:flow-layout:1.0.0' compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1' testCompile 'junit:junit:4.12' + compile 'com.shawnlin:number-picker:2.4.4' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 757ca78..2848cfe 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,19 +7,21 @@ + android:value="org.secuso.privacyfriendlybreakreminder.activities.TimerActivity" /> + + + { + + private static final String TAG = EditExerciseSetActivity.class.getSimpleName(); // 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"; @@ -207,11 +210,6 @@ public class EditExerciseSetActivity extends AppCompatActivity implements androi exerciseSet.setName(exerciseSetNameText.getText().toString()); mDbHelper.updateExerciseSet(exerciseSet); } - - // 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 @@ -260,6 +258,8 @@ public class EditExerciseSetActivity extends AppCompatActivity implements androi i.putExtra(ChooseExerciseActivity.EXTRA_SELECTED_EXERCISES , getSelectedExerciseIds()); startActivityForResult(i, PICK_EXERCISE_REQUEST); break; + default: + Log.d(TAG, "Unknown Button clicked."); } } 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 8a3e0f2..d3087d5 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseActivity.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseActivity.java @@ -32,6 +32,7 @@ import org.secuso.privacyfriendlybreakreminder.activities.tutorial.PrefManager; import org.secuso.privacyfriendlybreakreminder.database.SQLiteHelper; import org.secuso.privacyfriendlybreakreminder.database.data.Exercise; import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet; +import org.secuso.privacyfriendlybreakreminder.dialog.ExerciseDialog; import org.secuso.privacyfriendlybreakreminder.exercises.ExerciseLocale; import java.util.Locale; @@ -60,11 +61,16 @@ public class ExerciseActivity extends AppCompatActivity implements android.suppo private ProgressBar progressBarBig; private TextView breakTimerTextBig; private ConstraintLayout bigProgressBarLayout; + private ImageButton exerciseInfoButton; + + private boolean isActivityVisible = false; + private boolean isBreakFinished = false; private boolean repeatStatus; private boolean continuousStatus; private boolean showBigTimer = false; private boolean showControlButtons = true; + private boolean keepScreenOn = true; // exerciseSet info private long exerciseSetId; @@ -73,7 +79,7 @@ public class ExerciseActivity extends AppCompatActivity implements android.suppo private int currentExercisePart = 0; // timer - private final long exerciseTime = 20 * 1000; + private long exerciseTime = 20 * 1000; private long pauseDuration; private CountDownTimer exerciseTimer; private CountDownTimer breakTimer; @@ -96,6 +102,12 @@ public class ExerciseActivity extends AppCompatActivity implements android.suppo pauseDuration = pref.getLong(PrefManager.PAUSE_TIME, 5 * 60 * 1000); repeatStatus = pref.getBoolean(PrefManager.REPEAT_STATUS, false); continuousStatus = pref.getBoolean(PrefManager.CONTINUOUS_STATUS, false); + try { + exerciseTime = Long.parseLong(pref.getString(PrefManager.EXERCISE_DURATION, "30")) * 1000; + } catch(NumberFormatException e) { + exerciseTime = 30L * 1000; + } + keepScreenOn = pref.getBoolean(PrefManager.KEEP_SCREEN_ON_DURING_EXERCISE, true); initResources(); @@ -105,7 +117,9 @@ public class ExerciseActivity extends AppCompatActivity implements android.suppo ab.setHomeAsUpIndicator(R.drawable.ic_close_white); } - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + if(keepScreenOn) { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } getSupportLoaderManager().initLoader(0, null, this); } @@ -124,6 +138,7 @@ public class ExerciseActivity extends AppCompatActivity implements android.suppo continuousButton = (ImageButton) findViewById(R.id.button_continuous); prevButton = (ImageButton) findViewById(R.id.button_prev); nextButton = (ImageButton) findViewById(R.id.button_next); + exerciseInfoButton = (ImageButton) findViewById(R.id.exercise_info_button); progressBarBig = (ProgressBar) findViewById(R.id.progressBarBig); breakTimerTextBig = (TextView) findViewById(R.id.breakTimerTextBig); @@ -137,7 +152,11 @@ public class ExerciseActivity extends AppCompatActivity implements android.suppo public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: - showConfirmationDialog(); + if(!isBreakFinished) { + showConfirmationDialog(); + } else { + finish(); + } return true; } return super.onOptionsItemSelected(item); @@ -160,54 +179,62 @@ public class ExerciseActivity extends AppCompatActivity implements android.suppo @Override public void onBackPressed() { - showConfirmationDialog(); + if(isBreakFinished) { + showConfirmationDialog(); + } else { + finish(); + } + } + + @Override + public void finish() { + Intent intent = new Intent(ExerciseActivity.this, TimerActivity.class); + intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP); + + super.finish(); + ExerciseActivity.this.startActivity(intent); + ExerciseActivity.this.overridePendingTransition(0, 0); } private void showConfirmationDialog() { - new AlertDialog.Builder(this) - .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - Intent intent = new Intent(ExerciseActivity.this, TimerActivity.class); - intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP); - - ExerciseActivity.this.finish(); - ExerciseActivity.this.startActivity(intent); - ExerciseActivity.this.overridePendingTransition(0, 0); - } - }) - .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - dialogInterface.dismiss(); - } - }) - .setMessage(R.string.dialog_leave_break_confirmation) - .create().show(); + if(isActivityVisible) { + new AlertDialog.Builder(this) + .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + ExerciseActivity.this.finish(); + } + }) + .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + dialogInterface.dismiss(); + } + }) + .setMessage(R.string.dialog_leave_break_confirmation) + .create().show(); + } } private void showEndDialog() { - new AlertDialog.Builder(this) - .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - Intent intent = new Intent(ExerciseActivity.this, TimerActivity.class); - intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP); - - ExerciseActivity.this.finish(); - ExerciseActivity.this.startActivity(intent); - ExerciseActivity.this.overridePendingTransition(0, 0); - } - }) - .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - dialogInterface.dismiss(); - } - }) - .setTitle(R.string.dialog_end_break_confirmation_title) - .setMessage(R.string.dialog_end_break_confirmation) - .create().show(); + if(isActivityVisible) { + new AlertDialog.Builder(this) + .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + ExerciseActivity.this.finish(); + } + }) + .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + dialogInterface.dismiss(); + } + }) + .setTitle(R.string.dialog_end_break_confirmation_title) + .setMessage(R.string.dialog_end_break_confirmation) + .create().show(); + } } @Override @@ -228,6 +255,28 @@ public class ExerciseActivity extends AppCompatActivity implements android.suppo }; } + @Override + protected void onResume() { + super.onResume(); + isActivityVisible = true; + + if(isBreakFinished) { + showEndDialog(); + } + + if(keepScreenOn) { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + } + + @Override + protected void onPause() { + super.onPause(); + isActivityVisible = false; + + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + @Override public void onLoadFinished(Loader loader, ExerciseSet set) { if(set != null) { @@ -447,17 +496,32 @@ public class ExerciseActivity extends AppCompatActivity implements android.suppo return false; } - private void showExercise(Exercise e, int image) { + private void showExercise(final Exercise e, int image) { int[] images = e.getImageResIds(this); if (image < 0 || image >= images.length) { image = 0; } + View.OnClickListener infoClickListener = new View.OnClickListener() { + @Override + public void onClick(View view) { + pauseExerciseTimer(); + ExerciseDialog.showExerciseDialog(ExerciseActivity.this, e, new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialogInterface) { + resumeExerciseTimer(); + } + }); + } + }; + executionText.setText(e.getExecution()); descriptionText.setText(e.getDescription()); sectionText.setText(e.getSection()); exerciseImage.setImageResource(e.getImageResIds(this)[image]); + exerciseImage.setOnClickListener(infoClickListener); + exerciseInfoButton.setOnClickListener(infoClickListener); if(continuousStatus) startExerciseTimer(); @@ -529,6 +593,7 @@ public class ExerciseActivity extends AppCompatActivity implements android.suppo @Override public void onFinish() { + isBreakFinished = true; remainingBreakDuration = 0; isBreakTimerRunning = false; updateBreakTimer(remainingBreakDuration); diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/SettingsActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/SettingsActivity.java new file mode 100644 index 0000000..468aab6 --- /dev/null +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/SettingsActivity.java @@ -0,0 +1,113 @@ + +package org.secuso.privacyfriendlybreakreminder.activities; + + +import android.content.Intent; +import android.media.Ringtone; +import android.media.RingtoneManager; +import android.net.Uri; +import android.os.Bundle; +import android.os.PersistableBundle; +import android.preference.ListPreference; +import android.preference.Preference; +import android.support.annotation.Nullable; +import android.support.v7.app.ActionBar; +import android.preference.PreferenceFragment; +import android.preference.PreferenceManager; +import android.preference.RingtonePreference; +import android.text.TextUtils; +import android.view.MenuItem; + +import org.secuso.privacyfriendlybreakreminder.activities.helper.BaseActivity; +import org.secuso.privacyfriendlybreakreminder.R; + +public class SettingsActivity extends BaseActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_settings); + } + + /** + * A preference value change listener that updates the preference's summary + * to reflect its new value. + */ + private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object value) { + String stringValue = value.toString(); + + if (preference instanceof ListPreference) { + // For list preferences, look up the correct display value in + // the preference's 'entries' list. + ListPreference listPreference = (ListPreference) preference; + int index = listPreference.findIndexOfValue(stringValue); + + // Set the summary to reflect the new value. + preference.setSummary( + index >= 0 + ? listPreference.getEntries()[index] + : null); + + } else { + // For all other preferences, set the summary to the value's + // simple string representation. + preference.setSummary(stringValue); + } + return true; + } + }; + + /** + * Binds a preference's summary to its value. More specifically, when the + * preference's value is changed, its summary (line of text below the + * preference title) is updated to reflect the value. The summary is also + * immediately updated upon calling this method. The exact display format is + * dependent on the type of preference. + * + * @see #sBindPreferenceSummaryToValueListener + */ + private static void bindPreferenceSummaryToValue(Preference preference) { + // Set the listener to watch for value changes. + preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); + + // Trigger the listener immediately with the preference's + // current value. + sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, + PreferenceManager + .getDefaultSharedPreferences(preference.getContext()) + .getString(preference.getKey(), "")); + } + + @Override + protected int getNavigationDrawerID() { + return R.id.nav_settings; + } + + + public static class GeneralPreferenceFragment extends PreferenceFragment { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.pref_general); + setHasOptionsMenu(true); + + // Bind the summaries of EditText/List/Dialog/Ringtone preferences + // to their values. When their values change, their summaries are + // updated to reflect the new value, per the Android Design + // guidelines. + bindPreferenceSummaryToValue(findPreference("pref_exercise_time")); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + if (id == android.R.id.home) { + startActivity(new Intent(getActivity(), SettingsActivity.class)); + return true; + } + return super.onOptionsItemSelected(item); + } + } +} \ No newline at end of file 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 b717efe..54ec355 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/TimerActivity.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/TimerActivity.java @@ -23,7 +23,6 @@ import android.view.View; import android.widget.AdapterView; import android.widget.ImageButton; import android.widget.LinearLayout; -import android.widget.NumberPicker; import android.widget.ProgressBar; import android.widget.Spinner; import android.widget.TextView; @@ -37,6 +36,8 @@ import org.secuso.privacyfriendlybreakreminder.database.SQLiteHelper; import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet; import org.secuso.privacyfriendlybreakreminder.service.TimerService; +import com.shawnlin.numberpicker.NumberPicker; + import java.util.LinkedList; import java.util.List; import java.util.Locale; @@ -65,17 +66,17 @@ public class TimerActivity extends BaseActivity implements android.support.v4.ap private int mShortAnimationDuration; private boolean currentStatusIsPickerVisible = false; - private static final String[] SECONDS_MINUTES = new String[60]; - private static final String[] HOURS = new String[24]; - - static { - for(int i = 0; i < SECONDS_MINUTES.length; ++i) { - SECONDS_MINUTES[i] = String.format(Locale.US, "%02d", i); - } - for(int i = 0; i < HOURS.length; ++i) { - HOURS[i] = String.format(Locale.US, "%02d", i); - } - } +// private static final String[] SECONDS_MINUTES = new String[60]; +// private static final String[] HOURS = new String[24]; +// +// static { +// for(int i = 0; i < SECONDS_MINUTES.length; ++i) { +// SECONDS_MINUTES[i] = String.format(Locale.US, "%02d", i); +// } +// for(int i = 0; i < HOURS.length; ++i) { +// HOURS[i] = String.format(Locale.US, "%02d", i); +// } +// } // Service private TimerService mTimerService = null; @@ -145,7 +146,6 @@ public class TimerActivity extends BaseActivity implements android.support.v4.ap protected void onResume() { super.onResume(); - TimerService.startService(this); registerReceiver(timerReceiver, new IntentFilter(TimerService.TIMER_BROADCAST)); if(mTimerService != null && !mTimerService.isRunning()) { @@ -164,6 +164,7 @@ public class TimerActivity extends BaseActivity implements android.support.v4.ap } private void initServiceBinding() { + TimerService.startService(this); Intent intent = new Intent(this, TimerService.class); bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE); } @@ -202,36 +203,57 @@ public class TimerActivity extends BaseActivity implements android.support.v4.ap secondsBreakPicker = (NumberPicker) findViewById(R.id.seconds_break_picker); minutesBreakPicker = (NumberPicker) findViewById(R.id.minutes_break_picker); - secondsPicker.setDisplayedValues(SECONDS_MINUTES); - secondsPicker.setMinValue(0); - secondsPicker.setMaxValue(SECONDS_MINUTES.length - 1); + setPickerAttributes(secondsPicker); + setPickerAttributes(minutesPicker); + setPickerAttributes(hoursPicker); + setPickerAttributes(secondsBreakPicker); + setPickerAttributes(minutesBreakPicker); + secondsPicker.setValue(pref.getInt(PrefManager.PREF_PICKER_SECONDS, 0)); - secondsBreakPicker.setDisplayedValues(SECONDS_MINUTES); - secondsBreakPicker.setMinValue(0); - secondsBreakPicker.setMaxValue(SECONDS_MINUTES.length - 1); - secondsBreakPicker.setValue(pref.getInt(PrefManager.PREF_BREAK_PICKER_SECONDS, 0)); - - minutesPicker.setDisplayedValues(SECONDS_MINUTES); - minutesPicker.setMinValue(0); - minutesPicker.setMaxValue(SECONDS_MINUTES.length - 1); minutesPicker.setValue(pref.getInt(PrefManager.PREF_PICKER_MINUTES, 30)); - minutesBreakPicker.setDisplayedValues(SECONDS_MINUTES); - minutesBreakPicker.setMinValue(0); - minutesBreakPicker.setMaxValue(SECONDS_MINUTES.length - 1); - minutesBreakPicker.setValue(pref.getInt(PrefManager.PREF_BREAK_PICKER_MINUTES, 0)); - - hoursPicker.setDisplayedValues(HOURS); - hoursPicker.setMinValue(0); - hoursPicker.setMaxValue(HOURS.length - 1); hoursPicker.setValue(pref.getInt(PrefManager.PREF_PICKER_HOURS, 1)); + secondsBreakPicker.setValue(pref.getInt(PrefManager.PREF_BREAK_PICKER_SECONDS, 0)); + minutesBreakPicker.setValue(pref.getInt(PrefManager.PREF_BREAK_PICKER_MINUTES, 5)); +// secondsPicker.setDisplayedValues(SECONDS_MINUTES); +// secondsPicker.setMinValue(0); +// secondsPicker.setMaxValue(SECONDS_MINUTES.length - 1); +// secondsPicker.setValue(pref.getInt(PrefManager.PREF_PICKER_SECONDS, 0)); +// secondsBreakPicker.setDisplayedValues(SECONDS_MINUTES); +// secondsBreakPicker.setMinValue(0); +// secondsBreakPicker.setMaxValue(SECONDS_MINUTES.length - 1); +// secondsBreakPicker.setValue(pref.getInt(PrefManager.PREF_BREAK_PICKER_SECONDS, 0)); +// +// minutesPicker.setDisplayedValues(SECONDS_MINUTES); +// minutesPicker.setMinValue(0); +// minutesPicker.setMaxValue(SECONDS_MINUTES.length - 1); +// minutesPicker.setValue(pref.getInt(PrefManager.PREF_PICKER_MINUTES, 30)); +// minutesBreakPicker.setDisplayedValues(SECONDS_MINUTES); +// minutesBreakPicker.setMinValue(0); +// minutesBreakPicker.setMaxValue(SECONDS_MINUTES.length - 1); +// minutesBreakPicker.setValue(pref.getInt(PrefManager.PREF_BREAK_PICKER_MINUTES, 0)); +// +// hoursPicker.setDisplayedValues(HOURS); +// hoursPicker.setMinValue(0); +// hoursPicker.setMaxValue(HOURS.length - 1); +// hoursPicker.setValue(pref.getInt(PrefManager.PREF_PICKER_HOURS, 1)); - setDividerColor(secondsPicker, R.color.transparent); - setDividerColor(minutesPicker, R.color.transparent); - setDividerColor(hoursPicker, R.color.transparent); - setDividerColor(secondsBreakPicker, R.color.transparent); - setDividerColor(minutesBreakPicker, R.color.transparent); + //setDividerColor(secondsPicker, R.color.transparent); + //setDividerColor(minutesPicker, R.color.transparent); + //setDividerColor(hoursPicker, R.color.transparent); + //setDividerColor(secondsBreakPicker, R.color.transparent); + //setDividerColor(minutesBreakPicker, R.color.transparent); + } + private void setPickerAttributes(NumberPicker np) { + np.setTextColorResource(R.color.middlegrey); + np.setSelectedTextColorResource(R.color.colorAccent); + np.setDividerColorResource(R.color.transparent); + //np.setDividerDistance(25); + np.setSelectedTextSize(R.dimen.picker_selected_text_size); + np.setTextSize(R.dimen.picker_text_size); + np.setFormatter(NumberPicker.getTwoDigitFormatter()); + np.setWheelItemCount(5); } private void updateProgress(long millisUntilFinished) { @@ -254,10 +276,6 @@ public class TimerActivity extends BaseActivity implements android.support.v4.ap //animation.start(); } - @Override - protected void onDestroy() { - super.onDestroy(); - } public void onClick(View view) { switch(view.getId()) { @@ -411,21 +429,21 @@ public class TimerActivity extends BaseActivity implements android.support.v4.ap } } - private void setDividerColor(NumberPicker picker, @ColorRes int color) { - java.lang.reflect.Field[] pickerFields = NumberPicker.class.getDeclaredFields(); - for (java.lang.reflect.Field pf : pickerFields) { - if (pf.getName().equals("mSelectionDivider")) { - pf.setAccessible(true); - try { - ColorDrawable colorDrawable = new ColorDrawable(ContextCompat.getColor(this, color)); - pf.set(picker, colorDrawable); - } catch (IllegalArgumentException | Resources.NotFoundException | IllegalAccessException e) { - Log.e(TAG, e.getMessage(), e); - } - break; - } - } - } +// private void setDividerColor(NumberPicker picker, @ColorRes int color) { +// java.lang.reflect.Field[] pickerFields = NumberPicker.class.getDeclaredFields(); +// for (java.lang.reflect.Field pf : pickerFields) { +// if (pf.getName().equals("mSelectionDivider")) { +// pf.setAccessible(true); +// try { +// ColorDrawable colorDrawable = new ColorDrawable(ContextCompat.getColor(this, color)); +// pf.set(picker, colorDrawable); +// } catch (IllegalArgumentException | Resources.NotFoundException | IllegalAccessException e) { +// Log.e(TAG, e.getMessage(), e); +// } +// break; +// } +// } +// } @Override public Loader> onCreateLoader(int id, final Bundle args) { diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseAdapter.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseAdapter.java index 4427066..226a4d1 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseAdapter.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseAdapter.java @@ -15,6 +15,8 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import com.bumptech.glide.Glide; + import org.secuso.privacyfriendlybreakreminder.R; import org.secuso.privacyfriendlybreakreminder.activities.ChooseExerciseActivity; import org.secuso.privacyfriendlybreakreminder.database.data.Exercise; @@ -121,7 +123,8 @@ public class ExerciseAdapter extends RecyclerView.Adapter - * See - * Android Design: Settings for design guidelines and the Settings - * API Guide for more information on developing a Settings UI. - */ -public class SettingsActivity extends AppCompatPreferenceActivity { - /** - * A preference value change listener that updates the preference's summary - * to reflect its new value. - */ - private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object value) { - String stringValue = value.toString(); - - if (preference instanceof ListPreference) { - // For list preferences, look up the correct display value in - // the preference's 'entries' list. - ListPreference listPreference = (ListPreference) preference; - int index = listPreference.findIndexOfValue(stringValue); - - // Set the summary to reflect the new value. - preference.setSummary( - index >= 0 - ? listPreference.getEntries()[index] - : null); - - } else if (preference instanceof RingtonePreference) { - // For ringtone preferences, look up the correct display value - // using RingtoneManager. - if (TextUtils.isEmpty(stringValue)) { - // Empty values correspond to 'silent' (no ringtone). - preference.setSummary(R.string.pref_ringtone_silent); - - } else { - Ringtone ringtone = RingtoneManager.getRingtone( - preference.getContext(), Uri.parse(stringValue)); - - if (ringtone == null) { - // Clear the summary if there was a lookup error. - preference.setSummary(null); - } else { - // Set the summary to reflect the new ringtone display - // name. - String name = ringtone.getTitle(preference.getContext()); - preference.setSummary(name); - } - } - - } else { - // For all other preferences, set the summary to the value's - // simple string representation. - preference.setSummary(stringValue); - } - return true; - } - }; - - /** - * Helper method to determine if the device has an extra-large screen. For - * example, 10" tablets are extra-large. - */ - private static boolean isXLargeTablet(Context context) { - return (context.getResources().getConfiguration().screenLayout - & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; - } - - /** - * Binds a preference's summary to its value. More specifically, when the - * preference's value is changed, its summary (line of text below the - * preference title) is updated to reflect the value. The summary is also - * immediately updated upon calling this method. The exact display format is - * dependent on the type of preference. - * - * @see #sBindPreferenceSummaryToValueListener - */ - private static void bindPreferenceSummaryToValue(Preference preference) { - // Set the listener to watch for value changes. - preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); - - // Trigger the listener immediately with the preference's - // current value. - sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, - PreferenceManager - .getDefaultSharedPreferences(preference.getContext()) - .getString(preference.getKey(), "")); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setupActionBar(); - } - - /** - * Set up the {@link android.app.ActionBar}, if the API is available. - */ - private void setupActionBar() { - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - // Show the Up button in the action bar. - actionBar.setDisplayHomeAsUpEnabled(true); - } - } - - @Override - public boolean onMenuItemSelected(int featureId, MenuItem item) { - int id = item.getItemId(); - if (id == android.R.id.home) { - if (isXLargeTablet(this)) { - finish(); - return true; - } - if (!super.onMenuItemSelected(featureId, item)) { - NavUtils.navigateUpFromSameTask(this); - } - return true; - } - return super.onMenuItemSelected(featureId, item); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean onIsMultiPane() { - return isXLargeTablet(this); - } - - /** - * {@inheritDoc} - */ - @Override - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - public void onBuildHeaders(List
target) { - loadHeadersFromResource(R.xml.pref_headers, target); - } - - /** - * This method stops fragment injection in malicious applications. - * Make sure to deny any unknown fragments here. - */ - protected boolean isValidFragment(String fragmentName) { - return PreferenceFragment.class.getName().equals(fragmentName) - || GeneralPreferenceFragment.class.getName().equals(fragmentName) - || NotificationPreferenceFragment.class.getName().equals(fragmentName); - } - - - /** - * This fragment shows general preferences only. It is used when the - * activity is showing a two-pane settings UI. - */ - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - public static class GeneralPreferenceFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { - - private SeekBarPreference _seekBarWork; - private SeekBarPreference _seekBarBreak; - - private DynamicListPreference dlp; - private ExerciseListPreference elp; - - private String currentProfile = ""; - private Bundle bundle; - - @Override - public void onCreate(Bundle savedInstanceState) { - bundle = savedInstanceState; - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.pref_general); - setHasOptionsMenu(true); - - // Get widgets : - _seekBarWork = (SeekBarPreference) this.findPreference("work_value"); - _seekBarBreak = (SeekBarPreference) this.findPreference("break_value"); - - dlp = (DynamicListPreference) this.findPreference("current_profile"); - elp = (ExerciseListPreference) this.findPreference("exercise"); - - // Set listener : - getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); - - //Get profile name - currentProfile = PreferenceManager.getDefaultSharedPreferences(this.getActivity()).getString("name_text", ""); - - // Set seekbar summary : - int radius = PreferenceManager.getDefaultSharedPreferences(this.getActivity()).getInt("work_value", 50) + 1; - _seekBarWork.setSummary(this.getString(R.string.settings_summary).replace("$1", "" + radius)); - - radius = PreferenceManager.getDefaultSharedPreferences(this.getActivity()).getInt("break_value", 10) + 1; - _seekBarBreak.setSummary(this.getString(R.string.settings_summary).replace("$1", "" + radius)); - - - // Bind the summaries of EditText/List/Dialog/Ringtone preferences - // to their values. When their values change, their summaries are - // updated to reflect the new value, per the Android Design - // guidelines. - bindPreferenceSummaryToValue(findPreference("name_text")); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - int id = item.getItemId(); - if (id == android.R.id.home) { - startActivity(new Intent(getActivity(), SettingsActivity.class)); - return true; - } - return super.onOptionsItemSelected(item); - } - - - @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (key.equals("current_profile")) { - ListPreference listPref = (ListPreference) findPreference("current_profile"); - int i = Integer.parseInt(listPref.getValue()); - - - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putString("current_profile", "" + i); - editor.putBoolean("change_profiles", true); - String[] allProfile = sharedPreferences.getString("profiles", "").split(";"); - - // Deactivate the onPrefListener in SettingsActivity - getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); - editor.putString("name_text", allProfile[i].split(",")[0]); - editor.putInt("work_value", Integer.parseInt(allProfile[i].split(",")[1]) - 1); - editor.putInt("break_value", Integer.parseInt(allProfile[i].split(",")[2]) - 1); - editor.putBoolean("cont_value", Boolean.parseBoolean(allProfile[i].split(",")[3])); - editor.putString("exercise_value", allProfile[i].split(",")[4]); - editor.apply(); - getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); - - // FIXME Has to be done because the summary of the name - onDestroy(); - onCreate(bundle); - return; - } - - // Set seekbar summary : - int radius = PreferenceManager.getDefaultSharedPreferences(this.getActivity()).getInt("work_value", 50) + 1; - _seekBarWork.setSummary(this.getString(R.string.settings_summary).replace("$1", "" + radius)); - radius = PreferenceManager.getDefaultSharedPreferences(this.getActivity()).getInt("break_value", 10) + 1; - _seekBarBreak.setSummary(this.getString(R.string.settings_summary).replace("$1", "" + radius)); - - //FIXME Update the preferences of the selected profile - if (!key.equals("profiles")) { - getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); - updateProfilesPreference(); - getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); - } - } - - - @Override - public void onPause() { - getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); - super.onPause(); - } - - private void updateProfilesPreference() { - int work_radius = PreferenceManager.getDefaultSharedPreferences(this.getActivity()).getInt("work_value", 50) + 1; - int break_radius = PreferenceManager.getDefaultSharedPreferences(this.getActivity()).getInt("break_value", 10) + 1; - String newProfileName = PreferenceManager.getDefaultSharedPreferences(this.getActivity()).getString("name_text", ""); - String allProfiles = PreferenceManager.getDefaultSharedPreferences(this.getActivity()).getString("profiles", ""); - boolean cont = PreferenceManager.getDefaultSharedPreferences(this.getActivity()).getBoolean("cont_value", false); - String exercises = PreferenceManager.getDefaultSharedPreferences(this.getActivity()).getString("exercise_value", "-1"); - - if (allProfiles.contains(newProfileName + "," + work_radius + "," + break_radius + "," + cont + "," + exercises) && newProfileName.equals(currentProfile)) { - //Nothing changes - System.out.println("No changes for a profile in edit settings"); - } else { - SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this.getActivity()).edit(); - if (newProfileName.equals("")) { - // Profile name empty - Toast.makeText(this.getActivity(), R.string.settings_emptyName, Toast.LENGTH_LONG).show(); - editor.putString("name_text", currentProfile); - editor.apply(); - findPreference("name_text").setSummary(currentProfile); - - } else if (currentProfile != newProfileName && prefContainsName(newProfileName)) { - // Profile name exists already - Toast.makeText(this.getActivity(), R.string.settings_doubleName, Toast.LENGTH_LONG).show(); - editor.putString("name_text", currentProfile); - editor.apply(); - findPreference("name_text").setSummary(currentProfile); - } else { - - String[] profiles = allProfiles.split(";"); - - for (int i = 0; i < profiles.length; i++) { - if (profiles[i].split(",")[0].equals(currentProfile)) { - profiles[i] = newProfileName + "," + work_radius + "," + break_radius + "," + cont + "," + exercises; - break; - } - } - StringBuilder builder = new StringBuilder(); - for (String s : profiles) { - builder.append(s + ";"); - } - - editor.putBoolean("change_profiles", true); - editor.putString("profiles", builder.toString()); - editor.apply(); - - currentProfile = newProfileName; - findPreference("name_text").setSummary(currentProfile); - } - } - - - } - - private boolean prefContainsName(String profileName) { - SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this.getActivity()); - String allProfiles = sharedPrefs.getString("profiles", ""); - String[] profiles = allProfiles.split(";"); - for (String profile : profiles) { - if (profile.split(",")[0].equalsIgnoreCase(profileName)) { - return true; - } - } - - return false; - } - - @Override - public void onResume() { - getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); - currentProfile = PreferenceManager.getDefaultSharedPreferences(this.getActivity()).getString("name_text", ""); - super.onResume(); - } - } - - /** - * This fragment shows notification preferences only. It is used when the - * activity is showing a two-pane settings UI. - */ - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - public static class NotificationPreferenceFragment extends PreferenceFragment { - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.pref_notification); - setHasOptionsMenu(true); - - // Bind the summaries of EditText/List/Dialog/Ringtone preferences - // to their values. When their values change, their summaries are - // updated to reflect the new value, per the Android Design - // guidelines. - bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone")); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - int id = item.getItemId(); - if (id == android.R.id.home) { - startActivity(new Intent(getActivity(), SettingsActivity.class)); - return true; - } - return super.onOptionsItemSelected(item); - } - } -} \ No newline at end of file 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 index e318b4d..34f298a 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/PrefManager.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/PrefManager.java @@ -20,19 +20,16 @@ public class PrefManager { public static final String PAUSE_TIME = "PAUSE TIME"; public static final String REPEAT_STATUS = "REPEAT_STATUS"; public static final String CONTINUOUS_STATUS = "CONTINUOUS_STATUS"; + public static final String EXERCISE_DURATION = "pref_exercise_time"; + public static final String KEEP_SCREEN_ON_DURING_EXERCISE = "pref_keep_screen_on_during_exercise"; private SharedPreferences pref; - private SharedPreferences defaultPref; - - // 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); - defaultPref = PreferenceManager.getDefaultSharedPreferences(context); + pref = PreferenceManager.getDefaultSharedPreferences(context); } public void setFirstTimeLaunch(boolean isFirstTime) { @@ -43,7 +40,7 @@ public class PrefManager { boolean isFirstTimeLaunch = pref.getBoolean(IS_FIRST_TIME_LAUNCH, true); if(isFirstTimeLaunch) - defaultPref.edit() + pref.edit() .putLong(DEFAULT_EXERCISE_SET, 0L) .putLong(PAUSE_TIME, 5 * 60 * 1000) .putBoolean(REPEAT_STATUS, false) @@ -53,6 +50,8 @@ public class PrefManager { .putInt(PREF_PICKER_SECONDS, 0) .putInt(PREF_PICKER_MINUTES, 0) .putInt(PREF_PICKER_HOURS, 1) + .putString(EXERCISE_DURATION, "30") + .putBoolean(KEEP_SCREEN_ON_DURING_EXERCISE, true) .apply(); return isFirstTimeLaunch; 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 eb68564..4cddde1 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/SQLiteHelper.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/SQLiteHelper.java @@ -45,6 +45,7 @@ public class SQLiteHelper extends SQLiteAssetHelper { public SQLiteHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); mContext = context; + super.setForcedUpgrade(); } // @Override 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 6a078c5..504929f 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 @@ -57,7 +57,7 @@ public class Exercise { for(int i = 0; i < result.length; ++i) { result[i] = context.getResources().getIdentifier( - "exercise_" + imageIDSplit[i], + "breakreminder_" + imageIDSplit[i], "drawable", context.getPackageName()); } diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/dialog/ExerciseDialog.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/dialog/ExerciseDialog.java index 73da30b..f7e6eac 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/dialog/ExerciseDialog.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/dialog/ExerciseDialog.java @@ -1,6 +1,7 @@ package org.secuso.privacyfriendlybreakreminder.dialog; import android.content.Context; +import android.content.DialogInterface; import android.support.annotation.NonNull; import android.support.v4.app.FragmentActivity; import android.support.v7.app.AlertDialog; @@ -22,8 +23,11 @@ public final class ExerciseDialog { */ private ExerciseDialog() {} + public static void showExerciseDialog(@NonNull final Context context, @NonNull final Exercise e) { + showExerciseDialog(context, e, null); + } - public static void showExerciseDialog(@NonNull final Context context,@NonNull final Exercise e) { + public static void showExerciseDialog(@NonNull final Context context, @NonNull final Exercise e, DialogInterface.OnDismissListener onDismissListener) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(FragmentActivity.LAYOUT_INFLATER_SERVICE); View v = inflater.inflate(R.layout.dialog_exercise, null); @@ -56,6 +60,7 @@ public final class ExerciseDialog { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setView(v); + builder.setOnDismissListener(onDismissListener); builder.show(); } diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/service/TimerService.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/service/TimerService.java index ee445dc..ba9c846 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/service/TimerService.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/service/TimerService.java @@ -27,7 +27,9 @@ import java.io.FileDescriptor; import java.util.Locale; import java.util.Timer; +import static android.app.PendingIntent.FLAG_CANCEL_CURRENT; import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; +import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP; public class TimerService extends Service { @@ -35,7 +37,7 @@ public class TimerService extends Service { public static final String NOTIFICATION_BROADCAST = TAG + ".NOTIFICATION_BROADCAST"; public static final String TIMER_BROADCAST = TAG + ".TIMER_BROADCAST"; - private static final int UPDATE_INTERVAL = 25; + private static final int UPDATE_INTERVAL = 100; private static final int NOTIFICATION_ID = 31337; private TimerServiceBinder mBinder = new TimerServiceBinder(); @@ -83,11 +85,12 @@ public class TimerService extends Service { NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setContentTitle(getString(R.string.app_name)) - .setContentText("Take a break now! Click here to do your chosen exercises.") - .setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, ExerciseActivity.class), FLAG_UPDATE_CURRENT)) + .setContentText(getString(R.string.take_a_break_now)) + .setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, ExerciseActivity.class), FLAG_CANCEL_CURRENT)) .setColor(ContextCompat.getColor(this, R.color.colorAccent)) .setPriority(NotificationCompat.PRIORITY_MAX) .setWhen(0) + .setOngoing(false) .setAutoCancel(true) .setSmallIcon(R.mipmap.ic_launcher) .setDefaults(Notification.DEFAULT_LIGHTS) @@ -97,7 +100,6 @@ public class TimerService extends Service { notificationManager.notify(NOTIFICATION_ID, builder.build()); // TODO: show decider activity?! - // maybe rather show a dialog } @Override @@ -227,6 +229,8 @@ public class TimerService extends Service { return START_STICKY; } + + private Notification buildNotification() { NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setContentTitle(getString(R.string.app_name)); @@ -240,7 +244,12 @@ public class TimerService extends Service { String time = String.format(Locale.US, "%02d:%02d:%02d", hours, minutes, seconds); builder.setContentText(time); - builder.setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, TimerActivity.class), FLAG_UPDATE_CURRENT)); + + + Intent intent = new Intent(this, TimerActivity.class); + intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP); + + builder.setContentIntent(PendingIntent.getActivity(this, 0, intent, FLAG_UPDATE_CURRENT)); builder.setColor(ContextCompat.getColor(this, R.color.colorAccent)); builder.setPriority(NotificationCompat.PRIORITY_HIGH); builder.setWhen(0); @@ -264,6 +273,14 @@ public class TimerService extends Service { return mBinder; } + @Override + public boolean onUnbind(Intent intent) { + if(isReset()){ + stopSelf(); + } + return super.onUnbind(intent); + } + public static void startService(Context context) { context.startService(new Intent(context.getApplicationContext(), TimerService.class)); } @@ -272,6 +289,10 @@ public class TimerService extends Service { return remainingDuration; } + public boolean isReset() { + return !isRunning() && !isPaused(); + } + public class TimerServiceBinder extends Binder { public TimerService getService() { return TimerService.this; diff --git a/app/src/main/res/drawable/BreakReminder_0.png b/app/src/main/res/drawable/BreakReminder_0.png new file mode 100644 index 0000000..5372254 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_0.png differ diff --git a/app/src/main/res/drawable/BreakReminder_1.png b/app/src/main/res/drawable/BreakReminder_1.png new file mode 100644 index 0000000..ddb1eb1 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_1.png differ diff --git a/app/src/main/res/drawable/BreakReminder_10.png b/app/src/main/res/drawable/BreakReminder_10.png new file mode 100644 index 0000000..920bf5e Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_10.png differ diff --git a/app/src/main/res/drawable/BreakReminder_11.png b/app/src/main/res/drawable/BreakReminder_11.png new file mode 100644 index 0000000..e9bcdf3 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_11.png differ diff --git a/app/src/main/res/drawable/BreakReminder_12.png b/app/src/main/res/drawable/BreakReminder_12.png new file mode 100644 index 0000000..a65f8f9 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_12.png differ diff --git a/app/src/main/res/drawable/BreakReminder_13.png b/app/src/main/res/drawable/BreakReminder_13.png new file mode 100644 index 0000000..8eb061b Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_13.png differ diff --git a/app/src/main/res/drawable/BreakReminder_14.png b/app/src/main/res/drawable/BreakReminder_14.png new file mode 100644 index 0000000..9cf62e5 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_14.png differ diff --git a/app/src/main/res/drawable/BreakReminder_15.png b/app/src/main/res/drawable/BreakReminder_15.png new file mode 100644 index 0000000..9989210 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_15.png differ diff --git a/app/src/main/res/drawable/BreakReminder_16.png b/app/src/main/res/drawable/BreakReminder_16.png new file mode 100644 index 0000000..ff6230d Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_16.png differ diff --git a/app/src/main/res/drawable/BreakReminder_17.png b/app/src/main/res/drawable/BreakReminder_17.png new file mode 100644 index 0000000..c8a967f Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_17.png differ diff --git a/app/src/main/res/drawable/BreakReminder_18.png b/app/src/main/res/drawable/BreakReminder_18.png new file mode 100644 index 0000000..da15256 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_18.png differ diff --git a/app/src/main/res/drawable/BreakReminder_19.png b/app/src/main/res/drawable/BreakReminder_19.png new file mode 100644 index 0000000..6b3eda4 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_19.png differ diff --git a/app/src/main/res/drawable/BreakReminder_2.png b/app/src/main/res/drawable/BreakReminder_2.png new file mode 100644 index 0000000..818a3a8 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_2.png differ diff --git a/app/src/main/res/drawable/BreakReminder_20.png b/app/src/main/res/drawable/BreakReminder_20.png new file mode 100644 index 0000000..eac440a Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_20.png differ diff --git a/app/src/main/res/drawable/BreakReminder_21.png b/app/src/main/res/drawable/BreakReminder_21.png new file mode 100644 index 0000000..c721382 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_21.png differ diff --git a/app/src/main/res/drawable/BreakReminder_22.png b/app/src/main/res/drawable/BreakReminder_22.png new file mode 100644 index 0000000..9f90742 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_22.png differ diff --git a/app/src/main/res/drawable/BreakReminder_23.png b/app/src/main/res/drawable/BreakReminder_23.png new file mode 100644 index 0000000..f0abd6f Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_23.png differ diff --git a/app/src/main/res/drawable/BreakReminder_24.png b/app/src/main/res/drawable/BreakReminder_24.png new file mode 100644 index 0000000..53f23ca Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_24.png differ diff --git a/app/src/main/res/drawable/BreakReminder_25.png b/app/src/main/res/drawable/BreakReminder_25.png new file mode 100644 index 0000000..4a7aaf9 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_25.png differ diff --git a/app/src/main/res/drawable/BreakReminder_26.png b/app/src/main/res/drawable/BreakReminder_26.png new file mode 100644 index 0000000..9b2ec10 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_26.png differ diff --git a/app/src/main/res/drawable/BreakReminder_27.png b/app/src/main/res/drawable/BreakReminder_27.png new file mode 100644 index 0000000..c554872 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_27.png differ diff --git a/app/src/main/res/drawable/BreakReminder_28.png b/app/src/main/res/drawable/BreakReminder_28.png new file mode 100644 index 0000000..513dfbb Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_28.png differ diff --git a/app/src/main/res/drawable/BreakReminder_29.png b/app/src/main/res/drawable/BreakReminder_29.png new file mode 100644 index 0000000..696b178 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_29.png differ diff --git a/app/src/main/res/drawable/BreakReminder_3.png b/app/src/main/res/drawable/BreakReminder_3.png new file mode 100644 index 0000000..0342c24 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_3.png differ diff --git a/app/src/main/res/drawable/BreakReminder_30.png b/app/src/main/res/drawable/BreakReminder_30.png new file mode 100644 index 0000000..874cfd2 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_30.png differ diff --git a/app/src/main/res/drawable/BreakReminder_31.png b/app/src/main/res/drawable/BreakReminder_31.png new file mode 100644 index 0000000..f6a646a Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_31.png differ diff --git a/app/src/main/res/drawable/BreakReminder_32.png b/app/src/main/res/drawable/BreakReminder_32.png new file mode 100644 index 0000000..d1d75c9 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_32.png differ diff --git a/app/src/main/res/drawable/BreakReminder_33.png b/app/src/main/res/drawable/BreakReminder_33.png new file mode 100644 index 0000000..95d2276 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_33.png differ diff --git a/app/src/main/res/drawable/BreakReminder_34.png b/app/src/main/res/drawable/BreakReminder_34.png new file mode 100644 index 0000000..e68479c Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_34.png differ diff --git a/app/src/main/res/drawable/BreakReminder_35.png b/app/src/main/res/drawable/BreakReminder_35.png new file mode 100644 index 0000000..6003458 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_35.png differ diff --git a/app/src/main/res/drawable/BreakReminder_36.png b/app/src/main/res/drawable/BreakReminder_36.png new file mode 100644 index 0000000..9672288 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_36.png differ diff --git a/app/src/main/res/drawable/BreakReminder_37.png b/app/src/main/res/drawable/BreakReminder_37.png new file mode 100644 index 0000000..8d14550 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_37.png differ diff --git a/app/src/main/res/drawable/BreakReminder_38.png b/app/src/main/res/drawable/BreakReminder_38.png new file mode 100644 index 0000000..94b6558 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_38.png differ diff --git a/app/src/main/res/drawable/BreakReminder_39.png b/app/src/main/res/drawable/BreakReminder_39.png new file mode 100644 index 0000000..8792547 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_39.png differ diff --git a/app/src/main/res/drawable/BreakReminder_4.png b/app/src/main/res/drawable/BreakReminder_4.png new file mode 100644 index 0000000..dbb3534 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_4.png differ diff --git a/app/src/main/res/drawable/BreakReminder_40.png b/app/src/main/res/drawable/BreakReminder_40.png new file mode 100644 index 0000000..2c83022 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_40.png differ diff --git a/app/src/main/res/drawable/BreakReminder_41.png b/app/src/main/res/drawable/BreakReminder_41.png new file mode 100644 index 0000000..134b2ee Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_41.png differ diff --git a/app/src/main/res/drawable/BreakReminder_42.png b/app/src/main/res/drawable/BreakReminder_42.png new file mode 100644 index 0000000..4ad226c Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_42.png differ diff --git a/app/src/main/res/drawable/BreakReminder_43.png b/app/src/main/res/drawable/BreakReminder_43.png new file mode 100644 index 0000000..9f454ae Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_43.png differ diff --git a/app/src/main/res/drawable/BreakReminder_44.png b/app/src/main/res/drawable/BreakReminder_44.png new file mode 100644 index 0000000..0252636 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_44.png differ diff --git a/app/src/main/res/drawable/BreakReminder_45.png b/app/src/main/res/drawable/BreakReminder_45.png new file mode 100644 index 0000000..1edceb5 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_45.png differ diff --git a/app/src/main/res/drawable/BreakReminder_46.png b/app/src/main/res/drawable/BreakReminder_46.png new file mode 100644 index 0000000..8cac1dc Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_46.png differ diff --git a/app/src/main/res/drawable/BreakReminder_47.png b/app/src/main/res/drawable/BreakReminder_47.png new file mode 100644 index 0000000..d59f8e0 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_47.png differ diff --git a/app/src/main/res/drawable/BreakReminder_48.png b/app/src/main/res/drawable/BreakReminder_48.png new file mode 100644 index 0000000..a3508b5 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_48.png differ diff --git a/app/src/main/res/drawable/BreakReminder_49.png b/app/src/main/res/drawable/BreakReminder_49.png new file mode 100644 index 0000000..5249249 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_49.png differ diff --git a/app/src/main/res/drawable/BreakReminder_5.png b/app/src/main/res/drawable/BreakReminder_5.png new file mode 100644 index 0000000..6a20180 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_5.png differ diff --git a/app/src/main/res/drawable/BreakReminder_50.png b/app/src/main/res/drawable/BreakReminder_50.png new file mode 100644 index 0000000..cce18e5 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_50.png differ diff --git a/app/src/main/res/drawable/BreakReminder_51.png b/app/src/main/res/drawable/BreakReminder_51.png new file mode 100644 index 0000000..0ee2b31 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_51.png differ diff --git a/app/src/main/res/drawable/BreakReminder_52.png b/app/src/main/res/drawable/BreakReminder_52.png new file mode 100644 index 0000000..746bfe9 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_52.png differ diff --git a/app/src/main/res/drawable/BreakReminder_53.png b/app/src/main/res/drawable/BreakReminder_53.png new file mode 100644 index 0000000..24eacab Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_53.png differ diff --git a/app/src/main/res/drawable/BreakReminder_54.png b/app/src/main/res/drawable/BreakReminder_54.png new file mode 100644 index 0000000..b093da5 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_54.png differ diff --git a/app/src/main/res/drawable/BreakReminder_55.png b/app/src/main/res/drawable/BreakReminder_55.png new file mode 100644 index 0000000..fe92adc Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_55.png differ diff --git a/app/src/main/res/drawable/BreakReminder_56.png b/app/src/main/res/drawable/BreakReminder_56.png new file mode 100644 index 0000000..aaf53af Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_56.png differ diff --git a/app/src/main/res/drawable/BreakReminder_6.png b/app/src/main/res/drawable/BreakReminder_6.png new file mode 100644 index 0000000..9b08452 Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_6.png differ diff --git a/app/src/main/res/drawable/BreakReminder_7.png b/app/src/main/res/drawable/BreakReminder_7.png new file mode 100644 index 0000000..a7bb9db Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_7.png differ diff --git a/app/src/main/res/drawable/BreakReminder_8.png b/app/src/main/res/drawable/BreakReminder_8.png new file mode 100644 index 0000000..89234ef Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_8.png differ diff --git a/app/src/main/res/drawable/BreakReminder_9.png b/app/src/main/res/drawable/BreakReminder_9.png new file mode 100644 index 0000000..8401d0e Binary files /dev/null and b/app/src/main/res/drawable/BreakReminder_9.png differ diff --git a/app/src/main/res/drawable/exercise_0.png b/app/src/main/res/drawable/exercise_0.png deleted file mode 100644 index 207e71b..0000000 Binary files a/app/src/main/res/drawable/exercise_0.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_1.png b/app/src/main/res/drawable/exercise_1.png deleted file mode 100644 index 6638ec0..0000000 Binary files a/app/src/main/res/drawable/exercise_1.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_10.png b/app/src/main/res/drawable/exercise_10.png deleted file mode 100644 index cd5b654..0000000 Binary files a/app/src/main/res/drawable/exercise_10.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_11.png b/app/src/main/res/drawable/exercise_11.png deleted file mode 100644 index 3abc147..0000000 Binary files a/app/src/main/res/drawable/exercise_11.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_12.png b/app/src/main/res/drawable/exercise_12.png deleted file mode 100644 index 9d22afc..0000000 Binary files a/app/src/main/res/drawable/exercise_12.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_13.png b/app/src/main/res/drawable/exercise_13.png deleted file mode 100644 index b5a2dca..0000000 Binary files a/app/src/main/res/drawable/exercise_13.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_14.png b/app/src/main/res/drawable/exercise_14.png deleted file mode 100644 index 5b5ffdf..0000000 Binary files a/app/src/main/res/drawable/exercise_14.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_15.png b/app/src/main/res/drawable/exercise_15.png deleted file mode 100644 index b6b17ca..0000000 Binary files a/app/src/main/res/drawable/exercise_15.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_16.png b/app/src/main/res/drawable/exercise_16.png deleted file mode 100644 index 16da6cf..0000000 Binary files a/app/src/main/res/drawable/exercise_16.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_17.png b/app/src/main/res/drawable/exercise_17.png deleted file mode 100644 index d4862f0..0000000 Binary files a/app/src/main/res/drawable/exercise_17.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_18.png b/app/src/main/res/drawable/exercise_18.png deleted file mode 100644 index 724d175..0000000 Binary files a/app/src/main/res/drawable/exercise_18.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_19.png b/app/src/main/res/drawable/exercise_19.png deleted file mode 100644 index f43eaba..0000000 Binary files a/app/src/main/res/drawable/exercise_19.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_2.png b/app/src/main/res/drawable/exercise_2.png deleted file mode 100644 index ebc44f7..0000000 Binary files a/app/src/main/res/drawable/exercise_2.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_20.png b/app/src/main/res/drawable/exercise_20.png deleted file mode 100644 index d8f076d..0000000 Binary files a/app/src/main/res/drawable/exercise_20.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_21.png b/app/src/main/res/drawable/exercise_21.png deleted file mode 100644 index c129168..0000000 Binary files a/app/src/main/res/drawable/exercise_21.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_22.png b/app/src/main/res/drawable/exercise_22.png deleted file mode 100644 index 958dc1d..0000000 Binary files a/app/src/main/res/drawable/exercise_22.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_23.png b/app/src/main/res/drawable/exercise_23.png deleted file mode 100644 index c4d8a2e..0000000 Binary files a/app/src/main/res/drawable/exercise_23.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_24.png b/app/src/main/res/drawable/exercise_24.png deleted file mode 100644 index 43c0157..0000000 Binary files a/app/src/main/res/drawable/exercise_24.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_25.png b/app/src/main/res/drawable/exercise_25.png deleted file mode 100644 index aae1375..0000000 Binary files a/app/src/main/res/drawable/exercise_25.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_26.png b/app/src/main/res/drawable/exercise_26.png deleted file mode 100644 index 4b9b467..0000000 Binary files a/app/src/main/res/drawable/exercise_26.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_27.png b/app/src/main/res/drawable/exercise_27.png deleted file mode 100644 index 0a9e54d..0000000 Binary files a/app/src/main/res/drawable/exercise_27.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_28.png b/app/src/main/res/drawable/exercise_28.png deleted file mode 100644 index 000597c..0000000 Binary files a/app/src/main/res/drawable/exercise_28.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_29.png b/app/src/main/res/drawable/exercise_29.png deleted file mode 100644 index 7dedb0c..0000000 Binary files a/app/src/main/res/drawable/exercise_29.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_3.png b/app/src/main/res/drawable/exercise_3.png deleted file mode 100644 index 7b1d824..0000000 Binary files a/app/src/main/res/drawable/exercise_3.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_30.png b/app/src/main/res/drawable/exercise_30.png deleted file mode 100644 index 5993d6e..0000000 Binary files a/app/src/main/res/drawable/exercise_30.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_31.png b/app/src/main/res/drawable/exercise_31.png deleted file mode 100644 index 9a96cab..0000000 Binary files a/app/src/main/res/drawable/exercise_31.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_32.png b/app/src/main/res/drawable/exercise_32.png deleted file mode 100644 index f0e0d0c..0000000 Binary files a/app/src/main/res/drawable/exercise_32.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_33.png b/app/src/main/res/drawable/exercise_33.png deleted file mode 100644 index 6dbb1c3..0000000 Binary files a/app/src/main/res/drawable/exercise_33.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_34.png b/app/src/main/res/drawable/exercise_34.png deleted file mode 100644 index 0e05196..0000000 Binary files a/app/src/main/res/drawable/exercise_34.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_35.png b/app/src/main/res/drawable/exercise_35.png deleted file mode 100644 index fee106d..0000000 Binary files a/app/src/main/res/drawable/exercise_35.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_36.png b/app/src/main/res/drawable/exercise_36.png deleted file mode 100644 index 530fced..0000000 Binary files a/app/src/main/res/drawable/exercise_36.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_37.png b/app/src/main/res/drawable/exercise_37.png deleted file mode 100644 index 302756b..0000000 Binary files a/app/src/main/res/drawable/exercise_37.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_38.png b/app/src/main/res/drawable/exercise_38.png deleted file mode 100644 index a18a7cf..0000000 Binary files a/app/src/main/res/drawable/exercise_38.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_39.png b/app/src/main/res/drawable/exercise_39.png deleted file mode 100644 index d03c4ad..0000000 Binary files a/app/src/main/res/drawable/exercise_39.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_4.png b/app/src/main/res/drawable/exercise_4.png deleted file mode 100644 index 871ddf4..0000000 Binary files a/app/src/main/res/drawable/exercise_4.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_40.png b/app/src/main/res/drawable/exercise_40.png deleted file mode 100644 index d3d49fb..0000000 Binary files a/app/src/main/res/drawable/exercise_40.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_41.png b/app/src/main/res/drawable/exercise_41.png deleted file mode 100644 index ae81db1..0000000 Binary files a/app/src/main/res/drawable/exercise_41.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_42.png b/app/src/main/res/drawable/exercise_42.png deleted file mode 100644 index 6b49f9f..0000000 Binary files a/app/src/main/res/drawable/exercise_42.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_43.png b/app/src/main/res/drawable/exercise_43.png deleted file mode 100644 index d07a812..0000000 Binary files a/app/src/main/res/drawable/exercise_43.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_44.png b/app/src/main/res/drawable/exercise_44.png deleted file mode 100644 index 2572c1a..0000000 Binary files a/app/src/main/res/drawable/exercise_44.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_45.png b/app/src/main/res/drawable/exercise_45.png deleted file mode 100644 index 6f3629d..0000000 Binary files a/app/src/main/res/drawable/exercise_45.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_46.png b/app/src/main/res/drawable/exercise_46.png deleted file mode 100644 index c1582d0..0000000 Binary files a/app/src/main/res/drawable/exercise_46.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_47.png b/app/src/main/res/drawable/exercise_47.png deleted file mode 100644 index 66e11f7..0000000 Binary files a/app/src/main/res/drawable/exercise_47.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_48.png b/app/src/main/res/drawable/exercise_48.png deleted file mode 100644 index 2143534..0000000 Binary files a/app/src/main/res/drawable/exercise_48.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_49.png b/app/src/main/res/drawable/exercise_49.png deleted file mode 100644 index ad13ec6..0000000 Binary files a/app/src/main/res/drawable/exercise_49.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_5.png b/app/src/main/res/drawable/exercise_5.png deleted file mode 100644 index d4eb18a..0000000 Binary files a/app/src/main/res/drawable/exercise_5.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_50.png b/app/src/main/res/drawable/exercise_50.png deleted file mode 100644 index b0011f9..0000000 Binary files a/app/src/main/res/drawable/exercise_50.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_51.png b/app/src/main/res/drawable/exercise_51.png deleted file mode 100644 index f578147..0000000 Binary files a/app/src/main/res/drawable/exercise_51.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_52.png b/app/src/main/res/drawable/exercise_52.png deleted file mode 100644 index 98f1c8d..0000000 Binary files a/app/src/main/res/drawable/exercise_52.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_53.png b/app/src/main/res/drawable/exercise_53.png deleted file mode 100644 index e6b7ecd..0000000 Binary files a/app/src/main/res/drawable/exercise_53.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_54.png b/app/src/main/res/drawable/exercise_54.png deleted file mode 100644 index 00084ed..0000000 Binary files a/app/src/main/res/drawable/exercise_54.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_55.png b/app/src/main/res/drawable/exercise_55.png deleted file mode 100644 index 6b0e7e1..0000000 Binary files a/app/src/main/res/drawable/exercise_55.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_56.png b/app/src/main/res/drawable/exercise_56.png deleted file mode 100644 index d562b40..0000000 Binary files a/app/src/main/res/drawable/exercise_56.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_57.png b/app/src/main/res/drawable/exercise_57.png deleted file mode 100644 index 72841d9..0000000 Binary files a/app/src/main/res/drawable/exercise_57.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_58.png b/app/src/main/res/drawable/exercise_58.png deleted file mode 100644 index 9019a9b..0000000 Binary files a/app/src/main/res/drawable/exercise_58.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_59.png b/app/src/main/res/drawable/exercise_59.png deleted file mode 100644 index 8be14b8..0000000 Binary files a/app/src/main/res/drawable/exercise_59.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_6.png b/app/src/main/res/drawable/exercise_6.png deleted file mode 100644 index b7a2a64..0000000 Binary files a/app/src/main/res/drawable/exercise_6.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_60.png b/app/src/main/res/drawable/exercise_60.png deleted file mode 100644 index 4b9b4aa..0000000 Binary files a/app/src/main/res/drawable/exercise_60.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_61.png b/app/src/main/res/drawable/exercise_61.png deleted file mode 100644 index e79a240..0000000 Binary files a/app/src/main/res/drawable/exercise_61.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_62.png b/app/src/main/res/drawable/exercise_62.png deleted file mode 100644 index e6d3c67..0000000 Binary files a/app/src/main/res/drawable/exercise_62.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_63.png b/app/src/main/res/drawable/exercise_63.png deleted file mode 100644 index 7d12ac1..0000000 Binary files a/app/src/main/res/drawable/exercise_63.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_64.png b/app/src/main/res/drawable/exercise_64.png deleted file mode 100644 index febddb8..0000000 Binary files a/app/src/main/res/drawable/exercise_64.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_7.png b/app/src/main/res/drawable/exercise_7.png deleted file mode 100644 index 5cdce5b..0000000 Binary files a/app/src/main/res/drawable/exercise_7.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_8.png b/app/src/main/res/drawable/exercise_8.png deleted file mode 100644 index cdf5363..0000000 Binary files a/app/src/main/res/drawable/exercise_8.png and /dev/null differ diff --git a/app/src/main/res/drawable/exercise_9.png b/app/src/main/res/drawable/exercise_9.png deleted file mode 100644 index c09dfc3..0000000 Binary files a/app/src/main/res/drawable/exercise_9.png and /dev/null differ diff --git a/app/src/main/res/drawable/progress_circular.xml b/app/src/main/res/drawable/progress_circular.xml index d448196..e045c36 100644 --- a/app/src/main/res/drawable/progress_circular.xml +++ b/app/src/main/res/drawable/progress_circular.xml @@ -16,7 +16,6 @@ android:shape="ring" android:thicknessRatio="12"> - \ No newline at end of file diff --git a/app/src/main/res/drawable/progress_circular_small.xml b/app/src/main/res/drawable/progress_circular_small.xml index 7e6da40..04d6e8b 100644 --- a/app/src/main/res/drawable/progress_circular_small.xml +++ b/app/src/main/res/drawable/progress_circular_small.xml @@ -12,11 +12,10 @@ - \ No newline at end of file diff --git a/app/src/main/res/layout-v21/layout_exercise_set.xml b/app/src/main/res/layout-v21/layout_exercise_set.xml new file mode 100644 index 0000000..56cacd9 --- /dev/null +++ b/app/src/main/res/layout-v21/layout_exercise_set.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_edit_exercise_set.xml b/app/src/main/res/layout/activity_edit_exercise_set.xml index f231ecb..ba7acdd 100644 --- a/app/src/main/res/layout/activity_edit_exercise_set.xml +++ b/app/src/main/res/layout/activity_edit_exercise_set.xml @@ -41,21 +41,10 @@ - - + tools:context="org.secuso.privacyfriendlybreakreminder.activities.ManageExerciseSetsActivity" + android:id="@+id/constraintLayout2"> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_exercise.xml b/app/src/main/res/layout/activity_exercise.xml index df1122d..2ba4dbc 100644 --- a/app/src/main/res/layout/activity_exercise.xml +++ b/app/src/main/res/layout/activity_exercise.xml @@ -160,28 +160,58 @@ - + android:layout_marginLeft="32dp" + android:layout_marginRight="32dp" + android:layout_marginTop="8dp" + app:layout_constraintDimensionRatio="w,1:1"> + + + + + + @@ -189,10 +219,8 @@ android:id="@+id/execution" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="8dp" - android:layout_marginStart="8dp" - android:layout_marginTop="5dp" android:text="sitting or standing" + android:visibility="gone" app:layout_constraintLeft_toRightOf="@+id/progressBarLayout" app:layout_constraintTop_toBottomOf="@+id/execution_title" /> @@ -200,20 +228,18 @@ android:id="@+id/description_title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="8dp" - android:layout_marginStart="8dp" - android:layout_marginTop="8dp" android:text="@string/description" android:textStyle="bold" + android:visibility="gone" app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintTop_toBottomOf="@+id/exercise_image" /> + app:layout_constraintTop_toBottomOf="@+id/exercise_image_container" /> @@ -249,8 +275,6 @@ android:id="@+id/bigProgressBarLayout" android:layout_width="0dp" android:layout_height="0dp" - android:layout_marginLeft="8dp" - android:layout_marginRight="8dp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" @@ -262,7 +286,7 @@ android:id="@+id/progressBarBig" style="?android:attr/progressBarStyleHorizontal" android:layout_width="0dp" - android:layout_height="250dp" + android:layout_height="16dp" android:layout_centerHorizontal="true" android:max="100" android:onClick="onClick" diff --git a/app/src/main/res/layout/activity_manage_exercise_set.xml b/app/src/main/res/layout/activity_manage_exercise_set.xml index 307f4c8..9ff1a30 100644 --- a/app/src/main/res/layout/activity_manage_exercise_set.xml +++ b/app/src/main/res/layout/activity_manage_exercise_set.xml @@ -11,7 +11,6 @@ @@ -22,19 +21,6 @@ android:id="@+id/main_content" android:layout_height="match_parent"> - - + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_timer.xml b/app/src/main/res/layout/activity_timer.xml index d91fd11..7c60d89 100644 --- a/app/src/main/res/layout/activity_timer.xml +++ b/app/src/main/res/layout/activity_timer.xml @@ -25,11 +25,6 @@ app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="org.secuso.privacyfriendlybreakreminder.activities.TimerActivity"> - - + app:np_max="23" + app:np_min="0"/> + + - + android:background="@color/transparent" + android:clickable="false" + android:focusable="false" + app:np_max="59" + app:np_min="0"/> + + - + + @@ -173,30 +202,52 @@ android:orientation="horizontal" android:visibility="visible"> - + + - + + diff --git a/app/src/main/res/layout/layout_exercise_grid_item.xml b/app/src/main/res/layout/layout_exercise_grid_item.xml index a851fbb..4084f74 100644 --- a/app/src/main/res/layout/layout_exercise_grid_item.xml +++ b/app/src/main/res/layout/layout_exercise_grid_item.xml @@ -1,20 +1,21 @@ + app:layout_constraintDimensionRatio="h,1:1" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="120dp"> - + android:title="@string/title_activity_settings" /> Profil Name Bildschirm bleibt an Klingelton - Beim Klicken auf das aktuell ausgewählte Profils (\'Zufall\'), werden alle verfügbare Profile angezeigt.\n Sie können ein neues Profil durch das Klicken auf \'Neues Profil...\' erstellen.\n Die verfügbaren Profile können Sie in den Einstellungen ändern.\nAm Anfang existieren 3 voreingestellte Profile + Beim Klicken auf das aktuell ausgewählte Profils (\'Zufall\'), werden alle verfügbare Profile angezeigt.\n Sie können ein neues Profil durch das Klicken auf \'Neues Profil…\' erstellen.\n Die verfügbaren Profile können Sie in den Einstellungen ändern.\nAm Anfang existieren 3 voreingestellte Profile Beim Klicken auf eins der beiden Symbole, startet die Uhr oder hält diese an Verbleibende Zeit Vibration Profil Name - Diese Applikation gehört der Gruppe von Privacy Friendly Apps, entwickelt von der Technische Universität Darmstadt. Quellcode lizensiert unter GPLv3. Bilder Copyright TU Darmstadt und Google Inc. + Diese Applikation gehört der Gruppe von Privacy Friendly Apps, entwickelt von der Technische Universität Darmstadt. Quellcode lizenziert unter GPLv3. Bilder Copyright TU Darmstadt und Google Inc. Speichern Derzeitiger Wert ist $1 Wählen Sie ihre Arbeitszeit aus @@ -94,7 +94,7 @@ Haftungsausschluss - Neues Profil... + Neues Profil… Arme.Beine.Kopf.Nacken.Becken.Wirbelsäule.Rumpf. Über Hilfe öffnen @@ -119,4 +119,47 @@ Interaktive Uhr Beim Klicken auf \'Next\' wird eine andere Übung aus der aktuellen Körperregion ausgewählt. Zugleich wird die Uhr wieder auf die letzte volle Minute gesetzt. Somit geht keine Zeit für die Übungen verloren. Bedienungsanleitung + Einstellungen + Geben Sie einen Namen ein… + Torso + Bitte geben Sie einen Namen an. + Wähle eine Pausendauer: + Wähle die Arbeitsdauer: + Über + Break Reminder + Wähle Übungen + Übungsset bearbeiten + Übung + Hilfe + Übungsset + Neues Übungsset + verwerfen + Ausführung + Übung + Arme + Kopf + Beine + Nacken + Becken + Wirbel + bearbeiten + Nein + Okay + Keine Übungssets vorhanden. Bitte erstellen Sie ein neues Übungsset. + Verbleibende Zeit: + Dieses Übungsset enthält keine Übungen. + Überspringen + Willkommen! + Übungsset editieren + Tutorial + Bitte wählen Sie mindestens einen Eintrag zum Löschen aus. + Bitte geben Sie einen Namen an. + Ja + Machen Sie eine Pause! Tippen Sie hier um Ihre ausgewählten Übungen auszuführen. + Beschreibung + Übungssetname + Möchten sie die Pause beenden? + Pausenzeit ist um! + Möchsten Sie zurück zum Hauptmenü? + Sind Sie sicher, dass Sie die Änderungen verwerfen möchten? \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 15b1864..e53ece4 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -119,5 +119,6 @@ Horloge interactive En appuyant sur l\'horloge à chaque étape de cette application, l\'horloge peut être démarré et arrêté . En cliquant sur le bouton \'next\', l\'application va choisir un nouvel exercice dans la région du corps actuel. Dans le même temps l\'horloge sera remise à zéro sur la minute d\'avant, que le temps sera dépenser pleinement sur les exercices. + Break Reminder \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index a56e8cb..9393e7b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -118,4 +118,5 @@ При нажатии на кнопку \'Next\', приложение будет выбрать новое упражнение в текущей области тела. В то же время часы будут сброшены на следующую полную минуту, чтобы провестить время полностью на упражнениях. Интерактивные часы При нажатии на часы возможно их запустить или остановить. + Break Reminder \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 5455e5c..3206875 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -23,4 +23,7 @@ http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout 40dp 180dp 16dp + + 16sp + 18sp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index db5be60..00642bc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -180,7 +180,7 @@ New Exercise Set exercise set name Add New Exercise Set - @string/app_name + Break Reminder Exercise Set Name keep editing discard @@ -202,95 +202,7 @@ Github and Guide The sourcecode of this app is available at GitHub. For further explanations have a look at the Privacy Friendly App Guide. Edit Exercise Set - - "Material is the metaphor.\n\n" - "A material metaphor is the unifying theory of a rationalized space and a system of motion." - "The material is grounded in tactile reality, inspired by the study of paper and ink, yet " - "technologically advanced and open to imagination and magic.\n" - "Surfaces and edges of the material provide visual cues that are grounded in reality. The " - "use of familiar tactile attributes helps users quickly understand affordances. Yet the " - "flexibility of the material creates new affordances that supercede those in the physical " - "world, without breaking the rules of physics.\n" - "The fundamentals of light, surface, and movement are key to conveying how objects move, " - "interact, and exist in space and in relation to each other. Realistic lighting shows " - "seams, divides space, and indicates moving parts.\n\n" - - "Bold, graphic, intentional.\n\n" - - "The foundational elements of print based design typography, grids, space, scale, color, " - "and use of imagery guide visual treatments. These elements do far more than please the " - "eye. They create hierarchy, meaning, and focus. Deliberate color choices, edge to edge " - "imagery, large scale typography, and intentional white space create a bold and graphic " - "interface that immerse the user in the experience.\n" - "An emphasis on user actions makes core functionality immediately apparent and provides " - "waypoints for the user.\n\n" - - "Motion provides meaning.\n\n" - - "Motion respects and reinforces the user as the prime mover. Primary user actions are " - "inflection points that initiate motion, transforming the whole design.\n" - "All action takes place in a single environment. Objects are presented to the user without " - "breaking the continuity of experience even as they transform and reorganize.\n" - "Motion is meaningful and appropriate, serving to focus attention and maintain continuity. " - "Feedback is subtle yet clear. Transitions are efficient yet coherent.\n\n" - - "3D world.\n\n" - - "The material environment is a 3D space, which means all objects have x, y, and z " - "dimensions. The z-axis is perpendicularly aligned to the plane of the display, with the " - "positive z-axis extending towards the viewer. Every sheet of material occupies a single " - "position along the z-axis and has a standard 1dp thickness.\n" - "On the web, the z-axis is used for layering and not for perspective. The 3D world is " - "emulated by manipulating the y-axis.\n\n" - - "Light and shadow.\n\n" - - "Within the material environment, virtual lights illuminate the scene. Key lights create " - "directional shadows, while ambient light creates soft shadows from all angles.\n" - "Shadows in the material environment are cast by these two light sources. In Android " - "development, shadows occur when light sources are blocked by sheets of material at " - "various positions along the z-axis. On the web, shadows are depicted by manipulating the " - "y-axis only. The following example shows the card with a height of 6dp.\n\n" - - "Resting elevation.\n\n" - - "All material objects, regardless of size, have a resting elevation, or default elevation " - "that does not change. If an object changes elevation, it should return to its resting " - "elevation as soon as possible.\n\n" - - "Component elevations.\n\n" - - "The resting elevation for a component type is consistent across apps (e.g., FAB elevation " - "does not vary from 6dp in one app to 16dp in another app).\n" - "Components may have different resting elevations across platforms, depending on the depth " - "of the environment (e.g., TV has a greater depth than mobile or desktop).\n\n" - - "Responsive elevation and dynamic elevation offsets.\n\n" - - "Some component types have responsive elevation, meaning they change elevation in response " - "to user input (e.g., normal, focused, and pressed) or system events. These elevation " - "changes are consistently implemented using dynamic elevation offsets.\n" - "Dynamic elevation offsets are the goal elevation that a component moves towards, relative " - "to the component’s resting state. They ensure that elevation changes are consistent " - "across actions and component types. For example, all components that lift on press have " - "the same elevation change relative to their resting elevation.\n" - "Once the input event is completed or cancelled, the component will return to its resting " - "elevation.\n\n" - - "Avoiding elevation interference.\n\n" - - "Components with responsive elevations may encounter other components as they move between " - "their resting elevations and dynamic elevation offsets. Because material cannot pass " - "through other material, components avoid interfering with one another any number of ways, " - "whether on a per component basis or using the entire app layout.\n" - "On a component level, components can move or be removed before they cause interference. " - "For example, a floating action button (FAB) can disappear or move off screen before a " - "user picks up a card, or it can move if a snackbar appears.\n" - "On the layout level, design your app layout to minimize opportunities for interference. " - "For example, position the FAB to one side of stream of a cards so the FAB won’t interfere " - "when a user tries to pick up one of cards.\n\n" - Settings Enter a name … Head @@ -318,6 +230,11 @@ Execution Description This set contains no exercises. + Take a break now! Click here to do your chosen exercises. + + %02d + Exercise time (in Seconds) + Keep screen on during exercise diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index ff425f6..663299e 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -16,7 +16,7 @@ diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml index ecedd7e..43af0cc 100644 --- a/app/src/main/res/xml/pref_general.xml +++ b/app/src/main/res/xml/pref_general.xml @@ -1,58 +1,16 @@ - - - - - + + android:defaultValue="30" + android:inputType="number" + android:numeric="integer" + android:maxLength="2" + android:key="pref_exercise_time" + android:title="@string/pref_exercise_time"/> - - - - - - - - - - - + diff --git a/app/src/main/res/xml/pref_headers.xml b/app/src/main/res/xml/pref_headers.xml index f8ba6ff..54d52fd 100644 --- a/app/src/main/res/xml/pref_headers.xml +++ b/app/src/main/res/xml/pref_headers.xml @@ -3,15 +3,8 @@
-
- - - diff --git a/app/src/main/res/xml/pref_notification.xml b/app/src/main/res/xml/pref_notification.xml deleted file mode 100644 index f61bed4..0000000 --- a/app/src/main/res/xml/pref_notification.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - -