Merge remote-tracking branch 'origin/master'

# Conflicts:
#	app/build.gradle
#	app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java
This commit is contained in:
Karim Abou Zeid 2016-01-29 10:35:50 +01:00
commit 1b3d98e098
70 changed files with 1201 additions and 1946 deletions

View file

@ -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'
}

View file

@ -25,6 +25,33 @@
<p>You can view the changelog dialog again at any time from the <i>about</i> section.</p>
<h3>Version 0.9.54 RC</h3>
<ol>
<li><b>NEW:</b> Added transition when opening a playlist.</li>
<li><b>IMPROVEMENT:</b> Adjusted the colors generated by the Palette API for better performance.
</li>
<li><b>IMPROVEMENT:</b> Synced translations.</li>
<li><b>FIX:</b> Fixed a bug with the switches on the settings page.</li>
</ol>
<h3>Version 0.9.54 beta 1</h3>
<ol>
<li><b>NEW:</b> Yet again changed the theme engine, should be quite stable again now.</li>
<li><b>NEW:</b> Improved fastscroller (auto hide is missing right now).</li>
</ol>
<h3>Version 0.9.53 PREVIEW 1</h3>
<ol>
<li><b>NEW (PREVIEW):</b> Completely new underlying theme engine.</li>
<li><b>IMPROVEMENT:</b> Various things, I don't quite remember.</li>
<li><b>IMPROVEMENT:</b> Synced translations.</li>
</ol>
<h3>Version 0.9.52</h3>
<ol>

View file

@ -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<PlaylistAdapter.ViewH
holder.image.setImageDrawable(Util.getTintedDrawable(
activity,
getIconRes(playlist),
ColorUtil.resolveColor(activity, android.R.attr.textColorSecondary)
ATHUtil.resolveColor(activity, R.attr.icon_color, ThemeStore.textColorSecondary(activity))
));
}
}
@ -178,7 +179,7 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
if (shortSeparator != null) {
shortSeparator.setVisibility(View.GONE);
}
itemView.setBackgroundColor(ColorUtil.resolveColor(activity, R.attr.cardBackgroundColor));
itemView.setBackgroundColor(ATHUtil.resolveColor(activity, R.attr.cardBackgroundColor));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
itemView.setElevation(activity.getResources().getDimensionPixelSize(R.dimen.card_elevation));
}

View file

@ -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<SearchAdapter.ViewHolder
itemView.setOnLongClickListener(null);
if (itemViewType != HEADER) {
itemView.setBackgroundColor(ColorUtil.resolveColor(activity, R.attr.cardBackgroundColor));
itemView.setBackgroundColor(ATHUtil.resolveColor(activity, R.attr.cardBackgroundColor));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
itemView.setElevation(activity.getResources().getDimensionPixelSize(R.dimen.card_elevation));
}

View file

@ -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 AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
if (holder.paletteColorContainer != null) {
holder.paletteColorContainer.setBackgroundColor(color);
if (holder.title != null) {
holder.title.setTextColor(ColorUtil.getPrimaryTextColorForBackground(activity, color));
holder.title.setTextColor(MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color)));
}
if (holder.text != null) {
holder.text.setTextColor(ColorUtil.getSecondaryTextColorForBackground(activity, color));
holder.text.setTextColor(MaterialValueHelper.getSecondaryTextColor(activity, ColorUtil.isColorLight(color)));
}
}
}

View file

@ -15,6 +15,8 @@ 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.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;
@ -30,7 +32,6 @@ import com.kabouzeid.gramophone.loader.ArtistSongLoader;
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;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
@ -88,7 +89,7 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
final Artist artist = dataSet.get(position);
// final int defaultBarColor = ColorUtil.resolveColor(activity, R.attr.default_bar_color);
// final int defaultBarColor = PhonographColorUtil.resolveColor(activity, R.attr.default_bar_color);
// setColors(defaultBarColor, holder);
boolean isChecked = isChecked(artist);
@ -112,10 +113,10 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
if (holder.paletteColorContainer != null) {
holder.paletteColorContainer.setBackgroundColor(color);
if (holder.title != null) {
holder.title.setTextColor(ColorUtil.getPrimaryTextColorForBackground(activity, color));
holder.title.setTextColor(MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color)));
}
if (holder.text != null) {
holder.text.setTextColor(ColorUtil.getSecondaryTextColorForBackground(activity, color));
holder.text.setTextColor(MaterialValueHelper.getSecondaryTextColor(activity, ColorUtil.isColorLight(color)));
}
}
}

View file

@ -9,7 +9,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.CabHolder;
@ -71,9 +71,10 @@ public class ShuffleButtonSongAdapter extends SongAdapter {
@Override
public void onBindViewHolder(@NonNull final SongAdapter.ViewHolder holder, int position) {
if (holder.getItemViewType() == SHUFFLE_BUTTON) {
int accentColor = ThemeStore.accentColor(activity);
if (holder.title != null) {
holder.title.setText(activity.getResources().getString(R.string.action_shuffle_all).toUpperCase());
holder.title.setTextColor(ThemeSingleton.get().positiveColor);
holder.title.setTextColor(accentColor);
holder.title.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL));
}
if (holder.text != null) {
@ -85,7 +86,7 @@ public class ShuffleButtonSongAdapter extends SongAdapter {
if (holder.image != null) {
final int padding = activity.getResources().getDimensionPixelSize(R.dimen.default_item_margin) / 2;
holder.image.setPadding(padding, padding, padding, padding);
holder.image.setColorFilter(ThemeSingleton.get().positiveColor.getDefaultColor());
holder.image.setColorFilter(accentColor);
holder.image.setImageResource(R.drawable.ic_shuffle_white_24dp);
}
if (holder.separator != null) {

View file

@ -10,10 +10,11 @@ import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SectionIndexer;
import com.afollestad.materialcab.MaterialCab;
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;
@ -25,12 +26,10 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
import com.kabouzeid.gramophone.interfaces.CabHolder;
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;
import java.io.CharArrayReader;
import java.util.ArrayList;
/**
@ -111,10 +110,10 @@ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, S
if (holder.paletteColorContainer != null) {
holder.paletteColorContainer.setBackgroundColor(color);
if (holder.title != null) {
holder.title.setTextColor(ColorUtil.getPrimaryTextColorForBackground(activity, color));
holder.title.setTextColor(MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color)));
}
if (holder.text != null) {
holder.text.setTextColor(ColorUtil.getSecondaryTextColorForBackground(activity, color));
holder.text.setTextColor(MaterialValueHelper.getSecondaryTextColor(activity, ColorUtil.isColorLight(color)));
}
}
}

View file

@ -15,8 +15,8 @@ import android.webkit.WebView;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.appthemehelper.util.ColorUtil;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import java.io.BufferedReader;
@ -83,7 +83,7 @@ public class ChangelogDialog extends DialogFragment {
.replace("{style-placeholder}",
String.format("body { background-color: #%s; color: #%s; }", backgroundColor, contentColor))
.replace("{link-color}", colorToHex(ThemeSingleton.get().positiveColor.getDefaultColor()))
.replace("{link-color-active}", colorToHex(ColorUtil.shiftColorUp(ThemeSingleton.get().positiveColor.getDefaultColor())))
.replace("{link-color-active}", colorToHex(ColorUtil.lightenColor(ThemeSingleton.get().positiveColor.getDefaultColor())))
, "text/html", "UTF-8");
} catch (Throwable e) {
webView.loadData("<h1>Unable to load</h1><p>" + e.getLocalizedMessage() + "</p>", "text/html", "UTF-8");

View file

@ -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);

View file

@ -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<? super BitmapPaletteWrapper> 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);

View file

@ -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<Bitmap, BitmapPaletteWrapper> {
private final BitmapPool bitmapPool;
@ -23,7 +23,7 @@ public class BitmapPaletteTranscoder implements ResourceTranscoder<Bitmap, Bitma
@Override
public Resource<BitmapPaletteWrapper> transcode(Resource<Bitmap> 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);
}

View file

@ -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<? super BitmapPaletteWrapper> 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);

View file

@ -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<FloatingActionButton, Integer> COLOR = new Property<FloatingActionButton, Integer>(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;
}
};
}

View file

@ -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);
}
}
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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<LastFmArtist>() {
@Override
public void onResponse(Response<LastFmArtist> 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);
}
}

View file

@ -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;

View file

@ -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

View file

@ -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;
}

View file

@ -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() {

View file

@ -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;
}
}
}
}

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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));
}
}

View file

@ -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<FieldKey, String> fieldKeyValueMap) {

View file

@ -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<? super BitmapPaletteWrapper> 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<? super BitmapPaletteWrapper> 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);

View file

@ -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<A extends RecyclerView
public static final String TAG = AbsMainActivityRecyclerViewFragment.class.getSimpleName();
@Bind(R.id.container)
View container;
@Bind(R.id.recycler_view)
RecyclerView recyclerView;
@Nullable
@ -56,6 +62,13 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
}
private void setUpRecyclerView() {
if (recyclerView instanceof FastScrollRecyclerView) {
int accentColor = ThemeStore.accentColor(getActivity());
((FastScrollRecyclerView) recyclerView).setPopupBgColor(accentColor);
((FastScrollRecyclerView) recyclerView).setPopupTextColor(MaterialValueHelper.getPrimaryTextColor(getActivity(), ColorUtil.isColorLight(accentColor)));
((FastScrollRecyclerView) recyclerView).setThumbColor(accentColor);
((FastScrollRecyclerView) recyclerView).setTrackColor(ColorUtil.withAlpha(ATHUtil.resolveColor(getContext(), R.attr.colorControlNormal), 0.12f));
}
invalidateLayoutManager();
invalidateAdapter();
}
@ -91,7 +104,7 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int i) {
int bottomPadding = getMainActivity().getTotalAppBarScrollingRange() + i;
container.setPadding(container.getPaddingLeft(), container.getPaddingTop(), container.getPaddingRight(), getMainActivity().getTotalAppBarScrollingRange() + i);
}
@Override

View file

@ -1,6 +1,7 @@
package com.kabouzeid.gramophone.ui.fragments.player;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.support.annotation.Nullable;
@ -13,14 +14,16 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
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.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.MusicProgressViewUpdateHelper;
import com.kabouzeid.gramophone.helper.PlayPauseButtonOnClickHandler;
import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener;
import com.kabouzeid.gramophone.ui.activities.base.AbsMusicServiceActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.views.PlayPauseDrawable;
@ -94,24 +97,24 @@ public class MiniPlayerFragment extends Fragment implements MusicServiceEventLis
}
private void setUpMiniPlayer() {
setMiniPlayerColor(ColorUtil.resolveColor(activity, R.attr.cardBackgroundColor));
setMiniPlayerColor(ATHUtil.resolveColor(activity, R.attr.cardBackgroundColor));
miniPlayerImage.setImageDrawable(Util.getTintedDrawable(activity, R.drawable.ic_keyboard_arrow_up_white_24dp,
ColorUtil.resolveColor(activity, android.R.attr.textColorSecondary)));
ATHUtil.resolveColor(activity, R.attr.icon_color, ThemeStore.textColorSecondary(getActivity()))));
setUpPlayPauseButton();
progressBar.setProgressTintList(ThemeSingleton.get().positiveColor);
progressBar.setProgressTintList(ColorStateList.valueOf(ThemeStore.accentColor(activity)));
}
public void setMiniPlayerColor(int color) {
if (getView() == null) return;
getView().setBackgroundColor(color);
miniPlayerTitle.setTextColor(ColorUtil.getPrimaryTextColorForBackground(activity, color));
miniPlayerTitle.setTextColor(MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color)));
}
private void setUpPlayPauseButton() {
updatePlayPauseDrawableState(false);
miniPlayerPlayPauseButton.setImageDrawable(miniPlayerPlayPauseDrawable);
miniPlayerPlayPauseButton.setColorFilter(ColorUtil.resolveColor(activity, android.R.attr.textColorSecondary), PorterDuff.Mode.SRC_IN);
miniPlayerPlayPauseButton.setColorFilter(ATHUtil.resolveColor(activity, R.attr.icon_color, ThemeStore.textColorSecondary(getActivity())), PorterDuff.Mode.SRC_IN);
miniPlayerPlayPauseButton.setOnClickListener(new PlayPauseButtonOnClickHandler());
}

View file

@ -14,16 +14,17 @@ import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.TextView;
import com.kabouzeid.appthemehelper.util.ColorUtil;
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
import com.kabouzeid.appthemehelper.util.TintHelper;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.MusicProgressViewUpdateHelper;
import com.kabouzeid.gramophone.helper.PlayPauseButtonOnClickHandler;
import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener;
import com.kabouzeid.gramophone.misc.FloatingActionButtonProperties;
import com.kabouzeid.gramophone.misc.SimpleOnSeekbarChangeListener;
import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.ui.activities.base.AbsMusicServiceActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.views.PlayPauseDrawable;
@ -148,12 +149,12 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
}
public void setColor(int color) {
if (ColorUtil.useDarkTextColorOnBackground(color)) {
lastPlaybackControlsColor = ColorUtil.getSecondaryTextColor(getActivity(), true);
lastDisabledPlaybackControlsColor = ColorUtil.getSecondaryDisabledTextColor(getActivity(), true);
if (ColorUtil.isColorLight(color)) {
lastPlaybackControlsColor = MaterialValueHelper.getSecondaryTextColor(getActivity(), true);
lastDisabledPlaybackControlsColor = MaterialValueHelper.getSecondaryDisabledTextColor(getActivity(), true);
} else {
lastPlaybackControlsColor = ColorUtil.getPrimaryTextColor(getActivity(), false);
lastDisabledPlaybackControlsColor = ColorUtil.getPrimaryDisabledTextColor(getActivity(), false);
lastPlaybackControlsColor = MaterialValueHelper.getPrimaryTextColor(getActivity(), false);
lastDisabledPlaybackControlsColor = MaterialValueHelper.getPrimaryDisabledTextColor(getActivity(), false);
}
updateRepeatState();
@ -166,7 +167,10 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
private void setUpPlayPauseFab() {
updatePlayPauseDrawableState(false);
playPauseFab.setImageDrawable(playerFabPlayPauseDrawable);
FloatingActionButtonProperties.COLOR.set(playPauseFab, Color.WHITE);
final int fabColor = Color.WHITE;
TintHelper.setTintAuto(playPauseFab, fabColor, true);
// because of our custom drawable we have to set the tint manually
playPauseFab.getDrawable().mutate().setColorFilter(MaterialValueHelper.getPrimaryTextColor(getContext(), ColorUtil.isColorLight(fabColor)), PorterDuff.Mode.SRC_IN);
playPauseFab.setOnClickListener(new PlayPauseButtonOnClickHandler());
playPauseFab.post(new Runnable() {
@Override
@ -215,7 +219,7 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
}
private void updateProgressTextColor() {
int color = ColorUtil.getPrimaryTextColor(getContext(), false);
int color = MaterialValueHelper.getPrimaryTextColor(getContext(), false);
songTotalTime.setTextColor(color);
songCurrentProgress.setTextColor(color);
}
@ -295,7 +299,7 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
}
private void updateProgressSliderTint() {
int color = ColorUtil.getPrimaryTextColor(getContext(), false);
int color = MaterialValueHelper.getPrimaryTextColor(getContext(), false);
progressSlider.getThumb().mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN);
progressSlider.getProgressDrawable().mutate().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.SRC_IN);
}

View file

@ -2,10 +2,12 @@ package com.kabouzeid.gramophone.ui.fragments.player;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.ColorInt;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
@ -19,11 +21,14 @@ import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.TextView;
import com.afollestad.materialdialogs.internal.ThemeSingleton;
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.appthemehelper.util.ATHUtil;
import com.kabouzeid.appthemehelper.util.TintHelper;
import com.kabouzeid.appthemehelper.util.ToolbarContentTintHelper;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
import com.kabouzeid.gramophone.adapter.song.PlayingQueueAdapter;
@ -32,7 +37,6 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
@ -111,7 +115,7 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
});
// for some reason the xml attribute doesn't get applied here.
playingQueueCard.setCardBackgroundColor(ColorUtil.resolveColor(getActivity(), R.attr.cardBackgroundColor));
playingQueueCard.setCardBackgroundColor(ATHUtil.resolveColor(getActivity(), R.attr.cardBackgroundColor));
}
@Override
@ -225,7 +229,9 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
private void updateIsFavorite() {
boolean isFavorite = MusicUtil.isFavorite(getActivity(), MusicPlayerRemote.getCurrentSong());
Drawable favoriteIcon = Util.getTintedDrawable(getActivity(), isFavorite ? R.drawable.ic_favorite_white_24dp : R.drawable.ic_favorite_outline_white_24dp, ViewUtil.getToolbarIconColor(getActivity(), false));
int res = isFavorite ? R.drawable.ic_favorite_white_24dp : R.drawable.ic_favorite_outline_white_24dp;
Drawable favoriteIcon = TintHelper.tintDrawable(ContextCompat.getDrawable(getActivity(), res), ToolbarContentTintHelper.toolbarContentColor(getActivity(), Color.TRANSPARENT));
toolbar.getMenu().findItem(R.id.action_toggle_favorite)
.setIcon(favoriteIcon)
.setTitle(isFavorite ? getString(R.string.action_remove_from_favorites) : getString(R.string.action_add_to_favorites));
@ -347,7 +353,7 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
animatorSet.play(backgroundAnimator);
Animator subHeaderAnimator = ThemeSingleton.get().darkTheme ? null : ViewUtil.createTextColorTransition(fragment.playerQueueSubHeader, fragment.lastColor, newColor);
Animator subHeaderAnimator = ATHUtil.isWindowBackgroundDark(fragment.getActivity()) ? null : ViewUtil.createTextColorTransition(fragment.playerQueueSubHeader, fragment.lastColor, newColor);
if (subHeaderAnimator != null) {
animatorSet.play(subHeaderAnimator);
}
@ -358,8 +364,8 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
@Override
public void animateColorChange(PlayerFragment fragment, int newColor) {
if (ThemeSingleton.get().darkTheme) {
fragment.playerQueueSubHeader.setTextColor(ColorUtil.getSecondaryTextColor(fragment.getActivity(), false));
if (ATHUtil.isWindowBackgroundDark(fragment.getActivity())) {
fragment.playerQueueSubHeader.setTextColor(ThemeStore.textColorSecondary(fragment.getActivity()));
}
}
}
@ -376,7 +382,7 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
currentSongViewHolder.separator.setVisibility(View.VISIBLE);
currentSongViewHolder.shortSeparator.setVisibility(View.GONE);
currentSongViewHolder.image.setScaleType(ImageView.ScaleType.CENTER);
currentSongViewHolder.image.setImageDrawable(Util.getTintedDrawable(fragment.getActivity(), R.drawable.ic_volume_up_white_24dp, ColorUtil.resolveColor(fragment.getActivity(), R.attr.icon_color)));
currentSongViewHolder.image.setImageDrawable(Util.getTintedDrawable(fragment.getActivity(), R.drawable.ic_volume_up_white_24dp, ATHUtil.resolveColor(fragment.getActivity(), R.attr.icon_color, ThemeStore.textColorSecondary(fragment.getActivity()))));
currentSongViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@ -475,8 +481,7 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
fragment.slidingUpPanelLayout.setBackgroundColor(fragment.lastColor);
AnimatorSet animatorSet = createDefaultColorChangeAnimatorSet(fragment, newColor);
animatorSet.play(ViewUtil.createBackgroundColorTransition(fragment.toolbar, fragment.lastColor, newColor))
.with(ViewUtil.createBackgroundColorTransition(fragment.getView().findViewById(R.id.status_bar), ColorUtil.shiftColorDown(fragment.lastColor), ColorUtil.shiftColorDown(newColor)));
animatorSet.play(ViewUtil.createBackgroundColorTransition(fragment.toolbar, fragment.lastColor, newColor));
animatorSet.start();
}
}

View file

@ -1,266 +0,0 @@
package com.kabouzeid.gramophone.util;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.support.annotation.AttrRes;
import android.support.annotation.ColorInt;
import android.support.annotation.FloatRange;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v7.graphics.Palette;
import com.kabouzeid.gramophone.R;
import java.util.Collections;
import java.util.Comparator;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class ColorUtil {
public static final int PALETTE_BITMAP_SIZE = 100;
@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<Palette.Swatch> {
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));
}
}

View file

@ -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()) {

View file

@ -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<Palette.Swatch> {
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;
}
}

View file

@ -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(

View file

@ -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<View> 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);

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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();
}
}
}

View file

@ -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);
}
}
}

View file

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@android:color/black" />
</shape>

View file

@ -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" />
</android.support.design.widget.AppBarLayout>

View file

@ -1,7 +1,9 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:transitionGroup="true"
tools:ignore="UnusedAttribute">
<LinearLayout
android:layout_width="match_parent"

View file

@ -1,10 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/mini_player_height"
android:clickable="true"
android:focusable="false">
android:focusable="false"
android:transitionName="@string/transition_mini_player"
tools:ignore="UnusedAttribute">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"

View file

@ -1,24 +0,0 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="16dip"
android:paddingRight="16dip"
android:paddingTop="16dp"
android:gravity="start|center_vertical"
android:layout_gravity="start|center_vertical"
tools:ignore="UnusedAttribute">
<TextView
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textColor="?colorAccent"
android:fontFamily="@string/font_fontFamily_medium"
android:textStyle="@integer/font_textStyle_medium"
android:textSize="14sp"
android:gravity="start|center_vertical"
android:layout_gravity="start|center_vertical"
android:textAlignment="viewStart" />
</FrameLayout>

View file

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<com.kabouzeid.gramophone.views.ColorView
android:id="@+id/circle"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_gravity="center_vertical|end"
xmlns:android="http://schemas.android.com/apk/res/android" />

View file

@ -1,70 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingEnd="?android:attr/scrollbarSize"
android:paddingRight="?android:attr/scrollbarSize"
tools:ignore="RtlSymmetry,UnusedAttribute"
android:baselineAligned="false">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="12dip"
android:layout_marginEnd="6dip"
android:layout_marginLeft="16dip"
android:layout_marginRight="6dip"
android:layout_marginStart="16dip"
android:layout_marginTop="12dip"
android:layout_weight="1">
<TextView
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:fontFamily="sans-serif"
android:gravity="start"
android:singleLine="true"
android:textAlignment="viewStart"
android:textColor="?android:textColorPrimary"
android:textSize="16sp"
tools:text="Title" />
<TextView
android:id="@android:id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@android:id/title"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignStart="@android:id/title"
android:layout_below="@android:id/title"
android:layout_marginTop="2dp"
android:fontFamily="sans-serif"
android:gravity="start"
android:maxLines="6"
android:textAlignment="viewStart"
android:textColor="?android:textColorSecondary"
android:textSize="14sp"
tools:text="Summary" />
</RelativeLayout>
<!-- Preference should place its actual preference widget here. -->
<LinearLayout
android:id="@android:id/widget_frame"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginStart="10dp"
android:gravity="center_vertical"
android:orientation="vertical" />
</LinearLayout>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<com.kabouzeid.gramophone.views.DynamicCheckBox xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+android:id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false" />

View file

@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="@dimen/scrollbar_width_plus_inset"
android:layout_height="match_parent"
tools:layout_gravity="end">
<View
android:id="@+id/scroll_bar"
android:layout_width="@dimen/scrollbar_width_plus_inset"
android:layout_height="match_parent"
android:layout_gravity="end"
android:alpha="0.3" />
<View
android:id="@+id/scroll_handle"
android:layout_width="@dimen/scrollbar_width_plus_inset"
android:layout_height="48dp"
android:layout_gravity="end" />
</FrameLayout>

View file

@ -1,21 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="what_do_you_want_to_share">ماذا تريد ان تشارك؟</string>
<string name="currently_listening_to_x_by_x">تستمع حاليا الى %1$s ل %2$s</string>
<string name="currently_listening_to_x_by_x">تستمع حاليا إلى %1$s ل %2$s</string>
<string name="the_audio_file">ملف الصوت</string>
<string name="do_you_want_to_set_x_as_ringtone">هل تريد تعيين %1$s كنغمة رنين ؟</string>
<string name="x_has_been_set_as_ringtone">%1$s تم تعيين كنغمة رنين</string>
<string name="action_set_as_ringtone">"تم تعيين النغمة "</string>
<string name="x_has_been_set_as_ringtone">تعيين %1$s كنغمة رنين</string>
<string name="action_set_as_ringtone">تعيين كنغمة رنين</string>
<string name="action_share">مشاركة</string>
<string name="action_settings">"الإعدادات"</string>
<string name="action_about">" عن التطبيق
"</string>
<string name="action_grant">سماح</string>
<string name="action_done">تم</string>
<string name="action_skip">تجاوز</string>
<string name="action_about">عن التطبيق</string>
<string name="action_show_intro">أظهر التعريف</string>
<string name="action_clear_playlist">امسح قائمة التشغيل</string>
<string name="action_playing_queue">قائمة الإنتظار</string>
<string name="action_add_to_favorites">"اضافة الى الاغاني المفضلة "</string>
<string name="action_remove_from_favorites">"ازالة من الاغاني المفضلة "</string>
<string name="action_add_to_favorites">إضافة إلى المفضلة</string>
<string name="action_remove_from_favorites">إزالة من المفضلة</string>
<string name="action_search">بحث</string>
<string name="action_play_next">استمع لاحقاً</string>
<string name="action_play_next">استمع للتالي</string>
<string name="action_play">استمع</string>
<string name="action_add_to_playing_queue">أضف إلى قائمة الإنتظار</string>
<string name="action_remove_from_playing_queue">أزل من قائمة الانتظار</string>
@ -27,7 +30,7 @@
<string name="artists">الفنانون</string>
<string name="songs">الأغاني</string>
<string name="playlists">قوائم التشغيل</string>
<string name="unplayable_file">\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</string>
<string name="unplayable_file">\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</string>
<string name="biography_unavailable">\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</string>
<string name="biography">سيرة ذاتية</string>
<string name="audio_focus_denied">لم يتم منح التطبيق إذن Audio focus</string>
@ -37,118 +40,186 @@
<string name="album_artist">فنان الألبوم</string>
<string name="year">السنة</string>
<string name="track">"المقطع "</string>
<string name="track_hint">"الموسيقى (٢ للموسيقى ٢ أو ٣٠٠٤ للموسيقى ٤)"</string>
<string name="album_or_artist_empty">حقل نص اسم الألبوم أو اسم الفنان فارغ</string>
<string name="track_hint">"مقطع (2 للمقطع 2 أو 3004 لـCD3 للمقطع 4)"</string>
<string name="album_or_artist_empty">حقل اسم الألبوم أو اسم الفنان فارغ</string>
<string name="writing_file_number">تتم كتابة الملف</string>
<string name="saving_changes">يتم حفظ التغييرات...</string>
<string name="label_details">التفاصيل</string>
<string name="label_file_name">إسم الملف</string>
<string name="label_file_name">اسم الملف</string>
<string name="label_file_path">مسار الملف</string>
<string name="label_file_size">الحجم</string>
<string name="label_file_format">نوع الملف</string>
<string name="label_track_length">الطول</string>
<string name="label_bit_rate">معدل البت</string>
<string name="label_track_length">المدة</string>
<string name="label_bit_rate">معدل bit</string>
<string name="label_sampling_rate">معدل أخذ العينات</string>
<string name="action_go_to_artist">إذهب إلى الفنان</string>
<string name="action_go_to_album">إذهب إلى الألبوم</string>
<string name="label_playing_queue">قائمة الإنتظار</string>
<string name="action_go_to_artist">اذهب إلى الفنان</string>
<string name="action_go_to_album">اذهب إلى الألبوم</string>
<string name="label_playing_queue">قائمة الانتظار</string>
<string name="save_as_playlist">حفظ كقائمة تشغيل</string>
<string name="no_results">لا توجد نتائج</string>
<string name="action_re_download_artist_image">تحديث صورة الفنان</string>
<string name="updated_artist_image">تحديث صورة الفنان</string>
<string name="updated_artist_image">تم تحديث صورة الفنان</string>
<string name="could_not_update_artist_image">\u062a\u0639\u0630\u0631 \u062a\u062d\u062f\u064a\u062b \u0635\u0648\u0631\u0629 \u0627\u0644\u0641\u0646\u0627\u0646</string>
<string name="updating">يتم التحديث...</string>
<string name="added_title_to_playing_queue">"تمت الإضافة إلى قائمة الانتظار"</string>
<string name="added_x_titles_to_playing_queue">اضف %1$d الى قائمة الانتطار</string>
<string name="added_x_titles_to_playing_queue">اضف %1$d إلى قائمة الانتطار</string>
<string name="action_remove_from_playlist">حذف من قائمة التشغيل</string>
<string name="action_grid_size">عدد الحقول</string>
<string name="action_grid_size_land">عدد الحقول (في الوضع الأفقي)</string>
<string name="inserted_x_songs_into_playlist_x">أضيفت %1$d أغنية إلى قائمة التشغيل %2$s</string>
<string name="created_playlist_x">تم إنشاء قائمة التشغيل %1$s</string>
<string name="deleted_playlist_x">تم حذف قائمة التشغيل %1$s</string>
<string name="deleted_x_songs">حذف %1$d اغنية</string>
<string name="deleted_x_songs">حذف %1$d أغنية</string>
<string name="could_not_create_playlist">\u0644\u0627 \u064a\u0645\u0643\u0646 \u0625\u0646\u0634\u0627\u0621 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644</string>
<string name="delete_playlist_x"><![CDATA[هل تريد حذف قائمة التشغيل <b> %1$s </b>؟]]></string>
<string name="clear_playlist_x"><![CDATA[\u0647\u0644 \u062a\u0631\u064a\u062f \u062d\u0642\u0627 \u062d\u0630\u0641 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644 <b>%1$s</b> \u061f \u0647\u0630\u0627 \u0644\u0627 \u064a\u0645\u0643\u0646 \u0627\u0644\u062a\u0631\u0627\u062c\u0639 \u0639\u0646\u0647 !!]]></string>
<string name="delete_x_playlists"><![CDATA[هل تريد حذف قائمة التشغيل <b>%1$d</b>؟]]></string>
<string name="delete_x_playlists"><![CDATA[هل تريد حذف قوائم التشغيل <b>%1$d</b>؟]]></string>
<string name="delete_song_x"><![CDATA[هل تريد حذف الأغنية <b> %1$s </b>؟]]></string>
<string name="delete_x_songs"><![CDATA[هل تريد حذف الأغاني <b> %1$d </b>؟]]></string>
<string name="remove_song_x_from_playlist"><![CDATA[هل تريد إزالة أغنية <b>%1$s</b> من قائمة التشغيل؟]]></string>
<string name="remove_x_songs_from_playlist"><![CDATA[هل تريد إزالة <b>%1$d</b> الأغاني من قائمة التشغيل؟]]></string>
<string name="delete_song_title">حذف الأغنية</string>
<string name="delete_songs_title">حذف الأغاني</string>
<string name="remove_song_from_playlist_title">ازيلت الاغنية من قائمة التشغيل</string>
<string name="remove_songs_from_playlist_title">ازيلت الاغناتي من قائمة التشغيل</string>
<string name="remove_song_from_playlist_title">أزيلت الاغنية من قائمة التشغيل</string>
<string name="remove_songs_from_playlist_title">أزيلت الاغنيات من قائمة التشغيل</string>
<string name="rename_playlist_title">إعادة تسمية قائمة التشغيل</string>
<string name="delete_playlist_title">حذف قائمة التشغيل</string>
<string name="delete_playlists_title">احذف قائمة التشغيل</string>
<string name="delete_playlists_title">حذف قوائم التشغيل</string>
<string name="clear_playlist_title">مسح قائمة التشغيل</string>
<string name="add_playlist_title">"إضافة إلى قائمة التشغيل"</string>
<string name="action_shuffle_all">تشغيل عشوائي</string>
<string name="action_shuffle_album">تشغيل الالبوم عشوائيا</string>
<string name="action_shuffle_artist">تشغيل اغاني الفنان عشوائيا</string>
<string name="action_shuffle_all">بعثرة الكل</string>
<string name="action_shuffle_album">بعثرة الألبوم</string>
<string name="action_shuffle_artist">بعثرة مقطوعات الفنان</string>
<string name="action_shuffle_playlist">تشغيل قائمة التشغيل عشوائيا</string>
<string name="action_clear_playing_queue">مسح قوائم الانتظار</string>
<string name="last_opened">آخر ما تم فتحه</string>
<string name="light_theme_name">فاتح</string>
<string name="dark_theme_name">داكن</string>
<string name="black_theme_name">أسود (شاشات AMOLED)</string>
<string name="always">دائماً</string>
<string name="only_on_wifi">فقط عبر Wi-Fi</string>
<string name="never">لا للأبد</string>
<string name="equalizer">المعادل</string>
<string name="pref_header_colors">الالوان</string>
<string name="pref_header_now_playing_screen">واجهة قائمة التشغيل</string>
<string name="pref_header_colors">الألوان</string>
<string name="pref_header_now_playing_screen">تستمع إليه الآن</string>
<string name="pref_title_general_theme">المنظر العام</string>
<string name="pref_header_audio">الصوت</string>
<string name="pref_header_general">عام</string>
<string name="pref_header_images">الصور</string>
<string name="pref_header_lockscreen">قفل الشاشة</string>
<string name="pref_title_navigation_bar">شريط تنقل ملون</string>
<string name="pref_title_set_default_start_page">ضبط صفحة البدء</string>
<string name="pref_title_album_art_on_lockscreen">"صورة الالبوم في قفل الشاشة "</string>
<string name="pref_title_colored_notification">اشعار ملون</string>
<string name="pref_title_set_default_start_page">صفحة البدء</string>
<string name="pref_title_album_art_on_lockscreen">أظهر صورة الألبوم</string>
<string name="pref_title_auto_download_artist_images">حمل صور الفنانين تلقائياً</string>
<string name="pref_title_blurred_album_art">تغييم صورة الألبوم</string>
<string name="pref_title_colored_notification">إشعار ملون</string>
<string name="pref_title_ignore_media_store_artwork">تجاهل صور متاجر الوسائط</string>
<string name="pref_title_gapless_playback">تشغيل مختصر</string>
<string name="pref_title_force_square_album_art">اجبار صور الالبوم على ان تكون مربعة</string>
<string name="pref_title_force_square_album_art">صور ألبوم مربعة</string>
<string name="pref_title_opaque_toolbar_now_playing">شريط الادوات معتم</string>
<string name="pref_title_opaque_statusbar_now_playing">شريط الاشارات معتم</string>
<string name="pref_title_larger_title_box_now_playing">شريط اكبر للعنوان</string>
<string name="pref_title_alternative_progress_slider_now_playing">بديل لشريط التحكم</string>
<string name="pref_title_playback_controller_card_now_playing">اظهار شريط تحت شريط التحكم</string>
<string name="pref_title_larger_title_box_now_playing">شريط أكبر للعنوان</string>
<string name="pref_title_alternative_progress_slider_now_playing">شريط تحكم بديل</string>
<string name="pref_title_playback_controller_card_now_playing">أظهر بطاقة تحت شريط التحكم</string>
<string name="pref_title_colored_playback_controls_now_playing">شريط تشغيل ملون</string>
<string name="no_equalizer">لا يوجد معدل صوت</string>
<string name="no_audio_ID">"لا يوجد audio id, شغل شيئا وحاول مرة أخرى."</string>
<string name="no_audio_ID">"شغل مقطعاً، ثم حاول مجدداً"</string>
<string name="delete_action">حذف</string>
<string name="clear_action">مسح</string>
<string name="remove_action">حذف</string>
<string name="rename_action">إعادة التسمية</string>
<string name="create_action">انشاء</string>
<string name="x_selected">%1$d المحددة</string>
<string name="select">إختيار</string>
<string name="default_str">إفتراضي</string>
<string name="create_action">إنشاء</string>
<string name="x_selected">%1$d محددة</string>
<string name="select">اختيار</string>
<string name="default_str">افتراضي</string>
<string name="primary_color">اللون الأساسي</string>
<string name="accent_color">اللون الثانوي</string>
<string name="primary_color_desc">تحديد الأزرق النيلي كلون ثيم اساسي.</string>
<string name="accent_color_desc">تحديد الوردي كلون ثانوي.</string>
<string name="primary_color_desc">تحديد لون أساسي. الأزرق النيلي هو اللون الافتراضي.</string>
<string name="accent_color_desc">تحديد اللون الثانوي. الوردي هو اللون الثانوي الافتراضي.</string>
<string name="update_image">تحديث الصورة</string>
<string name="playlist_empty_text">قائمة التشغيل فارغة</string>
<string name="no_playlists">لا توجد قوائم تشغيل</string>
<string name="no_albums">لا توجد ألبومات</string>
<string name="no_songs">لا اغاني</string>
<string name="no_artists">لا فنانين</string>
<string name="no_songs">لا توجد أغاني</string>
<string name="no_artists">لا يوجد فنانون</string>
<string name="empty">فارغ</string>
<string name="playlist_name_empty">اسم قائمة التشغيل</string>
<string name="song">الأغنية</string>
<string name="pref_only_lollipop">"متوفر في نظام التشغيل Lollipop."</string>
<string name="pref_summary_album_art_on_lockscreen">صورة الالبوم تظهر في شاشة القفل. قد تضطر إلى إعادة تشغيل البرنامج من أجل ان تصبح التغييرات نافذة المفعول.</string>
<string name="pref_only_lollipop">"متوفر فقط في نظام التشغيل Lollipop."</string>
<string name="pref_summary_album_art_on_lockscreen">تستخدم ألبوم الأغاني الحالية كخلفية لشاشة القفل</string>
<string name="pref_summary_blurred_album_art">تغييم صورة الألبوم في شاشة القفل. قد تحدث مشاكل مع الواجهات المبوبة و تطبييقات الطرف الثالث</string>
<string name="pref_summary_colored_notification">"\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."</string>
<string name="pref_summary_gapless_playback">"ازالة المقاطع التي الصامتة بين الاغنيتين. هذا يمكن ان يسبب مشاكل في التشغيل في بعض الاجهرة"</string>
<string name="pref_summary_force_square_album_art">صورة الالبوم في قائمة تشغيل تكون مجبرة على شكل المربع</string>
<string name="pref_summary_opaque_toolbar_now_playing">شريط الاشارات معتم ولا يغطي صورة الالبوم</string>
<string name="pref_summary_opaque_statusbar_now_playing">شريط الاشارات معتم ولا يغطي صورة الالبوم</string>
<string name="pref_summary_larger_title_box_now_playing">الشريط الذي يكون اسفل صورة الالبومالذي يحتوي على اسم الاغنية والفنان يصبح اكبر من حيث الارتفاع</string>
<string name="pref_summary_gapless_playback">"إزالة المقاطع التي الصامتة بين الاغنيتين. هذا يمكن ان يسبب مشاكل في التشغيل في بعض الاجهرة"</string>
<string name="pref_summary_force_square_album_art">صورة الالبوم في قائمة تشغيل تجبر على أن تكون مربعة</string>
<string name="pref_summary_opaque_toolbar_now_playing">تلون شريط الأدوات</string>
<string name="pref_summary_opaque_statusbar_now_playing">تلون شريط الإشعارات</string>
<string name="pref_summary_larger_title_box_now_playing">مربع العنوان يصبح مرتفعاً</string>
<string name="pref_summary_alternative_progress_slider_now_playing">استخدام شريط التحكم الذي لايغطي صورة الالبوم بدلا من الشريط الافتراضي</string>
<string name="pref_summary_playback_controller_card_now_playing">اظهار شريط تحت وحدة التحكم بالتشغيل يحتوي على الازرار (تشغيل/ايقاف/التالي الخ.)</string>
<string name="pref_summary_colored_navigation_bar">في أي مشهد يتم تلوين شريط التنقل</string>
<string name="could_not_download_album_cover">"\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 ."</string>
<string name="search_hint">البحث في المكتبة...</string>
<string name="rescanning_media">إعادة تفحص الملفات...</string>
<string name="pref_summary_playback_controller_card_now_playing">اظهار بطاقة تحت وحدة التحكم بالتشغيل يحتوي على الازرار (تشغيل/ايقاف/التالي الخ.)</string>
<string name="pref_summary_ignore_media_store_artwork">قد يرفع جودة صورة الألبوم ولكن يبطء من سرعة تحميلها. فعلها فقط إذا تواجه مشكلة في جودة صور الألبوم</string>
<string name="pref_summary_colored_playback_controls_now_playing">\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</string>
<string name="pref_summary_colored_navigation_bar">تلوين شريط التنقل باللون الأساسي</string>
<string name="could_not_download_album_cover">"\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 ."</string>
<string name="search_hint">إبحث في مكتبتك...</string>
<string name="rescanning_media">إعادة تفحص الوسائط...</string>
<string name="favorites">المفضلة</string>
<string name="last_added">اخرما اضيف</string>
<string name="my_top_tracks">افضل الاغاني</string>
<string name="remove_cover">ازالة الغلاف</string>
<string name="last_added">آخر ما تمت إضافته</string>
<string name="history">السجل</string>
<string name="my_top_tracks">أفضل الأغاني</string>
<string name="remove_cover">إزالة الغلاف</string>
<string name="download_from_last_fm">التنزيل من Last.fm</string>
<string name="pick_from_local_storage">اختيار من التخزين الداخلي</string>
<string name="web_search">البحث في الويب</string>
<string name="action_sleep_timer">مؤقت النوم</string>
<string name="action_set">ضبط</string>
<string name="cancel_current_timer">إلغاء المؤقت الحالي</string>
<string name="sleep_timer_canceled">تم إلقاء مؤقت النوم</string>
<string name="sleep_timer_set">تم ضبط مؤقت النوم لـ %d دقيقة من الآن.</string>
<string name="action_new_playlist">قائمة تشغيل جديدة ...</string>
<string name="new_playlist_title">قائمة تشغيل جديدة</string>
<string name="colored_footers">هوامش ملونة</string>
<string name="special_thanks_to">شكر خاص إلى</string>
<string name="changelog">سجل التغييرات</string>
<string name="licenses">الرخص</string>
<string name="permissions_denied">أذونات مرفوضة</string>
<string name="permission_external_storage_denied">تم رفض الإذن للوصول إلى الذاكرة الخارجية</string>
<string name="back">الخلف</string>
<string name="support_development">دعم التطوير</string>
<string name="thank_you">شكراً لك!</string>
<string name="restored_previous_purchases">استعادة المشتريات السابقة.</string>
<string name="play_store_illustration_by">توضيح سوق بلاي بواسطة</string>
<string name="version">النسخة</string>
<string name="application">التطبيق</string>
<string name="author">المؤلف</string>
<string name="add_to_google_plus_circles">أضف إلى دوائر جوجل +</string>
<string name="follow_on_twitter">تابع في تويتر</string>
<string name="fork_on_git_hub">Fork عن طريق Github</string>
<string name="visit_website">زر موقعنا</string>
<string name="report_bugs">أبلغ عن وجود مشكلة</string>
<string name="report_bugs_summary">أبلغ عن وجود مشاكل أو طلب ميزات جديدة</string>
<string name="join_community">انضم لمجموعة جوجل +</string>
<string name="join_community_summary">إذا كنت تحتاج إلى مساعدة أو لديك أسئلة؛ مجتمع Phonograph في جوجل+ هو المكان المناسب لطرحها</string>
<string name="translate">ترجمة</string>
<string name="translate_summary">ساعدنا في ترجمة Phonograph إلى لغتك الأم</string>
<string name="rate_on_google_play">قيّم</string>
<string name="rate_on_google_play_summary">اترك تقييماً إيجابياً في متجر جوجل بلاي إذا أعجبك التطبيق.</string>
<string name="donate">تبرع لنا</string>
<string name="donate_summary">إذا كنت ترى أنني أستحق أن أحصل على جزاء مقابل عملي، يمكنك أن تكافئني ببضعة دولارات هنا.</string>
<string name="aidan_follestad_summary">من أجل محرك السمات وميزات جميلة أخرى</string>
<string name="michael_cook_summary">من أجل شعار التطبيق المطابق لفلسفة ماتيريال ديزاين</string>
<string name="maarten_corpel_summary">من أجل وضع توضيحات البرنامج المتواجدة على المتجر وأيضاً صورة الألبوم الإفتراضية</string>
<string name="aleksandar_tesic_summary">لمساعدتي في تصميم البرنامج</string>
<string name="website">الموقع</string>
<string name="loading_products">يتم تحميل المنتجات...</string>
<string name="up_next">التالي</string>
<string name="pref_title_now_playing_layout">تصميم قائمة \"تستمع الآن\"</string>
<string name="intro_label">المقدمة</string>
<string name="press_back_again_to_exit_intro">اضغط زر الخلف مجدداً لتجاوز المقدمة</string>
<string name="welcome_to_phonograph">مرحباً في Phonograph، مشغل موسيقى خفيف وأنيق على منصة أندرويد.</string>
<string name="label_storage">الذاكرة.</string>
<string name="open_playing_queue_instruction">اسحب البطاقة في شاشة \"تستمع الآن\" لإظهار جميع المقطوعات على قائمة الانتظار</string>
<string name="rearrange_playing_queue_instruction">إعادة ترتيب القائمة بواسطة سحب المقطوعة من رقمها</string>
<string name="storage_permission_explaination">صلاحية الوصول إلى الذاكرة مطلوبة لجلب جميع مقاطع الصوت تلقائياً من الذاكرة</string>
<string name="library">المكتبة</string>
<string name="folders">الملفات</string>
</resources>

View file

@ -1,31 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="what_do_you_want_to_share">Τι θα θέλατε να μοιραστείτε;</string>
<string name="currently_listening_to_x_by_x">Ακούτε το %1$s από %2$s</string>
<string name="the_audio_file">Το αρχείο ήχου</string>
<string name="do_you_want_to_set_x_as_ringtone">Θα θέλατε να θέσετε το %1$s ως ήχο κλήσης σας;</string>
<string name="x_has_been_set_as_ringtone">Θέστε το %1$s ως τον ήχο κλήσης σας.</string>
<string name="action_set_as_ringtone">Ορισμός ως ήχος κλήσης</string>
<string name="action_share">Μοιραστείτε</string>
<string name="action_settings">"Ρυθμίσεις "</string>
<string name="action_grant">Χορήγησε</string>
<string name="action_done">Έγινε</string>
<string name="action_skip">Παράβλεψη</string>
<string name="action_about">"Σχετικά "</string>
<string name="action_show_intro">Εμφάνιση καλωσορίσματος</string>
<string name="action_clear_playlist">Εκκαθάριση λίστας</string>
<string name="action_playing_queue">Σειρά τραγουδιών</string>
<string name="action_add_to_favorites">Προσθήκη στα αγαπημένα</string>
<string name="action_remove_from_favorites">Διαγραφή από τα αγαπημένα</string>
<string name="action_search">Αναζήτηση</string>
<string name="action_play_next">Αναπαραγωγή επόμενου</string>
<string name="action_play_next">Επόμενο</string>
<string name="action_play">Αναπαραγωγή</string>
<string name="action_add_to_playing_queue">Προσθήκη στη σειρά τραγουδιών</string>
<string name="action_remove_from_playing_queue">Διαγραφή από την σειρά τραγουδιών</string>
<string name="action_add_to_playlist">Προσθήκη στην λίστα αναπαραγωγής</string>
<string name="action_tag_editor">Επεξεργασία ετικετών</string>
<string name="action_delete_from_device">Οριστική διαγραφή</string>
<string name="action_details">Λεπτομέρειες</string>
<string name="albums">Δίσκοι</string>
<string name="albums">Άλμπουμ</string>
<string name="artists">Καλλιτέχνες</string>
<string name="songs">Τραγούδια</string>
<string name="playlists">Λίστες αναπαραγωγής</string>
<string name="unplayable_file">\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</string>
<string name="biography_unavailable">\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</string>
<string name="biography">Βιογραφία</string>
<string name="audio_focus_denied">Δεν μπορούμε να φέρουμε τον ήχο στο προσκήνιο.</string>
<string name="album">Δίσκος</string>
<string name="audio_focus_denied">Έγινε άρνηση εστίασης ήχου</string>
<string name="album">Άλμπουμ</string>
<string name="artist">Καλλιτέχνης</string>
<string name="genre">Είδος</string>
<string name="album_artist">Καλλιτέχνης του δίσκου</string>
<string name="album_artist">Καλλιτέχνης του άλμπουμ</string>
<string name="year">Έτος</string>
<string name="track">Κομμάτι</string>
<string name="track_hint">"Κομμάτι (2 για κομμάτι 2 ή 3004 από CD3 κομμάτι 4)"</string>
<string name="album_or_artist_empty">Το πεδιο \"τίτλος του δίσκου\" ή \"καλλιτέχνης του δίσκου\" είναι άδειο</string>
<string name="album_or_artist_empty">Το πεδίο \"Τίτλος\" ή \"Καλλιτέχνης\" είναι άδειο</string>
<string name="writing_file_number">Γίνεται εγγραφή</string>
<string name="saving_changes">Γίνεται αποθήκευση αλλαγών...</string>
<string name="label_details">Λεπτομέρειες</string>
@ -37,17 +53,26 @@
<string name="label_bit_rate">Ποιότητα</string>
<string name="label_sampling_rate">Ρυθμός δειγματοληψίας</string>
<string name="action_go_to_artist">Πήγαινε στον καλλιτέχνη</string>
<string name="action_go_to_album">Πήγαινε στο δίσκο</string>
<string name="label_playing_queue">Σειρά αναπαραγωγής</string>
<string name="save_as_playlist">Αποθήκευση ως λίστα</string>
<string name="action_go_to_album">Πήγαινε στο άλμπουμ</string>
<string name="label_playing_queue">Ουρά αναπαραγωγής</string>
<string name="save_as_playlist">Αποθήκευση ως λίστα αναπαραγωγής</string>
<string name="no_results">Κανένα αποτέλεσμα</string>
<string name="action_re_download_artist_image">Ανανέωση εικόνας καλλιτέχνη</string>
<string name="updated_artist_image">Ανανεώθηκε το πορτρέτο του καλλιτέχνη</string>
<string name="could_not_update_artist_image">\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.</string>
<string name="updating">Γίνεται ανανέωση...</string>
<string name="added_title_to_playing_queue">"Προστέθηκε ένας τίτλος στη σειρά αναπαραγωγής"</string>
<string name="added_title_to_playing_queue">"Προστέθηκε ένας τίτλος στην ουρά αναπαραγωγής"</string>
<string name="added_x_titles_to_playing_queue">Προστέθηκαν %1$d εικονίδια στην σειρά αναπαραγωγής</string>
<string name="action_remove_from_playlist">Αφαίρεση από την λίστα</string>
<string name="action_grid_size">Μέγεθος πλέγματος</string>
<string name="action_grid_size_land">Μέγεθος πλέγματος</string>
<string name="inserted_x_songs_into_playlist_x">Προστέθηκαν %1$d τραγούδια στην λίστα %2$s.</string>
<string name="created_playlist_x">Δημιουργήθηκε η λίστα αναπαραγωγής %1$s</string>
<string name="deleted_playlist_x">Διεγράφη η λίστα αναπαραγωγής %1$s</string>
<string name="delete_playlist_x"><![CDATA[Θέλετε να διαγράψετε τη λίστα αναπαραγωγής <b>%1$s</b>;]]></string>
<string name="deleted_x_songs">Διαγράφηκαν %1$d τραγούδια.</string>
<string name="could_not_create_playlist">\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</string>
<string name="delete_playlist_x"><![CDATA[Διαγραφή της λίστας <b>%1$s</b>;]]></string>
<string name="clear_playlist_x"><![CDATA[\u0395\u03ba\u03ba\u03b1\u03b8\u03ac\u03c1\u03b9\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03bb\u03af\u03c3\u03c4\u03b1\u03c2 <b>%1$s</b> ; (\u039c\u03b7 \u03b1\u03bd\u03b1\u03c3\u03c4\u03c1\u03ad\u03c8\u03b9\u03bc\u03bf!)]]></string>
<string name="delete_x_playlists"><![CDATA[
Θα θέλατε να διαγράψετε <b>%1$d</b> λίστες αναπαραγωγής;
]]></string>
@ -55,23 +80,56 @@
<string name="delete_x_songs"><![CDATA[Θέλετε να διαγράψετε <b>%1$d</b> τραγούδια;]]></string>
<string name="delete_song_title">Διαγραφή τραγουδιού</string>
<string name="delete_songs_title">Διαγραφή τραγουδιών</string>
<string name="remove_song_from_playlist_title">Διαγραφή από την λίστα</string>
<string name="remove_songs_from_playlist_title">Διαγραφή τραγουδιών από την λίστα</string>
<string name="rename_playlist_title">Μετονομασία λίστας αναπαραγωγής</string>
<string name="delete_playlist_title">Διαγραφή λίστας αναπαραγωγής</string>
<string name="delete_playlists_title">Διαγραφή λιστών αναπαραγωγής</string>
<string name="clear_playlist_title">Εκκαθάριση λίστας</string>
<string name="add_playlist_title">"Προσθήκη στη λίστα αναπαραγωγής"</string>
<string name="last_opened">Τελευταίο άνοιγμα</string>
<string name="action_shuffle_all">Τυχαία τραγούδια</string>
<string name="action_shuffle_album">Τυχαίο άλμπουμ</string>
<string name="action_shuffle_artist">Τυχαίος καλλιτέχνης</string>
<string name="action_shuffle_playlist">Τυχαία λίστα</string>
<string name="action_clear_playing_queue">Εκκαθάριση της λίστας αναπαραγωγής</string>
<string name="last_opened">Τελευταίο</string>
<string name="light_theme_name">Ανοιχτό</string>
<string name="dark_theme_name">Σκούρο</string>
<string name="equalizer">Εξισωτής</string>
<string name="black_theme_name">Μαύρο (AMOLED οθόνη)</string>
<string name="always">Πάντα</string>
<string name="only_on_wifi">Μόνο σε Wi-Fi</string>
<string name="never">Ποτέ</string>
<string name="equalizer">Ισοσταθμιστής</string>
<string name="pref_header_colors">Χρώματα</string>
<string name="pref_header_now_playing_screen">Τώρα</string>
<string name="pref_title_general_theme">Γενικό θέμα</string>
<string name="pref_header_audio">Ήχος</string>
<string name="pref_header_general">Γενικά</string>
<string name="pref_header_images">Εικόνες</string>
<string name="pref_header_lockscreen">Οθόνη κλειδώματος</string>
<string name="pref_title_navigation_bar">Έγχρωμη μπάρα πλοήγησης</string>
<string name="pref_title_set_default_start_page">Αρχική σελίδα</string>
<string name="pref_title_album_art_on_lockscreen">Εμφάνιση album art</string>
<string name="pref_title_auto_download_artist_images">Αυτόματο κατέβασμα πορτρέτων καλλιτεχνών</string>
<string name="pref_title_blurred_album_art">Θάμπωμα πορτρέτων καλλιτεχνών</string>
<string name="pref_title_colored_notification">Χρωματιστή πλοήγηση</string>
<string name="pref_title_ignore_media_store_artwork">Παράληψη των album art στην SD</string>
<string name="pref_title_gapless_playback">Εναλλαγή χωρίς παύση</string>
<string name="pref_title_force_square_album_art">Τετράγωνο album art</string>
<string name="pref_title_opaque_toolbar_now_playing">\"Μουντή\" Εργαλιοθήκη</string>
<string name="pref_title_opaque_statusbar_now_playing">\"Μουντή\" Γραμμή ειδοποιήσεων</string>
<string name="pref_title_larger_title_box_now_playing">Μεγαλύτερος τίτλος</string>
<string name="pref_title_alternative_progress_slider_now_playing">Εναλακτικός χρονοδείκτης</string>
<string name="pref_title_playback_controller_card_now_playing">Εμφάνηση καρτέλας πίσω από τα κουμπιά αναπαραγωγής</string>
<string name="pref_title_colored_playback_controls_now_playing">Χρωματιστά κουμπιά αναπαραγωγής</string>
<string name="no_equalizer">Δε βρέθηκε ισοσταθμιστής</string>
<string name="no_audio_ID">"Δε βρέθηκε ήχος, αναπαράξτε κάτι και δοκιμάστε ξανά."</string>
<string name="delete_action">Διαγραφή</string>
<string name="clear_action">Εκκαθάρηση</string>
<string name="remove_action">Αφαίρεση</string>
<string name="rename_action">Μετονομασία</string>
<string name="create_action">Δημιουργία</string>
<string name="x_selected">Επιλέχθηκαν %1$d</string>
<string name="select">Επιλογή</string>
<string name="default_str">Προεπιλογή</string>
<string name="primary_color">Πρωτεύον χρώμα</string>
@ -79,11 +137,20 @@
<string name="primary_color_desc">Το πρωτεύον χρώμα θέματος είναι λουλακί.</string>
<string name="accent_color_desc">Το χρώμα των χαρακτήρων του θέματος είναι ροζ.</string>
<string name="update_image">Ανανέωση εικόνας</string>
<string name="playlist_empty_text">Αυτή η λίστα είναι άδεια</string>
<string name="playlist_empty_text">Άδεια λίστα αναπαραγωγής</string>
<string name="no_playlists">Καμία λίστα</string>
<string name="no_albums">Δεν υπάρχουν άλμπουμ</string>
<string name="no_songs">Δεν υπάρχουν τραγούδια</string>
<string name="no_artists">Δεν υπάρχουν καλλιτέχνες</string>
<string name="empty">Κενό</string>
<string name="playlist_name_empty">Όνομα λίστας</string>
<string name="song">Τραγούδι</string>
<string name="pref_only_lollipop">"Διαθέσιμο μόνο σε Lollipop."</string>
<string name="pref_summary_colored_navigation_bar">Σε ποιές προβολές θα χρωματίζεται η μπάρα πλοήγησης.</string>
<string name="pref_only_lollipop">"Διαθέσιμο μόνο σε (Android) Lollipop."</string>
<string name="pref_summary_album_art_on_lockscreen">Εμφάνιση του album art στην οθόνη κλειδώματος.</string>
<string name="pref_summary_blurred_album_art">Εμφανίζει,θωριασμένα, το album art στην οθόνη κλειδώματος.Μπορεί να δημιουργίσει πρόβλημα με εφαρμογές Τρίτων.</string>
<string name="pref_summary_colored_notification">"\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"</string>
<string name="pref_summary_gapless_playback">"Μπορεί να δημιουργίσει θέματα αναπαραγωγής σε μερικές συσκευές."</string>
<string name="pref_summary_colored_navigation_bar">Χρωματίζει την μπάρα πλοήγησης στο πρωτεύον χρώμα</string>
<string name="search_hint">Αναζήτηση στη βιβλιοθήκη...</string>
<string name="rescanning_media">Σάρωση αρχείων πολυμέσων...</string>
<string name="new_playlist_title">Νέα λίστα αναπαραγωγής</string>

View file

@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="what_do_you_want_to_share">¿Qué quieres compartir?</string>
<string name="currently_listening_to_x_by_x">Reproduciendo %1$s de %2$s</string>
<string name="currently_listening_to_x_by_x">Estás escuchando %1$s de %2$s</string>
<string name="the_audio_file">El archivo de audio</string>
<string name="do_you_want_to_set_x_as_ringtone">¿Quieres establecer %1$s como tono de llamada?</string>
<string name="x_has_been_set_as_ringtone">%1$s se ha establecido como tono de llamada.</string>
<string name="do_you_want_to_set_x_as_ringtone">¿Te gustaría establecer %1$s como tono de llamada?</string>
<string name="x_has_been_set_as_ringtone">%1$s se estableció como tono de llamada</string>
<string name="action_set_as_ringtone">Establecer como tono de llamada</string>
<string name="action_share">Compartir</string>
<string name="action_settings">"Ajustes"</string>
<string name="action_grant">Otorgar</string>
<string name="action_done">Hecho</string>
<string name="action_skip">Saltar</string>
<string name="action_skip">Omitir</string>
<string name="action_about">Acerca de</string>
<string name="action_show_intro">Mostrar introducción</string>
<string name="action_clear_playlist">Limpiar lista de reproducción</string>
@ -23,7 +23,7 @@
<string name="action_add_to_playing_queue">Añadir a cola de reproducción</string>
<string name="action_remove_from_playing_queue">Eliminar de la cola de reproducción</string>
<string name="action_add_to_playlist">Añadir a la lista de reproducción...</string>
<string name="action_tag_editor">Editor de etiquetas</string>
<string name="action_tag_editor">Editor de información</string>
<string name="action_delete_from_device">Eliminar del dispositivo</string>
<string name="action_details">Detalles</string>
<string name="albums">Álbumes</string>
@ -42,7 +42,7 @@
<string name="track">Pista</string>
<string name="track_hint">"Pista (2 para pista 2 o 3004 para CD3 pista 4)"</string>
<string name="album_or_artist_empty">El título o artista está vacío.</string>
<string name="writing_file_number">Escribiendo archivo...</string>
<string name="writing_file_number">Editando archivo</string>
<string name="saving_changes">Guardando cambios...</string>
<string name="label_details">Detalles</string>
<string name="label_file_name">Nombre del archivo</string>

View file

@ -1,31 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="what_do_you_want_to_share">Mitä sinä haluat jakaa?</string>
<string name="currently_listening_to_x_by_x">Kuunnellaan parhaillaan kappaletta {%1$s} artistilta {%2$s}.</string>
<string name="the_audio_file">Äänitiedosto</string>
<string name="do_you_want_to_set_x_as_ringtone">Haluatko asettaa kappaleen {%1$s} soittoääneksi?</string>
<string name="x_has_been_set_as_ringtone">Asetettiin {%1$s} soittoääneksesi.</string>
<string name="action_set_as_ringtone">Aseta soittoääneksi</string>
<string name="action_share">Jaa</string>
<string name="action_settings">"Asetukset"</string>
<string name="action_grant">Myönnä</string>
<string name="action_done">Valmis</string>
<string name="action_skip">Ohita</string>
<string name="action_about">Tietoja</string>
<string name="action_show_intro">Näytä intro</string>
<string name="action_clear_playlist">Tyhjennä soittolista</string>
<string name="action_playing_queue">Toistojono</string>
<string name="action_add_to_favorites">Lisää suosikkeihin</string>
<string name="action_remove_from_favorites">Poista suosikeista</string>
<string name="action_search">Etsi</string>
<string name="action_play_next">Toista seuraavaksi</string>
<string name="action_play">Toista</string>
<string name="action_add_to_playing_queue">Lisää toistojonoon</string>
<string name="action_remove_from_playing_queue">Poista jonosta</string>
<string name="action_add_to_playlist">Lisää soittolistaan</string>
<string name="action_remove_from_playing_queue">Poista toistojonosta</string>
<string name="action_add_to_playlist">Lisää soittolistaan...</string>
<string name="action_tag_editor">Tagieditori</string>
<string name="action_delete_from_device">Poista laitteesta</string>
<string name="action_details">Yksityiskohdat</string>
<string name="albums">Albumit</string>
<string name="artists">Artistit</string>
<string name="songs">Kappaleet</string>
<string name="playlists">Soittolistat</string>
<string name="unplayable_file">Virhe toistettaessa kappaletta</string>
<string name="biography_unavailable">Biogtagiaa ei l\u00f6ytynyt t\u00e4lle artistille</string>
<string name="biography">Biografia</string>
<string name="audio_focus_denied">Ääntä ei voitu toistaa</string>
<string name="album">Albumit</string>
<string name="artist">Artistit</string>
<string name="genre">Tyylit</string>
<string name="unplayable_file">Virhe toistettaessa kappaletta.</string>
<string name="biography_unavailable">El\u00e4m\u00e4nkertaa ei l\u00f6ytynyt t\u00e4lle artistille.</string>
<string name="biography">Elämänkerta</string>
<string name="audio_focus_denied">Ääntä ei voitu toistaa.</string>
<string name="album">Albumi</string>
<string name="artist">Artisti</string>
<string name="genre">Tyylilajit</string>
<string name="album_artist">Albumin artisti</string>
<string name="year">Vuosi</string>
<string name="track">Kappale</string>
<string name="track_hint">"Kappale (2 kappale 2 tai 3004 CD3 kappale 4)"</string>
<string name="album_or_artist_empty">Artistialbumin nimi tai albumin artisti -kenttä on tyhjä</string>
<string name="track">Raita</string>
<string name="track_hint">"Raita(2 raidalle 2 tai 3004 CD3 raidalle 4)"</string>
<string name="album_or_artist_empty">Nimi tai artisti-kenttä on tyhjä.</string>
<string name="writing_file_number">Tiedostoa tallennetaan</string>
<string name="saving_changes">Tallennetaan muutokset...</string>
<string name="label_details">Yksityiskohdat</string>
@ -35,29 +51,175 @@
<string name="label_file_format">Tyyppi</string>
<string name="label_track_length">Pituus</string>
<string name="label_bit_rate">Bittinopeus</string>
<string name="label_sampling_rate">Näytteenottotaajuus</string>
<string name="label_sampling_rate">Samplausnopeus</string>
<string name="action_go_to_artist">Näytä artisti</string>
<string name="action_go_to_album">Näytä albumi</string>
<string name="label_playing_queue">Toistojono</string>
<string name="save_as_playlist">Tallenna soittolistana</string>
<string name="no_results">Ei hakutulosta</string>
<string name="action_re_download_artist_image">Päivitä artistin kuva</string>
<string name="updated_artist_image">Artistin kuva päivitetty.</string>
<string name="could_not_update_artist_image">Artistin kuvaa ei voitu p\u00e4ivitt\u00e4\u00e4.</string>
<string name="updating">Päivitetään...</string>
<string name="added_title_to_playing_queue">"Kappale lisätty jonoon"</string>
<string name="added_x_titles_to_playing_queue">{%1$d} kappaletta lisättiin jonoon</string>
<string name="created_playlist_x">Soittolista {%1$s} luotu</string>
<string name="deleted_playlist_x">Soittolista {%1$s} poistettu</string>
<string name="added_title_to_playing_queue">"Yksi kappale lisätty toistojonoon."</string>
<string name="added_x_titles_to_playing_queue">{%1$d} kappaletta lisättiin toistojonoon</string>
<string name="action_remove_from_playlist">Poista soittolistasta</string>
<string name="action_grid_size">Ruudukon koko</string>
<string name="action_grid_size_land">Ruudukon koko (vaaka)</string>
<string name="inserted_x_songs_into_playlist_x">Lisätty {%1$d} kappaletta soittolistaan {%2$s}.</string>
<string name="created_playlist_x">Soittolista {%1$s} luotu.</string>
<string name="deleted_playlist_x">Soittolista {%1$s} poistettu.</string>
<string name="deleted_x_songs">Poistettiin {%1$d} kappaletta.</string>
<string name="could_not_create_playlist">Soittolistan luominen ep\u00e4onnistui.</string>
<string name="delete_playlist_x"><![CDATA[Haluatko poistaa soittolistan {<b>}{%1$s}{</b>}?]]></string>
<string name="clear_playlist_x"><![CDATA[Haluatko tyhjent\u00e4\u00e4 soittolistan {<b>}{%1$s}{</b>}? T\u00e4t\u00e4 toimintoa ei voi perua!]]></string>
<string name="delete_x_playlists"><![CDATA[Haluatko poistaa {<b>}{%1$d}{</b>} soittolistaa?]]></string>
<string name="delete_song_x"><![CDATA[Haluatko poistaa kappaleen {<b>}{%1$s}{</b>}?]]></string>
<string name="delete_x_songs"><![CDATA[Haluatko poistaa {<b>}{%1$d}{</b>} kappaletta?]]></string>
<string name="delete_song_title">Poista Kappale</string>
<string name="delete_songs_title">Poista Kappaleet</string>
<string name="rename_playlist_title">Nimeä Uudelleen Soittolista</string>
<string name="delete_playlist_title">Poista Soittolista</string>
<string name="add_playlist_title">"Lisää Soittolistaan"</string>
<string name="remove_song_x_from_playlist"><![CDATA[Haluatko poistaa kappaleen {<b>}{%1$s}{</b>} soittolistasta?]]></string>
<string name="remove_x_songs_from_playlist"><![CDATA[Haluatko poistaa {<b>}{%1$d}{</b>} kappaletta soittolistasta?]]></string>
<string name="delete_song_title">Poista kappale</string>
<string name="delete_songs_title">Poista kappaleet</string>
<string name="remove_song_from_playlist_title">Poista kappale soittolistasta</string>
<string name="remove_songs_from_playlist_title">Poista kappaleita soittolistasta</string>
<string name="rename_playlist_title">Nimeä soittolista uudelleen</string>
<string name="delete_playlist_title">Poista soittolista</string>
<string name="delete_playlists_title">Poista soittolistat</string>
<string name="clear_playlist_title">Tyhjennä soittolistat</string>
<string name="add_playlist_title">"Lisää soittolistaan"</string>
<string name="action_shuffle_all">Sekoita kaikki</string>
<string name="action_shuffle_album">Sekoita albumit</string>
<string name="action_shuffle_artist">Sekoita artistit</string>
<string name="action_shuffle_playlist">Sekoita soittolistat</string>
<string name="action_clear_playing_queue">Tyhjennä toistojono</string>
<string name="last_opened">Viimeksi avattu</string>
<string name="light_theme_name">Vaalea</string>
<string name="dark_theme_name">Tumma</string>
<string name="equalizer">Taajuuskorjain</string>
<string name="new_playlist_title">Uusi Soittolista</string>
<string name="black_theme_name">Musta (AMOLED)</string>
<string name="always">Aina</string>
<string name="only_on_wifi">Vain Wi-Fi-yhteydellä</string>
<string name="never">Ei koskaan</string>
<string name="equalizer">Ekvalisaattori</string>
<string name="pref_header_colors">Värit</string>
<string name="pref_header_now_playing_screen">Toistetaan parhaillaan</string>
<string name="pref_title_general_theme">Yleinen teema</string>
<string name="pref_header_audio">Ääni</string>
<string name="pref_header_general">Yleinen</string>
<string name="pref_header_images">Kuvat</string>
<string name="pref_header_lockscreen">Lukitusnäyttö</string>
<string name="pref_title_navigation_bar">Värillinen navigointipalkki</string>
<string name="pref_title_set_default_start_page">Aloitussivu</string>
<string name="pref_title_album_art_on_lockscreen">Näytä albumin kansi</string>
<string name="pref_title_auto_download_artist_images">Lataa automaattisesti artistien kuvat</string>
<string name="pref_title_blurred_album_art">Sumenna albumin kansi</string>
<string name="pref_title_colored_notification">Värillinen ilmoitus</string>
<string name="pref_title_ignore_media_store_artwork">Sivuuta Media Storen albumikannet</string>
<string name="pref_title_gapless_playback">Kuiluton toisto</string>
<string name="pref_title_force_square_album_art">Neliömäinen albumin kansi</string>
<string name="pref_title_opaque_toolbar_now_playing">Läpikuultamaton työkalupalkki</string>
<string name="pref_title_opaque_statusbar_now_playing">Läpikuultamaton tilapalkki</string>
<string name="pref_title_larger_title_box_now_playing">Suurempi otsikkoruutu</string>
<string name="pref_title_alternative_progress_slider_now_playing">Vaihtoehtoinen edistymispalkki</string>
<string name="pref_title_playback_controller_card_now_playing">Näytä kortti toistonappien alapuolella</string>
<string name="pref_title_colored_playback_controls_now_playing">Värilliset toistonapit</string>
<string name="no_equalizer">Ekvalisaattoria ei löytynyt.</string>
<string name="no_audio_ID">"Toista jokin kappale ensin, koita sitten uudelleen."</string>
<string name="delete_action">Poista</string>
<string name="clear_action">Tyhjennä</string>
<string name="remove_action">Poista</string>
<string name="rename_action">Nimeä uudelleen</string>
<string name="create_action">Luo</string>
<string name="x_selected">{%1$d} valittu</string>
<string name="select">Valitse</string>
<string name="default_str">Oletus</string>
<string name="primary_color">Ensisijainen väri</string>
<string name="accent_color">Aksenttiväri</string>
<string name="primary_color_desc">Ensisijainen teemaväri, oletuksena indigo.</string>
<string name="accent_color_desc">Aksentti teemaväri, oletuksena pinkki.</string>
<string name="update_image">Päivitä kuva</string>
<string name="playlist_empty_text">Tyhjennä soittolista</string>
<string name="no_playlists">Ei soittolistoja</string>
<string name="no_albums">Ei albumeja</string>
<string name="no_songs">Ei kappaleita</string>
<string name="no_artists">Ei artisteja</string>
<string name="empty">Tyhjä</string>
<string name="playlist_name_empty">Soittolistan nimi</string>
<string name="song">Kappale</string>
<string name="pref_only_lollipop">"Saatavilla vain Lollipopilla."</string>
<string name="pref_summary_album_art_on_lockscreen">Käyttää tämänhetkisten albumien kansia lukitusnäytön taustakuvana.</string>
<string name="pref_summary_blurred_album_art">Sumentaa albumin kannen lukitusnäytöllä. Saattaa aiheuttaa ongelmia kolmannen osapuolen sovellusten ja widgettien kanssa.</string>
<string name="pref_summary_colored_notification">"V\u00e4ritt\u00e4\u00e4 ilmoituksen albumin eloisalla v\u00e4rill\u00e4."</string>
<string name="pref_summary_gapless_playback">"Saattaa aiheuttaa toisto-ongelmia joillakin laitteilla."</string>
<string name="pref_summary_force_square_album_art">Albumien kannet Toistetaan parhaillaan -näkymässä ovat aina neliömäisiä.</string>
<string name="pref_summary_opaque_toolbar_now_playing">Värittää työkalupalkin.</string>
<string name="pref_summary_opaque_statusbar_now_playing">Värittää tilapalkin.</string>
<string name="pref_summary_larger_title_box_now_playing">Otsikkoruutu on korkeampi.</string>
<string name="pref_summary_alternative_progress_slider_now_playing">Käyttää edistymispalkkia, joka ei peitä albumin kantta, oletus edistymispalkin sijasta.</string>
<string name="pref_summary_playback_controller_card_now_playing">Näyttää kortin toista/pysäytä, ohita, kelaa takaisin, sekoita ja toista uudelleen -nappien alapuolella.</string>
<string name="pref_summary_ignore_media_store_artwork">Saattaa nostaa albumin kannen laatua, mutta aiheuttaa hitaampaa kuvien latausaikaa. Käytä tätä vain, jos sinulla on ongelmia huonolaatuisten taideteosten kanssa.</string>
<string name="pref_summary_colored_playback_controls_now_playing">V\u00e4ritt\u00e4\u00e4 toista/pys\u00e4yt\u00e4, sekoita ja toista uudelleen -napit, sek\u00e4 edistymispalkin albumin eloisalla v\u00e4rill\u00e4.</string>
<string name="pref_summary_colored_navigation_bar">Värittää navigointipalkin ensisijaisella värillä.</string>
<string name="could_not_download_album_cover">"Ei voitu ladata vastaavaa albumin kantta."</string>
<string name="search_hint">Etsi kirjastostasi...</string>
<string name="rescanning_media">Uudelleenskannataan mediaa...</string>
<string name="favorites">Suosikit</string>
<string name="last_added">Viimeksi lisätyt</string>
<string name="history">Historia</string>
<string name="my_top_tracks">Eniten kuunnellut</string>
<string name="remove_cover">Poista kansi</string>
<string name="download_from_last_fm">Lataa Last.fm-sivustolta</string>
<string name="pick_from_local_storage">Valitse paikallisesta muistista</string>
<string name="web_search">Web-haku</string>
<string name="action_sleep_timer">Ajastin</string>
<string name="action_set">Aseta</string>
<string name="cancel_current_timer">Peru tämänhetkinen ajastin</string>
<string name="sleep_timer_canceled">Ajastin peruttu.</string>
<string name="sleep_timer_set">Ajastin asetettu {%d} minuutin päähän tästä hetkestä.</string>
<string name="action_new_playlist">Uusi soittolista...</string>
<string name="new_playlist_title">Uusi soittolista</string>
<string name="colored_footers">Värilliset alatunnisteet</string>
<string name="special_thanks_to">Erikoiskiitokset:</string>
<string name="changelog">Muutosloki</string>
<string name="licenses">Lisenssit</string>
<string name="permissions_denied">Sinulla ei ole oikeuksia tähän.</string>
<string name="permission_external_storage_denied">Oikeus päästä muistikortille evättu.</string>
<string name="back">Takaisin</string>
<string name="support_development">Tue kehitystä</string>
<string name="thank_you">Kiitos!</string>
<string name="restored_previous_purchases">Palautetut edelliset ostokset.</string>
<string name="play_store_illustration_by">Play Store kuvitus:</string>
<string name="version">Versio</string>
<string name="application">Sovellus</string>
<string name="author">Luoja</string>
<string name="add_to_google_plus_circles">Lisää Google Plus -piireihin</string>
<string name="follow_on_twitter">Seuraa Twitterissä</string>
<string name="fork_on_git_hub">Seuraa GitHubissa</string>
<string name="visit_website">Vieraile verkkosivulla</string>
<string name="report_bugs">Raportoi bugeja</string>
<string name="report_bugs_summary">Raportoi bugeja tai ehdota uusia ominaisuuksia.</string>
<string name="join_community">Liity Google Plus -yhteisöön</string>
<string name="join_community_summary">Jos tarvitset apua tai sinulla on kysymyksiä, Phonographin Google Plus -yhteisö on hyvä paikka mennä.</string>
<string name="translate">Käännä</string>
<string name="translate_summary">Auta kääntämään Phonograph sinun äidinkielellesi.</string>
<string name="rate_on_google_play">Arvostele</string>
<string name="rate_on_google_play_summary">Jätä positiivinen arvostelu Google Play -kauppaan, jos pidät Phonographista.</string>
<string name="donate">Lahjoita</string>
<string name="donate_summary">Jos sinun mielestäsi minun kuuluisi saada korvausta työstäni, voit antaa minulla muutaman dollarin täällä.</string>
<string name="aidan_follestad_summary">Teemamoottorista ja muista hienoista jutuista.</string>
<string name="michael_cook_summary">Hienosta material-ikonista.</string>
<string name="maarten_corpel_summary">Google Play kuvituksesta ja tyhjästä albumikannesta.</string>
<string name="aleksandar_tesic_summary">Sovelluksen desing suunnitteluavusta.</string>
<string name="website">Verkkosivu</string>
<string name="loading_products">Ladataan tuotteita...</string>
<string name="up_next">Seuraavaksi</string>
<string name="pref_title_now_playing_layout">Toistetaan parhaillaan layouttia</string>
<string name="intro_label">Esittely</string>
<string name="press_back_again_to_exit_intro">Paina takaisin-nappia uudelleen ohittaaksesi esittelyn</string>
<string name="welcome_to_phonograph">"Tervetuloa Phonographiin, kauniiseen ja kevyeen musiikkisoittimeen Androidille. "</string>
<string name="label_storage">Tallennustila</string>
<string name="open_playing_queue_instruction">Vedä korttia Toistetaan parhaillaan -ikkunassa ylös, nähdäksesi koko toistojonon.</string>
<string name="rearrange_playing_queue_instruction">Järjestä toistojonoa vetämällä kappaletta sen raitanumerosta.</string>
<string name="storage_permission_explaination">Tallennustilan käytön oikeus vaaditaan Phonographin käyttöön, jotta voimme lukea sinun musiikkikirjastosi.</string>
<string name="library">Kirjasto</string>
<string name="folders">Kansiot</string>
</resources>

View file

@ -1,21 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="what_do_you_want_to_share">מה אתם רוצים לשתף?</string>
<string name="currently_listening_to_x_by_x">מאזינים כרגע ל-%1$s מאת %2$s.</string>
<string name="what_do_you_want_to_share">מה תרצה/י לשתף?</string>
<string name="currently_listening_to_x_by_x">כרגע מאזין ל%1$s מאת %2$s.</string>
<string name="the_audio_file">קובץ האודיו</string>
<string name="do_you_want_to_set_x_as_ringtone">אתם רוצים לקבוע את %1$s בתור הצלצול שלכם?</string>
<string name="x_has_been_set_as_ringtone">קביעת %1$s בתור בצלצול שלך.</string>
<string name="do_you_want_to_set_x_as_ringtone">תרצה/י לקבוע את %1$s בתור הצלצול שלך?</string>
<string name="x_has_been_set_as_ringtone">הגדר/י את %1$s בתור הצלצול שלך.</string>
<string name="action_set_as_ringtone">הגדרה כצלצול</string>
<string name="action_share">שיתוף</string>
<string name="action_settings">"הגדרות"</string>
<string name="action_grant">הענק</string>
<string name="action_done">בוצע</string>
<string name="action_skip">דלג</string>
<string name="action_about">אודות</string>
<string name="action_show_intro">הצג את המסך הראשי</string>
<string name="action_clear_playlist">ניקוי רשימת השמעה</string>
<string name="action_playing_queue">"מנגן "</string>
<string name="action_add_to_favorites">הוספה למועדפים</string>
<string name="action_remove_from_favorites">הסרה מהמועדפים</string>
<string name="action_search">חיפוש</string>
<string name="action_play_next">ניגון הבא</string>
<string name="action_play">ניגון</string>
<string name="action_add_to_playing_queue">הוספה לתור ההשמעה</string>
<string name="action_remove_from_playing_queue">הסרה מתור ההשמעה</string>
<string name="action_delete_from_device">הסרה מהמכשיר</string>
<string name="action_play_next">ניגון השיר הבא</string>
<string name="action_play">נגן</string>
<string name="action_add_to_playing_queue">הסופה לרשימת ההשמעה</string>
<string name="action_remove_from_playing_queue">הסרה מרשימת ההשמעה</string>
<string name="action_add_to_playlist">הוסף לרשימת השמעה...</string>
<string name="action_tag_editor">עריכת תווית</string>
<string name="action_delete_from_device">מחק מהמכשיר</string>
<string name="action_details">פרטים</string>
<string name="albums">אלבומים</string>
<string name="artists">אמנים</string>
@ -24,48 +33,69 @@
<string name="unplayable_file">\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05e0\u05d2\u05df \u05e9\u05d9\u05e8 \u05d6\u05d4.</string>
<string name="biography_unavailable">\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.</string>
<string name="biography">ביוגרפיה</string>
<string name="audio_focus_denied">מיקוד שמע נדחה</string>
<string name="album">אלבום</string>
<string name="artist">אמן</string>
<string name="genre">סגנון</string>
<string name="album_artist">אמן האלבום</string>
<string name="year">שנה</string>
<string name="writing_file_number">כתיבת קובץ</string>
<string name="saving_changes">שמירת שינויים...</string>
<string name="track">שיר</string>
<string name="track_hint">"שיר (2 בשביל שיר 2 או 3004 בשביל דיסק 3 שיר 4)"</string>
<string name="album_or_artist_empty">הכותרת או האמן ריקים</string>
<string name="writing_file_number">כותב קובץ</string>
<string name="saving_changes">שומר שינויים...</string>
<string name="label_details">פרטים</string>
<string name="label_file_name">שם קובץ</string>
<string name="label_file_path">נתיב הקובץ</string>
<string name="label_file_name">שם הקובץ</string>
<string name="label_file_path">מיקום הקובץ</string>
<string name="label_file_size">גודל</string>
<string name="label_file_format">פורמט</string>
<string name="label_file_format">תבנית</string>
<string name="label_track_length">אורך</string>
<string name="label_bit_rate">קצב נתונים</string>
<string name="label_sampling_rate">עיבוד אותות</string>
<string name="action_go_to_artist">מעבר לאמן</string>
<string name="action_go_to_album">מעבר לאלבום</string>
<string name="label_playing_queue">ניגון תור</string>
<string name="label_playing_queue">מנגן רשימת השמעה</string>
<string name="save_as_playlist">שמירה כרשימת השמעה</string>
<string name="no_results">אין תוצאות</string>
<string name="action_re_download_artist_image">עדכון תמונת האמן</string>
<string name="action_re_download_artist_image">עדכן תמונת אמן</string>
<string name="updated_artist_image">תמונת האמן עודכנה.</string>
<string name="updating">עידכון...</string>
<string name="could_not_update_artist_image">\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05e2\u05d3\u05db\u05df \u05d0\u05ea \u05ea\u05de\u05d5\u05e0\u05ea \u05d4\u05d0\u05de\u05df.</string>
<string name="updating">מעדכן...</string>
<string name="added_title_to_playing_queue">"נוסף שיר אחד לתור "</string>
<string name="added_x_titles_to_playing_queue">נוספו %1$d שירים לתור</string>
<string name="action_remove_from_playlist">הסר מרשימת ההשמעה</string>
<string name="action_grid_size">גודל הרשת</string>
<string name="action_grid_size_land">גודל הרשת (קרקע)</string>
<string name="inserted_x_songs_into_playlist_x">הוכנסו %1$d שירים לתוך רשימת השמיעה %2$s</string>
<string name="created_playlist_x">נוצרה רשימת השמיעה %1$s</string>
<string name="deleted_playlist_x">נמחקה רשימת השמיעה %1$s</string>
<string name="deleted_x_songs">נמחקו %1$d שירים</string>
<string name="could_not_create_playlist">\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d9\u05e6\u05d5\u05e8 \u05e8\u05e9\u05d9\u05de\u05ea \u05e9\u05de\u05d9\u05e2\u05d4.</string>
<string name="delete_playlist_x"><![CDATA[האם ברצונך למחוק את רשימת השמיעה <b>%1$s</b>?]]></string>
<string name="clear_playlist_x"><![CDATA[\u05d4\u05d0\u05dd \u05dc\u05e0\u05e7\u05d5\u05ea \u05d0\u05ea \u05e8\u05e9\u05d9\u05de\u05ea \u05d4\u05e9\u05de\u05d9\u05e2\u05d4 <b>%1$s</b>? \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!]]></string>
<string name="delete_x_playlists"><![CDATA[האם ברצונך למחוק <b>%1$d</b> רשימות השמיעה?]]></string>
<string name="light_theme_name">בהיר</string>
<string name="dark_theme_name">כהה</string>
<string name="black_theme_name">שחור (AMOLED)</string>
<string name="always">תמיד</string>
<string name="only_on_wifi">רק עם WI-FI</string>
<string name="never">אף פעם</string>
<string name="equalizer">אקולייזר</string>
<string name="equalizer">אקוולייזר</string>
<string name="pref_header_colors">צבעים</string>
<string name="pref_header_now_playing_screen">מנגן כעת</string>
<string name="pref_header_audio">אודיו</string>
<string name="pref_header_audio">שמע</string>
<string name="pref_header_general">כללי</string>
<string name="pref_header_images">תמונות</string>
<string name="pref_header_lockscreen">מסך נעילה</string>
<string name="pref_title_navigation_bar">סרגל ניווט צבעוני</string>
<string name="pref_title_set_default_start_page">עמוד התחלה</string>
<string name="pref_title_album_art_on_lockscreen">הצגת כיסוי אלבום</string>
<string name="pref_title_set_default_start_page">עמוד פתיחה</string>
<string name="pref_title_album_art_on_lockscreen">הצג עטיפת אלבום</string>
<string name="pref_title_auto_download_artist_images">הורדה אוטומטית של תמונות האמן</string>
<string name="pref_title_blurred_album_art">טשטוש כיסוי האלבום</string>
<string name="pref_title_blurred_album_art">טשטוש עטיפת האלבום</string>
<string name="pref_title_colored_notification">התראה צבעונית</string>
<string name="pref_title_gapless_playback">ניגון ללא מרווחים</string>
<string name="pref_title_force_square_album_art">כיסוי אלבום מרובע</string>
<string name="no_equalizer">לא נמצא אקולייזר</string>
<string name="pref_title_gapless_playback">ניגון ללא מרווחים בין השירים</string>
<string name="pref_title_force_square_album_art">עטיפת אלבום מרובעת</string>
<string name="no_equalizer">אקוולייזר לא נמצא</string>
<string name="delete_action">מחיקה</string>
<string name="clear_action">ניקוי</string>
<string name="remove_action">הסרה</string>
@ -76,21 +106,21 @@
<string name="default_str">ברירת מחדל</string>
<string name="primary_color">צבע ראשי</string>
<string name="update_image">עדכון תמונה</string>
<string name="playlist_empty_text">רשימת השמעה ריקה</string>
<string name="playlist_empty_text">רשימת שמע ריקה</string>
<string name="no_albums">אין אלבומים</string>
<string name="no_songs">אין שירים</string>
<string name="no_artists">אין אמנים</string>
<string name="empty">ריק</string>
<string name="playlist_name_empty">שם רשימת השמעה</string>
<string name="playlist_name_empty">שם רשימת שמע</string>
<string name="song">שיר</string>
<string name="favorites">מועדפים</string>
<string name="history">היסטוריה</string>
<string name="remove_cover">הסרת כיסוי</string>
<string name="remove_cover">הסרת עטיפה</string>
<string name="download_from_last_fm">הורדה מ-Last.fm</string>
<string name="web_search">חיפוש באינטרנט</string>
<string name="action_set">קבע</string>
<string name="new_playlist_title">רשימת השמעה חדשה</string>
<string name="special_thanks_to">תודות מיוחדות</string>
<string name="new_playlist_title">רשימת שמע חדשה</string>
<string name="special_thanks_to">תודות מיוחדות ל</string>
<string name="changelog">רשימת שינויים</string>
<string name="licenses">רישיונות</string>
<string name="permissions_denied">הרשאות נדחו.</string>
@ -102,8 +132,8 @@
<string name="version">גרסה</string>
<string name="application">אפליקציה</string>
<string name="visit_website">ביקור באתר</string>
<string name="report_bugs">דיווח באגים</string>
<string name="translate">תרגום</string>
<string name="report_bugs">דווח על באגים</string>
<string name="translate">תרגם</string>
<string name="donate">תרומה</string>
<string name="donate_summary">אם אתם חושבים שמגיע לי לקבל תשלום על עבודתי, אתם יכולים להשאיר לי כמה שקלים כאן.</string>
<string name="website">אתר</string>

View file

@ -113,6 +113,17 @@
<string name="pref_title_auto_download_artist_images">Előadó képének automatikus letöltése</string>
<string name="pref_title_blurred_album_art">Albumborító elhomályosítása</string>
<string name="pref_title_colored_notification">Színezett értesítés</string>
<string name="pref_title_ignore_media_store_artwork">Média tárolt albumborítók figyelmen kívül hagyása</string>
<string name="pref_title_gapless_playback">Áttűnéses lejátszás</string>
<string name="pref_title_force_square_album_art">Négyzet alakú albumkép</string>
<string name="pref_title_opaque_toolbar_now_playing">Áttetsző menüsáv</string>
<string name="pref_title_opaque_statusbar_now_playing">Átlátszatlan állapotsáv</string>
<string name="pref_title_larger_title_box_now_playing">Nagyobb címdoboz</string>
<string name="pref_title_alternative_progress_slider_now_playing">Alternatív haladási csúszka</string>
<string name="pref_title_playback_controller_card_now_playing">Kártya megjelenítése a lejátszást irányító gombok alatt</string>
<string name="pref_title_colored_playback_controls_now_playing">Színezett lejátszást irányító gombok</string>
<string name="no_equalizer">Equalizer nem található.</string>
<string name="no_audio_ID">"Játszd le egy dalt, majd próbáld újra."</string>
<string name="delete_action">Töröl</string>
<string name="clear_action">Kiürít</string>
<string name="remove_action">Eltávolít</string>
@ -120,9 +131,62 @@
<string name="create_action">Létrehoz</string>
<string name="x_selected">%1$d kiválasztva</string>
<string name="select">Kiválaszt</string>
<string name="default_str">Alapértelmezett</string>
<string name="primary_color">Elsődleges szín</string>
<string name="accent_color">Másodlagos szín</string>
<string name="primary_color_desc">Az alapértelmezett elsődleges szín, indigó.</string>
<string name="accent_color_desc">Az alapértelmezett másodlagos szín, rózsaszín.</string>
<string name="update_image">Kép frissítése</string>
<string name="playlist_empty_text">Üres lejátszási lista</string>
<string name="no_playlists">Nincs lejátszási lista</string>
<string name="no_albums">Nincs album</string>
<string name="no_songs">Nincs dal</string>
<string name="no_artists">Nincs előadó</string>
<string name="empty">Üres</string>
<string name="playlist_name_empty">Lejátszási lista neve</string>
<string name="song">Dal</string>
<string name="pref_only_lollipop">"Csak Lollipoppon (Android 5.x) érhető el."</string>
<string name="pref_summary_album_art_on_lockscreen">Jelenlegi dal albumborítójának használata a zárképernyő háttérképeként.</string>
<string name="pref_summary_blurred_album_art">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.</string>
<string name="pref_summary_colored_notification">"\u00c9rtes\u00edt\u00e9sek sz\u00ednez\u00e9se az albumbor\u00edt\u00f3 vibr\u00e1l\u00f3 sz\u00edn\u00e9vel."</string>
<string name="pref_summary_gapless_playback">"Lejátszási problémákat okozhat néhány eszközön."</string>
<string name="pref_summary_force_square_album_art">Az albumborító a most játszott nézetnél, mindig négyzet alakú legyen.</string>
<string name="pref_summary_opaque_toolbar_now_playing">Az eszköztár színezése.</string>
<string name="pref_summary_opaque_statusbar_now_playing">Az állapotsáv színezése.</string>
<string name="pref_summary_larger_title_box_now_playing">A cím doboz magasabb.</string>
<string name="pref_summary_alternative_progress_slider_now_playing">Folyamatjelzősáv használata, amely nem takarja el az albumborítót az alapértelmezett folyamatjelző csúszka helyett.</string>
<string name="pref_summary_playback_controller_card_now_playing">Kártya megjelenítése a lejátszás/szünet, át ugor, visszateker, keverés és az ismétlés alatt gombok alatt.</string>
<string name="pref_summary_ignore_media_store_artwork">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.</string>
<string name="pref_summary_colored_playback_controls_now_playing">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.</string>
<string name="pref_summary_colored_navigation_bar">Navigációs sáv színezése az alapértelmezett színnel.</string>
<string name="could_not_download_album_cover">"Nem siker\u00fclt let\u00f6lteni a megfelel\u0151 albumbor\u00edt\u00f3t."</string>
<string name="search_hint">Keresés a könyvtáradban...</string>
<string name="rescanning_media">Média újraszkennelése...</string>
<string name="favorites">Kedvencek</string>
<string name="last_added">Utoljára hozzáadva</string>
<string name="history">Előzmények</string>
<string name="my_top_tracks">Az én top dalaim</string>
<string name="remove_cover">Borító eltávolítása</string>
<string name="download_from_last_fm">Letöltés a Last.fm-ről</string>
<string name="pick_from_local_storage">Felvétel a helyi tárhelyből</string>
<string name="web_search">Internetes keresés</string>
<string name="action_sleep_timer">Elalvás időzítő</string>
<string name="action_set">Beállít</string>
<string name="cancel_current_timer">Jelenlegi időzítő törlése</string>
<string name="sleep_timer_canceled">Elalvás időzítő törölve.</string>
<string name="sleep_timer_set">Elalvás időzítő beállítva, mostantól számított %d percre.</string>
<string name="action_new_playlist">Új lejátszási lista...</string>
<string name="new_playlist_title">Új lejátszási lista</string>
<string name="colored_footers">Színes lábjegyzetek</string>
<string name="special_thanks_to">Külön köszönet</string>
<string name="changelog">Változások</string>
<string name="licenses">Engedélyek</string>
<string name="permissions_denied">Jogosultságok megtagadva.</string>
<string name="permission_external_storage_denied">Jogosultságod a külső tárolóhoz megtagadva.</string>
<string name="back">vissza</string>
<string name="support_development">Fejlesztő támogatása</string>
<string name="thank_you">Köszönöm!</string>
<string name="restored_previous_purchases">Korábbi vásárlások visszaállítása.</string>
<string name="play_store_illustration_by">Play Áruház illusztrációt készítette</string>
<string name="version">Verzió</string>
<string name="application">Alkalmazás</string>
@ -132,9 +196,30 @@
<string name="fork_on_git_hub">Fork on GitHub</string>
<string name="visit_website">Weboldal meglátogatása</string>
<string name="report_bugs">Hiba jelentése</string>
<string name="report_bugs_summary">Hiba jelentése vagy új funkció kérése.</string>
<string name="join_community">Csatlakozz a Google Plus közösséghez</string>
<string name="join_community_summary">Ha segítségre lenne szükséged, a Phonograph közösség között biztos válaszra találsz.</string>
<string name="translate">Fordítás</string>
<string name="translate_summary">Segíts lefordítani a Phonograph-ot a saját nyelvedre.</string>
<string name="rate_on_google_play">Értékeld</string>
<string name="rate_on_google_play_summary">Értékeld a Phonograph-ot pozitívan a Google Play-en!</string>
<string name="donate">Adományoz</string>
<string name="donate_summary">Ha szerinted megéri a munkám, adományozz egy csekély összeget nekem.</string>
<string name="aidan_follestad_summary">A téma alapjához és egyéb remek dolgokhoz.</string>
<string name="michael_cook_summary">A szép material alkalmazás ikonért.</string>
<string name="maarten_corpel_summary">A Play Store-os illusztrációért és az üres albumborítóért.</string>
<string name="aleksandar_tesic_summary">Azért, mert segített nekem a kinézetben.</string>
<string name="website">Weboldal</string>
<string name="loading_products">Termékek betöltése...</string>
<string name="up_next">Következő</string>
<string name="pref_title_now_playing_layout">Most játszott elrendezés</string>
<string name="intro_label">Bemutató</string>
<string name="press_back_again_to_exit_intro">Nyomj a visszára megint, hogy átugord a bemutatót.</string>
<string name="welcome_to_phonograph">"Üdvözöl a Phonograph! Egy kisméretű, szép zenelejátszó Android-ra. "</string>
<string name="label_storage">Tárhely</string>
<string name="open_playing_queue_instruction">Húzd fel a kártyát a most játszott képernyőnél, hogy megnyisd a lejátszási sort.</string>
<string name="rearrange_playing_queue_instruction">Rendezd át a lejátszási sort, azzal hogy megfogod a számokat a sorszámuknál fogva.</string>
<string name="storage_permission_explaination">Engedélyezned kell a tárhely használatát, hogy a Phonograph meg tudja találni a zeneszámaidat.</string>
<string name="library">Könyvtár</string>
<string name="folders">Mappa</string>
</resources>

View file

@ -1,21 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="what_do_you_want_to_share">מה אתם רוצים לשתף?</string>
<string name="currently_listening_to_x_by_x">מאזינים כרגע ל-%1$s מאת %2$s.</string>
<string name="what_do_you_want_to_share">מה תרצה/י לשתף?</string>
<string name="currently_listening_to_x_by_x">כרגע מאזין ל%1$s מאת %2$s.</string>
<string name="the_audio_file">קובץ האודיו</string>
<string name="do_you_want_to_set_x_as_ringtone">אתם רוצים לקבוע את %1$s בתור הצלצול שלכם?</string>
<string name="x_has_been_set_as_ringtone">קביעת %1$s בתור בצלצול שלך.</string>
<string name="do_you_want_to_set_x_as_ringtone">תרצה/י לקבוע את %1$s בתור הצלצול שלך?</string>
<string name="x_has_been_set_as_ringtone">הגדר/י את %1$s בתור הצלצול שלך.</string>
<string name="action_set_as_ringtone">הגדרה כצלצול</string>
<string name="action_share">שיתוף</string>
<string name="action_settings">"הגדרות"</string>
<string name="action_grant">הענק</string>
<string name="action_done">בוצע</string>
<string name="action_skip">דלג</string>
<string name="action_about">אודות</string>
<string name="action_show_intro">הצג את המסך הראשי</string>
<string name="action_clear_playlist">ניקוי רשימת השמעה</string>
<string name="action_playing_queue">"מנגן "</string>
<string name="action_add_to_favorites">הוספה למועדפים</string>
<string name="action_remove_from_favorites">הסרה מהמועדפים</string>
<string name="action_search">חיפוש</string>
<string name="action_play_next">ניגון הבא</string>
<string name="action_play">ניגון</string>
<string name="action_add_to_playing_queue">הוספה לתור ההשמעה</string>
<string name="action_remove_from_playing_queue">הסרה מתור ההשמעה</string>
<string name="action_delete_from_device">הסרה מהמכשיר</string>
<string name="action_play_next">ניגון השיר הבא</string>
<string name="action_play">נגן</string>
<string name="action_add_to_playing_queue">הסופה לרשימת ההשמעה</string>
<string name="action_remove_from_playing_queue">הסרה מרשימת ההשמעה</string>
<string name="action_add_to_playlist">הוסף לרשימת השמעה...</string>
<string name="action_tag_editor">עריכת תווית</string>
<string name="action_delete_from_device">מחק מהמכשיר</string>
<string name="action_details">פרטים</string>
<string name="albums">אלבומים</string>
<string name="artists">אמנים</string>
@ -24,48 +33,69 @@
<string name="unplayable_file">\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05e0\u05d2\u05df \u05e9\u05d9\u05e8 \u05d6\u05d4.</string>
<string name="biography_unavailable">\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.</string>
<string name="biography">ביוגרפיה</string>
<string name="audio_focus_denied">מיקוד שמע נדחה</string>
<string name="album">אלבום</string>
<string name="artist">אמן</string>
<string name="genre">סגנון</string>
<string name="album_artist">אמן האלבום</string>
<string name="year">שנה</string>
<string name="writing_file_number">כתיבת קובץ</string>
<string name="saving_changes">שמירת שינויים...</string>
<string name="track">שיר</string>
<string name="track_hint">"שיר (2 בשביל שיר 2 או 3004 בשביל דיסק 3 שיר 4)"</string>
<string name="album_or_artist_empty">הכותרת או האמן ריקים</string>
<string name="writing_file_number">כותב קובץ</string>
<string name="saving_changes">שומר שינויים...</string>
<string name="label_details">פרטים</string>
<string name="label_file_name">שם קובץ</string>
<string name="label_file_path">נתיב הקובץ</string>
<string name="label_file_name">שם הקובץ</string>
<string name="label_file_path">מיקום הקובץ</string>
<string name="label_file_size">גודל</string>
<string name="label_file_format">פורמט</string>
<string name="label_file_format">תבנית</string>
<string name="label_track_length">אורך</string>
<string name="label_bit_rate">קצב נתונים</string>
<string name="label_sampling_rate">עיבוד אותות</string>
<string name="action_go_to_artist">מעבר לאמן</string>
<string name="action_go_to_album">מעבר לאלבום</string>
<string name="label_playing_queue">ניגון תור</string>
<string name="label_playing_queue">מנגן רשימת השמעה</string>
<string name="save_as_playlist">שמירה כרשימת השמעה</string>
<string name="no_results">אין תוצאות</string>
<string name="action_re_download_artist_image">עדכון תמונת האמן</string>
<string name="action_re_download_artist_image">עדכן תמונת אמן</string>
<string name="updated_artist_image">תמונת האמן עודכנה.</string>
<string name="updating">עידכון...</string>
<string name="could_not_update_artist_image">\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05e2\u05d3\u05db\u05df \u05d0\u05ea \u05ea\u05de\u05d5\u05e0\u05ea \u05d4\u05d0\u05de\u05df.</string>
<string name="updating">מעדכן...</string>
<string name="added_title_to_playing_queue">"נוסף שיר אחד לתור "</string>
<string name="added_x_titles_to_playing_queue">נוספו %1$d שירים לתור</string>
<string name="action_remove_from_playlist">הסר מרשימת ההשמעה</string>
<string name="action_grid_size">גודל הרשת</string>
<string name="action_grid_size_land">גודל הרשת (קרקע)</string>
<string name="inserted_x_songs_into_playlist_x">הוכנסו %1$d שירים לתוך רשימת השמיעה %2$s</string>
<string name="created_playlist_x">נוצרה רשימת השמיעה %1$s</string>
<string name="deleted_playlist_x">נמחקה רשימת השמיעה %1$s</string>
<string name="deleted_x_songs">נמחקו %1$d שירים</string>
<string name="could_not_create_playlist">\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d9\u05e6\u05d5\u05e8 \u05e8\u05e9\u05d9\u05de\u05ea \u05e9\u05de\u05d9\u05e2\u05d4.</string>
<string name="delete_playlist_x"><![CDATA[האם ברצונך למחוק את רשימת השמיעה <b>%1$s</b>?]]></string>
<string name="clear_playlist_x"><![CDATA[\u05d4\u05d0\u05dd \u05dc\u05e0\u05e7\u05d5\u05ea \u05d0\u05ea \u05e8\u05e9\u05d9\u05de\u05ea \u05d4\u05e9\u05de\u05d9\u05e2\u05d4 <b>%1$s</b>? \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!]]></string>
<string name="delete_x_playlists"><![CDATA[האם ברצונך למחוק <b>%1$d</b> רשימות השמיעה?]]></string>
<string name="light_theme_name">בהיר</string>
<string name="dark_theme_name">כהה</string>
<string name="black_theme_name">שחור (AMOLED)</string>
<string name="always">תמיד</string>
<string name="only_on_wifi">רק עם WI-FI</string>
<string name="never">אף פעם</string>
<string name="equalizer">אקולייזר</string>
<string name="equalizer">אקוולייזר</string>
<string name="pref_header_colors">צבעים</string>
<string name="pref_header_now_playing_screen">מנגן כעת</string>
<string name="pref_header_audio">אודיו</string>
<string name="pref_header_audio">שמע</string>
<string name="pref_header_general">כללי</string>
<string name="pref_header_images">תמונות</string>
<string name="pref_header_lockscreen">מסך נעילה</string>
<string name="pref_title_navigation_bar">סרגל ניווט צבעוני</string>
<string name="pref_title_set_default_start_page">עמוד התחלה</string>
<string name="pref_title_album_art_on_lockscreen">הצגת כיסוי אלבום</string>
<string name="pref_title_set_default_start_page">עמוד פתיחה</string>
<string name="pref_title_album_art_on_lockscreen">הצג עטיפת אלבום</string>
<string name="pref_title_auto_download_artist_images">הורדה אוטומטית של תמונות האמן</string>
<string name="pref_title_blurred_album_art">טשטוש כיסוי האלבום</string>
<string name="pref_title_blurred_album_art">טשטוש עטיפת האלבום</string>
<string name="pref_title_colored_notification">התראה צבעונית</string>
<string name="pref_title_gapless_playback">ניגון ללא מרווחים</string>
<string name="pref_title_force_square_album_art">כיסוי אלבום מרובע</string>
<string name="no_equalizer">לא נמצא אקולייזר</string>
<string name="pref_title_gapless_playback">ניגון ללא מרווחים בין השירים</string>
<string name="pref_title_force_square_album_art">עטיפת אלבום מרובעת</string>
<string name="no_equalizer">אקוולייזר לא נמצא</string>
<string name="delete_action">מחיקה</string>
<string name="clear_action">ניקוי</string>
<string name="remove_action">הסרה</string>
@ -76,21 +106,21 @@
<string name="default_str">ברירת מחדל</string>
<string name="primary_color">צבע ראשי</string>
<string name="update_image">עדכון תמונה</string>
<string name="playlist_empty_text">רשימת השמעה ריקה</string>
<string name="playlist_empty_text">רשימת שמע ריקה</string>
<string name="no_albums">אין אלבומים</string>
<string name="no_songs">אין שירים</string>
<string name="no_artists">אין אמנים</string>
<string name="empty">ריק</string>
<string name="playlist_name_empty">שם רשימת השמעה</string>
<string name="playlist_name_empty">שם רשימת שמע</string>
<string name="song">שיר</string>
<string name="favorites">מועדפים</string>
<string name="history">היסטוריה</string>
<string name="remove_cover">הסרת כיסוי</string>
<string name="remove_cover">הסרת עטיפה</string>
<string name="download_from_last_fm">הורדה מ-Last.fm</string>
<string name="web_search">חיפוש באינטרנט</string>
<string name="action_set">קבע</string>
<string name="new_playlist_title">רשימת השמעה חדשה</string>
<string name="special_thanks_to">תודות מיוחדות</string>
<string name="new_playlist_title">רשימת שמע חדשה</string>
<string name="special_thanks_to">תודות מיוחדות ל</string>
<string name="changelog">רשימת שינויים</string>
<string name="licenses">רישיונות</string>
<string name="permissions_denied">הרשאות נדחו.</string>
@ -102,8 +132,8 @@
<string name="version">גרסה</string>
<string name="application">אפליקציה</string>
<string name="visit_website">ביקור באתר</string>
<string name="report_bugs">דיווח באגים</string>
<string name="translate">תרגום</string>
<string name="report_bugs">דווח על באגים</string>
<string name="translate">תרגם</string>
<string name="donate">תרומה</string>
<string name="donate_summary">אם אתם חושבים שמגיע לי לקבל תשלום על עבודתי, אתם יכולים להשאיר לי כמה שקלים כאן.</string>
<string name="website">אתר</string>

View file

@ -1,7 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="what_do_you_want_to_share">Vad vill du dela?</string>
<string name="currently_listening_to_x_by_x">Lyssnar just nu på %1$s av %2$s.</string>
<string name="the_audio_file">Ljudfilen</string>
<string name="do_you_want_to_set_x_as_ringtone">"Vill du lägga till %1$s som din ringsignal? "</string>
<string name="x_has_been_set_as_ringtone">"Lägg till %1$s som din ringsignal. "</string>
<string name="action_set_as_ringtone">"Lägg till som ringsignal. "</string>
<string name="action_share">Dela</string>
<string name="action_settings">"Inställningar"</string>
<string name="action_grant">Tillåt</string>
<string name="action_done">Färdig</string>
<string name="action_skip">Skippa</string>
<string name="action_about">Om</string>
<string name="action_show_intro">Visa intro</string>
<string name="action_clear_playlist">"Rensa spellista "</string>
<string name="action_playing_queue">Uppspelningskö</string>
<string name="action_search">Sök</string>
<string name="action_play_next">Spela nästa</string>
@ -24,7 +36,7 @@
<string name="album_artist">Album artist</string>
<string name="year">År</string>
<string name="track">Låt</string>
<string name="track_hint">"Låt"</string>
<string name="track_hint">"Spår"</string>
<string name="album_or_artist_empty">Textfältet för albumtitel eller artist är tomt.</string>
<string name="writing_file_number">Skriver till fil</string>
<string name="saving_changes">Sparar ändringar ...</string>

View file

@ -22,9 +22,9 @@
</string-array>
<string-array name="pref_general_theme_list_values">
<item>0</item>
<item>1</item>
<item>2</item>
<item>light</item>
<item>dark</item>
<item>black</item>
</string-array>
<string-array name="pref_auto_download_images_titles">

View file

@ -58,7 +58,7 @@
</style>
<style name="Theme.Phonograph.Base.Black" parent="@style/Theme.Phonograph.Base">
<item name="android:windowBackground">@drawable/black</item>
<item name="android:windowBackground">@android:color/black</item>
<item name="divider_color">#18FFFFFF</item>
<item name="default_bar_color">@color/grey_800</item>
<item name="cardBackgroundColor">@color/grey_900</item>

View file

@ -3,4 +3,5 @@
<string name="transition_album_art">album_art_transition</string>
<string name="transition_artist_image">artist_image_transition</string>
<string name="transition_fab">fab_transition</string>
<string name="transition_mini_player">mini_player_transition</string>
</resources>

View file

@ -1,21 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory android:title="@string/pref_header_audio">
<com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory android:title="@string/pref_header_audio">
<CheckBoxPreference
<com.kabouzeid.appthemehelper.common.prefs.ATESwitchPreference
android:defaultValue="false"
android:key="gapless_playback"
android:layout="@layout/preference_custom"
android:summary="@string/pref_summary_gapless_playback"
android:title="@string/pref_title_gapless_playback"
android:widgetLayout="@layout/preference_dynamic_checkbox" />
android:title="@string/pref_title_gapless_playback" />
<Preference
<com.kabouzeid.appthemehelper.common.prefs.ATEPreference
android:key="equalizer"
android:layout="@layout/preference_custom"
android:title="@string/equalizer" />
</com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory>
</com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory>
</PreferenceScreen>

View file

@ -1,43 +1,32 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory android:title="@string/pref_header_colors">
<com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory android:title="@string/pref_header_colors">
<com.afollestad.materialdialogs.prefs.MaterialListPreference
android:defaultValue="0"
android:entries="@array/pref_general_theme_list_titles"
android:entryValues="@array/pref_general_theme_list_values"
android:key="general_theme"
android:layout="@layout/preference_custom"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_general_theme" />
<com.kabouzeid.gramophone.prefs.ColorChooserPreference
<com.kabouzeid.appthemehelper.common.prefs.ATEColorPreference
android:key="primary_color"
android:persistent="false"
android:summary="@string/primary_color_desc"
android:title="@string/primary_color" />
<com.kabouzeid.gramophone.prefs.ColorChooserPreference
<com.kabouzeid.appthemehelper.common.prefs.ATEColorPreference
android:key="accent_color"
android:persistent="false"
android:summary="@string/accent_color_desc"
android:title="@string/accent_color" />
<CheckBoxPreference
<com.kabouzeid.appthemehelper.common.prefs.ATESwitchPreference
android:defaultValue="true"
android:key="colored_notification"
android:layout="@layout/preference_custom"
android:summary="@string/pref_summary_colored_notification"
android:title="@string/pref_title_colored_notification"
android:widgetLayout="@layout/preference_dynamic_checkbox" />
android:title="@string/pref_title_colored_notification" />
<CheckBoxPreference
<com.kabouzeid.appthemehelper.common.prefs.ATESwitchPreference
android:defaultValue="false"
android:key="should_color_navigation_bar"
android:layout="@layout/preference_custom"
android:persistent="false"
android:summary="@string/pref_summary_colored_navigation_bar"
android:title="@string/pref_title_navigation_bar"
android:widgetLayout="@layout/preference_dynamic_checkbox" />
android:title="@string/pref_title_navigation_bar" />
</com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory>
</com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory>
</PreferenceScreen>

View file

@ -1,17 +1,25 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory android:title="@string/pref_header_general">
<com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory android:title="@string/pref_header_general">
<com.afollestad.materialdialogs.prefs.MaterialListPreference
<com.kabouzeid.appthemehelper.common.prefs.ATEListPreference
android:defaultValue="-1"
android:entries="@array/pref_start_page_list_titles"
android:entryValues="@array/pref_start_page_list_values"
android:key="default_start_page"
android:layout="@layout/preference_custom"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_set_default_start_page" />
</com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory>
<com.kabouzeid.appthemehelper.common.prefs.ATEListPreference
android:defaultValue="light"
android:entries="@array/pref_general_theme_list_titles"
android:entryValues="@array/pref_general_theme_list_values"
android:key="general_theme"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_general_theme" />
</com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory>
</PreferenceScreen>

View file

@ -1,26 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory android:title="@string/pref_header_images">
<com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory android:title="@string/pref_header_images">
<CheckBoxPreference
<com.kabouzeid.appthemehelper.common.prefs.ATESwitchPreference
android:defaultValue="false"
android:key="ignore_media_store_artwork"
android:layout="@layout/preference_custom"
android:summary="@string/pref_summary_ignore_media_store_artwork"
android:title="@string/pref_title_ignore_media_store_artwork"
android:widgetLayout="@layout/preference_dynamic_checkbox" />
android:title="@string/pref_title_ignore_media_store_artwork" />
<com.afollestad.materialdialogs.prefs.MaterialListPreference
<com.kabouzeid.appthemehelper.common.prefs.ATEListPreference
android:defaultValue="only_wifi"
android:entries="@array/pref_auto_download_images_titles"
android:entryValues="@array/pref_auto_download_images_values"
android:key="auto_download_images_policy"
android:layout="@layout/preference_custom"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_auto_download_artist_images" />
</com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory>
</com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory>
</PreferenceScreen>

View file

@ -1,24 +1,20 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory android:title="@string/pref_header_lockscreen">
<com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory android:title="@string/pref_header_lockscreen">
<CheckBoxPreference
<com.kabouzeid.appthemehelper.common.prefs.ATESwitchPreference
android:defaultValue="true"
android:key="album_art_on_lockscreen"
android:layout="@layout/preference_custom"
android:summary="@string/pref_summary_album_art_on_lockscreen"
android:title="@string/pref_title_album_art_on_lockscreen"
android:widgetLayout="@layout/preference_dynamic_checkbox" />
android:title="@string/pref_title_album_art_on_lockscreen" />
<CheckBoxPreference
<com.kabouzeid.appthemehelper.common.prefs.ATESwitchPreference
android:defaultValue="false"
android:dependency="album_art_on_lockscreen"
android:key="blurred_album_art"
android:layout="@layout/preference_custom"
android:summary="@string/pref_summary_blurred_album_art"
android:title="@string/pref_title_blurred_album_art"
android:widgetLayout="@layout/preference_dynamic_checkbox" />
android:title="@string/pref_title_blurred_album_art" />
</com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory>
</com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory>
</PreferenceScreen>

View file

@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory android:title="@string/pref_header_now_playing_screen">
<com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory android:title="@string/pref_header_now_playing_screen">
<com.afollestad.materialdialogs.prefs.MaterialListPreference
<com.kabouzeid.appthemehelper.common.prefs.ATEListPreference
android:enabled="false"
android:key="now_playing_layout"
android:layout="@layout/preference_custom"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:summary="Coming soon"
android:title="@string/pref_title_now_playing_layout" />
</com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory>
</com.kabouzeid.appthemehelper.common.prefs.ATEPreferenceCategory>
</PreferenceScreen>

View file

@ -3,7 +3,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0-alpha7'
classpath 'com.android.tools.build:gradle:2.0.0-alpha8'
classpath 'com.github.triplet.gradle:play-publisher:1.1.3'
}
}