diff --git a/app/build.gradle b/app/build.gradle index 197aa1b7..99396906 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { applicationId "com.kabouzeid.gramophone" minSdkVersion 16 targetSdkVersion 22 - versionCode 17 - versionName "0.9.7.1b" + versionCode 18 + versionName "0.9.8b" } compileOptions { @@ -46,7 +46,7 @@ dependencies { compile('com.crashlytics.sdk.android:crashlytics:2.2.1@aar') { transitive = true; } - compile 'com.afollestad:material-dialogs:0.7.0.1' + compile 'com.afollestad:material-dialogs:0.7.1.3' compile 'com.android.support:appcompat-v7:22.0.0' compile 'com.android.support:recyclerview-v7:22.0.0' compile 'com.android.support:gridlayout-v7:22.0.0' diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java index 9dc59f7c..0285a113 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java @@ -4,6 +4,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.media.audiofx.AudioEffect; import android.net.Uri; import android.os.IBinder; import android.preference.PreferenceManager; @@ -283,6 +284,13 @@ public class MusicPlayerRemote { App.bus.post(musicRemoteEvent); } + public static int getAudioSessionId() { + if (musicService != null) { + return musicService.getAudioSessionId(); + } + return AudioEffect.ERROR_BAD_VALUE; + } + @SuppressWarnings("unchecked") public static void restorePreviousState() { try { 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 c7f6e61f..939640a6 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -14,6 +14,7 @@ import android.media.AudioManager; import android.media.MediaMetadataRetriever; import android.media.MediaPlayer; import android.media.RemoteControlClient; +import android.media.audiofx.AudioEffect; import android.net.Uri; import android.os.Binder; import android.os.IBinder; @@ -171,6 +172,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe @Override public void onDestroy() { + closeAudioEffectSession(); unregisterEverything(); killEverythingAndReleaseResources(); } @@ -315,11 +317,27 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe notifyOnMusicRemoteEventListeners(MusicRemoteEvent.TRACK_CHANGED); } - private boolean requestFocus() { - int result = getAudioManager().requestAudioFocus(this, AudioManager.STREAM_MUSIC, - AudioManager.AUDIOFOCUS_GAIN); + private void openAudioEffectSession() { + if (player != null) { + final Intent intent = new Intent(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION); + intent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, getAudioSessionId()); + intent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, getPackageName()); + intent.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC); + sendBroadcast(intent); + } + } - return (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED); + private void closeAudioEffectSession() { + if (player != null) { + final Intent audioEffectsIntent = new Intent(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION); + audioEffectsIntent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, player.getAudioSessionId()); + audioEffectsIntent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, getPackageName()); + sendBroadcast(audioEffectsIntent); + } + } + + private boolean requestFocus() { + return (getAudioManager().requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN) == AudioManager.AUDIOFOCUS_REQUEST_GRANTED); } private void updateRemoteControlClient() { @@ -449,6 +467,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe public void onPrepared(MediaPlayer mp) { player.start(); isPlayerPrepared = true; + openAudioEffectSession(); playingNotificationHelper.updatePlayState(isPlaying()); MusicPlayerWidget.updateWidgets(this); remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING); @@ -752,6 +771,10 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe } } + public int getAudioSessionId() { + return player.getAudioSessionId(); + } + public class MusicBinder extends Binder { public MusicService getService() { return MusicService.this; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index 6bc3de8f..e494d92c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -259,6 +259,9 @@ public class AlbumDetailActivity extends AbsFabActivity { public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { + case R.id.action_equalizer: + NavigationUtil.openEqualizer(this); + return true; case R.id.action_shuffle_all: MusicPlayerRemote.shuffleAllSongs(this); return true; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index 5216221e..f0ab157c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -320,6 +320,9 @@ public class ArtistDetailActivity extends AbsFabActivity { public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { + case R.id.action_equalizer: + NavigationUtil.openEqualizer(this); + return true; case R.id.action_shuffle_all: MusicPlayerRemote.shuffleAllSongs(this); return true; 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 de3747e5..6b0579dd 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 @@ -260,6 +260,9 @@ public class MainActivity extends AbsFabActivity int id = item.getItemId(); switch (id) { + case R.id.action_equalizer: + NavigationUtil.openEqualizer(this); + return true; case R.id.action_shuffle_all: MusicPlayerRemote.shuffleAllSongs(this); return true; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java index 6b5bfc85..2b74f663 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java @@ -417,6 +417,9 @@ public class MusicControllerActivity extends AbsFabActivity { public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { + case R.id.action_equalizer: + NavigationUtil.openEqualizer(this); + return true; case R.id.action_shuffle_all: MusicPlayerRemote.shuffleAllSongs(this); return true; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java index 017d62db..8478585d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java @@ -89,6 +89,9 @@ public class PlaylistDetailActivity extends AbsFabActivity { public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { + case R.id.action_equalizer: + NavigationUtil.openEqualizer(this); + return true; case android.R.id.home: super.onBackPressed(); return true; 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 1a2fd512..0453237a 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 @@ -1,5 +1,9 @@ package com.kabouzeid.gramophone.ui.activities; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.media.audiofx.AudioEffect; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; @@ -12,6 +16,7 @@ import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent; import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity; +import com.kabouzeid.gramophone.util.NavigationUtil; public class SettingsActivity extends AbsBaseActivity { public static final String TAG = SettingsActivity.class.getSimpleName(); @@ -27,11 +32,14 @@ public class SettingsActivity extends AbsBaseActivity { } public static class SettingsFragment extends PreferenceFragment { + private Preference equalizer; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_general); addPreferencesFromResource(R.xml.pref_ui); + addPreferencesFromResource(R.xml.pref_audio); final Preference defaultStartPage = findPreference("default_start_page"); setSummary(defaultStartPage); @@ -93,6 +101,16 @@ public class SettingsActivity extends AbsBaseActivity { return true; } }); + + equalizer = findPreference("equalizer"); + resolveEqualizer(); + equalizer.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + NavigationUtil.openEqualizer(getActivity()); + return true; + } + }); } private static void setSummary(Preference preference) { @@ -115,6 +133,16 @@ public class SettingsActivity extends AbsBaseActivity { preference.setSummary(stringValue); } } + + private void resolveEqualizer() { + final Intent effects = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL); + PackageManager pm = getActivity().getPackageManager(); + ResolveInfo ri = pm.resolveActivity(effects, 0); + if (ri == null) { + equalizer.setEnabled(false); + equalizer.setSummary(getResources().getString(R.string.no_equalizer)); + } + } } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java index 51699525..cc311647 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java @@ -1,7 +1,9 @@ package com.kabouzeid.gramophone.util; import android.app.Activity; +import android.content.ActivityNotFoundException; import android.content.Intent; +import android.media.audiofx.AudioEffect; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.util.Pair; @@ -111,4 +113,20 @@ public class NavigationUtil { Toast.makeText(activity, activity.getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show(); } } + + public static void openEqualizer(final Activity activity) { + final int sessionId = MusicPlayerRemote.getAudioSessionId(); + if (sessionId == AudioEffect.ERROR_BAD_VALUE) { + Toast.makeText(activity, activity.getResources().getString(R.string.no_audio_id), Toast.LENGTH_LONG).show(); + } else { + try { + final Intent effects = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL); + effects.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, sessionId); + effects.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC); + activity.startActivityForResult(effects, 0); + } catch (final ActivityNotFoundException notFound) { + Toast.makeText(activity, activity.getResources().getString(R.string.no_equalizer), Toast.LENGTH_SHORT).show(); + } + } + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtils.java b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtils.java index dde89f0d..ef378a8a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtils.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtils.java @@ -52,7 +52,7 @@ public final class PreferenceUtils { case 1: return R.style.Theme_MaterialMusic; } - return R.style.Theme_MaterialMusic; + return R.style.Theme_MaterialMusic_Light; } public void setGeneralTheme(int appTheme) { @@ -144,7 +144,7 @@ public final class PreferenceUtils { } public final boolean playbackControllerBoxEnabled() { - return mPreferences.getBoolean(PLAYBACK_CONTROLLER_BOX, true); + return mPreferences.getBoolean(PLAYBACK_CONTROLLER_BOX, false); } public void setPlaybackControllerBoxEnabled(final boolean value) { @@ -154,7 +154,7 @@ public final class PreferenceUtils { } public final boolean transparentToolbar() { - return mPreferences.getBoolean(TRANSPARENT_TOOLBAR, true); + return mPreferences.getBoolean(TRANSPARENT_TOOLBAR, false); } public void setTransparentToolbar(final boolean value) { diff --git a/app/src/main/res/drawable-hdpi/ic_equalizer_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_equalizer_black_24dp.png deleted file mode 100644 index 53fbe0f7..00000000 Binary files a/app/src/main/res/drawable-hdpi/ic_equalizer_black_24dp.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_equalizer_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_equalizer_white_24dp.png deleted file mode 100644 index 11693636..00000000 Binary files a/app/src/main/res/drawable-hdpi/ic_equalizer_white_24dp.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_play_circle_outline_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_play_circle_outline_white_24dp.png new file mode 100644 index 00000000..0a801fce Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_play_circle_outline_white_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_equalizer_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_equalizer_black_24dp.png deleted file mode 100644 index 47541240..00000000 Binary files a/app/src/main/res/drawable-mdpi/ic_equalizer_black_24dp.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_equalizer_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_equalizer_white_24dp.png deleted file mode 100644 index d10dadad..00000000 Binary files a/app/src/main/res/drawable-mdpi/ic_equalizer_white_24dp.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_play_circle_outline_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_play_circle_outline_white_24dp.png new file mode 100644 index 00000000..1d1ab66d Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_play_circle_outline_white_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_equalizer_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_equalizer_black_24dp.png deleted file mode 100644 index a44826ce..00000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_equalizer_black_24dp.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_equalizer_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_equalizer_white_24dp.png deleted file mode 100644 index dbba844d..00000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_equalizer_white_24dp.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_play_circle_outline_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_play_circle_outline_white_24dp.png new file mode 100644 index 00000000..f59c45e9 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_play_circle_outline_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_equalizer_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_equalizer_black_24dp.png deleted file mode 100644 index adad5ded..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_equalizer_black_24dp.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_equalizer_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_equalizer_white_24dp.png deleted file mode 100644 index 59332d8d..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_equalizer_white_24dp.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_play_circle_outline_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_play_circle_outline_white_24dp.png new file mode 100644 index 00000000..00de7883 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_play_circle_outline_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_equalizer_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_equalizer_black_24dp.png deleted file mode 100644 index fca74bdc..00000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_equalizer_black_24dp.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_equalizer_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_equalizer_white_24dp.png deleted file mode 100644 index b82a8d98..00000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_equalizer_white_24dp.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_play_circle_outline_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_play_circle_outline_white_24dp.png new file mode 100644 index 00000000..81fc753c Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_play_circle_outline_white_24dp.png differ diff --git a/app/src/main/res/menu/menu_album_detail.xml b/app/src/main/res/menu/menu_album_detail.xml index 3be6396c..5bef2eff 100644 --- a/app/src/main/res/menu/menu_album_detail.xml +++ b/app/src/main/res/menu/menu_album_detail.xml @@ -5,7 +5,7 @@ @@ -29,4 +29,10 @@ android:id="@+id/action_tag_editor" android:title="@string/action_tag_editor" app:showAsAction="never"/> + + diff --git a/app/src/main/res/menu/menu_albums.xml b/app/src/main/res/menu/menu_albums.xml index 3791c90a..098402dc 100644 --- a/app/src/main/res/menu/menu_albums.xml +++ b/app/src/main/res/menu/menu_albums.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> @@ -52,6 +52,12 @@ + + @@ -29,4 +29,10 @@ android:id="@+id/action_re_download_artist_image" android:title="@string/action_re_download_artist_image" app:showAsAction="never"/> + + diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 118370a2..2baa23ad 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -5,7 +5,7 @@ @@ -26,6 +26,12 @@ android:title="@string/action_playing_queue" app:showAsAction="never"/> + + + + + + + @@ -28,6 +28,12 @@ android:title="@string/action_playing_queue" app:showAsAction="never"/> + + Start page Light Dark + Equalizer + UI + General theme + Audio + General + Set default start page + Settings + Semi-Transparent toolbar + Playback controller card + Colored navigation bar artist view + Colored navigation bar album view + Colored album footers + No equalizer found + No audio id, play something and try again. diff --git a/app/src/main/res/values/strings_activity_settings.xml b/app/src/main/res/values/strings_activity_settings.xml index ea6d2d67..b85797d7 100644 --- a/app/src/main/res/values/strings_activity_settings.xml +++ b/app/src/main/res/values/strings_activity_settings.xml @@ -1,11 +1,4 @@ - Settings - - - - - General - Set default start page @string/last_opened @string/songs @@ -13,6 +6,7 @@ @string/artists @string/playlists + -1 0 @@ -21,21 +15,14 @@ 3 - - UI - General theme @string/light_theme_name @string/dark_theme_name + 0 1 - Semi-Transparent toolbar - Playback controller card - Colored navigation bar artist view - Colored navigation bar album view - Colored album footers diff --git a/app/src/main/res/xml/pref_audio.xml b/app/src/main/res/xml/pref_audio.xml new file mode 100644 index 00000000..b717f588 --- /dev/null +++ b/app/src/main/res/xml/pref_audio.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_ui.xml b/app/src/main/res/xml/pref_ui.xml index d624c0f1..cb84a02c 100644 --- a/app/src/main/res/xml/pref_ui.xml +++ b/app/src/main/res/xml/pref_ui.xml @@ -2,7 +2,7 @@