From b04edf6a2e4dd645e084fe1d958bb26e130c3517 Mon Sep 17 00:00:00 2001 From: casey langen Date: Tue, 22 Aug 2017 00:47:23 -0700 Subject: [PATCH] Added a bunch of annoying scaffholding for saving and showing connection presets. Still some work to go. --- .../app/src/main/AndroidManifest.xml | 5 +- .../io/casey/musikcube/remote/Application.kt | 11 ++- .../remote/db/connections/Connection.kt | 15 ++++ .../remote/db/connections/ConnectionsDao.java | 20 +++++ .../remote/db/connections/ConnectionsDb.kt | 9 ++ .../remote/{ => db}/offline/OfflineDb.kt | 2 +- .../remote/{ => db}/offline/OfflineTrack.kt | 2 +- .../{ => db}/offline/OfflineTrackDao.java | 2 +- .../remote/injection/MainComponent.kt | 2 +- .../remote/playback/PlayerWrapper.kt | 2 +- .../remote/ui/activity/ConnectionsActivity.kt | 89 +++++++++++++++++-- .../remote/ui/activity/SettingsActivity.kt | 73 ++++++++++++--- .../main/res/layout/activity_conneections.xml | 8 +- .../src/main/res/layout/connection_row.xml | 21 +++++ .../app/src/main/res/menu/settings_menu.xml | 10 +++ .../app/src/main/res/values/strings.xml | 3 + 16 files changed, 248 insertions(+), 26 deletions(-) create mode 100644 src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/connections/Connection.kt create mode 100644 src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/connections/ConnectionsDao.java create mode 100644 src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/connections/ConnectionsDb.kt rename src/musikdroid/app/src/main/java/io/casey/musikcube/remote/{ => db}/offline/OfflineDb.kt (98%) rename src/musikdroid/app/src/main/java/io/casey/musikcube/remote/{ => db}/offline/OfflineTrack.kt (98%) rename src/musikdroid/app/src/main/java/io/casey/musikcube/remote/{ => db}/offline/OfflineTrackDao.java (98%) create mode 100644 src/musikdroid/app/src/main/res/layout/connection_row.xml diff --git a/src/musikdroid/app/src/main/AndroidManifest.xml b/src/musikdroid/app/src/main/AndroidManifest.xml index e1f9e71ea..5a01c05f7 100644 --- a/src/musikdroid/app/src/main/AndroidManifest.xml +++ b/src/musikdroid/app/src/main/AndroidManifest.xml @@ -56,8 +56,9 @@ android:screenOrientation="portrait" android:windowSoftInputMode="adjustResize" /> - diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/Application.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/Application.kt index 853473c66..f6103ef29 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/Application.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/Application.kt @@ -3,10 +3,11 @@ package io.casey.musikcube.remote import android.arch.persistence.room.Room import com.crashlytics.android.Crashlytics import com.facebook.stetho.Stetho +import io.casey.musikcube.remote.db.connections.ConnectionsDb +import io.casey.musikcube.remote.db.offline.OfflineDb import io.casey.musikcube.remote.injection.DaggerMainComponent import io.casey.musikcube.remote.injection.MainComponent import io.casey.musikcube.remote.injection.MainModule -import io.casey.musikcube.remote.offline.OfflineDb import io.casey.musikcube.remote.playback.StreamProxy import io.casey.musikcube.remote.util.NetworkUtil import io.fabric.sdk.android.Fabric @@ -33,6 +34,11 @@ class Application : android.app.Application() { applicationContext, OfflineDb::class.java, "offline").build() + + connectionsDb = Room.databaseBuilder( + applicationContext, + ConnectionsDb::class.java, + "connections").build() } companion object { @@ -43,5 +49,8 @@ class Application : android.app.Application() { var offlineDb: OfflineDb? = null private set + + var connectionsDb: ConnectionsDb? = null + private set } } diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/connections/Connection.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/connections/Connection.kt new file mode 100644 index 000000000..29395db3d --- /dev/null +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/connections/Connection.kt @@ -0,0 +1,15 @@ +package io.casey.musikcube.remote.db.connections + +import android.arch.persistence.room.Entity +import android.arch.persistence.room.PrimaryKey + +@Entity +class Connection { + @PrimaryKey var name: String = "" + var hostname: String = "" + var password: String = "" + var httpPort: Int = 7905 + var wssPort: Int = 7906 + var ssl: Boolean = false + var noValidate: Boolean = true +} diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/connections/ConnectionsDao.java b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/connections/ConnectionsDao.java new file mode 100644 index 000000000..e96f96e5a --- /dev/null +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/connections/ConnectionsDao.java @@ -0,0 +1,20 @@ +package io.casey.musikcube.remote.db.connections; + +import android.arch.persistence.room.Dao; +import android.arch.persistence.room.Insert; +import android.arch.persistence.room.OnConflictStrategy; +import android.arch.persistence.room.Query; + +import java.util.List; + +@Dao +public interface ConnectionsDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + void insertConnection(Connection... connections); + + @Query("SELECT * FROM Connection ORDER BY LOWER(name)") + List queryConnections(); + + @Query("SELECT * FROM Connection WHERE name=:name") + Connection queryConnection(String name); +} diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/connections/ConnectionsDb.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/connections/ConnectionsDb.kt new file mode 100644 index 000000000..549339dbe --- /dev/null +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/connections/ConnectionsDb.kt @@ -0,0 +1,9 @@ +package io.casey.musikcube.remote.db.connections + +import android.arch.persistence.room.Database +import android.arch.persistence.room.RoomDatabase + +@Database(entities = arrayOf(Connection::class), version = 1) +abstract class ConnectionsDb : RoomDatabase() { + abstract fun connectionsDao(): ConnectionsDao +} diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineDb.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/offline/OfflineDb.kt similarity index 98% rename from src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineDb.kt rename to src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/offline/OfflineDb.kt index bbf83e704..07cc71e20 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineDb.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/offline/OfflineDb.kt @@ -1,4 +1,4 @@ -package io.casey.musikcube.remote.offline +package io.casey.musikcube.remote.db.offline import android.arch.persistence.room.Database import android.arch.persistence.room.RoomDatabase diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineTrack.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/offline/OfflineTrack.kt similarity index 98% rename from src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineTrack.kt rename to src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/offline/OfflineTrack.kt index b9c305519..73319672e 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineTrack.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/offline/OfflineTrack.kt @@ -1,4 +1,4 @@ -package io.casey.musikcube.remote.offline +package io.casey.musikcube.remote.db.offline import android.arch.persistence.room.Entity import android.arch.persistence.room.PrimaryKey diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineTrackDao.java b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/offline/OfflineTrackDao.java similarity index 98% rename from src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineTrackDao.java rename to src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/offline/OfflineTrackDao.java index 54a4ff638..52d2193a3 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/offline/OfflineTrackDao.java +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/db/offline/OfflineTrackDao.java @@ -1,4 +1,4 @@ -package io.casey.musikcube.remote.offline; +package io.casey.musikcube.remote.db.offline; import android.arch.persistence.room.Dao; import android.arch.persistence.room.Insert; diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/injection/MainComponent.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/injection/MainComponent.kt index 3ef83693e..ba8727a38 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/injection/MainComponent.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/injection/MainComponent.kt @@ -2,7 +2,7 @@ package io.casey.musikcube.remote.injection import dagger.Component import io.casey.musikcube.remote.MainActivity -import io.casey.musikcube.remote.offline.OfflineDb +import io.casey.musikcube.remote.db.offline.OfflineDb import io.casey.musikcube.remote.playback.RemotePlaybackService import io.casey.musikcube.remote.playback.StreamingPlaybackService import io.casey.musikcube.remote.ui.activity.* diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/playback/PlayerWrapper.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/playback/PlayerWrapper.kt index 1abc79819..9a66c3328 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/playback/PlayerWrapper.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/playback/PlayerWrapper.kt @@ -1,7 +1,7 @@ package io.casey.musikcube.remote.playback import io.casey.musikcube.remote.Application -import io.casey.musikcube.remote.offline.OfflineTrack +import io.casey.musikcube.remote.db.offline.OfflineTrack import io.casey.musikcube.remote.util.Preconditions import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/activity/ConnectionsActivity.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/activity/ConnectionsActivity.kt index 99549456b..f290cfdbe 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/activity/ConnectionsActivity.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/activity/ConnectionsActivity.kt @@ -1,16 +1,93 @@ package io.casey.musikcube.remote.ui.activity +import android.content.Context +import android.content.Intent import android.os.Bundle -import android.support.v7.app.AppCompatActivity +import android.support.v7.widget.LinearLayoutManager +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import com.uacf.taskrunner.Task +import com.uacf.taskrunner.Tasks import io.casey.musikcube.remote.Application +import io.casey.musikcube.remote.R +import io.casey.musikcube.remote.db.connections.Connection +import io.casey.musikcube.remote.websocket.WebSocketService -/** - * Created by casey on 8/21/2017. - */ +class ConnectionsActivity : WebSocketActivityBase() { + private lateinit var recycler: RecyclerView + private lateinit var adapter: Adapter -class ConnectionsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { - Application.mainComponent.inject(this); + Application.mainComponent.inject(this) super.onCreate(savedInstanceState) + setContentView(R.layout.activity_conneections) + recycler = findViewById(R.id.recycler_view) + recycler.layoutManager = LinearLayoutManager(this) + adapter = Adapter() + recycler.adapter = adapter + } + + override fun onResume() { + super.onResume() + runner.run(LoadTask.NAME, LoadTask()) + } + + override val webSocketServiceClient: WebSocketService.Client? + get() = null + + override val playbackServiceEventListener: (() -> Unit)? + get() = null + + override fun onTaskCompleted(taskName: String, taskId: Long, task: Task<*, *>, result: Any) { + if (taskName == LoadTask.NAME) { + adapter.items = (result!! as List) + adapter.notifyDataSetChanged() + } + } + + companion object { + fun getStartIntent(context: Context): Intent { + return Intent(context, ConnectionsActivity::class.java) + } + } +} + +private class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + var name: TextView = itemView.findViewById(R.id.name) + var address: TextView = itemView.findViewById(R.id.hostname) + + fun rebind(connection: Connection) { + name.text = connection.name + address.text = connection.hostname + } +} + +private class Adapter : RecyclerView.Adapter() { + var items = listOf() + + override fun onBindViewHolder(holder: ViewHolder?, position: Int) { + holder?.rebind(items[position]) + } + + override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder { + return ViewHolder(LayoutInflater.from(parent?.context) + .inflate(R.layout.connection_row, parent, false)) + } + + override fun getItemCount(): Int { + return items.size + } +} + +private class LoadTask : Tasks.Blocking, Exception>() { + override fun exec(context: Context?): List { + return Application.connectionsDb?.connectionsDao()?.queryConnections()!! + } + + companion object { + val NAME = "LoadTask" } } \ No newline at end of file diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/activity/SettingsActivity.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/activity/SettingsActivity.kt index 6f809010c..354c33f73 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/activity/SettingsActivity.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/activity/SettingsActivity.kt @@ -8,12 +8,13 @@ import android.net.Uri import android.os.Bundle import android.support.v4.app.DialogFragment import android.support.v7.app.AlertDialog -import android.support.v7.app.AppCompatActivity import android.view.Menu import android.view.MenuItem import android.widget.* +import com.uacf.taskrunner.Tasks import io.casey.musikcube.remote.Application import io.casey.musikcube.remote.R +import io.casey.musikcube.remote.db.connections.Connection import io.casey.musikcube.remote.playback.PlayerWrapper import io.casey.musikcube.remote.playback.StreamProxy import io.casey.musikcube.remote.ui.extension.enableUpNavigation @@ -22,11 +23,10 @@ import io.casey.musikcube.remote.ui.extension.setTextAndMoveCursorToEnd import io.casey.musikcube.remote.websocket.Prefs import io.casey.musikcube.remote.websocket.WebSocketService import java.util.* -import javax.inject.Inject import io.casey.musikcube.remote.websocket.Prefs.Default as Defaults import io.casey.musikcube.remote.websocket.Prefs.Key as Keys -class SettingsActivity : AppCompatActivity() { +class SettingsActivity : WebSocketActivityBase() { private lateinit var addressText: EditText private lateinit var portText: EditText private lateinit var httpPortText: EditText @@ -40,8 +40,6 @@ class SettingsActivity : AppCompatActivity() { private lateinit var cacheSpinner: Spinner private lateinit var prefs: SharedPreferences - @Inject lateinit var wss: WebSocketService - override fun onCreate(savedInstanceState: Bundle?) { Application.mainComponent.inject(this) super.onCreate(savedInstanceState) @@ -58,12 +56,26 @@ class SettingsActivity : AppCompatActivity() { } override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (item.itemId == android.R.id.home) { - finish() - return true - } else if (item.itemId == R.id.action_save) { - save() - return true + when (item.itemId) { + android.R.id.home -> { + finish() + return true + } + + R.id.action_save -> { + save() + return true + } + + R.id.action_save_as -> { + saveAs() + return true + } + + R.id.action_connections -> { + startActivity(ConnectionsActivity.getStartIntent(this)) + return true + } } return super.onOptionsItemSelected(item) @@ -158,6 +170,23 @@ class SettingsActivity : AppCompatActivity() { this.certCheckbox = findViewById(R.id.cert_validation) } + private fun saveAs() { + try { + val connection = Connection() + connection.name = "foo" + connection.hostname = addressText.text.toString() + connection.wssPort = portText.text.toString().toInt() + connection.httpPort = httpPortText.text.toString().toInt() + connection.password = passwordText.text.toString() + connection.ssl = sslCheckbox.isChecked + connection.noValidate = certCheckbox.isChecked + runner.run("${SaveAsTask.NAME}.${connection.name}", SaveAsTask(connection)) + } + catch (ex: NumberFormatException) { + /* TODO dialog */ + } + } + private fun save() { val addr = addressText.text.toString() val port = portText.text.toString() @@ -188,6 +217,12 @@ class SettingsActivity : AppCompatActivity() { finish() } + override val webSocketServiceClient: WebSocketService.Client? + get() = null + + override val playbackServiceEventListener: (() -> Unit)? + get() = null + class SslAlertDialog : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val dlg = AlertDialog.Builder(activity) @@ -251,3 +286,19 @@ class SettingsActivity : AppCompatActivity() { } } } + +private class SaveAsTask : Tasks.Blocking { + var connection: Connection + + constructor(connection: Connection) { + this.connection = connection + } + + override fun exec(context: Context?) { + Application.connectionsDb?.connectionsDao()?.insertConnection(connection) + } + + companion object { + val NAME = "SaveAsTask" + } +} diff --git a/src/musikdroid/app/src/main/res/layout/activity_conneections.xml b/src/musikdroid/app/src/main/res/layout/activity_conneections.xml index 3509b8411..9e2be76c2 100644 --- a/src/musikdroid/app/src/main/res/layout/activity_conneections.xml +++ b/src/musikdroid/app/src/main/res/layout/activity_conneections.xml @@ -1,6 +1,12 @@ - + + \ No newline at end of file diff --git a/src/musikdroid/app/src/main/res/layout/connection_row.xml b/src/musikdroid/app/src/main/res/layout/connection_row.xml new file mode 100644 index 000000000..533a098a2 --- /dev/null +++ b/src/musikdroid/app/src/main/res/layout/connection_row.xml @@ -0,0 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/src/musikdroid/app/src/main/res/menu/settings_menu.xml b/src/musikdroid/app/src/main/res/menu/settings_menu.xml index c3f527672..951e9a42b 100644 --- a/src/musikdroid/app/src/main/res/menu/settings_menu.xml +++ b/src/musikdroid/app/src/main/res/menu/settings_menu.xml @@ -8,4 +8,14 @@ app:showAsAction="always" android:title="@string/button_save"/> + + + + \ No newline at end of file diff --git a/src/musikdroid/app/src/main/res/values/strings.xml b/src/musikdroid/app/src/main/res/values/strings.xml index 82e6c2c79..ba5aa53bb 100644 --- a/src/musikdroid/app/src/main/res/values/strings.xml +++ b/src/musikdroid/app/src/main/res/values/strings.xml @@ -10,6 +10,7 @@ genres artists playlists + connections pause play prev @@ -57,6 +58,8 @@ playlists remote playback offline songs + save as + connections <unknown> switched to streaming mode switched to remote control mode