From ffa381334a24c0f5ba648d9e65b22ded449d7ee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Sun, 27 Oct 2019 17:41:54 +0100 Subject: [PATCH] Add Manual Host Editing on Android --- android/app/src/main/AndroidManifest.xml | 2 +- .../com/metallic/chiaki/common/ManualHost.kt | 26 +++++++++++ .../metallic/chiaki/common/ext/RxLiveData.kt | 4 +- .../main/DisplayHostRecyclerViewAdapter.kt | 41 ++++++++++++++++- .../com/metallic/chiaki/main/MainActivity.kt | 45 +++++++++++++++---- .../com/metallic/chiaki/main/MainViewModel.kt | 16 +++++-- ...tivity.kt => EditManualConsoleActivity.kt} | 29 ++++++++---- ...Model.kt => EditManualConsoleViewModel.kt} | 31 ++++++++++++- .../metallic/chiaki/regist/RegistActivity.kt | 3 ++ .../chiaki/regist/RegistExecuteActivity.kt | 7 ++- .../chiaki/regist/RegistExecuteViewModel.kt | 17 ++++++- .../SettingsRegisteredHostsFragment.kt | 4 +- .../app/src/main/res/drawable/ic_overflow.xml | 9 ++++ ...dd_manual.xml => activity_edit_manual.xml} | 2 +- .../app/src/main/res/layout/activity_main.xml | 2 +- .../src/main/res/layout/item_display_host.xml | 10 +++++ .../app/src/main/res/menu/display_host.xml | 9 ++++ android/app/src/main/res/values/strings.xml | 8 ++-- 18 files changed, 230 insertions(+), 35 deletions(-) rename android/app/src/main/java/com/metallic/chiaki/manualconsole/{AddManualConsoleActivity.kt => EditManualConsoleActivity.kt} (82%) rename android/app/src/main/java/com/metallic/chiaki/manualconsole/{AddManualConsoleViewModel.kt => EditManualConsoleViewModel.kt} (62%) create mode 100644 android/app/src/main/res/drawable/ic_overflow.xml rename android/app/src/main/res/layout/{activity_add_manual.xml => activity_edit_manual.xml} (98%) create mode 100644 android/app/src/main/res/menu/display_host.xml diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 3708e74..ddfd9f9 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -44,7 +44,7 @@ android:configChanges="keyboard|keyboardHidden|orientation|screenSize" /> diff --git a/android/app/src/main/java/com/metallic/chiaki/common/ManualHost.kt b/android/app/src/main/java/com/metallic/chiaki/common/ManualHost.kt index ecc5ca5..c265848 100644 --- a/android/app/src/main/java/com/metallic/chiaki/common/ManualHost.kt +++ b/android/app/src/main/java/com/metallic/chiaki/common/ManualHost.kt @@ -21,6 +21,7 @@ import androidx.room.* import androidx.room.ForeignKey.SET_NULL import io.reactivex.Completable import io.reactivex.Flowable +import io.reactivex.Single @Entity(tableName = "manual_host", foreignKeys = [ @@ -37,12 +38,37 @@ data class ManualHost( @ColumnInfo(name = "registered_host") val registeredHost: Long? ) +data class ManualHostAndRegisteredHost( + @Embedded(prefix = "manual_host_") val manualHost: ManualHost, + @Embedded val registeredHost: RegisteredHost? +) + @Dao interface ManualHostDao { + @Query("SELECT * FROM manual_host WHERE id = :id") + fun getById(id: Long): Single + + @Query("""SELECT + manual_host.id as manual_host_id, + manual_host.host as manual_host_host, + manual_host.registered_host as manual_host_registered_host, + registered_host.* + FROM manual_host LEFT OUTER JOIN registered_host ON manual_host.registered_host = registered_host.id WHERE manual_host.id = :id""") + fun getByIdWithRegisteredHost(id: Long): Single + @Query("SELECT * FROM manual_host") fun getAll(): Flowable> + @Query("UPDATE manual_host SET registered_host = :registeredHostId WHERE id = :manualHostId") + fun assignRegisteredHost(manualHostId: Long, registeredHostId: Long?): Completable + @Insert fun insert(host: ManualHost): Completable + + @Delete + fun delete(host: ManualHost): Completable + + @Update + fun update(host: ManualHost): Completable } \ No newline at end of file diff --git a/android/app/src/main/java/com/metallic/chiaki/common/ext/RxLiveData.kt b/android/app/src/main/java/com/metallic/chiaki/common/ext/RxLiveData.kt index 04ef832..6dc5ebf 100644 --- a/android/app/src/main/java/com/metallic/chiaki/common/ext/RxLiveData.kt +++ b/android/app/src/main/java/com/metallic/chiaki/common/ext/RxLiveData.kt @@ -20,7 +20,9 @@ package com.metallic.chiaki.common.ext import androidx.lifecycle.LiveDataReactiveStreams import io.reactivex.BackpressureStrategy import io.reactivex.Observable +import io.reactivex.Single import org.reactivestreams.Publisher fun Publisher.toLiveData() = LiveDataReactiveStreams.fromPublisher(this) -fun Observable.toLiveData() = this.toFlowable(BackpressureStrategy.LATEST).toLiveData() \ No newline at end of file +fun Observable.toLiveData() = this.toFlowable(BackpressureStrategy.LATEST).toLiveData() +fun Single.toLiveData() = this.toFlowable().toLiveData() \ No newline at end of file diff --git a/android/app/src/main/java/com/metallic/chiaki/main/DisplayHostRecyclerViewAdapter.kt b/android/app/src/main/java/com/metallic/chiaki/main/DisplayHostRecyclerViewAdapter.kt index 8c37c14..b37eb4f 100644 --- a/android/app/src/main/java/com/metallic/chiaki/main/DisplayHostRecyclerViewAdapter.kt +++ b/android/app/src/main/java/com/metallic/chiaki/main/DisplayHostRecyclerViewAdapter.kt @@ -21,11 +21,15 @@ import android.util.Log import android.view.View import android.view.ViewGroup import android.view.animation.AnimationUtils +import android.widget.PopupMenu +import androidx.core.view.isGone +import androidx.core.view.isVisible import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import com.metallic.chiaki.R import com.metallic.chiaki.common.DiscoveredDisplayHost import com.metallic.chiaki.common.DisplayHost +import com.metallic.chiaki.common.ManualDisplayHost import com.metallic.chiaki.common.ext.inflate import com.metallic.chiaki.lib.DiscoveryHost import kotlinx.android.synthetic.main.item_display_host.view.* @@ -38,7 +42,12 @@ class DisplayHostDiffCallback(val old: List, val new: List Unit): RecyclerView.Adapter() +class DisplayHostRecyclerViewAdapter( + val clickCallback: (DisplayHost) -> Unit, + val wakeupCallback: (DisplayHost) -> Unit, + val editCallback: (DisplayHost) -> Unit, + val deleteCallback: (DisplayHost) -> Unit +): RecyclerView.Adapter() { var hosts: List = listOf() set(value) @@ -91,6 +100,36 @@ class DisplayHostRecyclerViewAdapter(val clickCallback: (DisplayHost) -> Unit): else R.drawable.ic_console) it.setOnClickListener { clickCallback(host) } + + val canWakeup = host.registeredHost != null + val canEditDelete = host is ManualDisplayHost + if(canWakeup || canEditDelete) + { + it.menuButton.isVisible = true + it.menuButton.setOnClickListener { _ -> + val menu = PopupMenu(context, it.menuButton) + menu.menuInflater.inflate(R.menu.display_host, menu.menu) + menu.menu.findItem(R.id.action_wakeup).isVisible = canWakeup + menu.menu.findItem(R.id.action_edit).isVisible = canEditDelete + menu.menu.findItem(R.id.action_delete).isVisible = canEditDelete + menu.setOnMenuItemClickListener { menuItem -> + when(menuItem.itemId) + { + R.id.action_wakeup -> wakeupCallback(host) + R.id.action_edit -> editCallback(host) + R.id.action_delete -> deleteCallback(host) + else -> return@setOnMenuItemClickListener false + } + true + } + menu.show() + } + } + else + { + it.menuButton.isGone = true + it.menuButton.setOnClickListener(null) + } } } } \ No newline at end of file diff --git a/android/app/src/main/java/com/metallic/chiaki/main/MainActivity.kt b/android/app/src/main/java/com/metallic/chiaki/main/MainActivity.kt index d7124f2..7904b46 100644 --- a/android/app/src/main/java/com/metallic/chiaki/main/MainActivity.kt +++ b/android/app/src/main/java/com/metallic/chiaki/main/MainActivity.kt @@ -28,15 +28,12 @@ import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.metallic.chiaki.R -import com.metallic.chiaki.common.DiscoveredDisplayHost -import com.metallic.chiaki.common.DisplayHost -import com.metallic.chiaki.common.Preferences +import com.metallic.chiaki.common.* import com.metallic.chiaki.common.ext.putRevealExtra import com.metallic.chiaki.common.ext.viewModelFactory -import com.metallic.chiaki.common.getDatabase import com.metallic.chiaki.lib.ConnectInfo import com.metallic.chiaki.lib.DiscoveryHost -import com.metallic.chiaki.manualconsole.AddManualConsoleActivity +import com.metallic.chiaki.manualconsole.EditManualConsoleActivity import com.metallic.chiaki.regist.RegistActivity import com.metallic.chiaki.settings.SettingsActivity import com.metallic.chiaki.stream.StreamActivity @@ -73,7 +70,7 @@ class MainActivity : AppCompatActivity() .of(this, viewModelFactory { MainViewModel(getDatabase(this), Preferences(this)) }) .get(MainViewModel::class.java) - val recyclerViewAdapter = DisplayHostRecyclerViewAdapter(this::hostTriggered) + val recyclerViewAdapter = DisplayHostRecyclerViewAdapter(this::hostTriggered, this::wakeupHost, this::editHost, this::deleteHost) hostsRecyclerView.adapter = recyclerViewAdapter hostsRecyclerView.layoutManager = LinearLayoutManager(this) viewModel.displayHosts.observe(this, Observer { @@ -153,7 +150,7 @@ class MainActivity : AppCompatActivity() private fun addManualConsole() { - Intent(this, AddManualConsoleActivity::class.java).also { + Intent(this, EditManualConsoleActivity::class.java).also { it.putRevealExtra(addManualButton, rootLayout) startActivity(it, ActivityOptions.makeSceneTransitionAnimation(this).toBundle()) } @@ -185,7 +182,7 @@ class MainActivity : AppCompatActivity() MaterialAlertDialogBuilder(this) .setMessage(R.string.alert_message_standby_wakeup) .setPositiveButton(R.string.action_wakeup) { _, _ -> - viewModel.discoveryManager.sendWakeup(host.host, registeredHost.rpRegistKey) + wakeupHost(host) } .setNeutralButton(R.string.action_connect_immediately) { _, _ -> connect() @@ -202,8 +199,40 @@ class MainActivity : AppCompatActivity() Intent(this, RegistActivity::class.java).let { it.putExtra(RegistActivity.EXTRA_HOST, host.host) it.putExtra(RegistActivity.EXTRA_BROADCAST, false) + if(host is ManualDisplayHost) + it.putExtra(RegistActivity.EXTRA_ASSIGN_MANUAL_HOST_ID, host.manualHost.id) startActivity(it) } } } + + private fun wakeupHost(host: DisplayHost) + { + val registeredHost = host.registeredHost ?: return + viewModel.discoveryManager.sendWakeup(host.host, registeredHost.rpRegistKey) + } + + private fun editHost(host: DisplayHost) + { + if(host !is ManualDisplayHost) + return + Intent(this, EditManualConsoleActivity::class.java).also { + it.putExtra(EditManualConsoleActivity.EXTRA_MANUAL_HOST_ID, host.manualHost.id) + startActivity(it) + } + } + + private fun deleteHost(host: DisplayHost) + { + if(host !is ManualDisplayHost) + return + MaterialAlertDialogBuilder(this) + .setMessage(getString(R.string.alert_message_delete_manual_host, host.manualHost.host)) + .setPositiveButton(R.string.action_delete) { _, _ -> + viewModel.deleteManualHost(host.manualHost) + } + .setNegativeButton(R.string.action_keep) { _, _ -> } + .create() + .show() + } } diff --git a/android/app/src/main/java/com/metallic/chiaki/main/MainViewModel.kt b/android/app/src/main/java/com/metallic/chiaki/main/MainViewModel.kt index ffb9d74..02940bc 100644 --- a/android/app/src/main/java/com/metallic/chiaki/main/MainViewModel.kt +++ b/android/app/src/main/java/com/metallic/chiaki/main/MainViewModel.kt @@ -18,10 +18,7 @@ package com.metallic.chiaki.main import androidx.lifecycle.ViewModel -import com.metallic.chiaki.common.AppDatabase -import com.metallic.chiaki.common.DiscoveredDisplayHost -import com.metallic.chiaki.common.ManualDisplayHost -import com.metallic.chiaki.common.Preferences +import com.metallic.chiaki.common.* import com.metallic.chiaki.common.ext.toLiveData import com.metallic.chiaki.discovery.DiscoveryManager import com.metallic.chiaki.discovery.ps4Mac @@ -29,6 +26,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.rxkotlin.Observables import io.reactivex.rxkotlin.addTo +import io.reactivex.schedulers.Schedulers class MainViewModel(val database: AppDatabase, val preferences: Preferences): ViewModel() { @@ -64,6 +62,16 @@ class MainViewModel(val database: AppDatabase, val preferences: Preferences): Vi discoveryManager.discoveryActive.toLiveData() } + fun deleteManualHost(manualHost: ManualHost) + { + database.manualHostDao() + .delete(manualHost) + .onErrorComplete() + .subscribeOn(Schedulers.io()) + .subscribe() + .addTo(disposable) + } + override fun onCleared() { super.onCleared() diff --git a/android/app/src/main/java/com/metallic/chiaki/manualconsole/AddManualConsoleActivity.kt b/android/app/src/main/java/com/metallic/chiaki/manualconsole/EditManualConsoleActivity.kt similarity index 82% rename from android/app/src/main/java/com/metallic/chiaki/manualconsole/AddManualConsoleActivity.kt rename to android/app/src/main/java/com/metallic/chiaki/manualconsole/EditManualConsoleActivity.kt index df5d47d..01ed245 100644 --- a/android/app/src/main/java/com/metallic/chiaki/manualconsole/AddManualConsoleActivity.kt +++ b/android/app/src/main/java/com/metallic/chiaki/manualconsole/EditManualConsoleActivity.kt @@ -22,13 +22,11 @@ import android.os.Bundle import android.view.View import android.view.Window import android.widget.AdapterView -import android.widget.AdapterView.OnItemSelectedListener import android.widget.ArrayAdapter import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import com.metallic.chiaki.R -import com.metallic.chiaki.common.ManualHost import com.metallic.chiaki.common.RegisteredHost import com.metallic.chiaki.common.ext.RevealActivity import com.metallic.chiaki.common.ext.viewModelFactory @@ -36,27 +34,42 @@ import com.metallic.chiaki.common.getDatabase import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.rxkotlin.addTo -import kotlinx.android.synthetic.main.activity_add_manual.* +import kotlinx.android.synthetic.main.activity_edit_manual.* -class AddManualConsoleActivity: AppCompatActivity(), RevealActivity +class EditManualConsoleActivity: AppCompatActivity(), RevealActivity { + companion object + { + const val EXTRA_MANUAL_HOST_ID = "manual_host_id" + } + override val revealIntent: Intent get() = intent override val revealRootLayout: View get() = rootLayout override val revealWindow: Window get() = window - private lateinit var viewModel: AddManualConsoleViewModel + private lateinit var viewModel: EditManualConsoleViewModel private val disposable = CompositeDisposable() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_add_manual) + setContentView(R.layout.activity_edit_manual) handleReveal() viewModel = ViewModelProviders - .of(this, viewModelFactory { AddManualConsoleViewModel(getDatabase(this)) }) - .get(AddManualConsoleViewModel::class.java) + .of(this, viewModelFactory { + EditManualConsoleViewModel(getDatabase(this), + if(intent.hasExtra(EXTRA_MANUAL_HOST_ID)) + intent.getLongExtra(EXTRA_MANUAL_HOST_ID, 0) + else + null) + }) + .get(EditManualConsoleViewModel::class.java) + + viewModel.existingHost?.observe(this, Observer { + hostEditText.setText(it.host) + }) viewModel.selectedRegisteredHost.observe(this, Observer { registeredHostTextView.setText(titleForRegisteredHost(it)) diff --git a/android/app/src/main/java/com/metallic/chiaki/manualconsole/AddManualConsoleViewModel.kt b/android/app/src/main/java/com/metallic/chiaki/manualconsole/EditManualConsoleViewModel.kt similarity index 62% rename from android/app/src/main/java/com/metallic/chiaki/manualconsole/AddManualConsoleViewModel.kt rename to android/app/src/main/java/com/metallic/chiaki/manualconsole/EditManualConsoleViewModel.kt index 7b0888c..512e153 100644 --- a/android/app/src/main/java/com/metallic/chiaki/manualconsole/AddManualConsoleViewModel.kt +++ b/android/app/src/main/java/com/metallic/chiaki/manualconsole/EditManualConsoleViewModel.kt @@ -17,6 +17,8 @@ package com.metallic.chiaki.manualconsole +import android.util.Log +import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.metallic.chiaki.common.AppDatabase @@ -26,7 +28,7 @@ import com.metallic.chiaki.common.ext.toLiveData import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers -class AddManualConsoleViewModel(val database: AppDatabase): ViewModel() +class EditManualConsoleViewModel(val database: AppDatabase, manualHostId: Long?): ViewModel() { val registeredHosts by lazy { database.registeredHostDao().getAll().observeOn(AndroidSchedulers.mainThread()) @@ -39,10 +41,35 @@ class AddManualConsoleViewModel(val database: AppDatabase): ViewModel() .toLiveData() } + val existingHost: LiveData? = + if(manualHostId != null) + database.manualHostDao() + .getByIdWithRegisteredHost(manualHostId) + .toFlowable() + .doOnError { + Log.e("EditManualConsole", "Failed to fetch existing manual host", it) + } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnNext { hosts -> + selectedRegisteredHost.value = hosts.registeredHost + } + .map { hosts -> hosts.manualHost } + .toLiveData() + else + null + var selectedRegisteredHost = MutableLiveData(null) fun saveHost(host: String) = database.manualHostDao() - .insert(ManualHost(host = host, registeredHost = selectedRegisteredHost.value?.id)) + .let { + val registeredHost = selectedRegisteredHost.value?.id + val existingHost = existingHost?.value + if(existingHost != null) + it.update(ManualHost(id = existingHost.id, host = host, registeredHost = registeredHost)) + else + it.insert(ManualHost(host = host, registeredHost = registeredHost)) + } .subscribeOn(Schedulers.io()) } \ No newline at end of file diff --git a/android/app/src/main/java/com/metallic/chiaki/regist/RegistActivity.kt b/android/app/src/main/java/com/metallic/chiaki/regist/RegistActivity.kt index aaff1db..aa8b650 100644 --- a/android/app/src/main/java/com/metallic/chiaki/regist/RegistActivity.kt +++ b/android/app/src/main/java/com/metallic/chiaki/regist/RegistActivity.kt @@ -37,6 +37,7 @@ class RegistActivity: AppCompatActivity(), RevealActivity { const val EXTRA_HOST = "regist_host" const val EXTRA_BROADCAST = "regist_broadcast" + const val EXTRA_ASSIGN_MANUAL_HOST_ID = "assign_manual_host_id" private const val PIN_LENGTH = 8 @@ -130,6 +131,8 @@ class RegistActivity: AppCompatActivity(), RevealActivity Intent(this, RegistExecuteActivity::class.java).also { it.putExtra(RegistExecuteActivity.EXTRA_REGIST_INFO, registInfo) + if(intent.hasExtra(EXTRA_ASSIGN_MANUAL_HOST_ID)) + it.putExtra(RegistExecuteActivity.EXTRA_ASSIGN_MANUAL_HOST_ID, intent.getLongExtra(EXTRA_ASSIGN_MANUAL_HOST_ID, 0L)) startActivityForResult(it, REQUEST_REGIST) } } diff --git a/android/app/src/main/java/com/metallic/chiaki/regist/RegistExecuteActivity.kt b/android/app/src/main/java/com/metallic/chiaki/regist/RegistExecuteActivity.kt index 9bf06f0..4136248 100644 --- a/android/app/src/main/java/com/metallic/chiaki/regist/RegistExecuteActivity.kt +++ b/android/app/src/main/java/com/metallic/chiaki/regist/RegistExecuteActivity.kt @@ -40,6 +40,7 @@ class RegistExecuteActivity: AppCompatActivity() companion object { const val EXTRA_REGIST_INFO = "regist_info" + const val EXTRA_ASSIGN_MANUAL_HOST_ID = "assign_manual_host_id" const val RESULT_FAILED = Activity.RESULT_FIRST_USER } @@ -105,7 +106,11 @@ class RegistExecuteActivity: AppCompatActivity() finish() return } - viewModel.start(registInfo) + viewModel.start(registInfo, + if(intent.hasExtra(EXTRA_ASSIGN_MANUAL_HOST_ID)) + intent.getLongExtra(EXTRA_ASSIGN_MANUAL_HOST_ID, 0) + else + null) } override fun onStop() diff --git a/android/app/src/main/java/com/metallic/chiaki/regist/RegistExecuteViewModel.kt b/android/app/src/main/java/com/metallic/chiaki/regist/RegistExecuteViewModel.kt index 2b0187f..8be8343 100644 --- a/android/app/src/main/java/com/metallic/chiaki/regist/RegistExecuteViewModel.kt +++ b/android/app/src/main/java/com/metallic/chiaki/regist/RegistExecuteViewModel.kt @@ -56,13 +56,16 @@ class RegistExecuteViewModel(val database: AppDatabase): ViewModel() var host: RegistHost? = null private set - fun start(info: RegistInfo) + private var assignManualHostId: Long? = null + + fun start(info: RegistInfo, assignManualHostId: Long?) { if(regist != null) return try { regist = Regist(info, log.log, this::registEvent) + this.assignManualHostId = assignManualHostId _state.value = State.RUNNING } catch(error: CreateError) @@ -106,13 +109,23 @@ class RegistExecuteViewModel(val database: AppDatabase): ViewModel() fun saveHost() { val host = host ?: return + val assignManualHostId = assignManualHostId val dao = database.registeredHostDao() + val manualHostDao = database.manualHostDao() val registeredHost = RegisteredHost(host) dao.deleteByMac(registeredHost.ps4Mac) .andThen(dao.insert(registeredHost)) + .let { + if(assignManualHostId != null) + it.flatMapCompletable { registeredHostId -> + manualHostDao.assignRegisteredHost(assignManualHostId, registeredHostId) + } + else + it.ignoreElement() + } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe { _ -> /* No, IntelliJ, this "_ ->" IS necessary. */ + .subscribe { Log.i("RegistExecute", "Registered Host saved in db") _state.value = State.SUCCESSFUL } diff --git a/android/app/src/main/java/com/metallic/chiaki/settings/SettingsRegisteredHostsFragment.kt b/android/app/src/main/java/com/metallic/chiaki/settings/SettingsRegisteredHostsFragment.kt index 70c81cf..0306b84 100644 --- a/android/app/src/main/java/com/metallic/chiaki/settings/SettingsRegisteredHostsFragment.kt +++ b/android/app/src/main/java/com/metallic/chiaki/settings/SettingsRegisteredHostsFragment.kt @@ -62,10 +62,10 @@ class SettingsRegisteredHostsFragment: AppCompatDialogFragment(), TitleFragment val host = viewModel.registeredHosts.value?.getOrNull(pos) ?: return MaterialAlertDialogBuilder(viewHolder.itemView.context) .setMessage(getString(R.string.alert_message_delete_registered_host, host.ps4Nickname, host.ps4Mac.toString())) - .setPositiveButton(R.string.alert_action_delete_registered_host) { _, _ -> + .setPositiveButton(R.string.action_delete) { _, _ -> viewModel.deleteHost(host) } - .setNegativeButton(R.string.alert_action_keep_registered_host) { _, _ -> + .setNegativeButton(R.string.action_keep) { _, _ -> adapter.notifyItemChanged(pos) // to reset the swipe } .create() diff --git a/android/app/src/main/res/drawable/ic_overflow.xml b/android/app/src/main/res/drawable/ic_overflow.xml new file mode 100644 index 0000000..ecd0f0c --- /dev/null +++ b/android/app/src/main/res/drawable/ic_overflow.xml @@ -0,0 +1,9 @@ + + + diff --git a/android/app/src/main/res/layout/activity_add_manual.xml b/android/app/src/main/res/layout/activity_edit_manual.xml similarity index 98% rename from android/app/src/main/res/layout/activity_add_manual.xml rename to android/app/src/main/res/layout/activity_edit_manual.xml index f806d60..0550aa9 100644 --- a/android/app/src/main/res/layout/activity_add_manual.xml +++ b/android/app/src/main/res/layout/activity_edit_manual.xml @@ -30,7 +30,7 @@ android:id="@+id/titleTextView" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/title_add_manual" + android:text="@string/title_edit_manual" android:textSize="32sp" android:gravity="center" android:layout_marginTop="16dp" diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml index 0642ac5..d7f88d4 100644 --- a/android/app/src/main/res/layout/activity_main.xml +++ b/android/app/src/main/res/layout/activity_main.xml @@ -11,7 +11,7 @@ android:id="@+id/hostsRecyclerView" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingBottom="8dp" + android:paddingBottom="96dp" android:clipToPadding="false" android:clipChildren="false" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> diff --git a/android/app/src/main/res/layout/item_display_host.xml b/android/app/src/main/res/layout/item_display_host.xml index 1d4a953..21aedc5 100644 --- a/android/app/src/main/res/layout/item_display_host.xml +++ b/android/app/src/main/res/layout/item_display_host.xml @@ -37,6 +37,16 @@ android:layout_height="match_parent" android:padding="8dp"> + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 6bd60de..e78c484 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -45,7 +45,7 @@ The console with MAC %s has already been registered. Should the previous record be overwritten? Overwrite Cancel - Add Console Manually + Manual Console Entry Save Registered Console Register on first Connection @@ -59,8 +59,10 @@ Verbose Logging Warning: This logs a LOT! Don\'t enable for regular use. Are you sure you want to delete the registered console %s with ID %s? - Delete - Keep + Are you sure you want to delete the console entry for %s? + Keep + Delete + Edit discovery_enabled