From 11ff7ae10f73895ce2a0adfbb0c0edf3b42a2751 Mon Sep 17 00:00:00 2001 From: Christopher Beckmann Date: Mon, 7 May 2018 13:19:54 +0200 Subject: [PATCH] Added a label to exercise sets that shows the minimum time it takes to complete an exercise set. Also some minor bugfixes. --- .idea/codeStyles/Project.xml | 77 +++++++++++++++++++ app/build.gradle | 14 +++- .../activities/ChooseExerciseActivity.java | 24 +++++- .../activities/EditExerciseSetActivity.java | 27 ++++++- .../activities/ExerciseActivity.java | 1 + .../activities/adapter/ExerciseAdapter.java | 65 +++++++++++++++- .../adapter/ExerciseSetListAdapter.java | 23 +++++- .../adapter/ExerciseSetSpinnerAdapter.java | 17 +++- .../helper/IExerciseTimeUpdateable.java | 11 +++ .../activities/tutorial/TutorialActivity.java | 15 ++-- .../database/columns/ExerciseColumns.java | 1 + app/src/main/res/drawable/ic_alarm_white.xml | 9 +++ .../res/layout/activity_choose_exercise.xml | 32 ++++++-- .../res/layout/activity_edit_exercise_set.xml | 65 +++++++++++----- app/src/main/res/layout/activity_exercise.xml | 3 - .../layout/activity_manage_exercise_set.xml | 5 +- .../res/layout/layout_exercise_grid_item.xml | 22 +++--- .../main/res/layout/layout_exercise_set.xml | 14 ++++ app/src/main/res/values-de/strings.xml | 4 + app/src/main/res/values-v21/styles.xml | 2 +- app/src/main/res/values/strings.xml | 2 + build.gradle | 1 + gradle/wrapper/gradle-wrapper.properties | 4 +- 23 files changed, 368 insertions(+), 70 deletions(-) create mode 100644 .idea/codeStyles/Project.xml create mode 100644 app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/helper/IExerciseTimeUpdateable.java create mode 100644 app/src/main/res/drawable/ic_alarm_white.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..d5ec3da --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 1bbb80b..53ba018 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 25 - buildToolsVersion '26.0.2' + buildToolsVersion '26.0.3' defaultConfig { applicationId "org.secuso.privacyfriendlybreakreminder" @@ -12,6 +12,12 @@ android { versionName "2.1" vectorDrawables.useSupportLibrary = true } + lintOptions { + checkReleaseBuilds false + // Or, if you prefer, you can continue to check for errors in release builds, + // but continue the build even when errors are found: + abortOnError false + } buildTypes { release { minifyEnabled false @@ -34,11 +40,11 @@ dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:25.4.0' compile 'com.android.support:design:25.4.0' - compile 'com.github.bumptech.glide:glide:3.7.0' + compile 'com.github.bumptech.glide:glide:4.0.0' compile 'com.android.support:support-v4:25.4.0' - compile 'com.android.support:support-annotations:27.0.0' + compile 'com.android.support:support-annotations:27.1.1' compile 'com.android.support:cardview-v7:25.4.0' - compile 'com.android.support.constraint:constraint-layout:1.0.2' + compile 'com.android.support.constraint:constraint-layout:1.1.0' compile 'com.nex3z:flow-layout:1.0.0' compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1' testCompile 'junit:junit:4.12' diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ChooseExerciseActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ChooseExerciseActivity.java index d7c8dbc..d5f3f57 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ChooseExerciseActivity.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ChooseExerciseActivity.java @@ -1,6 +1,8 @@ package org.secuso.privacyfriendlybreakreminder.activities; import android.content.Intent; +import android.os.PersistableBundle; +import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.support.v4.util.Pair; import android.support.v7.app.ActionBar; @@ -20,6 +22,7 @@ import android.widget.ToggleButton; import org.secuso.privacyfriendlybreakreminder.R; import org.secuso.privacyfriendlybreakreminder.activities.adapter.ExerciseAdapter; +import org.secuso.privacyfriendlybreakreminder.activities.helper.IExerciseTimeUpdateable; import org.secuso.privacyfriendlybreakreminder.database.SQLiteHelper; import org.secuso.privacyfriendlybreakreminder.database.data.Exercise; import com.nex3z.flowlayout.FlowLayout; @@ -40,7 +43,7 @@ import static org.secuso.privacyfriendlybreakreminder.activities.adapter.Exercis * @version 2.0 * @see EditExerciseSetActivity */ -public class ChooseExerciseActivity extends AppCompatActivity { +public class ChooseExerciseActivity extends AppCompatActivity implements IExerciseTimeUpdateable { private static final String TAG = ChooseExerciseActivity.class.getSimpleName(); @@ -48,6 +51,7 @@ public class ChooseExerciseActivity extends AppCompatActivity { FlowLayout filterButtonLayout; RecyclerView exerciseList; + TextView exerciseSetTimeText; ExerciseAdapter exerciseAdapter; SQLiteHelper databaseHelper; @@ -76,12 +80,19 @@ public class ChooseExerciseActivity extends AppCompatActivity { exerciseAdapter.setCheckedItems(chosenExercisesList); } + @Override + public void onPostCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { + super.onPostCreate(savedInstanceState, persistentState); + + update(0); + } + private void initResources() { databaseHelper = new SQLiteHelper(this); filterButtonLayout = (FlowLayout) findViewById(R.id.layout_filter_buttons); exerciseList = (RecyclerView) findViewById(R.id.exercise_list); - exerciseAdapter = new ExerciseAdapter(this, ID_COMPARATOR); + exerciseAdapter = new ExerciseAdapter(this, ID_COMPARATOR, this); exerciseAdapter.showCheckboxes(true); GridLayoutManager gridLayout = new GridLayoutManager(this, 3); @@ -120,12 +131,16 @@ public class ChooseExerciseActivity extends AppCompatActivity { exerciseAdapter.replaceAll(databaseHelper.getExerciseListBySections(ExerciseLocale.getLocale(), filterSections)); exerciseList.scrollToPosition(0); + update(0); } }); buttons.add(button); filterButtonLayout.addView(view); } + + exerciseSetTimeText = (TextView) findViewById(R.id.exercise_set_time); + update(0); } @@ -171,4 +186,9 @@ public class ChooseExerciseActivity extends AppCompatActivity { result.putExtra(EXTRA_SELECTED_EXERCISES, selectedIds); setResult(RESULT_OK, result); } + + @Override + public void update(int i) { + exerciseSetTimeText.setText(getString(R.string.exercise_time, exerciseAdapter.getExerciseTimeString())); + } } diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/EditExerciseSetActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/EditExerciseSetActivity.java index d14842d..2ad5c96 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/EditExerciseSetActivity.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/EditExerciseSetActivity.java @@ -4,6 +4,7 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.content.DialogInterface; import android.content.Intent; +import android.preference.PreferenceManager; import android.support.v4.content.AsyncTaskLoader; import android.support.v4.content.Loader; import android.support.v7.app.ActionBar; @@ -27,6 +28,8 @@ import android.widget.TextView; import android.widget.Toast; import org.secuso.privacyfriendlybreakreminder.activities.adapter.ExerciseAdapter; +import org.secuso.privacyfriendlybreakreminder.activities.helper.IExerciseTimeUpdateable; +import org.secuso.privacyfriendlybreakreminder.activities.tutorial.FirstLaunchManager; import org.secuso.privacyfriendlybreakreminder.database.data.Exercise; import org.secuso.privacyfriendlybreakreminder.exercises.ExerciseLocale; import org.secuso.privacyfriendlybreakreminder.R; @@ -34,7 +37,15 @@ import org.secuso.privacyfriendlybreakreminder.database.SQLiteHelper; import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet; import java.util.ArrayList; +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.LinkedList; import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import javax.xml.datatype.Duration; import static org.secuso.privacyfriendlybreakreminder.activities.adapter.ExerciseAdapter.ID_COMPARATOR; @@ -69,6 +80,7 @@ public class EditExerciseSetActivity extends AppCompatActivity implements androi private boolean nameChanged = false; private boolean modificationsDone = false; private SQLiteHelper mDbHelper; + private TextView exerciseSetTimeText; //methods @@ -89,6 +101,16 @@ public class EditExerciseSetActivity extends AppCompatActivity implements androi initResources(); getSupportLoaderManager().initLoader(0, null, this); + + updateExerciseTime(); + } + + private void updateExerciseTime() { + List ids = new LinkedList<>(); + for(Exercise e : mAdapter.getExercises()) { + ids.add(e.getId()); + } + exerciseSetTimeText.setText(getString(R.string.exercise_time, mAdapter.getExerciseTimeString(ids))); } private void initResources() { @@ -96,10 +118,11 @@ public class EditExerciseSetActivity extends AppCompatActivity implements androi toolbar = (Toolbar) findViewById(R.id.toolbar); exerciseSetNameText = (TextView) findViewById(R.id.exercise_set_name); exerciseList = (RecyclerView) findViewById(R.id.exercise_list); - mAdapter = new ExerciseAdapter(this, ID_COMPARATOR); + mAdapter = new ExerciseAdapter(this, ID_COMPARATOR, null); exerciseList.setAdapter(mAdapter); exerciseList.setLayoutManager(new GridLayoutManager(this, 3)); loadingSpinner = (ProgressBar) findViewById(R.id.loading_spinner); + exerciseSetTimeText = (TextView) findViewById(R.id.exercise_set_time); exerciseSetNameText.setText(exerciseSetName); exerciseSetNameText.addTextChangedListener(new TextWatcher() { @@ -165,6 +188,7 @@ public class EditExerciseSetActivity extends AppCompatActivity implements androi if(set != null) { mAdapter.replaceAll(set.getExercises()); } + updateExerciseTime(); // load data only once getSupportLoaderManager().destroyLoader(0); @@ -334,6 +358,7 @@ public class EditExerciseSetActivity extends AppCompatActivity implements androi } mAdapter.replaceAll(newList); + updateExerciseTime(); } } } 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 a701a98..1706a5c 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseActivity.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseActivity.java @@ -157,6 +157,7 @@ public class ExerciseActivity extends AppCompatActivity implements android.suppo prevButton = (ImageButton) findViewById(R.id.button_prev); nextButton = (ImageButton) findViewById(R.id.button_next); exerciseInfoButton = (ImageButton) findViewById(R.id.exercise_info_button); + toast = Toast.makeText(this, "", Toast.LENGTH_SHORT); toast.setGravity(toast.getGravity(), 0, 250); 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 810c82f..23266b2 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 @@ -1,6 +1,7 @@ package org.secuso.privacyfriendlybreakreminder.activities.adapter; import android.content.Context; +import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.constraint.ConstraintLayout; import android.support.v7.app.AlertDialog; @@ -16,17 +17,22 @@ import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; import org.secuso.privacyfriendlybreakreminder.R; import org.secuso.privacyfriendlybreakreminder.activities.ChooseExerciseActivity; +import org.secuso.privacyfriendlybreakreminder.activities.helper.IExerciseTimeUpdateable; +import org.secuso.privacyfriendlybreakreminder.activities.tutorial.FirstLaunchManager; import org.secuso.privacyfriendlybreakreminder.database.data.Exercise; import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet; import org.secuso.privacyfriendlybreakreminder.dialog.ExerciseDialog; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; +import java.util.Locale; /** * @author Christopher Beckmann @@ -36,6 +42,7 @@ import java.util.List; */ public class ExerciseAdapter extends RecyclerView.Adapter { + private IExerciseTimeUpdateable mListener; private Context mContext; private List checkedIds = new ArrayList<>(); private boolean mShowCheckboxes = false; @@ -43,12 +50,13 @@ public class ExerciseAdapter extends RecyclerView.Adapter ID_COMPARATOR = new Comparator() { @Override public int compare(Exercise a, Exercise b) { - return (a.getId() < b.getId()) ? -1 : ((a.getId() == b.getId()) ? 0 : 1); + return Integer.compare(a.getId(), b.getId()); } }; private final LayoutInflater mInflater; private final Comparator mComparator; + private final List mAllExercises = new ArrayList<>(); private final SortedList mSortedList = new SortedList<>(Exercise.class, new SortedList.Callback() { @Override public void onInserted(int position, int count) { @@ -86,7 +94,8 @@ public class ExerciseAdapter extends RecyclerView.Adapter comparator) { + public ExerciseAdapter(Context context, Comparator comparator, IExerciseTimeUpdateable listener) { + this.mListener = listener; this.mContext = context; this.mComparator = comparator; this.mInflater = LayoutInflater.from(context); @@ -122,10 +131,12 @@ public class ExerciseAdapter extends RecyclerView.Adapter exercises) { + for(Exercise e : exercises) { + if(!mAllExercises.contains(e)) { + mAllExercises.add(e); + } + } } public List getCheckedIds() { @@ -169,14 +196,19 @@ public class ExerciseAdapter extends RecyclerView.Adapter models) { mSortedList.addAll(models); + setAllExercises(models); + notifyListeners(); } public void remove(List models) { @@ -185,10 +217,12 @@ public class ExerciseAdapter extends RecyclerView.Adapter checkedItems) { this.checkedIds = checkedItems; + notifyListeners(); } public List getExercises() { @@ -202,6 +236,31 @@ public class ExerciseAdapter extends RecyclerView.Adapter specificIds) { + int result = 0; + + for (int id : (specificIds == null ? checkedIds : specificIds)) { + for (Exercise e : mAllExercises) { + if (e.getId() == id) { + result += e.getImageID().split(",").length; + break; + } + } + } + + return result; + } + + public String getExerciseTimeString() { + return getExerciseTimeString(null); + } + + public String getExerciseTimeString(List specificIds) { + long exerciseDuration = Long.parseLong(PreferenceManager.getDefaultSharedPreferences(mContext).getString(FirstLaunchManager.EXERCISE_DURATION, "30")); + int seconds = (int) (getExerciseCount(specificIds) * exerciseDuration); + return String.format(Locale.getDefault(), "%02d:%02d", (seconds / 60), (seconds % 60)); + } + public class ExerciseViewHolder extends RecyclerView.ViewHolder { ImageView image; 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 index b788bd1..306ecff 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetListAdapter.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetListAdapter.java @@ -15,16 +15,19 @@ import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; import org.secuso.privacyfriendlybreakreminder.R; import org.secuso.privacyfriendlybreakreminder.activities.EditExerciseSetActivity; import org.secuso.privacyfriendlybreakreminder.activities.ManageExerciseSetsActivity; import org.secuso.privacyfriendlybreakreminder.activities.tutorial.FirstLaunchManager; +import org.secuso.privacyfriendlybreakreminder.database.data.Exercise; import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Locale; /** @@ -114,6 +117,11 @@ public class ExerciseSetListAdapter extends RecyclerView.Adapter { 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); + TextView exerciseTime = (TextView) row.findViewById(R.id.exercise_set_time_short); card.setClickable(false); card.setLongClickable(false); @@ -80,15 +84,26 @@ public class ExerciseSetSpinnerAdapter extends ArrayAdapter { View view = LayoutInflater.from(getContext()).inflate(R.layout.layout_round_exercise_image, null, false); ImageView image = (ImageView) view.findViewById(R.id.exercise_image); - Glide.with(getContext()).load(set.get(i).getImageResIds(getContext())[0]).into(image); + Glide.with(getContext()).load(set.get(i).getImageResIds(getContext())[0]).transition(DrawableTransitionOptions.withCrossFade()).into(image); exerciseList.addView(view); } if(set.size() == 0) { noExercisesText.setVisibility(View.VISIBLE); + exerciseTime.setVisibility(View.GONE); } else { noExercisesText.setVisibility(View.GONE); + exerciseTime.setVisibility(View.VISIBLE); + + int result = 0; + for(Exercise e : set.getExercises()) { + result += e.getImageID().split(",").length; + } + + long exerciseDuration = Long.parseLong(PreferenceManager.getDefaultSharedPreferences(getContext()).getString(FirstLaunchManager.EXERCISE_DURATION, "30")); + int seconds = (int) (result * exerciseDuration); + exerciseTime.setText(String.format(Locale.getDefault(), "%02d:%02d", (seconds / 60), (seconds % 60))); } return row; diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/helper/IExerciseTimeUpdateable.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/helper/IExerciseTimeUpdateable.java new file mode 100644 index 0000000..ace2cef --- /dev/null +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/helper/IExerciseTimeUpdateable.java @@ -0,0 +1,11 @@ +package org.secuso.privacyfriendlybreakreminder.activities.helper; + +/** + * @author Christopher Beckmann (Kamuno) + * @version 1.0 + * @since 04.05.2018 + * created 04.05.2018 + */ +public interface IExerciseTimeUpdateable { + void update(int i); +} 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 index 25e57bd..250e3f3 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/TutorialActivity.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/TutorialActivity.java @@ -48,7 +48,6 @@ public class TutorialActivity extends AppCompatActivity { private FirstLaunchManager firstLaunchManager; 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) { @@ -80,14 +79,12 @@ public class TutorialActivity extends AppCompatActivity { viewPager.setAdapter(myViewPagerAdapter); viewPager.addOnPageChangeListener(viewPagerPageChangeListener); - btnSkip.setOnClickListener(new View.OnClickListener() - - { - @Override - public void onClick (View v){ - launchHomeScreen(); - } - }); + btnSkip.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick (View v){ + launchHomeScreen(); + } + }); btnNext.setOnClickListener(new View.OnClickListener() diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/columns/ExerciseColumns.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/columns/ExerciseColumns.java index 7a70075..65c9725 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/columns/ExerciseColumns.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/columns/ExerciseColumns.java @@ -25,6 +25,7 @@ public final class ExerciseColumns { SECTION, IMAGE_ID, }; + public static final String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + TABLE_NAME; public static Exercise fromCursor(Cursor c) { diff --git a/app/src/main/res/drawable/ic_alarm_white.xml b/app/src/main/res/drawable/ic_alarm_white.xml new file mode 100644 index 0000000..bd50ddd --- /dev/null +++ b/app/src/main/res/drawable/ic_alarm_white.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_choose_exercise.xml b/app/src/main/res/layout/activity_choose_exercise.xml index 3bbe37c..8ff330c 100644 --- a/app/src/main/res/layout/activity_choose_exercise.xml +++ b/app/src/main/res/layout/activity_choose_exercise.xml @@ -10,18 +10,34 @@ android:id="@+id/layout_filter_buttons" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginEnd="8dp" + android:layout_marginStart="8dp" + android:layout_marginTop="8dp" + android:orientation="vertical" app:flChildSpacing="8dp" app:flChildSpacingForLastRow="align" app:flRowSpacing="8dp" - android:layout_marginLeft="8dp" - android:layout_marginRight="8dp" + app:layout_constraintEnd_toStartOf="@+id/exercise_set_time" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + + android:drawableStart="@drawable/ic_alarm_black" + android:gravity="center" + android:text="@string/exercise_time" + android:textColor="@color/black" + android:textSize="16sp" + android:textStyle="bold" + app:layout_constraintBottom_toBottomOf="@+id/layout_filter_buttons" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> @@ -22,21 +23,48 @@ android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay"/> - + android:layout_height="match_parent"> + + + + + + @@ -50,12 +78,8 @@ android:id="@+id/exercise_list" android:layout_width="0dp" android:layout_height="0dp" - android:layout_marginBottom="4dp" - android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="4dp" - android:layout_marginStart="8dp" - android:layout_marginTop="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" @@ -83,12 +107,11 @@ android:layout_height="wrap_content" android:layout_marginBottom="16dp" android:layout_marginEnd="16dp" + android:layout_alignParentBottom="true" android:clickable="true" - android:focusable="true" android:onClick="onClick" app:fabSize="normal" - app:layout_anchor="@id/constraintLayout2" - app:layout_anchorGravity="bottom|end" + android:layout_gravity="bottom|end" app:srcCompat="@drawable/ic_edit_white_24dp" /> diff --git a/app/src/main/res/layout/activity_exercise.xml b/app/src/main/res/layout/activity_exercise.xml index 748ac14..a06ac6d 100644 --- a/app/src/main/res/layout/activity_exercise.xml +++ b/app/src/main/res/layout/activity_exercise.xml @@ -122,13 +122,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="8dp" - android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:clickable="true" android:onClick="onClick" - app:layout_constraintHorizontal_bias="0.0" app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent"> @@ -68,11 +69,11 @@ android:layout_height="wrap_content" android:layout_marginBottom="16dp" android:layout_marginEnd="16dp" + android:layout_alignParentBottom="true" + android:layout_gravity="bottom|end" android:clickable="true" android:onClick="onClick" app:fabSize="normal" - app:layout_anchor="@id/main_content" - app:layout_anchorGravity="bottom|end" app:srcCompat="@drawable/ic_add_white_24dp" /> 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 4084f74..c08c478 100644 --- a/app/src/main/res/layout/layout_exercise_grid_item.xml +++ b/app/src/main/res/layout/layout_exercise_grid_item.xml @@ -2,27 +2,25 @@ + android:layout_marginBottom="4dp" + android:layout_marginEnd="4dp" + android:minHeight="120dp" + android:padding="0dp" + app:layout_constraintDimensionRatio="h,1:1" + app:layout_constraintHeight_min="120dp"> + app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/layout_exercise_set.xml b/app/src/main/res/layout/layout_exercise_set.xml index 2466394..a92bac8 100644 --- a/app/src/main/res/layout/layout_exercise_set.xml +++ b/app/src/main/res/layout/layout_exercise_set.xml @@ -56,6 +56,20 @@ app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_mode_edit_black_24dp" /> + + Hüftbeschwerden Kniebeschwerden + Standard Übungssets + Standard Übungssets verstecken + Dieses Set kann nicht gelöscht werden. In den Einstellungen können die voreingespeicherten Sets ausgeblendet werden. + Dieses Set kann nicht editiert werden. vorherige Übung nächste Übung diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml index dfe5f66..2b32199 100644 --- a/app/src/main/res/values-v21/styles.xml +++ b/app/src/main/res/values-v21/styles.xml @@ -12,7 +12,7 @@ false true true - @android:color/transparent +