Merge branch 'master' into album-actions

This commit is contained in:
Eugene Cheung 2017-07-07 18:08:19 -04:00 committed by GitHub
commit 9e69136b1d
178 changed files with 628 additions and 514 deletions

View file

@ -1,10 +1,15 @@
# Phonograph
A material designed local music player for Android.
**A material designed local music player for Android.**
![Screenshots](./art/art.jpg?raw=true)
<a href="https://play.google.com/store/apps/details?id=com.kabouzeid.gramophone">
<img height="50" alt="Get it on Google Play"
src="https://play.google.com/intl/en_us/badges/images/apps/en-play-badge.png" />
src="https://play.google.com/intl/en_us/badges/images/apps/en-play-badge.png" />
</a>
## License
Phonograph is released under the GNU General Public License v3.0 (GPLv3), which can be found here: [License](LICENSE.txt)

View file

@ -17,11 +17,6 @@ apply plugin: 'com.jakewharton.hugo'
repositories {
maven { url 'https://maven.fabric.io/public' }
maven {
name 'glide-snapshot'
url 'http://oss.sonatype.org/content/repositories/snapshots'
}
}
android {
@ -37,9 +32,9 @@ android {
renderscriptTargetApi 25
vectorDrawables.useSupportLibrary = true
applicationId "com.kabouzeid.gramophone"
applicationId 'com.kabouzeid.gramophone'
versionCode 132
versionName "0.15.0"
versionName '0.15.0'
}
buildTypes {
release {
@ -93,7 +88,7 @@ dependencies {
compile 'com.crashlytics.sdk.android:crashlytics:2.6.7'
compile 'com.github.kabouzeid:app-theme-helper:1.3.7'
compile 'com.github.kabouzeid:RecyclerView-FastScroll:1.9-kmod'
compile 'com.github.kabouzeid:RecyclerView-FastScroll:1.0.16-kmod'
compile 'com.github.kabouzeid:SeekArc:1.2-kmod'
compile 'com.github.kabouzeid:AndroidSlidingUpPanel:3.3.0-kmod3'
@ -101,12 +96,11 @@ dependencies {
compile 'com.afollestad.material-dialogs:commons:0.9.4.5'
compile 'com.afollestad:material-cab:0.1.12'
compile "com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:0.10.6"
compile 'com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:0.10.6'
compile 'com.github.ksoichiro:android-observablescrollview:1.6.0'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
//noinspection GradleDynamicVersion
compile 'com.anjlab.android.iab.v3:library:1.0.+'
compile 'com.anjlab.android.iab.v3:library:1.0.40'
compile 'de.psdev.licensesdialog:licensesdialog:1.8.1'
compile 'com.github.bumptech.glide:glide:3.8.0'
compile 'com.github.bumptech.glide:okhttp3-integration:1.5.0'

View file

@ -10,6 +10,7 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="com.android.vending.BILLING" />
<application
@ -20,6 +21,7 @@
android:supportsRtl="true"
android:theme="@style/Theme.Phonograph.Light"
tools:ignore="UnusedAttribute">
<activity android:name=".ui.activities.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@ -93,6 +95,31 @@
</activity>
<activity android:name=".ui.activities.AlbumDetailActivity" />
<activity android:name=".ui.activities.ArtistDetailActivity" />
<activity android:name=".ui.activities.PlaylistDetailActivity" />
<activity
android:name=".ui.activities.tageditor.SongTagEditorActivity"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".ui.activities.tageditor.AlbumTagEditorActivity"
android:windowSoftInputMode="adjustResize" />
<activity android:name=".ui.activities.SearchActivity" />
<activity
android:name=".ui.activities.SettingsActivity"
android:label="@string/action_settings" />
<activity
android:name=".ui.activities.AboutActivity"
android:label="@string/action_about" />
<activity
android:name=".ui.activities.intro.AppIntroActivity"
android:label="@string/intro_label"
android:theme="@style/Theme.Intro" />
<activity
android:name=".ui.activities.bugreport.BugReportActivity"
android:label="@string/report_an_issue" />
<activity
android:name=".appshortcuts.AppShortcutLauncherActivity"
android:launchMode="singleInstance"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<service
android:name=".service.MusicService"
@ -119,15 +146,14 @@
<meta-data
android:name="com.bumptech.glide.integration.okhttp3.OkHttpGlideModule"
android:value="GlideModule" />
<activity
android:name=".ui.activities.tageditor.SongTagEditorActivity"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".ui.activities.tageditor.AlbumTagEditorActivity"
android:windowSoftInputMode="adjustResize" />
<activity android:name=".ui.activities.SearchActivity" />
<!-- Widgets -->
<receiver android:name=".appwidgets.BootReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
<receiver
android:name=".appwidgets.AppWidgetBig"
android:exported="false"
@ -165,24 +191,6 @@
android:resource="@xml/app_widget_small_info" />
</receiver>
<activity
android:name=".ui.activities.SettingsActivity"
android:label="@string/action_settings" />
<activity android:name=".ui.activities.PlaylistDetailActivity" />
<activity
android:name=".ui.activities.AboutActivity"
android:label="@string/action_about" />
<activity
android:name=".ui.activities.intro.AppIntroActivity"
android:label="@string/intro_label"
android:theme="@style/Theme.Intro" />
<activity
android:name=".ui.activities.bugreport.BugReportActivity"
android:label="@string/report_an_issue" />
<activity
android:name=".appshortcuts.AppShortcutLauncherActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:launchMode="singleInstance"/>
</application>
</manifest>

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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}.
*/

View file

@ -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}.
*/

View file

@ -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}.
*/

View file

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

View file

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

View file

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

View file

@ -18,7 +18,6 @@ import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* @author Karim Abou Zeid (kabouzeid)
*/

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -7,8 +7,8 @@
<item>
<selector>
<item
android:state_activated="true"
android:drawable="@color/ripple_material_light" />
android:drawable="@color/ripple_material_light"
android:state_activated="true" />
</selector>
</item>

View file

@ -1,5 +1,5 @@
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/ripple_material_dark">
android:color="@color/ripple_material_dark">
<item
android:id="@android:id/mask"
@ -7,8 +7,8 @@
<item>
<selector>
<item
android:state_activated="true"
android:drawable="@color/ripple_material_dark" />
android:drawable="@color/ripple_material_dark"
android:state_activated="true" />
</selector>
</item>

View file

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

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M9,3H11V5H9V3M13,3H15V5H13V3M9,7H11V9H9V7M13,7H15V9H13V7M9,11H11V13H9V11M13,11H15V13H13V11M9,15H11V17H9V15M13,15H15V17H13V15M9,19H11V21H9V19M13,19H15V21H13V19Z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM12.5,7H11v6l5.25,3.15 0.75,-1.23 -4.5,-2.67z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M19,3h-4.18C14.4,1.84 13.3,1 12,1c-1.3,0 -2.4,0.84 -2.82,2L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,3c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM10,17l-4,-4 1.41,-1.41L10,14.17l6.59,-6.59L18,9l-8,8z" />

View file

@ -1,9 +1,9 @@
<!-- drawable/ic_bookmark_music_white_24dp.xmlwhite_24dp.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M17,3A2,2 0 0,1 19,5V21L12,18L5,21V5C5,3.89 5.9,3 7,3H17M11,11A2,2 0 0,0 9,13A2,2 0 0,0 11,15A2,2 0 0,0 13,13V8H16V6H12V11.27C11.71,11.1 11.36,11 11,11Z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5c-0.49,0 -0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8L4,8v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L4,12v2h2v1c0,0.34 0.04,0.67 0.09,1L4,16v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L20,18v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1L20,10L20,8zM14,16h-4v-2h4v2zM14,12h-4v-2h4v2z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M20,6h-2.18c0.11,-0.31 0.18,-0.65 0.18,-1 0,-1.66 -1.34,-3 -3,-3 -1.05,0 -1.96,0.54 -2.5,1.35l-0.5,0.67 -0.5,-0.68C10.96,2.54 10.05,2 9,2 7.34,2 6,3.34 6,5c0,0.35 0.07,0.69 0.18,1L4,6c-1.11,0 -1.99,0.89 -1.99,2L2,19c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM15,4c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM9,4c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM20,19L4,19v-2h16v2zM20,14L4,14L4,8h5.08L7,10.83 8.62,12 11,8.76l1,-1.36 1,1.36L15.38,12 17,10.83 14.92,8L20,8v6z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z" />

View file

@ -1,9 +1,9 @@
<!-- drawable/comment_text_outline.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M9,22A1,1 0 0,1 8,21V18H4A2,2 0 0,1 2,16V4C2,2.89 2.9,2 4,2H20A2,2 0 0,1 22,4V16A2,2 0 0,1 20,18H13.9L10.2,21.71C10,21.9 9.75,22 9.5,22V22H9M10,16V19.08L13.08,16H20V4H4V16H10M6,7H18V9H6V7M6,11H15V13H6V11Z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M14,2L6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6zM16,18L8,18v-2h8v2zM16,14L8,14v-2h8v2zM13,9L13,3.5L18.5,9L13,9z" />

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0"
android:width="24dp">
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M12,8l-6,6 1.41,1.41L12,10.83l4.59,4.58L18,14z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M16.5,3c-1.74,0 -3.41,0.81 -4.5,2.09C10.91,3.81 9.24,3 7.5,3 4.42,3 2,5.42 2,8.5c0,3.78 3.4,6.86 8.55,11.54L12,21.35l1.45,-1.32C18.6,15.36 22,12.28 22,8.5 22,5.42 19.58,3 16.5,3zM12.1,18.55l-0.1,0.1 -0.1,-0.1C7.14,14.24 4,11.39 4,8.5 4,6.5 5.5,5 7.5,5c1.54,0 3.04,0.99 3.57,2.36h1.87C13.46,5.99 14.96,5 16.5,5c2,0 3.5,1.5 3.5,3.5 0,2.89 -3.14,5.74 -7.9,10.05z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z" />

View file

@ -1,9 +1,9 @@
<!-- drawable/ic_file_music_white_24dpsic_white_24dp.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M13,9H18.5L13,3.5V9M6,2H14L20,8V20A2,2 0 0,1 18,22H6C4.89,22 4,21.1 4,20V4C4,2.89 4.89,2 6,2M9,16A2,2 0 0,0 7,18A2,2 0 0,0 9,20A2,2 0 0,0 11,18V13H14V11H10V16.27C9.71,16.1 9.36,16 9,16Z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M14.4,6L14,4H5v17h2v-7h5.6l0.4,2h7V6z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M10,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8c0,-1.1 -0.9,-2 -2,-2h-8l-2,-2z" />

View file

@ -1,9 +1,9 @@
<!-- drawable/ic_github_circlecle.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z" />

View file

@ -1,9 +1,9 @@
<!-- drawable/ic_google_circles_communities_white_24dp.xmlxml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M15,12C13.89,12 13,12.89 13,14A2,2 0 0,0 15,16A2,2 0 0,0 17,14C17,12.89 16.1,12 15,12M12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M14,9C14,7.89 13.1,7 12,7C10.89,7 10,7.89 10,9A2,2 0 0,0 12,11A2,2 0 0,0 14,9M9,12A2,2 0 0,0 7,14A2,2 0 0,0 9,16A2,2 0 0,0 11,14C11,12.89 10.1,12 9,12Z" />

View file

@ -1,9 +1,9 @@
<!-- drawable/ic_google_pluslus.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M23,11H21V9H19V11H17V13H19V15H21V13H23M8,11V13.4H12C11.8,14.4 10.8,16.4 8,16.4C5.6,16.4 3.7,14.4 3.7,12C3.7,9.6 5.6,7.6 8,7.6C9.4,7.6 10.3,8.2 10.8,8.7L12.7,6.9C11.5,5.7 9.9,5 8,5C4.1,5 1,8.1 1,12C1,15.9 4.1,19 8,19C12,19 14.7,16.2 14.7,12.2C14.7,11.7 14.7,11.4 14.6,11H8Z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,19h-2v-2h2v2zM15.07,11.25l-0.9,0.92C13.45,12.9 13,13.5 13,15h-2v-0.5c0,-1.1 0.45,-2.1 1.17,-2.83l1.24,-1.26c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2L8,9c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,0.88 -0.36,1.68 -0.93,2.25z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z" />

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0"
android:width="24dp">
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6L6,2zM13,9L13,3.5L18.5,9L13,9z" />

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0"
android:width="24dp">
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M8.59,16.34l4.58,-4.59 -4.58,-4.59L10,5.75l6,6 -6,6z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M4,6L2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6zM20,2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM19,11h-4v4h-2v-4L9,11L9,9h4L13,5h2v4h4v2z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M20,2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM18,7h-3v5.5c0,1.38 -1.12,2.5 -2.5,2.5S10,13.88 10,12.5s1.12,-2.5 2.5,-2.5c0.57,0 1.08,0.19 1.5,0.51L14,5h4v2zM4,6L2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" />

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0"
android:width="24dp">
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M12,3v10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55 -2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4V7h4V3h-6z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M19,4L5,4c-1.11,0 -2,0.9 -2,2v12c0,1.1 0.89,2 2,2h4v-2L5,18L5,8h14v10h-4v2h4c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.89,-2 -2,-2zM12,10l-4,4h3v6h2v-6h3l-4,-4z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M8,5v14l11,-7z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M14,10L2,10v2h12v-2zM14,6L2,6v2h12L14,6zM18,14v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zM2,16h8v-2L2,14v2z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M15,6L3,6v2h12L15,6zM15,10L3,10v2h12v-2zM3,16h8v-2L3,14v2zM17,6v8.18c-0.31,-0.11 -0.65,-0.18 -1,-0.18 -1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3L19,8h3L22,6h-5z" />

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0"
android:width="24dp">
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M18.4,10.6C16.55,8.99 14.15,8 11.5,8c-4.65,0 -8.58,3.03 -9.96,7.22L3.9,16c1.05,-3.19 4.05,-5.5 7.6,-5.5 1.95,0 3.73,0.72 5.12,1.88L13,16h9V7l-3.6,3.6z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M7,7h10v3l4,-4 -4,-4v3L5,5v6h2L7,7zM17,17L7,17v-3l-4,4 4,4v-3h12v-6h-2v4zM13,15L13,9h-1l-2,1v1h1.5v4L13,15z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M7,7h10v3l4,-4 -4,-4v3L5,5v6h2L7,7zM17,17L7,17v-3l-4,4 4,4v-3h12v-6h-2v4z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M13,3c-4.97,0 -9,4.03 -9,9L1,12l3.89,3.89 0.07,0.14L9,12L6,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.93,0 -3.68,-0.79 -4.94,-2.06l-1.42,1.42C8.27,19.99 10.51,21 13,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,8v5l4.28,2.54 0.72,-1.21 -3.5,-2.08L13.5,8L12,8z" />

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0"
android:width="24dp">
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM15,9L5,9L5,5h10v4z" />

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0"
android:width="24dp">
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M10.59,9.17L5.41,4 4,5.41l5.17,5.17 1.42,-1.41zM14.5,4l2.04,2.04L4,18.59 5.41,20 17.96,7.46 20,9.5L20,4h-5.5zM14.83,13.41l-1.41,1.41 3.13,3.13L14.5,20L20,20v-5.5l-2.04,2.04 -3.13,-3.13z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M6,18l8.5,-6L6,6v12zM16,6v12h2V6h-2z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M6,6h2v12L6,18zM9.5,12l8.5,6L18,6z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M16,6l2.29,2.29 -4.88,4.88 -4,-4L2,16.59 3.41,18l6,-6 4,4 6.3,-6.29L22,12V6z" />

View file

@ -1,9 +1,9 @@
<!-- drawable/ic_twitter_white_24dpter_white_24dp.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M22.46,6C21.69,6.35 20.86,6.58 20,6.69C20.88,6.16 21.56,5.32 21.88,4.31C21.05,4.81 20.13,5.16 19.16,5.36C18.37,4.5 17.26,4 16,4C13.65,4 11.73,5.92 11.73,8.29C11.73,8.63 11.77,8.96 11.84,9.27C8.28,9.09 5.11,7.38 3,4.79C2.63,5.42 2.42,6.16 2.42,6.94C2.42,8.43 3.17,9.75 4.33,10.5C3.62,10.5 2.96,10.3 2.38,10C2.38,10 2.38,10 2.38,10.03C2.38,12.11 3.86,13.85 5.82,14.24C5.46,14.34 5.08,14.39 4.69,14.39C4.42,14.39 4.15,14.36 3.89,14.31C4.43,16 6,17.26 7.89,17.29C6.43,18.45 4.58,19.13 2.56,19.13C2.22,19.13 1.88,19.11 1.54,19.07C3.44,20.29 5.7,21 8.12,21C16,21 20.33,14.46 20.33,8.79C20.33,8.6 20.33,8.42 20.32,8.23C21.16,7.63 21.88,6.87 22.46,6Z" />

View file

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z" />

View file

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

View file

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

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_shortAnimTime">
<item android:state_pressed="true" android:drawable="@drawable/round_selected" />
<item android:drawable="@drawable/round_selected" android:state_pressed="true" />
<item android:drawable="@android:color/transparent" />
</selector>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_shortAnimTime">
<item android:state_pressed="true" android:drawable="@drawable/round_selected_dark" />
<item android:drawable="@drawable/round_selected_dark" android:state_pressed="true" />
<item android:drawable="@android:color/transparent" />
</selector>

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
android:shape="rectangle">
<gradient
android:angle="90"
android:endColor="@color/twenty_percent_black_overlay"
android:centerColor="#11000000"
android:endColor="@color/twenty_percent_black_overlay"
android:startColor="#00000000" />
</shape>

View file

@ -3,7 +3,7 @@
android:shape="rectangle">
<gradient
android:angle="90"
android:endColor="#88000000"
android:centerColor="#30000000"
android:endColor="#88000000"
android:startColor="#00000000" />
</shape>

Some files were not shown because too many files have changed in this diff Show more