diff --git a/app/src/main/java/code/name/monkey/retromusic/model/AbsCustomPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/AbsCustomPlaylist.java
index 99b889d4..085c9397 100644
--- a/app/src/main/java/code/name/monkey/retromusic/model/AbsCustomPlaylist.java
+++ b/app/src/main/java/code/name/monkey/retromusic/model/AbsCustomPlaylist.java
@@ -12,23 +12,14 @@
  * See the GNU General Public License for more details.
  */
 
-package code.name.monkey.retromusic.model;
+package code.name.monkey.retromusic.model
 
-import android.content.Context;
+import android.content.Context
+import io.reactivex.Observable
+import java.util.*
 
-import java.util.ArrayList;
+abstract class AbsCustomPlaylist(id: Int, name: String) : Playlist(id, name) {
 
-import androidx.annotation.NonNull;
-import io.reactivex.Observable;
-import kotlinx.android.parcel.Parcelize;
-
-@Parcelize
-public abstract class AbsCustomPlaylist extends Playlist {
-    public AbsCustomPlaylist(int id, @NonNull String name) {
-        super(id, name);
-    }
-
-    @NonNull
-    public abstract Observable<ArrayList<Song>> getSongs(@NonNull Context context);
+    abstract fun getSongs(context: Context): Observable<ArrayList<Song>>
 }
 
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Playlist.java b/app/src/main/java/code/name/monkey/retromusic/model/Playlist.java
new file mode 100644
index 00000000..6d66cbdd
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/model/Playlist.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2019 Hemanth Savarala.
+ *
+ * Licensed under the GNU General Public License v3
+ *
+ * This is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by
+ *  the Free Software Foundation either version 3 of the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ */
+
+package code.name.monkey.retromusic.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * @author Karim Abou Zeid (kabouzeid)
+ */
+public class Playlist implements Parcelable {
+    public final int id;
+    public final String name;
+
+    public Playlist(final int id, final String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public Playlist() {
+        this.id = -1;
+        this.name = "";
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        Playlist playlist = (Playlist) o;
+
+        if (id != playlist.id) return false;
+        return name != null ? name.equals(playlist.name) : playlist.name == null;
+
+    }
+
+    @Override
+    public int hashCode() {
+        int result = id;
+        result = 31 * result + (name != null ? name.hashCode() : 0);
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return "Playlist{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                '}';
+    }
+
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(this.id);
+        dest.writeString(this.name);
+    }
+
+    protected Playlist(Parcel in) {
+        this.id = in.readInt();
+        this.name = in.readString();
+    }
+
+    public static final Creator<Playlist> CREATOR = new Creator<Playlist>() {
+        public Playlist createFromParcel(Parcel source) {
+            return new Playlist(source);
+        }
+
+        public Playlist[] newArray(int size) {
+            return new Playlist[size];
+        }
+    };
+}
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Playlist.kt b/app/src/main/java/code/name/monkey/retromusic/model/Playlist.kt
deleted file mode 100644
index 3714b7d3..00000000
--- a/app/src/main/java/code/name/monkey/retromusic/model/Playlist.kt
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (c) 2019 Hemanth Savarala.
- *
- * Licensed under the GNU General Public License v3
- *
- * This is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by
- *  the Free Software Foundation either version 3 of the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- */
-
-package code.name.monkey.retromusic.model
-
-import android.os.Parcelable
-import kotlinx.android.parcel.Parcelize
-
-@Parcelize
-open class Playlist(val id: Int = -1, val name: String = "") : Parcelable
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/AbsSmartPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/AbsSmartPlaylist.java
index d6b260c6..3d94b86b 100644
--- a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/AbsSmartPlaylist.java
+++ b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/AbsSmartPlaylist.java
@@ -15,22 +15,70 @@
 package code.name.monkey.retromusic.model.smartplaylist;
 
 import android.content.Context;
+import android.os.Parcel;
+import android.support.annotation.DrawableRes;
+import android.support.annotation.Nullable;
 
-import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import code.name.monkey.retromusic.model.AbsCustomPlaylist;
-import kotlinx.android.parcel.Parcelize;
+import com.kabouzeid.gramophone.R;
+import com.kabouzeid.gramophone.model.AbsCustomPlaylist;
 
-@Parcelize
+/**
+ * @author Karim Abou Zeid (kabouzeid)
+ */
 public abstract class AbsSmartPlaylist extends AbsCustomPlaylist {
     @DrawableRes
     public final int iconRes;
 
-    public AbsSmartPlaylist(final @NonNull String name, final int iconRes) {
+    public AbsSmartPlaylist(final String name, final int iconRes) {
         super(-Math.abs(31 * name.hashCode() + (iconRes * name.hashCode() * 31 * 31)), name);
         this.iconRes = iconRes;
     }
 
-    public abstract void clear(@NonNull Context context);
+    public AbsSmartPlaylist() {
+        super();
+        this.iconRes = R.drawable.ic_queue_music_white_24dp;
+    }
 
+    public abstract void clear(Context context);
+
+    public boolean isClearable() {
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + iconRes;
+        return result;
+    }
+
+    @Override
+    public boolean equals(@Nullable final Object obj) {
+        if (super.equals(obj)) {
+            if (getClass() != obj.getClass()) {
+                return false;
+            }
+            final AbsSmartPlaylist other = (AbsSmartPlaylist) obj;
+            return iconRes == other.iconRes;
+        }
+        return false;
+    }
+
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        super.writeToParcel(dest, flags);
+        dest.writeInt(this.iconRes);
+    }
+
+    protected AbsSmartPlaylist(Parcel in) {
+        super(in);
+        this.iconRes = in.readInt();
+    }
 }
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/HistoryPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/HistoryPlaylist.java
new file mode 100644
index 00000000..bcc9e38f
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/HistoryPlaylist.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2019 Hemanth Savarala.
+ *
+ * Licensed under the GNU General Public License v3
+ *
+ * This is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by
+ *  the Free Software Foundation either version 3 of the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ */
+
+package code.name.monkey.retromusic.model.smartplaylist;
+
+import android.content.Context;
+import android.os.Parcel;
+import android.support.annotation.NonNull;
+
+import com.kabouzeid.gramophone.R;
+import com.kabouzeid.gramophone.loader.TopAndRecentlyPlayedTracksLoader;
+import com.kabouzeid.gramophone.model.Song;
+import com.kabouzeid.gramophone.provider.HistoryStore;
+
+import java.util.ArrayList;
+
+/**
+ * @author Karim Abou Zeid (kabouzeid)
+ */
+public class HistoryPlaylist extends AbsSmartPlaylist {
+
+    public HistoryPlaylist(@NonNull Context context) {
+        super(context.getString(R.string.history), R.drawable.ic_access_time_white_24dp);
+    }
+
+    @NonNull
+    @Override
+    public ArrayList<Song> getSongs(@NonNull Context context) {
+        return TopAndRecentlyPlayedTracksLoader.getRecentlyPlayedTracks(context);
+    }
+
+    @Override
+    public void clear(@NonNull Context context) {
+        HistoryStore.getInstance(context).clear();
+    }
+
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    protected HistoryPlaylist(Parcel in) {
+        super(in);
+    }
+
+    public static final Creator<HistoryPlaylist> CREATOR = new Creator<HistoryPlaylist>() {
+        public HistoryPlaylist createFromParcel(Parcel source) {
+            return new HistoryPlaylist(source);
+        }
+
+        public HistoryPlaylist[] newArray(int size) {
+            return new HistoryPlaylist[size];
+        }
+    };
+}
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/HistoryPlaylist.kt b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/HistoryPlaylist.kt
deleted file mode 100644
index ad3f1c02..00000000
--- a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/HistoryPlaylist.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2019 Hemanth Savarala.
- *
- * Licensed under the GNU General Public License v3
- *
- * This is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by
- *  the Free Software Foundation either version 3 of the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- */
-
-package code.name.monkey.retromusic.model.smartplaylist
-
-import android.content.Context
-
-import java.util.ArrayList
-import code.name.monkey.retromusic.R
-import code.name.monkey.retromusic.loaders.TopAndRecentlyPlayedTracksLoader
-import code.name.monkey.retromusic.model.Song
-import code.name.monkey.retromusic.providers.HistoryStore
-import io.reactivex.Observable
-import kotlinx.android.parcel.Parcelize
-
-class HistoryPlaylist(context: Context) : AbsSmartPlaylist(context.getString(R.string.history), R.drawable.ic_access_time_white_24dp) {
-
-    override fun getSongs(context: Context): Observable<ArrayList<Song>> {
-        return TopAndRecentlyPlayedTracksLoader.getRecentlyPlayedTracks(context)
-    }
-
-    override fun clear(context: Context) {
-        HistoryStore.getInstance(context).clear()
-    }
-}
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/LastAddedPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/LastAddedPlaylist.java
new file mode 100644
index 00000000..3b7200dc
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/LastAddedPlaylist.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2019 Hemanth Savarala.
+ *
+ * Licensed under the GNU General Public License v3
+ *
+ * This is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by
+ *  the Free Software Foundation either version 3 of the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ */
+
+package code.name.monkey.retromusic.model.smartplaylist;
+
+import android.content.Context;
+import android.os.Parcel;
+import android.support.annotation.NonNull;
+
+import com.kabouzeid.gramophone.R;
+import com.kabouzeid.gramophone.loader.LastAddedLoader;
+import com.kabouzeid.gramophone.model.Song;
+
+import java.util.ArrayList;
+
+/**
+ * @author Karim Abou Zeid (kabouzeid)
+ */
+public class LastAddedPlaylist extends AbsSmartPlaylist {
+
+    public LastAddedPlaylist(@NonNull Context context) {
+        super(context.getString(R.string.last_added), R.drawable.ic_library_add_white_24dp);
+    }
+
+    @NonNull
+    @Override
+    public ArrayList<Song> getSongs(@NonNull Context context) {
+        return LastAddedLoader.getLastAddedSongs(context);
+    }
+
+    @Override
+    public void clear(@NonNull Context context) {
+    }
+
+    @Override
+    public boolean isClearable() {
+        return false;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    protected LastAddedPlaylist(Parcel in) {
+        super(in);
+    }
+
+    public static final Creator<LastAddedPlaylist> CREATOR = new Creator<LastAddedPlaylist>() {
+        public LastAddedPlaylist createFromParcel(Parcel source) {
+            return new LastAddedPlaylist(source);
+        }
+
+        public LastAddedPlaylist[] newArray(int size) {
+            return new LastAddedPlaylist[size];
+        }
+    };
+}
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/LastAddedPlaylist.kt b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/LastAddedPlaylist.kt
deleted file mode 100644
index 419e0245..00000000
--- a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/LastAddedPlaylist.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2019 Hemanth Savarala.
- *
- * Licensed under the GNU General Public License v3
- *
- * This is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by
- *  the Free Software Foundation either version 3 of the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- */
-
-package code.name.monkey.retromusic.model.smartplaylist
-
-import android.content.Context
-
-import java.util.ArrayList
-import code.name.monkey.retromusic.R
-import code.name.monkey.retromusic.loaders.LastAddedSongsLoader
-import code.name.monkey.retromusic.model.Song
-import io.reactivex.Observable
-
-class LastAddedPlaylist(context: Context) : AbsSmartPlaylist(context.getString(R.string.last_added), R.drawable.ic_library_add_white_24dp) {
-
-    override fun getSongs(context: Context): Observable<ArrayList<Song>> {
-        return LastAddedSongsLoader.getLastAddedSongs(context)
-    }
-
-    override fun clear(context: Context) {}
-}
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/MyTopTracksPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/MyTopTracksPlaylist.java
new file mode 100644
index 00000000..3e7edb45
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/MyTopTracksPlaylist.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2019 Hemanth Savarala.
+ *
+ * Licensed under the GNU General Public License v3
+ *
+ * This is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by
+ *  the Free Software Foundation either version 3 of the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ */
+
+package code.name.monkey.retromusic.model.smartplaylist;
+
+import android.content.Context;
+import android.os.Parcel;
+import android.support.annotation.NonNull;
+
+import com.kabouzeid.gramophone.R;
+import com.kabouzeid.gramophone.loader.TopAndRecentlyPlayedTracksLoader;
+import com.kabouzeid.gramophone.model.Song;
+import com.kabouzeid.gramophone.provider.SongPlayCountStore;
+
+import java.util.ArrayList;
+
+/**
+ * @author Karim Abou Zeid (kabouzeid)
+ */
+public class MyTopTracksPlaylist extends AbsSmartPlaylist {
+
+    public MyTopTracksPlaylist(@NonNull Context context) {
+        super(context.getString(R.string.my_top_tracks), R.drawable.ic_trending_up_white_24dp);
+    }
+
+    @NonNull
+    @Override
+    public ArrayList<Song> getSongs(@NonNull Context context) {
+        return TopAndRecentlyPlayedTracksLoader.getTopTracks(context);
+    }
+
+    @Override
+    public void clear(@NonNull Context context) {
+        SongPlayCountStore.getInstance(context).clear();
+    }
+
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    protected MyTopTracksPlaylist(Parcel in) {
+        super(in);
+    }
+
+    public static final Creator<MyTopTracksPlaylist> CREATOR = new Creator<MyTopTracksPlaylist>() {
+        public MyTopTracksPlaylist createFromParcel(Parcel source) {
+            return new MyTopTracksPlaylist(source);
+        }
+
+        public MyTopTracksPlaylist[] newArray(int size) {
+            return new MyTopTracksPlaylist[size];
+        }
+    };
+}
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/MyTopTracksPlaylist.kt b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/MyTopTracksPlaylist.kt
deleted file mode 100644
index cd8ab1ff..00000000
--- a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/MyTopTracksPlaylist.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2019 Hemanth Savarala.
- *
- * Licensed under the GNU General Public License v3
- *
- * This is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by
- *  the Free Software Foundation either version 3 of the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- */
-
-package code.name.monkey.retromusic.model.smartplaylist
-
-import android.content.Context
-
-import java.util.ArrayList
-import code.name.monkey.retromusic.R
-import code.name.monkey.retromusic.loaders.TopAndRecentlyPlayedTracksLoader
-import code.name.monkey.retromusic.model.Song
-import code.name.monkey.retromusic.providers.SongPlayCountStore
-import io.reactivex.Observable
-
-
-class MyTopTracksPlaylist(context: Context) : AbsSmartPlaylist(context.getString(R.string.my_top_tracks), R.drawable.ic_trending_up_white_24dp) {
-
-    override fun getSongs(context: Context): Observable<ArrayList<Song>> {
-        return TopAndRecentlyPlayedTracksLoader.getTopTracks(context)
-    }
-
-    override fun clear(context: Context) {
-        SongPlayCountStore.getInstance(context).clear()
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/ShuffleAllPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/ShuffleAllPlaylist.java
new file mode 100644
index 00000000..67499473
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/ShuffleAllPlaylist.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2019 Hemanth Savarala.
+ *
+ * Licensed under the GNU General Public License v3
+ *
+ * This is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by
+ *  the Free Software Foundation either version 3 of the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ */
+
+package code.name.monkey.retromusic.model.smartplaylist;
+
+import android.content.Context;
+import android.os.Parcel;
+import android.support.annotation.NonNull;
+
+import com.kabouzeid.gramophone.R;
+import com.kabouzeid.gramophone.loader.SongLoader;
+import com.kabouzeid.gramophone.model.Song;
+
+import java.util.ArrayList;
+
+public class ShuffleAllPlaylist extends AbsSmartPlaylist {
+
+    public ShuffleAllPlaylist(@NonNull Context context) {
+        super(context.getString(R.string.action_shuffle_all), R.drawable.ic_shuffle_white_24dp);
+    }
+
+    @NonNull
+    @Override
+    public ArrayList<Song> getSongs(@NonNull Context context) {
+        return SongLoader.getAllSongs(context);
+    }
+
+    @Override
+    public void clear(@NonNull Context context) {
+        // Shuffle all is not a real "Smart Playlist"
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    protected ShuffleAllPlaylist(Parcel in) {
+        super(in);
+    }
+
+    public static final Creator<ShuffleAllPlaylist> CREATOR = new Creator<ShuffleAllPlaylist>() {
+        public ShuffleAllPlaylist createFromParcel(Parcel source) {
+            return new ShuffleAllPlaylist(source);
+        }
+
+        public ShuffleAllPlaylist[] newArray(int size) {
+            return new ShuffleAllPlaylist[size];
+        }
+    };
+}
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/ShuffleAllPlaylist.kt b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/ShuffleAllPlaylist.kt
deleted file mode 100644
index 3cc1abbf..00000000
--- a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/ShuffleAllPlaylist.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2019 Hemanth Savarala.
- *
- * Licensed under the GNU General Public License v3
- *
- * This is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by
- *  the Free Software Foundation either version 3 of the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- */
-
-package code.name.monkey.retromusic.model.smartplaylist
-
-import android.content.Context
-
-import java.util.ArrayList
-import code.name.monkey.retromusic.R
-import code.name.monkey.retromusic.loaders.SongLoader
-import code.name.monkey.retromusic.model.Song
-import io.reactivex.Observable
-
-class ShuffleAllPlaylist(context: Context) : AbsSmartPlaylist(context.getString(R.string.action_shuffle_all), R.drawable.ic_shuffle_white_24dp) {
-
-
-    override fun getSongs(context: Context): Observable<ArrayList<Song>> {
-        return SongLoader.getAllSongs(context)
-    }
-
-    override fun clear(context: Context) {
-        // Shuffle all is not a real "Smart Playlist"
-    }
-}
diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/EdgeGlowUtil.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/EdgeGlowUtil.kt
deleted file mode 100755
index b5092ec5..00000000
--- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/EdgeGlowUtil.kt
+++ /dev/null
@@ -1,342 +0,0 @@
-package code.name.monkey.appthemehelper.util
-
-import android.annotation.TargetApi
-import android.graphics.PorterDuff
-import android.graphics.drawable.Drawable
-import android.os.Build
-import androidx.annotation.ColorInt
-import androidx.viewpager.widget.ViewPager
-import androidx.core.widget.EdgeEffectCompat
-import androidx.core.widget.NestedScrollView
-import androidx.recyclerview.widget.RecyclerView
-import android.widget.AbsListView
-import android.widget.EdgeEffect
-import android.widget.ScrollView
-
-import code.name.monkey.appthemehelper.BuildConfig
-
-import java.lang.reflect.Field
-
-class EdgeGlowUtil protected constructor() {
-    companion object {
-
-        // Invalidation methods
-
-        private var EDGE_GLOW_FIELD_EDGE: Field? = null
-        private var EDGE_GLOW_FIELD_GLOW: Field? = null
-        private var EDGE_EFFECT_COMPAT_FIELD_EDGE_EFFECT: Field? = null
-
-        private fun invalidateEdgeEffectFields() {
-            if (EDGE_GLOW_FIELD_EDGE != null && EDGE_GLOW_FIELD_GLOW != null &&
-                    EDGE_EFFECT_COMPAT_FIELD_EDGE_EFFECT != null) {
-                EDGE_GLOW_FIELD_EDGE!!.isAccessible = true
-                EDGE_GLOW_FIELD_GLOW!!.isAccessible = true
-                EDGE_EFFECT_COMPAT_FIELD_EDGE_EFFECT!!.isAccessible = true
-                return
-            }
-            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
-                var edge: Field? = null
-                var glow: Field? = null
-                var cls: Class<*>? = null
-                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
-                    try {
-                        cls = Class.forName("android.widget.EdgeGlow")
-                    } catch (e: ClassNotFoundException) {
-                        if (BuildConfig.DEBUG) e.printStackTrace()
-                    }
-
-                } else {
-                    cls = EdgeEffect::class.java
-                }
-                if (cls != null) {
-                    for (f in cls.declaredFields) {
-                        when (f.name) {
-                            "mEdge" -> {
-                                f.isAccessible = true
-                                edge = f
-                            }
-                            "mGlow" -> {
-                                f.isAccessible = true
-                                glow = f
-                            }
-                        }
-                    }
-                }
-                EDGE_GLOW_FIELD_EDGE = edge
-                EDGE_GLOW_FIELD_GLOW = glow
-            } else {
-                EDGE_GLOW_FIELD_EDGE = null
-                EDGE_GLOW_FIELD_GLOW = null
-            }
-
-            var efc: Field? = null
-            try {
-                efc = EdgeEffectCompat::class.java.getDeclaredField("mEdgeEffect")
-            } catch (e: NoSuchFieldException) {
-                if (BuildConfig.DEBUG) e.printStackTrace()
-            }
-
-            EDGE_EFFECT_COMPAT_FIELD_EDGE_EFFECT = efc
-        }
-
-        private var SCROLL_VIEW_FIELD_EDGE_GLOW_TOP: Field? = null
-        private var SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM: Field? = null
-
-        private fun invalidateScrollViewFields() {
-            if (SCROLL_VIEW_FIELD_EDGE_GLOW_TOP != null && SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM != null) {
-                SCROLL_VIEW_FIELD_EDGE_GLOW_TOP!!.isAccessible = true
-                SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM!!.isAccessible = true
-                return
-            }
-            val cls = ScrollView::class.java
-            for (f in cls.declaredFields) {
-                when (f.name) {
-                    "mEdgeGlowTop" -> {
-                        f.isAccessible = true
-                        SCROLL_VIEW_FIELD_EDGE_GLOW_TOP = f
-                    }
-                    "mEdgeGlowBottom" -> {
-                        f.isAccessible = true
-                        SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM = f
-                    }
-                }
-            }
-        }
-
-        private var NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_TOP: Field? = null
-        private var NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM: Field? = null
-
-        private fun invalidateNestedScrollViewFields() {
-            if (NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_TOP != null && NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM != null) {
-                NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_TOP!!.isAccessible = true
-                NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM!!.isAccessible = true
-                return
-            }
-            val cls = ATHUtil.inClassPath("android.support.v4.widget.NestedScrollView")
-            for (f in cls.declaredFields) {
-                when (f.name) {
-                    "mEdgeGlowTop" -> {
-                        f.isAccessible = true
-                        NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_TOP = f
-                    }
-                    "mEdgeGlowBottom" -> {
-                        f.isAccessible = true
-                        NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM = f
-                    }
-                }
-            }
-        }
-
-        private var LIST_VIEW_FIELD_EDGE_GLOW_TOP: Field? = null
-        private var LIST_VIEW_FIELD_EDGE_GLOW_BOTTOM: Field? = null
-
-        private fun invalidateListViewFields() {
-            if (LIST_VIEW_FIELD_EDGE_GLOW_TOP != null && LIST_VIEW_FIELD_EDGE_GLOW_BOTTOM != null) {
-                LIST_VIEW_FIELD_EDGE_GLOW_TOP!!.isAccessible = true
-                LIST_VIEW_FIELD_EDGE_GLOW_BOTTOM!!.isAccessible = true
-                return
-            }
-            val cls = AbsListView::class.java
-            for (f in cls.declaredFields) {
-                when (f.name) {
-                    "mEdgeGlowTop" -> {
-                        f.isAccessible = true
-                        LIST_VIEW_FIELD_EDGE_GLOW_TOP = f
-                    }
-                    "mEdgeGlowBottom" -> {
-                        f.isAccessible = true
-                        LIST_VIEW_FIELD_EDGE_GLOW_BOTTOM = f
-                    }
-                }
-            }
-        }
-
-        private var RECYCLER_VIEW_FIELD_EDGE_GLOW_TOP: Field? = null
-        private var RECYCLER_VIEW_FIELD_EDGE_GLOW_LEFT: Field? = null
-        private var RECYCLER_VIEW_FIELD_EDGE_GLOW_RIGHT: Field? = null
-        private var RECYCLER_VIEW_FIELD_EDGE_GLOW_BOTTOM: Field? = null
-
-        private fun invalidateRecyclerViewFields() {
-            if (RECYCLER_VIEW_FIELD_EDGE_GLOW_TOP != null && RECYCLER_VIEW_FIELD_EDGE_GLOW_LEFT != null &&
-                    RECYCLER_VIEW_FIELD_EDGE_GLOW_RIGHT != null && RECYCLER_VIEW_FIELD_EDGE_GLOW_BOTTOM != null) {
-                RECYCLER_VIEW_FIELD_EDGE_GLOW_TOP!!.isAccessible = true
-                RECYCLER_VIEW_FIELD_EDGE_GLOW_LEFT!!.isAccessible = true
-                RECYCLER_VIEW_FIELD_EDGE_GLOW_RIGHT!!.isAccessible = true
-                RECYCLER_VIEW_FIELD_EDGE_GLOW_BOTTOM!!.isAccessible = true
-                return
-            }
-            val cls = ATHUtil.inClassPath("android.support.v7.widget.RecyclerView")
-            for (f in cls.declaredFields) {
-                when (f.name) {
-                    "mTopGlow" -> {
-                        f.isAccessible = true
-                        RECYCLER_VIEW_FIELD_EDGE_GLOW_TOP = f
-                    }
-                    "mBottomGlow" -> {
-                        f.isAccessible = true
-                        RECYCLER_VIEW_FIELD_EDGE_GLOW_BOTTOM = f
-                    }
-                    "mLeftGlow" -> {
-                        f.isAccessible = true
-                        RECYCLER_VIEW_FIELD_EDGE_GLOW_LEFT = f
-                    }
-                    "mRightGlow" -> {
-                        f.isAccessible = true
-                        RECYCLER_VIEW_FIELD_EDGE_GLOW_RIGHT = f
-                    }
-                }
-            }
-        }
-
-        private var VIEW_PAGER_FIELD_EDGE_GLOW_LEFT: Field? = null
-        private var VIEW_PAGER_FIELD_EDGE_GLOW_RIGHT: Field? = null
-
-        private fun invalidateViewPagerFields() {
-            if (VIEW_PAGER_FIELD_EDGE_GLOW_LEFT != null && VIEW_PAGER_FIELD_EDGE_GLOW_RIGHT != null) {
-                VIEW_PAGER_FIELD_EDGE_GLOW_LEFT!!.isAccessible = true
-                VIEW_PAGER_FIELD_EDGE_GLOW_RIGHT!!.isAccessible = true
-                return
-            }
-            val cls = ATHUtil.inClassPath("android.support.v4.view.ViewPager")
-            for (f in cls.declaredFields) {
-                when (f.name) {
-                    "mLeftEdge" -> {
-                        f.isAccessible = true
-                        VIEW_PAGER_FIELD_EDGE_GLOW_LEFT = f
-                    }
-                    "mRightEdge" -> {
-                        f.isAccessible = true
-                        VIEW_PAGER_FIELD_EDGE_GLOW_RIGHT = f
-                    }
-                }
-            }
-        }
-
-        // Setter methods
-
-        fun setEdgeGlowColor(scrollView: ScrollView, @ColorInt color: Int) {
-            invalidateScrollViewFields()
-            try {
-                var ee: Any
-                ee = SCROLL_VIEW_FIELD_EDGE_GLOW_TOP!!.get(scrollView)
-                setEffectColor(ee, color)
-                ee = SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM!!.get(scrollView)
-                setEffectColor(ee, color)
-            } catch (ex: Exception) {
-                if (BuildConfig.DEBUG) ex.printStackTrace()
-            }
-
-        }
-
-        fun setEdgeGlowColor(scrollView: NestedScrollView, @ColorInt color: Int) {
-            invalidateNestedScrollViewFields()
-            try {
-                var ee: Any
-                ee = NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_TOP!!.get(scrollView)
-                setEffectColor(ee, color)
-                ee = NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM!!.get(scrollView)
-                setEffectColor(ee, color)
-            } catch (ex: Exception) {
-                if (BuildConfig.DEBUG) ex.printStackTrace()
-            }
-
-        }
-
-        fun setEdgeGlowColor(listView: AbsListView, @ColorInt color: Int) {
-            invalidateListViewFields()
-            try {
-                var ee: Any
-                ee = LIST_VIEW_FIELD_EDGE_GLOW_TOP!!.get(listView)
-                setEffectColor(ee, color)
-                ee = LIST_VIEW_FIELD_EDGE_GLOW_BOTTOM!!.get(listView)
-                setEffectColor(ee, color)
-            } catch (ex: Exception) {
-                if (BuildConfig.DEBUG) ex.printStackTrace()
-            }
-
-        }
-
-        fun setEdgeGlowColor(scrollView: RecyclerView, @ColorInt color: Int, scrollListener: RecyclerView.OnScrollListener?) {
-            var scrollListener = scrollListener
-            invalidateRecyclerViewFields()
-            invalidateRecyclerViewFields()
-            if (scrollListener == null) {
-                scrollListener = object : RecyclerView.OnScrollListener() {
-                    override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
-                        super.onScrollStateChanged(recyclerView, newState)
-                        EdgeGlowUtil.setEdgeGlowColor(recyclerView, color, this)
-                    }
-                }
-                scrollView.addOnScrollListener(scrollListener)
-            }
-            try {
-                var ee: Any
-                ee = RECYCLER_VIEW_FIELD_EDGE_GLOW_TOP!!.get(scrollView)
-                setEffectColor(ee, color)
-                ee = RECYCLER_VIEW_FIELD_EDGE_GLOW_BOTTOM!!.get(scrollView)
-                setEffectColor(ee, color)
-                ee = RECYCLER_VIEW_FIELD_EDGE_GLOW_LEFT!!.get(scrollView)
-                setEffectColor(ee, color)
-                ee = RECYCLER_VIEW_FIELD_EDGE_GLOW_RIGHT!!.get(scrollView)
-                setEffectColor(ee, color)
-            } catch (ex: Exception) {
-                if (BuildConfig.DEBUG) ex.printStackTrace()
-            }
-
-        }
-
-        fun setEdgeGlowColor(pager: ViewPager, @ColorInt color: Int) {
-            invalidateViewPagerFields()
-            try {
-                var ee: Any
-                ee = VIEW_PAGER_FIELD_EDGE_GLOW_LEFT!!.get(pager)
-                setEffectColor(ee, color)
-                ee = VIEW_PAGER_FIELD_EDGE_GLOW_RIGHT!!.get(pager)
-                setEffectColor(ee, color)
-            } catch (ex: Exception) {
-                if (BuildConfig.DEBUG) ex.printStackTrace()
-            }
-
-        }
-
-        // Utilities
-
-        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
-        private fun setEffectColor(edgeEffect: Any?, @ColorInt color: Int) {
-            var edgeEffect = edgeEffect
-            invalidateEdgeEffectFields()
-            if (edgeEffect is EdgeEffectCompat) {
-                // EdgeEffectCompat
-                try {
-                    EDGE_EFFECT_COMPAT_FIELD_EDGE_EFFECT!!.isAccessible = true
-                    edgeEffect = EDGE_EFFECT_COMPAT_FIELD_EDGE_EFFECT!!.get(edgeEffect)
-                } catch (e: IllegalAccessException) {
-                    e.printStackTrace()
-                    return
-                }
-
-            }
-            if (edgeEffect == null)
-                return
-            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
-                // EdgeGlow
-                try {
-                    EDGE_GLOW_FIELD_EDGE!!.isAccessible = true
-                    val mEdge = EDGE_GLOW_FIELD_EDGE!!.get(edgeEffect) as Drawable
-                    EDGE_GLOW_FIELD_GLOW!!.isAccessible = true
-                    val mGlow = EDGE_GLOW_FIELD_GLOW!!.get(edgeEffect) as Drawable
-                    mEdge.setColorFilter(color, PorterDuff.Mode.SRC_IN)
-                    mGlow.setColorFilter(color, PorterDuff.Mode.SRC_IN)
-                    mEdge.callback = null // free up any references
-                    mGlow.callback = null // free up any references
-                } catch (ex: Exception) {
-                    ex.printStackTrace()
-                }
-
-            } else {
-                // EdgeEffect
-                (edgeEffect as EdgeEffect).color = color
-            }
-        }
-    }
-}