diff --git a/app/src/main/java/com/syncedsynapse/kore2/provider/MediaDatabase.java b/app/src/main/java/com/syncedsynapse/kore2/provider/MediaDatabase.java index 60584b8..63387d6 100644 --- a/app/src/main/java/com/syncedsynapse/kore2/provider/MediaDatabase.java +++ b/app/src/main/java/com/syncedsynapse/kore2/provider/MediaDatabase.java @@ -455,4 +455,47 @@ public class MediaDatabase extends SQLiteOpenHelper { db.execSQL("DROP TABLE IF EXISTS " + Tables.MUSIC_VIDEOS); onCreate(db); } + + /** + * Tokens to move from prefix to suffix when sorting titles + * + * TODO: Extract from host's advancedsettings.xml - sortTokens if available via JSONAPI + */ + private static String[] commonTokens = {"The", /* "An", "A" */}; + + /** + * Given column create SQLite column expression to convert any sortTokens prefixes to suffixes + * + * eg.column = "title", commonTokens = {"The", "An", "A"}; + * + * ( + * CASE + * WHEN title LIKE 'The %' THEN SUBSTR(title,5) || ', The' + * WHEN title LIKE 'An %' THEN SUBSTR(title,4) || ', An' + * WHEN title LIKE 'A %' THEN SUBSTR(title,3) || ', A' + * ELSE title + * END + * ) + * + * This allows it to be used in SQL where a column expression is expected ( SELECT, ORDER BY ) + */ + public static String sortCommonTokens(String column) { + StringBuilder order = new StringBuilder(); + + order.append(" (CASE "); + + // Create WHEN for each token, eg 'The Dog' would become 'Dog, The' + for (String token: commonTokens) { + order.append( + " WHEN " + column + " LIKE '" + token + " %'" + + " THEN SUBSTR(" + column + "," + String.valueOf(token.length() + 2) + ")" + + " || ', " + token + "' " + ); + } + + order.append(" ELSE " + column + " END) "); + + return order.toString(); + } } + diff --git a/app/src/main/java/com/syncedsynapse/kore2/ui/AlbumListFragment.java b/app/src/main/java/com/syncedsynapse/kore2/ui/AlbumListFragment.java index d9e5176..339fd04 100644 --- a/app/src/main/java/com/syncedsynapse/kore2/ui/AlbumListFragment.java +++ b/app/src/main/java/com/syncedsynapse/kore2/ui/AlbumListFragment.java @@ -50,6 +50,7 @@ import com.syncedsynapse.kore2.host.HostManager; import com.syncedsynapse.kore2.jsonrpc.ApiException; import com.syncedsynapse.kore2.jsonrpc.event.MediaSyncEvent; import com.syncedsynapse.kore2.provider.MediaContract; +import com.syncedsynapse.kore2.provider.MediaDatabase; import com.syncedsynapse.kore2.service.LibrarySyncService; import com.syncedsynapse.kore2.utils.LogUtils; import com.syncedsynapse.kore2.utils.UIUtils; @@ -329,7 +330,7 @@ public class AlbumListFragment extends Fragment MediaContract.Albums.YEAR, }; - String SORT = MediaContract.Albums.TITLE + " ASC"; + String SORT = MediaDatabase.sortCommonTokens(MediaContract.Albums.TITLE) + " ASC"; final int ID = 0; final int ALBUMID = 1; diff --git a/app/src/main/java/com/syncedsynapse/kore2/ui/ArtistListFragment.java b/app/src/main/java/com/syncedsynapse/kore2/ui/ArtistListFragment.java index ff89e43..85c5294 100644 --- a/app/src/main/java/com/syncedsynapse/kore2/ui/ArtistListFragment.java +++ b/app/src/main/java/com/syncedsynapse/kore2/ui/ArtistListFragment.java @@ -50,6 +50,7 @@ import com.syncedsynapse.kore2.host.HostManager; import com.syncedsynapse.kore2.jsonrpc.ApiException; import com.syncedsynapse.kore2.jsonrpc.event.MediaSyncEvent; import com.syncedsynapse.kore2.provider.MediaContract; +import com.syncedsynapse.kore2.provider.MediaDatabase; import com.syncedsynapse.kore2.service.LibrarySyncService; import com.syncedsynapse.kore2.utils.LogUtils; import com.syncedsynapse.kore2.utils.UIUtils; @@ -295,7 +296,7 @@ public class ArtistListFragment extends Fragment MediaContract.Movies.THUMBNAIL, }; - String SORT = MediaContract.Artists.ARTIST + " ASC"; + String SORT = MediaDatabase.sortCommonTokens(MediaContract.Artists.ARTIST) + " ASC"; final int ID = 0; final int ARTISTID = 1; diff --git a/app/src/main/java/com/syncedsynapse/kore2/ui/MovieListFragment.java b/app/src/main/java/com/syncedsynapse/kore2/ui/MovieListFragment.java index e420bc0..f4dc771 100644 --- a/app/src/main/java/com/syncedsynapse/kore2/ui/MovieListFragment.java +++ b/app/src/main/java/com/syncedsynapse/kore2/ui/MovieListFragment.java @@ -51,6 +51,7 @@ import com.syncedsynapse.kore2.host.HostManager; import com.syncedsynapse.kore2.jsonrpc.ApiException; import com.syncedsynapse.kore2.jsonrpc.event.MediaSyncEvent; import com.syncedsynapse.kore2.provider.MediaContract; +import com.syncedsynapse.kore2.provider.MediaDatabase; import com.syncedsynapse.kore2.service.LibrarySyncService; import com.syncedsynapse.kore2.utils.LogUtils; import com.syncedsynapse.kore2.utils.UIUtils; @@ -335,7 +336,7 @@ public class MovieListFragment extends Fragment MediaContract.Movies.TAGLINE, }; - String SORT = MediaContract.Movies.TITLE + " ASC"; + String SORT = MediaDatabase.sortCommonTokens(MediaContract.Movies.TITLE) + " ASC"; final int ID = 0; final int MOVIEID = 1; diff --git a/app/src/main/java/com/syncedsynapse/kore2/ui/MusicVideoListFragment.java b/app/src/main/java/com/syncedsynapse/kore2/ui/MusicVideoListFragment.java index cbade88..07dff97 100644 --- a/app/src/main/java/com/syncedsynapse/kore2/ui/MusicVideoListFragment.java +++ b/app/src/main/java/com/syncedsynapse/kore2/ui/MusicVideoListFragment.java @@ -50,6 +50,7 @@ import com.syncedsynapse.kore2.host.HostManager; import com.syncedsynapse.kore2.jsonrpc.ApiException; import com.syncedsynapse.kore2.jsonrpc.event.MediaSyncEvent; import com.syncedsynapse.kore2.provider.MediaContract; +import com.syncedsynapse.kore2.provider.MediaDatabase; import com.syncedsynapse.kore2.service.LibrarySyncService; import com.syncedsynapse.kore2.utils.LogUtils; import com.syncedsynapse.kore2.utils.UIUtils; @@ -286,7 +287,7 @@ public class MusicVideoListFragment extends Fragment MediaContract.MusicVideos.GENRES, }; - String SORT = MediaContract.MusicVideos.TITLE + " ASC"; + String SORT = MediaDatabase.sortCommonTokens(MediaContract.MusicVideos.TITLE) + " ASC"; final int ID = 0; final int MUSICVIDEOID = 1; diff --git a/app/src/main/java/com/syncedsynapse/kore2/ui/TVShowListFragment.java b/app/src/main/java/com/syncedsynapse/kore2/ui/TVShowListFragment.java index d5270c6..f9c14f4 100644 --- a/app/src/main/java/com/syncedsynapse/kore2/ui/TVShowListFragment.java +++ b/app/src/main/java/com/syncedsynapse/kore2/ui/TVShowListFragment.java @@ -51,6 +51,7 @@ import com.syncedsynapse.kore2.host.HostManager; import com.syncedsynapse.kore2.jsonrpc.ApiException; import com.syncedsynapse.kore2.jsonrpc.event.MediaSyncEvent; import com.syncedsynapse.kore2.provider.MediaContract; +import com.syncedsynapse.kore2.provider.MediaDatabase; import com.syncedsynapse.kore2.service.LibrarySyncService; import com.syncedsynapse.kore2.utils.LogUtils; import com.syncedsynapse.kore2.utils.UIUtils; @@ -329,7 +330,7 @@ public class TVShowListFragment extends Fragment MediaContract.TVShows.WATCHEDEPISODES, }; - String SORT = MediaContract.TVShows.TITLE + " ASC"; + String SORT = MediaDatabase.sortCommonTokens(MediaContract.TVShows.TITLE) + " ASC"; final int ID = 0; final int TVSHOWID = 1;