From f242f1ba5c661f4057ca96e73495d70aded5cc6e Mon Sep 17 00:00:00 2001
From: atul-ap <atulpatare99@gmail.com>
Date: Tue, 27 Dec 2022 23:08:20 +0530
Subject: [PATCH 1/8] fixed dialog out of context errors

---
 .../java/com/atul/musicplayer/MainActivity.java  | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/app/src/main/java/com/atul/musicplayer/MainActivity.java b/src/app/src/main/java/com/atul/musicplayer/MainActivity.java
index 3cb8350..7191e61 100644
--- a/src/app/src/main/java/com/atul/musicplayer/MainActivity.java
+++ b/src/app/src/main/java/com/atul/musicplayer/MainActivity.java
@@ -82,7 +82,6 @@ protected void onCreate(Bundle savedInstanceState) {
             manageStoragePermission(MainActivity.this);
 
         albumState = MPPreferences.getAlbumRequest(this);
-        MPConstants.musicSelectListener = this;
 
         MaterialCardView playerLayout = findViewById(R.id.player_layout);
         albumArt = findViewById(R.id.albumArt);
@@ -274,7 +273,6 @@ else if (id == R.id.player_layout)
 
     private void setUpPlayerDialog() {
         playerDialog = new PlayerDialog(this, playerManager, this);
-
         playerDialog.show();
     }
 
@@ -324,7 +322,11 @@ public void sleepTimerOptionSelect() {
 
     private void setUpQueueDialog() {
         queueDialog = new QueueDialog(MainActivity.this, playerManager.getPlayerQueue());
-        queueDialog.setOnDismissListener(v -> playerDialog.show());
+        queueDialog.setOnDismissListener(v -> {
+            if(!this.isDestroyed()) {
+                playerDialog.show();
+            }
+        });
 
         playerDialog.dismiss();
         queueDialog.show();
@@ -341,7 +343,9 @@ private void setUpSleepTimerDialog() {
             return;
         }
         SleepTimerDialog sleepTimerDialog = new SleepTimerDialog(MainActivity.this, this);
-        sleepTimerDialog.setOnDismissListener(v -> playerDialog.show());
+        sleepTimerDialog.setOnDismissListener(v -> {
+            if(!this.isDestroyed()) playerDialog.show();
+        });
 
         playerDialog.dismiss();
         sleepTimerDialog.show();
@@ -349,7 +353,9 @@ private void setUpSleepTimerDialog() {
 
     private void setUpSleepTimerDisplayDialog() {
         SleepTimerDisplayDialog sleepTimerDisplayDialog = new SleepTimerDisplayDialog(MainActivity.this, this);
-        sleepTimerDisplayDialog.setOnDismissListener(v -> playerDialog.show());
+        sleepTimerDisplayDialog.setOnDismissListener(v -> {
+            if(!this.isDestroyed()) playerDialog.show();
+        });
 
         playerDialog.dismiss();
         sleepTimerDisplayDialog.show();

From 3981069ef1eb435ef6d319f28486d8909309b4ef Mon Sep 17 00:00:00 2001
From: atul-ap <atulpatare99@gmail.com>
Date: Tue, 27 Dec 2022 23:08:44 +0530
Subject: [PATCH 2/8] fixed null media button event

---
 .../main/java/com/atul/musicplayer/player/PlayerService.java   | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/app/src/main/java/com/atul/musicplayer/player/PlayerService.java b/src/app/src/main/java/com/atul/musicplayer/player/PlayerService.java
index df2356f..6a5b73f 100644
--- a/src/app/src/main/java/com/atul/musicplayer/player/PlayerService.java
+++ b/src/app/src/main/java/com/atul/musicplayer/player/PlayerService.java
@@ -104,6 +104,9 @@ private void configureMediaSession() {
 
     private boolean handleMediaButtonEvent(Intent mediaButtonEvent) {
         boolean isSuccess = false;
+        if (mediaButtonEvent == null) {
+            return false;
+        }
 
         KeyEvent keyEvent = mediaButtonEvent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
 

From 1f157667adca3c7077ccd942c7fddd9e09895444 Mon Sep 17 00:00:00 2001
From: atul-ap <atulpatare99@gmail.com>
Date: Tue, 27 Dec 2022 23:09:05 +0530
Subject: [PATCH 3/8] fixed removing current playing from queue

---
 .../atul/musicplayer/adapter/QueueAdapter.java | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/app/src/main/java/com/atul/musicplayer/adapter/QueueAdapter.java b/src/app/src/main/java/com/atul/musicplayer/adapter/QueueAdapter.java
index 1b397e9..56035fe 100644
--- a/src/app/src/main/java/com/atul/musicplayer/adapter/QueueAdapter.java
+++ b/src/app/src/main/java/com/atul/musicplayer/adapter/QueueAdapter.java
@@ -24,6 +24,7 @@ public class QueueAdapter extends RecyclerView.Adapter<QueueAdapter.MyViewHolder
 
     private final List<Music> musicList;
     private final PlayerQueue playerQueue;
+    private final Music currentMusic;
     private final @ColorInt
     int colorInt;
     int defaultTint;
@@ -31,6 +32,7 @@ public class QueueAdapter extends RecyclerView.Adapter<QueueAdapter.MyViewHolder
     public QueueAdapter(Context context, List<Music> musics, PlayerQueue playerQueue) {
         this.musicList = musics;
         this.playerQueue = playerQueue;
+        this.currentMusic = playerQueue.getCurrentMusic();
 
         colorInt = ThemeHelper.resolveColorAttr(
                 context,
@@ -51,7 +53,7 @@ public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
     public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
         holder.songName.setText(musicList.get(position).title);
 
-        if (playerQueue.getCurrentMusic().title.equals(musicList.get(position).title)) {
+        if (currentMusic.title.equals(musicList.get(position).title)) {
             holder.albumName.setText(R.string.now_playing);
             holder.albumName.setTextColor(colorInt);
             holder.drag.setImageResource(R.drawable.ic_current_playing);
@@ -106,9 +108,17 @@ public MyViewHolder(@NonNull View itemView) {
             drag = itemView.findViewById(R.id.control_drag);
 
             itemView.findViewById(R.id.control_close).setOnClickListener(v -> {
-                musicList.remove(getAdapterPosition());
-                playerQueue.removeMusicFromQueue(getAdapterPosition());
-                notifyDataSetChanged();
+                int position = getAdapterPosition();
+
+                if(position >= 0 && position < musicList.size()) {
+                    boolean isPlaying = currentMusic.title.equals(musicList.get(position).title);
+
+                    if (!isPlaying) {
+                        musicList.remove(position);
+                        playerQueue.removeMusicFromQueue(position);
+                        notifyItemRemoved(position);
+                    }
+                }
             });
         }
     }

From 1ed17ef0723c2068bb23886edd92e3723e2aad36 Mon Sep 17 00:00:00 2001
From: atul-ap <atulpatare99@gmail.com>
Date: Tue, 27 Dec 2022 23:09:31 +0530
Subject: [PATCH 4/8] added singleton pattern for queue

---
 .../atul/musicplayer/fragments/SongsFragment.java    |  2 +-
 .../com/atul/musicplayer/player/PlayerManager.java   |  2 +-
 .../com/atul/musicplayer/player/PlayerQueue.java     | 12 +++++++++++-
 3 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/app/src/main/java/com/atul/musicplayer/fragments/SongsFragment.java b/src/app/src/main/java/com/atul/musicplayer/fragments/SongsFragment.java
index a8b69f3..6914aed 100644
--- a/src/app/src/main/java/com/atul/musicplayer/fragments/SongsFragment.java
+++ b/src/app/src/main/java/com/atul/musicplayer/fragments/SongsFragment.java
@@ -127,7 +127,7 @@ public boolean onQueryTextChange(String newText) {
     private void updateAdapter(List<Music> list) {
         musicList.clear();
         musicList.addAll(list);
-        songsAdapter.notifyDataSetChanged();
+        songsAdapter.notifyItemRangeInserted(0, musicList.size());
 
         shuffleControl.setText(String.valueOf(musicList.size()));
     }
diff --git a/src/app/src/main/java/com/atul/musicplayer/player/PlayerManager.java b/src/app/src/main/java/com/atul/musicplayer/player/PlayerManager.java
index b2993e4..21807c6 100644
--- a/src/app/src/main/java/com/atul/musicplayer/player/PlayerManager.java
+++ b/src/app/src/main/java/com/atul/musicplayer/player/PlayerManager.java
@@ -84,7 +84,7 @@ public void onAudioFocusChange(final int focusChange) {
     public PlayerManager(@NonNull PlayerService playerService) {
         this.playerService = playerService;
         this.context = playerService.getApplicationContext();
-        this.playerQueue = new PlayerQueue();
+        this.playerQueue = PlayerQueue.getInstance();
         this.audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
 
         Observer<Integer> progressObserver = percent -> {
diff --git a/src/app/src/main/java/com/atul/musicplayer/player/PlayerQueue.java b/src/app/src/main/java/com/atul/musicplayer/player/PlayerQueue.java
index 9b265df..3a62410 100644
--- a/src/app/src/main/java/com/atul/musicplayer/player/PlayerQueue.java
+++ b/src/app/src/main/java/com/atul/musicplayer/player/PlayerQueue.java
@@ -8,6 +8,7 @@
 import java.util.Random;
 
 public class PlayerQueue {
+    private static PlayerQueue instance = null;
     private final Random random = new Random();
     private List<Music> currentQueue;
     private List<Integer> played;
@@ -15,8 +16,15 @@ public class PlayerQueue {
     private boolean repeat = false;
     private int currentPosition = 0;
 
+    public static PlayerQueue getInstance() {
+        if (instance == null) {
+            instance = new PlayerQueue();
+        }
+        return instance;
+    }
+
     private boolean isCurrentPositionOutOfBound(int pos) {
-        return pos >= currentQueue.size() || pos <= 0;
+        return pos >= currentQueue.size() || pos < 0;
     }
 
     public boolean isShuffle() {
@@ -85,6 +93,8 @@ public void prev() {
     public void removeMusicFromQueue(int position) {
         if (!isCurrentPositionOutOfBound(position)) {
             currentQueue.remove(position);
+            if(currentPosition > position)
+                currentPosition -= 1;
         }
     }
 

From 5abc5dec427c2452f897e0e978c42dc000d9b185 Mon Sep 17 00:00:00 2001
From: atul-ap <atulpatare99@gmail.com>
Date: Mon, 2 Jan 2023 16:38:23 +0530
Subject: [PATCH 5/8] fixed player queue, swap issue, and search issue

---
 .../musicplayer/fragments/SongsFragment.java     | 16 ++++++++++++----
 .../atul/musicplayer/player/PlayerManager.java   |  4 ++--
 .../com/atul/musicplayer/player/PlayerQueue.java |  6 ++++++
 3 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/src/app/src/main/java/com/atul/musicplayer/fragments/SongsFragment.java b/src/app/src/main/java/com/atul/musicplayer/fragments/SongsFragment.java
index 6914aed..810fe80 100644
--- a/src/app/src/main/java/com/atul/musicplayer/fragments/SongsFragment.java
+++ b/src/app/src/main/java/com/atul/musicplayer/fragments/SongsFragment.java
@@ -114,20 +114,28 @@ private void setUpSearchView() {
 
     @Override
     public boolean onQueryTextSubmit(String query) {
-        updateAdapter(ListHelper.searchMusicByName(unChangedList, query.toLowerCase()));
+        if(query.length() > 0) {
+            updateAdapter(ListHelper.searchMusicByName(unChangedList, query.toLowerCase()));
+        } else {
+            updateAdapter(unChangedList);
+        }
         return true;
     }
 
     @Override
-    public boolean onQueryTextChange(String newText) {
-        updateAdapter(ListHelper.searchMusicByName(unChangedList, newText.toLowerCase()));
+    public boolean onQueryTextChange(String query) {
+        if(query.length() > 0) {
+            updateAdapter(ListHelper.searchMusicByName(unChangedList, query.toLowerCase()));
+        }else {
+            updateAdapter(unChangedList);
+        }
         return true;
     }
 
     private void updateAdapter(List<Music> list) {
         musicList.clear();
         musicList.addAll(list);
-        songsAdapter.notifyItemRangeInserted(0, musicList.size());
+        songsAdapter.notifyDataSetChanged();
 
         shuffleControl.setText(String.valueOf(musicList.size()));
     }
diff --git a/src/app/src/main/java/com/atul/musicplayer/player/PlayerManager.java b/src/app/src/main/java/com/atul/musicplayer/player/PlayerManager.java
index 21807c6..73c6858 100644
--- a/src/app/src/main/java/com/atul/musicplayer/player/PlayerManager.java
+++ b/src/app/src/main/java/com/atul/musicplayer/player/PlayerManager.java
@@ -174,7 +174,7 @@ public void setPlayerListener(PlayerListener listener) {
     }
 
     public void setMusicList(List<Music> musicList) {
-        playerQueue.setCurrentQueue(musicList);
+        playerQueue.setCurrentQueue(new ArrayList<>(musicList));
         initMediaPlayer(); // play now
     }
 
@@ -186,7 +186,7 @@ public void setMusic(Music music) {
     }
 
     public void addMusicQueue(List<Music> musicList) {
-        playerQueue.addMusicListToQueue(musicList);
+        playerQueue.addMusicListToQueue(new ArrayList<>(musicList));
 
         if (!mediaPlayer.isPlaying())
             initMediaPlayer();  // play when ready
diff --git a/src/app/src/main/java/com/atul/musicplayer/player/PlayerQueue.java b/src/app/src/main/java/com/atul/musicplayer/player/PlayerQueue.java
index 3a62410..dd64da0 100644
--- a/src/app/src/main/java/com/atul/musicplayer/player/PlayerQueue.java
+++ b/src/app/src/main/java/com/atul/musicplayer/player/PlayerQueue.java
@@ -100,6 +100,12 @@ public void removeMusicFromQueue(int position) {
 
     public void swap(int one, int two) {
         if (!isCurrentPositionOutOfBound(one) && !isCurrentPositionOutOfBound(two)) {
+            if(one == currentPosition) {
+                currentPosition = two;
+            }
+            else if(two == currentPosition) {
+                currentPosition = one;
+            }
             Collections.swap(currentQueue, one, two);
         }
     }

From fd428e811254303ba0a4ac5712b9d183eaa3dd03 Mon Sep 17 00:00:00 2001
From: atul-ap <atulpatare99@gmail.com>
Date: Mon, 2 Jan 2023 18:31:55 +0530
Subject: [PATCH 6/8] fixed player icon flicker issue

---
 src/app/build.gradle                            | 17 +++++++++--------
 src/app/src/main/AndroidManifest.xml            |  3 +--
 .../musicplayer/activities/PlayerDialog.java    |  1 -
 src/build.gradle                                |  2 +-
 src/gradle/wrapper/gradle-wrapper.properties    |  2 +-
 5 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/src/app/build.gradle b/src/app/build.gradle
index 97bad8d..00f62b8 100644
--- a/src/app/build.gradle
+++ b/src/app/build.gradle
@@ -18,8 +18,8 @@ android {
         applicationId "com.atul.musicplayer"
         minSdkVersion 23
         targetSdkVersion 33
-        versionCode 12
-        versionName "0.12"
+        versionCode 13
+        versionName "0.13"
 
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
     }
@@ -35,14 +35,15 @@ android {
         sourceCompatibility JavaVersion.VERSION_1_8
         targetCompatibility JavaVersion.VERSION_1_8
     }
+    namespace 'com.atul.musicplayer'
 }
 
 dependencies {
     implementation 'androidx.legacy:legacy-support-v4:1.0.0'
-    implementation 'androidx.appcompat:appcompat:1.3.0'
-    implementation 'com.google.android.material:material:1.3.0'
-    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
-    implementation 'androidx.lifecycle:lifecycle-livedata:2.3.1'
-    implementation 'androidx.lifecycle:lifecycle-viewmodel:2.3.1'
-    implementation 'com.github.bumptech.glide:glide:4.11.0'
+    implementation 'androidx.appcompat:appcompat:1.5.1'
+    implementation 'com.google.android.material:material:1.7.0'
+    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+    implementation 'androidx.lifecycle:lifecycle-livedata:2.5.1'
+    implementation 'androidx.lifecycle:lifecycle-viewmodel:2.5.1'
+    implementation 'com.github.bumptech.glide:glide:4.14.2'
 }
\ No newline at end of file
diff --git a/src/app/src/main/AndroidManifest.xml b/src/app/src/main/AndroidManifest.xml
index e4b4308..838ebdd 100644
--- a/src/app/src/main/AndroidManifest.xml
+++ b/src/app/src/main/AndroidManifest.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.atul.musicplayer">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
 
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
diff --git a/src/app/src/main/java/com/atul/musicplayer/activities/PlayerDialog.java b/src/app/src/main/java/com/atul/musicplayer/activities/PlayerDialog.java
index e72e1d8..d4cdee2 100644
--- a/src/app/src/main/java/com/atul/musicplayer/activities/PlayerDialog.java
+++ b/src/app/src/main/java/com/atul/musicplayer/activities/PlayerDialog.java
@@ -194,7 +194,6 @@ public void onClick(View v) {
         else if (id == R.id.music_queue) this.playerDialogListener.queueOptionSelect();
         else if (id == R.id.sleep_timer) this.playerDialogListener.sleepTimerOptionSelect();
 
-        setUpUi();
     }
 
     private void setRepeat() {
diff --git a/src/build.gradle b/src/build.gradle
index 9d8b761..bcfbab2 100644
--- a/src/build.gradle
+++ b/src/build.gradle
@@ -5,7 +5,7 @@ buildscript {
         mavenCentral()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:7.2.2'
+        classpath 'com.android.tools.build:gradle:7.3.1'
 
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files
diff --git a/src/gradle/wrapper/gradle-wrapper.properties b/src/gradle/wrapper/gradle-wrapper.properties
index ccfdedb..cfb07bb 100644
--- a/src/gradle/wrapper/gradle-wrapper.properties
+++ b/src/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip

From 95c3036b8703699c45a8b1738201868708ce6ca6 Mon Sep 17 00:00:00 2001
From: atul-ap <atulpatare99@gmail.com>
Date: Mon, 2 Jan 2023 18:34:33 +0530
Subject: [PATCH 7/8] updated readme with new version

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index d05311f..0d12b19 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@
 
 | Lite                                                                                                                                                                                               | Online                                                                                                                                                                                   |
 | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [Github release v0.12](https://github.com/AP-Atul/music_player_lite/releases/download/v0.12/mplite.apk)                                                                                              | [Github release v0.3](https://github.com/AP-Atul/music_player_lite/releases/download/v0.3/mplite_online.apk)                                                                             |
+| [Github release v0.13](https://github.com/AP-Atul/music_player_lite/releases/download/v0.13/mplite.apk)                                                                                              | [Github release v0.3](https://github.com/AP-Atul/music_player_lite/releases/download/v0.3/mplite_online.apk)                                                                             |
 | <a href="https://apt.izzysoft.de/fdroid/index/apk/com.atul.musicplayer"><img src="https://github.com/AP-Atul/music_player_lite/raw/main/assets/IzzyOnDroid.png" width="200px"></a>                 | <a href="https://apt.izzysoft.de/fdroid/index/apk/com.atul.musicplayeronline"><img src="https://github.com/AP-Atul/music_player_lite/raw/main/assets/IzzyOnDroid.png" width="200px"></a> |
 | <a href="https://play.google.com/store/apps/details?id=com.atul.musicplayer"><img src="https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png" width="200px"></a> |                                                                                                                                                                                          |
 

From 41ad6896771c7ac7312d85a456601b2e6e513cb2 Mon Sep 17 00:00:00 2001
From: atul-ap <atulpatare99@gmail.com>
Date: Mon, 2 Jan 2023 18:44:30 +0530
Subject: [PATCH 8/8] fixed theme selection for invalid data

---
 .../src/main/java/com/atul/musicplayer/MainActivity.java    | 4 ++--
 .../main/java/com/atul/musicplayer/helper/ThemeHelper.java  | 6 +++++-
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/app/src/main/java/com/atul/musicplayer/MainActivity.java b/src/app/src/main/java/com/atul/musicplayer/MainActivity.java
index 7191e61..8cfe6e7 100644
--- a/src/app/src/main/java/com/atul/musicplayer/MainActivity.java
+++ b/src/app/src/main/java/com/atul/musicplayer/MainActivity.java
@@ -68,8 +68,8 @@ public class MainActivity extends AppCompatActivity
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setTheme(ThemeHelper.getTheme(MPPreferences.getTheme(getApplicationContext())));
-        AppCompatDelegate.setDefaultNightMode(MPPreferences.getThemeMode(getApplicationContext()));
+        setTheme(ThemeHelper.getTheme(MPPreferences.getTheme(MainActivity.this)));
+        AppCompatDelegate.setDefaultNightMode(MPPreferences.getThemeMode(MainActivity.this));
         setContentView(R.layout.activity_main);
         MPConstants.musicSelectListener = this;
 
diff --git a/src/app/src/main/java/com/atul/musicplayer/helper/ThemeHelper.java b/src/app/src/main/java/com/atul/musicplayer/helper/ThemeHelper.java
index 0578aa8..51dea86 100644
--- a/src/app/src/main/java/com/atul/musicplayer/helper/ThemeHelper.java
+++ b/src/app/src/main/java/com/atul/musicplayer/helper/ThemeHelper.java
@@ -61,7 +61,11 @@ public static HashMap<Integer, Integer> getThemeMap() {
     }
 
     public static Integer getTheme(Integer accentColor) {
-        return getThemeMap().get(accentColor);
+        Integer theme = getThemeMap().get(accentColor);
+        if(theme == null) {
+            return getThemeMap().get(R.color.blue);
+        }
+        return theme;
     }
 
     public static void applySettings(Activity activity) {