package code.name.monkey.retromusic.providers; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.os.Environment; import androidx.annotation.NonNull; import java.io.File; import java.util.ArrayList; import java.util.List; import code.name.monkey.retromusic.App; import code.name.monkey.retromusic.model.Album; import code.name.monkey.retromusic.model.Artist; import code.name.monkey.retromusic.model.Genre; import code.name.monkey.retromusic.model.Home; import code.name.monkey.retromusic.model.Playlist; import code.name.monkey.retromusic.model.Song; import code.name.monkey.retromusic.util.FileUtil; import code.name.monkey.retromusic.util.PreferenceUtil; import io.reactivex.Observable; import io.reactivex.functions.Function7; import static code.name.monkey.retromusic.Constants.MEDIA_STORE_CHANGED; import static code.name.monkey.retromusic.ui.adapter.HomeAdapter.RECENT_ALBUMS; import static code.name.monkey.retromusic.ui.adapter.HomeAdapter.SUGGESTIONS; public class BlacklistStore extends SQLiteOpenHelper { public static final String DATABASE_NAME = "blacklist.db"; private static final int VERSION = 2; private static BlacklistStore sInstance = null; private Context context; public BlacklistStore(final Context context) { super(context, DATABASE_NAME, null, VERSION); this.context = context; } @NonNull public static synchronized BlacklistStore getInstance(@NonNull final Context context) { if (sInstance == null) { sInstance = new BlacklistStore(context.getApplicationContext()); if (!PreferenceUtil.getInstance().initializedBlacklist()) { // blacklisted by default sInstance.addPathImpl(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS)); sInstance.addPathImpl(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS)); sInstance.addPathImpl(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES)); PreferenceUtil.getInstance().setInitializedBlacklist(); } } return sInstance; } @Override public void onCreate(@NonNull final SQLiteDatabase db) { db.execSQL("CREATE TABLE IF NOT EXISTS " + BlacklistStoreColumns.NAME + " (" + BlacklistStoreColumns.PATH + " STRING NOT NULL);"); } @Override public void onUpgrade(@NonNull final SQLiteDatabase db, final int oldVersion, final int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + BlacklistStoreColumns.NAME); onCreate(db); } @Override public void onDowngrade(@NonNull SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + BlacklistStoreColumns.NAME); onCreate(db); } public void addPath(File file) { addPathImpl(file); notifyMediaStoreChanged(); } private void addPathImpl(File file) { if (file == null || contains(file)) { return; } String path = FileUtil.safeGetCanonicalPath(file); final SQLiteDatabase database = getWritableDatabase(); database.beginTransaction(); try { // add the entry final ContentValues values = new ContentValues(1); values.put(BlacklistStoreColumns.PATH, path); database.insert(BlacklistStoreColumns.NAME, null, values); database.setTransactionSuccessful(); } finally { database.endTransaction(); } } public boolean contains(File file) { if (file == null) { return false; } String path = FileUtil.safeGetCanonicalPath(file); final SQLiteDatabase database = getReadableDatabase(); Cursor cursor = database.query(BlacklistStoreColumns.NAME, new String[]{BlacklistStoreColumns.PATH}, BlacklistStoreColumns.PATH + "=?", new String[]{path}, null, null, null, null); boolean containsPath = cursor != null && cursor.moveToFirst(); if (cursor != null) { cursor.close(); } return containsPath; } public void removePath(File file) { final SQLiteDatabase database = getWritableDatabase(); String path = FileUtil.safeGetCanonicalPath(file); database.delete(BlacklistStoreColumns.NAME, BlacklistStoreColumns.PATH + "=?", new String[]{path}); notifyMediaStoreChanged(); } public void clear() { final SQLiteDatabase database = getWritableDatabase(); database.delete(BlacklistStoreColumns.NAME, null, null); notifyMediaStoreChanged(); } private void notifyMediaStoreChanged() { context.sendBroadcast(new Intent(MEDIA_STORE_CHANGED)); } @NonNull public ArrayList getPaths() { Cursor cursor = getReadableDatabase().query(BlacklistStoreColumns.NAME, new String[]{BlacklistStoreColumns.PATH}, null, null, null, null, null); ArrayList paths = new ArrayList<>(); if (cursor != null && cursor.moveToFirst()) { do { paths.add(cursor.getString(0)); } while (cursor.moveToNext()); } if (cursor != null) cursor.close(); return paths; } private void hmm() { RepositoryImpl repository = new RepositoryImpl(App.Companion.getContext()); Observable.combineLatest(repository.getSuggestionSongs(), repository.getRecentAlbums(), repository.getTopAlbums(), repository.getRecentArtists(), repository.getTopArtists(), repository.getAllGenres(), repository.getAllPlaylists(), new Function7, ArrayList, ArrayList, ArrayList, ArrayList, ArrayList, ArrayList, List>() { @Override public List apply(ArrayList songs, ArrayList albums, ArrayList albums2, ArrayList artists, ArrayList artists2, ArrayList genres, ArrayList playlists) throws Exception { List homes = new ArrayList<>(); homes.add(new Home(0, 0, songs, SUGGESTIONS)); homes.add(new Home(0, 0, albums, RECENT_ALBUMS)); return homes; } }).subscribe(homes -> { if (homes.isEmpty()) { } }); Observable.combineLatest( repository.getSuggestionSongs(), repository.getRecentAlbums(), repository.getTopAlbums(), repository.getRecentArtists(), repository.getTopArtists(), repository.getAllGenres(), repository.getAllPlaylists(), (ArrayList suggestions, ArrayList recentAlbums, ArrayList topAlbums, ArrayList recentArtists, ArrayList topArtists, ArrayList genres, ArrayList playlists) -> { List homes = new ArrayList<>(); return homes; }).subscribe(); } public interface BlacklistStoreColumns { String NAME = "blacklist"; String PATH = "path"; } }