From 6879c45b11946b2001cbf6e3edd10137f9d9d2f5 Mon Sep 17 00:00:00 2001 From: dikamilo Date: Sat, 18 Aug 2012 14:15:13 +0200 Subject: [PATCH 1/4] Add track title splits feature - list of text pharses that will be removed from track title --- res/layout/split_row.xml | 23 ++++ res/layout/splits_list.xml | 22 ++++ res/menu/view_splits.xml | 13 ++ res/menu/view_splits_context.xml | 9 ++ res/values/strings_splits.xml | 11 ++ src/com/adam/aslfms/SplitAddDialog.java | 46 +++++++ src/com/adam/aslfms/ViewSplitsActivity.java | 126 ++++++++++++++++++ src/com/adam/aslfms/util/SplitsDatabase.java | 132 +++++++++++++++++++ 8 files changed, 382 insertions(+) create mode 100644 res/layout/split_row.xml create mode 100644 res/layout/splits_list.xml create mode 100644 res/menu/view_splits.xml create mode 100644 res/menu/view_splits_context.xml create mode 100644 res/values/strings_splits.xml create mode 100644 src/com/adam/aslfms/SplitAddDialog.java create mode 100644 src/com/adam/aslfms/ViewSplitsActivity.java create mode 100644 src/com/adam/aslfms/util/SplitsDatabase.java diff --git a/res/layout/split_row.xml b/res/layout/split_row.xml new file mode 100644 index 00000000..8ac224fa --- /dev/null +++ b/res/layout/split_row.xml @@ -0,0 +1,23 @@ + + + + + + \ No newline at end of file diff --git a/res/layout/splits_list.xml b/res/layout/splits_list.xml new file mode 100644 index 00000000..806bdd85 --- /dev/null +++ b/res/layout/splits_list.xml @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/res/menu/view_splits.xml b/res/menu/view_splits.xml new file mode 100644 index 00000000..4a151052 --- /dev/null +++ b/res/menu/view_splits.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/res/menu/view_splits_context.xml b/res/menu/view_splits_context.xml new file mode 100644 index 00000000..82612b55 --- /dev/null +++ b/res/menu/view_splits_context.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/res/values/strings_splits.xml b/res/values/strings_splits.xml new file mode 100644 index 00000000..747bf662 --- /dev/null +++ b/res/values/strings_splits.xml @@ -0,0 +1,11 @@ + + + + Title Splits + List of track title splits + Title Splits + Add new title split + Enter new split text: + There are no title splits in database. + + \ No newline at end of file diff --git a/src/com/adam/aslfms/SplitAddDialog.java b/src/com/adam/aslfms/SplitAddDialog.java new file mode 100644 index 00000000..9ffccea5 --- /dev/null +++ b/src/com/adam/aslfms/SplitAddDialog.java @@ -0,0 +1,46 @@ +package com.adam.aslfms; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.database.Cursor; +import android.widget.EditText; + +import com.adam.aslfms.util.SplitsDatabase; + +public class SplitAddDialog { + @SuppressWarnings("unused") + private static final String TAG = "SplitAddDialog"; + + private final Context mCtx; + private final SplitsDatabase mDb; + private final Cursor mParentCursor; + + public SplitAddDialog(Context context, SplitsDatabase db, Cursor cursor) { + this.mCtx = context; + this.mDb = db; + this.mParentCursor = cursor; + } + + public void show() { + AlertDialog.Builder alert = new AlertDialog.Builder(mCtx); + + alert.setTitle(R.string.splits_add_title); + alert.setMessage(R.string.splits_add_message); + + final EditText input = new EditText(mCtx); + + alert.setView(input); + alert.setNegativeButton(R.string.add, new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + mDb.insertTitleSplit(input.getText().toString()); + mParentCursor.requery(); + } + }); + + alert.setPositiveButton(R.string.close, null); + alert.show(); + } +} diff --git a/src/com/adam/aslfms/ViewSplitsActivity.java b/src/com/adam/aslfms/ViewSplitsActivity.java new file mode 100644 index 00000000..45b2ce57 --- /dev/null +++ b/src/com/adam/aslfms/ViewSplitsActivity.java @@ -0,0 +1,126 @@ +package com.adam.aslfms; + +import com.adam.aslfms.util.SplitsDatabase; + +import android.app.ListActivity; +import android.content.Context; +import android.database.Cursor; +import android.os.Bundle; +import android.view.ContextMenu; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.view.ContextMenu.ContextMenuInfo; +import android.widget.CursorAdapter; +import android.widget.TextView; +import android.widget.AdapterView.AdapterContextMenuInfo; + +public class ViewSplitsActivity extends ListActivity { + @SuppressWarnings("unused") + private static final String TAG = "SplitsActivity"; + + private SplitsDatabase mDb; + + private Cursor mSplitsCursor = null; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setTitle(getString(R.string.splits_view_title)); + setContentView(R.layout.splits_list); + + mDb = new SplitsDatabase(this); + mDb.open(); + + fillData(); + registerForContextMenu(getListView()); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + mDb.close(); + } + + @Override + protected void onResume() { + super.onResume(); + + if (mSplitsCursor != null) + mSplitsCursor.requery(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.view_splits, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_splits_add: + new SplitAddDialog(this, mDb, mSplitsCursor).show(); + mSplitsCursor.requery(); + return true; + case R.id.menu_splits_clear: + mDb.clearAllSplits(); + mSplitsCursor.requery(); + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { + AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; + if (info.id < 0) + return; + + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.view_splits_context, menu); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); + switch (item.getItemId()) { + case R.id.menu_remove_split: + mDb.removeSplit(info.id); + mSplitsCursor.requery(); + return true; + } + return super.onContextItemSelected(item); + } + + private void fillData() { + mSplitsCursor = mDb.fetchAllSplitsCursor(); + + startManagingCursor(mSplitsCursor); + CursorAdapter adapter = new MyAdapter(this, mSplitsCursor); + setListAdapter(adapter); + } + + private class MyAdapter extends CursorAdapter { + public MyAdapter(Context context, Cursor c) { + super(context, c); + } + + @Override + public void bindView(View view, Context context, Cursor cursor) { + String name = cursor.getString(cursor.getColumnIndex("split")); + TextView nameView = (TextView) view.findViewById(R.id.name); + nameView.setText(name); + } + + @Override + public View newView(Context context, Cursor cursor, ViewGroup parent) { + return LayoutInflater.from(context).inflate(R.layout.split_row, parent, false); + } + } +} diff --git a/src/com/adam/aslfms/util/SplitsDatabase.java b/src/com/adam/aslfms/util/SplitsDatabase.java new file mode 100644 index 00000000..f782f897 --- /dev/null +++ b/src/com/adam/aslfms/util/SplitsDatabase.java @@ -0,0 +1,132 @@ +package com.adam.aslfms.util; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.SQLException; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + +public class SplitsDatabase { + private static final String TAG = "SplitsDatabase"; + + private SQLiteDatabase mDb; + + private final Context mCtx; + + private static final String DATABASE_NAME = "splits"; + private static final int DATABASE_VERSION = 6; + + private static final String TABLENAME_SPLITS = "splits"; + + private static final String DATABASE_CREATE_SPLITS = "create table splits (" + + "_id integer primary key autoincrement, " // + + "split text not null );"; + + public SplitsDatabase(Context ctx) { + this.mCtx = ctx; + } + + public void open() throws SQLException { + mDb = DatabaseHelper.getDatabase(mCtx.getApplicationContext()); + } + + public void close() { + DatabaseHelper.closeDatabase(); + } + + public long insertTitleSplit(String split) { + ContentValues vals = new ContentValues(); + vals.put("split", split); + + return mDb.insert(TABLENAME_SPLITS, null, vals); + } + + public Cursor fetchAllSplitsCursor() { + Cursor c; + String sql = "select * from splits"; + c = mDb.rawQuery(sql, null); + return c; + } + + public void clearAllSplits() { + mDb.delete(TABLENAME_SPLITS, null, null); + } + + public void removeSplit(long id) { + mDb.delete(TABLENAME_SPLITS, "_id = ?", new String[] { "" + id }); + } + + public String filterTrack(String track) { + String splitTitle = null; + + Cursor cursor = fetchAllSplitsCursor(); + + for (boolean hasItem = cursor.moveToFirst(); hasItem; hasItem = cursor.moveToNext()) { + splitTitle = cursor.getString(cursor.getColumnIndex("split")); + track = track.replace(splitTitle, ""); + } + + return track; + } + + private static class DatabaseHelper extends SQLiteOpenHelper { + + private DatabaseHelper(Context _context) { + super(_context, DATABASE_NAME, null, DATABASE_VERSION); + } + + private static class DatabaseConnection { + public Long connection_count = Long.valueOf(0); + public SQLiteDatabase db = null; + + DatabaseConnection() { + connection_count = Long.valueOf(0); + db = null; + } + } + + private static DatabaseConnection databaseConnection = new DatabaseConnection(); + + public static SQLiteDatabase getDatabase(Context _context) { + synchronized (databaseConnection) { + if (databaseConnection.db == null) { + DatabaseHelper dbh = new DatabaseHelper(_context.getApplicationContext()); + databaseConnection.db = dbh.getWritableDatabase(); + if (databaseConnection.db.isOpen() == false) { + Log.e(TAG, "Could not open ScrobblesDatabase"); + databaseConnection.db = null; + return null; + } + } + ++databaseConnection.connection_count; + return databaseConnection.db; + } + } + + public static void closeDatabase() { + synchronized (databaseConnection) { + --databaseConnection.connection_count; + if (databaseConnection.connection_count == 0) { + databaseConnection.db.close(); + databaseConnection.db = null; + } + } + } + + @Override + public void onCreate(SQLiteDatabase db) { + Log.d(TAG, "create sql splits: " + DATABASE_CREATE_SPLITS); + db.execSQL(DATABASE_CREATE_SPLITS); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + Log.w(TAG, "Upgrading scrobbles database from version " + oldVersion + " to " + newVersion + + ", which will destroy all old data"); + db.execSQL("DROP TABLE IF EXISTS " + TABLENAME_SPLITS); + onCreate(db); + } + } +} From 9cf283fd8c2fc750ecba4cfa599e1370ee7749b5 Mon Sep 17 00:00:00 2001 From: dikamilo Date: Sat, 18 Aug 2012 14:38:12 +0200 Subject: [PATCH 2/4] Add missing changes --- src/com/adam/aslfms/StatusInfoNetApp.java | 3 --- .../adam/aslfms/receiver/BuiltInMusicAppReceiver.java | 2 +- src/com/adam/aslfms/receiver/LastFmAPIReceiver.java | 2 +- src/com/adam/aslfms/receiver/RdioMusicReceiver.java | 2 +- src/com/adam/aslfms/receiver/SLSAPIReceiver.java | 2 +- .../aslfms/receiver/ScrobbleDroidMusicReceiver.java | 2 +- src/com/adam/aslfms/util/ScrobblesDatabase.java | 2 +- src/com/adam/aslfms/util/Track.java | 10 ++++++++-- 8 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/com/adam/aslfms/StatusInfoNetApp.java b/src/com/adam/aslfms/StatusInfoNetApp.java index 53824088..f98d1894 100644 --- a/src/com/adam/aslfms/StatusInfoNetApp.java +++ b/src/com/adam/aslfms/StatusInfoNetApp.java @@ -25,15 +25,12 @@ import android.app.ListActivity; import android.content.BroadcastReceiver; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; diff --git a/src/com/adam/aslfms/receiver/BuiltInMusicAppReceiver.java b/src/com/adam/aslfms/receiver/BuiltInMusicAppReceiver.java index 2c839bf2..92b19a08 100644 --- a/src/com/adam/aslfms/receiver/BuiltInMusicAppReceiver.java +++ b/src/com/adam/aslfms/receiver/BuiltInMusicAppReceiver.java @@ -66,7 +66,7 @@ protected void parseIntent(Context ctx, String action, Bundle bundle) MusicAPI musicAPI = getMusicAPI(ctx, bundle); setMusicAPI(musicAPI); - Track.Builder b = new Track.Builder(); + Track.Builder b = new Track.Builder(ctx); b.setMusicAPI(musicAPI); b.setWhen(Util.currentTimeSecsUTC()); diff --git a/src/com/adam/aslfms/receiver/LastFmAPIReceiver.java b/src/com/adam/aslfms/receiver/LastFmAPIReceiver.java index c51d9a34..f3e0b0a9 100644 --- a/src/com/adam/aslfms/receiver/LastFmAPIReceiver.java +++ b/src/com/adam/aslfms/receiver/LastFmAPIReceiver.java @@ -51,7 +51,7 @@ protected void parseIntent(Context ctx, String action, Bundle bundle) throws Ill if (action.equals(ACTION_LASTFMAPI_START)) { setState(Track.State.START); - Track.Builder b = new Track.Builder(); + Track.Builder b = new Track.Builder(ctx); b.setMusicAPI(musicAPI); b.setWhen(Util.currentTimeSecsUTC()); diff --git a/src/com/adam/aslfms/receiver/RdioMusicReceiver.java b/src/com/adam/aslfms/receiver/RdioMusicReceiver.java index 25af0b90..60aa235f 100644 --- a/src/com/adam/aslfms/receiver/RdioMusicReceiver.java +++ b/src/com/adam/aslfms/receiver/RdioMusicReceiver.java @@ -59,7 +59,7 @@ else if (isPaused) else setState(Track.State.COMPLETE); - Track.Builder b = new Track.Builder(); + Track.Builder b = new Track.Builder(ctx); b.setMusicAPI(musicAPI); b.setWhen(Util.currentTimeSecsUTC()); diff --git a/src/com/adam/aslfms/receiver/SLSAPIReceiver.java b/src/com/adam/aslfms/receiver/SLSAPIReceiver.java index dd7aaeef..72d829c8 100644 --- a/src/com/adam/aslfms/receiver/SLSAPIReceiver.java +++ b/src/com/adam/aslfms/receiver/SLSAPIReceiver.java @@ -95,7 +95,7 @@ else if (state == STATE_COMPLETE) else throw new IllegalArgumentException("bad state: " + state); - Track.Builder b = new Track.Builder(); + Track.Builder b = new Track.Builder(ctx); b.setMusicAPI(musicAPI); b.setWhen(Util.currentTimeSecsUTC()); // artist name, required diff --git a/src/com/adam/aslfms/receiver/ScrobbleDroidMusicReceiver.java b/src/com/adam/aslfms/receiver/ScrobbleDroidMusicReceiver.java index 47a23ee7..95e60468 100644 --- a/src/com/adam/aslfms/receiver/ScrobbleDroidMusicReceiver.java +++ b/src/com/adam/aslfms/receiver/ScrobbleDroidMusicReceiver.java @@ -83,7 +83,7 @@ protected void parseIntent(Context ctx, String action, Bundle bundle) } int msid = bundle.getInt("id", -1); - Track.Builder b = new Track.Builder(); + Track.Builder b = new Track.Builder(ctx); b.setMusicAPI(musicAPI); b.setWhen(Util.currentTimeSecsUTC()); diff --git a/src/com/adam/aslfms/util/ScrobblesDatabase.java b/src/com/adam/aslfms/util/ScrobblesDatabase.java index 9b102bf2..2ea08034 100644 --- a/src/com/adam/aslfms/util/ScrobblesDatabase.java +++ b/src/com/adam/aslfms/util/ScrobblesDatabase.java @@ -213,7 +213,7 @@ public boolean cleanUpTracks() { } private Track readTrack(Cursor c) { - Track.Builder b = new Track.Builder(); + Track.Builder b = new Track.Builder(mCtx); b.setMusicAPI(MusicAPI.fromDatabase(mCtx, c.getLong(c .getColumnIndex("musicapp")))); b.setArtist(c.getString(c.getColumnIndex("artist"))); diff --git a/src/com/adam/aslfms/util/Track.java b/src/com/adam/aslfms/util/Track.java index 3807dbda..c1875f63 100644 --- a/src/com/adam/aslfms/util/Track.java +++ b/src/com/adam/aslfms/util/Track.java @@ -19,6 +19,7 @@ package com.adam.aslfms.util; +import android.content.Context; import android.os.SystemClock; import com.adam.aslfms.receiver.MusicAPI; @@ -96,9 +97,12 @@ public enum State { */ public static class Builder { Track _track; + SplitsDatabase _db; - public Builder() { + public Builder(Context context) { _track = new Track(); + _db = new SplitsDatabase(context); + _db.open(); } public void setMusicAPI(MusicAPI musicAPI) { @@ -114,7 +118,8 @@ public void setAlbum(String album) { } public void setTrack(String track) { - _track.mTrack = track; + //_track.mTrack = track; + _track.mTrack = _db.filterTrack(track); } public void setDuration(int duration) { @@ -156,6 +161,7 @@ public void setRowId(int rowId) { */ public Track build() throws IllegalArgumentException { _track.validate(); + _db.close(); return _track; } } From 4440ff55a1a8b60cf99331614671aa6d44447627 Mon Sep 17 00:00:00 2001 From: dikamilo Date: Sat, 18 Aug 2012 14:53:11 +0200 Subject: [PATCH 3/4] Add missing string --- res/menu/view_splits.xml | 2 +- res/values/strings.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/res/menu/view_splits.xml b/res/menu/view_splits.xml index 4a151052..da949714 100644 --- a/res/menu/view_splits.xml +++ b/res/menu/view_splits.xml @@ -1,6 +1,6 @@ - + Also disable now-playing [Hmpf] + Add From 9eee4c181cc2e9c5177a5ac2bb4ea25d8c959603 Mon Sep 17 00:00:00 2001 From: dikamilo Date: Sat, 18 Aug 2012 14:59:39 +0200 Subject: [PATCH 4/4] Add missing xml changes --- AndroidManifest.xml | 2 ++ res/xml/settings_prefs.xml | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index a136defc..b64c7ef8 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -48,6 +48,8 @@ + + + + + +