From 752a2f5c8b5f7de6d4d4f6f0049736941db87f82 Mon Sep 17 00:00:00 2001 From: Mirko Stocker Date: Mon, 6 Aug 2018 20:21:21 +0200 Subject: [PATCH] cosmetics and bug fixes --- app/build.gradle | 11 +- app/google-services.json | 8 + app/src/main/AndroidManifest.xml | 8 +- .../ch/beerpro/ToolbarScrollingBehaviour.java | 58 +++++++ .../beerpro/home/FeedRecyclerViewAdapter.java | 20 ++- .../beerpro/home/HomeScreenFeedFragment.java | 16 +- .../home/HomeScreenProfileFragment.java | 16 +- .../home/HomeScreenSearchFragment.java | 30 ++-- .../main/java/ch/beerpro/models/Rating.java | 8 + .../ch/beerpro/rating/RatingActivity.java | 6 +- .../ch/beerpro/search/SearchActivity.java | 2 - .../adapters/MyBeersRecyclerViewAdapter.java | 6 +- .../SearchResultRecyclerViewAdapter.java | 6 +- .../beerpro/single/BottomSheetFragment.java | 26 ++++ .../single/RatingsRecyclerViewAdapter.java | 13 +- .../ch/beerpro/single/SingleBeerActivity.java | 50 ++++-- app/src/main/res/layout/activity_rating.xml | 45 +++--- .../main/res/layout/activity_single_beer.xml | 88 +++++------ .../layout/fragment_feed_ratings_entry.xml | 37 +++-- .../main/res/layout/fragment_feed_screen.xml | 5 +- app/src/main/res/layout/ratings_entry.xml | 18 +-- .../res/layout/single_bottom_sheet_dialog.xml | 146 ++++++++++++++++++ app/src/main/res/values/styles.xml | 6 +- 23 files changed, 463 insertions(+), 166 deletions(-) create mode 100644 app/src/main/java/ch/beerpro/ToolbarScrollingBehaviour.java create mode 100644 app/src/main/java/ch/beerpro/single/BottomSheetFragment.java create mode 100644 app/src/main/res/layout/single_bottom_sheet_dialog.xml diff --git a/app/build.gradle b/app/build.gradle index b51e9f9..cfe743e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId "ch.beerpro" minSdkVersion 21 targetSdkVersion 28 - versionCode 2 - versionName "Alpha 2" + versionCode 7 + versionName "Alpha 7" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } @@ -34,8 +34,11 @@ dependencies { implementation 'com.google.android.material:material:1.0.0-beta01' implementation 'com.google.firebase:firebase-firestore:17.0.4' implementation 'com.firebaseui:firebase-ui-firestore:4.0.0' - implementation 'com.squareup.picasso:picasso:2.71828' - implementation 'jp.wasabeef:picasso-transformations:2.2.1' + + // an alternative to picasso + implementation 'com.github.bumptech.glide:glide:4.7.1' + annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1' + implementation 'androidx.legacy:legacy-support-v4:1.0.0-beta01' implementation 'androidx.recyclerview:recyclerview:1.0.0-beta01' implementation 'com.github.yalantis:ucrop:2.2.2-native' diff --git a/app/google-services.json b/app/google-services.json index 29179ef..93a4e98 100644 --- a/app/google-services.json +++ b/app/google-services.json @@ -22,6 +22,14 @@ "certificate_hash": "bbb933acdf53fc378eeaa0c932cec9b1db5fd8d7" } }, + { + "client_id": "449677194575-ogb0ivkadn329eknqlo50d5lhmqgtt54.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "ch.beerpro", + "certificate_hash": "c2b88fedf32cf384a5863f6ed19652d8f3f3b8ca" + } + }, { "client_id": "449677194575-r12ho5t13vs7db7sgna01d5mv1coo7th.apps.googleusercontent.com", "client_type": 3 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 29ee8b6..aef4473 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,9 +6,9 @@ - + @@ -45,7 +47,7 @@ + android:theme="@style/Theme.AppCompat.Light.NoActionBar" /> \ No newline at end of file diff --git a/app/src/main/java/ch/beerpro/ToolbarScrollingBehaviour.java b/app/src/main/java/ch/beerpro/ToolbarScrollingBehaviour.java new file mode 100644 index 0000000..7fde013 --- /dev/null +++ b/app/src/main/java/ch/beerpro/ToolbarScrollingBehaviour.java @@ -0,0 +1,58 @@ +package ch.beerpro; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Color; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import androidx.annotation.NonNull; +import androidx.appcompat.widget.Toolbar; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.core.graphics.ColorUtils; +import androidx.core.view.ViewCompat; + +public class ToolbarScrollingBehaviour extends CoordinatorLayout.Behavior { + + private static final String TAG = "ToolbarScrollingBehavio"; + + public ToolbarScrollingBehaviour(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull V child, + @NonNull View directTargetChild, @NonNull View target, int axes, int type) { + return axes == ViewCompat.SCROLL_AXIS_VERTICAL; + } + + @Override + public void onNestedPreScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull V child, @NonNull View target, + int dx, int dy, @NonNull int[] consumed, int type) { + super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type); + LinearLayout toolbarLayout = (LinearLayout) child; + View statusBar = toolbarLayout.getChildAt(0); + Toolbar toolbar = (Toolbar) toolbarLayout.getChildAt(1); + + int toolbarHeight = toolbarLayout.getHeight(); + + int scrollY = target.getScrollY() + dy; + float alpha = (scrollY - (toolbarHeight / 2f)) / (1.0f * toolbarHeight); + + Resources resources = child.getResources(); + + int newToolbarColor = ColorUtils.setAlphaComponent(resources.getColor(R.color.colorPrimary), + Math.max(Math.min((int) (255 * alpha), 255), 0)); + toolbarLayout.setBackgroundColor(newToolbarColor); + + int newToolbarTextColor = ColorUtils.setAlphaComponent(resources.getColor(R.color.colorAccent), + Math.max(Math.min((int) (255 * alpha), 255), 0)); + toolbar.setTitleTextColor(newToolbarTextColor); + + int newStatusbarColor = ColorUtils.setAlphaComponent(resources.getColor(R.color.colorPrimaryDark), + Math.max(Math.min((int) (255 * alpha), 255), 0)); + statusBar.setBackgroundColor(newStatusbarColor); + + } +} \ No newline at end of file diff --git a/app/src/main/java/ch/beerpro/home/FeedRecyclerViewAdapter.java b/app/src/main/java/ch/beerpro/home/FeedRecyclerViewAdapter.java index 3d93abc..ad2562e 100644 --- a/app/src/main/java/ch/beerpro/home/FeedRecyclerViewAdapter.java +++ b/app/src/main/java/ch/beerpro/home/FeedRecyclerViewAdapter.java @@ -1,5 +1,7 @@ package ch.beerpro.home; +import android.net.Uri; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -15,15 +17,17 @@ import ch.beerpro.helpers.EntityDiffItemCallback; import ch.beerpro.models.Rating; import ch.beerpro.single.OnRatingLikedListener; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; import com.google.firebase.auth.FirebaseUser; -import com.squareup.picasso.Picasso; -import jp.wasabeef.picasso.transformations.CropCircleTransformation; import java.text.DateFormat; public class FeedRecyclerViewAdapter extends ListAdapter { + private static final String TAG = "FeedRecyclerViewAdapter"; + private static final EntityDiffItemCallback DIFF_CALLBACK = new EntityDiffItemCallback<>(); private final OnRatingLikedListener listener; @@ -83,6 +87,7 @@ class ViewHolder extends RecyclerView.ViewHolder { } void bind(Rating item, OnRatingLikedListener listener) { + Log.i(TAG, item.toString()); beerName.setText(item.getBeerName()); comment.setText(item.getComment()); @@ -93,16 +98,18 @@ void bind(Rating item, OnRatingLikedListener listener) { date.setText(formattedDate); if (item.getPhoto() != null) { - Picasso.get().load(item.getPhoto()).into(photo); + // Take a look at https://bumptech.github.io/glide/int/recyclerview.html + Glide.with(itemView).load(item.getPhoto()).into(photo); } else { + Glide.with(itemView).clear(photo); photo.setVisibility(View.GONE); } authorName.setText(item.getUserName()); - Picasso.get().load(item.getUserPhoto()).transform(new CropCircleTransformation()).into(avatar); + Glide.with(itemView).load(item.getUserPhoto()).apply(new RequestOptions().circleCrop()).into(avatar); numLikes.setText(itemView.getResources().getString(R.string.fmt_num_ratings, item.getLikes().size())); - if(item.getLikes().containsKey(user.getUid())) { + if (item.getLikes().containsKey(user.getUid())) { like.setColorFilter(itemView.getResources().getColor(R.color.colorPrimary)); } else { like.setColorFilter(itemView.getResources().getColor(android.R.color.darker_gray)); @@ -111,5 +118,8 @@ void bind(Rating item, OnRatingLikedListener listener) { like.setOnClickListener(v -> listener.onRatingLikedListener(item)); } } + + + } } diff --git a/app/src/main/java/ch/beerpro/home/HomeScreenFeedFragment.java b/app/src/main/java/ch/beerpro/home/HomeScreenFeedFragment.java index f95f144..50ee82b 100644 --- a/app/src/main/java/ch/beerpro/home/HomeScreenFeedFragment.java +++ b/app/src/main/java/ch/beerpro/home/HomeScreenFeedFragment.java @@ -9,6 +9,7 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import butterknife.BindView; import butterknife.ButterKnife; import ch.beerpro.R; @@ -20,13 +21,17 @@ import java.util.ArrayList; import java.util.List; -public class HomeScreenFeedFragment extends Fragment implements OnRatingLikedListener { +public class HomeScreenFeedFragment extends Fragment + implements OnRatingLikedListener, SwipeRefreshLayout.OnRefreshListener { private static final String TAG = "FeedFragment"; @BindView(R.id.recyclerView) RecyclerView recyclerView; + @BindView(R.id.swipeRefreshLayout) + SwipeRefreshLayout swipeRefreshLayout; + private FeedRecyclerViewAdapter adapter; private HomeScreenViewModel model; @@ -50,6 +55,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa recyclerView.setAdapter(adapter); + swipeRefreshLayout.setOnRefreshListener(this); + return rootView; } @@ -61,4 +68,11 @@ private void updateRatings(List ratings) { public void onRatingLikedListener(Rating rating) { model.toggleLike(rating); } + + @Override + public void onRefresh() { + updateRatings(model.getAllRatings().getValue()); + swipeRefreshLayout.setRefreshing(false); + adapter.notifyDataSetChanged(); + } } diff --git a/app/src/main/java/ch/beerpro/home/HomeScreenProfileFragment.java b/app/src/main/java/ch/beerpro/home/HomeScreenProfileFragment.java index acb7488..cd527dc 100644 --- a/app/src/main/java/ch/beerpro/home/HomeScreenProfileFragment.java +++ b/app/src/main/java/ch/beerpro/home/HomeScreenProfileFragment.java @@ -1,10 +1,7 @@ package ch.beerpro.home; -import android.content.ContentResolver; import android.net.Uri; import android.os.Bundle; -import android.util.DisplayMetrics; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -12,18 +9,12 @@ import android.widget.TextView; import ch.beerpro.R; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; -import com.squareup.picasso.Picasso; -import java.io.FileNotFoundException; -import java.io.InputStream; - -import androidx.core.graphics.drawable.RoundedBitmapDrawable; -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory; import androidx.fragment.app.Fragment; -import jp.wasabeef.picasso.transformations.CropCircleTransformation; -import jp.wasabeef.picasso.transformations.RoundedCornersTransformation; public class HomeScreenProfileFragment extends Fragment { @@ -46,7 +37,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa String name = user.getDisplayName(); userProfileNameText.setText(name); Uri photoUrl = user.getPhotoUrl(); - Picasso.get().load(photoUrl).transform(new CropCircleTransformation()).into(userProfileImageView); + Glide.with(this).load(photoUrl).apply(new RequestOptions().circleCrop()).into(userProfileImageView); + } return rootView; diff --git a/app/src/main/java/ch/beerpro/home/HomeScreenSearchFragment.java b/app/src/main/java/ch/beerpro/home/HomeScreenSearchFragment.java index 4319845..ca0aec3 100644 --- a/app/src/main/java/ch/beerpro/home/HomeScreenSearchFragment.java +++ b/app/src/main/java/ch/beerpro/home/HomeScreenSearchFragment.java @@ -8,7 +8,11 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.viewpager.widget.ViewPager; +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; import ch.beerpro.R; import ch.beerpro.helpers.ViewPagerAdapter; import ch.beerpro.search.SearchActivity; @@ -17,6 +21,11 @@ public class HomeScreenSearchFragment extends Fragment { private static final String TAG = "HomeScreenActSearch"; + @BindView(R.id.viewpager) + ViewPager viewPager; + @BindView(R.id.tablayout) + + TabLayout tabLayout; private ViewPagerAdapter adapter; public HomeScreenSearchFragment() { @@ -26,18 +35,8 @@ public HomeScreenSearchFragment() { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setHasOptionsMenu(true); View rootView = inflater.inflate(R.layout.fragment_search_screen, container, false); - View beerSearchButton = rootView.findViewById(R.id.beerSearchButton); - beerSearchButton.setOnClickListener(view -> { - - Intent intent = new Intent(getActivity(), SearchActivity.class); - ActivityOptions options = ActivityOptions - .makeSceneTransitionAnimation(getActivity(), beerSearchButton, "search"); - - startActivity(intent, options.toBundle()); - }); + ButterKnife.bind(this, rootView); - ViewPager viewPager = rootView.findViewById(R.id.viewpager); - TabLayout tabLayout = rootView.findViewById(R.id.tablayout); adapter = new ViewPagerAdapter(getChildFragmentManager()); adapter.addFragment(new BeerCategoriesFragment(), "Bierart"); adapter.addFragment(new BeerManufacturersFragment(), "Brauerei"); @@ -46,4 +45,13 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa return rootView; } + + @OnClick(R.id.beerSearchButton) + public void openSearchActivity(View beerSearchButton) { + Intent intent = new Intent(getActivity(), SearchActivity.class); + ActivityOptions options = + ActivityOptions.makeSceneTransitionAnimation(getActivity(), beerSearchButton, "search"); + + startActivity(intent, options.toBundle()); + } } diff --git a/app/src/main/java/ch/beerpro/models/Rating.java b/app/src/main/java/ch/beerpro/models/Rating.java index 7247943..a249ed9 100644 --- a/app/src/main/java/ch/beerpro/models/Rating.java +++ b/app/src/main/java/ch/beerpro/models/Rating.java @@ -41,6 +41,14 @@ public Rating() { } + @Override + public String toString() { + return "Rating{" + "id='" + id + '\'' + ", beerId='" + beerId + '\'' + ", beerName='" + beerName + '\'' + + ", userId='" + userId + '\'' + ", userName='" + userName + '\'' + ", userPhoto='" + userPhoto + '\'' + + ", photo='" + photo + '\'' + ", rating=" + rating + ", comment='" + comment + '\'' + ", likes=" + + likes + ", creationDate=" + creationDate + '}'; + } + public String getBeerName() { return beerName; } diff --git a/app/src/main/java/ch/beerpro/rating/RatingActivity.java b/app/src/main/java/ch/beerpro/rating/RatingActivity.java index cbe6dff..6a40fe7 100644 --- a/app/src/main/java/ch/beerpro/rating/RatingActivity.java +++ b/app/src/main/java/ch/beerpro/rating/RatingActivity.java @@ -19,11 +19,11 @@ import butterknife.ButterKnife; import ch.beerpro.R; import ch.beerpro.models.Beer; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; -import com.squareup.picasso.Picasso; import com.yalantis.ucrop.UCrop; -import jp.wasabeef.picasso.transformations.CropCircleTransformation; import pl.aprilapps.easyphotopicker.DefaultCallback; import pl.aprilapps.easyphotopicker.EasyImage; import pl.tajchert.nammu.Nammu; @@ -101,7 +101,7 @@ public void permissionRefused() { if (user != null) { Uri photoUrl = user.getPhotoUrl(); - Picasso.get().load(photoUrl).transform(new CropCircleTransformation()).into(avatar); + Glide.with(this).load(photoUrl).apply(new RequestOptions().circleCrop()).into(avatar); } if (model.getPhoto() != null) { photo.setImageURI(model.getPhoto()); diff --git a/app/src/main/java/ch/beerpro/search/SearchActivity.java b/app/src/main/java/ch/beerpro/search/SearchActivity.java index d14828e..de4c4d6 100644 --- a/app/src/main/java/ch/beerpro/search/SearchActivity.java +++ b/app/src/main/java/ch/beerpro/search/SearchActivity.java @@ -54,8 +54,6 @@ protected void onCreate(Bundle savedInstanceState) { tabLayout.setupWithViewPager(viewPager); model = ViewModelProviders.of(this).get(SearchViewModel.class); - - FirebaseFirestore.setLoggingEnabled(true); } @Override diff --git a/app/src/main/java/ch/beerpro/search/adapters/MyBeersRecyclerViewAdapter.java b/app/src/main/java/ch/beerpro/search/adapters/MyBeersRecyclerViewAdapter.java index cb3a47b..0156e74 100644 --- a/app/src/main/java/ch/beerpro/search/adapters/MyBeersRecyclerViewAdapter.java +++ b/app/src/main/java/ch/beerpro/search/adapters/MyBeersRecyclerViewAdapter.java @@ -15,7 +15,8 @@ import ch.beerpro.models.Beer; import ch.beerpro.search.MyBeersFragment.OnItemSelectedListener; import ch.beerpro.helpers.EntityDiffItemCallback; -import com.squareup.picasso.Picasso; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; public class MyBeersRecyclerViewAdapter extends ListAdapter { @@ -73,7 +74,8 @@ void bind(Beer item, OnItemSelectedListener listener) { manufacturer.setText(item.getManufacturer()); category.setText(item.getCategory()); name.setText(item.getName()); - Picasso.get().load(item.getPhoto()).resize(240, 240).centerInside().into(photo); + Glide.with(itemView).load(item.getPhoto()).apply(new RequestOptions().override(240, 240).centerInside()) + .into(photo); ratingBar.setNumStars(5); ratingBar.setRating(item.getAvgRating()); numRatings.setText(itemView.getResources().getString(R.string.fmt_num_ratings, item.getNumRatings())); diff --git a/app/src/main/java/ch/beerpro/search/adapters/SearchResultRecyclerViewAdapter.java b/app/src/main/java/ch/beerpro/search/adapters/SearchResultRecyclerViewAdapter.java index 421fe5e..04a54fa 100644 --- a/app/src/main/java/ch/beerpro/search/adapters/SearchResultRecyclerViewAdapter.java +++ b/app/src/main/java/ch/beerpro/search/adapters/SearchResultRecyclerViewAdapter.java @@ -15,7 +15,8 @@ import ch.beerpro.models.Beer; import ch.beerpro.search.SearchResultFragment.OnItemSelectedListener; import ch.beerpro.helpers.EntityDiffItemCallback; -import com.squareup.picasso.Picasso; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; public class SearchResultRecyclerViewAdapter extends ListAdapter { @@ -72,7 +73,8 @@ void bind(Beer item, OnItemSelectedListener listener) { manufacturer.setText(item.getManufacturer()); category.setText(item.getCategory()); name.setText(item.getName()); - Picasso.get().load(item.getPhoto()).resize(240, 240).centerInside().into(photo); + Glide.with(itemView).load(item.getPhoto()).apply(new RequestOptions().override(240, 240).centerInside()) + .into(photo); ratingBar.setNumStars(5); ratingBar.setRating(item.getAvgRating()); numRatings.setText(itemView.getResources().getString(R.string.fmt_num_ratings, item.getNumRatings())); diff --git a/app/src/main/java/ch/beerpro/single/BottomSheetFragment.java b/app/src/main/java/ch/beerpro/single/BottomSheetFragment.java new file mode 100644 index 0000000..9143c1a --- /dev/null +++ b/app/src/main/java/ch/beerpro/single/BottomSheetFragment.java @@ -0,0 +1,26 @@ +package ch.beerpro.single; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import ch.beerpro.R; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + +public class BottomSheetFragment extends BottomSheetDialogFragment { + public BottomSheetFragment() { + // Required empty public constructor + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.single_bottom_sheet_dialog, container, false); + } +} \ No newline at end of file diff --git a/app/src/main/java/ch/beerpro/single/RatingsRecyclerViewAdapter.java b/app/src/main/java/ch/beerpro/single/RatingsRecyclerViewAdapter.java index 3fa79cd..5e51b32 100644 --- a/app/src/main/java/ch/beerpro/single/RatingsRecyclerViewAdapter.java +++ b/app/src/main/java/ch/beerpro/single/RatingsRecyclerViewAdapter.java @@ -14,9 +14,9 @@ import butterknife.BindView; import butterknife.ButterKnife; import ch.beerpro.helpers.EntityDiffItemCallback; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; import com.google.firebase.auth.FirebaseUser; -import com.squareup.picasso.Picasso; -import jp.wasabeef.picasso.transformations.CropCircleTransformation; import java.text.DateFormat; @@ -87,17 +87,18 @@ void bind(Rating item, OnRatingLikedListener listener) { DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.SHORT).format(item.getCreationDate()); date.setText(formattedDate); - if(item.getPhoto() != null) { - Picasso.get().load(item.getPhoto()).into(photo); + if (item.getPhoto() != null) { + Glide.with(itemView).load(item.getPhoto()).into(photo); } else { + Glide.with(itemView).clear(photo); photo.setVisibility(View.GONE); } authorName.setText(item.getUserName()); - Picasso.get().load(item.getUserPhoto()).transform(new CropCircleTransformation()).into(avatar); + Glide.with(itemView).load(item.getUserPhoto()).apply(new RequestOptions().circleCrop()).into(avatar); numLikes.setText(itemView.getResources().getString(R.string.fmt_num_ratings, item.getLikes().size())); - if(item.getLikes().containsKey(user.getUid())) { + if (item.getLikes().containsKey(user.getUid())) { like.setColorFilter(itemView.getResources().getColor(R.color.colorPrimary)); } else { like.setColorFilter(itemView.getResources().getColor(android.R.color.darker_gray)); diff --git a/app/src/main/java/ch/beerpro/single/SingleBeerActivity.java b/app/src/main/java/ch/beerpro/single/SingleBeerActivity.java index 35c2e7b..d5e39f1 100644 --- a/app/src/main/java/ch/beerpro/single/SingleBeerActivity.java +++ b/app/src/main/java/ch/beerpro/single/SingleBeerActivity.java @@ -2,10 +2,16 @@ import android.app.ActivityOptions; import android.content.Intent; +import android.graphics.Color; import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; import android.widget.ImageView; import android.widget.RatingBar; import android.widget.TextView; +import androidx.core.widget.NestedScrollView; import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProviders; import androidx.recyclerview.widget.DividerItemDecoration; @@ -13,15 +19,18 @@ import androidx.recyclerview.widget.RecyclerView; import butterknife.BindView; import butterknife.ButterKnife; +import butterknife.OnClick; import ch.beerpro.R; import ch.beerpro.models.Beer; import ch.beerpro.models.Rating; import ch.beerpro.rating.RatingActivity; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.appbar.CollapsingToolbarLayout; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; -import com.squareup.picasso.Picasso; +import com.google.android.material.bottomsheet.BottomSheetDialog; import java.util.ArrayList; import java.util.List; @@ -29,15 +38,12 @@ public class SingleBeerActivity extends AppCompatActivity implements OnRatingLikedListener { public static final String ITEM_ID = "item_id"; - + private static final String TAG = "SingleBeerActivity"; @BindView(R.id.toolbar) Toolbar toolbar; - @BindView(R.id.toolbar_layout) - CollapsingToolbarLayout collapsingToolbar; - - @BindView(R.id.app_bar) - AppBarLayout appBarLayout; + @BindView(R.id.nested_scroll_view) + NestedScrollView nestedScrollView; @BindView(R.id.photo) ImageView photo; @@ -78,6 +84,9 @@ protected void onCreate(Bundle savedInstanceState) { setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + toolbar.setTitleTextColor(Color.alpha(0)); + String beerId = getIntent().getExtras().getString(ITEM_ID); model = ViewModelProviders.of(this).get(SingleBeerViewModel.class); @@ -104,17 +113,28 @@ private void addNewRating(RatingBar ratingBar, float v, boolean b) { startActivity(intent, options.toBundle()); } + @OnClick(R.id.actionsButton) + public void showBottomSheetDialog() { + View view = getLayoutInflater().inflate(R.layout.single_bottom_sheet_dialog, null); + + BottomSheetDialog dialog = new BottomSheetDialog(this); + dialog.setContentView(view); + dialog.show(); + } + + private void updateBeer(Beer item) { name.setText(item.getName()); manufacturer.setText(item.getManufacturer()); category.setText(item.getCategory()); name.setText(item.getName()); - Picasso.get().load(item.getPhoto()).resize(120, 160).centerInside().into(photo); + Glide.with(this).load(item.getPhoto()).apply(new RequestOptions().override(120, 160).centerInside()) + .into(photo); ratingBar.setNumStars(5); ratingBar.setRating(item.getAvgRating()); avgRating.setText(getResources().getString(R.string.fmt_avg_rating, item.getAvgRating())); numRatings.setText(getResources().getString(R.string.fmt_ratings, item.getNumRatings())); - collapsingToolbar.setTitle(item.getName()); + toolbar.setTitle(item.getName()); } private void updateRatings(List ratings) { @@ -125,4 +145,16 @@ private void updateRatings(List ratings) { public void onRatingLikedListener(Rating rating) { model.toggleLike(rating); } + + + private void setWindowFlag(final int bits, boolean on) { + Window win = getWindow(); + WindowManager.LayoutParams winParams = win.getAttributes(); + if (on) { + winParams.flags |= bits; + } else { + winParams.flags &= ~bits; + } + win.setAttributes(winParams); + } } diff --git a/app/src/main/res/layout/activity_rating.xml b/app/src/main/res/layout/activity_rating.xml index 2972fd0..165cf0f 100644 --- a/app/src/main/res/layout/activity_rating.xml +++ b/app/src/main/res/layout/activity_rating.xml @@ -17,8 +17,9 @@ android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" - app:popupTheme="@style/AppTheme.PopupOverlay" app:layout_collapseMode="pin" - android:theme="@style/ToolBarStyle" /> + android:theme="@style/ToolBarStyle" + app:layout_collapseMode="pin" + app:popupTheme="@style/AppTheme.PopupOverlay" /> @@ -136,12 +137,12 @@ android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" - android:paddingBottom="8dp" android:layout_marginEnd="16dp" android:background="@android:color/transparent" android:gravity="top" - android:inputType="textMultiLine" + android:inputType="textCapSentences|textAutoCorrect|textAutoComplete|textMultiLine" android:minLines="2" + android:paddingBottom="8dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/avatar" app:layout_constraintTop_toBottomOf="@+id/textView5" /> @@ -174,24 +175,24 @@ android:text="Ort Hinzufügen" android:textColor="@android:color/darker_gray" android:textSize="10sp" /> - + diff --git a/app/src/main/res/layout/activity_single_beer.xml b/app/src/main/res/layout/activity_single_beer.xml index a36d4ce..7ebcdff 100644 --- a/app/src/main/res/layout/activity_single_beer.xml +++ b/app/src/main/res/layout/activity_single_beer.xml @@ -4,50 +4,14 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:fitsSystemWindows="true" android:focusableInTouchMode="true" tools:context=".single.SingleBeerActivity"> - - - - - - - - - - @@ -62,10 +26,21 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> + + @@ -230,7 +205,7 @@ app:layout_constraintTop_toBottomOf="@+id/separator2">