Skip to content

Commit f472c05

Browse files
author
tanpengcheng
committed
[feat] Adjust settings download dir logic.
1 parent aeddb15 commit f472c05

File tree

3 files changed

+73
-24
lines changed

3 files changed

+73
-24
lines changed

app/src/main/java/com/tans/tfiletransporter/Settings.kt

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import io.reactivex.rxjava3.subjects.Subject
1010
import kotlinx.coroutines.Dispatchers
1111
import kotlinx.coroutines.asExecutor
1212
import java.io.File
13+
import java.io.IOException
1314
import java.util.concurrent.Executor
1415
import java.util.concurrent.atomic.AtomicReference
1516

@@ -27,11 +28,11 @@ object Settings : Stateable<Settings.SettingsData> {
2728
AtomicReference(null)
2829
}
2930

30-
private val defaultDownloadDir by lazy {
31+
val defaultDownloadDir: String by lazy {
3132
File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "tFileTransfer").canonicalPath
3233
}
3334

34-
private const val defaultConnectionSize = 4
35+
private const val defaultConnectionSize = 6
3536

3637

3738
const val minConnectionSize = 1
@@ -41,8 +42,19 @@ object Settings : Stateable<Settings.SettingsData> {
4142
val sp = context.getSharedPreferences(SP_FILE_NAME, Context.MODE_PRIVATE)
4243
this.sp.set(sp)
4344
val s = updateState {
45+
val storedDownloadDir = sp.getString(DOWNLOAD_DIR_KEY, defaultDownloadDir)?.let {
46+
if (isDirWriteable(it)) {
47+
it
48+
} else {
49+
sp.edit().let { et ->
50+
et.putString(DOWNLOAD_DIR_KEY, defaultDownloadDir)
51+
et.apply()
52+
}
53+
defaultDownloadDir
54+
}
55+
}
4456
SettingsData(
45-
downloadDir = sp.getString(DOWNLOAD_DIR_KEY, defaultDownloadDir) ?: defaultDownloadDir,
57+
downloadDir = storedDownloadDir ?: defaultDownloadDir,
4658
shareMyDir = sp.getBoolean(SHARE_MY_DIR_KEY, true),
4759
transferFileMaxConnection = sp.getInt(MAX_CONNECTION_KEY, defaultConnectionSize),
4860
)
@@ -59,29 +71,39 @@ object Settings : Stateable<Settings.SettingsData> {
5971
fun transferFileMaxConnection(): Single<Int> = stateStore.firstOrError()
6072
.map { fixTransferFileConnectionSize(it.transferFileMaxConnection) }
6173

62-
fun updateDownloadDir(dir: String) = updateState { s ->
63-
sp.get()?.edit()?.let {
64-
it.putString(DOWNLOAD_DIR_KEY, dir)
65-
it.apply()
74+
fun updateDownloadDir(dir: String): Single<Unit> {
75+
return if (isDirWriteable(dir)) {
76+
updateState { s ->
77+
if (dir != s.downloadDir) {
78+
sp.get()?.edit()?.let {
79+
it.putString(DOWNLOAD_DIR_KEY, dir)
80+
it.apply()
81+
}
82+
s.copy(downloadDir = dir)
83+
} else {
84+
s
85+
}
86+
}.map { }
87+
} else {
88+
Single.error(IOException("$dir is not writeable dir."))
6689
}
67-
s.copy(downloadDir = dir)
6890
}
6991

70-
fun updateShareDir(shareDir: Boolean) = updateState { s ->
92+
fun updateShareDir(shareDir: Boolean): Single<Unit> = updateState { s ->
7193
sp.get()?.edit()?.let {
7294
it.putBoolean(SHARE_MY_DIR_KEY, shareDir)
7395
it.apply()
7496
}
7597
s.copy(shareMyDir = shareDir)
76-
}
98+
}.map { }
7799

78-
fun updateTransferFileMaxConnection(maxConnection: Int) = updateState { s ->
100+
fun updateTransferFileMaxConnection(maxConnection: Int): Single<Unit> = updateState { s ->
79101
sp.get()?.edit()?.let {
80102
it.putInt(MAX_CONNECTION_KEY, maxConnection)
81103
it.apply()
82104
}
83105
s.copy(transferFileMaxConnection = maxConnection)
84-
}
106+
}.map { }
85107

86108
fun fixTransferFileConnectionSize(needToFix: Int): Int {
87109
return if (needToFix in minConnectionSize .. maxConnectionSize) {
@@ -91,6 +113,11 @@ object Settings : Stateable<Settings.SettingsData> {
91113
}
92114
}
93115

116+
fun isDirWriteable(dir: String): Boolean {
117+
val f = File(dir)
118+
return f.isDirectory && f.canWrite()
119+
}
120+
94121
data class SettingsData(
95122
val downloadDir: String = defaultDownloadDir,
96123
val shareMyDir: Boolean = true,

app/src/main/java/com/tans/tfiletransporter/ui/activity/commomdialog/SettingsDialog.kt

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.tans.tfiletransporter.ui.activity.commomdialog
22

3+
import android.annotation.SuppressLint
34
import android.app.Activity
45
import com.jakewharton.rxbinding4.view.clicks
56
import com.jakewharton.rxbinding4.widget.checkedChanges
@@ -8,34 +9,54 @@ import com.tans.tfiletransporter.R
89
import com.tans.tfiletransporter.Settings
910
import com.tans.tfiletransporter.databinding.SettingsDialogBinding
1011
import com.tans.tfiletransporter.ui.activity.BaseCustomDialog
11-
import kotlinx.coroutines.launch
12-
import kotlinx.coroutines.rx3.await
12+
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
13+
import io.reactivex.rxjava3.core.Observable
14+
import io.reactivex.rxjava3.core.Single
1315

1416
class SettingsDialog(context: Activity) : BaseCustomDialog<SettingsDialogBinding, Unit>(
1517
context = context,
1618
layoutId = R.layout.settings_dialog,
1719
defaultState = Unit,
1820
) {
21+
@SuppressLint("ClickableViewAccessibility")
1922
override fun bindingStart(binding: SettingsDialogBinding) {
20-
launch {
21-
binding.downloadDirTv.text = Settings.getDownloadDir().await()
22-
binding.shareMyDirSt.isChecked = Settings.isShareMyDir().await()
23-
binding.maxConnectionSb.min = Settings.minConnectionSize
24-
binding.maxConnectionSb.max = Settings.maxConnectionSize
25-
val connection = Settings.transferFileMaxConnection().await()
26-
binding.maxConnectionSb.progress = connection
27-
binding.maxConnectionTv.text = connection.toString()
23+
// To solve seekbar in dialog ui problem.
24+
binding.root.setOnTouchListener { _, _ -> true }
25+
binding.maxConnectionSb.min = Settings.minConnectionSize
26+
binding.maxConnectionSb.max = Settings.maxConnectionSize
27+
28+
fun <T : Any> observeSingleFromUI(map: (Settings.SettingsData) -> T): Observable<T> {
29+
return Settings.bindState()
30+
.map(map)
31+
.distinctUntilChanged()
32+
.observeOn(AndroidSchedulers.mainThread())
2833
}
2934

35+
observeSingleFromUI { it.downloadDir }
36+
.doOnNext { binding.downloadDirTv.text = it }
37+
.bindLife()
38+
39+
observeSingleFromUI { it.shareMyDir }
40+
.doOnNext { binding.shareMyDirSt.isChecked = it }
41+
.bindLife()
42+
43+
observeSingleFromUI { it.transferFileMaxConnection }
44+
.doOnNext {
45+
binding.maxConnectionSb.progress = it
46+
binding.maxConnectionTv.text = it.toString()
47+
}
48+
.bindLife()
49+
3050
binding.downloadDirEditIv.clicks()
3151
.doOnNext {
3252
// TODO:
3353
}
3454
.bindLife()
3555

3656
binding.downloadDirResetIv.clicks()
37-
.doOnNext {
38-
// TODO:
57+
.flatMapSingle {
58+
Settings.updateDownloadDir(Settings.defaultDownloadDir)
59+
.onErrorResumeNext { Single.just(Unit) }
3960
}
4061
.bindLife()
4162

app/src/main/java/com/tans/tfiletransporter/ui/activity/qrcodescan/ScanQrCodeActivity.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ class ScanQrCodeActivity : BaseActivity<ScanQrcodeActivityBinding, Unit>(
101101
i.putExtra(QR_CODE_RESULT_KEY, barcodeStrings)
102102
setResult(Activity.RESULT_OK, i)
103103
finish()
104+
this@ScanQrCodeActivity.overridePendingTransition(0, 0)
104105
}
105106
}
106107
}

0 commit comments

Comments
 (0)