diff --git a/app/build.gradle b/app/build.gradle index 3e60efac..2788d84e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,8 +63,10 @@ android { renderscriptTargetApi 23 applicationId "com.kabouzeid.gramophone" - versionCode 93 - versionName "0.9.53 TEMP" + versionCode 94 + versionName "0.9.54 RC" + + manifestPlaceholders = [appName: "@string/app_name"] } buildTypes { release { @@ -74,6 +76,9 @@ android { signingConfig signingConfigs.release } debug { + applicationIdSuffix '.debug' + versionNameSuffix ' DEBUG' + manifestPlaceholders = [appName: "Phonograph DEBUG"] signingConfig signingConfigs.debug } } @@ -109,6 +114,10 @@ dependencies { transitive = true } + compile('com.github.kabouzeid:app-theme-helper:0.7.11kmod@aar'){ + transitive = true + } + compile 'com.android.support:support-v4:23.1.1' compile 'com.android.support:support-v13:23.1.1' compile 'com.android.support:appcompat-v7:23.1.1' @@ -132,5 +141,5 @@ dependencies { compile 'de.psdev.licensesdialog:licensesdialog:1.8.0' compile 'com.github.kabouzeid:AppIntro:3.3.0k' compile 'com.github.bumptech.glide:glide:3.6.1' - compile 'com.github.kabouzeid:RecyclerView-FastScroll:4a2754f1d6' + compile 'com.github.kabouzeid:RecyclerView-FastScroll:v1.2-kmod' } diff --git a/app/src/main/assets/phonograph-changelog.html b/app/src/main/assets/phonograph-changelog.html index 4f2ec5b1..025d43a0 100644 --- a/app/src/main/assets/phonograph-changelog.html +++ b/app/src/main/assets/phonograph-changelog.html @@ -25,6 +25,33 @@

You can view the changelog dialog again at any time from the about section.

+

Version 0.9.54 RC

+ +
    +
  1. NEW: Added transition when opening a playlist.
  2. +
  3. IMPROVEMENT: Adjusted the colors generated by the Palette API for better performance. +
  4. +
  5. IMPROVEMENT: Synced translations.
  6. +
  7. FIX: Fixed a bug with the switches on the settings page.
  8. +
+ +

Version 0.9.54 beta 1

+ +
    +
  1. NEW: Yet again changed the theme engine, should be quite stable again now.
  2. +
  3. NEW: Improved fastscroller (auto hide is missing right now).
  4. +
+ + +

Version 0.9.53 PREVIEW 1

+ +
    +
  1. NEW (PREVIEW): Completely new underlying theme engine.
  2. +
  3. IMPROVEMENT: Various things, I don't quite remember.
  4. +
  5. IMPROVEMENT: Synced translations.
  6. +
+ +

Version 0.9.52

    diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java index b465daf4..14005734 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java @@ -11,6 +11,8 @@ import android.view.View; import android.view.ViewGroup; import android.widget.PopupMenu; +import com.kabouzeid.appthemehelper.ThemeStore; +import com.kabouzeid.appthemehelper.util.ATHUtil; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter; import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; @@ -24,7 +26,6 @@ import com.kabouzeid.gramophone.loader.PlaylistSongLoader; import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist; -import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.Util; @@ -98,7 +99,7 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter= Build.VERSION_CODES.LOLLIPOP) { itemView.setElevation(activity.getResources().getDimensionPixelSize(R.dimen.card_elevation)); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java index 62a01b1c..a9e5a17a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java @@ -13,6 +13,7 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.Priority; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.target.Target; +import com.kabouzeid.appthemehelper.util.ATHUtil; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; import com.kabouzeid.gramophone.glide.SongGlideRequest; @@ -26,7 +27,6 @@ import com.kabouzeid.gramophone.model.Album; import com.kabouzeid.gramophone.model.Artist; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.util.ArtistSignatureUtil; -import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; @@ -139,7 +139,7 @@ public class SearchAdapter extends RecyclerView.Adapter= Build.VERSION_CODES.LOLLIPOP) { itemView.setElevation(activity.getResources().getDimensionPixelSize(R.dimen.card_elevation)); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/album/AlbumAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/album/AlbumAdapter.java index ff60d0e9..dc6933df 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/album/AlbumAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/album/AlbumAdapter.java @@ -12,6 +12,8 @@ import android.view.View; import android.view.ViewGroup; import com.bumptech.glide.Glide; +import com.kabouzeid.appthemehelper.util.ColorUtil; +import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter; import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; @@ -23,7 +25,6 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.model.Album; import com.kabouzeid.gramophone.model.Song; -import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; @@ -108,10 +109,10 @@ public class AlbumAdapter extends AbsMultiSelectAdapterUnable to load

    " + e.getLocalizedMessage() + "

    ", "text/html", "UTF-8"); diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/DonationDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/DonationDialog.java index 37e0ea63..9e815b8e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/dialogs/DonationDialog.java +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/DonationDialog.java @@ -25,9 +25,10 @@ import com.afollestad.materialdialogs.internal.ThemeSingleton; import com.anjlab.android.iab.v3.BillingProcessor; import com.anjlab.android.iab.v3.SkuDetails; import com.anjlab.android.iab.v3.TransactionDetails; +import com.kabouzeid.appthemehelper.ThemeStore; +import com.kabouzeid.appthemehelper.util.ATHUtil; import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.util.ColorUtil; import java.lang.ref.WeakReference; import java.util.ArrayList; @@ -168,12 +169,14 @@ public class DonationDialog extends DialogFragment implements BillingProcessor.I viewHolder.price.setText(skuDetails.priceText); final boolean purchased = donationDialog.billingProcessor.isPurchased(skuDetails.productId); + int titleTextColor = purchased ? ATHUtil.resolveColor(getContext(), android.R.attr.textColorHint) : ThemeStore.textColorPrimary(getContext()); + int contentTextColor = purchased ? titleTextColor : ThemeStore.textColorSecondary(getContext()); - int titleTextColor = purchased ? ColorUtil.resolveColor(getContext(), android.R.attr.textColorHint) : ColorUtil.resolveColor(getContext(), android.R.attr.textColorPrimary); - int contentTextColor = purchased ? titleTextColor : ColorUtil.resolveColor(getContext(), android.R.attr.textColorSecondary); - + //noinspection ResourceAsColor viewHolder.title.setTextColor(titleTextColor); + //noinspection ResourceAsColor viewHolder.text.setTextColor(contentTextColor); + //noinspection ResourceAsColor viewHolder.price.setTextColor(titleTextColor); strikeThrough(viewHolder.title, purchased); diff --git a/app/src/main/java/com/kabouzeid/gramophone/glide/PhonographColoredTarget.java b/app/src/main/java/com/kabouzeid/gramophone/glide/PhonographColoredTarget.java index 09d8040d..13b4e375 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/glide/PhonographColoredTarget.java +++ b/app/src/main/java/com/kabouzeid/gramophone/glide/PhonographColoredTarget.java @@ -4,10 +4,11 @@ import android.graphics.drawable.Drawable; import android.widget.ImageView; import com.bumptech.glide.request.animation.GlideAnimation; +import com.kabouzeid.appthemehelper.util.ATHUtil; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTarget; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper; -import com.kabouzeid.gramophone.util.ColorUtil; +import com.kabouzeid.gramophone.util.PhonographColorUtil; public abstract class PhonographColoredTarget extends BitmapPaletteTarget { public PhonographColoredTarget(ImageView view) { @@ -23,11 +24,11 @@ public abstract class PhonographColoredTarget extends BitmapPaletteTarget { @Override public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation glideAnimation) { super.onResourceReady(resource, glideAnimation); - onColorReady(ColorUtil.getColor(resource.getPalette(), getDefaultBarColor())); + onColorReady(PhonographColorUtil.getColor(resource.getPalette(), getDefaultBarColor())); } protected int getDefaultBarColor() { - return ColorUtil.resolveColor(getView().getContext(), R.attr.default_bar_color); + return ATHUtil.resolveColor(getView().getContext(), R.attr.default_bar_color); } public abstract void onColorReady(int color); diff --git a/app/src/main/java/com/kabouzeid/gramophone/glide/palette/BitmapPaletteTranscoder.java b/app/src/main/java/com/kabouzeid/gramophone/glide/palette/BitmapPaletteTranscoder.java index b3585850..eee8f931 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/glide/palette/BitmapPaletteTranscoder.java +++ b/app/src/main/java/com/kabouzeid/gramophone/glide/palette/BitmapPaletteTranscoder.java @@ -7,7 +7,7 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.Resource; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; -import com.kabouzeid.gramophone.util.ColorUtil; +import com.kabouzeid.gramophone.util.PhonographColorUtil; public class BitmapPaletteTranscoder implements ResourceTranscoder { private final BitmapPool bitmapPool; @@ -23,7 +23,7 @@ public class BitmapPaletteTranscoder implements ResourceTranscoder transcode(Resource bitmapResource) { Bitmap bitmap = bitmapResource.get(); - BitmapPaletteWrapper bitmapPaletteWrapper = new BitmapPaletteWrapper(bitmap, ColorUtil.generatePalette(bitmap)); + BitmapPaletteWrapper bitmapPaletteWrapper = new BitmapPaletteWrapper(bitmap, PhonographColorUtil.generatePalette(bitmap)); return new BitmapPaletteResource(bitmapPaletteWrapper, bitmapPool); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java index b7688bf7..525cf7be 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java @@ -24,13 +24,14 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.Target; +import com.kabouzeid.appthemehelper.util.ColorUtil; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.service.MusicService; import com.kabouzeid.gramophone.ui.activities.MainActivity; -import com.kabouzeid.gramophone.util.ColorUtil; +import com.kabouzeid.gramophone.util.PhonographColorUtil; import com.kabouzeid.gramophone.util.PreferenceUtil; public class PlayingNotificationHelper { @@ -69,7 +70,7 @@ public class PlayingNotificationHelper { @Override public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation glideAnimation) { - setAlbumCover(resource.getBitmap(), ColorUtil.getColor(resource.getPalette(), Color.TRANSPARENT)); + setAlbumCover(resource.getBitmap(), PhonographColorUtil.getColor(resource.getPalette(), Color.TRANSPARENT)); } }; } @@ -214,7 +215,7 @@ public class PlayingNotificationHelper { bgColor = Color.TRANSPARENT; } setBackgroundColor(bgColor); - setDarkNotificationContent(bgColor == Color.TRANSPARENT ? Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP : ColorUtil.useDarkTextColorOnBackground(bgColor)); + setDarkNotificationContent(bgColor == Color.TRANSPARENT ? Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP : ColorUtil.isColorLight(bgColor)); if (notification != null) { notificationManager.notify(notificationId, notification); diff --git a/app/src/main/java/com/kabouzeid/gramophone/misc/FloatingActionButtonProperties.java b/app/src/main/java/com/kabouzeid/gramophone/misc/FloatingActionButtonProperties.java deleted file mode 100644 index 1c692e6c..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/misc/FloatingActionButtonProperties.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.kabouzeid.gramophone.misc; - -import android.content.res.ColorStateList; -import android.graphics.PorterDuff; -import android.support.design.widget.FloatingActionButton; -import android.util.Property; - -import com.kabouzeid.gramophone.util.ColorUtil; - -/** - * @author Karim Abou Zeid (kabouzeid) - */ -public class FloatingActionButtonProperties { - public static final Property COLOR = new Property(Integer.class, "color") { - @Override - public void set(FloatingActionButton object, Integer value) { - object.setBackgroundTintList(ColorStateList.valueOf(value)); - object.getDrawable().mutate().setColorFilter(ColorUtil.getPrimaryTextColorForBackground(object.getContext(), value), PorterDuff.Mode.SRC_IN); - } - - @Override - public Integer get(FloatingActionButton object) { - return object.getBackgroundTintList() != null ? object.getBackgroundTintList().getDefaultColor() : 0; - } - }; -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/prefs/ColorChooserPreference.java b/app/src/main/java/com/kabouzeid/gramophone/prefs/ColorChooserPreference.java deleted file mode 100644 index ecdf00ae..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/prefs/ColorChooserPreference.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.kabouzeid.gramophone.prefs; - -import android.content.Context; -import android.preference.Preference; -import android.support.annotation.ColorInt; -import android.support.annotation.NonNull; -import android.util.AttributeSet; -import android.view.View; - -import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.views.ColorView; - -public class ColorChooserPreference extends Preference { - - @ColorInt - private int color; - private ColorView colorView; - - public ColorChooserPreference(@NonNull Context context) { - this(context, null); - } - - public ColorChooserPreference(@NonNull Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public ColorChooserPreference(@NonNull Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - setLayoutResource(R.layout.preference_custom); - setWidgetLayoutResource(R.layout.preference_color_widget); - } - - @Override - protected void onBindView(@NonNull View view) { - super.onBindView(view); - colorView = (ColorView) view.findViewById(R.id.circle); - invalidateColor(); - } - - public void setColor(int color) { - this.color = color; - invalidateColor(); - } - - private void invalidateColor() { - if (colorView != null) { - if (this.color != 0) { - colorView.setVisibility(View.VISIBLE); - colorView.setColor(color); - } else { - colorView.setVisibility(View.GONE); - } - } - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/prefs/DynamicPreferenceCategory.java b/app/src/main/java/com/kabouzeid/gramophone/prefs/DynamicPreferenceCategory.java deleted file mode 100644 index 0a08e7bb..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/prefs/DynamicPreferenceCategory.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.kabouzeid.gramophone.prefs; - -import android.content.Context; -import android.preference.PreferenceCategory; -import android.support.annotation.NonNull; -import android.util.AttributeSet; -import android.view.View; -import android.widget.TextView; - -import com.afollestad.materialdialogs.internal.ThemeSingleton; -import com.kabouzeid.gramophone.R; - -/** - * Uses the theme's primary color as the text color of the category. - * - * @author Aidan Follestad (afollestad) - */ -public class DynamicPreferenceCategory extends PreferenceCategory { - - public DynamicPreferenceCategory(@NonNull Context context, @NonNull AttributeSet attrs) { - this(context, attrs, 0); - } - - public DynamicPreferenceCategory(@NonNull Context context) { - this(context, null, 0); - } - - public DynamicPreferenceCategory(@NonNull Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - setLayoutResource(R.layout.preference_category_custom); - setSelectable(false); - } - - @Override - protected void onBindView(@NonNull View view) { - super.onBindView(view); - ((TextView) view.findViewById(android.R.id.title)).setTextColor(ThemeSingleton.get().positiveColor); - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AboutActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AboutActivity.java index e8adb1b3..98bb454c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AboutActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AboutActivity.java @@ -8,7 +8,6 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.widget.AppCompatButton; import android.support.v7.widget.Toolbar; -import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; @@ -16,12 +15,12 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.afollestad.materialdialogs.internal.ThemeSingleton; +import com.kabouzeid.appthemehelper.ThemeStore; +import com.kabouzeid.appthemehelper.util.ATHUtil; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.dialogs.ChangelogDialog; import com.kabouzeid.gramophone.dialogs.DonationDialog; import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity; -import com.kabouzeid.gramophone.util.ColorUtil; -import com.kabouzeid.gramophone.util.ViewUtil; import butterknife.Bind; import butterknife.ButterKnife; @@ -127,14 +126,14 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); - setStatusBarTransparent(); + setDrawUnderStatusbar(true); ButterKnife.bind(this); - setUpViews(); + setStatusbarColorAuto(); + setNavigationbarColorAuto(); + setTaskDescriptionColorAuto(); - if (shouldColorNavigationBar()) - setNavigationBarThemeColor(); - setStatusBarThemeColor(); + setUpViews(); } private void setUpViews() { @@ -145,7 +144,7 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen } private void setUpToolbar() { - toolbar.setBackgroundColor(getThemeColorPrimary()); + toolbar.setBackgroundColor(ThemeStore.primaryColor(this)); setSupportActionBar(toolbar); //noinspection ConstantConditions getSupportActionBar().setDisplayHomeAsUpEnabled(true); @@ -177,7 +176,7 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen } private void setUpIconTint() { - int iconColor = ColorUtil.resolveColor(this, R.attr.icon_color); + int iconColor = ATHUtil.resolveColor(this, R.attr.icon_color, ThemeStore.textColorSecondary(this)); iconInfo.setColorFilter(iconColor); iconChangelog.setColorFilter(iconColor); iconIntro.setColorFilter(iconColor); @@ -273,12 +272,4 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen .build() .showAppCompat(); } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - boolean darkContent = ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary()); - ViewUtil.setToolbarContentDark(this, toolbar, darkContent); - setUseDarkStatusBarIcons(darkContent); - return super.onCreateOptionsMenu(menu); - } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index f83f5fa4..ff7b98eb 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -19,6 +19,8 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView; +import com.kabouzeid.appthemehelper.util.ColorUtil; +import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.song.AlbumSongAdapter; import com.kabouzeid.gramophone.dialogs.SleepTimerDialog; @@ -34,8 +36,8 @@ import com.kabouzeid.gramophone.model.Album; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.AlbumTagEditorActivity; -import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.NavigationUtil; +import com.kabouzeid.gramophone.util.PhonographColorUtil; import com.kabouzeid.gramophone.util.Util; import butterknife.Bind; @@ -76,14 +78,11 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setStatusBarTransparent(); + setDrawUnderStatusbar(true); ButterKnife.bind(this); supportPostponeEnterTransition(); - if (shouldColorNavigationBar()) - setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color)); - getAlbumFromIntentExtras(); setUpObservableListViewParams(); setUpToolBar(); @@ -109,8 +108,8 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements // Change alpha of overlay toolbarAlpha = Math.max(0, Math.min(1, (float) scrollY / flexibleRange)); - toolbar.setBackgroundColor(ColorUtil.getColorWithAlpha(toolbarAlpha, toolbarColor)); - setStatusBarColor(ColorUtil.getColorWithAlpha(cab != null && cab.isActive() ? 1 : toolbarAlpha, toolbarColor)); + toolbar.setBackgroundColor(ColorUtil.withAlpha(toolbarColor, toolbarAlpha)); + setStatusbarColor(ColorUtil.withAlpha(toolbarColor, cab != null && cab.isActive() ? 1 : toolbarAlpha)); // Translate name text int maxTitleTranslationY = albumArtViewHeight; @@ -177,17 +176,10 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements private void setColors(int color) { toolbarColor = color; albumTitleView.setBackgroundColor(color); - albumTitleView.setTextColor(ColorUtil.getPrimaryTextColorForBackground(this, color)); + albumTitleView.setTextColor(MaterialValueHelper.getPrimaryTextColor(this, ColorUtil.isColorLight(color))); - if (shouldColorNavigationBar()) - setNavigationBarColor(color); - - notifyTaskColorChange(color); - } - - @Override - protected boolean overridesTaskColor() { - return true; + setNavigationbarColor(color); + setTaskDescriptionColor(color); } @Override @@ -305,11 +297,11 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements cab = new MaterialCab(this, R.id.cab_stub) .setMenu(menuRes) .setCloseDrawableRes(R.drawable.ic_close_white_24dp) - .setBackgroundColor(ColorUtil.shiftBackgroundColorForLightText(getPaletteColor())) + .setBackgroundColor(PhonographColorUtil.shiftBackgroundColorForLightText(getPaletteColor())) .start(new MaterialCab.Callback() { @Override public boolean onCabCreated(MaterialCab materialCab, Menu menu) { - setStatusBarColor(ColorUtil.getOpaqueColor(toolbarColor)); + setStatusbarColor(ColorUtil.stripAlpha(toolbarColor)); return callback.onCabCreated(materialCab, menu); } @@ -320,7 +312,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements @Override public boolean onCabFinished(MaterialCab materialCab) { - setStatusBarColor(ColorUtil.getColorWithAlpha(toolbarAlpha, toolbarColor)); + setStatusbarColor(ColorUtil.withAlpha(toolbarColor, toolbarAlpha)); return callback.onCabFinished(materialCab); } }); @@ -341,4 +333,10 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements super.onMediaStoreChanged(); refresh(); } + + @Override + public void setStatusbarColor(int color) { + super.setStatusbarColor(color); + setLightStatusbar(false); + } } \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index cdb6ab90..2d00f27f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -26,6 +26,9 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; import com.github.ksoichiro.android.observablescrollview.ObservableListView; +import com.kabouzeid.appthemehelper.util.ColorUtil; +import com.kabouzeid.appthemehelper.util.MaterialValueHelper; +import com.kabouzeid.gramophone.BuildConfig; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.album.HorizontalAlbumAdapter; import com.kabouzeid.gramophone.adapter.song.ArtistSongAdapter; @@ -48,8 +51,8 @@ import com.kabouzeid.gramophone.model.Artist; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.util.ArtistSignatureUtil; -import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.NavigationUtil; +import com.kabouzeid.gramophone.util.PhonographColorUtil; import com.kabouzeid.gramophone.util.Util; import java.util.ArrayList; @@ -100,12 +103,9 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setStatusBarTransparent(); + setDrawUnderStatusbar(true); ButterKnife.bind(this); - if (shouldColorNavigationBar()) - setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color)); - lastFMRestClient = new LastFMRestClient(this); getArtistFromIntentExtras(); @@ -134,8 +134,8 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement // Change alpha of overlay toolbarAlpha = Math.max(0, Math.min(1, (float) scrollY / flexibleRange)); - toolbar.setBackgroundColor(ColorUtil.getColorWithAlpha(toolbarAlpha, toolbarColor)); - setStatusBarColor(ColorUtil.getColorWithAlpha(cab != null && cab.isActive() ? 1 : toolbarAlpha, toolbarColor)); + toolbar.setBackgroundColor(ColorUtil.withAlpha(toolbarColor, toolbarAlpha)); + setStatusbarColor(ColorUtil.withAlpha(toolbarColor, cab != null && cab.isActive() ? 1 : toolbarAlpha)); // Translate name text int maxTitleTranslationY = artistImageViewHeight; @@ -219,6 +219,10 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement } private void loadBiography() { + if (BuildConfig.DEBUG) { + biography = Html.fromHtml("Not available in debug builds, because this is causing a crash for whatever reason."); + return; + } lastFMRestClient.getApiService().getArtistInfo(artist.name, null).enqueue(new Callback() { @Override public void onResponse(Response response) { @@ -287,11 +291,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement }); } - @Override - protected boolean overridesTaskColor() { - return true; - } - @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); @@ -305,15 +304,12 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement return toolbarColor; } - private void setColors(int vibrantColor) { - toolbarColor = vibrantColor; - artistName.setBackgroundColor(vibrantColor); - artistName.setTextColor(ColorUtil.getPrimaryTextColorForBackground(this, vibrantColor)); - - if (shouldColorNavigationBar()) - setNavigationBarColor(vibrantColor); - - notifyTaskColorChange(vibrantColor); + private void setColors(int color) { + toolbarColor = color; + artistName.setBackgroundColor(color); + artistName.setTextColor(MaterialValueHelper.getPrimaryTextColor(this, ColorUtil.isColorLight(color))); + setNavigationbarColor(color); + setTaskDescriptionColor(color); } private void getArtistFromIntentExtras() { @@ -391,11 +387,11 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement cab = new MaterialCab(this, R.id.cab_stub) .setMenu(menuRes) .setCloseDrawableRes(R.drawable.ic_close_white_24dp) - .setBackgroundColor(ColorUtil.shiftBackgroundColorForLightText(getPaletteColor())) + .setBackgroundColor(PhonographColorUtil.shiftBackgroundColorForLightText(getPaletteColor())) .start(new MaterialCab.Callback() { @Override public boolean onCabCreated(MaterialCab materialCab, Menu menu) { - setStatusBarColor(ColorUtil.getOpaqueColor(toolbarColor)); + setStatusbarColor(ColorUtil.stripAlpha(toolbarColor)); return callback.onCabCreated(materialCab, menu); } @@ -406,7 +402,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement @Override public boolean onCabFinished(MaterialCab materialCab) { - setStatusBarColor(ColorUtil.getColorWithAlpha(toolbarAlpha, toolbarColor)); + setStatusbarColor(ColorUtil.withAlpha(toolbarColor, toolbarAlpha)); return callback.onCabFinished(materialCab); } }); @@ -427,4 +423,10 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement super.onMediaStoreChanged(); reloadDataSets(); } + + @Override + public void setStatusbarColor(int color) { + super.setStatusbarColor(color); + setLightStatusbar(false); + } } \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/IntroActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/IntroActivity.java index c7869d9b..de368542 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/IntroActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/IntroActivity.java @@ -1,19 +1,18 @@ package com.kabouzeid.gramophone.ui.activities; import android.Manifest; -import android.app.ActivityManager; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.os.Handler; -import android.support.annotation.ColorInt; import android.support.v4.content.ContextCompat; import android.widget.Toast; import com.github.paolorotolo.appintro.AppIntro; import com.github.paolorotolo.appintro.AppIntroFragment; +import com.kabouzeid.appthemehelper.ATH; +import com.kabouzeid.appthemehelper.util.ColorUtil; import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.PreferenceUtil; /** @@ -23,8 +22,9 @@ public class IntroActivity extends AppIntro { @Override public void init(Bundle savedInstanceState) { int color = ContextCompat.getColor(this, R.color.blue_grey_700); - setStatusBarColor(ColorUtil.shiftColorDown(color)); - setTaskColor(color); + + ATH.setStatusbarColor(this, ColorUtil.darkenColor(color)); + ATH.setTaskDescriptionColor(this, color); showSkipButton(false); @@ -40,15 +40,6 @@ public class IntroActivity extends AppIntro { addSlide(AppIntroFragment.newInstance(getString(R.string.label_playing_queue), getString(R.string.rearrange_playing_queue_instruction), R.drawable.tutorial_rearrange_queue, color)); } - private void setTaskColor(@ColorInt int color) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - setTaskDescription(new ActivityManager.TaskDescription( - null, - null, - ColorUtil.getOpaqueColor(color))); - } - } - private boolean hasExternalStoragePermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 8711ea26..0621e555 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -5,8 +5,6 @@ import android.content.ComponentName; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.content.res.ColorStateList; -import android.graphics.Color; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -20,7 +18,6 @@ import android.support.design.widget.AppBarLayout.OnOffsetChangedListener; import android.support.design.widget.NavigationView; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; -import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewPager; import android.support.v4.widget.DrawerLayout; import android.support.v7.widget.Toolbar; @@ -34,8 +31,12 @@ import android.widget.ImageView; import android.widget.TextView; import com.afollestad.materialcab.MaterialCab; -import com.afollestad.materialdialogs.internal.ThemeSingleton; import com.bumptech.glide.Glide; +import com.kabouzeid.appthemehelper.ThemeStore; +import com.kabouzeid.appthemehelper.util.ATHUtil; +import com.kabouzeid.appthemehelper.util.NavigationViewUtil; +import com.kabouzeid.appthemehelper.util.TabLayoutUtil; +import com.kabouzeid.appthemehelper.util.ToolbarContentTintHelper; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.PagerAdapter; import com.kabouzeid.gramophone.dialogs.ChangelogDialog; @@ -56,11 +57,10 @@ import com.kabouzeid.gramophone.service.MusicService; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityFragment; import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityRecyclerViewCustomGridSizeFragment; -import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.NavigationUtil; +import com.kabouzeid.gramophone.util.PhonographColorUtil; import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.Util; -import com.kabouzeid.gramophone.util.ViewUtil; import com.sothree.slidinguppanel.SlidingUpPanelLayout; import java.io.File; @@ -107,14 +107,14 @@ public class MainActivity extends AbsSlidingMusicPanelActivity findViewById(R.id.drawer_content_container).setFitsSystemWindows(false); } + setStatusbarColorAuto(); + setNavigationbarColorAuto(); + setTaskDescriptionColorAuto(); + setUpDrawerLayout(); setUpToolbar(); setUpViewPager(); - if (shouldColorNavigationBar()) - setNavigationBarThemeColor(); - setStatusBarThemeColor(); - checkChangelog(); if (!PreferenceUtil.getInstance(this).introShown()) { @@ -160,8 +160,8 @@ public class MainActivity extends AbsSlidingMusicPanelActivity pager.setOffscreenPageLimit(pagerAdapter.getCount() - 1); // => all tabs.setupWithViewPager(pager); - tabs.setTabTextColors(ColorUtil.getSecondaryTextColorForBackground(this, getThemeColorPrimary()), ColorUtil.getPrimaryTextColorForBackground(this, getThemeColorPrimary())); - tabs.setSelectedTabIndicatorColor(getThemeColorAccent() == Color.WHITE && !ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary()) ? Color.WHITE : ThemeSingleton.get().positiveColor.getDefaultColor()); + + TabLayoutUtil.setTabLayoutColors(tabs, ToolbarContentTintHelper.toolbarTitleColor(this, ThemeStore.primaryColor(this)), ThemeStore.accentColor(this)); int startPosition = PreferenceUtil.getInstance(this).getDefaultStartPage(); startPosition = startPosition == -1 ? PreferenceUtil.getInstance(this).getLastStartPage() : startPosition; @@ -169,43 +169,21 @@ public class MainActivity extends AbsSlidingMusicPanelActivity } private void setUpToolbar() { + int primaryColor = ThemeStore.primaryColor(this); + appbar.setBackgroundColor(primaryColor); + toolbar.setBackgroundColor(primaryColor); toolbar.setNavigationIcon(R.drawable.ic_menu_white_24dp); setTitle(getResources().getString(R.string.app_name)); - setAppBarColor(); setSupportActionBar(toolbar); } - private void setAppBarColor() { - appbar.setBackgroundColor(getThemeColorPrimary()); - } - private void setUpNavigationView() { navigationView.setCheckedItem(R.id.nav_library); - final int colorAccent = ThemeSingleton.get().positiveColor.getDefaultColor(); - navigationView.setItemTextColor(new ColorStateList( - new int[][]{ - //{-android.R.attr.state_enabled}, // disabled - {android.R.attr.state_checked}, // checked - {} // default - }, - new int[]{ - // 0, - colorAccent, - ThemeSingleton.get().darkTheme ? ContextCompat.getColor(this, R.color.primary_text_default_material_dark) : ContextCompat.getColor(this, R.color.primary_text_default_material_light) - } - )); - navigationView.setItemIconTintList(new ColorStateList( - new int[][]{ - //{-android.R.attr.state_enabled}, // disabled - {android.R.attr.state_checked}, // checked - {} // default - }, - new int[]{ - // 0, - colorAccent, - ThemeSingleton.get().darkTheme ? ContextCompat.getColor(this, R.color.secondary_text_default_material_dark) : ContextCompat.getColor(this, R.color.secondary_text_default_material_light) - } - )); + + int accentColor = ThemeStore.accentColor(this); + NavigationViewUtil.setItemIconColors(navigationView, ATHUtil.resolveColor(this, R.attr.icon_color, ThemeStore.textColorSecondary(this)), accentColor); + NavigationViewUtil.setItemTextColors(navigationView, ThemeStore.textColorPrimary(this), accentColor); + navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { @@ -334,16 +312,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity menu.removeItem(R.id.action_grid_size); menu.removeItem(R.id.action_colored_footers); } - boolean darkContent = ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary()); - ViewUtil.setToolbarContentDark(this, toolbar, darkContent); - setUseDarkStatusBarIcons(darkContent); - return true; - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - ViewUtil.invalidateToolbarPopupMenuTint(toolbar); - return super.onPrepareOptionsMenu(menu); + return super.onCreateOptionsMenu(menu); } @Override @@ -357,8 +326,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity return true; } - ViewUtil.invalidateToolbarPopupMenuTint(toolbar); - Fragment currentFragment = getCurrentFragment(); if (currentFragment instanceof AbsMainActivityRecyclerViewCustomGridSizeFragment) { AbsMainActivityRecyclerViewCustomGridSizeFragment absMainActivityRecyclerViewCustomGridSizeFragment = (AbsMainActivityRecyclerViewCustomGridSizeFragment) currentFragment; @@ -571,7 +538,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity cab = new MaterialCab(this, R.id.cab_stub) .setMenu(menu) .setCloseDrawableRes(R.drawable.ic_close_white_24dp) - .setBackgroundColor(ColorUtil.shiftBackgroundColorForLightText(getThemeColorPrimary())) + .setBackgroundColor(PhonographColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor(this))) .start(callback); return cab; } @@ -619,12 +586,12 @@ public class MainActivity extends AbsSlidingMusicPanelActivity @Override public void onDrawerOpened(View drawerView) { - setUseDarkStatusBarIcons(false); + setLightStatusbar(false); } @Override public void onDrawerClosed(View drawerView) { - setUseDarkStatusBarIcons(ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary())); + setLightStatusbarAuto(ThemeStore.primaryColor(this)); } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java index ec830738..d0ca8ef7 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java @@ -1,10 +1,12 @@ package com.kabouzeid.gramophone.ui.activities; +import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; +import android.transition.Slide; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -15,6 +17,7 @@ import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator; import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator; import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager; import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils; +import com.kabouzeid.appthemehelper.ThemeStore; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.song.PlaylistSongAdapter; import com.kabouzeid.gramophone.adapter.song.SmartPlaylistSongAdapter; @@ -28,10 +31,9 @@ import com.kabouzeid.gramophone.model.PlaylistSong; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; -import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.NavigationUtil; +import com.kabouzeid.gramophone.util.PhonographColorUtil; import com.kabouzeid.gramophone.util.PlaylistsUtil; -import com.kabouzeid.gramophone.util.ViewUtil; import java.util.ArrayList; import java.util.List; @@ -63,9 +65,13 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setStatusBarTransparent(); + setDrawUnderStatusbar(true); ButterKnife.bind(this); + setStatusbarColorAuto(); + setNavigationbarColorAuto(); + setTaskDescriptionColorAuto(); + getIntentExtras(); setUpRecyclerView(); @@ -74,9 +80,9 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme setUpToolBar(); - if (shouldColorNavigationBar()) - setNavigationBarThemeColor(); - setStatusBarThemeColor(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + getWindow().setEnterTransition(new Slide()); + } } @Override @@ -137,7 +143,7 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme } private void setUpToolBar() { - toolbar.setBackgroundColor(getThemeColorPrimary()); + toolbar.setBackgroundColor(ThemeStore.primaryColor(this)); setSupportActionBar(toolbar); //noinspection ConstantConditions getSupportActionBar().setTitle(playlist.name); @@ -159,10 +165,7 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_playlist_detail, menu); - boolean darkContent = ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary()); - ViewUtil.setToolbarContentDark(this, toolbar, darkContent); - setUseDarkStatusBarIcons(darkContent); - return true; + return super.onCreateOptionsMenu(menu); } @Override @@ -191,7 +194,7 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme cab = new MaterialCab(this, R.id.cab_stub) .setMenu(menu) .setCloseDrawableRes(R.drawable.ic_close_white_24dp) - .setBackgroundColor(ColorUtil.shiftBackgroundColorForLightText(getThemeColorPrimary())) + .setBackgroundColor(PhonographColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor(this))) .start(callback); return cab; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java index 19e4844d..df10a4a9 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java @@ -10,7 +10,6 @@ import android.support.v7.widget.Toolbar; import android.text.Editable; import android.text.TextWatcher; import android.view.KeyEvent; -import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; @@ -19,12 +18,12 @@ import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; +import com.kabouzeid.appthemehelper.ThemeStore; +import com.kabouzeid.appthemehelper.util.ToolbarContentTintHelper; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.SearchAdapter; import com.kabouzeid.gramophone.ui.activities.base.AbsMusicServiceActivity; -import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.Util; -import com.kabouzeid.gramophone.util.ViewUtil; import butterknife.Bind; import butterknife.ButterKnife; @@ -51,9 +50,13 @@ public class SearchActivity extends AbsMusicServiceActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search); - setStatusBarTransparent(); + setDrawUnderStatusbar(true); ButterKnife.bind(this); + setStatusbarColorAuto(); + setNavigationbarColorAuto(); + setTaskDescriptionColorAuto(); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); searchAdapter = new SearchAdapter(this); recyclerView.setAdapter(searchAdapter); @@ -68,29 +71,17 @@ public class SearchActivity extends AbsMusicServiceActivity { setUpToolBar(); setUpSearchBar(); - - if (shouldColorNavigationBar()) - setNavigationBarThemeColor(); - setStatusBarThemeColor(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - boolean darkContent = ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary()); - ViewUtil.setToolbarContentDark(this, toolbar, darkContent); - setUseDarkStatusBarIcons(darkContent); - return super.onCreateOptionsMenu(menu); } private void setUpToolBar() { - toolbar.setBackgroundColor(getThemeColorPrimary()); + toolbar.setBackgroundColor(ThemeStore.primaryColor(this)); setSupportActionBar(toolbar); //noinspection ConstantConditions getSupportActionBar().setDisplayHomeAsUpEnabled(true); } private void setUpSearchBar() { - searchCloseBtn.setColorFilter(ViewUtil.getToolbarIconColor(this, ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary())), PorterDuff.Mode.SRC_IN); + searchCloseBtn.setColorFilter(ToolbarContentTintHelper.toolbarContentColor(this, ThemeStore.primaryColor(this)), PorterDuff.Mode.SRC_IN); searchCloseBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -98,8 +89,8 @@ public class SearchActivity extends AbsMusicServiceActivity { } }); - searchSrcText.setTextColor(ColorUtil.getPrimaryTextColorForBackground(this, getThemeColorPrimary())); - searchSrcText.setHintTextColor(ColorUtil.getSecondaryTextColorForBackground(this, getThemeColorPrimary())); + searchSrcText.setTextColor(ToolbarContentTintHelper.toolbarTitleColor(this, ThemeStore.primaryColor(this))); + searchSrcText.setHintTextColor(ToolbarContentTintHelper.toolbarSubtitleColor(this, ThemeStore.primaryColor(this))); searchSrcText.setHint(R.string.search_hint); searchSrcText.addTextChangedListener(new TextWatcher() { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java index 8030e1de..51b4ffc5 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java @@ -10,22 +10,22 @@ import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; +import android.preference.TwoStatePreference; import android.support.annotation.ColorInt; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.annotation.StyleRes; import android.support.v7.widget.Toolbar; -import android.view.Menu; import android.view.MenuItem; import android.view.View; import com.afollestad.materialdialogs.color.ColorChooserDialog; +import com.kabouzeid.appthemehelper.ThemeStore; +import com.kabouzeid.appthemehelper.common.prefs.ATEColorPreference; +import com.kabouzeid.appthemehelper.util.ColorUtil; import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.prefs.ColorChooserPreference; import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity; -import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.NavigationUtil; -import com.kabouzeid.gramophone.util.PreferenceUtil; -import com.kabouzeid.gramophone.util.ViewUtil; import butterknife.Bind; import butterknife.ButterKnife; @@ -40,33 +40,41 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_preferences); - setStatusBarTransparent(); + setDrawUnderStatusbar(true); ButterKnife.bind(this); - toolbar.setBackgroundColor(getThemeColorPrimary()); + setStatusbarColorAuto(); + setNavigationbarColorAuto(); + setTaskDescriptionColorAuto(); + + toolbar.setBackgroundColor(ThemeStore.primaryColor(this)); setSupportActionBar(toolbar); //noinspection ConstantConditions getSupportActionBar().setDisplayHomeAsUpEnabled(true); - if (savedInstanceState == null) + if (savedInstanceState == null) { getFragmentManager().beginTransaction().replace(R.id.content_frame, new SettingsFragment()).commit(); - - if (shouldColorNavigationBar()) - setNavigationBarThemeColor(); - setStatusBarThemeColor(); + } else { + SettingsFragment frag = (SettingsFragment) getFragmentManager().findFragmentById(R.id.content_frame); + if (frag != null) frag.invalidateSettings(); + } } @Override public void onColorSelection(@NonNull ColorChooserDialog dialog, @ColorInt int selectedColor) { switch (dialog.getTitle()) { case R.string.primary_color: - PreferenceUtil.getInstance(this).setThemeColorPrimary(selectedColor); + ThemeStore.editTheme(this) + .primaryColor(selectedColor) + .commit(); break; case R.string.accent_color: - PreferenceUtil.getInstance(this).setThemeColorAccent(selectedColor); + ThemeStore.editTheme(this) + .accentColor(selectedColor) + .commit(); break; } - recreateIfThemeChanged(); + recreate(); } @Override @@ -78,14 +86,6 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia return super.onOptionsItemSelected(item); } - @Override - public boolean onCreateOptionsMenu(Menu menu) { - boolean darkContent = ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary()); - ViewUtil.setToolbarContentDark(this, toolbar, darkContent); - setUseDarkStatusBarIcons(darkContent); - return super.onCreateOptionsMenu(menu); - } - public static class SettingsFragment extends PreferenceFragment { private static void setSummary(@NonNull Preference preference) { @@ -109,12 +109,6 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia } } - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - view.findViewById(android.R.id.list).setPadding(0, 0, 0, 0); - } - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -125,7 +119,16 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia addPreferencesFromResource(R.xml.pref_images); addPreferencesFromResource(R.xml.pref_lockscreen); addPreferencesFromResource(R.xml.pref_audio); + } + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + view.findViewById(android.R.id.list).setPadding(0, 0, 0, 0); + invalidateSettings(); + } + + private void invalidateSettings() { final Preference defaultStartPage = findPreference("default_start_page"); setSummary(defaultStartPage); defaultStartPage.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @@ -142,8 +145,10 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia @Override public boolean onPreferenceChange(Preference preference, @NonNull Object o) { setSummary(generalTheme, o); - PreferenceUtil.getInstance(getActivity()).setGeneralTheme(getActivity(), (String) o); - ((SettingsActivity) getActivity()).recreateIfThemeChanged(); + ThemeStore.editTheme(getActivity()) + .activityTheme(getThemeResFromPrefValue((String) o)) + .commit(); + getActivity().recreate(); return true; } }); @@ -158,46 +163,51 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia } }); - ColorChooserPreference primaryColor = (ColorChooserPreference) findPreference("primary_color"); - primaryColor.setColor(PreferenceUtil.getInstance(getActivity()).getThemeColorPrimary(getActivity())); - primaryColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + ATEColorPreference primaryColorPref = (ATEColorPreference) findPreference("primary_color"); + final int primaryColor = ThemeStore.primaryColor(getActivity()); + primaryColorPref.setColor(primaryColor, ColorUtil.darkenColor(primaryColor)); + primaryColorPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(@NonNull Preference preference) { new ColorChooserDialog.Builder(((SettingsActivity) getActivity()), R.string.primary_color) .accentMode(false) .allowUserColorInput(true) .allowUserColorInputAlpha(false) - .preselect(PreferenceUtil.getInstance(getActivity()).getThemeColorPrimary(getActivity())) + .preselect(primaryColor) .show(); return true; } }); - ColorChooserPreference accentColor = (ColorChooserPreference) findPreference("accent_color"); - accentColor.setColor(PreferenceUtil.getInstance(getActivity()).getThemeColorAccent(getActivity())); - accentColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + ATEColorPreference accentColorPref = (ATEColorPreference) findPreference("accent_color"); + final int accentColor = ThemeStore.accentColor(getActivity()); + accentColorPref.setColor(accentColor, ColorUtil.darkenColor(accentColor)); + accentColorPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(@NonNull Preference preference) { new ColorChooserDialog.Builder(((SettingsActivity) getActivity()), R.string.accent_color) .accentMode(true) .allowUserColorInput(true) .allowUserColorInputAlpha(false) - .preselect(PreferenceUtil.getInstance(getActivity()).getThemeColorAccent(getActivity())) + .preselect(accentColor) .show(); return true; } }); - Preference colorNavBar = findPreference("should_color_navigation_bar"); + TwoStatePreference colorNavBar = (TwoStatePreference) findPreference("should_color_navigation_bar"); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { colorNavBar.setEnabled(false); colorNavBar.setSummary(R.string.pref_only_lollipop); } else { + colorNavBar.setChecked(ThemeStore.coloredNavigationBar(getActivity())); colorNavBar.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { - PreferenceUtil.getInstance(getActivity()).setColoredNavigationBar((boolean) newValue); - ((SettingsActivity) getActivity()).recreateIfThemeChanged(); + ThemeStore.editTheme(getActivity()) + .coloredNavigationBar((Boolean) newValue) + .commit(); + getActivity().recreate(); return true; } }); @@ -223,5 +233,18 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia ResolveInfo ri = pm.resolveActivity(effects, 0); return ri != null; } + + @StyleRes + public int getThemeResFromPrefValue(String themePrefValue) { + switch (themePrefValue) { + case "dark": + return R.style.Theme_Phonograph; + case "black": + return R.style.Theme_Phonograph_Black; + case "light": + default: + return R.style.Theme_Phonograph_Light; + } + } } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java index 2536a802..b98ddbe2 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java @@ -7,7 +7,6 @@ import android.media.AudioManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.os.Handler; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -16,7 +15,7 @@ import android.support.v4.app.ActivityCompat; import android.view.KeyEvent; import android.view.View; -import com.afollestad.materialdialogs.internal.ThemeSingleton; +import com.kabouzeid.appthemehelper.ThemeStore; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble; @@ -66,18 +65,9 @@ public abstract class AbsBaseActivity extends AbsThemeActivity implements KabVie } protected void onPermissionsChanged() { - postRecreate(); - } - - protected void postRecreate() { if (!recreating) { recreating = true; - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - recreate(); - } - }, 200); + postRecreate(); } } @@ -165,7 +155,7 @@ public abstract class AbsBaseActivity extends AbsThemeActivity implements KabVie requestPermissions(); } }) - .setActionTextColor(ThemeSingleton.get().positiveColor) + .setActionTextColor(ThemeStore.accentColor(this)) .show(); } else { // User has deny permission and checked never show permission dialog so you can redirect to Application settings page @@ -181,7 +171,7 @@ public abstract class AbsBaseActivity extends AbsThemeActivity implements KabVie startActivity(intent); } }) - .setActionTextColor(ThemeSingleton.get().positiveColor) + .setActionTextColor(ThemeStore.accentColor(this)) .show(); } return; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java index 00080515..80116b59 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java @@ -33,9 +33,9 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi @Bind(R.id.sliding_layout) SlidingUpPanelLayout slidingUpPanelLayout; - private int navigationBarColor; + private int navigationbarColor; private int taskColor; - private boolean useDarkStatusBarIcons; + private boolean lightStatusbar; private AbsPlayerFragment playerFragment; private MiniPlayerFragment miniPlayerFragment; @@ -100,11 +100,11 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi @Override public void onPanelCollapsed(View view) { - super.setUseDarkStatusBarIcons(useDarkStatusBarIcons); - super.notifyTaskColorChange(taskColor); - if (shouldColorNavigationBar()) { - super.setNavigationBarColor(navigationBarColor); - } + // restore values + super.setLightStatusbar(lightStatusbar); + super.setTaskDescriptionColor(taskColor); + super.setNavigationbarColor(navigationbarColor); + playerFragment.setMenuVisibility(false); playerFragment.setUserVisibleHint(false); playerFragment.onHide(); @@ -112,12 +112,12 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi @Override public void onPanelExpanded(View view) { - super.setUseDarkStatusBarIcons(false); + // setting fragments values int playerFragmentColor = playerFragment.getPaletteColor(); - super.notifyTaskColorChange(playerFragmentColor); - if (shouldColorNavigationBar()) { - super.setNavigationBarColor(playerFragmentColor); - } + super.setLightStatusbar(false); + super.setTaskDescriptionColor(playerFragmentColor); + super.setNavigationbarColor(playerFragmentColor); + playerFragment.setMenuVisibility(true); playerFragment.setUserVisibleHint(true); playerFragment.onShow(); @@ -182,38 +182,44 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi super.onBackPressed(); } - @Override - protected void setUseDarkStatusBarIcons(boolean useDarkIcons) { - useDarkStatusBarIcons = useDarkIcons; - if (getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) { - super.setUseDarkStatusBarIcons(useDarkIcons); - } - } - - @Override - protected void setNavigationBarColor(@ColorInt int color) { - this.navigationBarColor = color; - if (getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) { - super.setNavigationBarColor(color); - } - } - - @Override - protected void notifyTaskColorChange(@ColorInt int color) { - this.taskColor = color; - if (getPanelState() == null || getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) { - super.notifyTaskColorChange(color); - } - } - @Override public void onPaletteColorChanged() { if (getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) { int playerFragmentColor = playerFragment.getPaletteColor(); - super.notifyTaskColorChange(playerFragmentColor); - if (shouldColorNavigationBar()) { - super.setNavigationBarColor(playerFragmentColor); - } + super.setTaskDescriptionColor(playerFragmentColor); + super.setNavigationbarColor(playerFragmentColor); } } + + @Override + public void setLightStatusbar(boolean enabled) { + lightStatusbar = enabled; + if (getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) { + super.setLightStatusbar(enabled); + } + } + + @Override + public void setNavigationbarColor(int color) { + this.navigationbarColor = color; + if (getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) { + super.setNavigationbarColor(color); + } + } + + @Override + public void setTaskDescriptionColor(@ColorInt int color) { + this.taskColor = color; + if (getPanelState() == null || getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) { + super.setTaskDescriptionColor(color); + } + } + + public MiniPlayerFragment getMiniPlayerFragment() { + return miniPlayerFragment; + } + + public AbsPlayerFragment getPlayerFragment() { + return playerFragment; + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsThemeActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsThemeActivity.java index e0a7d54d..ea9beb85 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsThemeActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsThemeActivity.java @@ -1,192 +1,94 @@ package com.kabouzeid.gramophone.ui.activities.base; -import android.app.ActivityManager; -import android.content.res.ColorStateList; -import android.graphics.Color; import android.os.Build; import android.os.Bundle; -import android.os.Handler; import android.support.annotation.ColorInt; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; import android.view.View; -import com.afollestad.materialdialogs.internal.ThemeSingleton; +import com.kabouzeid.appthemehelper.ATH; +import com.kabouzeid.appthemehelper.ThemeStore; +import com.kabouzeid.appthemehelper.common.ATHToolbarActivity; +import com.kabouzeid.appthemehelper.util.ColorUtil; +import com.kabouzeid.appthemehelper.util.MaterialDialogsUtil; import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble; -import com.kabouzeid.gramophone.util.ColorUtil; -import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.Util; /** - * @author Aidan Follestad (afollestad), Karim Abou Zeid (kabouzeid) + * @author Karim Abou Zeid (kabouzeid) */ -public abstract class AbsThemeActivity extends AppCompatActivity implements KabViewsDisableAble { - private int colorPrimary; - private int colorPrimaryDarker; - private int colorAccent; - private int theme; - private boolean coloredNavigationBar; - - @Nullable - private ActivityManager.TaskDescription taskDescription; +public abstract class AbsThemeActivity extends ATHToolbarActivity { @Override protected void onCreate(Bundle savedInstanceState) { - theme = PreferenceUtil.getInstance(this).getGeneralTheme(); - setTheme(theme); + // default theme + if (!ThemeStore.isConfigured(this, 1)) { + ThemeStore.editTheme(this) + .activityTheme(R.style.Theme_Phonograph_Light) + .primaryColorRes(R.color.indigo_500) + .accentColorRes(R.color.pink_A400) + .commit(); + } super.onCreate(savedInstanceState); - setupTheme(); + MaterialDialogsUtil.updateMaterialDialogsThemeSingleton(this); } - @Override - protected void onResume() { - super.onResume(); - // the handler is necessary to avoid "java.lang.RuntimeException: Performing pause of activity that is not resumed" - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - recreateIfThemeChanged(); - } - }, 200); - } - - private void setupTheme() { - boolean dark = theme != R.style.Theme_Phonograph_Light; - - colorPrimary = PreferenceUtil.getInstance(this).getThemeColorPrimary(this); - colorPrimaryDarker = ColorUtil.shiftColorDown(colorPrimary); - colorAccent = PreferenceUtil.getInstance(this).getThemeColorAccent(this); - coloredNavigationBar = PreferenceUtil.getInstance(this).shouldUseColoredNavigationBar(); - - final ColorStateList accentColorStateList; - if (colorAccent == Color.WHITE && !dark) { - accentColorStateList = ColorStateList.valueOf(Color.BLACK); - } else if (colorAccent == Color.BLACK && dark) { - accentColorStateList = ColorStateList.valueOf(Color.WHITE); - } else { - accentColorStateList = ColorStateList.valueOf(colorAccent); - } - - ThemeSingleton.get().positiveColor = accentColorStateList; - ThemeSingleton.get().negativeColor = accentColorStateList; - ThemeSingleton.get().neutralColor = accentColorStateList; - ThemeSingleton.get().widgetColor = accentColorStateList.getDefaultColor(); - ThemeSingleton.get().darkTheme = dark; - - - if (!overridesTaskColor()) { - notifyTaskColorChange(getThemeColorPrimary()); - } - } - - protected void recreateIfThemeChanged() { - if (didThemeChanged()) { - recreate(); - } - } - - private boolean didThemeChanged() { - return coloredNavigationBar != PreferenceUtil.getInstance(this).shouldUseColoredNavigationBar() || - colorPrimary != PreferenceUtil.getInstance(this).getThemeColorPrimary(this) || - colorAccent != PreferenceUtil.getInstance(this).getThemeColorAccent(this) || - theme != PreferenceUtil.getInstance(this).getGeneralTheme(); - } - - protected void notifyTaskColorChange(@ColorInt int color) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - // Sets color of entry in the system recents page - if (taskDescription == null || taskDescription.getPrimaryColor() != color) { - taskDescription = new ActivityManager.TaskDescription( - null, - null, - ColorUtil.getOpaqueColor(color)); - setTaskDescription(taskDescription); - } - } - } - - public int getThemeColorPrimary() { - return colorPrimary; - } - - public int getThemeColorPrimaryDarker() { - return colorPrimaryDarker; - } - - public int getThemeColorAccent() { - return colorAccent; - } - - public boolean shouldColorNavigationBar() { - return coloredNavigationBar; - } - - protected void setStatusBarTransparent() { + // TODO see "materialize" library for setting window flags + protected void setDrawUnderStatusbar(boolean drawUnderStatusbar) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) Util.setAllowDrawUnderStatusBar(getWindow()); else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) Util.setStatusBarTranslucent(getWindow()); } - protected void setNavigationBarColor(@ColorInt int color) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) - getWindow().setNavigationBarColor(color); - } - /** * This will set the color of the view with the id "status_bar" on KitKat and Lollipop. * On Lollipop if no such view is found it will set the statusbar color using the native method. * * @param color the new statusbar color (will be shifted down on Lollipop and above) */ - protected final void setStatusBarColor(@ColorInt int color) { + public void setStatusbarColor(int color) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { final View statusBar = getWindow().getDecorView().getRootView().findViewById(R.id.status_bar); if (statusBar != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - statusBar.setBackgroundColor(ColorUtil.shiftColorDown(color)); + statusBar.setBackgroundColor(ColorUtil.darkenColor(color)); + ATH.setLightStatusbarAuto(this, color); } else { statusBar.setBackgroundColor(color); } - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - getWindow().setStatusBarColor(ColorUtil.shiftColorDown(color)); - } - } - - } - - protected void setUseDarkStatusBarIcons(boolean useDarkIcons) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - int systemUiVisibility = getWindow().getDecorView().getSystemUiVisibility(); - if (useDarkIcons) { - getWindow().getDecorView().setSystemUiVisibility(systemUiVisibility | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } else { - getWindow().getDecorView().setSystemUiVisibility(systemUiVisibility & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + ATH.setStatusbarColor(this, ColorUtil.darkenColor(color)); } } } - protected final void setNavigationBarThemeColor() { - setNavigationBarColor(colorPrimary); + public void setStatusbarColorAuto() { + // we don't want to use statusbar color because we are doing the color darkening on our own to support KitKat + setStatusbarColor(ThemeStore.primaryColor(this)); } - protected final void setStatusBarThemeColor() { - setStatusBarColor(colorPrimary); + public void setTaskDescriptionColor(@ColorInt int color) { + ATH.setTaskDescriptionColor(this, color); } - protected final void resetNavigationBarColor() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) - setNavigationBarColor(ColorUtil.resolveColor(this, android.R.attr.navigationBarColor)); + public void setTaskDescriptionColorAuto() { + setTaskDescriptionColor(ThemeStore.primaryColor(this)); } - protected final void resetStatusBarColor() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) - setStatusBarColor(ColorUtil.resolveColor(this, android.R.attr.statusBarColor)); + public void setNavigationbarColor(int color) { + ATH.setNavigationbarColor(this, color); } - protected boolean overridesTaskColor() { - return false; + public void setNavigationbarColorAuto() { + setNavigationbarColor(ThemeStore.navigationBarColor(this)); + } + + public void setLightStatusbar(boolean enabled) { + ATH.setLightStatusbar(this, enabled); + } + + public void setLightStatusbarAuto(int bgColor) { + setLightStatusbar(ColorUtil.isColorLight(bgColor)); } } \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java index a63da241..cf536dd2 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java @@ -3,10 +3,8 @@ package com.kabouzeid.gramophone.ui.activities.tageditor; import android.app.SearchManager; import android.content.Intent; import android.content.pm.ActivityInfo; -import android.content.res.ColorStateList; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.PorterDuff; import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Build; @@ -16,7 +14,6 @@ import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; import android.support.v7.widget.Toolbar; import android.util.Log; -import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.animation.OvershootInterpolator; @@ -25,13 +22,14 @@ import android.widget.LinearLayout; import com.afollestad.materialdialogs.MaterialDialog; import com.github.ksoichiro.android.observablescrollview.ObservableScrollView; +import com.kabouzeid.appthemehelper.ThemeStore; +import com.kabouzeid.appthemehelper.util.ColorUtil; +import com.kabouzeid.appthemehelper.util.TintHelper; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.misc.SimpleObservableScrollViewCallbacks; import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity; -import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.Util; -import com.kabouzeid.gramophone.util.ViewUtil; import org.jaudiotagger.audio.AudioFile; import org.jaudiotagger.audio.AudioFileIO; @@ -86,7 +84,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { header.setTranslationY(scrollY); alpha = 1; } - toolbar.setBackgroundColor(ColorUtil.getColorWithAlpha(alpha, paletteColorPrimary)); + toolbar.setBackgroundColor(ColorUtil.withAlpha(paletteColorPrimary, alpha)); image.setTranslationY(scrollY / 2); } }; @@ -189,10 +187,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { } }); - int fabColor = getThemeColorAccent(); - int fabDrawableColor = ColorUtil.getPrimaryTextColorForBackground(this, fabColor); - fab.setBackgroundTintList(ColorStateList.valueOf(fabColor)); - fab.getDrawable().setColorFilter(fabDrawableColor, PorterDuff.Mode.SRC_IN); + TintHelper.setTintAuto(fab, ThemeStore.accentColor(this), true); } protected abstract void save(); @@ -233,14 +228,6 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { return super.onOptionsItemSelected(item); } - @Override - public boolean onCreateOptionsMenu(Menu menu) { - boolean darkContent = ColorUtil.useDarkTextColorOnBackground(paletteColorPrimary); - ViewUtil.setToolbarContentDark(this, toolbar, darkContent); - setUseDarkStatusBarIcons(darkContent); - return super.onCreateOptionsMenu(menu); - } - protected void setNoImageMode() { isInNoImageMode = true; image.setVisibility(View.GONE); @@ -248,14 +235,13 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { observableScrollView.setPadding(0, Util.getActionBarSize(this), 0, 0); observableScrollViewCallbacks.onScrollChanged(observableScrollView.getCurrentScrollY(), false, false); - paletteColorPrimary = getIntent().getIntExtra(EXTRA_PALETTE, - getThemeColorPrimary()); + paletteColorPrimary = getIntent().getIntExtra(EXTRA_PALETTE, ThemeStore.primaryColor(this)); toolbar.setBackgroundColor(paletteColorPrimary); header.setBackgroundColor(paletteColorPrimary); - if (shouldColorNavigationBar()) - setNavigationBarColor(paletteColorPrimary); - setStatusBarColor(paletteColorPrimary); + setStatusbarColor(paletteColorPrimary); + setNavigationbarColor(paletteColorPrimary); + setTaskDescriptionColor(paletteColorPrimary); } protected void dataChanged() { @@ -284,19 +270,10 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { private void setColors(int color) { paletteColorPrimary = color; observableScrollViewCallbacks.onScrollChanged(observableScrollView.getCurrentScrollY(), false, false); - if (shouldColorNavigationBar()) - setNavigationBarColor(paletteColorPrimary); - setStatusBarColor(paletteColorPrimary); header.setBackgroundColor(paletteColorPrimary); - boolean darkContent = ColorUtil.useDarkTextColorOnBackground(paletteColorPrimary); - ViewUtil.setToolbarContentDark(AbsTagEditorActivity.this, toolbar, darkContent); - setUseDarkStatusBarIcons(darkContent); - notifyTaskColorChange(paletteColorPrimary); - } - - @Override - protected boolean overridesTaskColor() { - return true; + setStatusbarColor(paletteColorPrimary); + setNavigationbarColor(paletteColorPrimary); + setTaskDescriptionColor(paletteColorPrimary); } protected void writeValuesToFiles(@NonNull final Map fieldKeyValueMap) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java index 83a04e0c..f402e1fb 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java @@ -18,6 +18,7 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget; +import com.kabouzeid.appthemehelper.util.ATHUtil; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTranscoder; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper; @@ -25,9 +26,9 @@ import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient; import com.kabouzeid.gramophone.lastfm.rest.model.LastFmAlbum; import com.kabouzeid.gramophone.loader.AlbumLoader; import com.kabouzeid.gramophone.model.Song; -import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.LastFMUtil; import com.kabouzeid.gramophone.util.MusicUtil; +import com.kabouzeid.gramophone.util.PhonographColorUtil; import org.jaudiotagger.tag.FieldKey; import org.jaudiotagger.tag.images.Artwork; @@ -92,7 +93,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text @Override protected void loadCurrentImage() { Bitmap bitmap = getAlbumArt(); - setImageBitmap(bitmap, ColorUtil.getColor(ColorUtil.generatePalette(bitmap), ColorUtil.resolveColor(this, R.attr.default_bar_color))); + setImageBitmap(bitmap, PhonographColorUtil.getColor(PhonographColorUtil.generatePalette(bitmap), ATHUtil.resolveColor(this, R.attr.default_bar_color))); deleteAlbumArt = false; } @@ -128,7 +129,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text @Override public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation glideAnimation) { albumArtBitmap = getResizedAlbumCover(resource.getBitmap(), 2048); - setImageBitmap(albumArtBitmap, ColorUtil.getColor(resource.getPalette(), ColorUtil.resolveColor(AlbumTagEditorActivity.this, R.attr.default_bar_color))); + setImageBitmap(albumArtBitmap, PhonographColorUtil.getColor(resource.getPalette(), ATHUtil.resolveColor(AlbumTagEditorActivity.this, R.attr.default_bar_color))); deleteAlbumArt = false; dataChanged(); setResult(RESULT_OK); @@ -159,7 +160,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text @Override protected void deleteImage() { - setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.default_album_art), ColorUtil.resolveColor(this, R.attr.default_bar_color)); + setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.default_album_art), ATHUtil.resolveColor(this, R.attr.default_bar_color)); deleteAlbumArt = true; dataChanged(); } @@ -223,9 +224,9 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text @Override public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation glideAnimation) { - ColorUtil.getColor(resource.getPalette(), Color.TRANSPARENT); + PhonographColorUtil.getColor(resource.getPalette(), Color.TRANSPARENT); albumArtBitmap = getResizedAlbumCover(resource.getBitmap(), 2048); - setImageBitmap(albumArtBitmap, ColorUtil.getColor(resource.getPalette(), ColorUtil.resolveColor(AlbumTagEditorActivity.this, R.attr.default_bar_color))); + setImageBitmap(albumArtBitmap, PhonographColorUtil.getColor(resource.getPalette(), ATHUtil.resolveColor(AlbumTagEditorActivity.this, R.attr.default_bar_color))); deleteAlbumArt = false; dataChanged(); setResult(RESULT_OK); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java index 139261d3..2e80b6ec 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java @@ -13,9 +13,13 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import com.kabouzeid.appthemehelper.ThemeStore; +import com.kabouzeid.appthemehelper.util.ATHUtil; +import com.kabouzeid.appthemehelper.util.ColorUtil; +import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener; -import com.kabouzeid.gramophone.views.FastScroller; +import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; import butterknife.Bind; import butterknife.ButterKnife; @@ -27,6 +31,8 @@ public abstract class AbsMainActivityRecyclerViewFragment { - private static SwatchComparator sInstance; - - static SwatchComparator getInstance() { - if (sInstance == null) { - sInstance = new SwatchComparator(); - } - return sInstance; - } - - @Override - public int compare(Palette.Swatch lhs, Palette.Swatch rhs) { - return lhs.getPopulation() - rhs.getPopulation(); - } - } - - @ColorInt - public static int resolveColor(@NonNull Context context, @AttrRes int colorAttr) { - TypedArray a = context.obtainStyledAttributes(new int[]{colorAttr}); - int resId = a.getColor(0, 0); - a.recycle(); - return resId; - } - - @ColorInt - public static int getOpaqueColor(@ColorInt int color) { - return color | 0xFF000000; - } - - @ColorInt - public static int getColorWithAlpha(float alpha, @ColorInt int baseColor) { - int a = Math.min(255, Math.max(0, (int) (alpha * 255))) << 24; - int rgb = 0x00ffffff & baseColor; - return a + rgb; - } - - @ColorInt - public static int shiftColor(@ColorInt int color, @FloatRange(from = 0.0f, to = 2.0f) float by) { - if (by == 1f) return color; - int alpha = Color.alpha(color); - float[] hsv = new float[3]; - Color.colorToHSV(color, hsv); - hsv[2] *= by; // value component - // don't use getColorWithAlpha(float alpha, int baseColor) here - return (alpha << 24) + (0x00ffffff & Color.HSVToColor(hsv)); - } - - @SuppressWarnings("ResourceType") - @ColorInt - public static int shiftColorDown(@ColorInt int color) { - return shiftColor(color, 0.9f); - } - - @SuppressWarnings("ResourceType") - @ColorInt - public static int shiftColorUp(@ColorInt int color) { - return shiftColor(color, 1.1f); - } - - @ColorInt - public static int getPrimaryTextColor(final Context context, boolean dark) { - return dark ? ContextCompat.getColor(context, R.color.primary_text_default_material_light) : ContextCompat.getColor(context, R.color.primary_text_default_material_dark); - } - - @ColorInt - public static int getSecondaryTextColor(final Context context, boolean dark) { - return dark ? ContextCompat.getColor(context, R.color.secondary_text_default_material_light) : ContextCompat.getColor(context, R.color.secondary_text_default_material_dark); - } - - @ColorInt - public static int getPrimaryDisabledTextColor(final Context context, boolean dark) { - return dark ? ContextCompat.getColor(context, R.color.primary_text_disabled_material_light) : ContextCompat.getColor(context, R.color.primary_text_disabled_material_dark); - } - - @ColorInt - public static int getSecondaryDisabledTextColor(final Context context, boolean dark) { - return dark ? ContextCompat.getColor(context, R.color.secondary_text_disabled_material_light) : ContextCompat.getColor(context, R.color.secondary_text_disabled_material_dark); - } - - public static float getLuminance(@ColorInt int color) { - return (Color.red(color) * 0.299f + Color.green(color) * 0.587f + Color.blue(color) * 0.114f); - } - - public static boolean useDarkTextColorOnBackground(@ColorInt int backgroundColor) { - return getLuminance(backgroundColor) > (255f / 1.5f); - } - - @ColorInt - public static int getPrimaryTextColorForBackground(final Context context, @ColorInt int backgroundColor) { - return getPrimaryTextColor(context, useDarkTextColorOnBackground(backgroundColor)); - } - - @ColorInt - public static int getSecondaryTextColorForBackground(final Context context, @ColorInt int backgroundColor) { - return getSecondaryTextColor(context, useDarkTextColorOnBackground(backgroundColor)); - } - - @ColorInt - public static int getPrimaryDisabledTextColorForBackground(final Context context, @ColorInt int backgroundColor) { - return getPrimaryDisabledTextColor(context, useDarkTextColorOnBackground(backgroundColor)); - } - - @ColorInt - public static int getSecondaryDisabledTextColorForBackground(final Context context, @ColorInt int backgroundColor) { - return getSecondaryDisabledTextColor(context, useDarkTextColorOnBackground(backgroundColor)); - } - - @ColorInt - public static int shiftBackgroundColorForLightText(@ColorInt int backgroundColor) { - while (ColorUtil.useDarkTextColorOnBackground(backgroundColor)) { - backgroundColor = ColorUtil.shiftColorDown(backgroundColor); - } - return backgroundColor; - } - - @ColorInt - public static int shiftBackgroundColorForDarkText(@ColorInt int backgroundColor) { - while (!ColorUtil.useDarkTextColorOnBackground(backgroundColor)) { - backgroundColor = ColorUtil.shiftColorUp(backgroundColor); - } - return backgroundColor; - } - - public static int[] rgb2lab(int R, int G, int B) { - //http://www.brucelindbloom.com - - float r, g, b, X, Y, Z, fx, fy, fz, xr, yr, zr; - float Ls, as, bs; - float eps = 216.f / 24389.f; - float k = 24389.f / 27.f; - - float Xr = 0.964221f; // reference white D50 - float Yr = 1.0f; - float Zr = 0.825211f; - - // RGB to XYZ - r = R / 255.f; //R 0..1 - g = G / 255.f; //G 0..1 - b = B / 255.f; //B 0..1 - - // assuming sRGB (D65) - if (r <= 0.04045) - r = r / 12; - else - r = (float) Math.pow((r + 0.055) / 1.055, 2.4); - - if (g <= 0.04045) - g = g / 12; - else - g = (float) Math.pow((g + 0.055) / 1.055, 2.4); - - if (b <= 0.04045) - b = b / 12; - else - b = (float) Math.pow((b + 0.055) / 1.055, 2.4); - - - X = 0.436052025f * r + 0.385081593f * g + 0.143087414f * b; - Y = 0.222491598f * r + 0.71688606f * g + 0.060621486f * b; - Z = 0.013929122f * r + 0.097097002f * g + 0.71418547f * b; - - // XYZ to Lab - xr = X / Xr; - yr = Y / Yr; - zr = Z / Zr; - - if (xr > eps) - fx = (float) Math.pow(xr, 1 / 3.); - else - fx = (float) ((k * xr + 16.) / 116.); - - if (yr > eps) - fy = (float) Math.pow(yr, 1 / 3.); - else - fy = (float) ((k * yr + 16.) / 116.); - - if (zr > eps) - fz = (float) Math.pow(zr, 1 / 3.); - else - fz = (float) ((k * zr + 16.) / 116); - - Ls = (116 * fy) - 16; - as = 500 * (fx - fy); - bs = 200 * (fy - fz); - - int[] lab = new int[3]; - lab[0] = (int) (2.55 * Ls + .5); - lab[1] = (int) (as + .5); - lab[2] = (int) (bs + .5); - return lab; - } - - /** - * Computes the difference between two RGB colors by converting them to the L*a*b scale and - * comparing them using the CIE76 algorithm { http://en.wikipedia.org/wiki/Color_difference#CIE76} - * - * @return > 23 corresponds to a JND (just noticeable difference) - */ - public static double getColorDifference(int a, int b) { - int r1, g1, b1, r2, g2, b2; - r1 = Color.red(a); - g1 = Color.green(a); - b1 = Color.blue(a); - r2 = Color.red(b); - g2 = Color.green(b); - b2 = Color.blue(b); - int[] lab1 = rgb2lab(r1, g1, b1); - int[] lab2 = rgb2lab(r2, g2, b2); - return Math.sqrt(Math.pow(lab2[0] - lab1[0], 2) + Math.pow(lab2[1] - lab1[1], 2) + Math.pow(lab2[2] - lab1[2], 2)); - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java index 6cc4ef96..744cc915 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java @@ -8,6 +8,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.util.Pair; +import android.view.View; import android.widget.Toast; import com.kabouzeid.gramophone.R; @@ -17,44 +18,68 @@ import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.ui.activities.AlbumDetailActivity; import com.kabouzeid.gramophone.ui.activities.ArtistDetailActivity; import com.kabouzeid.gramophone.ui.activities.PlaylistDetailActivity; +import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; /** * @author Karim Abou Zeid (kabouzeid) */ public class NavigationUtil { - public static void goToArtist(@NonNull final Activity activity, final int artistId, @Nullable final Pair... sharedElements) { - if (activity instanceof ArtistDetailActivity) return; + public static void goToArtist(@NonNull final Activity activity, final int artistId, @Nullable Pair... sharedElements) { if (!disableViewsAndCheckIsReadyForTransition(activity)) return; final Intent intent = new Intent(activity, ArtistDetailActivity.class); intent.putExtra(ArtistDetailActivity.EXTRA_ARTIST_ID, artistId); + sharedElements = addMiniPlayerSharedElement(activity, sharedElements); + //noinspection unchecked activity.startActivity(intent, ActivityOptionsCompat.makeSceneTransitionAnimation(activity, sharedElements).toBundle()); } - public static void goToAlbum(@NonNull final Activity activity, final int albumId, @Nullable final Pair... sharedElements) { - if (activity instanceof AlbumDetailActivity) return; + public static void goToAlbum(@NonNull final Activity activity, final int albumId, @Nullable Pair... sharedElements) { if (!disableViewsAndCheckIsReadyForTransition(activity)) return; final Intent intent = new Intent(activity, AlbumDetailActivity.class); intent.putExtra(AlbumDetailActivity.EXTRA_ALBUM_ID, albumId); + sharedElements = addMiniPlayerSharedElement(activity, sharedElements); + //noinspection unchecked activity.startActivity(intent, ActivityOptionsCompat.makeSceneTransitionAnimation(activity, sharedElements).toBundle()); } - public static void goToPlaylist(@NonNull final Activity activity, final Playlist playlist, @Nullable final Pair... sharedElements) { + public static void goToPlaylist(@NonNull final Activity activity, final Playlist playlist, @Nullable Pair... sharedElements) { if (!disableViewsAndCheckIsReadyForTransition(activity)) return; final Intent intent = new Intent(activity, PlaylistDetailActivity.class); intent.putExtra(PlaylistDetailActivity.EXTRA_PLAYLIST, playlist); + sharedElements = addMiniPlayerSharedElement(activity, sharedElements); + //noinspection unchecked activity.startActivity(intent, ActivityOptionsCompat.makeSceneTransitionAnimation(activity, sharedElements).toBundle()); } + private static Pair[] addMiniPlayerSharedElement(Activity activity, @Nullable Pair... sharedElements) { + if (activity instanceof AbsSlidingMusicPanelActivity) { + View miniPlayer = ((AbsSlidingMusicPanelActivity) activity).getMiniPlayerFragment().getView(); + Pair miniPlayerSharedElement = Pair.create(miniPlayer, activity.getString(R.string.transition_mini_player)); + + if (sharedElements != null) { + Pair[] tmpSharedElements; + tmpSharedElements = new Pair[sharedElements.length + 1]; + System.arraycopy(sharedElements, 0, tmpSharedElements, 0, sharedElements.length); + sharedElements = tmpSharedElements; + + sharedElements[sharedElements.length - 1] = miniPlayerSharedElement; + } else { + sharedElements = new Pair[]{miniPlayerSharedElement}; + } + } + return sharedElements; + } + private static boolean disableViewsAndCheckIsReadyForTransition(@NonNull final Activity activity) { if (activity instanceof KabViewsDisableAble) { if (((KabViewsDisableAble) activity).areViewsEnabled()) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/PhonographColorUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/PhonographColorUtil.java new file mode 100644 index 00000000..7c6ca979 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/util/PhonographColorUtil.java @@ -0,0 +1,80 @@ +package com.kabouzeid.gramophone.util; + +import android.graphics.Bitmap; +import android.support.annotation.ColorInt; +import android.support.annotation.Nullable; +import android.support.v7.graphics.Palette; + +import com.kabouzeid.appthemehelper.util.ColorUtil; + +import java.util.Collections; +import java.util.Comparator; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public class PhonographColorUtil { + public static final int PALETTE_BITMAP_SIZE = 10; + + @Nullable + public static Palette generatePalette(Bitmap bitmap) { + if (bitmap == null) return null; + return Palette.from(bitmap) + .resizeBitmapSize(PALETTE_BITMAP_SIZE) + .generate(); + } + + @ColorInt + public static int getColor(@Nullable Palette palette, int fallback) { + if (palette != null) { + if (palette.getVibrantSwatch() != null) { + return palette.getVibrantSwatch().getRgb(); + } else if (palette.getMutedSwatch() != null) { + return palette.getMutedSwatch().getRgb(); + } else if (palette.getDarkVibrantSwatch() != null) { + return palette.getDarkVibrantSwatch().getRgb(); + } else if (palette.getDarkMutedSwatch() != null) { + return palette.getDarkMutedSwatch().getRgb(); + } else if (palette.getLightVibrantSwatch() != null) { + return palette.getLightVibrantSwatch().getRgb(); + } else if (palette.getLightMutedSwatch() != null) { + return palette.getLightMutedSwatch().getRgb(); + } else if (palette.getSwatches() != null && !palette.getSwatches().isEmpty()) { + return Collections.max(palette.getSwatches(), SwatchComparator.getInstance()).getRgb(); + } + } + return fallback; + } + + private static class SwatchComparator implements Comparator { + private static SwatchComparator sInstance; + + static SwatchComparator getInstance() { + if (sInstance == null) { + sInstance = new SwatchComparator(); + } + return sInstance; + } + + @Override + public int compare(Palette.Swatch lhs, Palette.Swatch rhs) { + return lhs.getPopulation() - rhs.getPopulation(); + } + } + + @ColorInt + public static int shiftBackgroundColorForLightText(@ColorInt int backgroundColor) { + while (ColorUtil.isColorLight(backgroundColor)) { + backgroundColor = ColorUtil.darkenColor(backgroundColor); + } + return backgroundColor; + } + + @ColorInt + public static int shiftBackgroundColorForDarkText(@ColorInt int backgroundColor) { + while (!ColorUtil.isColorLight(backgroundColor)) { + backgroundColor = ColorUtil.lightenColor(backgroundColor); + } + return backgroundColor; + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/Util.java b/app/src/main/java/com/kabouzeid/gramophone/util/Util.java index b08c61b0..91f94957 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/Util.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/Util.java @@ -48,11 +48,6 @@ public class Util { return size; } - public static int getSmallerScreenSize(@NonNull Context c) { - Point size = Util.getScreenSize(c); - return Math.min(size.x, size.y); - } - @TargetApi(19) public static void setStatusBarTranslucent(@NonNull Window window) { window.setFlags( diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java index 6f4beb4d..11f87b77 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java @@ -3,42 +3,19 @@ package com.kabouzeid.gramophone.util; import android.animation.Animator; import android.animation.ArgbEvaluator; import android.animation.ObjectAnimator; -import android.content.Context; -import android.graphics.PorterDuff; -import android.graphics.drawable.Drawable; import android.os.Build; -import android.support.annotation.ColorInt; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.support.v4.view.ViewCompat; -import android.support.v7.view.menu.ListMenuItemView; -import android.support.v7.view.menu.MenuPopupHelper; -import android.support.v7.widget.ActionMenuView; -import android.support.v7.widget.Toolbar; -import android.util.Log; -import android.view.Menu; -import android.view.MenuItem; import android.view.View; -import android.view.ViewTreeObserver; import android.view.animation.PathInterpolator; -import android.widget.CheckBox; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.RadioButton; import android.widget.TextView; -import com.afollestad.materialdialogs.internal.MDTintHelper; -import com.afollestad.materialdialogs.internal.ThemeSingleton; -import com.kabouzeid.gramophone.R; - -import java.lang.reflect.Field; -import java.util.ArrayList; - /** * @author Karim Abou Zeid (kabouzeid) */ public class ViewUtil { + public final static int PHONOGRAPH_ANIM_TIME = 1000; + public static Animator createBackgroundColorTransition(final View v, final int startColor, final int endColor) { return createColorAnimator(v, "backgroundColor", startColor, endColor); } @@ -47,8 +24,6 @@ public class ViewUtil { return createColorAnimator(v, "textColor", startColor, endColor); } - public final static int PHONOGRAPH_ANIM_TIME = 1000; - private static Animator createColorAnimator(Object target, String propertyName, int startColor, int endColor) { ObjectAnimator animator; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { @@ -65,149 +40,6 @@ public class ViewUtil { return animator; } - /** - * Should be called in {@link android.app.Activity#onPrepareOptionsMenu(Menu)} and {@link android.app.Activity#onOptionsItemSelected(MenuItem)} - * - * @param toolbar the toolbar to apply the tint on - */ - public static void invalidateToolbarPopupMenuTint(@Nullable final Toolbar toolbar) { - if (toolbar == null) return; - toolbar.post(new Runnable() { - @Override - public void run() { - try { - Field f1 = Toolbar.class.getDeclaredField("mMenuView"); - f1.setAccessible(true); - ActionMenuView actionMenuView = (ActionMenuView) f1.get(toolbar); - - Field f2 = ActionMenuView.class.getDeclaredField("mPresenter"); - f2.setAccessible(true); - Object presenter = f2.get(actionMenuView); // ActionMenuPresenter is not a public class, so we use Object here - - Field f3 = presenter.getClass().getDeclaredField("mOverflowPopup"); - f3.setAccessible(true); - MenuPopupHelper overflowMenuPopupHelper = (MenuPopupHelper) f3.get(presenter); - ViewUtil.setTintForMenuPopupHelper(overflowMenuPopupHelper); - - Field f4 = presenter.getClass().getDeclaredField("mActionButtonPopup"); - f4.setAccessible(true); - MenuPopupHelper subMenuPopupHelper = (MenuPopupHelper) f4.get(presenter); - ViewUtil.setTintForMenuPopupHelper(subMenuPopupHelper); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - } - - public static void setTintForMenuPopupHelper(@Nullable MenuPopupHelper menuPopupHelper) { - if (menuPopupHelper == null) return; - final ListView listView = menuPopupHelper.getPopup().getListView(); - listView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - try { - Field checkboxField = ListMenuItemView.class.getDeclaredField("mCheckBox"); - checkboxField.setAccessible(true); - Field radioButtonField = ListMenuItemView.class.getDeclaredField("mRadioButton"); - radioButtonField.setAccessible(true); - - for (int i = 0; i < listView.getChildCount(); i++) { - View v = listView.getChildAt(i); - if (!(v instanceof ListMenuItemView)) continue; - ListMenuItemView iv = (ListMenuItemView) v; - - CheckBox check = (CheckBox) checkboxField.get(iv); - if (check != null) { - MDTintHelper.setTint(check, ThemeSingleton.get().positiveColor.getDefaultColor()); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - check.setBackground(null); - } - } - - RadioButton radioButton = (RadioButton) radioButtonField.get(iv); - if (radioButton != null) { - MDTintHelper.setTint(radioButton, ThemeSingleton.get().positiveColor.getDefaultColor()); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - radioButton.setBackground(null); - } - } - } - } catch (Throwable e) { - e.printStackTrace(); - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - listView.getViewTreeObserver().removeOnGlobalLayoutListener(this); - } else { - //noinspection deprecation - listView.getViewTreeObserver().removeGlobalOnLayoutListener(this); - } - } - }); - } - - /** - * Call this in {@link android.app.Activity#onCreateOptionsMenu(Menu)} and everywhere where the toolbar color is changed. - */ - public static void setToolbarContentColorForBackground(@NonNull Context context, @Nullable Toolbar toolbar, @ColorInt final int backgroundColor) { - ViewUtil.setToolbarContentDark(context, toolbar, ColorUtil.useDarkTextColorOnBackground(backgroundColor)); - } - - public static void setToolbarContentDark(@NonNull Context context, @Nullable Toolbar toolbar, boolean dark) { - if (toolbar == null) return; - - toolbar.setTitleTextColor(ColorUtil.getPrimaryTextColor(context, dark)); - toolbar.setSubtitleTextColor(ColorUtil.getSecondaryTextColor(context, dark)); - - setToolbarIconColor(context, toolbar, getToolbarIconColor(context, dark)); - } - - @ColorInt - public static int getToolbarIconColor(Context context, boolean dark) { - if (dark) { - return ColorUtil.getSecondaryTextColor(context, true); - } else { - return ColorUtil.getPrimaryTextColor(context, false); - } - } - - private static void setToolbarIconColor(@NonNull final Context context, @Nullable final Toolbar toolbar, @ColorInt final int color) { - if (toolbar == null) return; - toolbar.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - toolbar.getViewTreeObserver().removeOnGlobalLayoutListener(this); - - final ArrayList outViews = new ArrayList<>(); - final String overflowDescription = context.getString(R.string.abc_action_menu_overflow_description); - toolbar.findViewsWithText(outViews, overflowDescription, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION); - if (!outViews.isEmpty()) { - try { - ImageView overflowButton = (ImageView) outViews.get(0); - overflowButton.setColorFilter(color, PorterDuff.Mode.SRC_IN); - } catch (ClassCastException e) { - Log.e("setToolbarIconColor", "overflow button is not an ImageView", e); - } - } - - Menu menu = toolbar.getMenu(); - for (int i = 0; i < menu.size(); i++) { - MenuItem item = menu.getItem(i); - if (item.getIcon() != null) { - item.getIcon().mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN); - } - } - - Drawable navigationIcon = toolbar.getNavigationIcon(); - if (navigationIcon != null) { - navigationIcon = navigationIcon.mutate(); - navigationIcon.setColorFilter(color, PorterDuff.Mode.SRC_IN); - toolbar.setNavigationIcon(navigationIcon); - } - } - }); - } - public static boolean hitTest(View v, int x, int y) { final int tx = (int) (ViewCompat.getTranslationX(v) + 0.5f); final int ty = (int) (ViewCompat.getTranslationY(v) + 0.5f); diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/ColorView.java b/app/src/main/java/com/kabouzeid/gramophone/views/ColorView.java deleted file mode 100644 index 2d93379f..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/views/ColorView.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.kabouzeid.gramophone.views; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.support.annotation.NonNull; -import android.util.AttributeSet; -import android.widget.FrameLayout; - -import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.util.ColorUtil; - -public class ColorView extends FrameLayout { - - private final Paint paint; - private final Paint paintBorder; - private final int borderWidth; - - public ColorView(@NonNull Context context) { - this(context, null, 0); - } - - public ColorView(@NonNull Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public ColorView(@NonNull Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - borderWidth = getResources().getDimensionPixelSize(R.dimen.color_view_border); - - paint = new Paint(); - paint.setAntiAlias(true); - - paintBorder = new Paint(); - paintBorder.setAntiAlias(true); - - setWillNotDraw(false); - } - - public void setColor(int color) { - paint.setColor(color); - paintBorder.setColor(ColorUtil.shiftColorDown(color)); - requestLayout(); - invalidate(); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int widthMode = MeasureSpec.getMode(widthMeasureSpec); - int heightMode = MeasureSpec.getMode(heightMeasureSpec); - if (widthMode == MeasureSpec.EXACTLY && heightMode != MeasureSpec.EXACTLY) { - int width = MeasureSpec.getSize(widthMeasureSpec); - //noinspection SuspiciousNameCombination - int height = width; - if (heightMode == MeasureSpec.AT_MOST) { - height = Math.min(height, MeasureSpec.getSize(heightMeasureSpec)); - } - setMeasuredDimension(width, height); - } else { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } - } - - @Override - protected void onDraw(@NonNull Canvas canvas) { - super.onDraw(canvas); - - int canvasSize = canvas.getWidth(); - if (canvas.getHeight() < canvasSize) - canvasSize = canvas.getHeight(); - - int circleCenter = (canvasSize - (borderWidth * 2)) / 2; - canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2)) / 2) + borderWidth - 4.0f, paintBorder); - canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2)) / 2) - 4.0f, paint); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/DynamicCheckBox.java b/app/src/main/java/com/kabouzeid/gramophone/views/DynamicCheckBox.java deleted file mode 100644 index 7a5ff47b..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/views/DynamicCheckBox.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.kabouzeid.gramophone.views; - -import android.content.Context; -import android.support.v7.widget.AppCompatCheckBox; -import android.util.AttributeSet; - -import com.afollestad.materialdialogs.internal.MDTintHelper; -import com.afollestad.materialdialogs.internal.ThemeSingleton; - -/** - * @author Aidan Follestad (afollestad) - */ -public class DynamicCheckBox extends AppCompatCheckBox { - - public DynamicCheckBox(Context context) { - super(context); - init(); - } - - public DynamicCheckBox(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } - - public DynamicCheckBox(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(); - } - - private void init() { - final int color = ThemeSingleton.get().positiveColor.getDefaultColor(); - MDTintHelper.setTint(this, color); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/DynamicEditText.java b/app/src/main/java/com/kabouzeid/gramophone/views/DynamicEditText.java deleted file mode 100644 index 70d927cd..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/views/DynamicEditText.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.kabouzeid.gramophone.views; - -import android.content.Context; -import android.support.v7.widget.AppCompatEditText; -import android.util.AttributeSet; - -import com.afollestad.materialdialogs.internal.MDTintHelper; -import com.afollestad.materialdialogs.internal.ThemeSingleton; - -/** - * @author Aidan Follestad (afollestad) - */ -public class DynamicEditText extends AppCompatEditText { - - public DynamicEditText(Context context) { - super(context); - init(); - } - - public DynamicEditText(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } - - public DynamicEditText(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(); - } - - private void init() { - final int color = ThemeSingleton.get().positiveColor.getDefaultColor(); - MDTintHelper.setTint(this, color); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/FastScroller.java b/app/src/main/java/com/kabouzeid/gramophone/views/FastScroller.java deleted file mode 100644 index 993223dc..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/views/FastScroller.java +++ /dev/null @@ -1,212 +0,0 @@ -package com.kabouzeid.gramophone.views; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.content.Context; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.InsetDrawable; -import android.graphics.drawable.StateListDrawable; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v7.widget.RecyclerView; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewPropertyAnimator; -import android.widget.FrameLayout; - -import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.util.ColorUtil; -import com.kabouzeid.gramophone.util.Util; - -import static android.support.v7.widget.RecyclerView.OnScrollListener; - -public class FastScroller extends FrameLayout { - private static final int HANDLE_HIDE_DELAY = 1500; - private static final int HANDLE_ANIMATION_DURATION = 300; - - private View handle; - private View bar; - - private RecyclerView recyclerView; - - private final HandleHider handleHider = new HandleHider(); - private final ScrollListener scrollListener = new ScrollListener(); - - private boolean isHidden; - private int hideTranslationX; - - @Nullable - private ViewPropertyAnimator currentAnimator = null; - - public FastScroller(@NonNull Context context, AttributeSet attrs) { - super(context, attrs); - initialise(context); - } - - public FastScroller(@NonNull Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - initialise(context); - } - - private void initialise(@NonNull Context context) { - hideTranslationX = getContext().getResources().getDimensionPixelSize(R.dimen.scrollbar_width) * (Util.isRTL(context) ? -1 : 1); - setClipChildren(false); - inflate(context, R.layout.vertical_recycler_fast_scroller_layout, this); - handle = findViewById(R.id.scroll_handle); - bar = findViewById(R.id.scroll_bar); - handle.setEnabled(true); - setPressedHandleColor(ColorUtil.resolveColor(getContext(), R.attr.colorControlActivated)); - setUpBarBackground(); - postDelayed(handleHider, HANDLE_HIDE_DELAY); - } - - @Override - public boolean onTouchEvent(@NonNull MotionEvent event) { - if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) { - handle.setPressed(true); - setRecyclerViewPosition(event.getY()); - showIfHidden(); - return true; - } else if (event.getAction() == MotionEvent.ACTION_UP) { - handle.setPressed(false); - scheduleHide(); - return true; - } - return super.onTouchEvent(event); - } - - public void setRecyclerView(@NonNull RecyclerView recyclerView) { - this.recyclerView = recyclerView; - recyclerView.addOnScrollListener(scrollListener); - } - - private void setRecyclerViewPosition(float y) { - if (recyclerView != null) { - int itemCount = recyclerView.getAdapter().getItemCount(); - float proportion = y / (float) getHeightMinusPadding(); - int targetPos = getValueInRange(0, itemCount - 1, Math.round(proportion * (float) itemCount)); - recyclerView.scrollToPosition(targetPos); - } - } - - private int getValueInRange(int min, int max, int value) { - int minimum = Math.max(min, value); - return Math.min(minimum, max); - } - - private void setHandlePosition(float y) { - float position = y / getHeightMinusPadding(); - int handleHeight = handle.getHeight(); - handle.setY(getValueInRange(0, getHeightMinusPadding() - handleHeight, Math.round((getHeightMinusPadding() - handleHeight) * position))); - } - - private void showImpl() { - isHidden = false; - if (currentAnimator != null) { - currentAnimator.cancel(); - } - currentAnimator = animate().translationX(0).setDuration(HANDLE_ANIMATION_DURATION); - currentAnimator.start(); - } - - private void hideImpl() { - isHidden = true; - if (currentAnimator != null) { - currentAnimator.cancel(); - } - currentAnimator = animate().translationX(hideTranslationX).setDuration(HANDLE_ANIMATION_DURATION); - currentAnimator.setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); - currentAnimator = null; - } - - @Override - public void onAnimationCancel(Animator animation) { - super.onAnimationCancel(animation); - currentAnimator = null; - } - }); - currentAnimator.start(); - } - - private class HandleHider implements Runnable { - @Override - public void run() { - hideImpl(); - } - } - - private void showIfHidden() { - if (isHidden) { - getHandler().removeCallbacks(handleHider); - showImpl(); - } - } - - private void scheduleHide() { - getHandler().removeCallbacks(handleHider); - getHandler().postDelayed(handleHider, HANDLE_HIDE_DELAY); - } - - private int getHeightMinusPadding() { - return getHeight() - getPaddingBottom() - getPaddingTop(); - } - - private float computeHandlePosition() { - View firstVisibleView = recyclerView.getChildAt(0); - int firstVisiblePosition = recyclerView.getChildAdapterPosition(firstVisibleView); - int itemCount = recyclerView.getAdapter().getItemCount(); - - float proportion = (float) firstVisiblePosition / (float) itemCount; - return getHeightMinusPadding() * proportion + recyclerView.getChildCount() * proportion; - } - - public void updateHandlePosition() { - setHandlePosition(computeHandlePosition()); - } - - public void setPressedHandleColor(int accent) { - StateListDrawable drawable = new StateListDrawable(); - - int colorControlNormal = ColorUtil.resolveColor(getContext(), R.attr.colorControlNormal); - - if (!Util.isRTL(getContext())) { - drawable.addState(View.PRESSED_ENABLED_STATE_SET, - new InsetDrawable(new ColorDrawable(accent), getResources().getDimensionPixelSize(R.dimen.scrollbar_inset), 0, 0, 0)); - drawable.addState(View.EMPTY_STATE_SET, - new InsetDrawable(new ColorDrawable(colorControlNormal), getResources().getDimensionPixelSize(R.dimen.scrollbar_inset), 0, 0, 0)); - } else { - drawable.addState(View.PRESSED_ENABLED_STATE_SET, - new InsetDrawable(new ColorDrawable(accent), 0, 0, getResources().getDimensionPixelSize(R.dimen.scrollbar_inset), 0)); - drawable.addState(View.EMPTY_STATE_SET, - new InsetDrawable(new ColorDrawable(colorControlNormal), 0, 0, getResources().getDimensionPixelSize(R.dimen.scrollbar_inset), 0)); - } - handle.setBackground(drawable); - } - - private void setUpBarBackground() { - Drawable drawable; - - int colorControlNormal = ColorUtil.resolveColor(getContext(), R.attr.colorControlNormal); - - if (!Util.isRTL(getContext())) { - drawable = new InsetDrawable(new ColorDrawable(colorControlNormal), getResources().getDimensionPixelSize(R.dimen.scrollbar_inset), 0, 0, 0); - } else { - drawable = new InsetDrawable(new ColorDrawable(colorControlNormal), 0, 0, getResources().getDimensionPixelSize(R.dimen.scrollbar_inset), 0); - } - bar.setBackground(drawable); - } - - private class ScrollListener extends OnScrollListener { - @Override - public void onScrolled(RecyclerView rv, int dx, int dy) { - updateHandlePosition(); - showIfHidden(); - scheduleHide(); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/SelectableColorView.java b/app/src/main/java/com/kabouzeid/gramophone/views/SelectableColorView.java deleted file mode 100644 index adefd514..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/views/SelectableColorView.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.kabouzeid.gramophone.views; - -import android.content.Context; -import android.content.res.ColorStateList; -import android.content.res.Resources; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.RippleDrawable; -import android.graphics.drawable.ShapeDrawable; -import android.graphics.drawable.StateListDrawable; -import android.graphics.drawable.shapes.OvalShape; -import android.os.Build; -import android.support.annotation.ColorInt; -import android.util.AttributeSet; -import android.util.TypedValue; -import android.widget.FrameLayout; - -import com.afollestad.materialdialogs.internal.ThemeSingleton; -import com.kabouzeid.gramophone.util.ColorUtil; - - -public class SelectableColorView extends FrameLayout { - - private boolean selected; - - private final int borderWidthExtraSmall; - private final int borderWidthSmall; - private final int borderWidthLarge; - - private Paint outerPaint; - private Paint gapPaint; - private Paint innerPaint; - - public SelectableColorView(Context context) { - this(context, null, 0); - } - - public SelectableColorView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public SelectableColorView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - final Resources r = getResources(); - borderWidthExtraSmall = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, r.getDisplayMetrics()); - borderWidthSmall = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, r.getDisplayMetrics()); - borderWidthLarge = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, r.getDisplayMetrics()); - - gapPaint = new Paint(); - gapPaint.setAntiAlias(true); - gapPaint.setColor(ThemeSingleton.get().darkTheme ? Color.parseColor("#444444") : Color.WHITE); - - innerPaint = new Paint(); - innerPaint.setAntiAlias(true); - - outerPaint = new Paint(); - outerPaint.setAntiAlias(true); - - setWillNotDraw(false); - } - - private void updateColor(@ColorInt int color) { - innerPaint.setColor(color); - outerPaint.setColor(ColorUtil.shiftColorDown(color)); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - int[][] states = new int[][]{ - new int[]{android.R.attr.state_pressed} - }; - int[] colors = new int[]{createSelectedColor(color)}; - ColorStateList rippleColors = new ColorStateList(states, colors); - Drawable mask = new ShapeDrawable(new OvalShape()); - RippleDrawable rippleDrawable = new RippleDrawable(rippleColors, null, mask); - - setForeground(rippleDrawable); - } else { - ShapeDrawable pressedDrawable = new ShapeDrawable(new OvalShape()); - pressedDrawable.getPaint().setColor(createSelectedColor(color)); - StateListDrawable stateListDrawable = new StateListDrawable(); - stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, pressedDrawable); - - setForeground(stateListDrawable); - } - } - - @ColorInt - private static int createSelectedColor(int color) { - if (ColorUtil.useDarkTextColorOnBackground(color)) { - return ColorUtil.shiftColor(color, 0.8f); - } else { - return ColorUtil.shiftColor(color, 1.2f); - } - } - - public void setColor(@ColorInt int color) { - updateColor(color); - requestLayout(); - invalidate(); - } - - @Override - public void setSelected(boolean selected) { - this.selected = selected; - requestLayout(); - invalidate(); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int widthMode = MeasureSpec.getMode(widthMeasureSpec); - int heightMode = MeasureSpec.getMode(heightMeasureSpec); - if (widthMode == MeasureSpec.EXACTLY && heightMode != MeasureSpec.EXACTLY) { - int width = MeasureSpec.getSize(widthMeasureSpec); - //noinspection SuspiciousNameCombination - int height = width; - if (heightMode == MeasureSpec.AT_MOST) - height = Math.min(height, MeasureSpec.getSize(heightMeasureSpec)); - setMeasuredDimension(width, height); - } else { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - final int outerRadius = getMeasuredWidth() / 2; - if (selected) { - final int whiteRadius = outerRadius - borderWidthLarge; - final int innerRadius = whiteRadius - borderWidthSmall; - canvas.drawCircle(getMeasuredWidth() / 2, - getMeasuredHeight() / 2, - outerRadius, - outerPaint); - canvas.drawCircle(getMeasuredWidth() / 2, - getMeasuredHeight() / 2, - whiteRadius, - gapPaint); - canvas.drawCircle(getMeasuredWidth() / 2, - getMeasuredHeight() / 2, - innerRadius, - innerPaint); - } else { - final int innerRadius = outerRadius - borderWidthExtraSmall; - canvas.drawCircle(getMeasuredWidth() / 2, - getMeasuredHeight() / 2, - outerRadius, - outerPaint); - canvas.drawCircle(getMeasuredWidth() / 2, - getMeasuredHeight() / 2, - innerRadius, - innerPaint); - } - } -} diff --git a/app/src/main/res/drawable-nodpi/black.xml b/app/src/main/res/drawable-nodpi/black.xml deleted file mode 100644 index d078e48b..00000000 --- a/app/src/main/res/drawable-nodpi/black.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_content.xml b/app/src/main/res/layout/activity_main_content.xml index 4a80c27d..d69455fb 100644 --- a/app/src/main/res/layout/activity_main_content.xml +++ b/app/src/main/res/layout/activity_main_content.xml @@ -50,10 +50,7 @@ android:layout_width="match_parent" android:layout_height="@dimen/tab_height" app:tabContentStart="72dp" - app:tabIndicatorColor="@color/primary_text_default_material_dark" - app:tabMode="scrollable" - app:tabSelectedTextColor="@color/primary_text_default_material_dark" - app:tabTextColor="@color/secondary_text_default_material_dark" /> + app:tabMode="scrollable" /> diff --git a/app/src/main/res/layout/activity_playlist_detail.xml b/app/src/main/res/layout/activity_playlist_detail.xml index d94b68c7..cf474a15 100644 --- a/app/src/main/res/layout/activity_playlist_detail.xml +++ b/app/src/main/res/layout/activity_playlist_detail.xml @@ -1,7 +1,9 @@ + android:layout_height="match_parent" + android:transitionGroup="true" + tools:ignore="UnusedAttribute"> + android:focusable="false" + android:transitionName="@string/transition_mini_player" + tools:ignore="UnusedAttribute"> - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/preference_color_widget.xml b/app/src/main/res/layout/preference_color_widget.xml deleted file mode 100644 index 9a9ca8b7..00000000 --- a/app/src/main/res/layout/preference_color_widget.xml +++ /dev/null @@ -1,7 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/layout/preference_custom.xml b/app/src/main/res/layout/preference_custom.xml deleted file mode 100644 index 80fbffce..00000000 --- a/app/src/main/res/layout/preference_custom.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/preference_dynamic_checkbox.xml b/app/src/main/res/layout/preference_dynamic_checkbox.xml deleted file mode 100644 index e6360855..00000000 --- a/app/src/main/res/layout/preference_dynamic_checkbox.xml +++ /dev/null @@ -1,8 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/layout/vertical_recycler_fast_scroller_layout.xml b/app/src/main/res/layout/vertical_recycler_fast_scroller_layout.xml deleted file mode 100644 index 765bbfaa..00000000 --- a/app/src/main/res/layout/vertical_recycler_fast_scroller_layout.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 37ca797a..ee6258e6 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1,21 +1,24 @@ ماذا تريد ان تشارك؟ - تستمع حاليا الى %1$s ل %2$s + تستمع حاليا إلى %1$s ل %2$s ملف الصوت هل تريد تعيين %1$s كنغمة رنين ؟ - %1$s تم تعيين كنغمة رنين - "تم تعيين النغمة " + تعيين %1$s كنغمة رنين + تعيين كنغمة رنين مشاركة "الإعدادات" - " عن التطبيق -" + سماح + تم + تجاوز + عن التطبيق + أظهر التعريف امسح قائمة التشغيل قائمة الإنتظار - "اضافة الى الاغاني المفضلة " - "ازالة من الاغاني المفضلة " + إضافة إلى المفضلة + إزالة من المفضلة بحث - استمع لاحقاً + استمع للتالي استمع أضف إلى قائمة الإنتظار أزل من قائمة الانتظار @@ -27,7 +30,7 @@ الفنانون الأغاني قوائم التشغيل - \u0639\u0630\u0631\u0627\u064b\u060c \u062d\u0635\u0644 \u062e\u0637\u0623 \u0623\u062b\u0646\u0627\u0621 \u0645\u062d\u0627\u0648\u0644\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0623\u063a\u0646\u064a\u0629 + \u0639\u0630\u0631\u0627\u064b\u060c \u0644\u0645 \u0627\u0633\u062a\u0637\u0639 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0623\u063a\u0646\u064a\u0629 \u0639\u0630\u0631\u0627\u064b\u060c \u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0633\u064a\u0631\u0629 \u0630\u0627\u062a\u064a\u0629 \u0645\u0637\u0627\u0628\u0642\u0629 \u0644\u0647\u0630\u0627 \u0627\u0644\u0641\u0646\u0627\u0646 سيرة ذاتية لم يتم منح التطبيق إذن Audio focus @@ -37,118 +40,186 @@ فنان الألبوم السنة "المقطع " - "الموسيقى (٢ للموسيقى ٢ أو ٣٠٠٤ للموسيقى ٤)" - حقل نص اسم الألبوم أو اسم الفنان فارغ + "مقطع (2 للمقطع 2 أو 3004 لـCD3 للمقطع 4)" + حقل اسم الألبوم أو اسم الفنان فارغ تتم كتابة الملف يتم حفظ التغييرات... التفاصيل - إسم الملف + اسم الملف مسار الملف الحجم نوع الملف - الطول - معدل البت + المدة + معدل bit معدل أخذ العينات - إذهب إلى الفنان - إذهب إلى الألبوم - قائمة الإنتظار + اذهب إلى الفنان + اذهب إلى الألبوم + قائمة الانتظار حفظ كقائمة تشغيل لا توجد نتائج تحديث صورة الفنان - تحديث صورة الفنان + تم تحديث صورة الفنان \u062a\u0639\u0630\u0631 \u062a\u062d\u062f\u064a\u062b \u0635\u0648\u0631\u0629 \u0627\u0644\u0641\u0646\u0627\u0646 يتم التحديث... "تمت الإضافة إلى قائمة الانتظار" - اضف %1$d الى قائمة الانتطار + اضف %1$d إلى قائمة الانتطار حذف من قائمة التشغيل + عدد الحقول + عدد الحقول (في الوضع الأفقي) + أضيفت %1$d أغنية إلى قائمة التشغيل %2$s تم إنشاء قائمة التشغيل %1$s تم حذف قائمة التشغيل %1$s - حذف %1$d اغنية + حذف %1$d أغنية \u0644\u0627 \u064a\u0645\u0643\u0646 \u0625\u0646\u0634\u0627\u0621 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644 %1$s ؟]]> %1$s \u061f \u0647\u0630\u0627 \u0644\u0627 \u064a\u0645\u0643\u0646 \u0627\u0644\u062a\u0631\u0627\u062c\u0639 \u0639\u0646\u0647 !!]]> - %1$d؟]]> + %1$d؟]]> %1$s ؟]]> %1$d ؟]]> %1$s من قائمة التشغيل؟]]> %1$d الأغاني من قائمة التشغيل؟]]> حذف الأغنية حذف الأغاني - ازيلت الاغنية من قائمة التشغيل - ازيلت الاغناتي من قائمة التشغيل + أزيلت الاغنية من قائمة التشغيل + أزيلت الاغنيات من قائمة التشغيل إعادة تسمية قائمة التشغيل حذف قائمة التشغيل - احذف قائمة التشغيل + حذف قوائم التشغيل مسح قائمة التشغيل "إضافة إلى قائمة التشغيل" - تشغيل عشوائي - تشغيل الالبوم عشوائيا - تشغيل اغاني الفنان عشوائيا + بعثرة الكل + بعثرة الألبوم + بعثرة مقطوعات الفنان تشغيل قائمة التشغيل عشوائيا + مسح قوائم الانتظار آخر ما تم فتحه فاتح داكن + أسود (شاشات AMOLED) + دائماً + فقط عبر Wi-Fi + لا للأبد المعادل - الالوان - واجهة قائمة التشغيل + الألوان + تستمع إليه الآن المنظر العام الصوت عام + الصور قفل الشاشة شريط تنقل ملون - ضبط صفحة البدء - "صورة الالبوم في قفل الشاشة " - اشعار ملون + صفحة البدء + أظهر صورة الألبوم + حمل صور الفنانين تلقائياً + تغييم صورة الألبوم + إشعار ملون + تجاهل صور متاجر الوسائط تشغيل مختصر - اجبار صور الالبوم على ان تكون مربعة + صور ألبوم مربعة شريط الادوات معتم شريط الاشارات معتم - شريط اكبر للعنوان - بديل لشريط التحكم - اظهار شريط تحت شريط التحكم + شريط أكبر للعنوان + شريط تحكم بديل + أظهر بطاقة تحت شريط التحكم + شريط تشغيل ملون لا يوجد معدل صوت - "لا يوجد audio id, شغل شيئا وحاول مرة أخرى." + "شغل مقطعاً، ثم حاول مجدداً" حذف مسح حذف إعادة التسمية - انشاء - %1$d المحددة - إختيار - إفتراضي + إنشاء + %1$d محددة + اختيار + افتراضي اللون الأساسي اللون الثانوي - تحديد الأزرق النيلي كلون ثيم اساسي. - تحديد الوردي كلون ثانوي. + تحديد لون أساسي. الأزرق النيلي هو اللون الافتراضي. + تحديد اللون الثانوي. الوردي هو اللون الثانوي الافتراضي. تحديث الصورة قائمة التشغيل فارغة لا توجد قوائم تشغيل لا توجد ألبومات - لا اغاني - لا فنانين + لا توجد أغاني + لا يوجد فنانون فارغ اسم قائمة التشغيل الأغنية - "متوفر في نظام التشغيل Lollipop." - صورة الالبوم تظهر في شاشة القفل. قد تضطر إلى إعادة تشغيل البرنامج من أجل ان تصبح التغييرات نافذة المفعول. + "متوفر فقط في نظام التشغيل Lollipop." + تستخدم ألبوم الأغاني الحالية كخلفية لشاشة القفل + تغييم صورة الألبوم في شاشة القفل. قد تحدث مشاكل مع الواجهات المبوبة و تطبييقات الطرف الثالث "\u062a\u0644\u0648\u064a\u0646 \u0627\u0644\u0627\u0634\u0639\u0627\u0631\u0627\u062a \u0628\u0644\u0648\u0646 \u063a\u0644\u0627\u0641 \u0627\u0644\u0623\u0644\u0628\u0648\u0645." - "ازالة المقاطع التي الصامتة بين الاغنيتين. هذا يمكن ان يسبب مشاكل في التشغيل في بعض الاجهرة" - صورة الالبوم في قائمة تشغيل تكون مجبرة على شكل المربع - شريط الاشارات معتم ولا يغطي صورة الالبوم - شريط الاشارات معتم ولا يغطي صورة الالبوم - الشريط الذي يكون اسفل صورة الالبومالذي يحتوي على اسم الاغنية والفنان يصبح اكبر من حيث الارتفاع + "إزالة المقاطع التي الصامتة بين الاغنيتين. هذا يمكن ان يسبب مشاكل في التشغيل في بعض الاجهرة" + صورة الالبوم في قائمة تشغيل تجبر على أن تكون مربعة + تلون شريط الأدوات + تلون شريط الإشعارات + مربع العنوان يصبح مرتفعاً استخدام شريط التحكم الذي لايغطي صورة الالبوم بدلا من الشريط الافتراضي - اظهار شريط تحت وحدة التحكم بالتشغيل يحتوي على الازرار (تشغيل/ايقاف/التالي الخ.) - في أي مشهد يتم تلوين شريط التنقل - "\u0644\u0627 \u064a\u0645\u0643\u0646 \u062a\u062d\u0645\u064a\u0644 \u063a\u0644\u0627\u0641 \u0627\u0644\u0623\u0644\u0628\u0648\u0645 \u0645\u0637\u0627\u0628\u0642 ." - البحث في المكتبة... - إعادة تفحص الملفات... + اظهار بطاقة تحت وحدة التحكم بالتشغيل يحتوي على الازرار (تشغيل/ايقاف/التالي الخ.) + قد يرفع جودة صورة الألبوم ولكن يبطء من سرعة تحميلها. فعلها فقط إذا تواجه مشكلة في جودة صور الألبوم + \u062a\u0644\u0648\u064a\u0646 \u0623\u0632\u0631\u0627\u0631 \u0627\u0644\u062a\u0648\u062c\u064a\u0647 \u0641\u064a \u0634\u0631\u064a\u0637 \u0627\u0644\u062a\u062d\u0643\u0645 \u0628\u0644\u0648\u0646 \u0628\u0627\u0631\u0632 + تلوين شريط التنقل باللون الأساسي + "\u0644\u0627 \u064a\u0645\u0643\u0646 \u062a\u062d\u0645\u064a\u0644 \u063a\u0644\u0627\u0641 \u0623\u0644\u0628\u0648\u0645 \u0645\u0637\u0627\u0628\u0642 ." + إبحث في مكتبتك... + إعادة تفحص الوسائط... المفضلة - اخرما اضيف - افضل الاغاني - ازالة الغلاف + آخر ما تمت إضافته + السجل + أفضل الأغاني + إزالة الغلاف التنزيل من Last.fm اختيار من التخزين الداخلي البحث في الويب + مؤقت النوم + ضبط + إلغاء المؤقت الحالي + تم إلقاء مؤقت النوم + تم ضبط مؤقت النوم لـ %d دقيقة من الآن. + قائمة تشغيل جديدة ... قائمة تشغيل جديدة + هوامش ملونة + شكر خاص إلى + سجل التغييرات + الرخص + أذونات مرفوضة + تم رفض الإذن للوصول إلى الذاكرة الخارجية + الخلف + دعم التطوير + شكراً لك! + استعادة المشتريات السابقة. + توضيح سوق بلاي بواسطة + النسخة + التطبيق + المؤلف + أضف إلى دوائر جوجل + + تابع في تويتر + Fork عن طريق Github + زر موقعنا + أبلغ عن وجود مشكلة + أبلغ عن وجود مشاكل أو طلب ميزات جديدة + انضم لمجموعة جوجل + + إذا كنت تحتاج إلى مساعدة أو لديك أسئلة؛ مجتمع Phonograph في جوجل+ هو المكان المناسب لطرحها + ترجمة + ساعدنا في ترجمة Phonograph إلى لغتك الأم + قيّم + اترك تقييماً إيجابياً في متجر جوجل بلاي إذا أعجبك التطبيق. + تبرع لنا + إذا كنت ترى أنني أستحق أن أحصل على جزاء مقابل عملي، يمكنك أن تكافئني ببضعة دولارات هنا. + من أجل محرك السمات وميزات جميلة أخرى + من أجل شعار التطبيق المطابق لفلسفة ماتيريال ديزاين + من أجل وضع توضيحات البرنامج المتواجدة على المتجر وأيضاً صورة الألبوم الإفتراضية + لمساعدتي في تصميم البرنامج + الموقع + يتم تحميل المنتجات... + التالي + تصميم قائمة \"تستمع الآن\" + المقدمة + اضغط زر الخلف مجدداً لتجاوز المقدمة + مرحباً في Phonograph، مشغل موسيقى خفيف وأنيق على منصة أندرويد. + الذاكرة. + اسحب البطاقة في شاشة \"تستمع الآن\" لإظهار جميع المقطوعات على قائمة الانتظار + إعادة ترتيب القائمة بواسطة سحب المقطوعة من رقمها + صلاحية الوصول إلى الذاكرة مطلوبة لجلب جميع مقاطع الصوت تلقائياً من الذاكرة + المكتبة + الملفات diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index fc1e8d90..ce055e0e 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -1,31 +1,47 @@ + Τι θα θέλατε να μοιραστείτε; + Ακούτε το %1$s από %2$s + Το αρχείο ήχου + Θα θέλατε να θέσετε το %1$s ως ήχο κλήσης σας; + Θέστε το %1$s ως τον ήχο κλήσης σας. + Ορισμός ως ήχος κλήσης + Μοιραστείτε "Ρυθμίσεις " + Χορήγησε + Έγινε + Παράβλεψη "Σχετικά " + Εμφάνιση καλωσορίσματος + Εκκαθάριση λίστας Σειρά τραγουδιών + Προσθήκη στα αγαπημένα + Διαγραφή από τα αγαπημένα Αναζήτηση - Αναπαραγωγή επόμενου + Επόμενο + Αναπαραγωγή Προσθήκη στη σειρά τραγουδιών Διαγραφή από την σειρά τραγουδιών Προσθήκη στην λίστα αναπαραγωγής Επεξεργασία ετικετών + Οριστική διαγραφή Λεπτομέρειες - Δίσκοι + Άλμπουμ Καλλιτέχνες Τραγούδια Λίστες αναπαραγωγής \u03a3\u03c5\u03b3\u03b3\u03bd\u03ce\u03bc\u03b7 - \u03a5\u03c0\u03ae\u03c1\u03be\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03c3\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03c3\u03c0\u03ac\u03b8\u03b5\u03b9\u03b1 \u03b1\u03bd\u03b1\u03c0\u03b1\u03c1\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03a3\u03c5\u03b3\u03b3\u03bd\u03ce\u03bc\u03b7, \u03b4\u03b5\u03bd \u03b2\u03c1\u03ae\u03ba\u03b1\u03bc\u03b5 \u03c4\u03b7 \u03b2\u03b9\u03bf\u03b3\u03c1\u03b1\u03c6\u03af\u03b1 \u03b1\u03c5\u03c4\u03bf\u03cd \u03c4\u03bf\u03c5 \u03ba\u03b1\u03bb\u03bb\u03b9\u03c4\u03ad\u03c7\u03bd\u03b7 Βιογραφία - Δεν μπορούμε να φέρουμε τον ήχο στο προσκήνιο. - Δίσκος + Έγινε άρνηση εστίασης ήχου + Άλμπουμ Καλλιτέχνης Είδος - Καλλιτέχνης του δίσκου + Καλλιτέχνης του άλμπουμ Έτος Κομμάτι "Κομμάτι (2 για κομμάτι 2 ή 3004 από CD3 κομμάτι 4)" - Το πεδιο \"τίτλος του δίσκου\" ή \"καλλιτέχνης του δίσκου\" είναι άδειο + Το πεδίο \"Τίτλος\" ή \"Καλλιτέχνης\" είναι άδειο Γίνεται εγγραφή Γίνεται αποθήκευση αλλαγών... Λεπτομέρειες @@ -37,17 +53,26 @@ Ποιότητα Ρυθμός δειγματοληψίας Πήγαινε στον καλλιτέχνη - Πήγαινε στο δίσκο - Σειρά αναπαραγωγής - Αποθήκευση ως λίστα + Πήγαινε στο άλμπουμ + Ουρά αναπαραγωγής + Αποθήκευση ως λίστα αναπαραγωγής Κανένα αποτέλεσμα Ανανέωση εικόνας καλλιτέχνη + Ανανεώθηκε το πορτρέτο του καλλιτέχνη + \u0394\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03ad\u03c5\u03c1\u03b5\u03c3\u03b7 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2. Γίνεται ανανέωση... - "Προστέθηκε ένας τίτλος στη σειρά αναπαραγωγής" + "Προστέθηκε ένας τίτλος στην ουρά αναπαραγωγής" Προστέθηκαν %1$d εικονίδια στην σειρά αναπαραγωγής + Αφαίρεση από την λίστα + Μέγεθος πλέγματος + Μέγεθος πλέγματος + Προστέθηκαν %1$d τραγούδια στην λίστα %2$s. Δημιουργήθηκε η λίστα αναπαραγωγής %1$s Διεγράφη η λίστα αναπαραγωγής %1$s - %1$s;]]> + Διαγράφηκαν %1$d τραγούδια. + \u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03bb\u03af\u03c3\u03c4\u03b1\u03c2 + %1$s;]]> + %1$s ; (\u039c\u03b7 \u03b1\u03bd\u03b1\u03c3\u03c4\u03c1\u03ad\u03c8\u03b9\u03bc\u03bf!)]]> %1$d λίστες αναπαραγωγής; ]]> @@ -55,23 +80,56 @@ %1$d τραγούδια;]]> Διαγραφή τραγουδιού Διαγραφή τραγουδιών + Διαγραφή από την λίστα + Διαγραφή τραγουδιών από την λίστα Μετονομασία λίστας αναπαραγωγής Διαγραφή λίστας αναπαραγωγής Διαγραφή λιστών αναπαραγωγής + Εκκαθάριση λίστας "Προσθήκη στη λίστα αναπαραγωγής" - Τελευταίο άνοιγμα + Τυχαία τραγούδια + Τυχαίο άλμπουμ + Τυχαίος καλλιτέχνης + Τυχαία λίστα + Εκκαθάριση της λίστας αναπαραγωγής + Τελευταίο Ανοιχτό Σκούρο - Εξισωτής + Μαύρο (AMOLED οθόνη) + Πάντα + Μόνο σε Wi-Fi + Ποτέ + Ισοσταθμιστής + Χρώματα + Τώρα Γενικό θέμα Ήχος Γενικά + Εικόνες + Οθόνη κλειδώματος Έγχρωμη μπάρα πλοήγησης Αρχική σελίδα + Εμφάνιση album art + Αυτόματο κατέβασμα πορτρέτων καλλιτεχνών + Θάμπωμα πορτρέτων καλλιτεχνών + Χρωματιστή πλοήγηση + Παράληψη των album art στην SD + Εναλλαγή χωρίς παύση + Τετράγωνο album art + \"Μουντή\" Εργαλιοθήκη + \"Μουντή\" Γραμμή ειδοποιήσεων + Μεγαλύτερος τίτλος + Εναλακτικός χρονοδείκτης + Εμφάνηση καρτέλας πίσω από τα κουμπιά αναπαραγωγής + Χρωματιστά κουμπιά αναπαραγωγής Δε βρέθηκε ισοσταθμιστής "Δε βρέθηκε ήχος, αναπαράξτε κάτι και δοκιμάστε ξανά." Διαγραφή + Εκκαθάρηση + Αφαίρεση Μετονομασία + Δημιουργία + Επιλέχθηκαν %1$d Επιλογή Προεπιλογή Πρωτεύον χρώμα @@ -79,11 +137,20 @@ Το πρωτεύον χρώμα θέματος είναι λουλακί. Το χρώμα των χαρακτήρων του θέματος είναι ροζ. Ανανέωση εικόνας - Αυτή η λίστα είναι άδεια + Άδεια λίστα αναπαραγωγής Καμία λίστα + Δεν υπάρχουν άλμπουμ + Δεν υπάρχουν τραγούδια + Δεν υπάρχουν καλλιτέχνες + Κενό + Όνομα λίστας Τραγούδι - "Διαθέσιμο μόνο σε Lollipop." - Σε ποιές προβολές θα χρωματίζεται η μπάρα πλοήγησης. + "Διαθέσιμο μόνο σε (Android) Lollipop." + Εμφάνιση του album art στην οθόνη κλειδώματος. + Εμφανίζει,θωριασμένα, το album art στην οθόνη κλειδώματος.Μπορεί να δημιουργίσει πρόβλημα με εφαρμογές Τρίτων. + "\u03a7\u03c1\u03c9\u03bc\u03b1\u03c4\u03af\u03b6\u03b5\u03b9 \u03c4\u03b7\u03bd \u03bc\u03c0\u03ac\u03c1\u03b1 \u03b5\u03b9\u03b4\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c9\u03bd \u03c3\u03c4\u03bf \u03c7\u03c1\u03ce\u03bc\u03b1 \u03c4\u03bf\u03c5 album art \u03c4\u03bf\u03c5 \u03c4\u03c1\u03b1\u03b3\u03bf\u03c5\u03b4\u03b9\u03bf\u03cd" + "Μπορεί να δημιουργίσει θέματα αναπαραγωγής σε μερικές συσκευές." + Χρωματίζει την μπάρα πλοήγησης στο πρωτεύον χρώμα Αναζήτηση στη βιβλιοθήκη... Σάρωση αρχείων πολυμέσων... Νέα λίστα αναπαραγωγής diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 9c79e71b..7605e25c 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1,16 +1,16 @@ ¿Qué quieres compartir? - Reproduciendo %1$s de %2$s + Estás escuchando %1$s de %2$s El archivo de audio - ¿Quieres establecer %1$s como tono de llamada? - %1$s se ha establecido como tono de llamada. + ¿Te gustaría establecer %1$s como tono de llamada? + %1$s se estableció como tono de llamada Establecer como tono de llamada Compartir "Ajustes" Otorgar Hecho - Saltar + Omitir Acerca de Mostrar introducción Limpiar lista de reproducción @@ -23,7 +23,7 @@ Añadir a cola de reproducción Eliminar de la cola de reproducción Añadir a la lista de reproducción... - Editor de etiquetas + Editor de información Eliminar del dispositivo Detalles Álbumes @@ -42,7 +42,7 @@ Pista "Pista (2 para pista 2 o 3004 para CD3 pista 4)" El título o artista está vacío. - Escribiendo archivo... + Editando archivo Guardando cambios... Detalles Nombre del archivo diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 3ac1bdd1..f3f02fd7 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -1,31 +1,47 @@ + Mitä sinä haluat jakaa? + Kuunnellaan parhaillaan kappaletta {%1$s} artistilta {%2$s}. + Äänitiedosto + Haluatko asettaa kappaleen {%1$s} soittoääneksi? + Asetettiin {%1$s} soittoääneksesi. + Aseta soittoääneksi + Jaa "Asetukset" + Myönnä + Valmis + Ohita Tietoja + Näytä intro + Tyhjennä soittolista Toistojono + Lisää suosikkeihin + Poista suosikeista Etsi Toista seuraavaksi + Toista Lisää toistojonoon - Poista jonosta - Lisää soittolistaan + Poista toistojonosta + Lisää soittolistaan... Tagieditori + Poista laitteesta Yksityiskohdat Albumit Artistit Kappaleet Soittolistat - Virhe toistettaessa kappaletta - Biogtagiaa ei l\u00f6ytynyt t\u00e4lle artistille - Biografia - Ääntä ei voitu toistaa - Albumit - Artistit - Tyylit + Virhe toistettaessa kappaletta. + El\u00e4m\u00e4nkertaa ei l\u00f6ytynyt t\u00e4lle artistille. + Elämänkerta + Ääntä ei voitu toistaa. + Albumi + Artisti + Tyylilajit Albumin artisti Vuosi - Kappale - "Kappale (2 kappale 2 tai 3004 CD3 kappale 4)" - Artistialbumin nimi tai albumin artisti -kenttä on tyhjä + Raita + "Raita(2 raidalle 2 tai 3004 CD3 raidalle 4)" + Nimi tai artisti-kenttä on tyhjä. Tiedostoa tallennetaan Tallennetaan muutokset... Yksityiskohdat @@ -35,29 +51,175 @@ Tyyppi Pituus Bittinopeus - Näytteenottotaajuus + Samplausnopeus Näytä artisti Näytä albumi Toistojono Tallenna soittolistana Ei hakutulosta Päivitä artistin kuva + Artistin kuva päivitetty. + Artistin kuvaa ei voitu p\u00e4ivitt\u00e4\u00e4. Päivitetään... - "Kappale lisätty jonoon" - {%1$d} kappaletta lisättiin jonoon - Soittolista {%1$s} luotu - Soittolista {%1$s} poistettu + "Yksi kappale lisätty toistojonoon." + {%1$d} kappaletta lisättiin toistojonoon + Poista soittolistasta + Ruudukon koko + Ruudukon koko (vaaka) + Lisätty {%1$d} kappaletta soittolistaan {%2$s}. + Soittolista {%1$s} luotu. + Soittolista {%1$s} poistettu. + Poistettiin {%1$d} kappaletta. + Soittolistan luominen ep\u00e4onnistui. }{%1$s}{}?]]> + }{%1$s}{}? T\u00e4t\u00e4 toimintoa ei voi perua!]]> + }{%1$d}{} soittolistaa?]]> }{%1$s}{}?]]> }{%1$d}{} kappaletta?]]> - Poista Kappale - Poista Kappaleet - Nimeä Uudelleen Soittolista - Poista Soittolista - "Lisää Soittolistaan" + }{%1$s}{} soittolistasta?]]> + }{%1$d}{} kappaletta soittolistasta?]]> + Poista kappale + Poista kappaleet + Poista kappale soittolistasta + Poista kappaleita soittolistasta + Nimeä soittolista uudelleen + Poista soittolista + Poista soittolistat + Tyhjennä soittolistat + "Lisää soittolistaan" + Sekoita kaikki + Sekoita albumit + Sekoita artistit + Sekoita soittolistat + Tyhjennä toistojono Viimeksi avattu Vaalea Tumma - Taajuuskorjain - Uusi Soittolista + Musta (AMOLED) + Aina + Vain Wi-Fi-yhteydellä + Ei koskaan + Ekvalisaattori + Värit + Toistetaan parhaillaan + Yleinen teema + Ääni + Yleinen + Kuvat + Lukitusnäyttö + Värillinen navigointipalkki + Aloitussivu + Näytä albumin kansi + Lataa automaattisesti artistien kuvat + Sumenna albumin kansi + Värillinen ilmoitus + Sivuuta Media Storen albumikannet + Kuiluton toisto + Neliömäinen albumin kansi + Läpikuultamaton työkalupalkki + Läpikuultamaton tilapalkki + Suurempi otsikkoruutu + Vaihtoehtoinen edistymispalkki + Näytä kortti toistonappien alapuolella + Värilliset toistonapit + Ekvalisaattoria ei löytynyt. + "Toista jokin kappale ensin, koita sitten uudelleen." + Poista + Tyhjennä + Poista + Nimeä uudelleen + Luo + {%1$d} valittu + Valitse + Oletus + Ensisijainen väri + Aksenttiväri + Ensisijainen teemaväri, oletuksena indigo. + Aksentti teemaväri, oletuksena pinkki. + Päivitä kuva + Tyhjennä soittolista + Ei soittolistoja + Ei albumeja + Ei kappaleita + Ei artisteja + Tyhjä + Soittolistan nimi + Kappale + "Saatavilla vain Lollipopilla." + Käyttää tämänhetkisten albumien kansia lukitusnäytön taustakuvana. + Sumentaa albumin kannen lukitusnäytöllä. Saattaa aiheuttaa ongelmia kolmannen osapuolen sovellusten ja widgettien kanssa. + "V\u00e4ritt\u00e4\u00e4 ilmoituksen albumin eloisalla v\u00e4rill\u00e4." + "Saattaa aiheuttaa toisto-ongelmia joillakin laitteilla." + Albumien kannet Toistetaan parhaillaan -näkymässä ovat aina neliömäisiä. + Värittää työkalupalkin. + Värittää tilapalkin. + Otsikkoruutu on korkeampi. + Käyttää edistymispalkkia, joka ei peitä albumin kantta, oletus edistymispalkin sijasta. + Näyttää kortin toista/pysäytä, ohita, kelaa takaisin, sekoita ja toista uudelleen -nappien alapuolella. + Saattaa nostaa albumin kannen laatua, mutta aiheuttaa hitaampaa kuvien latausaikaa. Käytä tätä vain, jos sinulla on ongelmia huonolaatuisten taideteosten kanssa. + V\u00e4ritt\u00e4\u00e4 toista/pys\u00e4yt\u00e4, sekoita ja toista uudelleen -napit, sek\u00e4 edistymispalkin albumin eloisalla v\u00e4rill\u00e4. + Värittää navigointipalkin ensisijaisella värillä. + "Ei voitu ladata vastaavaa albumin kantta." + Etsi kirjastostasi... + Uudelleenskannataan mediaa... + Suosikit + Viimeksi lisätyt + Historia + Eniten kuunnellut + Poista kansi + Lataa Last.fm-sivustolta + Valitse paikallisesta muistista + Web-haku + Ajastin + Aseta + Peru tämänhetkinen ajastin + Ajastin peruttu. + Ajastin asetettu {%d} minuutin päähän tästä hetkestä. + Uusi soittolista... + Uusi soittolista + Värilliset alatunnisteet + Erikoiskiitokset: + Muutosloki + Lisenssit + Sinulla ei ole oikeuksia tähän. + Oikeus päästä muistikortille evättu. + Takaisin + Tue kehitystä + Kiitos! + Palautetut edelliset ostokset. + Play Store kuvitus: + Versio + Sovellus + Luoja + Lisää Google Plus -piireihin + Seuraa Twitterissä + Seuraa GitHubissa + Vieraile verkkosivulla + Raportoi bugeja + Raportoi bugeja tai ehdota uusia ominaisuuksia. + Liity Google Plus -yhteisöön + Jos tarvitset apua tai sinulla on kysymyksiä, Phonographin Google Plus -yhteisö on hyvä paikka mennä. + Käännä + Auta kääntämään Phonograph sinun äidinkielellesi. + Arvostele + Jätä positiivinen arvostelu Google Play -kauppaan, jos pidät Phonographista. + Lahjoita + Jos sinun mielestäsi minun kuuluisi saada korvausta työstäni, voit antaa minulla muutaman dollarin täällä. + Teemamoottorista ja muista hienoista jutuista. + Hienosta material-ikonista. + Google Play kuvituksesta ja tyhjästä albumikannesta. + Sovelluksen desing suunnitteluavusta. + Verkkosivu + Ladataan tuotteita... + Seuraavaksi + Toistetaan parhaillaan layouttia + Esittely + Paina takaisin-nappia uudelleen ohittaaksesi esittelyn + "Tervetuloa Phonographiin, kauniiseen ja kevyeen musiikkisoittimeen Androidille. " + Tallennustila + Vedä korttia Toistetaan parhaillaan -ikkunassa ylös, nähdäksesi koko toistojonon. + Järjestä toistojonoa vetämällä kappaletta sen raitanumerosta. + Tallennustilan käytön oikeus vaaditaan Phonographin käyttöön, jotta voimme lukea sinun musiikkikirjastosi. + Kirjasto + Kansiot diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 8e7ab474..54d5cbe3 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -1,21 +1,30 @@ - מה אתם רוצים לשתף? - מאזינים כרגע ל-%1$s מאת %2$s. + מה תרצה/י לשתף? + כרגע מאזין ל%1$s מאת %2$s. קובץ האודיו - אתם רוצים לקבוע את %1$s בתור הצלצול שלכם? - קביעת %1$s בתור בצלצול שלך. + תרצה/י לקבוע את %1$s בתור הצלצול שלך? + הגדר/י את %1$s בתור הצלצול שלך. + הגדרה כצלצול שיתוף "הגדרות" + הענק + בוצע + דלג אודות + הצג את המסך הראשי + ניקוי רשימת השמעה + "מנגן " הוספה למועדפים הסרה מהמועדפים חיפוש - ניגון הבא - ניגון - הוספה לתור ההשמעה - הסרה מתור ההשמעה - הסרה מהמכשיר + ניגון השיר הבא + נגן + הסופה לרשימת ההשמעה + הסרה מרשימת ההשמעה + הוסף לרשימת השמעה... + עריכת תווית + מחק מהמכשיר פרטים אלבומים אמנים @@ -24,48 +33,69 @@ \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05e0\u05d2\u05df \u05e9\u05d9\u05e8 \u05d6\u05d4. \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05de\u05e6\u05d5\u05d0 \u05d0\u05ea \u05d4\u05d1\u05d9\u05d5\u05d2\u05e8\u05e4\u05d9\u05d4 \u05e9\u05dc \u05d0\u05de\u05df \u05d6\u05d4. ביוגרפיה + מיקוד שמע נדחה אלבום אמן סגנון + אמן האלבום שנה - כתיבת קובץ - שמירת שינויים... + שיר + "שיר (2 בשביל שיר 2 או 3004 בשביל דיסק 3 שיר 4)" + הכותרת או האמן ריקים + כותב קובץ + שומר שינויים... פרטים - שם קובץ - נתיב הקובץ + שם הקובץ + מיקום הקובץ גודל - פורמט + תבנית אורך + קצב נתונים + עיבוד אותות מעבר לאמן מעבר לאלבום - ניגון תור + מנגן רשימת השמעה שמירה כרשימת השמעה אין תוצאות - עדכון תמונת האמן + עדכן תמונת אמן תמונת האמן עודכנה. - עידכון... + \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05e2\u05d3\u05db\u05df \u05d0\u05ea \u05ea\u05de\u05d5\u05e0\u05ea \u05d4\u05d0\u05de\u05df. + מעדכן... + "נוסף שיר אחד לתור " + נוספו %1$d שירים לתור + הסר מרשימת ההשמעה + גודל הרשת + גודל הרשת (קרקע) + הוכנסו %1$d שירים לתוך רשימת השמיעה %2$s + נוצרה רשימת השמיעה %1$s + נמחקה רשימת השמיעה %1$s + נמחקו %1$d שירים + \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d9\u05e6\u05d5\u05e8 \u05e8\u05e9\u05d9\u05de\u05ea \u05e9\u05de\u05d9\u05e2\u05d4. + %1$s?]]> + %1$s? \u05dc\u05d0\u05d7\u05e8 \u05ea\u05d4\u05dc\u05d9\u05da \u05d6\u05d4 \u05dc\u05d0 \u05ea\u05d5\u05db\u05dc/\u05d9 \u05dc\u05d4\u05d7\u05d6\u05d9\u05e8 \u05d0\u05ea \u05d4\u05de\u05e6\u05d1 \u05dc\u05e7\u05d3\u05de\u05d5\u05ea\u05d5!]]> + %1$d רשימות השמיעה?]]> בהיר כהה שחור (AMOLED) תמיד רק עם WI-FI אף פעם - אקולייזר + אקוולייזר צבעים מנגן כעת - אודיו + שמע כללי תמונות מסך נעילה סרגל ניווט צבעוני - עמוד התחלה - הצגת כיסוי אלבום + עמוד פתיחה + הצג עטיפת אלבום הורדה אוטומטית של תמונות האמן - טשטוש כיסוי האלבום + טשטוש עטיפת האלבום התראה צבעונית - ניגון ללא מרווחים - כיסוי אלבום מרובע - לא נמצא אקולייזר + ניגון ללא מרווחים בין השירים + עטיפת אלבום מרובעת + אקוולייזר לא נמצא מחיקה ניקוי הסרה @@ -76,21 +106,21 @@ ברירת מחדל צבע ראשי עדכון תמונה - רשימת השמעה ריקה + רשימת שמע ריקה אין אלבומים אין שירים אין אמנים ריק - שם רשימת השמעה + שם רשימת שמע שיר מועדפים היסטוריה - הסרת כיסוי + הסרת עטיפה הורדה מ-Last.fm חיפוש באינטרנט קבע - רשימת השמעה חדשה - תודות מיוחדות + רשימת שמע חדשה + תודות מיוחדות ל רשימת שינויים רישיונות הרשאות נדחו. @@ -102,8 +132,8 @@ גרסה אפליקציה ביקור באתר - דיווח באגים - תרגום + דווח על באגים + תרגם תרומה אם אתם חושבים שמגיע לי לקבל תשלום על עבודתי, אתם יכולים להשאיר לי כמה שקלים כאן. אתר diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 506c6c5e..3b3bbf15 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -113,6 +113,17 @@ Előadó képének automatikus letöltése Albumborító elhomályosítása Színezett értesítés + Média tárolt albumborítók figyelmen kívül hagyása + Áttűnéses lejátszás + Négyzet alakú albumkép + Áttetsző menüsáv + Átlátszatlan állapotsáv + Nagyobb címdoboz + Alternatív haladási csúszka + Kártya megjelenítése a lejátszást irányító gombok alatt + Színezett lejátszást irányító gombok + Equalizer nem található. + "Játszd le egy dalt, majd próbáld újra." Töröl Kiürít Eltávolít @@ -120,9 +131,62 @@ Létrehoz %1$d kiválasztva Kiválaszt + Alapértelmezett + Elsődleges szín + Másodlagos szín + Az alapértelmezett elsődleges szín, indigó. + Az alapértelmezett másodlagos szín, rózsaszín. + Kép frissítése + Üres lejátszási lista + Nincs lejátszási lista + Nincs album + Nincs dal + Nincs előadó + Üres + Lejátszási lista neve + Dal + "Csak Lollipoppon (Android 5.x) érhető el." + Jelenlegi dal albumborítójának használata a zárképernyő háttérképeként. + Albumborító elhomályosítása a zárképernyőn.Ez problémákat okozhat a harmadik féltől származó alkalmazásoknál és widgeteknél. + "\u00c9rtes\u00edt\u00e9sek sz\u00ednez\u00e9se az albumbor\u00edt\u00f3 vibr\u00e1l\u00f3 sz\u00edn\u00e9vel." + "Lejátszási problémákat okozhat néhány eszközön." + Az albumborító a most játszott nézetnél, mindig négyzet alakú legyen. + Az eszköztár színezése. + Az állapotsáv színezése. + A cím doboz magasabb. + Folyamatjelzősáv használata, amely nem takarja el az albumborítót az alapértelmezett folyamatjelző csúszka helyett. + Kártya megjelenítése a lejátszás/szünet, át ugor, visszateker, keverés és az ismétlés alatt gombok alatt. + Növelheti az album borító minőségét, de lassabban tölti be a képeket. Csak akkor engedélyezze, ha az albumborítók rossz minőségben jelenik meg. + Lej\u00e1tsz\u00e1s/sz\u00fcnet, kever\u00e9s \u00e9s ism\u00e9tl\u00e9s gombok sz\u00ednez\u00e9se, bele\u00e9rtve a halad\u00e1si cs\u00faszk\u00e1t az albumbor\u00edt\u00f3 vibr\u00e1l\u00f3 sz\u00edn\u00e9vel. + Navigációs sáv színezése az alapértelmezett színnel. + "Nem siker\u00fclt let\u00f6lteni a megfelel\u0151 albumbor\u00edt\u00f3t." + Keresés a könyvtáradban... + Média újraszkennelése... + Kedvencek + Utoljára hozzáadva + Előzmények + Az én top dalaim + Borító eltávolítása + Letöltés a Last.fm-ről + Felvétel a helyi tárhelyből + Internetes keresés + Elalvás időzítő + Beállít + Jelenlegi időzítő törlése + Elalvás időzítő törölve. + Elalvás időzítő beállítva, mostantól számított %d percre. + Új lejátszási lista... + Új lejátszási lista + Színes lábjegyzetek + Külön köszönet + Változások + Engedélyek + Jogosultságok megtagadva. + Jogosultságod a külső tárolóhoz megtagadva. vissza Fejlesztő támogatása Köszönöm! + Korábbi vásárlások visszaállítása. Play Áruház illusztrációt készítette Verzió Alkalmazás @@ -132,9 +196,30 @@ Fork on GitHub Weboldal meglátogatása Hiba jelentése + Hiba jelentése vagy új funkció kérése. + Csatlakozz a Google Plus közösséghez + Ha segítségre lenne szükséged, a Phonograph közösség között biztos válaszra találsz. Fordítás Segíts lefordítani a Phonograph-ot a saját nyelvedre. + Értékeld + Értékeld a Phonograph-ot pozitívan a Google Play-en! Adományoz + Ha szerinted megéri a munkám, adományozz egy csekély összeget nekem. + A téma alapjához és egyéb remek dolgokhoz. + A szép material alkalmazás ikonért. + A Play Store-os illusztrációért és az üres albumborítóért. + Azért, mert segített nekem a kinézetben. + Weboldal + Termékek betöltése... + Következő + Most játszott elrendezés + Bemutató + Nyomj a visszára megint, hogy átugord a bemutatót. + "Üdvözöl a Phonograph! Egy kisméretű, szép zenelejátszó Android-ra. " + Tárhely + Húzd fel a kártyát a most játszott képernyőnél, hogy megnyisd a lejátszási sort. + Rendezd át a lejátszási sort, azzal hogy megfogod a számokat a sorszámuknál fogva. + Engedélyezned kell a tárhely használatát, hogy a Phonograph meg tudja találni a zeneszámaidat. Könyvtár Mappa diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 8e7ab474..54d5cbe3 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -1,21 +1,30 @@ - מה אתם רוצים לשתף? - מאזינים כרגע ל-%1$s מאת %2$s. + מה תרצה/י לשתף? + כרגע מאזין ל%1$s מאת %2$s. קובץ האודיו - אתם רוצים לקבוע את %1$s בתור הצלצול שלכם? - קביעת %1$s בתור בצלצול שלך. + תרצה/י לקבוע את %1$s בתור הצלצול שלך? + הגדר/י את %1$s בתור הצלצול שלך. + הגדרה כצלצול שיתוף "הגדרות" + הענק + בוצע + דלג אודות + הצג את המסך הראשי + ניקוי רשימת השמעה + "מנגן " הוספה למועדפים הסרה מהמועדפים חיפוש - ניגון הבא - ניגון - הוספה לתור ההשמעה - הסרה מתור ההשמעה - הסרה מהמכשיר + ניגון השיר הבא + נגן + הסופה לרשימת ההשמעה + הסרה מרשימת ההשמעה + הוסף לרשימת השמעה... + עריכת תווית + מחק מהמכשיר פרטים אלבומים אמנים @@ -24,48 +33,69 @@ \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05e0\u05d2\u05df \u05e9\u05d9\u05e8 \u05d6\u05d4. \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05de\u05e6\u05d5\u05d0 \u05d0\u05ea \u05d4\u05d1\u05d9\u05d5\u05d2\u05e8\u05e4\u05d9\u05d4 \u05e9\u05dc \u05d0\u05de\u05df \u05d6\u05d4. ביוגרפיה + מיקוד שמע נדחה אלבום אמן סגנון + אמן האלבום שנה - כתיבת קובץ - שמירת שינויים... + שיר + "שיר (2 בשביל שיר 2 או 3004 בשביל דיסק 3 שיר 4)" + הכותרת או האמן ריקים + כותב קובץ + שומר שינויים... פרטים - שם קובץ - נתיב הקובץ + שם הקובץ + מיקום הקובץ גודל - פורמט + תבנית אורך + קצב נתונים + עיבוד אותות מעבר לאמן מעבר לאלבום - ניגון תור + מנגן רשימת השמעה שמירה כרשימת השמעה אין תוצאות - עדכון תמונת האמן + עדכן תמונת אמן תמונת האמן עודכנה. - עידכון... + \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05e2\u05d3\u05db\u05df \u05d0\u05ea \u05ea\u05de\u05d5\u05e0\u05ea \u05d4\u05d0\u05de\u05df. + מעדכן... + "נוסף שיר אחד לתור " + נוספו %1$d שירים לתור + הסר מרשימת ההשמעה + גודל הרשת + גודל הרשת (קרקע) + הוכנסו %1$d שירים לתוך רשימת השמיעה %2$s + נוצרה רשימת השמיעה %1$s + נמחקה רשימת השמיעה %1$s + נמחקו %1$d שירים + \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d9\u05e6\u05d5\u05e8 \u05e8\u05e9\u05d9\u05de\u05ea \u05e9\u05de\u05d9\u05e2\u05d4. + %1$s?]]> + %1$s? \u05dc\u05d0\u05d7\u05e8 \u05ea\u05d4\u05dc\u05d9\u05da \u05d6\u05d4 \u05dc\u05d0 \u05ea\u05d5\u05db\u05dc/\u05d9 \u05dc\u05d4\u05d7\u05d6\u05d9\u05e8 \u05d0\u05ea \u05d4\u05de\u05e6\u05d1 \u05dc\u05e7\u05d3\u05de\u05d5\u05ea\u05d5!]]> + %1$d רשימות השמיעה?]]> בהיר כהה שחור (AMOLED) תמיד רק עם WI-FI אף פעם - אקולייזר + אקוולייזר צבעים מנגן כעת - אודיו + שמע כללי תמונות מסך נעילה סרגל ניווט צבעוני - עמוד התחלה - הצגת כיסוי אלבום + עמוד פתיחה + הצג עטיפת אלבום הורדה אוטומטית של תמונות האמן - טשטוש כיסוי האלבום + טשטוש עטיפת האלבום התראה צבעונית - ניגון ללא מרווחים - כיסוי אלבום מרובע - לא נמצא אקולייזר + ניגון ללא מרווחים בין השירים + עטיפת אלבום מרובעת + אקוולייזר לא נמצא מחיקה ניקוי הסרה @@ -76,21 +106,21 @@ ברירת מחדל צבע ראשי עדכון תמונה - רשימת השמעה ריקה + רשימת שמע ריקה אין אלבומים אין שירים אין אמנים ריק - שם רשימת השמעה + שם רשימת שמע שיר מועדפים היסטוריה - הסרת כיסוי + הסרת עטיפה הורדה מ-Last.fm חיפוש באינטרנט קבע - רשימת השמעה חדשה - תודות מיוחדות + רשימת שמע חדשה + תודות מיוחדות ל רשימת שינויים רישיונות הרשאות נדחו. @@ -102,8 +132,8 @@ גרסה אפליקציה ביקור באתר - דיווח באגים - תרגום + דווח על באגים + תרגם תרומה אם אתם חושבים שמגיע לי לקבל תשלום על עבודתי, אתם יכולים להשאיר לי כמה שקלים כאן. אתר diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 97c893d5..e31bc232 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -1,7 +1,19 @@ + Vad vill du dela? + Lyssnar just nu på %1$s av %2$s. + Ljudfilen + "Vill du lägga till %1$s som din ringsignal? " + "Lägg till %1$s som din ringsignal. " + "Lägg till som ringsignal. " + Dela "Inställningar" + Tillåt + Färdig + Skippa Om + Visa intro + "Rensa spellista " Uppspelningskö Sök Spela nästa @@ -24,7 +36,7 @@ Album artist År Låt - "Låt" + "Spår" Textfältet för albumtitel eller artist är tomt. Skriver till fil Sparar ändringar ... diff --git a/app/src/main/res/values/strings_activity_settings.xml b/app/src/main/res/values/strings_activity_settings.xml index 80c9fbe6..33eba14a 100644 --- a/app/src/main/res/values/strings_activity_settings.xml +++ b/app/src/main/res/values/strings_activity_settings.xml @@ -22,9 +22,9 @@ - 0 - 1 - 2 + light + dark + black diff --git a/app/src/main/res/values/styles_parents.xml b/app/src/main/res/values/styles_parents.xml index eec8a3b1..b7f75c80 100644 --- a/app/src/main/res/values/styles_parents.xml +++ b/app/src/main/res/values/styles_parents.xml @@ -58,7 +58,7 @@