diff --git a/android/app/src/main/java/com/metallic/chiaki/common/RegisteredHost.kt b/android/app/src/main/java/com/metallic/chiaki/common/RegisteredHost.kt index ea161bc..0acd10f 100644 --- a/android/app/src/main/java/com/metallic/chiaki/common/RegisteredHost.kt +++ b/android/app/src/main/java/com/metallic/chiaki/common/RegisteredHost.kt @@ -20,6 +20,7 @@ package com.metallic.chiaki.common import androidx.room.* import androidx.room.ColumnInfo.BLOB import com.metallic.chiaki.lib.RegistHost +import io.reactivex.Completable import io.reactivex.Flowable import io.reactivex.Maybe import io.reactivex.Single @@ -61,6 +62,9 @@ interface RegisteredHostDao @Query("SELECT * FROM registered_host WHERE ps4_mac == :mac LIMIT 1") fun getByMac(mac: MacAddress): Maybe + @Query("DELETE FROM registered_host WHERE ps4_mac == :mac") + fun deleteByMac(mac: MacAddress): Completable + @Insert fun insert(host: RegisteredHost): Single } \ No newline at end of file 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 7cd9559..6de946c 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 @@ -18,6 +18,8 @@ package com.metallic.chiaki.regist import android.app.Activity +import android.app.AlertDialog +import android.content.DialogInterface import android.content.Intent import android.os.Bundle import android.text.method.ScrollingMovementMethod @@ -26,6 +28,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import com.metallic.chiaki.R +import com.metallic.chiaki.common.MacAddress import com.metallic.chiaki.common.ext.viewModelFactory import com.metallic.chiaki.common.getDatabase import com.metallic.chiaki.lib.RegistInfo @@ -70,11 +73,13 @@ class RegistExecuteActivity: AppCompatActivity() infoTextView.setText(R.string.regist_info_failed) setResult(RESULT_FAILED) } - RegistExecuteViewModel.State.SUCCESSFUL -> + RegistExecuteViewModel.State.SUCCESSFUL, RegistExecuteViewModel.State.SUCCESSFUL_DUPLICATE -> { infoTextView.visibility = View.VISIBLE infoTextView.setText(R.string.regist_info_success) setResult(RESULT_OK) + if(it == RegistExecuteViewModel.State.SUCCESSFUL_DUPLICATE) + showDuplicateDialog() } RegistExecuteViewModel.State.STOPPED -> { @@ -108,4 +113,24 @@ class RegistExecuteActivity: AppCompatActivity() super.onStop() viewModel.stop() } + + private var dialog: AlertDialog? = null + + private fun showDuplicateDialog() + { + if(dialog != null) + return + + val macStr = viewModel.host?.ps4Mac?.let { MacAddress(it).toString() } ?: "" + + dialog = AlertDialog.Builder(this) + .setMessage(getString(R.string.alert_regist_duplicate, macStr)) + .setNegativeButton(R.string.action_regist_discard) { _, _ -> } + .setPositiveButton(R.string.action_regist_overwrite) { _, _ -> + viewModel.saveHost() + } + .create() + .also { it.show() } + + } } \ No newline at end of file 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 0173e9d..eaaa947 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 @@ -18,7 +18,6 @@ package com.metallic.chiaki.regist import android.util.Log -import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -29,6 +28,7 @@ import com.metallic.chiaki.common.ext.toLiveData import com.metallic.chiaki.lib.* import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable +import io.reactivex.functions.Action import io.reactivex.rxkotlin.addTo import io.reactivex.schedulers.Schedulers @@ -40,7 +40,8 @@ class RegistExecuteViewModel(val database: AppDatabase): ViewModel() RUNNING, STOPPED, FAILED, - SUCCESSFUL + SUCCESSFUL, + SUCCESSFUL_DUPLICATE, } private val _state = MutableLiveData(State.IDLE) @@ -53,6 +54,9 @@ class RegistExecuteViewModel(val database: AppDatabase): ViewModel() private val disposable = CompositeDisposable() + var host: RegistHost? = null + private set + fun start(info: RegistInfo) { if(regist != null) @@ -86,31 +90,36 @@ class RegistExecuteViewModel(val database: AppDatabase): ViewModel() private fun registSuccess(host: RegistHost) { - _state.postValue(State.SUCCESSFUL) // TODO: more states - - val dao = database.registeredHostDao() - - val mac = MacAddress(host.ps4Mac) - - //val mac = MacAddress(byteArrayOf(0xc0.toByte(), 0xff.toByte(), 0xff.toByte(), 0xee.toByte(), 0xee.toByte(), 0x42)) - - dao.getByMac(mac) + this.host = host + database.registeredHostDao().getByMac(MacAddress(host.ps4Mac)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnSuccess { - // TODO: show dialog - Log.i("RegistExecuteViewModel", "already exists") + _state.value = State.SUCCESSFUL_DUPLICATE } .doOnComplete { - dao.insert(RegisteredHost(host)) - .subscribeOn(Schedulers.io()) - .subscribe() - .addTo(disposable) + saveHost() } .subscribe() .addTo(disposable) } + fun saveHost() + { + val host = host ?: return + val dao = database.registeredHostDao() + val registeredHost = RegisteredHost(host) + dao.deleteByMac(registeredHost.ps4Mac) + .andThen(dao.insert(registeredHost)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { _ -> + Log.i("RegistExecute", "Registered Host saved in db") + _state.value = State.SUCCESSFUL + } + .addTo(disposable) + } + override fun onCleared() { super.onCleared() diff --git a/android/app/src/main/res/layout/activity_regist.xml b/android/app/src/main/res/layout/activity_regist.xml index 40ac926..fff5cad 100644 --- a/android/app/src/main/res/layout/activity_regist.xml +++ b/android/app/src/main/res/layout/activity_regist.xml @@ -126,8 +126,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textNoSuggestions|textVisiblePassword" - android:maxLines="1" - android:text="test"/> + android:maxLines="1"/> + android:maxLength="8"/> Share Log Regist successful. Regist failed. + The console with MAC %s has already been registered. Should the previous record be overwritten? + Overwrite + Cancel diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index eea547b..b5a09da 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -35,7 +35,7 @@ ?attr/colorPrimarySurface @color/accent @color/accent - @style/TextAppearanceButton + @style/MageTheme.TextAppearanceButton ?attr/colorOnPrimary @style/MageTheme.TextAppearanceHeadline1 @@ -47,6 +47,8 @@ true true + + @style/MageTheme.AlertDialog + + + + -