Merge branch 'master' into album-actions
This commit is contained in:
commit
9e69136b1d
178 changed files with 628 additions and 514 deletions
|
|
@ -25,7 +25,7 @@ public class App extends Application {
|
|||
.build();
|
||||
Fabric.with(this, crashlyticsKit);
|
||||
|
||||
//Set up dynamic shortcuts
|
||||
// Set up dynamic shortcuts
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
|
||||
new DynamicShortcutManager(this).initDynamicShortcuts();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ import java.util.ArrayList;
|
|||
public class HorizontalAlbumAdapter extends AlbumAdapter {
|
||||
public static final String TAG = AlbumAdapter.class.getSimpleName();
|
||||
|
||||
public HorizontalAlbumAdapter(@NonNull AppCompatActivity activity, ArrayList<Album> dataSet,boolean usePalette, @Nullable CabHolder cabHolder) {
|
||||
public HorizontalAlbumAdapter(@NonNull AppCompatActivity activity, ArrayList<Album> dataSet, boolean usePalette, @Nullable CabHolder cabHolder) {
|
||||
super(activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, usePalette, cabHolder);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ import com.kabouzeid.gramophone.util.Util;
|
|||
/**
|
||||
* @author Adrian Campos
|
||||
*/
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.N_MR1)
|
||||
public final class AppShortcutIconGenerator {
|
||||
public static Icon generateThemedIcon(Context context, int iconId) {
|
||||
|
|
@ -30,7 +29,7 @@ public final class AppShortcutIconGenerator {
|
|||
}
|
||||
|
||||
private static Icon generateDefaultThemedIcon(Context context, int iconId) {
|
||||
//Return an Icon of iconId with default colors
|
||||
// Return an Icon of iconId with default colors
|
||||
return generateThemedIcon(context, iconId,
|
||||
context.getColor(R.color.app_shortcut_default_foreground),
|
||||
context.getColor(R.color.app_shortcut_default_background)
|
||||
|
|
@ -38,11 +37,11 @@ public final class AppShortcutIconGenerator {
|
|||
}
|
||||
|
||||
private static Icon generateUserThemedIcon(Context context, int iconId) {
|
||||
//Get background color from context's theme
|
||||
// Get background color from context's theme
|
||||
final TypedValue typedColorBackground = new TypedValue();
|
||||
context.getTheme().resolveAttribute(android.R.attr.colorBackground, typedColorBackground, true);
|
||||
|
||||
//Return an Icon of iconId with those colors
|
||||
// Return an Icon of iconId with those colors
|
||||
return generateThemedIcon(context, iconId,
|
||||
ThemeStore.primaryColor(context),
|
||||
typedColorBackground.data
|
||||
|
|
@ -50,14 +49,14 @@ public final class AppShortcutIconGenerator {
|
|||
}
|
||||
|
||||
private static Icon generateThemedIcon(Context context, int iconId, int foregroundColor, int backgroundColor) {
|
||||
//Get and tint foreground and background drawables
|
||||
// Get and tint foreground and background drawables
|
||||
Drawable vectorDrawable = Util.getTintedVectorDrawable(context, iconId, foregroundColor);
|
||||
Drawable backgroundDrawable = Util.getTintedVectorDrawable(context, R.drawable.ic_app_shortcut_background, backgroundColor);
|
||||
|
||||
//Squash the two drawables together
|
||||
// Squash the two drawables together
|
||||
LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{backgroundDrawable, vectorDrawable});
|
||||
|
||||
//Return as an Icon
|
||||
// Return as an Icon
|
||||
return Icon.createWithBitmap(drawableToBitmap(layerDrawable));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ public class AppShortcutLauncherActivity extends Activity {
|
|||
|
||||
int shortcutType = SHORTCUT_TYPE_NONE;
|
||||
|
||||
//Set shortcutType from the intent extras
|
||||
// Set shortcutType from the intent extras
|
||||
Bundle extras = getIntent().getExtras();
|
||||
if (extras != null) {
|
||||
//noinspection WrongConstant
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import android.annotation.TargetApi;
|
|||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ShortcutInfo;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
|
||||
import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity;
|
||||
|
|
@ -11,8 +12,7 @@ import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity;
|
|||
/**
|
||||
* @author Adrian Campos
|
||||
*/
|
||||
|
||||
@TargetApi(25)
|
||||
@TargetApi(Build.VERSION_CODES.N_MR1)
|
||||
public abstract class BaseShortcutType {
|
||||
|
||||
static final String ID_PREFIX = "com.kabouzeid.gramophone.appshortcuts.id.";
|
||||
|
|
@ -23,13 +23,11 @@ public abstract class BaseShortcutType {
|
|||
this.context = context;
|
||||
}
|
||||
|
||||
|
||||
abstract ShortcutInfo getShortcutInfo();
|
||||
|
||||
static public String getId() {
|
||||
return ID_PREFIX + "invalid";
|
||||
}
|
||||
|
||||
abstract ShortcutInfo getShortcutInfo();
|
||||
|
||||
/**
|
||||
* Creates an Intent that will launch MainActivtiy and immediately play {@param songs} in either shuffle or normal mode
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package com.kabouzeid.gramophone.appshortcuts.shortcuttype;
|
|||
import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ShortcutInfo;
|
||||
import android.os.Build;
|
||||
|
||||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.appshortcuts.AppShortcutIconGenerator;
|
||||
|
|
@ -11,13 +12,16 @@ import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity;
|
|||
/**
|
||||
* @author Adrian Campos
|
||||
*/
|
||||
|
||||
@TargetApi(25)
|
||||
@TargetApi(Build.VERSION_CODES.N_MR1)
|
||||
public final class LastAddedShortcutType extends BaseShortcutType {
|
||||
public LastAddedShortcutType(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public static String getId() {
|
||||
return ID_PREFIX + "last_added";
|
||||
}
|
||||
|
||||
public ShortcutInfo getShortcutInfo() {
|
||||
return new ShortcutInfo.Builder(context, getId())
|
||||
.setShortLabel(context.getString(R.string.app_shortcut_last_added_short))
|
||||
|
|
@ -26,8 +30,4 @@ public final class LastAddedShortcutType extends BaseShortcutType {
|
|||
.setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_LAST_ADDED))
|
||||
.build();
|
||||
}
|
||||
|
||||
public static String getId(){
|
||||
return ID_PREFIX + "last_added";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package com.kabouzeid.gramophone.appshortcuts.shortcuttype;
|
|||
import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ShortcutInfo;
|
||||
import android.os.Build;
|
||||
|
||||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.appshortcuts.AppShortcutIconGenerator;
|
||||
|
|
@ -11,13 +12,16 @@ import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity;
|
|||
/**
|
||||
* @author Adrian Campos
|
||||
*/
|
||||
|
||||
@TargetApi(25)
|
||||
@TargetApi(Build.VERSION_CODES.N_MR1)
|
||||
public final class ShuffleAllShortcutType extends BaseShortcutType {
|
||||
public ShuffleAllShortcutType(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public static String getId() {
|
||||
return ID_PREFIX + "shuffle_all";
|
||||
}
|
||||
|
||||
public ShortcutInfo getShortcutInfo() {
|
||||
return new ShortcutInfo.Builder(context, getId())
|
||||
.setShortLabel(context.getString(R.string.app_shortcut_shuffle_all_short))
|
||||
|
|
@ -26,8 +30,4 @@ public final class ShuffleAllShortcutType extends BaseShortcutType {
|
|||
.setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_SHUFFLE_ALL))
|
||||
.build();
|
||||
}
|
||||
|
||||
public static String getId() {
|
||||
return ID_PREFIX + "shuffle_all";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package com.kabouzeid.gramophone.appshortcuts.shortcuttype;
|
|||
import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ShortcutInfo;
|
||||
import android.os.Build;
|
||||
|
||||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.appshortcuts.AppShortcutIconGenerator;
|
||||
|
|
@ -11,13 +12,16 @@ import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity;
|
|||
/**
|
||||
* @author Adrian Campos
|
||||
*/
|
||||
|
||||
@TargetApi(25)
|
||||
@TargetApi(Build.VERSION_CODES.N_MR1)
|
||||
public final class TopTracksShortcutType extends BaseShortcutType {
|
||||
public TopTracksShortcutType(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public static String getId() {
|
||||
return ID_PREFIX + "top_tracks";
|
||||
}
|
||||
|
||||
public ShortcutInfo getShortcutInfo() {
|
||||
return new ShortcutInfo.Builder(context, getId())
|
||||
.setShortLabel(context.getString(R.string.app_shortcut_top_tracks_short))
|
||||
|
|
@ -26,8 +30,4 @@ public final class TopTracksShortcutType extends BaseShortcutType {
|
|||
.setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_TOP_TRACKS))
|
||||
.build();
|
||||
}
|
||||
|
||||
public static String getId() {
|
||||
return ID_PREFIX + "top_tracks";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ public class AppWidgetBig extends BaseAppWidget {
|
|||
public static final String NAME = "app_widget_big";
|
||||
|
||||
private static AppWidgetBig mInstance;
|
||||
private Target<Bitmap> target; // for cancellation
|
||||
|
||||
public static synchronized AppWidgetBig getInstance() {
|
||||
if (mInstance == null) {
|
||||
|
|
@ -125,14 +126,14 @@ public class AppWidgetBig extends BaseAppWidget {
|
|||
int playPauseRes = isPlaying ? R.drawable.ic_pause_white_24dp : R.drawable.ic_play_arrow_white_24dp;
|
||||
appWidgetView.setImageViewBitmap(R.id.button_toggle_play_pause, createBitmap(Util.getTintedVectorDrawable(service, playPauseRes, MaterialValueHelper.getPrimaryTextColor(service, false)), 1f));
|
||||
|
||||
// set prev/next button drawables
|
||||
// Set prev/next button drawables
|
||||
appWidgetView.setImageViewBitmap(R.id.button_next, createBitmap(Util.getTintedVectorDrawable(service, R.drawable.ic_skip_next_white_24dp, MaterialValueHelper.getPrimaryTextColor(service, false)), 1f));
|
||||
appWidgetView.setImageViewBitmap(R.id.button_prev, createBitmap(Util.getTintedVectorDrawable(service, R.drawable.ic_skip_previous_white_24dp, MaterialValueHelper.getPrimaryTextColor(service, false)), 1f));
|
||||
|
||||
// Link actions buttons to intents
|
||||
linkButtons(service, appWidgetView);
|
||||
|
||||
// load the album cover async and push the update on completion
|
||||
// Load the album cover async and push the update on completion
|
||||
Point p = Util.getScreenSize(service);
|
||||
final int widgetImageSize = Math.min(p.x, p.y);
|
||||
final Context appContext = service.getApplicationContext();
|
||||
|
|
@ -171,8 +172,6 @@ public class AppWidgetBig extends BaseAppWidget {
|
|||
});
|
||||
}
|
||||
|
||||
private Target<Bitmap> target; // for cancellation
|
||||
|
||||
/**
|
||||
* Link up various button actions using {@link PendingIntent}.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ public class AppWidgetClassic extends BaseAppWidget {
|
|||
public static final String NAME = "app_widget_classic";
|
||||
|
||||
private static AppWidgetClassic mInstance;
|
||||
private Target<Bitmap> target; // for cancellation
|
||||
|
||||
public static synchronized AppWidgetClassic getInstance() {
|
||||
if (mInstance == null) {
|
||||
|
|
@ -124,14 +125,14 @@ public class AppWidgetClassic extends BaseAppWidget {
|
|||
int playPauseRes = isPlaying ? R.drawable.ic_pause_white_24dp : R.drawable.ic_play_arrow_white_24dp;
|
||||
appWidgetView.setImageViewBitmap(R.id.button_toggle_play_pause, createBitmap(Util.getTintedVectorDrawable(service, playPauseRes, MaterialValueHelper.getSecondaryTextColor(service, false)), 1f));
|
||||
|
||||
// set prev/next button drawables
|
||||
// Set prev/next button drawables
|
||||
appWidgetView.setImageViewBitmap(R.id.button_next, createBitmap(Util.getTintedVectorDrawable(service, R.drawable.ic_skip_next_white_24dp, MaterialValueHelper.getSecondaryTextColor(service, false)), 1f));
|
||||
appWidgetView.setImageViewBitmap(R.id.button_prev, createBitmap(Util.getTintedVectorDrawable(service, R.drawable.ic_skip_previous_white_24dp, MaterialValueHelper.getSecondaryTextColor(service, false)), 1f));
|
||||
|
||||
// Link actions buttons to intents
|
||||
linkButtons(service, appWidgetView);
|
||||
|
||||
// load the album cover async and push the update on completion
|
||||
// Load the album cover async and push the update on completion
|
||||
final Context appContext = service.getApplicationContext();
|
||||
final int widgetImageSize = service.getResources().getDimensionPixelSize(R.dimen.app_widget_classic_image_size);
|
||||
service.runOnUiThread(new Runnable() {
|
||||
|
|
@ -169,8 +170,6 @@ public class AppWidgetClassic extends BaseAppWidget {
|
|||
});
|
||||
}
|
||||
|
||||
private Target<Bitmap> target; // for cancellation
|
||||
|
||||
/**
|
||||
* Link up various button actions using {@link PendingIntent}.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ public class AppWidgetSmall extends BaseAppWidget {
|
|||
public static final String NAME = "app_widget_small";
|
||||
|
||||
private static AppWidgetSmall mInstance;
|
||||
private Target<Bitmap> target; // for cancellation
|
||||
|
||||
public static synchronized AppWidgetSmall getInstance() {
|
||||
if (mInstance == null) {
|
||||
|
|
@ -130,14 +131,14 @@ public class AppWidgetSmall extends BaseAppWidget {
|
|||
int playPauseRes = isPlaying ? R.drawable.ic_pause_white_24dp : R.drawable.ic_play_arrow_white_24dp;
|
||||
appWidgetView.setImageViewBitmap(R.id.button_toggle_play_pause, createBitmap(Util.getTintedVectorDrawable(service, playPauseRes, MaterialValueHelper.getSecondaryTextColor(service, false)), 1f));
|
||||
|
||||
// set prev/next button drawables
|
||||
// Set prev/next button drawables
|
||||
appWidgetView.setImageViewBitmap(R.id.button_next, createBitmap(Util.getTintedVectorDrawable(service, R.drawable.ic_skip_next_white_24dp, MaterialValueHelper.getSecondaryTextColor(service, false)), 1f));
|
||||
appWidgetView.setImageViewBitmap(R.id.button_prev, createBitmap(Util.getTintedVectorDrawable(service, R.drawable.ic_skip_previous_white_24dp, MaterialValueHelper.getSecondaryTextColor(service, false)), 1f));
|
||||
|
||||
// Link actions buttons to intents
|
||||
linkButtons(service, appWidgetView);
|
||||
|
||||
// load the album cover async and push the update on completion
|
||||
// Load the album cover async and push the update on completion
|
||||
final Context appContext = service.getApplicationContext();
|
||||
final int widgetImageSize = service.getResources().getDimensionPixelSize(R.dimen.app_widget_small_image_size);
|
||||
service.runOnUiThread(new Runnable() {
|
||||
|
|
@ -175,8 +176,6 @@ public class AppWidgetSmall extends BaseAppWidget {
|
|||
});
|
||||
}
|
||||
|
||||
private Target<Bitmap> target; // for cancellation
|
||||
|
||||
/**
|
||||
* Link up various button actions using {@link PendingIntent}.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -14,12 +14,6 @@ import android.graphics.drawable.Drawable;
|
|||
*/
|
||||
public class BaseAppWidget extends AppWidgetProvider {
|
||||
|
||||
protected PendingIntent buildPendingIntent(Context context, final String action, final ComponentName serviceName) {
|
||||
Intent intent = new Intent(action);
|
||||
intent.setComponent(serviceName);
|
||||
return PendingIntent.getService(context, 0, intent, 0);
|
||||
}
|
||||
|
||||
protected static Bitmap createBitmap(Drawable drawable, float sizeMultiplier) {
|
||||
Bitmap bitmap = Bitmap.createBitmap((int) (drawable.getIntrinsicWidth() * sizeMultiplier), (int) (drawable.getIntrinsicHeight() * sizeMultiplier), Bitmap.Config.ARGB_8888);
|
||||
Canvas c = new Canvas(bitmap);
|
||||
|
|
@ -27,4 +21,10 @@ public class BaseAppWidget extends AppWidgetProvider {
|
|||
drawable.draw(c);
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
protected PendingIntent buildPendingIntent(Context context, final String action, final ComponentName serviceName) {
|
||||
Intent intent = new Intent(action);
|
||||
intent.setComponent(serviceName);
|
||||
return PendingIntent.getService(context, 0, intent, 0);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
package com.kabouzeid.gramophone.appwidgets;
|
||||
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
|
||||
import com.kabouzeid.gramophone.service.MusicService;
|
||||
|
||||
/**
|
||||
* @author Eugene Cheung (arkon)
|
||||
*/
|
||||
public class BootReceiver extends BroadcastReceiver {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
final AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);
|
||||
|
||||
// Start music service if there are any existing widgets
|
||||
if (widgetManager.getAppWidgetIds(new ComponentName(context, AppWidgetBig.class)).length > 0 ||
|
||||
widgetManager.getAppWidgetIds(new ComponentName(context, AppWidgetClassic.class)).length > 0 ||
|
||||
widgetManager.getAppWidgetIds(new ComponentName(context, AppWidgetSmall.class)).length > 0) {
|
||||
final Intent serviceIntent = new Intent(context, MusicService.class);
|
||||
context.startService(serviceIntent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -48,8 +48,8 @@ public class ArtistImageFetcher implements DataFetcher<InputStream> {
|
|||
|
||||
@Override
|
||||
public InputStream loadData(Priority priority) throws Exception {
|
||||
if (!MusicUtil.isArtistNameUnknown(model.artistName) && Util.isAllowedToAutoDownload(context)) {
|
||||
Response<LastFmArtist> response = lastFMRestClient.getApiService().getArtistInfo(model.artistName, model.skipOkHttpCache ? "no-cache" : null).execute();
|
||||
if (!MusicUtil.isArtistNameUnknown(model.artistName) && Util.isAllowedToDownloadMetadata(context)) {
|
||||
Response<LastFmArtist> response = lastFMRestClient.getApiService().getArtistInfo(model.artistName, null, model.skipOkHttpCache ? "no-cache" : null).execute();
|
||||
|
||||
if (!response.isSuccessful()) {
|
||||
throw new IOException("Request failed with code: " + response.code());
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ import okhttp3.Response;
|
|||
import retrofit2.Retrofit;
|
||||
import retrofit2.converter.gson.GsonConverterFactory;
|
||||
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
package com.kabouzeid.gramophone.lastfm.rest.model;
|
||||
|
||||
import com.google.gson.annotations.Expose;
|
||||
|
|
@ -8,7 +7,6 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
|
||||
public class LastFmAlbum {
|
||||
|
||||
@Expose
|
||||
private Album album;
|
||||
|
||||
|
|
@ -21,9 +19,10 @@ public class LastFmAlbum {
|
|||
}
|
||||
|
||||
public static class Album {
|
||||
|
||||
@Expose
|
||||
private List<Image> image = new ArrayList<>();
|
||||
@Expose
|
||||
private Wiki wiki;
|
||||
|
||||
public List<Image> getImage() {
|
||||
return image;
|
||||
|
|
@ -33,8 +32,26 @@ public class LastFmAlbum {
|
|||
this.image = image;
|
||||
}
|
||||
|
||||
public static class Image {
|
||||
public Wiki getWiki() { return wiki; }
|
||||
|
||||
public void setWiki(Wiki wiki) {
|
||||
this.wiki = wiki;
|
||||
}
|
||||
|
||||
public class Wiki {
|
||||
@Expose
|
||||
private String content;
|
||||
|
||||
public String getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
public void setContent(String content) {
|
||||
this.content = content;
|
||||
}
|
||||
}
|
||||
|
||||
public static class Image {
|
||||
@SerializedName("#text")
|
||||
@Expose
|
||||
private String Text;
|
||||
|
|
@ -58,5 +75,4 @@ public class LastFmAlbum {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
package com.kabouzeid.gramophone.lastfm.rest.model;
|
||||
|
||||
import com.google.gson.annotations.Expose;
|
||||
|
|
@ -8,7 +7,6 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
|
||||
public class LastFmArtist {
|
||||
|
||||
@Expose
|
||||
private Artist artist;
|
||||
|
||||
|
|
@ -21,7 +19,6 @@ public class LastFmArtist {
|
|||
}
|
||||
|
||||
public static class Artist {
|
||||
|
||||
@Expose
|
||||
private List<Image> image = new ArrayList<>();
|
||||
@Expose
|
||||
|
|
@ -44,7 +41,6 @@ public class LastFmArtist {
|
|||
}
|
||||
|
||||
public class Bio {
|
||||
|
||||
@Expose
|
||||
private String content;
|
||||
|
||||
|
|
@ -55,11 +51,9 @@ public class LastFmArtist {
|
|||
public void setContent(String content) {
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class Image {
|
||||
|
||||
@SerializedName("#text")
|
||||
@Expose
|
||||
private String Text;
|
||||
|
|
@ -81,9 +75,6 @@ public class LastFmArtist {
|
|||
public void setSize(String size) {
|
||||
this.size = size;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,8 +18,8 @@ public interface LastFMService {
|
|||
String BASE_QUERY_PARAMETERS = "?format=json&autocorrect=1&api_key=" + API_KEY;
|
||||
|
||||
@GET(BASE_QUERY_PARAMETERS + "&method=album.getinfo")
|
||||
Call<LastFmAlbum> getAlbumInfo(@Query("album") String albumName, @Query("artist") String artistName);
|
||||
Call<LastFmAlbum> getAlbumInfo(@Query("album") String albumName, @Query("artist") String artistName, @Nullable @Query("lang") String language);
|
||||
|
||||
@GET(BASE_QUERY_PARAMETERS + "&method=artist.getinfo")
|
||||
Call<LastFmArtist> getArtistInfo(@Query("artist") String artistName, @Nullable @Header("Cache-Control") String cacheControl);
|
||||
Call<LastFmArtist> getArtistInfo(@Query("artist") String artistName, @Nullable @Query("lang") String language, @Nullable @Header("Cache-Control") String cacheControl);
|
||||
}
|
||||
|
|
@ -1,35 +1,31 @@
|
|||
package com.kabouzeid.gramophone.misc;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.os.Build;
|
||||
import android.transition.Transition;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
@TargetApi(21)
|
||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
||||
public abstract class SimpleTransitionListener implements Transition.TransitionListener {
|
||||
@Override
|
||||
public void onTransitionStart(Transition transition) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransitionEnd(Transition transition) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransitionCancel(Transition transition) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransitionPause(Transition transition) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransitionResume(Transition transition) {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ import android.support.annotation.NonNull;
|
|||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.loader.LastAddedLoader;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ import com.kabouzeid.gramophone.dialogs.DonationsDialog;
|
|||
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.bugreport.BugReportActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.intro.AppIntroActivity;
|
||||
import com.kabouzeid.gramophone.util.ViewUtil;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
|
|
@ -69,7 +68,7 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen
|
|||
LinearLayout addToGooglePlusCircles;
|
||||
@BindView(R.id.follow_on_twitter)
|
||||
LinearLayout followOnTwitter;
|
||||
@BindView(R.id.fork_on_git_hub)
|
||||
@BindView(R.id.fork_on_github)
|
||||
LinearLayout forkOnGitHub;
|
||||
@BindView(R.id.visit_website)
|
||||
LinearLayout visitWebsite;
|
||||
|
|
@ -95,8 +94,6 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen
|
|||
AppCompatButton maartenCorpelGooglePlus;
|
||||
@BindView(R.id.aleksandar_tesic_google_plus)
|
||||
AppCompatButton aleksandarTesicGooglePlus;
|
||||
@BindView(R.id.status_bar)
|
||||
View statusBar;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
|
|
@ -108,7 +105,6 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen
|
|||
setStatusbarColorAuto();
|
||||
setNavigationbarColorAuto();
|
||||
setTaskDescriptionColorAuto();
|
||||
ViewUtil.setStatusBarHeight(this, statusBar);
|
||||
|
||||
setUpViews();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,18 +5,23 @@ import android.content.Intent;
|
|||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.app.LoaderManager;
|
||||
import android.support.v4.content.Loader;
|
||||
import android.support.v7.widget.GridLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.text.Html;
|
||||
import android.text.Spanned;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.afollestad.materialcab.MaterialCab;
|
||||
import com.afollestad.materialdialogs.MaterialDialog;
|
||||
import com.afollestad.materialdialogs.util.DialogUtils;
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.request.RequestListener;
|
||||
|
|
@ -36,6 +41,8 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
|||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||
import com.kabouzeid.gramophone.interfaces.LoaderIds;
|
||||
import com.kabouzeid.gramophone.interfaces.PaletteColorHolder;
|
||||
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.misc.SimpleObservableScrollViewCallbacks;
|
||||
import com.kabouzeid.gramophone.misc.WrappedAsyncTaskLoader;
|
||||
|
|
@ -47,12 +54,16 @@ import com.kabouzeid.gramophone.ui.activities.tageditor.AlbumTagEditorActivity;
|
|||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
import com.kabouzeid.gramophone.util.PhonographColorUtil;
|
||||
import com.kabouzeid.gramophone.util.Util;
|
||||
import com.kabouzeid.gramophone.util.ViewUtil;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Response;
|
||||
|
||||
/**
|
||||
* Be careful when changing things in this Activity!
|
||||
|
|
@ -77,8 +88,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
|
|||
TextView albumTitleView;
|
||||
@BindView(R.id.list_background)
|
||||
View songsBackgroundView;
|
||||
@BindView(R.id.status_bar)
|
||||
View statusBar;
|
||||
|
||||
private AlbumSongAdapter adapter;
|
||||
|
||||
|
|
@ -89,6 +98,11 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
|
|||
private int toolbarColor;
|
||||
private float toolbarAlpha;
|
||||
|
||||
@Nullable
|
||||
private Spanned wiki;
|
||||
private MaterialDialog wikiDialog;
|
||||
private LastFMRestClient lastFMRestClient;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
|
@ -97,10 +111,11 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
|
|||
|
||||
supportPostponeEnterTransition();
|
||||
|
||||
lastFMRestClient = new LastFMRestClient(this);
|
||||
|
||||
setUpObservableListViewParams();
|
||||
setUpToolBar();
|
||||
setUpViews();
|
||||
ViewUtil.setStatusBarHeight(this, statusBar);
|
||||
|
||||
getSupportLoaderManager().initLoader(LOADER_ID, getIntent().getExtras(), this);
|
||||
}
|
||||
|
|
@ -242,6 +257,49 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
|
|||
return true;
|
||||
}
|
||||
|
||||
private void loadWiki() {
|
||||
loadWiki(Locale.getDefault().getLanguage());
|
||||
}
|
||||
|
||||
private void loadWiki(@Nullable final String lang) {
|
||||
wiki = null;
|
||||
|
||||
lastFMRestClient.getApiService()
|
||||
.getAlbumInfo(getAlbum().getTitle(), getAlbum().getArtistName(), lang)
|
||||
.enqueue(new Callback<LastFmAlbum>() {
|
||||
@Override
|
||||
public void onResponse(@NonNull Call<LastFmAlbum> call, @NonNull Response<LastFmAlbum> response) {
|
||||
final LastFmAlbum lastFmAlbum = response.body();
|
||||
if (lastFmAlbum != null && lastFmAlbum.getAlbum() != null && lastFmAlbum.getAlbum().getWiki() != null) {
|
||||
final String wikiContent = lastFmAlbum.getAlbum().getWiki().getContent();
|
||||
if (wikiContent != null && !wikiContent.trim().isEmpty()) {
|
||||
wiki = Html.fromHtml(wikiContent);
|
||||
}
|
||||
}
|
||||
|
||||
// If the "lang" parameter is set and no wiki is given, retry with default language
|
||||
if (wiki == null && lang != null) {
|
||||
loadWiki(null);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Util.isAllowedToDownloadMetadata(AlbumDetailActivity.this)) {
|
||||
if (wiki != null) {
|
||||
wikiDialog.setContent(wiki);
|
||||
} else {
|
||||
wikiDialog.dismiss();
|
||||
Toast.makeText(AlbumDetailActivity.this, getResources().getString(R.string.wiki_unavailable), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(@NonNull Call<LastFmAlbum> call, @NonNull Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||
int id = item.getItemId();
|
||||
|
|
@ -279,6 +337,25 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
|
|||
case R.id.action_go_to_artist:
|
||||
NavigationUtil.goToArtist(this, getAlbum().getArtistId());
|
||||
return true;
|
||||
case R.id.action_wiki:
|
||||
if (wikiDialog == null) {
|
||||
wikiDialog = new MaterialDialog.Builder(this)
|
||||
.title(album.getTitle())
|
||||
.positiveText(android.R.string.ok)
|
||||
.build();
|
||||
}
|
||||
if (Util.isAllowedToDownloadMetadata(this)) {
|
||||
if (wiki != null) {
|
||||
wikiDialog.setContent(wiki);
|
||||
wikiDialog.show();
|
||||
} else {
|
||||
Toast.makeText(this, getResources().getString(R.string.wiki_unavailable), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
} else {
|
||||
wikiDialog.show();
|
||||
loadWiki();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
|
@ -345,6 +422,11 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
|
|||
private void setAlbum(Album album) {
|
||||
this.album = album;
|
||||
loadAlbumCover();
|
||||
|
||||
if (Util.isAllowedToDownloadMetadata(this)) {
|
||||
loadWiki();
|
||||
}
|
||||
|
||||
albumTitleView.setText(album.getTitle());
|
||||
adapter.swapDataSet(album.songs);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,7 +57,8 @@ 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 java.util.Locale;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
|
@ -87,8 +88,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
|
|||
TextView artistName;
|
||||
@BindView(R.id.toolbar)
|
||||
Toolbar toolbar;
|
||||
@BindView(R.id.status_bar)
|
||||
View statusBar;
|
||||
|
||||
View songListHeader;
|
||||
RecyclerView albumRecyclerView;
|
||||
|
|
@ -104,6 +103,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
|
|||
private Artist artist;
|
||||
@Nullable
|
||||
private Spanned biography;
|
||||
private MaterialDialog biographyDialog;
|
||||
private HorizontalAlbumAdapter albumAdapter;
|
||||
private ArtistSongAdapter songAdapter;
|
||||
|
||||
|
|
@ -118,13 +118,12 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
|
|||
supportPostponeEnterTransition();
|
||||
|
||||
lastFMRestClient = new LastFMRestClient(this);
|
||||
usePalette=PreferenceUtil.getInstance(this).albumArtistColoredFooters();
|
||||
usePalette = PreferenceUtil.getInstance(this).albumArtistColoredFooters();
|
||||
|
||||
initViews();
|
||||
setUpObservableListViewParams();
|
||||
setUpViews();
|
||||
setUpToolbar();
|
||||
ViewUtil.setStatusBarHeight(this, statusBar);
|
||||
|
||||
getSupportLoaderManager().initLoader(LOADER_ID, getIntent().getExtras(), this);
|
||||
}
|
||||
|
|
@ -227,34 +226,47 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
|
|||
}
|
||||
|
||||
private void loadBiography() {
|
||||
lastFMRestClient.getApiService().getArtistInfo(getArtist().getName(), null).enqueue(new Callback<LastFmArtist>() {
|
||||
@Override
|
||||
public void onResponse(Call<LastFmArtist> call, Response<LastFmArtist> response) {
|
||||
LastFmArtist lastFmArtist = response.body();
|
||||
if (lastFmArtist.getArtist() != null) {
|
||||
String bio = lastFmArtist.getArtist().getBio().getContent();
|
||||
if (bio != null && !bio.trim().equals("")) {
|
||||
biography = Html.fromHtml(bio);
|
||||
return;
|
||||
}
|
||||
}
|
||||
biography = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Call<LastFmArtist> call, Throwable t) {
|
||||
t.printStackTrace();
|
||||
biography = null;
|
||||
}
|
||||
});
|
||||
loadBiography(Locale.getDefault().getLanguage());
|
||||
}
|
||||
|
||||
private MaterialDialog getBiographyDialog() {
|
||||
return new MaterialDialog.Builder(ArtistDetailActivity.this)
|
||||
.title(getArtist().getName())
|
||||
.content(biography != null ? biography : "")
|
||||
.positiveText(android.R.string.ok)
|
||||
.build();
|
||||
private void loadBiography(@Nullable final String lang) {
|
||||
biography = null;
|
||||
|
||||
lastFMRestClient.getApiService()
|
||||
.getArtistInfo(getArtist().getName(), lang, null)
|
||||
.enqueue(new Callback<LastFmArtist>() {
|
||||
@Override
|
||||
public void onResponse(@NonNull Call<LastFmArtist> call, @NonNull Response<LastFmArtist> response) {
|
||||
final LastFmArtist lastFmArtist = response.body();
|
||||
if (lastFmArtist != null && lastFmArtist.getArtist() != null) {
|
||||
final String bioContent = lastFmArtist.getArtist().getBio().getContent();
|
||||
if (bioContent != null && !bioContent.trim().isEmpty()) {
|
||||
biography = Html.fromHtml(bioContent);
|
||||
}
|
||||
}
|
||||
|
||||
// If the "lang" parameter is set and no biography is given, retry with default language
|
||||
if (biography == null && lang != null) {
|
||||
loadBiography(null);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Util.isAllowedToDownloadMetadata(ArtistDetailActivity.this)) {
|
||||
if (biography != null) {
|
||||
biographyDialog.setContent(biography);
|
||||
} else {
|
||||
biographyDialog.dismiss();
|
||||
Toast.makeText(ArtistDetailActivity.this, getResources().getString(R.string.biography_unavailable), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(@NonNull Call<LastFmArtist> call, @NonNull Throwable t) {
|
||||
t.printStackTrace();
|
||||
biography = null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void loadArtistImage(final boolean forceDownload) {
|
||||
|
|
@ -357,10 +369,22 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
|
|||
super.onBackPressed();
|
||||
return true;
|
||||
case R.id.action_biography:
|
||||
if (biography != null) {
|
||||
getBiographyDialog().show();
|
||||
if (biographyDialog == null) {
|
||||
biographyDialog = new MaterialDialog.Builder(this)
|
||||
.title(artist.getName())
|
||||
.positiveText(android.R.string.ok)
|
||||
.build();
|
||||
}
|
||||
if (Util.isAllowedToDownloadMetadata(ArtistDetailActivity.this)) {
|
||||
if (biography != null) {
|
||||
biographyDialog.setContent(biography);
|
||||
biographyDialog.show();
|
||||
} else {
|
||||
Toast.makeText(ArtistDetailActivity.this, getResources().getString(R.string.biography_unavailable), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
} else {
|
||||
Toast.makeText(ArtistDetailActivity.this, getResources().getString(R.string.biography_unavailable), Toast.LENGTH_SHORT).show();
|
||||
biographyDialog.show();
|
||||
loadBiography();
|
||||
}
|
||||
return true;
|
||||
case R.id.action_re_download_artist_image:
|
||||
|
|
@ -428,7 +452,11 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
|
|||
private void setArtist(Artist artist) {
|
||||
this.artist = artist;
|
||||
loadArtistImage(false);
|
||||
loadBiography();
|
||||
|
||||
if (Util.isAllowedToDownloadMetadata(this)) {
|
||||
loadBiography();
|
||||
}
|
||||
|
||||
artistName.setText(artist.getName());
|
||||
songAdapter.swapDataSet(artist.getSongs());
|
||||
albumAdapter.swapDataSet(artist.albums);
|
||||
|
|
|
|||
|
|
@ -61,8 +61,6 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
|
|||
Toolbar toolbar;
|
||||
@BindView(android.R.id.empty)
|
||||
TextView empty;
|
||||
@BindView(R.id.status_bar)
|
||||
View statusBar;
|
||||
|
||||
private Playlist playlist;
|
||||
|
||||
|
|
@ -81,7 +79,6 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
|
|||
setStatusbarColorAuto();
|
||||
setNavigationbarColorAuto();
|
||||
setTaskDescriptionColorAuto();
|
||||
ViewUtil.setStatusBarHeight(this, statusBar);
|
||||
|
||||
playlist = getIntent().getExtras().getParcelable(EXTRA_PLAYLIST);
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@ import com.kabouzeid.gramophone.loader.SongLoader;
|
|||
import com.kabouzeid.gramophone.misc.WrappedAsyncTaskLoader;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsMusicServiceActivity;
|
||||
import com.kabouzeid.gramophone.util.Util;
|
||||
import com.kabouzeid.gramophone.util.ViewUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
|
|
@ -47,8 +46,6 @@ public class SearchActivity extends AbsMusicServiceActivity implements SearchVie
|
|||
Toolbar toolbar;
|
||||
@BindView(android.R.id.empty)
|
||||
TextView empty;
|
||||
@BindView(R.id.status_bar)
|
||||
View statusBar;
|
||||
|
||||
SearchView searchView;
|
||||
|
||||
|
|
@ -65,7 +62,6 @@ public class SearchActivity extends AbsMusicServiceActivity implements SearchVie
|
|||
setStatusbarColorAuto();
|
||||
setNavigationbarColorAuto();
|
||||
setTaskDescriptionColorAuto();
|
||||
ViewUtil.setStatusBarHeight(this, statusBar);
|
||||
|
||||
recyclerView.setLayoutManager(new LinearLayoutManager(this));
|
||||
adapter = new SearchAdapter(this, Collections.emptyList());
|
||||
|
|
|
|||
|
|
@ -33,7 +33,6 @@ import com.kabouzeid.gramophone.service.MusicService;
|
|||
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
||||
import com.kabouzeid.gramophone.util.ViewUtil;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
|
|
@ -43,8 +42,6 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
|
|||
|
||||
@BindView(R.id.toolbar)
|
||||
Toolbar toolbar;
|
||||
@BindView(R.id.status_bar)
|
||||
View statusBar;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
|
|
@ -56,7 +53,6 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
|
|||
setStatusbarColorAuto();
|
||||
setNavigationbarColorAuto();
|
||||
setTaskDescriptionColorAuto();
|
||||
ViewUtil.setStatusBarHeight(this, statusBar);
|
||||
|
||||
toolbar.setBackgroundColor(ThemeStore.primaryColor(this));
|
||||
setSupportActionBar(toolbar);
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
|
|||
Toast.makeText(this, getResources().getString(R.string.album_or_artist_empty), Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
lastFMRestClient.getApiService().getAlbumInfo(albumTitleStr, albumArtistNameStr).enqueue(new Callback<LastFmAlbum>() {
|
||||
lastFMRestClient.getApiService().getAlbumInfo(albumTitleStr, albumArtistNameStr, null).enqueue(new Callback<LastFmAlbum>() {
|
||||
@Override
|
||||
public void onResponse(Call<LastFmAlbum> call, Response<LastFmAlbum> response) {
|
||||
LastFmAlbum lastFmAlbum = response.body();
|
||||
|
|
|
|||
|
|
@ -92,8 +92,6 @@ public class FoldersFragment extends AbsMainActivityFragment implements MainActi
|
|||
AppBarLayout appbar;
|
||||
@BindView(R.id.recycler_view)
|
||||
FastScrollRecyclerView recyclerView;
|
||||
@BindView(R.id.status_bar)
|
||||
View statusBar;
|
||||
|
||||
private SongFileAdapter adapter;
|
||||
private MaterialCab cab;
|
||||
|
|
@ -170,7 +168,6 @@ public class FoldersFragment extends AbsMainActivityFragment implements MainActi
|
|||
setUpBreadCrumbs();
|
||||
setUpRecyclerView();
|
||||
setUpAdapter();
|
||||
ViewUtil.setStatusBarHeight(getActivity(), statusBar);
|
||||
}
|
||||
|
||||
private void setUpAppbarColor() {
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@ 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 butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
|
|
@ -58,8 +57,6 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
|
|||
AppBarLayout appbar;
|
||||
@BindView(R.id.pager)
|
||||
ViewPager pager;
|
||||
@BindView(R.id.status_bar)
|
||||
View statusBar;
|
||||
|
||||
private MusicLibraryPagerAdapter pagerAdapter;
|
||||
private MaterialCab cab;
|
||||
|
|
@ -93,8 +90,6 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
|
|||
|
||||
setUpToolbar();
|
||||
setUpViewPager();
|
||||
setUpStatusBar();
|
||||
ViewUtil.setStatusBarHeight(getActivity(), statusBar);
|
||||
}
|
||||
|
||||
private void setUpToolbar() {
|
||||
|
|
@ -127,12 +122,6 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
|
|||
pager.addOnPageChangeListener(this);
|
||||
}
|
||||
|
||||
private void setUpStatusBar() {
|
||||
ViewGroup.LayoutParams layoutParams = statusBar.getLayoutParams();
|
||||
layoutParams.height = Util.getStatusBarHeight(getMainActivity());
|
||||
statusBar.setLayoutParams(layoutParams);
|
||||
}
|
||||
|
||||
public Fragment getCurrentFragment() {
|
||||
return pagerAdapter.getFragment(pager.getCurrentItem());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@ import android.support.v7.widget.GridLayoutManager;
|
|||
|
||||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.adapter.album.AlbumAdapter;
|
||||
import com.kabouzeid.gramophone.loader.AlbumLoader;
|
||||
import com.kabouzeid.gramophone.interfaces.LoaderIds;
|
||||
import com.kabouzeid.gramophone.loader.AlbumLoader;
|
||||
import com.kabouzeid.gramophone.misc.WrappedAsyncTaskLoader;
|
||||
import com.kabouzeid.gramophone.model.Album;
|
||||
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@ import android.support.v7.widget.GridLayoutManager;
|
|||
|
||||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.adapter.artist.ArtistAdapter;
|
||||
import com.kabouzeid.gramophone.loader.ArtistLoader;
|
||||
import com.kabouzeid.gramophone.interfaces.LoaderIds;
|
||||
import com.kabouzeid.gramophone.loader.ArtistLoader;
|
||||
import com.kabouzeid.gramophone.misc.WrappedAsyncTaskLoader;
|
||||
import com.kabouzeid.gramophone.model.Artist;
|
||||
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@ import android.support.v7.widget.LinearLayoutManager;
|
|||
|
||||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.adapter.PlaylistAdapter;
|
||||
import com.kabouzeid.gramophone.loader.PlaylistLoader;
|
||||
import com.kabouzeid.gramophone.interfaces.LoaderIds;
|
||||
import com.kabouzeid.gramophone.loader.PlaylistLoader;
|
||||
import com.kabouzeid.gramophone.misc.WrappedAsyncTaskLoader;
|
||||
import com.kabouzeid.gramophone.model.Playlist;
|
||||
import com.kabouzeid.gramophone.model.smartplaylist.HistoryPlaylist;
|
||||
|
|
|
|||
|
|
@ -10,8 +10,8 @@ import android.support.v7.widget.GridLayoutManager;
|
|||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.adapter.song.ShuffleButtonSongAdapter;
|
||||
import com.kabouzeid.gramophone.adapter.song.SongAdapter;
|
||||
import com.kabouzeid.gramophone.loader.SongLoader;
|
||||
import com.kabouzeid.gramophone.interfaces.LoaderIds;
|
||||
import com.kabouzeid.gramophone.loader.SongLoader;
|
||||
import com.kabouzeid.gramophone.misc.WrappedAsyncTaskLoader;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
||||
|
|
|
|||
|
|
@ -88,6 +88,10 @@ public abstract class AbsPlayerFragment extends AbsMusicServiceFragment implemen
|
|||
MusicUtil.toggleFavorite(getActivity(), song);
|
||||
}
|
||||
|
||||
protected String getUpNextAndQueueTime() {
|
||||
return getResources().getString(R.string.up_next) + " • " + MusicUtil.getReadableDurationString(MusicPlayerRemote.getQueueDurationMillis(MusicPlayerRemote.getPosition()));
|
||||
}
|
||||
|
||||
public abstract void onShow();
|
||||
|
||||
public abstract void onHide();
|
||||
|
|
|
|||
|
|
@ -119,12 +119,6 @@ public class CardPlayerFragment extends AbsPlayerFragment implements PlayerAlbum
|
|||
setUpPlayerToolbar();
|
||||
setUpSubFragments();
|
||||
|
||||
// portrait view doesn't have a statusBar, so can't bind it up top as will throw an exception.
|
||||
View statusBar = view.findViewById(R.id.status_bar);
|
||||
if (statusBar != null) {
|
||||
ViewUtil.setStatusBarHeight(getActivity(), statusBar);
|
||||
}
|
||||
|
||||
setUpRecyclerView();
|
||||
|
||||
slidingUpPanelLayout.addPanelSlideListener(this);
|
||||
|
|
@ -204,7 +198,7 @@ public class CardPlayerFragment extends AbsPlayerFragment implements PlayerAlbum
|
|||
|
||||
private void updateQueue() {
|
||||
playingQueueAdapter.swapDataSet(MusicPlayerRemote.getPlayingQueue(), MusicPlayerRemote.getPosition());
|
||||
playerQueueSubHeader.setText(getResources().getString(R.string.up_next) + " • " + MusicUtil.getReadableDurationString(MusicPlayerRemote.getQueueDurationMillis(MusicPlayerRemote.getPosition())));
|
||||
playerQueueSubHeader.setText(getUpNextAndQueueTime());
|
||||
if (slidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
|
||||
resetToCurrentPosition();
|
||||
}
|
||||
|
|
@ -212,7 +206,7 @@ public class CardPlayerFragment extends AbsPlayerFragment implements PlayerAlbum
|
|||
|
||||
private void updateQueuePosition() {
|
||||
playingQueueAdapter.setCurrent(MusicPlayerRemote.getPosition());
|
||||
playerQueueSubHeader.setText(getResources().getString(R.string.up_next) + " • " + MusicUtil.getReadableDurationString(MusicPlayerRemote.getQueueDurationMillis(MusicPlayerRemote.getPosition())));
|
||||
playerQueueSubHeader.setText(getUpNextAndQueueTime());
|
||||
if (slidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
|
||||
resetToCurrentPosition();
|
||||
}
|
||||
|
|
@ -323,6 +317,7 @@ public class CardPlayerFragment extends AbsPlayerFragment implements PlayerAlbum
|
|||
try {
|
||||
return AudioFileIO.read(new File(song.data)).getTagOrCreateDefault().getFirst(FieldKey.LYRICS);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
cancel(false);
|
||||
return null;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -114,9 +114,7 @@ public class FlatPlayerFragment extends AbsPlayerFragment implements PlayerAlbum
|
|||
impl.init();
|
||||
|
||||
setUpPlayerToolbar();
|
||||
setUpStatusBar();
|
||||
setUpSubFragments();
|
||||
ViewUtil.setStatusBarHeight(getActivity(), playerStatusBar);
|
||||
|
||||
setUpRecyclerView();
|
||||
|
||||
|
|
@ -196,7 +194,7 @@ public class FlatPlayerFragment extends AbsPlayerFragment implements PlayerAlbum
|
|||
|
||||
private void updateQueue() {
|
||||
playingQueueAdapter.swapDataSet(MusicPlayerRemote.getPlayingQueue(), MusicPlayerRemote.getPosition());
|
||||
playerQueueSubHeader.setText(getResources().getString(R.string.up_next) + " • " + MusicUtil.getReadableDurationString(MusicPlayerRemote.getQueueDurationMillis(MusicPlayerRemote.getPosition())));
|
||||
playerQueueSubHeader.setText(getUpNextAndQueueTime());
|
||||
if (slidingUpPanelLayout == null || slidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
|
||||
resetToCurrentPosition();
|
||||
}
|
||||
|
|
@ -204,7 +202,7 @@ public class FlatPlayerFragment extends AbsPlayerFragment implements PlayerAlbum
|
|||
|
||||
private void updateQueuePosition() {
|
||||
playingQueueAdapter.setCurrent(MusicPlayerRemote.getPosition());
|
||||
playerQueueSubHeader.setText(getResources().getString(R.string.up_next) + " • " + MusicUtil.getReadableDurationString(MusicPlayerRemote.getQueueDurationMillis(MusicPlayerRemote.getPosition())));
|
||||
playerQueueSubHeader.setText(getUpNextAndQueueTime());
|
||||
if (slidingUpPanelLayout == null || slidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.COLLAPSED) {
|
||||
resetToCurrentPosition();
|
||||
}
|
||||
|
|
@ -234,12 +232,6 @@ public class FlatPlayerFragment extends AbsPlayerFragment implements PlayerAlbum
|
|||
toolbar.setOnMenuItemClickListener(this);
|
||||
}
|
||||
|
||||
private void setUpStatusBar() {
|
||||
ViewGroup.LayoutParams layoutParams = playerStatusBar.getLayoutParams();
|
||||
layoutParams.height = Util.getStatusBarHeight(getActivity());
|
||||
playerStatusBar.setLayoutParams(layoutParams);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onMenuItemClick(MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
|
|
@ -321,6 +313,7 @@ public class FlatPlayerFragment extends AbsPlayerFragment implements PlayerAlbum
|
|||
try {
|
||||
return AudioFileIO.read(new File(song.data)).getTagOrCreateDefault().getFirst(FieldKey.LYRICS);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
cancel(false);
|
||||
return null;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import java.util.Calendar;
|
|||
import java.util.GregorianCalendar;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
* @author Eugene Cheung (arkon)
|
||||
*/
|
||||
public class CalendarUtil {
|
||||
private static final long MS_PER_MINUTE = 60 * 1000;
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ public class Util {
|
|||
return size;
|
||||
}
|
||||
|
||||
@TargetApi(19)
|
||||
@TargetApi(Build.VERSION_CODES.KITKAT)
|
||||
public static void setStatusBarTranslucent(@NonNull Window window) {
|
||||
window.setFlags(
|
||||
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
|
||||
|
|
@ -121,7 +121,7 @@ public class Util {
|
|||
} else return false;
|
||||
}
|
||||
|
||||
public static boolean isAllowedToAutoDownload(final Context context) {
|
||||
public static boolean isAllowedToDownloadMetadata(final Context context) {
|
||||
switch (PreferenceUtil.getInstance(context).autoDownloadImagesPolicy()) {
|
||||
case "always":
|
||||
return true;
|
||||
|
|
@ -135,12 +135,4 @@ public class Util {
|
|||
}
|
||||
}
|
||||
|
||||
public static int getStatusBarHeight(final Context context) {
|
||||
int result = 0;
|
||||
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
|
||||
if (resourceId > 0) {
|
||||
result = context.getResources().getDimensionPixelSize(resourceId);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
@ -16,7 +16,6 @@ import android.support.annotation.ColorInt;
|
|||
import android.support.v4.view.ViewCompat;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.animation.PathInterpolator;
|
||||
import android.widget.TextView;
|
||||
|
||||
|
|
@ -97,10 +96,4 @@ public class ViewUtil {
|
|||
DisplayMetrics metrics = resources.getDisplayMetrics();
|
||||
return px / metrics.density;
|
||||
}
|
||||
|
||||
public static void setStatusBarHeight(final Context context, View statusBar) {
|
||||
ViewGroup.LayoutParams lp = statusBar.getLayoutParams();
|
||||
lp.height = Util.getStatusBarHeight(context);
|
||||
statusBar.requestLayout();
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue