From b9bf82306ee622f13eb9001b18627ff922fc5970 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Thu, 23 Mar 2017 11:44:39 +0100 Subject: [PATCH 01/26] Added dummy google-services.json --- .gitignore | 2 - app/google-services.json | 107 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 app/google-services.json diff --git a/.gitignore b/.gitignore index 04388588..7574c77b 100644 --- a/.gitignore +++ b/.gitignore @@ -40,5 +40,3 @@ captures/ # Mac .DS_Store - -/app/google-services.json \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 00000000..f5d748fa --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,107 @@ +{ + "project_info": { + "project_number": "", + "firebase_url": "", + "project_id": "", + "storage_bucket": "" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "", + "android_client_info": { + "package_name": "com.kabouzeid.gramophone" + } + }, + "oauth_client": [ + { + "client_id": "", + "client_type": 1, + "android_info": { + "package_name": "com.kabouzeid.gramophone", + "certificate_hash": "" + } + }, + { + "client_id": "", + "client_type": 1, + "android_info": { + "package_name": "com.kabouzeid.gramophone", + "certificate_hash": "" + } + }, + { + "client_id": "", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 2, + "other_platform_oauth_client": [ + { + "client_id": "", + "client_type": 3 + } + ] + }, + "ads_service": { + "status": 2 + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "", + "android_client_info": { + "package_name": "com.kabouzeid.gramophone.debug" + } + }, + "oauth_client": [ + { + "client_id": "", + "client_type": 1, + "android_info": { + "package_name": "com.kabouzeid.gramophone.debug", + "certificate_hash": "" + } + }, + { + "client_id": "", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 2, + "other_platform_oauth_client": [ + { + "client_id": "", + "client_type": 3 + } + ] + }, + "ads_service": { + "status": 2 + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file From 8f93d7cba0e21fd3887565166be4cd048382cde4 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Thu, 23 Mar 2017 12:10:52 +0100 Subject: [PATCH 02/26] Switched back to Crashlytics/Fabric --- app/build.gradle | 12 +- app/google-services.json | 107 ------------------ .../java/com/kabouzeid/gramophone/App.java | 16 +++ build.gradle | 1 - 4 files changed, 27 insertions(+), 109 deletions(-) delete mode 100644 app/google-services.json diff --git a/app/build.gradle b/app/build.gradle index c9e45d57..cde3b8f2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,18 +1,22 @@ buildscript { repositories { + maven { url 'https://maven.fabric.io/public' } mavenCentral() } dependencies { + //noinspection GradleDynamicVersion + classpath 'io.fabric.tools:gradle:1.+' classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1' } } apply plugin: 'com.android.application' +apply plugin: 'io.fabric' apply plugin: 'com.jakewharton.hugo' -apply plugin: 'com.google.gms.google-services' repositories { + maven { url 'https://maven.fabric.io/public' } maven { url "https://jitpack.io" } } @@ -39,6 +43,8 @@ android { debug { applicationIdSuffix '.debug' versionNameSuffix ' DEBUG' + + ext.enableCrashlytics = false // Disable fabric build ID generation for debug builds } } packagingOptions { @@ -56,6 +62,10 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' + compile('com.crashlytics.sdk.android:crashlytics:2.6.2@aar') { + transitive = true + } + compile('com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:0.10.4@aar') { transitive = true } diff --git a/app/google-services.json b/app/google-services.json deleted file mode 100644 index f5d748fa..00000000 --- a/app/google-services.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "project_info": { - "project_number": "", - "firebase_url": "", - "project_id": "", - "storage_bucket": "" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "", - "android_client_info": { - "package_name": "com.kabouzeid.gramophone" - } - }, - "oauth_client": [ - { - "client_id": "", - "client_type": 1, - "android_info": { - "package_name": "com.kabouzeid.gramophone", - "certificate_hash": "" - } - }, - { - "client_id": "", - "client_type": 1, - "android_info": { - "package_name": "com.kabouzeid.gramophone", - "certificate_hash": "" - } - }, - { - "client_id": "", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "", - "client_type": 3 - } - ] - }, - "ads_service": { - "status": 2 - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "", - "android_client_info": { - "package_name": "com.kabouzeid.gramophone.debug" - } - }, - "oauth_client": [ - { - "client_id": "", - "client_type": 1, - "android_info": { - "package_name": "com.kabouzeid.gramophone.debug", - "certificate_hash": "" - } - }, - { - "client_id": "", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "" - } - ], - "services": { - "analytics_service": { - "status": 1 - }, - "appinvite_service": { - "status": 2, - "other_platform_oauth_client": [ - { - "client_id": "", - "client_type": 3 - } - ] - }, - "ads_service": { - "status": 2 - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/App.java b/app/src/main/java/com/kabouzeid/gramophone/App.java index 9279f222..a9104638 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/App.java +++ b/app/src/main/java/com/kabouzeid/gramophone/App.java @@ -2,9 +2,25 @@ package com.kabouzeid.gramophone; import android.app.Application; +import com.crashlytics.android.Crashlytics; +import com.crashlytics.android.core.CrashlyticsCore; + +import io.fabric.sdk.android.Fabric; + /** * @author Karim Abou Zeid (kabouzeid) */ public class App extends Application { public static final String GOOGLE_PLAY_LICENSE_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjMeADN5Ffnt/ml5SYxNPCn8kGcOYGpHEfNSCts99vVxqmCn6C01E94c17j7rUK2aeHur5uxphZylzopPlQ8P8l1fqty0GPUNRSo18FCJzfGH8HZAwZYOcnRFPaXdaq3InyFJhBiODh2oeAcVK/idH6QraQ4r9HIlzigAg6lgwzxl2wJKDh7X/GMdDntCyzDh8xDQ0wIawFgvgojHwqh2Ci8Gnq6EYRwPA9yHiIIksT8Q30QyM5ewl5QcnWepsls7enNqeHarhpmSibRUDgCsxHoOpny7SyuvZvUI3wuLckDR0ds9hrt614scHHqDOBp/qWCZiAgOPVAEQcURbV09qQIDAQAB"; + + @Override + public void onCreate() { + super.onCreate(); + + // Set up Crashlytics, disabled for debug builds + Crashlytics crashlyticsKit = new Crashlytics.Builder() + .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()) + .build(); + Fabric.with(this, crashlyticsKit); + } } diff --git a/build.gradle b/build.gradle index b5de8bd0..4a1d32e3 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,6 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:2.3.0' - classpath 'com.google.gms:google-services:3.0.0' } } From 663040714e9b2f7417afb7230a251eac6d8e4f3e Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Thu, 23 Mar 2017 12:19:17 +0100 Subject: [PATCH 03/26] Updated retrofit --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index cde3b8f2..fe004354 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -98,8 +98,8 @@ dependencies { compile 'com.github.ksoichiro:android-observablescrollview:1.6.0' compile 'com.github.kabouzeid:SeekArc:1.2-kmod' compile 'com.github.kabouzeid:AndroidSlidingUpPanel:3.3.0-kmod3' - compile 'com.squareup.retrofit2:retrofit:2.1.0' - compile 'com.squareup.retrofit2:converter-gson:2.1.0' + compile 'com.squareup.retrofit2:retrofit:2.2.0' + compile 'com.squareup.retrofit2:converter-gson:2.2.0' //noinspection GradleDynamicVersion compile 'com.anjlab.android.iab.v3:library:1.0.+' compile 'de.psdev.licensesdialog:licensesdialog:1.8.1' From c136c2e05612e0052a881bc92014bbb56ba6ed8a Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Thu, 23 Mar 2017 12:31:00 +0100 Subject: [PATCH 04/26] Updated Glide to 3.8.0 snapshot --- app/build.gradle | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index fe004354..713b01a5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,6 +18,10 @@ apply plugin: 'com.jakewharton.hugo' repositories { maven { url 'https://maven.fabric.io/public' } maven { url "https://jitpack.io" } + maven { + name 'glide-snapshot' + url 'http://oss.sonatype.org/content/repositories/snapshots' + } } android { @@ -103,8 +107,8 @@ dependencies { //noinspection GradleDynamicVersion compile 'com.anjlab.android.iab.v3:library:1.0.+' compile 'de.psdev.licensesdialog:licensesdialog:1.8.1' - compile 'com.github.bumptech.glide:glide:3.7.0' - compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar' + compile 'com.github.bumptech.glide:glide:3.8.0-SNAPSHOT' + compile 'com.github.bumptech.glide:okhttp3-integration:1.5.0-SNAPSHOT' compile 'com.github.kabouzeid:RecyclerView-FastScroll:1.9-kmod' compile 'com.heinrichreimersoftware:material-intro:1.6' compile 'me.zhanghai.android.materialprogressbar:library:1.3.0' From d294822e7cefaa62228be2dc1dba698df4855ede Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Thu, 23 Mar 2017 13:13:49 +0100 Subject: [PATCH 05/26] Fixed a bug where the notification wouldn't disappear when the queue is cleared. Fixes #97 --- .../gramophone/service/MusicService.java | 45 ++++++++++++------- .../notification/PlayingNotification.java | 2 + .../notification/PlayingNotificationImpl.java | 2 +- .../PlayingNotificationImpl24.java | 5 ++- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java index 4cdbc318..0d56876a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -30,7 +30,6 @@ import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.media.MediaMetadataCompat; -import android.support.v4.media.session.MediaButtonReceiver; import android.support.v4.media.session.MediaSessionCompat; import android.support.v4.media.session.PlaybackStateCompat; import android.widget.Toast; @@ -522,9 +521,29 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP return (getAudioManager().requestAudioFocus(audioFocusListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN) == AudioManager.AUDIOFOCUS_REQUEST_GRANTED); } - private void updateMediaSession() { + private void updateNotification() { + if (getCurrentSong().id != -1) { + playingNotification.update(); + } + } + + private void updateMediaSessionPlaybackState() { + mediaSession.setPlaybackState( + new PlaybackStateCompat.Builder() + .setActions(MEDIA_SESSION_ACTIONS) + .setState(isPlaying() ? PlaybackStateCompat.STATE_PLAYING : PlaybackStateCompat.STATE_PAUSED, + getPosition(), 1) + .build()); + } + + private void updateMediaSessionMetaData() { final Song song = getCurrentSong(); + if (song.id == -1) { + mediaSession.setMetadata(null); + return; + } + final MediaMetadataCompat.Builder metaData = new MediaMetadataCompat.Builder() .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, song.artistName) .putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ARTIST, song.artistName) @@ -568,7 +587,6 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP } else { mediaSession.setMetadata(metaData.build()); } - } private static Bitmap copy(Bitmap bitmap) { @@ -985,22 +1003,17 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP private void handleChangeInternal(@NonNull final String what) { switch (what) { case PLAY_STATE_CHANGED: + updateNotification(); + updateMediaSessionPlaybackState(); final boolean isPlaying = isPlaying(); - playingNotification.update(); - mediaSession.setPlaybackState( - new PlaybackStateCompat.Builder() - .setActions(MEDIA_SESSION_ACTIONS) - .setState(isPlaying ? PlaybackStateCompat.STATE_PLAYING : PlaybackStateCompat.STATE_PAUSED, - getPosition(), 1) - .build()); if (!isPlaying && getSongProgressMillis() > 0) { savePositionInTrack(); } songPlayCountHelper.notifyPlayStateChanged(isPlaying); break; case META_CHANGED: - playingNotification.update(); - updateMediaSession(); + updateNotification(); + updateMediaSessionMetaData(); savePosition(); savePositionInTrack(); final Song currentSong = getCurrentSong(); @@ -1011,12 +1024,12 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP songPlayCountHelper.notifySongChanged(currentSong); break; case QUEUE_CHANGED: - updateMediaSession(); + updateMediaSessionMetaData(); // because playing queue size might have changed saveState(); if (playingQueue.size() > 0) { prepareNext(); } else { - quit(); + playingNotification.stop(); } break; } @@ -1052,10 +1065,10 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP break; case PreferenceUtil.ALBUM_ART_ON_LOCKSCREEN: case PreferenceUtil.BLURRED_ALBUM_ART: - updateMediaSession(); + updateMediaSessionMetaData(); break; case PreferenceUtil.COLORED_NOTIFICATION: - playingNotification.update(); + updateNotification(); break; } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotification.java b/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotification.java index 43558726..858c8486 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotification.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotification.java @@ -7,6 +7,8 @@ import com.kabouzeid.gramophone.service.MusicService; */ public interface PlayingNotification { + int NOTIFICATION_ID = 1; + void init(MusicService service); void update(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotificationImpl.java b/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotificationImpl.java index 5ddbc2aa..2c3e4038 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotificationImpl.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotificationImpl.java @@ -133,7 +133,7 @@ public class PlayingNotificationImpl implements PlayingNotification { if (stopped) return; // notification has been stopped before loading was finished - service.startForeground(1, notification); + service.startForeground(NOTIFICATION_ID, notification); } private void setBackgroundColor(int color) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotificationImpl24.java b/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotificationImpl24.java index 056a2eae..283b5c5f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotificationImpl24.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/notification/PlayingNotificationImpl24.java @@ -157,9 +157,9 @@ public class PlayingNotificationImpl24 implements PlayingNotification { } if (newNotifyMode == NOTIFY_MODE_FOREGROUND) { - service.startForeground(1, notification); + service.startForeground(NOTIFICATION_ID, notification); } else if (newNotifyMode == NOTIFY_MODE_BACKGROUND) { - notificationManager.notify(1, notification); + notificationManager.notify(NOTIFICATION_ID, notification); } notifyMode = newNotifyMode; @@ -169,5 +169,6 @@ public class PlayingNotificationImpl24 implements PlayingNotification { public synchronized void stop() { stopped = true; service.stopForeground(true); + notificationManager.cancel(NOTIFICATION_ID); } } From d5bf0b58d2e2a0b15c0553d8412262512cf0fb55 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Thu, 23 Mar 2017 13:18:41 +0100 Subject: [PATCH 06/26] Bumped version number, synced translations and updated changelog. --- app/build.gradle | 4 ++-- app/src/main/assets/phonograph-changelog.html | 8 ++++++++ app/src/main/res/values-zh-rCN/strings.xml | 4 ++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 713b01a5..9c13bf94 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -35,8 +35,8 @@ android { vectorDrawables.useSupportLibrary = true applicationId "com.kabouzeid.gramophone" - versionCode 128 - versionName "0.14.0" + versionCode 129 + versionName "0.14.1" } buildTypes { release { diff --git a/app/src/main/assets/phonograph-changelog.html b/app/src/main/assets/phonograph-changelog.html index 277b918a..8e16796d 100644 --- a/app/src/main/assets/phonograph-changelog.html +++ b/app/src/main/assets/phonograph-changelog.html @@ -25,6 +25,14 @@

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

+

Version 0.14.1

+ +
    +
  1. FIX: Notification won't disappear.
  2. +
  3. IMPROVEMENT: Updated libraries.
  4. +
  5. IMPROVEMENT: Synced translations.
  6. +
+

Version 0.14.0

    diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 277561af..4ce5a3a2 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -20,6 +20,9 @@ 搜索 作为下一首播放 播放 + 播放/暂停 + 上一首 + 下一首 加入播放队列 从播放队列中移除 加入播放列表 @@ -45,6 +48,7 @@ 年份 音轨 "音轨(如用 2 表示第 2 首歌或用 3004 表示 CD3 里的第 4 首歌)" + 歌词 标题或艺术家名称为空 正在保存更改… 保存至文件... From 33ff49de0f5f20ff22aaf2e7701b8ea827b4ea92 Mon Sep 17 00:00:00 2001 From: Adrian Campos Date: Wed, 8 Mar 2017 23:44:27 -0800 Subject: [PATCH 07/26] Added basic support for App Shortcuts Shuffle All, Top Tracks, and Last added. Still need to fix icons and add dynamic shortcuts for playlists --- app/build.gradle | 34 +++++++ app/src/main/AndroidManifest.xml | 6 ++ .../AppShortcutLauncherActivity.java | 99 +++++++++++++++++++ .../ui/activities/MainActivity.java | 24 +++++ app/src/main/res/values/donottranslate.xml | 2 + app/src/main/res/values/strings.xml | 12 +++ app/src/main/res/xml/launcher_shortcuts.xml | 55 +++++++++++ 7 files changed, 232 insertions(+) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java create mode 100644 app/src/main/res/xml/launcher_shortcuts.xml diff --git a/app/build.gradle b/app/build.gradle index 9c13bf94..899925b1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -117,3 +117,37 @@ dependencies { compile 'com.jakewharton:butterknife:8.5.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1' } + +// Add support for placeholders in resource files. +// Required so that packagename can be referenced in xml. https://code.google.com/p/android/issues/detail?id=69224#c12 +def replacePlaceholdersInFile(basePath, fileName, placeholders) { + def file = new File(basePath, fileName); + + if (!file.exists()) { + logger.quiet("Unable to replace placeholders in " + file.toString() + ". File cannot be found.") + return; + } + + logger.debug("Replacing placeholders in " + file.toString()) + logger.debug("Placeholders: " + placeholders.toString()) + + def content = file.getText('UTF-8') + + placeholders.each { entry -> + content = content.replaceAll("\\\$\\{${entry.key}\\}", entry.value) + } + + file.write(content, 'UTF-8') +} + +afterEvaluate { + android.applicationVariants.all { variant -> + variant.outputs.each { output -> + output.processResources.doFirst { + // prepare placeholder map from manifestPlaceholders including applicationId placeholder + def placeholders = variant.mergedFlavor.manifestPlaceholders + [applicationId: variant.applicationId] + replacePlaceholdersInFile(resDir, 'xml/launcher_shortcuts.xml', placeholders) + } + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8579a7ab..78046818 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,6 +29,8 @@ + @@ -173,6 +175,10 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java new file mode 100644 index 00000000..372eca9e --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java @@ -0,0 +1,99 @@ +package com.kabouzeid.gramophone.appshortcuts; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.widget.Toast; + +import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.loader.LastAddedLoader; +import com.kabouzeid.gramophone.loader.SongLoader; +import com.kabouzeid.gramophone.loader.TopAndRecentlyPlayedTracksLoader; +import com.kabouzeid.gramophone.model.Song; +import com.kabouzeid.gramophone.ui.activities.MainActivity; + +import java.util.ArrayList; + +/** + * @author Adrian Campos + */ + +public class AppShortcutLauncherActivity extends Activity { + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + ShortcutType shortcutType = ShortcutType.NONE; + + //Set shortcutType from the intent extras + Bundle extras = getIntent().getExtras(); + if (extras!=null){ + try { + shortcutType = ShortcutType.valueOf(extras.getString(getString(R.string.id_shortcuttype))); + } catch (IllegalArgumentException e){ //In the event we're somehow passed an invalid enum string, don't crash. + e.printStackTrace(); + shortcutType = ShortcutType.NONE; + } + } + + //Perform the action found in the extras + switch (shortcutType) { + case SHUFFLE_ALL: + launchMainActivityWithSongs(PlayMode.SHUFFLE, + SongLoader.getAllSongs(getApplicationContext())); + break; + case TOP_TRACKS: + launchMainActivityWithSongs(PlayMode.NORMAL, + TopAndRecentlyPlayedTracksLoader.getRecentlyPlayedTracks(getApplicationContext())); + break; + case LAST_ADDED: + launchMainActivityWithSongs(PlayMode.NORMAL, + LastAddedLoader.getLastAddedSongs(getApplicationContext())); + break; + case NONE: + shortcutError(); + break; + default: + shortcutError(); + break; + } + + finish(); + + } + + + enum PlayMode {NORMAL, SHUFFLE} + private void launchMainActivityWithSongs(PlayMode playMode, ArrayList songs){ + //Create a new intent to launch MainActivity + Intent intent = new Intent(this, MainActivity.class); + switch (playMode){ + case NORMAL: + intent.setAction(MainActivity.INTENT_ACTION_MEDIA_PLAY); + break; + case SHUFFLE: + intent.setAction(MainActivity.INTENT_ACTION_MEDIA_PLAY_SHUFFLED); + break; + } + + + //Create a bundle to store the songs to shuffle through songs + Bundle bundle = new Bundle(); + bundle.putParcelableArrayList(MainActivity.INTENT_EXTRA_SONGS, songs); + + //Put the bundle in the intent + intent.putExtras(bundle); + + //Finally, start MainActivity with those extras + startActivity(intent); + } + + private void shortcutError(){ + Toast.makeText(getApplicationContext(), R.string.error_launching_shortcut, Toast.LENGTH_LONG).show(); + } + + public enum ShortcutType { + SHUFFLE_ALL, TOP_TRACKS, LAST_ADDED, NONE + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 9e219fa9..fe46ea15 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -60,6 +60,12 @@ public class MainActivity extends AbsSlidingMusicPanelActivity { private static final int LIBRARY = 0; private static final int FOLDERS = 1; + public static final String PHONOGRAPH_PACKAGE_NAME = "com.kabouzeid.gramophone"; + public static final String INTENT_ACTION_MEDIA_PLAY_SHUFFLED = PHONOGRAPH_PACKAGE_NAME + ".intent_action.play_shuffled"; + public static final String INTENT_ACTION_MEDIA_PLAY = PHONOGRAPH_PACKAGE_NAME + ".intent_action.play"; + public static final String INTENT_EXTRA_SONGS = PHONOGRAPH_PACKAGE_NAME + ".intent_extra.songs"; + + @BindView(R.id.navigation_view) NavigationView navigationView; @BindView(R.id.drawer_layout) @@ -296,6 +302,24 @@ public class MainActivity extends AbsSlidingMusicPanelActivity { } else { MusicPlayerRemote.openQueue(songs, 0, true); } + + } else if (intent.getAction() != null && intent.getAction().equals(MainActivity.INTENT_ACTION_MEDIA_PLAY_SHUFFLED)){ + //Shuffle songs in extras + final ArrayList songs = intent.getExtras().getParcelableArrayList(INTENT_EXTRA_SONGS); + + //Start the songs, setting the shuffle mode to shuffle + MusicPlayerRemote.openAndShuffleQueue(songs, true); + + } else if (intent.getAction() != null && intent.getAction().equals(MainActivity.INTENT_ACTION_MEDIA_PLAY)){ + //Shuffle songs in extras + final ArrayList songs = intent.getExtras().getParcelableArrayList(INTENT_EXTRA_SONGS); + + //Start the songs, preserving the user's shuffle mode + if (MusicPlayerRemote.getShuffleMode() == MusicService.SHUFFLE_MODE_SHUFFLE) { + MusicPlayerRemote.openAndShuffleQueue(songs, true); + } else { + MusicPlayerRemote.openQueue(songs, 0, true); + } } if (uri != null && uri.toString().length() > 0) { diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 417cd4f1..3783fdb5 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -39,4 +39,6 @@ white-space: pre-wrap; } + + com.kabouzeid.gramophone.appshortcuts.ShortcutType \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2160388e..b550ce35 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -275,4 +275,16 @@ Copied device info to clipboard. Your account data is only used for authentication. You will be forwarded to the issue tracker website. + + + @string/action_shuffle_all + Shuffle + + @string/my_top_tracks + Top Tracks + + @string/last_added + @string/last_added + + Error launching shortcut. diff --git a/app/src/main/res/xml/launcher_shortcuts.xml b/app/src/main/res/xml/launcher_shortcuts.xml new file mode 100644 index 00000000..598fd3df --- /dev/null +++ b/app/src/main/res/xml/launcher_shortcuts.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 43a2f319fc271b17eaa9a5ddbfca85746087ace9 Mon Sep 17 00:00:00 2001 From: Adrian Campos Date: Thu, 9 Mar 2017 10:45:44 -0800 Subject: [PATCH 08/26] Convert static app shortcuts to dynamic Will allow user customization in the future (colors, choosing which show up in list, etc.) --- app/build.gradle | 34 ---------- app/src/main/AndroidManifest.xml | 2 - .../AppShortcutLauncherActivity.java | 5 +- .../appshortcuts/DynamicShortcutManager.java | 66 +++++++++++++++++++ .../shortcuttype/BaseShortcutType.java | 55 ++++++++++++++++ .../shortcuttype/LastAddedShortcutType.java | 29 ++++++++ .../shortcuttype/ShuffleAllShortcutType.java | 29 ++++++++ .../shortcuttype/TopTracksShortcutType.java | 30 +++++++++ .../ui/activities/MainActivity.java | 4 ++ app/src/main/res/xml/launcher_shortcuts.xml | 55 ---------------- 10 files changed, 216 insertions(+), 93 deletions(-) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java delete mode 100644 app/src/main/res/xml/launcher_shortcuts.xml diff --git a/app/build.gradle b/app/build.gradle index 899925b1..9c13bf94 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -117,37 +117,3 @@ dependencies { compile 'com.jakewharton:butterknife:8.5.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1' } - -// Add support for placeholders in resource files. -// Required so that packagename can be referenced in xml. https://code.google.com/p/android/issues/detail?id=69224#c12 -def replacePlaceholdersInFile(basePath, fileName, placeholders) { - def file = new File(basePath, fileName); - - if (!file.exists()) { - logger.quiet("Unable to replace placeholders in " + file.toString() + ". File cannot be found.") - return; - } - - logger.debug("Replacing placeholders in " + file.toString()) - logger.debug("Placeholders: " + placeholders.toString()) - - def content = file.getText('UTF-8') - - placeholders.each { entry -> - content = content.replaceAll("\\\$\\{${entry.key}\\}", entry.value) - } - - file.write(content, 'UTF-8') -} - -afterEvaluate { - android.applicationVariants.all { variant -> - variant.outputs.each { output -> - output.processResources.doFirst { - // prepare placeholder map from manifestPlaceholders including applicationId placeholder - def placeholders = variant.mergedFlavor.manifestPlaceholders + [applicationId: variant.applicationId] - replacePlaceholdersInFile(resDir, 'xml/launcher_shortcuts.xml', placeholders) - } - } - } -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78046818..4df8d5b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,8 +29,6 @@ - diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java index 372eca9e..47888b81 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java @@ -30,7 +30,7 @@ public class AppShortcutLauncherActivity extends Activity { Bundle extras = getIntent().getExtras(); if (extras!=null){ try { - shortcutType = ShortcutType.valueOf(extras.getString(getString(R.string.id_shortcuttype))); + shortcutType = ShortcutType.valueOf(extras.getString(KEY_SHORTCUT_TYPE)); } catch (IllegalArgumentException e){ //In the event we're somehow passed an invalid enum string, don't crash. e.printStackTrace(); shortcutType = ShortcutType.NONE; @@ -64,7 +64,7 @@ public class AppShortcutLauncherActivity extends Activity { } - enum PlayMode {NORMAL, SHUFFLE} + private enum PlayMode {NORMAL, SHUFFLE} private void launchMainActivityWithSongs(PlayMode playMode, ArrayList songs){ //Create a new intent to launch MainActivity Intent intent = new Intent(this, MainActivity.class); @@ -93,6 +93,7 @@ public class AppShortcutLauncherActivity extends Activity { Toast.makeText(getApplicationContext(), R.string.error_launching_shortcut, Toast.LENGTH_LONG).show(); } + public static final String KEY_SHORTCUT_TYPE = "com.kabouzeid.gramophone.appshortcuts.ShortcutType"; public enum ShortcutType { SHUFFLE_ALL, TOP_TRACKS, LAST_ADDED, NONE } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java new file mode 100644 index 00000000..ed9b4ff1 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java @@ -0,0 +1,66 @@ +package com.kabouzeid.gramophone.appshortcuts; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ShortcutInfo; +import android.content.pm.ShortcutManager; +import android.graphics.Color; +import android.graphics.drawable.Icon; + +import com.kabouzeid.gramophone.appshortcuts.shortcuttype.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * @author Adrian Campos + */ + +@TargetApi(25) +public class DynamicShortcutManager { + + Context mContext; + ShortcutManager shortcutManager; + public DynamicShortcutManager(Context context){ + mContext = context; + shortcutManager = mContext.getSystemService(ShortcutManager.class); + } + + + public void initDynamicShortcuts(){ + if (shortcutManager.getDynamicShortcuts().size() == 0){ + shortcutManager.setDynamicShortcuts(getDefaultShortcuts()); + } + } + + public List getDefaultShortcuts(){ + return (Arrays.asList( + new ShuffleAllShortcutType(mContext).getShortcutInfo(), + new TopTracksShortcutType(mContext).getShortcutInfo(), + new LastAddedShortcutType(mContext).getShortcutInfo() + )); + } + + + + public static ShortcutInfo createShortcut(Context context, String id, String shortLabel, String longLabel, Icon icon, Intent intent){ + return new ShortcutInfo.Builder(context, id) + .setShortLabel(shortLabel) + .setLongLabel(longLabel) + .setIcon(icon) + .setIntent(intent) + .build(); + } + + public void tintShortcutIcons(ArrayList shortcutInfos, Color color){ + for (ShortcutInfo shortcutInfo : shortcutInfos) { + tintShortcutIcon(shortcutInfo, color); + } + } + public void tintShortcutIcon(ShortcutInfo shortcutInfo, Color color){ + //TODO Tint icons here + } + +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java new file mode 100644 index 00000000..fbcd274f --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java @@ -0,0 +1,55 @@ +package com.kabouzeid.gramophone.appshortcuts.shortcuttype; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ShortcutInfo; +import android.os.Bundle; + +import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity; +import com.kabouzeid.gramophone.model.Song; +import com.kabouzeid.gramophone.ui.activities.MainActivity; + +import java.util.ArrayList; + +/** + * @author Adrian Campos + */ + +@TargetApi(25) +public abstract class BaseShortcutType { + + static final String ID_PREFIX = "com.kabouzeid.gramophone.appshortcuts.id."; + + Context mContext; + + public BaseShortcutType(Context context) { + mContext = context; + } + + + abstract ShortcutInfo getShortcutInfo(); + + + + /** + * Creates an Intent that will launch MainActivtiy and immediately play {@param songs} in either shuffle or normal mode + * + * @param shortcutType Describes the type of shortcut to create (ShuffleAll, TopTracks, custom playlist, etc.) + * @return + */ + Intent getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType shortcutType) { + //Create a new intent to launch MainActivity + Intent intent = new Intent(mContext, AppShortcutLauncherActivity.class); + intent.setAction(Intent.ACTION_VIEW); + + //Create a bundle to store instructions for AppShortcutLauncherActivity + Bundle b = new Bundle(); + b.putString(AppShortcutLauncherActivity.KEY_SHORTCUT_TYPE, shortcutType.toString()); + + //Put bundle in intent + intent.putExtras(b); + + return intent; + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java new file mode 100644 index 00000000..c9e4252a --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java @@ -0,0 +1,29 @@ +package com.kabouzeid.gramophone.appshortcuts.shortcuttype; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.pm.ShortcutInfo; +import android.graphics.drawable.Icon; + +import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity; + +/** + * @author Adrian Campos + */ + +@TargetApi(25) +public final class LastAddedShortcutType extends BaseShortcutType { + public LastAddedShortcutType(Context context) { + super(context); + } + + public ShortcutInfo getShortcutInfo() { + return new ShortcutInfo.Builder(mContext, ID_PREFIX + "last_added") + .setShortLabel(mContext.getString(R.string.appshortcut_lastadded_short)) + .setLongLabel(mContext.getString(R.string.appshortcut_lastadded_long)) + .setIcon(Icon.createWithResource(mContext, R.drawable.ic_library_add_white_24dp)) + .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.LAST_ADDED)) + .build(); + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java new file mode 100644 index 00000000..45dd4ee0 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java @@ -0,0 +1,29 @@ +package com.kabouzeid.gramophone.appshortcuts.shortcuttype; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.pm.ShortcutInfo; +import android.graphics.drawable.Icon; + +import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity; + +/** + * @author Adrian Campos + */ + +@TargetApi(25) +public final class ShuffleAllShortcutType extends BaseShortcutType { + public ShuffleAllShortcutType(Context context) { + super(context); + } + + public ShortcutInfo getShortcutInfo() { + return new ShortcutInfo.Builder(mContext, ID_PREFIX + "shuffle_all") + .setShortLabel(mContext.getString(R.string.appshortcut_shuffleall_short)) + .setLongLabel(mContext.getString(R.string.appshortcut_shuffleall_long)) + .setIcon(Icon.createWithResource(mContext, R.drawable.ic_shuffle_white_24dp)) + .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.SHUFFLE_ALL)) + .build(); + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java new file mode 100644 index 00000000..119a916f --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java @@ -0,0 +1,30 @@ +package com.kabouzeid.gramophone.appshortcuts.shortcuttype; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.pm.ShortcutInfo; +import android.graphics.drawable.Icon; + +import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity; +import com.kabouzeid.gramophone.loader.TopAndRecentlyPlayedTracksLoader; + +/** + * @author Adrian Campos + */ + +@TargetApi(25) +public final class TopTracksShortcutType extends BaseShortcutType { + public TopTracksShortcutType(Context context) { + super(context); + } + + public ShortcutInfo getShortcutInfo() { + return new ShortcutInfo.Builder(mContext, ID_PREFIX + "top_tracks") + .setShortLabel(mContext.getString(R.string.appshortcut_toptracks_short)) + .setLongLabel(mContext.getString(R.string.appshortcut_toptracks_long)) + .setIcon(Icon.createWithResource(mContext, R.drawable.ic_trending_up_white_24dp)) + .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.TOP_TRACKS)) + .build(); + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index fe46ea15..15234752 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -28,6 +28,7 @@ import com.kabouzeid.appthemehelper.ThemeStore; import com.kabouzeid.appthemehelper.util.ATHUtil; import com.kabouzeid.appthemehelper.util.NavigationViewUtil; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.appshortcuts.DynamicShortcutManager; import com.kabouzeid.gramophone.dialogs.ChangelogDialog; import com.kabouzeid.gramophone.dialogs.DonationsDialog; import com.kabouzeid.gramophone.glide.SongGlideRequest; @@ -112,6 +113,9 @@ public class MainActivity extends AbsSlidingMusicPanelActivity { if (!checkShowIntro()) { checkShowChangelog(); } + + //Set up dynamic shortcuts if needed + new DynamicShortcutManager(getApplicationContext()).initDynamicShortcuts(); } private void setMusicChooser(int key) { diff --git a/app/src/main/res/xml/launcher_shortcuts.xml b/app/src/main/res/xml/launcher_shortcuts.xml deleted file mode 100644 index 598fd3df..00000000 --- a/app/src/main/res/xml/launcher_shortcuts.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 079f163cc48e5311ad1ce6beccec79300bc8a384 Mon Sep 17 00:00:00 2001 From: Xorok Date: Thu, 9 Mar 2017 23:23:27 +0100 Subject: [PATCH 09/26] Add app shortcut icons --- .../shortcuttype/LastAddedShortcutType.java | 2 +- .../shortcuttype/ShuffleAllShortcutType.java | 2 +- .../shortcuttype/TopTracksShortcutType.java | 2 +- .../drawable-hdpi/ic_app_shortcut_last_added.png | Bin 0 -> 1448 bytes .../ic_app_shortcut_shuffle_all.png | Bin 0 -> 1473 bytes .../drawable-hdpi/ic_app_shortcut_top_tracks.png | Bin 0 -> 1434 bytes .../drawable-ldpi/ic_app_shortcut_last_added.png | Bin 0 -> 1144 bytes .../ic_app_shortcut_shuffle_all.png | Bin 0 -> 1169 bytes .../drawable-ldpi/ic_app_shortcut_top_tracks.png | Bin 0 -> 1125 bytes .../drawable-mdpi/ic_app_shortcut_last_added.png | Bin 0 -> 1236 bytes .../ic_app_shortcut_shuffle_all.png | Bin 0 -> 1272 bytes .../drawable-mdpi/ic_app_shortcut_top_tracks.png | Bin 0 -> 1256 bytes .../ic_app_shortcut_last_added.png | Bin 0 -> 1643 bytes .../ic_app_shortcut_shuffle_all.png | Bin 0 -> 1729 bytes .../ic_app_shortcut_top_tracks.png | Bin 0 -> 1670 bytes .../ic_app_shortcut_last_added.png | Bin 0 -> 2036 bytes .../ic_app_shortcut_shuffle_all.png | Bin 0 -> 2177 bytes .../ic_app_shortcut_top_tracks.png | Bin 0 -> 2081 bytes .../ic_app_shortcut_last_added.png | Bin 0 -> 2511 bytes .../ic_app_shortcut_shuffle_all.png | Bin 0 -> 2659 bytes .../ic_app_shortcut_top_tracks.png | Bin 0 -> 2569 bytes 21 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_app_shortcut_last_added.png create mode 100644 app/src/main/res/drawable-hdpi/ic_app_shortcut_shuffle_all.png create mode 100644 app/src/main/res/drawable-hdpi/ic_app_shortcut_top_tracks.png create mode 100644 app/src/main/res/drawable-ldpi/ic_app_shortcut_last_added.png create mode 100644 app/src/main/res/drawable-ldpi/ic_app_shortcut_shuffle_all.png create mode 100644 app/src/main/res/drawable-ldpi/ic_app_shortcut_top_tracks.png create mode 100644 app/src/main/res/drawable-mdpi/ic_app_shortcut_last_added.png create mode 100644 app/src/main/res/drawable-mdpi/ic_app_shortcut_shuffle_all.png create mode 100644 app/src/main/res/drawable-mdpi/ic_app_shortcut_top_tracks.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_app_shortcut_last_added.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_app_shortcut_shuffle_all.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_app_shortcut_top_tracks.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_app_shortcut_last_added.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_app_shortcut_shuffle_all.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_app_shortcut_top_tracks.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_app_shortcut_last_added.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_app_shortcut_shuffle_all.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_app_shortcut_top_tracks.png diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java index c9e4252a..05de9ede 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java @@ -22,7 +22,7 @@ public final class LastAddedShortcutType extends BaseShortcutType { return new ShortcutInfo.Builder(mContext, ID_PREFIX + "last_added") .setShortLabel(mContext.getString(R.string.appshortcut_lastadded_short)) .setLongLabel(mContext.getString(R.string.appshortcut_lastadded_long)) - .setIcon(Icon.createWithResource(mContext, R.drawable.ic_library_add_white_24dp)) + .setIcon(Icon.createWithResource(mContext, R.drawable.ic_app_shortcut_last_added)) .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.LAST_ADDED)) .build(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java index 45dd4ee0..fac2c656 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java @@ -22,7 +22,7 @@ public final class ShuffleAllShortcutType extends BaseShortcutType { return new ShortcutInfo.Builder(mContext, ID_PREFIX + "shuffle_all") .setShortLabel(mContext.getString(R.string.appshortcut_shuffleall_short)) .setLongLabel(mContext.getString(R.string.appshortcut_shuffleall_long)) - .setIcon(Icon.createWithResource(mContext, R.drawable.ic_shuffle_white_24dp)) + .setIcon(Icon.createWithResource(mContext, R.drawable.ic_app_shortcut_shuffle_all)) .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.SHUFFLE_ALL)) .build(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java index 119a916f..d7b32313 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java @@ -23,7 +23,7 @@ public final class TopTracksShortcutType extends BaseShortcutType { return new ShortcutInfo.Builder(mContext, ID_PREFIX + "top_tracks") .setShortLabel(mContext.getString(R.string.appshortcut_toptracks_short)) .setLongLabel(mContext.getString(R.string.appshortcut_toptracks_long)) - .setIcon(Icon.createWithResource(mContext, R.drawable.ic_trending_up_white_24dp)) + .setIcon(Icon.createWithResource(mContext, R.drawable.ic_app_shortcut_top_tracks)) .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.TOP_TRACKS)) .build(); } diff --git a/app/src/main/res/drawable-hdpi/ic_app_shortcut_last_added.png b/app/src/main/res/drawable-hdpi/ic_app_shortcut_last_added.png new file mode 100644 index 0000000000000000000000000000000000000000..b3cdd154805fa8811984168b7beaed94471995c1 GIT binary patch literal 1448 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84rT@hh9qO>QU(TQh5(-sSD(znuSA1{+U~Dk zzh1b0d-cu(t+SV9woZEU?%m!KXN!Ag+`RvA;ijDoqhK@yhExd5UF~*-fq{X)B*-tA zLE*hXfI-9gg#Gsm9M<>GlS@!yU|{m_ba4!+xOF$;^rU75fhRAsgMa_OKeL(X(1vSn zlN*?uo{8wK^myao|DA_fG2S{OtuOf4!ub6@XBx}Z8(t**zI)iSXCI%(3A2w)^KvZ% zj?X&N$GgHvLGu=K($=}$4YL+1xE0)YRg3GB>1ui_+2SAJvg!5dl*_xL^Ri>Z6&;sO zie7z4vFQd&fUIB37dDl)sCv#sflaDctV^ey=z6kNZbfMx`h5Q*o#+R6u&;lnWZ4B34hZt2Rq9 zv+7|wQM_>eQU(TQh5(-sSD(znucUy4+U~t4 z&Sthwx_STMn|JSOrp!Nf;R?ej7!84;83J$lH)k?1Fz}ZI`2{m5ycY;CXgHs+|9*kP z`u=%x2}%qMOo^T@jv*Dd?#{Sf)T|)T#(2>A^2^`$>Bh+%MHxvGICM7Mh`T!5C&2#Z z`R0~G%$HX2D~moZnApkOEv{XtaPW6m z^3*ti1$9nGPSmDP^jxm27PDbyuY1I!6yryi(oE*NFY9%7=DL@9af=$?!w_+Y+&L{< zm_M%Ex^G87!{*l9^;aSpjD@C`T}bd@`z4fqq?z6EhL7-QcUucJxmrqWLlLW>XHoc@LL zd;;GC=6`Y9B%c=LW!kBSMLB#)i(>DH^s6dVczx{LeTKll`n00eqiHmA8pQyUQwy9&Q?zP#BRG{M}dvUAzefEu8$F4{1v`hE?>m7RJC2f za;l`D$#OoYqE!ky%h{@mk9?56(B~|=x=E#Nb4%7qW?lYl-B0|{PIo`X_*U^7mfGKU zW-U&Cn4^6yN@l$;w}Rga)Ar8Y>W*_nFRa}!Gtpk3-%)<5<7P`OeqGyD*F{Ypf0`+J z$eMjZaKLxp)7@onUfo?a!R(X2<{Jk*QcAShX0zUTBdwy87CLvOFMH@dtl>h4PGXABSD x_nGwZN4{D6aKcmm{@QKLD;yK~7ybMAmAOIsTg?p>g?3O5@^tlcS?83{1OTaBazOw9 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_app_shortcut_top_tracks.png b/app/src/main/res/drawable-hdpi/ic_app_shortcut_top_tracks.png new file mode 100644 index 0000000000000000000000000000000000000000..5dff3fad76159bc6b468c0545b8f9797b9b17b75 GIT binary patch literal 1434 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84rT@hh9qO>QU(TQh5(-sSD(znucUy4+U^;v zHfOd@x_STM-VtfJV1xhHwI`oUx!Wq5F{}Rff+OWDiA*(rofDX^g*d!e_VadolU=T)OQiJA#tABF!W2F!xZR$7#A~h5f^FwlO#EB7+Q&lX+H+Cq=Kq|0lX5EVZF%_2SXAmg*Rls1 zix!Gn^150vO|@*?(wq^$YoEqs_LFG=`-0}bNpN|ySmsqvW%IrW-_Hx8oeLHkhFou} z5_8zHZDFAOmP@DJ@1B3JpX2)X2>%6Z{qxF*JyBS!R@W)7jv6S;udm7 z%~xP}t1#*M8I!In(~=9)~@4@-|&mx1S?&iPi?E&Y0xH zmGAHHEqc8C=fQ1_zO!V%cs$X3YBGC^g}`YGyW%-d=G?!v(I}%VYLAD0`Xo8m3vVt6 zo()?5_^5rOn7ghfW92g!#pipL72k?XGxfE&T)?p@(|yK`sN2@3XH0sW8GdBR-1tuQ z$5P7KYq{rmN=^D%n5}!qYO-E|U-^{mO}P_tuL^}c;&{p>7WOvs$F(v`t-p!IU+U9O zoYLmIas5nK_=3dkE?-zZD|ZX-5SY2${?d#PtDqmNJ4rT@hhHLjSRxvOzGX(gAxcX!ke#H$EYP-LF z{n|QvS^wfSnXQv%tlGSA)6O^V-rcTaFqo41v4Z#ycaMC zXt=-LdV`B60|TS1r;B4q#jUwhUJ5lU@U(bx^ws`vf6LfXae|u!j$|&Bmr*oZem9+SF5ixF{<*Fj+Mlfu@p0Y3$8h^mRNd#8Zt2{s zci7B6W=x&F;H5v)>zkI{cYN43&Uk!bgYofqJ6%2=`_TCE;O-5Hlb1!5t9{NFeBk-S zeUEPVjI?Xgv-Vv0`aY>}cHEOS^&LDCA=AzWDRBAuWL-&rI%SdQrrljtmu5tT{G6UN zYi5^**?sb%7 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-ldpi/ic_app_shortcut_shuffle_all.png b/app/src/main/res/drawable-ldpi/ic_app_shortcut_shuffle_all.png new file mode 100644 index 0000000000000000000000000000000000000000..c01741956a2c77ec133eb5955797ddf622b0762e GIT binary patch literal 1169 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4rT@hhHLjSRxvOzGX(gAxcX!ke#HwCYP)aV zf0)@iY4y$n$1YsCaQ*h1ckgPZ%dDDDn<)infDzV%|&0ytnA$S z!@#C`zV=1oH$uf6?WF zzNXcDPhUVe=-V2>RDbrIYDmAOk$lMp6N{7yp400#h=w@ZeCh_ zRQ4H{YFph0UaMCRgwp1$XuY%cy3`zrg-5PS-oA3G%A!W@Tw%{jr^ip1&1^S2Vs|aF z#B|EeWnnKT)d-zkryZCmdCEhleWvAubzZq|Lb=T<{g&mVdNbPOv78fV-X5D~x-ZXf x+uf)&uiAvxoHP6WPoDkQ@x{-d3j8kl%h>$4J#!6n^D0o%@O1TaS?83{1ORaZ+=~DJ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-ldpi/ic_app_shortcut_top_tracks.png b/app/src/main/res/drawable-ldpi/ic_app_shortcut_top_tracks.png new file mode 100644 index 0000000000000000000000000000000000000000..d53a1cf4ffcaaee183de8444ea09bf1d6166f268 GIT binary patch literal 1125 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4rT@hhHLjSRxvOzGX(gAxcX!ke#HwCYP)aV zf0)@iX~wF}Z{EGDnKFO%&I5Z-oMjjVqaiT#L%_T3RTcvS16N6qUob<0!+QaPfQI|) ztv9%MGB7Z5dAc};RNR_7<#t(%0f#GdQ}X}+$**UK%$gl$e4@xy-*A_00f#3CKU++g zO3d?)mwZi6^OvrUy3kV*D071T)@}H`!m;DSu{}$+ zXn&Lyp76cE*rIffbxYhs8Yi+^sE(!qQF;T;wm zE9VBMi~Q%B4;w2R2G6|sT~mqoOv^-W<;1O1xh79ZPHmE1XQZgr@6-0E_2l2R%)-pF zQNj+d^pCGQ_4FT8dGwdvFV_6Kx7M^!v|ljyUCoN=3Bl@%-&zDQY-e{Y^H7+0a!<6i xiK=3-ch%Wti#PTp&%0!=*V7)}U)*UcwSQ)7e5RZI`stt;_jL7hS?83{1OO3QyCDDo literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_app_shortcut_last_added.png b/app/src/main/res/drawable-mdpi/ic_app_shortcut_last_added.png new file mode 100644 index 0000000000000000000000000000000000000000..22c6c98e4319364277ced6865abdd30358c6ddfe GIT binary patch literal 1236 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4rT@hhJ-tuTNxOb83KGlTzxVNzY+lwYP&C7 zzkT!m!#D5V^)FsiGiCmaRht<`!Dt8!@euIYbW)Omfq|za$S;^-eSks1`38aa_viN~ z79W#kU|=lwba4!+xV1N|Gw-kh53BT~jQ{^v&-Sv|qo&DH+!7MpF0!(-#^(0>nOq-V zDzDbp_}lbb|G&d0=JuHaH`(7WeQAA$W!0${OvNX89bU0zsLHgYwdubI^SYnj$;tPk z``UzWu5FfQrr$OBprvw1;)Xr*Cm!)1k2&ol*(7ee&))kY@}O+cg8pKKdkQLSs=O(^ zl4*S&#s7R>PTeLlThq{P!DEk{u4R8#XZV@F3SY?I-ZNi|Sv~vw*&stJR;g9bB`@Be zemn3>(f!1miiyqVemhT9n#irO_~18-jIV3nI{a=~DgJuxXMMi8mJ{BbeQ0>A^?9XC zjMgF_S9xd4_D$7ooE}m4^0uz^Uo)X>#gqPnk#D9cFkcQ53Ahw-AzZdpg4r)PUvI+e z(pcr`OMT-kAzs^%j9+-$WvUza&U~6@ Jvd$@?2>^0O0VMzc literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_app_shortcut_shuffle_all.png b/app/src/main/res/drawable-mdpi/ic_app_shortcut_shuffle_all.png new file mode 100644 index 0000000000000000000000000000000000000000..ce5b17fd72c69789c09c5349fa1266f9bc896358 GIT binary patch literal 1272 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4rT@hhJ-tuTNxOb83KGlTzxVNzY+lwYP)Bw z+PwF~*_tWyi+g6=y#MgcyLYX#mpyv+f?*VlhQN>wf%&RacQG(9@RS7k1v9JuRRN4Eq#p|VX+K>b z^JpU94erbvNumcQ?++<%**js%G2Xh$g*^om>#e@Tx-?YR96GY-FN42NqJis!hn?MQ zeu6dUPGldoua%XX@k*{Z}?7Rof zcE|p5_&+=2a#PCXdxe_e-nVBB!XE3K4cETW_q&QYR=*?J_KBg9*7Eb8=kJadiHToh zFfptAj#4DOor>mdKI;Vst0I*FH Am;e9( literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_app_shortcut_top_tracks.png b/app/src/main/res/drawable-mdpi/ic_app_shortcut_top_tracks.png new file mode 100644 index 0000000000000000000000000000000000000000..772610f6c0c92aab4083fdd47340d2266f243df2 GIT binary patch literal 1256 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_app_shortcut_shuffle_all.png b/app/src/main/res/drawable-xxhdpi/ic_app_shortcut_shuffle_all.png new file mode 100644 index 0000000000000000000000000000000000000000..a61a8fd1d0236cce05e42b43c19483dc27746221 GIT binary patch literal 2177 zcmeAS@N?(olHy`uVBq!ia0y~yV3+{H9Lx+13>Rhybuln7GX(gAxcX!kekBnk)OKgK zPP%#j;ocKx-@JQQGi84N;x(&x9+bA(c#7lV0_^bDl`|#A)MGisrIR%F_J(sa4Y|A!J zb1;vnS@6~((?jOl#>Ia{EJeLNN&`9^rpS9N^US>vqZVs+?*1tk#*4fKEO(W+u4I;s z+2<7T>5fa*xtWGvUViJaS#q)6j(f$#rUkPW9Lp=8DWH4MyqMQiSnN@vY6VAn((KbI z!7b@M%!kgfDV$W%Ou17unI~jII!{}v(m$?w0vEX^WORM%5idBWmNGNJI_O53_ReiF z?RFNL`OjFwR;)beT)`arVshxLptt!GoPt6hDS9YWXo)n^|Ye&D)!K1pNg zrnZhWn-8!lw^PND zMGt?dW#zQ6dpxmO@a5wNzbh7^j~h+iu`_x58})M>nLH^?^7JNsC7XGX`q|qB-wISl zwY=>%WQm-wGrjfoL+?g`%76xgN`r=gN`Z!g%1@0GDmOK5s4Qx{P-)coq4JZ~S0(?$ zC45rn8KR#p)Y{b#b|2rbKUHvmApra-4jkuE?MzUW4i;(~5WmGppEno!^eGE2_oP4m|d}o)KYT$mKF`qQ=_>)p>jwi_c3Of2^qV z^4aMNx^q{q-{|7;(9=30R-FH*%q)%ksK2v)Ydr!Chhp^(h3Iu>+5;DE}prthoQed@}2pV8P{|Egw61M`tr&z4ciIgHypx5mHbY= zvQd|gGTTy{J8vJap7gmb+g#=dD^_PZe&^ z(EQuY-F%IO&&024+neGudqY)NJ0#+!tk`br$*kqQ<(x2w=;7Fv7E;$LoA!omFgia! zehr&Xy|;T+^b)z50{(Bd1TILMFPdW)7nyWpU(l}R^U3a^-@_*}_R4-d@=bf+Nfz6z zB?VTuU77Q&4))n?IVi*L(|R^516>(ukj2Y%19f2S&B|ISpJ^X;k3>$#juC%+Yb z7o`5x|M8cpOH1!G&h-sq{&hV*tvLBt;QHS?Wqs?ea8H!;60JzRa{J!5ZI`~;*Ddkb UH(#XdC8*T*boFyt=akR{0CI!Vh5!Hn literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_app_shortcut_top_tracks.png b/app/src/main/res/drawable-xxhdpi/ic_app_shortcut_top_tracks.png new file mode 100644 index 0000000000000000000000000000000000000000..f4ead0d0fde68370a0e786676f85959949bdcdb0 GIT binary patch literal 2081 zcmeAS@N?(olHy`uVBq!ia0y~yV3+{H9Lx+13>Rhybuln7GX(gAxcX!kekBnk)OOEU zwK=nO(#`u1FI>O9_r%%$#cPUtW~|S5dF#_hVDkTmgY!N7U^E%{QFq-y9d*wCZ4ZlnSd}1)IQHiNX1ow8VJ?Ok@3#31GK2~KR;M$7hE{&!Q$3A`)D+sNOzY^7A` zEqmvMmp*$06@FZ^P`{Srg=6cAo#HDJL|A#dmfpIbG9^r-=EUn;DNNaN9StO6U4E7ziq5;oT_ce)ZIU5YBMxo|5)xqQ8&w_t10i&POW5zAAp`^@b5 z=5ln&f6AG=P^p!D;vqBV_z4-)SN)4f?fBYhvm!lA;cQUjjBSh$rBu76^81}XXg`f~ zU-~qxO~Xs7YW2w=vl}^!C4I|OI*nU4TwKXJ!E4Tf=uVTWr6(V>OghdP=Ae2?;HeSE zDwzdbVvdnQDKTXcSKdrucWGbz*ua@7mCJCxV$~_uB&V~f9*c4e@29laEI1r9d83wm z$DY$tpQeBL@n}M|fRX;cS$85&w7%XrQ!@A3v{ycb#?D$#`L26%cXsuZgn95EI+ zTP5T2;Cbcz={7Fh^JcH;=cuawuvMZ{%r-DP8?Mv)eg%1Qe89lr?a2bu_eiCSZl;g-=+xtrMtDYTuHSbqdUTS28%#&@8rEa}R6O-HjcA1IW ztKPGxULU(Z>$vs|##<7rqjDzO#5d6@Cg`Ij5Vr{-;pM+}Pmf z-WNVxO4+eJWv0#Z*4>v(>OK2!d!{LEt;vj^mZ|Yd?9@xUg-<*JZ|lF0+5Lvo=+~}u z7cQR5%FU1ecttKw_q#>O{_5FQu4~=2eaqzKx|hsL`)uhp$IP+f_b-d5i|6hCdTPtG zg%_oE?wKaLL?hDw@zGaD{?EGfDy6h!qsFTD%^k^7e*3rmm3Vt`vdv%B-@RLJWgHjY zzhQQqWkbOi)?9U#P3(%STJOAC^zZgWdbOwoy2cbfVe8V4`nG0Dmx@)GZ0YHFS9eZv zn)Cd;w5m>@W17R>FVdQ&MBb@0G+$K9RL6T literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_app_shortcut_last_added.png b/app/src/main/res/drawable-xxxhdpi/ic_app_shortcut_last_added.png new file mode 100644 index 0000000000000000000000000000000000000000..84a17685b97ea0b78e22a16e6cb8dfc7b86c0b5b GIT binary patch literal 2511 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_app_shortcut_top_tracks.png b/app/src/main/res/drawable-xxxhdpi/ic_app_shortcut_top_tracks.png new file mode 100644 index 0000000000000000000000000000000000000000..7cf79a767a8adf4b7b72cfd84b5223ba6f58e1ea GIT binary patch literal 2569 zcmeAS@N?(olHy`uVBq!ia0y~yU^oE69Lx+145>_WOc@xM83KGlTzxVNzmfRZap%4N(E6(m`U|2pYHNm-TOEjAT_3~j&Nb>B8x-w$0Wrpwkaeeau8{py?db7ubkKdC?UuUUiE{C{gt zHq?jl%1&V3z%AKz)qhJ&8Iw9g;PgYE7Uxd)jA4kGmh(K^#hFco!A5?SbNrf0dlhz# z>NtyhpD9-u%Mp?(fQ?kX>(2Q~U1>d%7{66=Z zDi@qF?nqpf-&E1iTlmG13p+ZZ$YBo&s=W>_J+z|*CeVbWu^6(`sjivD^x8c+YgWz8^q>f@R0 zTn_n1Z;5DC|6$my9d=oB$+{nm6^qZvJt$y$oW}ov|6!`ca9SJ?O<-)nH+~Lj71Y%eL8>%OpCsNUG2M@0ZEYu~np4EupHRVs_*?ma3~< ze$ETFFc?lZ>SGbtb-3bprFX#vMwffOg~|z14L7;K~(pThOO_HSPFZ`TI-zh^DJ zJ3Nd0e};YEar@7vt!I9HWvP4K|9ji1S#`3F=6_G;PWAu)YdXunWB-d816VKEtADVl zU&ZPm?DT)if#-kn#TZOF{-ram|LA>pd+3`l_8fnn&382Zpwsbhe%G_`dhKbY4eXcx z@8`F9Ucc^TYl_C-`z+z-zk2I6Gls}{{jU}Kx$o4q6HD1$EdKuUeR1pMwQsj8i~g=H zvrYJWdbOSRn*Whn7fV*$R-Cf*>VKW72PT?)ah~Aue{;y9ULNnJkYBBdzI&F>|E=b+ zv|ee7OzeZxIy3)uUU;q+a?18?OVG+M*PAo1_!oYzP%CD-FrRq=`(cq?>FQ-ne{=J{ z9I$*R$DhDfP+ONXMP^oWAy?xHjw*&vTOTq0?lVc`IMBuJCvYs6KU?m=e9!6#_6a9A zvvx8v$mTT&Zewt}qW5AuW5MnO&Agqet5ojITPL>REu%n%?1G8QZcYiy$ZmXR`1y$1 zrHjiH4BjkF`M>DO|8)n>F$XO0Sz61uje+-+Lc*=M`1(y(3~O??{@`C@Tfi?~qCNZA zgeac$>PKB~6cZixC-k#FaDI4cz0dhy#`D%qk_&bZl&+UeU=g_4(Y|2fv0R_xZGs*1 zHWe9uPhahS=t$6n`{7JQy7#qJYF9>hYpiC?UK7ajA**<2)p6%1Mt_CR|H|3ABJaxT zC;hqm!XJF?++%pisMP50rTvw@8iog#{d-&O=gGP4Yjn&NFOP(U_n$3`G-8te8y5aF zW!jUU6ZdY=ToR_OzfdS-%dK^S8>FKqy8l19cf%fwguNfS?%dpaTW`f0_OO#3r=Pe* z>2s9p)Jk@K-$0LW!n}^ymoTc{o?w3|CrKB>3vEjCD)_hepCISS7RphVe9M9 z%j;J@c*poR;JxDH=W&0Z*Kd3l|1<0I{e$)Irl0=hw&M7U_22*6PBhq)aC7O!@T4Vk zvs1G@F7FQc@kC#;+*YVGHmh^D^rqJIh>-?{fwvB2Tfo!?^uOpcrub*@+UbcxMT z55E0#_qI3RHF{!CZ1B5SbhGmA7rugN$B%ESlXkFuzsgMV!}(PU)hjjLosRpqY5Lwb bCf~TFXFJr*Uw-)ksNVH-^>bP0l+XkK&RVAx literal 0 HcmV?d00001 From 35aaca78ea20c02bc86c8267bdea99b259ad4165 Mon Sep 17 00:00:00 2001 From: Xorok Date: Thu, 9 Mar 2017 23:24:46 +0100 Subject: [PATCH 10/26] Autoformat --- app/src/main/AndroidManifest.xml | 9 ++-- .../AppShortcutLauncherActivity.java | 18 ++++---- .../appshortcuts/DynamicShortcutManager.java | 45 ++++++++++--------- .../shortcuttype/BaseShortcutType.java | 5 --- .../shortcuttype/TopTracksShortcutType.java | 3 +- 5 files changed, 37 insertions(+), 43 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4df8d5b2..1cb20e69 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ - + @@ -175,8 +175,7 @@ android:label="@string/report_an_issue" /> + android:exported="true" /> \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java index 47888b81..3986c3ca 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java @@ -20,6 +20,8 @@ import java.util.ArrayList; public class AppShortcutLauncherActivity extends Activity { + public static final String KEY_SHORTCUT_TYPE = "com.kabouzeid.gramophone.appshortcuts.ShortcutType"; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -28,10 +30,10 @@ public class AppShortcutLauncherActivity extends Activity { //Set shortcutType from the intent extras Bundle extras = getIntent().getExtras(); - if (extras!=null){ + if (extras != null) { try { shortcutType = ShortcutType.valueOf(extras.getString(KEY_SHORTCUT_TYPE)); - } catch (IllegalArgumentException e){ //In the event we're somehow passed an invalid enum string, don't crash. + } catch (IllegalArgumentException e) { //In the event we're somehow passed an invalid enum string, don't crash. e.printStackTrace(); shortcutType = ShortcutType.NONE; } @@ -60,15 +62,12 @@ public class AppShortcutLauncherActivity extends Activity { } finish(); - } - - private enum PlayMode {NORMAL, SHUFFLE} - private void launchMainActivityWithSongs(PlayMode playMode, ArrayList songs){ + private void launchMainActivityWithSongs(PlayMode playMode, ArrayList songs) { //Create a new intent to launch MainActivity Intent intent = new Intent(this, MainActivity.class); - switch (playMode){ + switch (playMode) { case NORMAL: intent.setAction(MainActivity.INTENT_ACTION_MEDIA_PLAY); break; @@ -89,11 +88,12 @@ public class AppShortcutLauncherActivity extends Activity { startActivity(intent); } - private void shortcutError(){ + private void shortcutError() { Toast.makeText(getApplicationContext(), R.string.error_launching_shortcut, Toast.LENGTH_LONG).show(); } - public static final String KEY_SHORTCUT_TYPE = "com.kabouzeid.gramophone.appshortcuts.ShortcutType"; + private enum PlayMode {NORMAL, SHUFFLE} + public enum ShortcutType { SHUFFLE_ALL, TOP_TRACKS, LAST_ADDED, NONE } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java index ed9b4ff1..67189670 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java @@ -8,7 +8,9 @@ import android.content.pm.ShortcutManager; import android.graphics.Color; import android.graphics.drawable.Icon; -import com.kabouzeid.gramophone.appshortcuts.shortcuttype.*; +import com.kabouzeid.gramophone.appshortcuts.shortcuttype.LastAddedShortcutType; +import com.kabouzeid.gramophone.appshortcuts.shortcuttype.ShuffleAllShortcutType; +import com.kabouzeid.gramophone.appshortcuts.shortcuttype.TopTracksShortcutType; import java.util.ArrayList; import java.util.Arrays; @@ -23,29 +25,13 @@ public class DynamicShortcutManager { Context mContext; ShortcutManager shortcutManager; - public DynamicShortcutManager(Context context){ + + public DynamicShortcutManager(Context context) { mContext = context; shortcutManager = mContext.getSystemService(ShortcutManager.class); } - - public void initDynamicShortcuts(){ - if (shortcutManager.getDynamicShortcuts().size() == 0){ - shortcutManager.setDynamicShortcuts(getDefaultShortcuts()); - } - } - - public List getDefaultShortcuts(){ - return (Arrays.asList( - new ShuffleAllShortcutType(mContext).getShortcutInfo(), - new TopTracksShortcutType(mContext).getShortcutInfo(), - new LastAddedShortcutType(mContext).getShortcutInfo() - )); - } - - - - public static ShortcutInfo createShortcut(Context context, String id, String shortLabel, String longLabel, Icon icon, Intent intent){ + public static ShortcutInfo createShortcut(Context context, String id, String shortLabel, String longLabel, Icon icon, Intent intent) { return new ShortcutInfo.Builder(context, id) .setShortLabel(shortLabel) .setLongLabel(longLabel) @@ -54,12 +40,27 @@ public class DynamicShortcutManager { .build(); } - public void tintShortcutIcons(ArrayList shortcutInfos, Color color){ + public void initDynamicShortcuts() { + if (shortcutManager.getDynamicShortcuts().size() == 0) { + shortcutManager.setDynamicShortcuts(getDefaultShortcuts()); + } + } + + public List getDefaultShortcuts() { + return (Arrays.asList( + new ShuffleAllShortcutType(mContext).getShortcutInfo(), + new TopTracksShortcutType(mContext).getShortcutInfo(), + new LastAddedShortcutType(mContext).getShortcutInfo() + )); + } + + public void tintShortcutIcons(ArrayList shortcutInfos, Color color) { for (ShortcutInfo shortcutInfo : shortcutInfos) { tintShortcutIcon(shortcutInfo, color); } } - public void tintShortcutIcon(ShortcutInfo shortcutInfo, Color color){ + + public void tintShortcutIcon(ShortcutInfo shortcutInfo, Color color) { //TODO Tint icons here } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java index fbcd274f..ef1c8291 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java @@ -7,10 +7,6 @@ import android.content.pm.ShortcutInfo; import android.os.Bundle; import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity; -import com.kabouzeid.gramophone.model.Song; -import com.kabouzeid.gramophone.ui.activities.MainActivity; - -import java.util.ArrayList; /** * @author Adrian Campos @@ -31,7 +27,6 @@ public abstract class BaseShortcutType { abstract ShortcutInfo getShortcutInfo(); - /** * Creates an Intent that will launch MainActivtiy and immediately play {@param songs} in either shuffle or normal mode * diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java index d7b32313..5bd55f05 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java @@ -7,7 +7,6 @@ import android.graphics.drawable.Icon; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity; -import com.kabouzeid.gramophone.loader.TopAndRecentlyPlayedTracksLoader; /** * @author Adrian Campos @@ -18,7 +17,7 @@ public final class TopTracksShortcutType extends BaseShortcutType { public TopTracksShortcutType(Context context) { super(context); } - + public ShortcutInfo getShortcutInfo() { return new ShortcutInfo.Builder(mContext, ID_PREFIX + "top_tracks") .setShortLabel(mContext.getString(R.string.appshortcut_toptracks_short)) From d422a05e8da4b1acadae6db41e6e6faf0f0a21a6 Mon Sep 17 00:00:00 2001 From: Xorok Date: Thu, 9 Mar 2017 23:29:00 +0100 Subject: [PATCH 11/26] Adapt names to naming convention --- .../shortcuttype/LastAddedShortcutType.java | 4 ++-- .../shortcuttype/ShuffleAllShortcutType.java | 4 ++-- .../shortcuttype/TopTracksShortcutType.java | 4 ++-- app/src/main/res/values/strings.xml | 12 ++++++------ 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java index 05de9ede..af638e68 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java @@ -20,8 +20,8 @@ public final class LastAddedShortcutType extends BaseShortcutType { public ShortcutInfo getShortcutInfo() { return new ShortcutInfo.Builder(mContext, ID_PREFIX + "last_added") - .setShortLabel(mContext.getString(R.string.appshortcut_lastadded_short)) - .setLongLabel(mContext.getString(R.string.appshortcut_lastadded_long)) + .setShortLabel(mContext.getString(R.string.app_shortcut_last_added_short)) + .setLongLabel(mContext.getString(R.string.app_shortcut_last_added_long)) .setIcon(Icon.createWithResource(mContext, R.drawable.ic_app_shortcut_last_added)) .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.LAST_ADDED)) .build(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java index fac2c656..4b36de6b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java @@ -20,8 +20,8 @@ public final class ShuffleAllShortcutType extends BaseShortcutType { public ShortcutInfo getShortcutInfo() { return new ShortcutInfo.Builder(mContext, ID_PREFIX + "shuffle_all") - .setShortLabel(mContext.getString(R.string.appshortcut_shuffleall_short)) - .setLongLabel(mContext.getString(R.string.appshortcut_shuffleall_long)) + .setShortLabel(mContext.getString(R.string.app_shortcut_shuffle_all_short)) + .setLongLabel(mContext.getString(R.string.app_shortcut_shuffle_all_long)) .setIcon(Icon.createWithResource(mContext, R.drawable.ic_app_shortcut_shuffle_all)) .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.SHUFFLE_ALL)) .build(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java index 5bd55f05..5a77768e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java @@ -20,8 +20,8 @@ public final class TopTracksShortcutType extends BaseShortcutType { public ShortcutInfo getShortcutInfo() { return new ShortcutInfo.Builder(mContext, ID_PREFIX + "top_tracks") - .setShortLabel(mContext.getString(R.string.appshortcut_toptracks_short)) - .setLongLabel(mContext.getString(R.string.appshortcut_toptracks_long)) + .setShortLabel(mContext.getString(R.string.app_shortcut_top_tracks_short)) + .setLongLabel(mContext.getString(R.string.app_shortcut_top_tracks_long)) .setIcon(Icon.createWithResource(mContext, R.drawable.ic_app_shortcut_top_tracks)) .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.TOP_TRACKS)) .build(); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b550ce35..e0d40984 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -277,14 +277,14 @@ You will be forwarded to the issue tracker website. - @string/action_shuffle_all - Shuffle + @string/action_shuffle_all + Shuffle - @string/my_top_tracks - Top Tracks + @string/my_top_tracks + Top Tracks - @string/last_added - @string/last_added + @string/last_added + @string/last_added Error launching shortcut. From 978d0716e02c3864a065cdd558d603838f4d6adf Mon Sep 17 00:00:00 2001 From: Adrian Campos Date: Thu, 9 Mar 2017 17:10:23 -0800 Subject: [PATCH 12/26] Fixed orientation change bug with app shortcuts https://github.com/kabouzeid/Phonograph/issues/78#issuecomment-285512114 --- .../com/kabouzeid/gramophone/ui/activities/MainActivity.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 15234752..5be7a379 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -313,6 +313,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity { //Start the songs, setting the shuffle mode to shuffle MusicPlayerRemote.openAndShuffleQueue(songs, true); + handled = true; } else if (intent.getAction() != null && intent.getAction().equals(MainActivity.INTENT_ACTION_MEDIA_PLAY)){ //Shuffle songs in extras @@ -324,6 +325,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity { } else { MusicPlayerRemote.openQueue(songs, 0, true); } + handled = true; } if (uri != null && uri.toString().length() > 0) { From 34f2f8b9361b7e79c7de3cd855053ba0754763e2 Mon Sep 17 00:00:00 2001 From: Adrian Campos Date: Thu, 9 Mar 2017 19:03:22 -0800 Subject: [PATCH 13/26] Fixed bug where app shortcuts wouldn't work when app was already open --- app/src/main/AndroidManifest.xml | 5 +++-- .../kabouzeid/gramophone/ui/activities/MainActivity.java | 7 +++++++ app/src/main/res/values/styles.xml | 9 +++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1cb20e69..bb22b22b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,7 +20,8 @@ android:supportsRtl="true" android:theme="@style/Theme.Phonograph.Light" tools:ignore="UnusedAttribute"> - + @@ -175,7 +176,7 @@ android:label="@string/report_an_issue" /> + android:theme="@android:style/Theme.Translucent.NoTitleBar"/> \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 5be7a379..fd66bf95 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -268,6 +268,13 @@ public class MainActivity extends AbsSlidingMusicPanelActivity { handlePlaybackIntent(getIntent()); } + //Called when there's already an instance of MainActivity + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + handlePlaybackIntent(intent); + } + @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { if (item.getItemId() == android.R.id.home) { diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index bc05af2a..0870ffb7 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -48,4 +48,13 @@ toolbar + + From b14ba65a5b1a001ed212ca5f2dcb3e1db5321dfd Mon Sep 17 00:00:00 2001 From: Adrian Campos Date: Thu, 9 Mar 2017 21:54:06 -0800 Subject: [PATCH 14/26] Added version check for app shortcuts As mentioned by @arkon https://github.com/adriancampos/Phonograph/commit/2e1a453e8d2b3110d722cb13b3fbf213445a53e2#commitcomment-21247880 --- .../gramophone/appshortcuts/DynamicShortcutManager.java | 3 ++- .../kabouzeid/gramophone/ui/activities/MainActivity.java | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java index 67189670..7b174dba 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java @@ -7,6 +7,7 @@ import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager; import android.graphics.Color; import android.graphics.drawable.Icon; +import android.os.Build; import com.kabouzeid.gramophone.appshortcuts.shortcuttype.LastAddedShortcutType; import com.kabouzeid.gramophone.appshortcuts.shortcuttype.ShuffleAllShortcutType; @@ -20,7 +21,7 @@ import java.util.List; * @author Adrian Campos */ -@TargetApi(25) +@TargetApi(Build.VERSION_CODES.N_MR1) public class DynamicShortcutManager { Context mContext; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index fd66bf95..ae80b7c1 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -114,8 +114,10 @@ public class MainActivity extends AbsSlidingMusicPanelActivity { checkShowChangelog(); } - //Set up dynamic shortcuts if needed - new DynamicShortcutManager(getApplicationContext()).initDynamicShortcuts(); + //Set up dynamic shortcuts + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + new DynamicShortcutManager(getApplicationContext()).initDynamicShortcuts(); + } } private void setMusicChooser(int key) { From 6b43160a0f5cdcec7ce662bff53ee2830100dbd8 Mon Sep 17 00:00:00 2001 From: Xorok Date: Sat, 11 Mar 2017 21:03:01 +0100 Subject: [PATCH 15/26] Replace PNG app shortcut icons with vector versions --- .../ic_app_shortcut_last_added.png | Bin 1448 -> 0 bytes .../ic_app_shortcut_shuffle_all.png | Bin 1473 -> 0 bytes .../ic_app_shortcut_top_tracks.png | Bin 1434 -> 0 bytes .../ic_app_shortcut_last_added.png | Bin 1144 -> 0 bytes .../ic_app_shortcut_shuffle_all.png | Bin 1169 -> 0 bytes .../ic_app_shortcut_top_tracks.png | Bin 1125 -> 0 bytes .../ic_app_shortcut_last_added.png | Bin 1236 -> 0 bytes .../ic_app_shortcut_shuffle_all.png | Bin 1272 -> 0 bytes .../ic_app_shortcut_top_tracks.png | Bin 1256 -> 0 bytes .../ic_app_shortcut_last_added.png | Bin 1643 -> 0 bytes .../ic_app_shortcut_shuffle_all.png | Bin 1729 -> 0 bytes .../ic_app_shortcut_top_tracks.png | Bin 1670 -> 0 bytes .../ic_app_shortcut_last_added.png | Bin 2036 -> 0 bytes .../ic_app_shortcut_shuffle_all.png | Bin 2177 -> 0 bytes .../ic_app_shortcut_top_tracks.png | Bin 2081 -> 0 bytes .../ic_app_shortcut_last_added.png | Bin 2511 -> 0 bytes .../ic_app_shortcut_shuffle_all.png | Bin 2659 -> 0 bytes .../ic_app_shortcut_top_tracks.png | Bin 2569 -> 0 bytes .../drawable/ic_app_shortcut_last_added.xml | 30 ++++++++++++++++++ .../drawable/ic_app_shortcut_shuffle_all.xml | 30 ++++++++++++++++++ .../drawable/ic_app_shortcut_top_tracks.xml | 30 ++++++++++++++++++ 21 files changed, 90 insertions(+) delete mode 100644 app/src/main/res/drawable-hdpi/ic_app_shortcut_last_added.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_app_shortcut_shuffle_all.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_app_shortcut_top_tracks.png delete mode 100644 app/src/main/res/drawable-ldpi/ic_app_shortcut_last_added.png delete mode 100644 app/src/main/res/drawable-ldpi/ic_app_shortcut_shuffle_all.png delete mode 100644 app/src/main/res/drawable-ldpi/ic_app_shortcut_top_tracks.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_app_shortcut_last_added.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_app_shortcut_shuffle_all.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_app_shortcut_top_tracks.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_app_shortcut_last_added.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_app_shortcut_shuffle_all.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_app_shortcut_top_tracks.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_app_shortcut_last_added.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_app_shortcut_shuffle_all.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_app_shortcut_top_tracks.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_app_shortcut_last_added.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_app_shortcut_shuffle_all.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_app_shortcut_top_tracks.png create mode 100644 app/src/main/res/drawable/ic_app_shortcut_last_added.xml create mode 100644 app/src/main/res/drawable/ic_app_shortcut_shuffle_all.xml create mode 100644 app/src/main/res/drawable/ic_app_shortcut_top_tracks.xml diff --git a/app/src/main/res/drawable-hdpi/ic_app_shortcut_last_added.png b/app/src/main/res/drawable-hdpi/ic_app_shortcut_last_added.png deleted file mode 100644 index b3cdd154805fa8811984168b7beaed94471995c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1448 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84rT@hh9qO>QU(TQh5(-sSD(znuSA1{+U~Dk zzh1b0d-cu(t+SV9woZEU?%m!KXN!Ag+`RvA;ijDoqhK@yhExd5UF~*-fq{X)B*-tA zLE*hXfI-9gg#Gsm9M<>GlS@!yU|{m_ba4!+xOF$;^rU75fhRAsgMa_OKeL(X(1vSn zlN*?uo{8wK^myao|DA_fG2S{OtuOf4!ub6@XBx}Z8(t**zI)iSXCI%(3A2w)^KvZ% zj?X&N$GgHvLGu=K($=}$4YL+1xE0)YRg3GB>1ui_+2SAJvg!5dl*_xL^Ri>Z6&;sO zie7z4vFQd&fUIB37dDl)sCv#sflaDctV^ey=z6kNZbfMx`h5Q*o#+R6u&;lnWZ4B34hZt2Rq9 zv+7|wQM_>eQU(TQh5(-sSD(znucUy4+U~t4 z&Sthwx_STMn|JSOrp!Nf;R?ej7!84;83J$lH)k?1Fz}ZI`2{m5ycY;CXgHs+|9*kP z`u=%x2}%qMOo^T@jv*Dd?#{Sf)T|)T#(2>A^2^`$>Bh+%MHxvGICM7Mh`T!5C&2#Z z`R0~G%$HX2D~moZnApkOEv{XtaPW6m z^3*ti1$9nGPSmDP^jxm27PDbyuY1I!6yryi(oE*NFY9%7=DL@9af=$?!w_+Y+&L{< zm_M%Ex^G87!{*l9^;aSpjD@C`T}bd@`z4fqq?z6EhL7-QcUucJxmrqWLlLW>XHoc@LL zd;;GC=6`Y9B%c=LW!kBSMLB#)i(>DH^s6dVczx{LeTKll`n00eqiHmA8pQyUQwy9&Q?zP#BRG{M}dvUAzefEu8$F4{1v`hE?>m7RJC2f za;l`D$#OoYqE!ky%h{@mk9?56(B~|=x=E#Nb4%7qW?lYl-B0|{PIo`X_*U^7mfGKU zW-U&Cn4^6yN@l$;w}Rga)Ar8Y>W*_nFRa}!Gtpk3-%)<5<7P`OeqGyD*F{Ypf0`+J z$eMjZaKLxp)7@onUfo?a!R(X2<{Jk*QcAShX0zUTBdwy87CLvOFMH@dtl>h4PGXABSD x_nGwZN4{D6aKcmm{@QKLD;yK~7ybMAmAOIsTg?p>g?3O5@^tlcS?83{1OTaBazOw9 diff --git a/app/src/main/res/drawable-hdpi/ic_app_shortcut_top_tracks.png b/app/src/main/res/drawable-hdpi/ic_app_shortcut_top_tracks.png deleted file mode 100644 index 5dff3fad76159bc6b468c0545b8f9797b9b17b75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1434 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84rT@hh9qO>QU(TQh5(-sSD(znucUy4+U^;v zHfOd@x_STM-VtfJV1xhHwI`oUx!Wq5F{}Rff+OWDiA*(rofDX^g*d!e_VadolU=T)OQiJA#tABF!W2F!xZR$7#A~h5f^FwlO#EB7+Q&lX+H+Cq=Kq|0lX5EVZF%_2SXAmg*Rls1 zix!Gn^150vO|@*?(wq^$YoEqs_LFG=`-0}bNpN|ySmsqvW%IrW-_Hx8oeLHkhFou} z5_8zHZDFAOmP@DJ@1B3JpX2)X2>%6Z{qxF*JyBS!R@W)7jv6S;udm7 z%~xP}t1#*M8I!In(~=9)~@4@-|&mx1S?&iPi?E&Y0xH zmGAHHEqc8C=fQ1_zO!V%cs$X3YBGC^g}`YGyW%-d=G?!v(I}%VYLAD0`Xo8m3vVt6 zo()?5_^5rOn7ghfW92g!#pipL72k?XGxfE&T)?p@(|yK`sN2@3XH0sW8GdBR-1tuQ z$5P7KYq{rmN=^D%n5}!qYO-E|U-^{mO}P_tuL^}c;&{p>7WOvs$F(v`t-p!IU+U9O zoYLmIas5nK_=3dkE?-zZD|ZX-5SY2${?d#PtDqmNJ4rT@hhHLjSRxvOzGX(gAxcX!ke#H$EYP-LF z{n|QvS^wfSnXQv%tlGSA)6O^V-rcTaFqo41v4Z#ycaMC zXt=-LdV`B60|TS1r;B4q#jUwhUJ5lU@U(bx^ws`vf6LfXae|u!j$|&Bmr*oZem9+SF5ixF{<*Fj+Mlfu@p0Y3$8h^mRNd#8Zt2{s zci7B6W=x&F;H5v)>zkI{cYN43&Uk!bgYofqJ6%2=`_TCE;O-5Hlb1!5t9{NFeBk-S zeUEPVjI?Xgv-Vv0`aY>}cHEOS^&LDCA=AzWDRBAuWL-&rI%SdQrrljtmu5tT{G6UN zYi5^**?sb%7 diff --git a/app/src/main/res/drawable-ldpi/ic_app_shortcut_shuffle_all.png b/app/src/main/res/drawable-ldpi/ic_app_shortcut_shuffle_all.png deleted file mode 100644 index c01741956a2c77ec133eb5955797ddf622b0762e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1169 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4rT@hhHLjSRxvOzGX(gAxcX!ke#HwCYP)aV zf0)@iY4y$n$1YsCaQ*h1ckgPZ%dDDDn<)infDzV%|&0ytnA$S z!@#C`zV=1oH$uf6?WF zzNXcDPhUVe=-V2>RDbrIYDmAOk$lMp6N{7yp400#h=w@ZeCh_ zRQ4H{YFph0UaMCRgwp1$XuY%cy3`zrg-5PS-oA3G%A!W@Tw%{jr^ip1&1^S2Vs|aF z#B|EeWnnKT)d-zkryZCmdCEhleWvAubzZq|Lb=T<{g&mVdNbPOv78fV-X5D~x-ZXf x+uf)&uiAvxoHP6WPoDkQ@x{-d3j8kl%h>$4J#!6n^D0o%@O1TaS?83{1ORaZ+=~DJ diff --git a/app/src/main/res/drawable-ldpi/ic_app_shortcut_top_tracks.png b/app/src/main/res/drawable-ldpi/ic_app_shortcut_top_tracks.png deleted file mode 100644 index d53a1cf4ffcaaee183de8444ea09bf1d6166f268..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1125 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4rT@hhHLjSRxvOzGX(gAxcX!ke#HwCYP)aV zf0)@iX~wF}Z{EGDnKFO%&I5Z-oMjjVqaiT#L%_T3RTcvS16N6qUob<0!+QaPfQI|) ztv9%MGB7Z5dAc};RNR_7<#t(%0f#GdQ}X}+$**UK%$gl$e4@xy-*A_00f#3CKU++g zO3d?)mwZi6^OvrUy3kV*D071T)@}H`!m;DSu{}$+ zXn&Lyp76cE*rIffbxYhs8Yi+^sE(!qQF;T;wm zE9VBMi~Q%B4;w2R2G6|sT~mqoOv^-W<;1O1xh79ZPHmE1XQZgr@6-0E_2l2R%)-pF zQNj+d^pCGQ_4FT8dGwdvFV_6Kx7M^!v|ljyUCoN=3Bl@%-&zDQY-e{Y^H7+0a!<6i xiK=3-ch%Wti#PTp&%0!=*V7)}U)*UcwSQ)7e5RZI`stt;_jL7hS?83{1OO3QyCDDo diff --git a/app/src/main/res/drawable-mdpi/ic_app_shortcut_last_added.png b/app/src/main/res/drawable-mdpi/ic_app_shortcut_last_added.png deleted file mode 100644 index 22c6c98e4319364277ced6865abdd30358c6ddfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1236 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4rT@hhJ-tuTNxOb83KGlTzxVNzY+lwYP&C7 zzkT!m!#D5V^)FsiGiCmaRht<`!Dt8!@euIYbW)Omfq|za$S;^-eSks1`38aa_viN~ z79W#kU|=lwba4!+xV1N|Gw-kh53BT~jQ{^v&-Sv|qo&DH+!7MpF0!(-#^(0>nOq-V zDzDbp_}lbb|G&d0=JuHaH`(7WeQAA$W!0${OvNX89bU0zsLHgYwdubI^SYnj$;tPk z``UzWu5FfQrr$OBprvw1;)Xr*Cm!)1k2&ol*(7ee&))kY@}O+cg8pKKdkQLSs=O(^ zl4*S&#s7R>PTeLlThq{P!DEk{u4R8#XZV@F3SY?I-ZNi|Sv~vw*&stJR;g9bB`@Be zemn3>(f!1miiyqVemhT9n#irO_~18-jIV3nI{a=~DgJuxXMMi8mJ{BbeQ0>A^?9XC zjMgF_S9xd4_D$7ooE}m4^0uz^Uo)X>#gqPnk#D9cFkcQ53Ahw-AzZdpg4r)PUvI+e z(pcr`OMT-kAzs^%j9+-$WvUza&U~6@ Jvd$@?2>^0O0VMzc diff --git a/app/src/main/res/drawable-mdpi/ic_app_shortcut_shuffle_all.png b/app/src/main/res/drawable-mdpi/ic_app_shortcut_shuffle_all.png deleted file mode 100644 index ce5b17fd72c69789c09c5349fa1266f9bc896358..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1272 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4rT@hhJ-tuTNxOb83KGlTzxVNzY+lwYP)Bw z+PwF~*_tWyi+g6=y#MgcyLYX#mpyv+f?*VlhQN>wf%&RacQG(9@RS7k1v9JuRRN4Eq#p|VX+K>b z^JpU94erbvNumcQ?++<%**js%G2Xh$g*^om>#e@Tx-?YR96GY-FN42NqJis!hn?MQ zeu6dUPGldoua%XX@k*{Z}?7Rof zcE|p5_&+=2a#PCXdxe_e-nVBB!XE3K4cETW_q&QYR=*?J_KBg9*7Eb8=kJadiHToh zFfptAj#4DOor>mdKI;Vst0I*FH Am;e9( diff --git a/app/src/main/res/drawable-mdpi/ic_app_shortcut_top_tracks.png b/app/src/main/res/drawable-mdpi/ic_app_shortcut_top_tracks.png deleted file mode 100644 index 772610f6c0c92aab4083fdd47340d2266f243df2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1256 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 diff --git a/app/src/main/res/drawable-xxhdpi/ic_app_shortcut_shuffle_all.png b/app/src/main/res/drawable-xxhdpi/ic_app_shortcut_shuffle_all.png deleted file mode 100644 index a61a8fd1d0236cce05e42b43c19483dc27746221..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2177 zcmeAS@N?(olHy`uVBq!ia0y~yV3+{H9Lx+13>Rhybuln7GX(gAxcX!kekBnk)OKgK zPP%#j;ocKx-@JQQGi84N;x(&x9+bA(c#7lV0_^bDl`|#A)MGisrIR%F_J(sa4Y|A!J zb1;vnS@6~((?jOl#>Ia{EJeLNN&`9^rpS9N^US>vqZVs+?*1tk#*4fKEO(W+u4I;s z+2<7T>5fa*xtWGvUViJaS#q)6j(f$#rUkPW9Lp=8DWH4MyqMQiSnN@vY6VAn((KbI z!7b@M%!kgfDV$W%Ou17unI~jII!{}v(m$?w0vEX^WORM%5idBWmNGNJI_O53_ReiF z?RFNL`OjFwR;)beT)`arVshxLptt!GoPt6hDS9YWXo)n^|Ye&D)!K1pNg zrnZhWn-8!lw^PND zMGt?dW#zQ6dpxmO@a5wNzbh7^j~h+iu`_x58})M>nLH^?^7JNsC7XGX`q|qB-wISl zwY=>%WQm-wGrjfoL+?g`%76xgN`r=gN`Z!g%1@0GDmOK5s4Qx{P-)coq4JZ~S0(?$ zC45rn8KR#p)Y{b#b|2rbKUHvmApra-4jkuE?MzUW4i;(~5WmGppEno!^eGE2_oP4m|d}o)KYT$mKF`qQ=_>)p>jwi_c3Of2^qV z^4aMNx^q{q-{|7;(9=30R-FH*%q)%ksK2v)Ydr!Chhp^(h3Iu>+5;DE}prthoQed@}2pV8P{|Egw61M`tr&z4ciIgHypx5mHbY= zvQd|gGTTy{J8vJap7gmb+g#=dD^_PZe&^ z(EQuY-F%IO&&024+neGudqY)NJ0#+!tk`br$*kqQ<(x2w=;7Fv7E;$LoA!omFgia! zehr&Xy|;T+^b)z50{(Bd1TILMFPdW)7nyWpU(l}R^U3a^-@_*}_R4-d@=bf+Nfz6z zB?VTuU77Q&4))n?IVi*L(|R^516>(ukj2Y%19f2S&B|ISpJ^X;k3>$#juC%+Yb z7o`5x|M8cpOH1!G&h-sq{&hV*tvLBt;QHS?Wqs?ea8H!;60JzRa{J!5ZI`~;*Ddkb UH(#XdC8*T*boFyt=akR{0CI!Vh5!Hn diff --git a/app/src/main/res/drawable-xxhdpi/ic_app_shortcut_top_tracks.png b/app/src/main/res/drawable-xxhdpi/ic_app_shortcut_top_tracks.png deleted file mode 100644 index f4ead0d0fde68370a0e786676f85959949bdcdb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2081 zcmeAS@N?(olHy`uVBq!ia0y~yV3+{H9Lx+13>Rhybuln7GX(gAxcX!kekBnk)OOEU zwK=nO(#`u1FI>O9_r%%$#cPUtW~|S5dF#_hVDkTmgY!N7U^E%{QFq-y9d*wCZ4ZlnSd}1)IQHiNX1ow8VJ?Ok@3#31GK2~KR;M$7hE{&!Q$3A`)D+sNOzY^7A` zEqmvMmp*$06@FZ^P`{Srg=6cAo#HDJL|A#dmfpIbG9^r-=EUn;DNNaN9StO6U4E7ziq5;oT_ce)ZIU5YBMxo|5)xqQ8&w_t10i&POW5zAAp`^@b5 z=5ln&f6AG=P^p!D;vqBV_z4-)SN)4f?fBYhvm!lA;cQUjjBSh$rBu76^81}XXg`f~ zU-~qxO~Xs7YW2w=vl}^!C4I|OI*nU4TwKXJ!E4Tf=uVTWr6(V>OghdP=Ae2?;HeSE zDwzdbVvdnQDKTXcSKdrucWGbz*ua@7mCJCxV$~_uB&V~f9*c4e@29laEI1r9d83wm z$DY$tpQeBL@n}M|fRX;cS$85&w7%XrQ!@A3v{ycb#?D$#`L26%cXsuZgn95EI+ zTP5T2;Cbcz={7Fh^JcH;=cuawuvMZ{%r-DP8?Mv)eg%1Qe89lr?a2bu_eiCSZl;g-=+xtrMtDYTuHSbqdUTS28%#&@8rEa}R6O-HjcA1IW ztKPGxULU(Z>$vs|##<7rqjDzO#5d6@Cg`Ij5Vr{-;pM+}Pmf z-WNVxO4+eJWv0#Z*4>v(>OK2!d!{LEt;vj^mZ|Yd?9@xUg-<*JZ|lF0+5Lvo=+~}u z7cQR5%FU1ecttKw_q#>O{_5FQu4~=2eaqzKx|hsL`)uhp$IP+f_b-d5i|6hCdTPtG zg%_oE?wKaLL?hDw@zGaD{?EGfDy6h!qsFTD%^k^7e*3rmm3Vt`vdv%B-@RLJWgHjY zzhQQqWkbOi)?9U#P3(%STJOAC^zZgWdbOwoy2cbfVe8V4`nG0Dmx@)GZ0YHFS9eZv zn)Cd;w5m>@W17R>FVdQ&MBb@0G+$K9RL6T diff --git a/app/src/main/res/drawable-xxxhdpi/ic_app_shortcut_last_added.png b/app/src/main/res/drawable-xxxhdpi/ic_app_shortcut_last_added.png deleted file mode 100644 index 84a17685b97ea0b78e22a16e6cb8dfc7b86c0b5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2511 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 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_app_shortcut_top_tracks.png b/app/src/main/res/drawable-xxxhdpi/ic_app_shortcut_top_tracks.png deleted file mode 100644 index 7cf79a767a8adf4b7b72cfd84b5223ba6f58e1ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2569 zcmeAS@N?(olHy`uVBq!ia0y~yU^oE69Lx+145>_WOc@xM83KGlTzxVNzmfRZap%4N(E6(m`U|2pYHNm-TOEjAT_3~j&Nb>B8x-w$0Wrpwkaeeau8{py?db7ubkKdC?UuUUiE{C{gt zHq?jl%1&V3z%AKz)qhJ&8Iw9g;PgYE7Uxd)jA4kGmh(K^#hFco!A5?SbNrf0dlhz# z>NtyhpD9-u%Mp?(fQ?kX>(2Q~U1>d%7{66=Z zDi@qF?nqpf-&E1iTlmG13p+ZZ$YBo&s=W>_J+z|*CeVbWu^6(`sjivD^x8c+YgWz8^q>f@R0 zTn_n1Z;5DC|6$my9d=oB$+{nm6^qZvJt$y$oW}ov|6!`ca9SJ?O<-)nH+~Lj71Y%eL8>%OpCsNUG2M@0ZEYu~np4EupHRVs_*?ma3~< ze$ETFFc?lZ>SGbtb-3bprFX#vMwffOg~|z14L7;K~(pThOO_HSPFZ`TI-zh^DJ zJ3Nd0e};YEar@7vt!I9HWvP4K|9ji1S#`3F=6_G;PWAu)YdXunWB-d816VKEtADVl zU&ZPm?DT)if#-kn#TZOF{-ram|LA>pd+3`l_8fnn&382Zpwsbhe%G_`dhKbY4eXcx z@8`F9Ucc^TYl_C-`z+z-zk2I6Gls}{{jU}Kx$o4q6HD1$EdKuUeR1pMwQsj8i~g=H zvrYJWdbOSRn*Whn7fV*$R-Cf*>VKW72PT?)ah~Aue{;y9ULNnJkYBBdzI&F>|E=b+ zv|ee7OzeZxIy3)uUU;q+a?18?OVG+M*PAo1_!oYzP%CD-FrRq=`(cq?>FQ-ne{=J{ z9I$*R$DhDfP+ONXMP^oWAy?xHjw*&vTOTq0?lVc`IMBuJCvYs6KU?m=e9!6#_6a9A zvvx8v$mTT&Zewt}qW5AuW5MnO&Agqet5ojITPL>REu%n%?1G8QZcYiy$ZmXR`1y$1 zrHjiH4BjkF`M>DO|8)n>F$XO0Sz61uje+-+Lc*=M`1(y(3~O??{@`C@Tfi?~qCNZA zgeac$>PKB~6cZixC-k#FaDI4cz0dhy#`D%qk_&bZl&+UeU=g_4(Y|2fv0R_xZGs*1 zHWe9uPhahS=t$6n`{7JQy7#qJYF9>hYpiC?UK7ajA**<2)p6%1Mt_CR|H|3ABJaxT zC;hqm!XJF?++%pisMP50rTvw@8iog#{d-&O=gGP4Yjn&NFOP(U_n$3`G-8te8y5aF zW!jUU6ZdY=ToR_OzfdS-%dK^S8>FKqy8l19cf%fwguNfS?%dpaTW`f0_OO#3r=Pe* z>2s9p)Jk@K-$0LW!n}^ymoTc{o?w3|CrKB>3vEjCD)_hepCISS7RphVe9M9 z%j;J@c*poR;JxDH=W&0Z*Kd3l|1<0I{e$)Irl0=hw&M7U_22*6PBhq)aC7O!@T4Vk zvs1G@F7FQc@kC#;+*YVGHmh^D^rqJIh>-?{fwvB2Tfo!?^uOpcrub*@+UbcxMT z55E0#_qI3RHF{!CZ1B5SbhGmA7rugN$B%ESlXkFuzsgMV!}(PU)hjjLosRpqY5Lwb bCf~TFXFJr*Uw-)ksNVH-^>bP0l+XkK&RVAx diff --git a/app/src/main/res/drawable/ic_app_shortcut_last_added.xml b/app/src/main/res/drawable/ic_app_shortcut_last_added.xml new file mode 100644 index 00000000..0ea8f9cc --- /dev/null +++ b/app/src/main/res/drawable/ic_app_shortcut_last_added.xml @@ -0,0 +1,30 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_app_shortcut_shuffle_all.xml b/app/src/main/res/drawable/ic_app_shortcut_shuffle_all.xml new file mode 100644 index 00000000..9e879d0a --- /dev/null +++ b/app/src/main/res/drawable/ic_app_shortcut_shuffle_all.xml @@ -0,0 +1,30 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_app_shortcut_top_tracks.xml b/app/src/main/res/drawable/ic_app_shortcut_top_tracks.xml new file mode 100644 index 00000000..08341001 --- /dev/null +++ b/app/src/main/res/drawable/ic_app_shortcut_top_tracks.xml @@ -0,0 +1,30 @@ + + + + + + + + + + \ No newline at end of file From 49a3d0b28a94376bc76b6a95b46b78d7f46ebca3 Mon Sep 17 00:00:00 2001 From: Adrian Campos Date: Sat, 18 Mar 2017 17:47:11 -0700 Subject: [PATCH 16/26] Support theme colors in AppShortcut icons --- .../AppShortcutIconGenerator.java | 54 +++++++++++++++++++ .../appshortcuts/DynamicShortcutManager.java | 15 ++---- .../shortcuttype/LastAddedShortcutType.java | 4 +- .../shortcuttype/ShuffleAllShortcutType.java | 4 +- .../shortcuttype/TopTracksShortcutType.java | 4 +- .../ui/activities/MainActivity.java | 2 +- .../ui/activities/SettingsActivity.java | 12 +++++ .../drawable/ic_app_shortcut_background.xml | 18 +++++++ .../drawable/ic_app_shortcut_last_added.xml | 10 ---- .../drawable/ic_app_shortcut_shuffle_all.xml | 10 ---- .../drawable/ic_app_shortcut_top_tracks.xml | 10 ---- 11 files changed, 95 insertions(+), 48 deletions(-) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutIconGenerator.java create mode 100644 app/src/main/res/drawable/ic_app_shortcut_background.xml diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutIconGenerator.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutIconGenerator.java new file mode 100644 index 00000000..4a6d3ab0 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutIconGenerator.java @@ -0,0 +1,54 @@ +package com.kabouzeid.gramophone.appshortcuts; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; +import android.graphics.drawable.LayerDrawable; +import android.os.Build; +import android.support.annotation.RequiresApi; +import android.util.TypedValue; + +import com.kabouzeid.appthemehelper.ThemeStore; +import com.kabouzeid.gramophone.R; +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) { + //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 generateThemedIcon(context, iconId, + ThemeStore.primaryColor(context), + typedColorBackground.data + ); + } + + public static Icon generateThemedIcon(Context context, int iconId, int foregroundColor, int backgroundColor) { + //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 + LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{backgroundDrawable, vectorDrawable}); + + //Return as an Icon + return Icon.createWithBitmap(drawableToBitmap(layerDrawable)); + } + + private static Bitmap drawableToBitmap(Drawable drawable) { + Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + drawable.draw(canvas); + return bitmap; + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java index 7b174dba..64b9d3c4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java @@ -47,6 +47,10 @@ public class DynamicShortcutManager { } } + public void updateDynamicShortcuts() { + shortcutManager.updateShortcuts(getDefaultShortcuts()); + } + public List getDefaultShortcuts() { return (Arrays.asList( new ShuffleAllShortcutType(mContext).getShortcutInfo(), @@ -54,15 +58,4 @@ public class DynamicShortcutManager { new LastAddedShortcutType(mContext).getShortcutInfo() )); } - - public void tintShortcutIcons(ArrayList shortcutInfos, Color color) { - for (ShortcutInfo shortcutInfo : shortcutInfos) { - tintShortcutIcon(shortcutInfo, color); - } - } - - public void tintShortcutIcon(ShortcutInfo shortcutInfo, Color color) { - //TODO Tint icons here - } - } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java index af638e68..fcb632c8 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java @@ -3,9 +3,9 @@ package com.kabouzeid.gramophone.appshortcuts.shortcuttype; import android.annotation.TargetApi; import android.content.Context; import android.content.pm.ShortcutInfo; -import android.graphics.drawable.Icon; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.appshortcuts.AppShortcutIconGenerator; import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity; /** @@ -22,7 +22,7 @@ public final class LastAddedShortcutType extends BaseShortcutType { return new ShortcutInfo.Builder(mContext, ID_PREFIX + "last_added") .setShortLabel(mContext.getString(R.string.app_shortcut_last_added_short)) .setLongLabel(mContext.getString(R.string.app_shortcut_last_added_long)) - .setIcon(Icon.createWithResource(mContext, R.drawable.ic_app_shortcut_last_added)) + .setIcon(AppShortcutIconGenerator.generateThemedIcon(mContext, R.drawable.ic_app_shortcut_last_added)) .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.LAST_ADDED)) .build(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java index 4b36de6b..868a0670 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java @@ -3,9 +3,9 @@ package com.kabouzeid.gramophone.appshortcuts.shortcuttype; import android.annotation.TargetApi; import android.content.Context; import android.content.pm.ShortcutInfo; -import android.graphics.drawable.Icon; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.appshortcuts.AppShortcutIconGenerator; import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity; /** @@ -22,7 +22,7 @@ public final class ShuffleAllShortcutType extends BaseShortcutType { return new ShortcutInfo.Builder(mContext, ID_PREFIX + "shuffle_all") .setShortLabel(mContext.getString(R.string.app_shortcut_shuffle_all_short)) .setLongLabel(mContext.getString(R.string.app_shortcut_shuffle_all_long)) - .setIcon(Icon.createWithResource(mContext, R.drawable.ic_app_shortcut_shuffle_all)) + .setIcon(AppShortcutIconGenerator.generateThemedIcon(mContext, R.drawable.ic_app_shortcut_shuffle_all)) .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.SHUFFLE_ALL)) .build(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java index 5a77768e..db3b114b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java @@ -3,9 +3,9 @@ package com.kabouzeid.gramophone.appshortcuts.shortcuttype; import android.annotation.TargetApi; import android.content.Context; import android.content.pm.ShortcutInfo; -import android.graphics.drawable.Icon; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.appshortcuts.AppShortcutIconGenerator; import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity; /** @@ -22,7 +22,7 @@ public final class TopTracksShortcutType extends BaseShortcutType { return new ShortcutInfo.Builder(mContext, ID_PREFIX + "top_tracks") .setShortLabel(mContext.getString(R.string.app_shortcut_top_tracks_short)) .setLongLabel(mContext.getString(R.string.app_shortcut_top_tracks_long)) - .setIcon(Icon.createWithResource(mContext, R.drawable.ic_app_shortcut_top_tracks)) + .setIcon(AppShortcutIconGenerator.generateThemedIcon(mContext, R.drawable.ic_app_shortcut_top_tracks)) .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.TOP_TRACKS)) .build(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index ae80b7c1..0aacf197 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -116,7 +116,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity { //Set up dynamic shortcuts if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { - new DynamicShortcutManager(getApplicationContext()).initDynamicShortcuts(); + new DynamicShortcutManager(this).initDynamicShortcuts(); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java index 858c28c8..1fc3f83a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java @@ -25,6 +25,7 @@ import com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEColorPreference; import com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat; import com.kabouzeid.appthemehelper.util.ColorUtil; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.appshortcuts.DynamicShortcutManager; import com.kabouzeid.gramophone.preferences.NowPlayingScreenPreference; import com.kabouzeid.gramophone.preferences.NowPlayingScreenPreferenceDialog; import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity; @@ -78,6 +79,10 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia .commit(); break; } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + new DynamicShortcutManager(this).updateDynamicShortcuts(); + } recreate(); } @@ -171,6 +176,13 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia ThemeStore.editTheme(getActivity()) .activityTheme(PreferenceUtil.getThemeResFromPrefValue((String) o)) .commit(); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + //Set the new theme so that updateAppShortcuts can pull it + getActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue((String) o)); + new DynamicShortcutManager(getActivity()).updateDynamicShortcuts(); + } + getActivity().recreate(); return true; } diff --git a/app/src/main/res/drawable/ic_app_shortcut_background.xml b/app/src/main/res/drawable/ic_app_shortcut_background.xml new file mode 100644 index 00000000..a70803c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_app_shortcut_background.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_app_shortcut_last_added.xml b/app/src/main/res/drawable/ic_app_shortcut_last_added.xml index 0ea8f9cc..4170be5a 100644 --- a/app/src/main/res/drawable/ic_app_shortcut_last_added.xml +++ b/app/src/main/res/drawable/ic_app_shortcut_last_added.xml @@ -5,16 +5,6 @@ android:viewportHeight="176" android:viewportWidth="176"> - - - - - - - - - Date: Sat, 18 Mar 2017 20:17:08 -0700 Subject: [PATCH 17/26] Added "Colored App Shortcuts" as an option in settings --- .../AppShortcutIconGenerator.java | 19 +++++++++++++++- .../ui/activities/SettingsActivity.java | 22 +++++++++++++++++++ .../gramophone/util/PreferenceUtil.java | 11 ++++++++++ .../drawable/ic_app_shortcut_background.xml | 2 +- .../drawable/ic_app_shortcut_last_added.xml | 2 +- .../drawable/ic_app_shortcut_shuffle_all.xml | 2 +- .../drawable/ic_app_shortcut_top_tracks.xml | 2 +- app/src/main/res/values/colors.xml | 3 +++ app/src/main/res/values/strings.xml | 3 +++ app/src/main/res/xml/pref_colors.xml | 6 +++++ 10 files changed, 67 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutIconGenerator.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutIconGenerator.java index 4a6d3ab0..6984edf7 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutIconGenerator.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutIconGenerator.java @@ -12,6 +12,7 @@ import android.util.TypedValue; import com.kabouzeid.appthemehelper.ThemeStore; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.Util; /** @@ -21,6 +22,22 @@ import com.kabouzeid.gramophone.util.Util; @RequiresApi(Build.VERSION_CODES.N_MR1) public final class AppShortcutIconGenerator { public static Icon generateThemedIcon(Context context, int iconId) { + if (PreferenceUtil.getInstance(context).coloredAppShortcuts()){ + return generateUserThemedIcon(context, iconId); + } else { + return generateDefaultThemedIcon(context, iconId); + } + } + + private static Icon generateDefaultThemedIcon(Context context, int iconId) { + //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) + ); + } + + private static Icon generateUserThemedIcon(Context context, int iconId) { //Get background color from context's theme final TypedValue typedColorBackground = new TypedValue(); context.getTheme().resolveAttribute(android.R.attr.colorBackground, typedColorBackground, true); @@ -32,7 +49,7 @@ public final class AppShortcutIconGenerator { ); } - public static Icon generateThemedIcon(Context context, int iconId, int foregroundColor, int backgroundColor) { + private static Icon generateThemedIcon(Context context, int iconId, int foregroundColor, int backgroundColor) { //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); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java index 1fc3f83a..58725a0d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java @@ -248,6 +248,28 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia }); } + TwoStatePreference colorAppShortcuts = (TwoStatePreference) findPreference("should_color_app_shortcuts"); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) { + colorAppShortcuts.setEnabled(false); + colorAppShortcuts.setSummary(R.string.pref_only_nougat_mr1); + } else { + colorAppShortcuts.setChecked(PreferenceUtil.getInstance(getActivity()).coloredAppShortcuts()); + colorAppShortcuts.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + //Save preference + PreferenceUtil.getInstance(getActivity()).setColoredAppShortcuts((Boolean)newValue); + + //Update app shortcuts + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + new DynamicShortcutManager(getActivity()).updateDynamicShortcuts(); + } + + return true; + } + }); + } + Preference equalizer = findPreference("equalizer"); if (!hasEqualizer()) { equalizer.setEnabled(false); diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java index bd8168ff..63deb986 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java @@ -44,6 +44,7 @@ public final class PreferenceUtil { public static final String FORCE_SQUARE_ALBUM_COVER = "force_square_album_art"; public static final String COLORED_NOTIFICATION = "colored_notification"; + public static final String COLORED_APP_SHORTCUTS = "colored_app_shortcuts"; public static final String AUDIO_DUCKING = "audio_ducking"; public static final String GAPLESS_PLAYBACK = "gapless_playback"; @@ -148,6 +149,16 @@ public final class PreferenceUtil { return mPreferences.getBoolean(COLORED_NOTIFICATION, true); } + public void setColoredAppShortcuts(final boolean value) { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putBoolean(COLORED_APP_SHORTCUTS, value); + editor.apply(); + } + + public final boolean coloredAppShortcuts() { + return mPreferences.getBoolean(COLORED_APP_SHORTCUTS, true); + } + public final boolean gaplessPlayback() { return mPreferences.getBoolean(GAPLESS_PLAYBACK, false); } diff --git a/app/src/main/res/drawable/ic_app_shortcut_background.xml b/app/src/main/res/drawable/ic_app_shortcut_background.xml index a70803c2..914648b4 100644 --- a/app/src/main/res/drawable/ic_app_shortcut_background.xml +++ b/app/src/main/res/drawable/ic_app_shortcut_background.xml @@ -12,7 +12,7 @@ android:scaleY="0.916"> diff --git a/app/src/main/res/drawable/ic_app_shortcut_last_added.xml b/app/src/main/res/drawable/ic_app_shortcut_last_added.xml index 4170be5a..b80363f4 100644 --- a/app/src/main/res/drawable/ic_app_shortcut_last_added.xml +++ b/app/src/main/res/drawable/ic_app_shortcut_last_added.xml @@ -14,7 +14,7 @@ android:translateY="-8"> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_app_shortcut_shuffle_all.xml b/app/src/main/res/drawable/ic_app_shortcut_shuffle_all.xml index f229db9e..33fccfc9 100644 --- a/app/src/main/res/drawable/ic_app_shortcut_shuffle_all.xml +++ b/app/src/main/res/drawable/ic_app_shortcut_shuffle_all.xml @@ -14,7 +14,7 @@ android:translateY="-8"> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_app_shortcut_top_tracks.xml b/app/src/main/res/drawable/ic_app_shortcut_top_tracks.xml index 889e90b4..02fa94e2 100644 --- a/app/src/main/res/drawable/ic_app_shortcut_top_tracks.xml +++ b/app/src/main/res/drawable/ic_app_shortcut_top_tracks.xml @@ -14,7 +14,7 @@ android:translateY="-8"> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index a422df29..bf20dbcd 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,4 +1,7 @@ #34000000 + + #607d8b + #f5f5f5 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e0d40984..f25d3c27 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -119,6 +119,7 @@ Images Lockscreen Colored navigation bar + Colored app shortcuts Start page Show album cover Auto download artist images @@ -158,6 +159,7 @@ Playlist name Song "Only available on Lollipop." + "Only available on Nougat 7.1." Uses the current songs album cover as lockscreen wallpaper. Blurs the album cover on the lockscreen. Can cause problems with third party apps and widgets. "Colors the notification in the album cover\u2019s vibrant color." @@ -171,6 +173,7 @@ Can increase the album cover quality but causes slower image loading times. Only enable this if you have problems with low resolution artworks. Colors play/pause, shuffle and repeat as well as the progress slider in the album cover\u2019s vibrant color. Colors the navigation bar in the primary color. + Colors the app shortcuts in the primary color. Notifications, navigation etc. "Couldn\u2019t download a matching album cover." Search your library… diff --git a/app/src/main/res/xml/pref_colors.xml b/app/src/main/res/xml/pref_colors.xml index d172658f..4ec32d77 100644 --- a/app/src/main/res/xml/pref_colors.xml +++ b/app/src/main/res/xml/pref_colors.xml @@ -27,6 +27,12 @@ android:summary="@string/pref_summary_colored_navigation_bar" android:title="@string/pref_title_navigation_bar" /> + + From d17f0407ddb001f0c907c58f4700d07cec0006c9 Mon Sep 17 00:00:00 2001 From: Adrian Campos Date: Wed, 22 Mar 2017 14:25:51 -0700 Subject: [PATCH 18/26] Fixes issue #2 by removing singleinstance from MainActivity in the manifest and handling the launch in AppShortcutLauncherActivity --- app/src/main/AndroidManifest.xml | 6 +++--- .../appshortcuts/AppShortcutLauncherActivity.java | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bb22b22b..0ff83e28 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,8 +20,7 @@ android:supportsRtl="true" android:theme="@style/Theme.Phonograph.Light" tools:ignore="UnusedAttribute"> - + @@ -176,7 +175,8 @@ android:label="@string/report_an_issue" /> + android:theme="@android:style/Theme.Translucent.NoTitleBar" + android:launchMode="singleInstance"/> \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java index 3986c3ca..d976686d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java @@ -84,6 +84,9 @@ public class AppShortcutLauncherActivity extends Activity { //Put the bundle in the intent intent.putExtras(bundle); + //If MainActivity's already running, don't launch another instance. Instead, bring it to the top and deliver the intent to onNewIntent() + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); + //Finally, start MainActivity with those extras startActivity(intent); } From 0a871af744139ba3cdb5adf744068e09bd6333ee Mon Sep 17 00:00:00 2001 From: Adrian Campos Date: Wed, 22 Mar 2017 14:47:19 -0700 Subject: [PATCH 19/26] Implemented reportShortcutUsed() to track shortcut usage --- .../appshortcuts/AppShortcutLauncherActivity.java | 6 ++++++ .../gramophone/appshortcuts/DynamicShortcutManager.java | 4 ++++ .../appshortcuts/shortcuttype/BaseShortcutType.java | 4 ++++ .../appshortcuts/shortcuttype/LastAddedShortcutType.java | 6 +++++- .../appshortcuts/shortcuttype/ShuffleAllShortcutType.java | 6 +++++- .../appshortcuts/shortcuttype/TopTracksShortcutType.java | 6 +++++- 6 files changed, 29 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java index d976686d..81057ddc 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java @@ -6,6 +6,9 @@ import android.os.Bundle; import android.widget.Toast; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.appshortcuts.shortcuttype.LastAddedShortcutType; +import com.kabouzeid.gramophone.appshortcuts.shortcuttype.ShuffleAllShortcutType; +import com.kabouzeid.gramophone.appshortcuts.shortcuttype.TopTracksShortcutType; import com.kabouzeid.gramophone.loader.LastAddedLoader; import com.kabouzeid.gramophone.loader.SongLoader; import com.kabouzeid.gramophone.loader.TopAndRecentlyPlayedTracksLoader; @@ -44,14 +47,17 @@ public class AppShortcutLauncherActivity extends Activity { case SHUFFLE_ALL: launchMainActivityWithSongs(PlayMode.SHUFFLE, SongLoader.getAllSongs(getApplicationContext())); + DynamicShortcutManager.reportShortcutUsed(this, ShuffleAllShortcutType.getId()); break; case TOP_TRACKS: launchMainActivityWithSongs(PlayMode.NORMAL, TopAndRecentlyPlayedTracksLoader.getRecentlyPlayedTracks(getApplicationContext())); + DynamicShortcutManager.reportShortcutUsed(this, TopTracksShortcutType.getId()); break; case LAST_ADDED: launchMainActivityWithSongs(PlayMode.NORMAL, LastAddedLoader.getLastAddedSongs(getApplicationContext())); + DynamicShortcutManager.reportShortcutUsed(this, LastAddedShortcutType.getId()); break; case NONE: shortcutError(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java index 64b9d3c4..95bbe292 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java @@ -58,4 +58,8 @@ public class DynamicShortcutManager { new LastAddedShortcutType(mContext).getShortcutInfo() )); } + + public static void reportShortcutUsed(Context context, String shortcutId){ + context.getSystemService(ShortcutManager.class).reportShortcutUsed(shortcutId); + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java index ef1c8291..85119e5c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java @@ -26,6 +26,10 @@ public abstract class BaseShortcutType { abstract ShortcutInfo getShortcutInfo(); + static public String getId(){ + return ID_PREFIX + "invalid"; + } + /** * Creates an Intent that will launch MainActivtiy and immediately play {@param songs} in either shuffle or normal mode diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java index fcb632c8..905cbc3d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java @@ -19,11 +19,15 @@ public final class LastAddedShortcutType extends BaseShortcutType { } public ShortcutInfo getShortcutInfo() { - return new ShortcutInfo.Builder(mContext, ID_PREFIX + "last_added") + return new ShortcutInfo.Builder(mContext, getId()) .setShortLabel(mContext.getString(R.string.app_shortcut_last_added_short)) .setLongLabel(mContext.getString(R.string.app_shortcut_last_added_long)) .setIcon(AppShortcutIconGenerator.generateThemedIcon(mContext, R.drawable.ic_app_shortcut_last_added)) .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.LAST_ADDED)) .build(); } + + public static String getId(){ + return ID_PREFIX + "last_added"; + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java index 868a0670..2844a035 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java @@ -19,11 +19,15 @@ public final class ShuffleAllShortcutType extends BaseShortcutType { } public ShortcutInfo getShortcutInfo() { - return new ShortcutInfo.Builder(mContext, ID_PREFIX + "shuffle_all") + return new ShortcutInfo.Builder(mContext, getId()) .setShortLabel(mContext.getString(R.string.app_shortcut_shuffle_all_short)) .setLongLabel(mContext.getString(R.string.app_shortcut_shuffle_all_long)) .setIcon(AppShortcutIconGenerator.generateThemedIcon(mContext, R.drawable.ic_app_shortcut_shuffle_all)) .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.SHUFFLE_ALL)) .build(); } + + public static String getId() { + return ID_PREFIX + "shuffle_all"; + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java index db3b114b..3fe22ff4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java @@ -19,11 +19,15 @@ public final class TopTracksShortcutType extends BaseShortcutType { } public ShortcutInfo getShortcutInfo() { - return new ShortcutInfo.Builder(mContext, ID_PREFIX + "top_tracks") + return new ShortcutInfo.Builder(mContext, getId()) .setShortLabel(mContext.getString(R.string.app_shortcut_top_tracks_short)) .setLongLabel(mContext.getString(R.string.app_shortcut_top_tracks_long)) .setIcon(AppShortcutIconGenerator.generateThemedIcon(mContext, R.drawable.ic_app_shortcut_top_tracks)) .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.TOP_TRACKS)) .build(); } + + public static String getId() { + return ID_PREFIX + "top_tracks"; + } } From 693cc9b49f1237065002c7e6c21dfa0ec7704a1a Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Thu, 23 Mar 2017 18:43:17 +0100 Subject: [PATCH 20/26] Refactoring --- .../main/java/com/kabouzeid/gramophone/App.java | 7 +++++++ .../appshortcuts/DynamicShortcutManager.java | 16 +++++++--------- .../shortcuttype/BaseShortcutType.java | 6 +++--- .../shortcuttype/LastAddedShortcutType.java | 8 ++++---- .../shortcuttype/ShuffleAllShortcutType.java | 8 ++++---- .../shortcuttype/TopTracksShortcutType.java | 8 ++++---- .../gramophone/ui/activities/MainActivity.java | 6 ------ 7 files changed, 29 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/App.java b/app/src/main/java/com/kabouzeid/gramophone/App.java index a9104638..bf8d228e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/App.java +++ b/app/src/main/java/com/kabouzeid/gramophone/App.java @@ -1,9 +1,11 @@ package com.kabouzeid.gramophone; import android.app.Application; +import android.os.Build; import com.crashlytics.android.Crashlytics; import com.crashlytics.android.core.CrashlyticsCore; +import com.kabouzeid.gramophone.appshortcuts.DynamicShortcutManager; import io.fabric.sdk.android.Fabric; @@ -22,5 +24,10 @@ public class App extends Application { .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()) .build(); Fabric.with(this, crashlyticsKit); + + //Set up dynamic shortcuts + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + new DynamicShortcutManager(this).initDynamicShortcuts(); + } } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java index 95bbe292..a3a77798 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/DynamicShortcutManager.java @@ -5,7 +5,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager; -import android.graphics.Color; import android.graphics.drawable.Icon; import android.os.Build; @@ -13,7 +12,6 @@ import com.kabouzeid.gramophone.appshortcuts.shortcuttype.LastAddedShortcutType; import com.kabouzeid.gramophone.appshortcuts.shortcuttype.ShuffleAllShortcutType; import com.kabouzeid.gramophone.appshortcuts.shortcuttype.TopTracksShortcutType; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -24,12 +22,12 @@ import java.util.List; @TargetApi(Build.VERSION_CODES.N_MR1) public class DynamicShortcutManager { - Context mContext; - ShortcutManager shortcutManager; + private Context context; + private ShortcutManager shortcutManager; public DynamicShortcutManager(Context context) { - mContext = context; - shortcutManager = mContext.getSystemService(ShortcutManager.class); + this.context = context; + shortcutManager = this.context.getSystemService(ShortcutManager.class); } public static ShortcutInfo createShortcut(Context context, String id, String shortLabel, String longLabel, Icon icon, Intent intent) { @@ -53,9 +51,9 @@ public class DynamicShortcutManager { public List getDefaultShortcuts() { return (Arrays.asList( - new ShuffleAllShortcutType(mContext).getShortcutInfo(), - new TopTracksShortcutType(mContext).getShortcutInfo(), - new LastAddedShortcutType(mContext).getShortcutInfo() + new ShuffleAllShortcutType(context).getShortcutInfo(), + new TopTracksShortcutType(context).getShortcutInfo(), + new LastAddedShortcutType(context).getShortcutInfo() )); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java index 85119e5c..1aedc749 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java @@ -17,10 +17,10 @@ public abstract class BaseShortcutType { static final String ID_PREFIX = "com.kabouzeid.gramophone.appshortcuts.id."; - Context mContext; + Context context; public BaseShortcutType(Context context) { - mContext = context; + this.context = context; } @@ -39,7 +39,7 @@ public abstract class BaseShortcutType { */ Intent getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType shortcutType) { //Create a new intent to launch MainActivity - Intent intent = new Intent(mContext, AppShortcutLauncherActivity.class); + Intent intent = new Intent(context, AppShortcutLauncherActivity.class); intent.setAction(Intent.ACTION_VIEW); //Create a bundle to store instructions for AppShortcutLauncherActivity diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java index 905cbc3d..acc9caca 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java @@ -19,10 +19,10 @@ public final class LastAddedShortcutType extends BaseShortcutType { } public ShortcutInfo getShortcutInfo() { - return new ShortcutInfo.Builder(mContext, getId()) - .setShortLabel(mContext.getString(R.string.app_shortcut_last_added_short)) - .setLongLabel(mContext.getString(R.string.app_shortcut_last_added_long)) - .setIcon(AppShortcutIconGenerator.generateThemedIcon(mContext, R.drawable.ic_app_shortcut_last_added)) + return new ShortcutInfo.Builder(context, getId()) + .setShortLabel(context.getString(R.string.app_shortcut_last_added_short)) + .setLongLabel(context.getString(R.string.app_shortcut_last_added_long)) + .setIcon(AppShortcutIconGenerator.generateThemedIcon(context, R.drawable.ic_app_shortcut_last_added)) .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.LAST_ADDED)) .build(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java index 2844a035..599947f8 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java @@ -19,10 +19,10 @@ public final class ShuffleAllShortcutType extends BaseShortcutType { } public ShortcutInfo getShortcutInfo() { - return new ShortcutInfo.Builder(mContext, getId()) - .setShortLabel(mContext.getString(R.string.app_shortcut_shuffle_all_short)) - .setLongLabel(mContext.getString(R.string.app_shortcut_shuffle_all_long)) - .setIcon(AppShortcutIconGenerator.generateThemedIcon(mContext, R.drawable.ic_app_shortcut_shuffle_all)) + return new ShortcutInfo.Builder(context, getId()) + .setShortLabel(context.getString(R.string.app_shortcut_shuffle_all_short)) + .setLongLabel(context.getString(R.string.app_shortcut_shuffle_all_long)) + .setIcon(AppShortcutIconGenerator.generateThemedIcon(context, R.drawable.ic_app_shortcut_shuffle_all)) .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.SHUFFLE_ALL)) .build(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java index 3fe22ff4..d76f5b2b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java @@ -19,10 +19,10 @@ public final class TopTracksShortcutType extends BaseShortcutType { } public ShortcutInfo getShortcutInfo() { - return new ShortcutInfo.Builder(mContext, getId()) - .setShortLabel(mContext.getString(R.string.app_shortcut_top_tracks_short)) - .setLongLabel(mContext.getString(R.string.app_shortcut_top_tracks_long)) - .setIcon(AppShortcutIconGenerator.generateThemedIcon(mContext, R.drawable.ic_app_shortcut_top_tracks)) + return new ShortcutInfo.Builder(context, getId()) + .setShortLabel(context.getString(R.string.app_shortcut_top_tracks_short)) + .setLongLabel(context.getString(R.string.app_shortcut_top_tracks_long)) + .setIcon(AppShortcutIconGenerator.generateThemedIcon(context, R.drawable.ic_app_shortcut_top_tracks)) .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.TOP_TRACKS)) .build(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 0aacf197..0db9d87c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -28,7 +28,6 @@ import com.kabouzeid.appthemehelper.ThemeStore; import com.kabouzeid.appthemehelper.util.ATHUtil; import com.kabouzeid.appthemehelper.util.NavigationViewUtil; import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.appshortcuts.DynamicShortcutManager; import com.kabouzeid.gramophone.dialogs.ChangelogDialog; import com.kabouzeid.gramophone.dialogs.DonationsDialog; import com.kabouzeid.gramophone.glide.SongGlideRequest; @@ -113,11 +112,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity { if (!checkShowIntro()) { checkShowChangelog(); } - - //Set up dynamic shortcuts - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { - new DynamicShortcutManager(this).initDynamicShortcuts(); - } } private void setMusicChooser(int key) { From e07b5afb0a0a7b6df94d4678b5fa90b0a0170471 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Thu, 23 Mar 2017 18:44:23 +0100 Subject: [PATCH 21/26] Removed unnecessary log --- .../gramophone/ui/fragments/player/card/CardPlayerFragment.java | 1 - .../gramophone/ui/fragments/player/flat/FlatPlayerFragment.java | 1 - 2 files changed, 2 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/card/CardPlayerFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/card/CardPlayerFragment.java index 55b3c09f..29d868b5 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/card/CardPlayerFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/card/CardPlayerFragment.java @@ -315,7 +315,6 @@ 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; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/flat/FlatPlayerFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/flat/FlatPlayerFragment.java index d80dbd57..8efbd5e2 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/flat/FlatPlayerFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/flat/FlatPlayerFragment.java @@ -311,7 +311,6 @@ 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; } From 2eca79cd56505517b3405dc55bf84619c99e11be Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Thu, 23 Mar 2017 18:52:07 +0100 Subject: [PATCH 22/26] Removed unnecessary error message --- .../appshortcuts/AppShortcutLauncherActivity.java | 12 ------------ app/src/main/res/values/strings.xml | 2 -- 2 files changed, 14 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java index 81057ddc..1e0d6990 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java @@ -3,9 +3,7 @@ package com.kabouzeid.gramophone.appshortcuts; import android.app.Activity; import android.content.Intent; import android.os.Bundle; -import android.widget.Toast; -import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.appshortcuts.shortcuttype.LastAddedShortcutType; import com.kabouzeid.gramophone.appshortcuts.shortcuttype.ShuffleAllShortcutType; import com.kabouzeid.gramophone.appshortcuts.shortcuttype.TopTracksShortcutType; @@ -59,12 +57,6 @@ public class AppShortcutLauncherActivity extends Activity { LastAddedLoader.getLastAddedSongs(getApplicationContext())); DynamicShortcutManager.reportShortcutUsed(this, LastAddedShortcutType.getId()); break; - case NONE: - shortcutError(); - break; - default: - shortcutError(); - break; } finish(); @@ -97,10 +89,6 @@ public class AppShortcutLauncherActivity extends Activity { startActivity(intent); } - private void shortcutError() { - Toast.makeText(getApplicationContext(), R.string.error_launching_shortcut, Toast.LENGTH_LONG).show(); - } - private enum PlayMode {NORMAL, SHUFFLE} public enum ShortcutType { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f25d3c27..6eef7d46 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -288,6 +288,4 @@ @string/last_added @string/last_added - - Error launching shortcut. From d60ca48c2b5c26944f4b500d87e3b24d80f0ee8f Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Thu, 23 Mar 2017 18:52:54 +0100 Subject: [PATCH 23/26] Fixed top track shortcut playing recent tracks. --- .../gramophone/appshortcuts/AppShortcutLauncherActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java index 1e0d6990..3954ffb2 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java @@ -49,7 +49,7 @@ public class AppShortcutLauncherActivity extends Activity { break; case TOP_TRACKS: launchMainActivityWithSongs(PlayMode.NORMAL, - TopAndRecentlyPlayedTracksLoader.getRecentlyPlayedTracks(getApplicationContext())); + TopAndRecentlyPlayedTracksLoader.getTopTracks(getApplicationContext())); DynamicShortcutManager.reportShortcutUsed(this, TopTracksShortcutType.getId()); break; case LAST_ADDED: From b0590bf5e12d3e82fdf1e0618cfb3a359f8a70b9 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Mon, 27 Mar 2017 12:28:37 +0200 Subject: [PATCH 24/26] Moved shortcut handling from MainActivity to MusicService. Cleaned up the code. --- .../AppShortcutLauncherActivity.java | 68 ++++++++----------- .../shortcuttype/BaseShortcutType.java | 7 +- .../shortcuttype/LastAddedShortcutType.java | 2 +- .../shortcuttype/ShuffleAllShortcutType.java | 2 +- .../shortcuttype/TopTracksShortcutType.java | 2 +- .../gramophone/service/MusicService.java | 17 +++++ .../ui/activities/MainActivity.java | 32 --------- 7 files changed, 50 insertions(+), 80 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java index 3954ffb2..b6b72cc8 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/AppShortcutLauncherActivity.java @@ -3,6 +3,7 @@ package com.kabouzeid.gramophone.appshortcuts; import android.app.Activity; import android.content.Intent; import android.os.Bundle; +import android.support.annotation.IntDef; import com.kabouzeid.gramophone.appshortcuts.shortcuttype.LastAddedShortcutType; import com.kabouzeid.gramophone.appshortcuts.shortcuttype.ShuffleAllShortcutType; @@ -11,8 +12,10 @@ import com.kabouzeid.gramophone.loader.LastAddedLoader; import com.kabouzeid.gramophone.loader.SongLoader; import com.kabouzeid.gramophone.loader.TopAndRecentlyPlayedTracksLoader; import com.kabouzeid.gramophone.model.Song; -import com.kabouzeid.gramophone.ui.activities.MainActivity; +import com.kabouzeid.gramophone.service.MusicService; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; /** @@ -20,40 +23,40 @@ import java.util.ArrayList; */ public class AppShortcutLauncherActivity extends Activity { - public static final String KEY_SHORTCUT_TYPE = "com.kabouzeid.gramophone.appshortcuts.ShortcutType"; + public static final int SHORTCUT_TYPE_SHUFFLE_ALL = 0; + public static final int SHORTCUT_TYPE_TOP_TRACKS = 1; + public static final int SHORTCUT_TYPE_LAST_ADDED = 2; + public static final int SHORTCUT_TYPE_NONE = 3; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ShortcutType shortcutType = ShortcutType.NONE; + @ShortcutType + int shortcutType = SHORTCUT_TYPE_NONE; //Set shortcutType from the intent extras Bundle extras = getIntent().getExtras(); if (extras != null) { - try { - shortcutType = ShortcutType.valueOf(extras.getString(KEY_SHORTCUT_TYPE)); - } catch (IllegalArgumentException e) { //In the event we're somehow passed an invalid enum string, don't crash. - e.printStackTrace(); - shortcutType = ShortcutType.NONE; - } + //noinspection WrongConstant + shortcutType = extras.getInt(KEY_SHORTCUT_TYPE, SHORTCUT_TYPE_NONE); } - //Perform the action found in the extras switch (shortcutType) { - case SHUFFLE_ALL: - launchMainActivityWithSongs(PlayMode.SHUFFLE, + case SHORTCUT_TYPE_SHUFFLE_ALL: + startServiceWithSongs(MusicService.SHUFFLE_MODE_SHUFFLE, SongLoader.getAllSongs(getApplicationContext())); DynamicShortcutManager.reportShortcutUsed(this, ShuffleAllShortcutType.getId()); break; - case TOP_TRACKS: - launchMainActivityWithSongs(PlayMode.NORMAL, + case SHORTCUT_TYPE_TOP_TRACKS: + startServiceWithSongs(MusicService.SHUFFLE_MODE_NONE, TopAndRecentlyPlayedTracksLoader.getTopTracks(getApplicationContext())); DynamicShortcutManager.reportShortcutUsed(this, TopTracksShortcutType.getId()); break; - case LAST_ADDED: - launchMainActivityWithSongs(PlayMode.NORMAL, + case SHORTCUT_TYPE_LAST_ADDED: + startServiceWithSongs(MusicService.SHUFFLE_MODE_NONE, LastAddedLoader.getLastAddedSongs(getApplicationContext())); DynamicShortcutManager.reportShortcutUsed(this, LastAddedShortcutType.getId()); break; @@ -62,36 +65,21 @@ public class AppShortcutLauncherActivity extends Activity { finish(); } - private void launchMainActivityWithSongs(PlayMode playMode, ArrayList songs) { - //Create a new intent to launch MainActivity - Intent intent = new Intent(this, MainActivity.class); - switch (playMode) { - case NORMAL: - intent.setAction(MainActivity.INTENT_ACTION_MEDIA_PLAY); - break; - case SHUFFLE: - intent.setAction(MainActivity.INTENT_ACTION_MEDIA_PLAY_SHUFFLED); - break; - } + private void startServiceWithSongs(int shuffleMode, ArrayList songs) { + Intent intent = new Intent(this, MusicService.class); + intent.setAction(MusicService.ACTION_PLAY); - - //Create a bundle to store the songs to shuffle through songs Bundle bundle = new Bundle(); - bundle.putParcelableArrayList(MainActivity.INTENT_EXTRA_SONGS, songs); + bundle.putParcelableArrayList(MusicService.INTENT_EXTRA_SONGS, songs); + bundle.putInt(MusicService.INTENT_EXTRA_SHUFFLE_MODE, shuffleMode); - //Put the bundle in the intent intent.putExtras(bundle); - //If MainActivity's already running, don't launch another instance. Instead, bring it to the top and deliver the intent to onNewIntent() - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); - - //Finally, start MainActivity with those extras - startActivity(intent); + startService(intent); } - private enum PlayMode {NORMAL, SHUFFLE} - - public enum ShortcutType { - SHUFFLE_ALL, TOP_TRACKS, LAST_ADDED, NONE + @Retention(RetentionPolicy.SOURCE) + @IntDef({SHORTCUT_TYPE_SHUFFLE_ALL, SHORTCUT_TYPE_TOP_TRACKS, SHORTCUT_TYPE_LAST_ADDED, SHORTCUT_TYPE_NONE}) + public @interface ShortcutType { } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java index 1aedc749..ca44f21a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/BaseShortcutType.java @@ -37,16 +37,13 @@ public abstract class BaseShortcutType { * @param shortcutType Describes the type of shortcut to create (ShuffleAll, TopTracks, custom playlist, etc.) * @return */ - Intent getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType shortcutType) { - //Create a new intent to launch MainActivity + Intent getPlaySongsIntent(@AppShortcutLauncherActivity.ShortcutType int shortcutType) { Intent intent = new Intent(context, AppShortcutLauncherActivity.class); intent.setAction(Intent.ACTION_VIEW); - //Create a bundle to store instructions for AppShortcutLauncherActivity Bundle b = new Bundle(); - b.putString(AppShortcutLauncherActivity.KEY_SHORTCUT_TYPE, shortcutType.toString()); + b.putInt(AppShortcutLauncherActivity.KEY_SHORTCUT_TYPE, shortcutType); - //Put bundle in intent intent.putExtras(b); return intent; diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java index acc9caca..77182f1e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/LastAddedShortcutType.java @@ -23,7 +23,7 @@ public final class LastAddedShortcutType extends BaseShortcutType { .setShortLabel(context.getString(R.string.app_shortcut_last_added_short)) .setLongLabel(context.getString(R.string.app_shortcut_last_added_long)) .setIcon(AppShortcutIconGenerator.generateThemedIcon(context, R.drawable.ic_app_shortcut_last_added)) - .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.LAST_ADDED)) + .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_LAST_ADDED)) .build(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java index 599947f8..dd952d16 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/ShuffleAllShortcutType.java @@ -23,7 +23,7 @@ public final class ShuffleAllShortcutType extends BaseShortcutType { .setShortLabel(context.getString(R.string.app_shortcut_shuffle_all_short)) .setLongLabel(context.getString(R.string.app_shortcut_shuffle_all_long)) .setIcon(AppShortcutIconGenerator.generateThemedIcon(context, R.drawable.ic_app_shortcut_shuffle_all)) - .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.SHUFFLE_ALL)) + .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_SHUFFLE_ALL)) .build(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java index d76f5b2b..ef82f306 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appshortcuts/shortcuttype/TopTracksShortcutType.java @@ -23,7 +23,7 @@ public final class TopTracksShortcutType extends BaseShortcutType { .setShortLabel(context.getString(R.string.app_shortcut_top_tracks_short)) .setLongLabel(context.getString(R.string.app_shortcut_top_tracks_long)) .setIcon(AppShortcutIconGenerator.generateThemedIcon(context, R.drawable.ic_app_shortcut_top_tracks)) - .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.TOP_TRACKS)) + .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_TOP_TRACKS)) .build(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java index 0d56876a..a5bd9076 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -61,6 +61,7 @@ import com.kabouzeid.gramophone.util.Util; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; +import java.util.Random; /** * @author Karim Abou Zeid (kabouzeid), Andrew Neal @@ -78,6 +79,8 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP public static final String ACTION_SKIP = PHONOGRAPH_PACKAGE_NAME + ".skip"; public static final String ACTION_REWIND = PHONOGRAPH_PACKAGE_NAME + ".rewind"; public static final String ACTION_QUIT = PHONOGRAPH_PACKAGE_NAME + ".quitservice"; + public static final String INTENT_EXTRA_SONGS = PHONOGRAPH_PACKAGE_NAME + ".intentextra.songs"; + public static final String INTENT_EXTRA_SHUFFLE_MODE = PHONOGRAPH_PACKAGE_NAME + ".intentextra.shufflemode"; public static final String APP_WIDGET_UPDATE = PHONOGRAPH_PACKAGE_NAME + ".appwidgetupdate"; public static final String EXTRA_APP_WIDGET_NAME = PHONOGRAPH_PACKAGE_NAME + "app_widget_name"; @@ -294,6 +297,20 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP pause(); break; case ACTION_PLAY: + ArrayList songs = intent.getParcelableArrayListExtra(INTENT_EXTRA_SONGS); + if (songs != null) { + int shuffleMode = intent.getIntExtra(INTENT_EXTRA_SHUFFLE_MODE, getShuffleMode()); + if (intent.hasExtra(INTENT_EXTRA_SHUFFLE_MODE) && intent.getIntExtra(INTENT_EXTRA_SHUFFLE_MODE, 0) == SHUFFLE_MODE_SHUFFLE) { + int startPosition = 0; + if (!songs.isEmpty()) { + startPosition = new Random().nextInt(songs.size()); + } + openQueue(songs, startPosition, false); + setShuffleMode(shuffleMode); + } else { + openQueue(songs, 0, false); + } + } play(); break; case ACTION_REWIND: diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 0db9d87c..f2950f5b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -60,12 +60,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity { private static final int LIBRARY = 0; private static final int FOLDERS = 1; - public static final String PHONOGRAPH_PACKAGE_NAME = "com.kabouzeid.gramophone"; - public static final String INTENT_ACTION_MEDIA_PLAY_SHUFFLED = PHONOGRAPH_PACKAGE_NAME + ".intent_action.play_shuffled"; - public static final String INTENT_ACTION_MEDIA_PLAY = PHONOGRAPH_PACKAGE_NAME + ".intent_action.play"; - public static final String INTENT_EXTRA_SONGS = PHONOGRAPH_PACKAGE_NAME + ".intent_extra.songs"; - - @BindView(R.id.navigation_view) NavigationView navigationView; @BindView(R.id.drawer_layout) @@ -264,13 +258,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity { handlePlaybackIntent(getIntent()); } - //Called when there's already an instance of MainActivity - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - handlePlaybackIntent(intent); - } - @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { if (item.getItemId() == android.R.id.home) { @@ -309,25 +296,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity { } else { MusicPlayerRemote.openQueue(songs, 0, true); } - - } else if (intent.getAction() != null && intent.getAction().equals(MainActivity.INTENT_ACTION_MEDIA_PLAY_SHUFFLED)){ - //Shuffle songs in extras - final ArrayList songs = intent.getExtras().getParcelableArrayList(INTENT_EXTRA_SONGS); - - //Start the songs, setting the shuffle mode to shuffle - MusicPlayerRemote.openAndShuffleQueue(songs, true); - handled = true; - - } else if (intent.getAction() != null && intent.getAction().equals(MainActivity.INTENT_ACTION_MEDIA_PLAY)){ - //Shuffle songs in extras - final ArrayList songs = intent.getExtras().getParcelableArrayList(INTENT_EXTRA_SONGS); - - //Start the songs, preserving the user's shuffle mode - if (MusicPlayerRemote.getShuffleMode() == MusicService.SHUFFLE_MODE_SHUFFLE) { - MusicPlayerRemote.openAndShuffleQueue(songs, true); - } else { - MusicPlayerRemote.openQueue(songs, 0, true); - } handled = true; } From fd77e555bec0fda123a9e9f864039bfb875acf33 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Mon, 27 Mar 2017 12:42:17 +0200 Subject: [PATCH 25/26] Updated changelog --- app/src/main/assets/phonograph-changelog.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/assets/phonograph-changelog.html b/app/src/main/assets/phonograph-changelog.html index 8e16796d..40891b9f 100644 --- a/app/src/main/assets/phonograph-changelog.html +++ b/app/src/main/assets/phonograph-changelog.html @@ -25,6 +25,13 @@

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

    +

    Version 0.15.0

    + +
      +
    1. NEW: App Shortcuts (Android Nougat only)
    2. +
    3. IMPROVEMENT: Synced translations.
    4. +
    +

    Version 0.14.1

      From 4eebe7be16aa5e504cee8397cda0cc96b2698c67 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Mon, 27 Mar 2017 12:51:25 +0200 Subject: [PATCH 26/26] Bumped version, updated changelog --- app/build.gradle | 4 ++-- app/src/main/assets/phonograph-changelog.html | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9c13bf94..ab540a87 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -35,8 +35,8 @@ android { vectorDrawables.useSupportLibrary = true applicationId "com.kabouzeid.gramophone" - versionCode 129 - versionName "0.14.1" + versionCode 130 + versionName "0.15.0 BETA 1" } buildTypes { release { diff --git a/app/src/main/assets/phonograph-changelog.html b/app/src/main/assets/phonograph-changelog.html index 40891b9f..bf997b3b 100644 --- a/app/src/main/assets/phonograph-changelog.html +++ b/app/src/main/assets/phonograph-changelog.html @@ -25,11 +25,10 @@

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

      -

      Version 0.15.0

      +

      Version 0.15.0 BETA 1

      1. NEW: App Shortcuts (Android Nougat only)
      2. -
      3. IMPROVEMENT: Synced translations.

      Version 0.14.1