diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/LibraryFragment.java b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/LibraryFragment.java index f642f132..e2596964 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/LibraryFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/LibraryFragment.java @@ -1,7 +1,8 @@ package code.name.monkey.retromusic.fragments.mainactivity; import android.app.Activity; -import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; @@ -11,45 +12,45 @@ import android.view.SubMenu; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import com.afollestad.materialcab.MaterialCab; +import com.bumptech.glide.request.Request; +import com.bumptech.glide.request.target.SizeReadyCallback; +import com.bumptech.glide.request.target.Target; +import com.bumptech.glide.request.transition.Transition; import com.google.android.material.appbar.AppBarLayout; import org.jetbrains.annotations.NotNull; import java.io.File; -import java.util.Objects; import code.name.monkey.appthemehelper.ThemeStore; import code.name.monkey.appthemehelper.common.ATHToolbarActivity; import code.name.monkey.appthemehelper.util.ATHUtil; -import code.name.monkey.appthemehelper.util.DrawableUtil; import code.name.monkey.appthemehelper.util.TintHelper; import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog; import code.name.monkey.retromusic.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment; import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment; +import code.name.monkey.retromusic.glide.GlideApp; import code.name.monkey.retromusic.helper.SortOrder; import code.name.monkey.retromusic.interfaces.CabHolder; import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks; -import code.name.monkey.retromusic.util.Compressor; -import code.name.monkey.retromusic.util.ImageUtil; +import code.name.monkey.retromusic.util.NavigationUtil; import code.name.monkey.retromusic.util.PreferenceUtil; import code.name.monkey.retromusic.util.RetroColorUtil; import code.name.monkey.retromusic.util.RetroUtil; -import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.schedulers.Schedulers; import static code.name.monkey.retromusic.Constants.USER_PROFILE; @@ -66,6 +67,7 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde private FragmentManager fragmentManager; private ImageView userImage; private CompositeDisposable disposable; + private TextView bannerTitle; @NonNull public static Fragment newInstance(int tab) { @@ -94,6 +96,7 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde View view = inflater.inflate(R.layout.fragment_library, container, false); disposable = new CompositeDisposable(); contentContainer = view.findViewById(R.id.fragmentContainer); + bannerTitle = view.findViewById(R.id.bannerTitle); appBarLayout = view.findViewById(R.id.appBarLayout); toolbar = view.findViewById(R.id.toolbar); userImage = view.findViewById(R.id.userImage); @@ -103,21 +106,75 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde return view; } + + private void loadImageFromStorage() { - disposable.add(new Compressor(Objects.requireNonNull(getContext())) - .setMaxHeight(300) - .setMaxWidth(300) - .setQuality(75) - .setCompressFormat(Bitmap.CompressFormat.WEBP) - .compressToBitmapAsFlowable(new File(PreferenceUtil.getInstance().getProfileImage(), USER_PROFILE)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(bitmap -> userImage.setImageBitmap(bitmap), - throwable -> userImage.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_person_flat)))); + GlideApp.with(getMainActivity()) + .asDrawable() + .placeholder(R.drawable.ic_person_flat) + .fallback(R.drawable.ic_person_flat) + .load(new File(PreferenceUtil.getInstance().getProfileImage(), USER_PROFILE)) + .into(new Target() { + @Override + public void onLoadStarted(@Nullable Drawable placeholder) { + userImage.setImageDrawable(placeholder); + } + + @Override + public void onLoadFailed(@Nullable Drawable errorDrawable) { + userImage.setImageDrawable(errorDrawable); + } + + @Override + public void onResourceReady(@NonNull Drawable resource, @Nullable Transition transition) { + userImage.setImageDrawable(resource); + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + + } + + @Override + public void getSize(@NonNull SizeReadyCallback cb) { + cb.onSizeReady(32, 32); + } + + @Override + public void removeCallback(@NonNull SizeReadyCallback cb) { + + } + + @Override + public void setRequest(@Nullable Request request) { + + } + + @Nullable + @Override + public Request getRequest() { + return null; + } + + @Override + public void onStart() { + + } + + @Override + public void onStop() { + + } + + @Override + public void onDestroy() { + + } + }); } public void setTitle(@StringRes int name) { - toolbar.setTitle(getString(name)); + bannerTitle.setText(getString(name)); } public void addOnAppBarOffsetChangedListener(@NonNull AppBarLayout.OnOffsetChangedListener onOffsetChangedListener) { @@ -167,9 +224,9 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde private void setupToolbar() { int primaryColor = ThemeStore.Companion.primaryColor(getContext()); TintHelper.setTintAuto(contentContainer, primaryColor, true); + bannerTitle.setTextColor(ThemeStore.Companion.textColorPrimary(getContext())); toolbar.setBackgroundColor(primaryColor); - toolbar.setLogo( R.drawable.ic_person_flat); toolbar.setNavigationIcon(null); appBarLayout.setBackgroundColor(primaryColor); appBarLayout.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> @@ -252,7 +309,7 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde } @Override - public void onPrepareOptionsMenu(Menu menu) { + public void onPrepareOptionsMenu(@NonNull Menu menu) { super.onPrepareOptionsMenu(menu); Activity activity = getActivity(); if (activity == null) { @@ -367,7 +424,6 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde } - @SuppressWarnings("ConstantConditions") @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { //if (pager == null) return false; @@ -383,6 +439,9 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde } int id = item.getItemId(); switch (id) { + case R.id.action_search: + NavigationUtil.goToSearch(getMainActivity()); + break; case R.id.action_new_playlist: CreatePlaylistDialog.Companion.create().show(getChildFragmentManager(), "CREATE_PLAYLIST"); return true; diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/home/BannerHomeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/home/BannerHomeFragment.kt index 17e0a6ec..ea53139f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/home/BannerHomeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/home/BannerHomeFragment.kt @@ -2,20 +2,21 @@ package code.name.monkey.retromusic.fragments.mainactivity.home import android.graphics.Bitmap import android.graphics.Color +import android.graphics.drawable.Drawable import android.os.Bundle import android.util.DisplayMetrics -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* import android.widget.ImageView import androidx.appcompat.widget.Toolbar -import androidx.core.content.ContextCompat import androidx.recyclerview.widget.LinearLayoutManager import code.name.monkey.appthemehelper.ThemeStore -import code.name.monkey.appthemehelper.util.TintHelper +import code.name.monkey.appthemehelper.common.ATHToolbarActivity +import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper import code.name.monkey.retromusic.Constants.USER_BANNER import code.name.monkey.retromusic.Constants.USER_PROFILE import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.adapter.HomeAdapter +import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment import code.name.monkey.retromusic.glide.GlideApp import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks @@ -26,13 +27,15 @@ import code.name.monkey.retromusic.model.smartplaylist.LastAddedPlaylist import code.name.monkey.retromusic.model.smartplaylist.MyTopTracksPlaylist import code.name.monkey.retromusic.mvp.contract.HomeContract import code.name.monkey.retromusic.mvp.presenter.HomePresenter -import code.name.monkey.retromusic.adapter.HomeAdapter -import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment import code.name.monkey.retromusic.util.Compressor import code.name.monkey.retromusic.util.NavigationUtil import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.RetroUtil import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.request.Request +import com.bumptech.glide.request.target.SizeReadyCallback +import com.bumptech.glide.request.target.Target +import com.bumptech.glide.request.transition.Transition import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.schedulers.Schedulers @@ -107,23 +110,58 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba } private fun loadImageFromStorage(imageView: ImageView) { - disposable.add(Compressor(context!!) - .setMaxHeight(300) - .setMaxWidth(300) - .setQuality(75) - .setCompressFormat(Bitmap.CompressFormat.WEBP) - .compressToBitmapAsFlowable(File(PreferenceUtil.getInstance().profileImage, USER_PROFILE)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - if (it != null) { - imageView.setImageBitmap(it) - } else { - imageView.setImageDrawable(ContextCompat.getDrawable(context!!, R.drawable.ic_person_flat)) + GlideApp.with(mainActivity) + .asDrawable() + .placeholder(R.drawable.ic_person_flat) + .fallback(R.drawable.ic_person_flat) + .load(File(PreferenceUtil.getInstance().profileImage, USER_PROFILE)) + .into(object : Target { + override fun onLoadStarted(placeholder: Drawable?) { + imageView.setImageDrawable(placeholder) + } + + override fun onLoadFailed(errorDrawable: Drawable?) { + imageView.setImageDrawable(errorDrawable) + } + + override fun onResourceReady(resource: Drawable, transition: Transition?) { + imageView.setImageDrawable(resource) + } + + override fun onLoadCleared(placeholder: Drawable?) { + + } + + override fun getSize(cb: SizeReadyCallback) { + cb.onSizeReady(32, 32) + } + + override fun removeCallback(cb: SizeReadyCallback) { + + } + + override fun setRequest(request: Request?) { + + } + + override fun getRequest(): Request? { + return null + } + + override fun onStart() { + + } + + override fun onStop() { + + } + + override fun onDestroy() { + } - }) { - imageView.setImageDrawable(ContextCompat.getDrawable(context!!, R.drawable.ic_person_flat)) }) + + } override fun onCreate(savedInstanceState: Bundle?) { @@ -177,8 +215,8 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba private fun checkPadding() { val marginSpan = when { - MusicPlayerRemote.playingQueue.isEmpty() -> RetroUtil.convertDpToPixel(52f, context).toInt() - else -> RetroUtil.convertDpToPixel(0f, context).toInt() + MusicPlayerRemote.playingQueue.isEmpty() -> RetroUtil.convertDpToPixel(52f, context!!).toInt() + else -> RetroUtil.convertDpToPixel(0f, context!!).toInt() } (recyclerView.layoutParams as ViewGroup.MarginLayoutParams).bottomMargin = (marginSpan * 2.3f).toInt() @@ -187,12 +225,12 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba private fun setupToolbar() { mainActivity.title = null toolbar.apply { - navigationIcon = TintHelper.createTintedDrawable(ContextCompat.getDrawable(context!!, R.drawable.ic_search_white_24dp), ThemeStore.textColorSecondary(context!!)) - setBackgroundColor(Color.TRANSPARENT) + setBackgroundColor(if (PreferenceUtil.getInstance().isHomeBanner) Color.TRANSPARENT else ThemeStore.primaryColor(context)) setNavigationOnClickListener { NavigationUtil.goToSearch(activity) } } + mainActivity.setSupportActionBar(toolbar) } override fun handleBackPress(): Boolean { @@ -245,6 +283,27 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba } } + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + super.onCreateOptionsMenu(menu, inflater) + inflater.inflate(R.menu.menu_search, menu) + + val activity = activity ?: return + ToolbarContentTintHelper.handleOnCreateOptionsMenu(activity, toolbar, menu, ATHToolbarActivity.getToolbarBackgroundColor(toolbar)) + } + + override fun onPrepareOptionsMenu(menu: Menu) { + super.onPrepareOptionsMenu(menu) + val activity = activity ?: return + ToolbarContentTintHelper.handleOnPrepareOptionsMenu(activity, toolbar) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + if (item.itemId == R.id.action_search) { + NavigationUtil.goToSearch(mainActivity) + } + return super.onOptionsItemSelected(item) + } + companion object { const val TAG: String = "BannerHomeFragment" diff --git a/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java index acae4b28..a292900e 100755 --- a/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java @@ -26,6 +26,7 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Point; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.ConnectivityManager; import android.net.NetworkInfo; @@ -46,18 +47,19 @@ import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.FrameLayout; -import java.lang.reflect.Method; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.util.Collections; -import java.util.List; - import androidx.annotation.ColorInt; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat; + +import java.lang.reflect.Method; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.util.Collections; +import java.util.List; + import code.name.monkey.appthemehelper.ThemeStore; import code.name.monkey.appthemehelper.util.TintHelper; import code.name.monkey.retromusic.App; @@ -113,19 +115,19 @@ public class RetroUtil { return (float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); } - public static float convertDpToPixel(float dp, Context context) { + public static float convertDpToPixel(float dp, @NonNull Context context) { Resources resources = context.getResources(); DisplayMetrics metrics = resources.getDisplayMetrics(); return dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT); } - public static float convertPixelsToDp(float px, Context context) { + public static float convertPixelsToDp(float px, @NonNull Context context) { Resources resources = context.getResources(); DisplayMetrics metrics = resources.getDisplayMetrics(); return px / ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT); } - public static void openUrl(Activity context, String str) { + public static void openUrl(@NonNull Activity context, @NonNull String str) { Intent intent = new Intent("android.intent.action.VIEW"); intent.setData(Uri.parse(str)); intent.setFlags(268435456); @@ -197,7 +199,8 @@ public class RetroUtil { ThemeStore.Companion.accentColor(App.Companion.getInstance())); } - public static Bitmap createBitmap(Drawable drawable, float sizeMultiplier) { + @NonNull + public static Bitmap createBitmap(@NonNull Drawable drawable, float sizeMultiplier) { Bitmap bitmap = Bitmap.createBitmap((int) (drawable.getIntrinsicWidth() * sizeMultiplier), (int) (drawable.getIntrinsicHeight() * sizeMultiplier), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bitmap); @@ -206,12 +209,13 @@ public class RetroUtil { return bitmap; } + @Nullable public static Drawable getTintedVectorDrawable(@NonNull Resources res, @DrawableRes int resId, @Nullable Resources.Theme theme, @ColorInt int color) { return TintHelper.createTintedDrawable(getVectorDrawable(res, resId, theme), color); } - public static boolean isAllowedToDownloadMetadata(final Context context) { + public static boolean isAllowedToDownloadMetadata(final @NonNull Context context) { switch (PreferenceUtil.getInstance().autoDownloadImagesPolicy()) { case "always": return true; @@ -421,4 +425,11 @@ public class RetroUtil { .getIdentifier(orientation == Configuration.ORIENTATION_PORTRAIT ? "navigation_bar_height" : "navigation_bar_height_landscape", "dimen", "android"); return id > 0; } + + @NonNull + public static Drawable resize(@NonNull Context context, @NonNull Drawable image) { + Bitmap b = ((BitmapDrawable) image).getBitmap(); + Bitmap bitmapResized = Bitmap.createScaledBitmap(b, 50, 50, false); + return new BitmapDrawable(context.getResources(), bitmapResized); + } } diff --git a/app/src/main/res/layout-land/fragment_banner_home.xml b/app/src/main/res/layout-land/fragment_banner_home.xml index 35e3c038..b850187e 100644 --- a/app/src/main/res/layout-land/fragment_banner_home.xml +++ b/app/src/main/res/layout-land/fragment_banner_home.xml @@ -59,27 +59,28 @@ - - + + + diff --git a/app/src/main/res/layout-land/fragment_home.xml b/app/src/main/res/layout-land/fragment_home.xml index cb288f7d..dbe38831 100644 --- a/app/src/main/res/layout-land/fragment_home.xml +++ b/app/src/main/res/layout-land/fragment_home.xml @@ -29,24 +29,28 @@ - - + + + diff --git a/app/src/main/res/layout-xlarge-land/fragment_banner_home.xml b/app/src/main/res/layout-xlarge-land/fragment_banner_home.xml index 9b2e3c53..b70cfc8b 100644 --- a/app/src/main/res/layout-xlarge-land/fragment_banner_home.xml +++ b/app/src/main/res/layout-xlarge-land/fragment_banner_home.xml @@ -61,27 +61,28 @@ - - + + + diff --git a/app/src/main/res/layout-xlarge-land/fragment_home.xml b/app/src/main/res/layout-xlarge-land/fragment_home.xml index 7afa5ed2..92ccf16a 100644 --- a/app/src/main/res/layout-xlarge-land/fragment_home.xml +++ b/app/src/main/res/layout-xlarge-land/fragment_home.xml @@ -30,24 +30,28 @@ - - + + + diff --git a/app/src/main/res/layout-xlarge/fragment_banner_home.xml b/app/src/main/res/layout-xlarge/fragment_banner_home.xml index 77cd4981..91ec55d6 100644 --- a/app/src/main/res/layout-xlarge/fragment_banner_home.xml +++ b/app/src/main/res/layout-xlarge/fragment_banner_home.xml @@ -7,15 +7,6 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - @@ -69,27 +60,28 @@ - - + + + diff --git a/app/src/main/res/layout-xlarge/fragment_home.xml b/app/src/main/res/layout-xlarge/fragment_home.xml index 5510cc12..69d5db88 100644 --- a/app/src/main/res/layout-xlarge/fragment_home.xml +++ b/app/src/main/res/layout-xlarge/fragment_home.xml @@ -31,24 +31,28 @@ - - + + + diff --git a/app/src/main/res/layout/fragment_banner_home.xml b/app/src/main/res/layout/fragment_banner_home.xml index c4b35108..f9589b8f 100644 --- a/app/src/main/res/layout/fragment_banner_home.xml +++ b/app/src/main/res/layout/fragment_banner_home.xml @@ -55,27 +55,28 @@ - - + + + diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 0273702a..4f7b0245 100755 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -27,24 +27,27 @@ - - + + + diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml index 7361aa10..cac8c3d5 100644 --- a/app/src/main/res/layout/fragment_library.xml +++ b/app/src/main/res/layout/fragment_library.xml @@ -49,8 +49,16 @@ android:layout_weight="0" app:civ_border="false" /> - + + +