Skip to content

Commit a69fa39

Browse files
author
tanpengcheng
committed
[feat] Add new folder create.
1 parent 1e412c9 commit a69fa39

File tree

7 files changed

+181
-10
lines changed

7 files changed

+181
-10
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,12 @@
6060
<activity
6161
android:name=".ui.activity.qrcodescan.ScanQrCodeActivity"
6262
android:screenOrientation="portrait"
63-
android:windowSoftInputMode="adjustResize|stateHidden"
6463
android:taskAffinity=".transfer"
6564
android:configChanges="orientation|screenSize"/>
6665

6766
<activity
6867
android:name=".ui.activity.folderselect.FolderSelectActivity"
6968
android:screenOrientation="portrait"
70-
android:windowSoftInputMode="adjustResize|stateHidden"
7169
android:taskAffinity=".transfer"
7270
android:configChanges="orientation|screenSize"/>
7371

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.tans.tfiletransporter.ui.activity.commomdialog
2+
3+
import android.app.Activity
4+
import android.view.inputmethod.InputMethodManager
5+
import androidx.core.content.getSystemService
6+
import com.jakewharton.rxbinding4.view.clicks
7+
import com.tans.tfiletransporter.R
8+
import com.tans.tfiletransporter.databinding.TextInputDialogBinding
9+
import com.tans.tfiletransporter.resumeIfActive
10+
import com.tans.tfiletransporter.ui.activity.BaseCustomDialog
11+
import kotlinx.coroutines.suspendCancellableCoroutine
12+
import java.util.concurrent.atomic.AtomicBoolean
13+
14+
class TextInputDialog(
15+
private val context: Activity,
16+
private val hintText: String,
17+
private val callback: (r: Result) -> Unit) : BaseCustomDialog<TextInputDialogBinding, Unit>(
18+
context = context,
19+
layoutId = R.layout.text_input_dialog,
20+
defaultState = Unit
21+
) {
22+
23+
private val hasInvokeCallback: AtomicBoolean = AtomicBoolean(false)
24+
25+
override fun bindingStart(binding: TextInputDialogBinding) {
26+
super.bindingStart(binding)
27+
setOnCancelListener {
28+
if (hasInvokeCallback.compareAndSet(false, true)) {
29+
callback(Result.Canceled)
30+
}
31+
val inputMethodManager = context.getSystemService<InputMethodManager>()
32+
inputMethodManager?.hideSoftInputFromWindow(binding.textEt.windowToken, 0)
33+
}
34+
binding.textEt.hint = hintText
35+
36+
binding.cancelBt.clicks()
37+
.doOnNext {
38+
cancel()
39+
}
40+
.bindLife()
41+
42+
binding.okBt.clicks()
43+
.doOnNext {
44+
val text = binding.textEt.text?.toString()
45+
if (!text.isNullOrBlank()) {
46+
if (hasInvokeCallback.compareAndSet(false, true)) {
47+
callback(Result.Success(text))
48+
}
49+
}
50+
binding.textEt.clearFocus()
51+
cancel()
52+
}
53+
.bindLife()
54+
}
55+
56+
companion object {
57+
sealed class Result {
58+
59+
data class Success(val text: String) : Result()
60+
61+
object Canceled : Result()
62+
}
63+
}
64+
}
65+
66+
suspend fun Activity.showTextInputDialog(hintText: String): TextInputDialog.Companion.Result = suspendCancellableCoroutine { cont ->
67+
TextInputDialog(
68+
context = this,
69+
hintText = hintText,
70+
callback = { r ->
71+
cont.resumeIfActive(r)
72+
}
73+
).show()
74+
}

app/src/main/java/com/tans/tfiletransporter/ui/activity/folderselect/FolderSelectActivity.kt

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@ import com.tans.tfiletransporter.file.isRootFileTree
2323
import com.tans.tfiletransporter.file.newLocalSubTree
2424
import com.tans.tfiletransporter.ui.DataBindingAdapter
2525
import com.tans.tfiletransporter.ui.activity.BaseActivity
26+
import com.tans.tfiletransporter.ui.activity.commomdialog.TextInputDialog
2627
import com.tans.tfiletransporter.ui.activity.commomdialog.loadingDialog
2728
import com.tans.tfiletransporter.ui.activity.commomdialog.showNoOptionalDialog
29+
import com.tans.tfiletransporter.ui.activity.commomdialog.showTextInputDialog
2830
import com.tans.tfiletransporter.utils.dp2px
2931
import com.tans.tfiletransporter.utils.firstVisibleItemPosition
3032
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
31-
import io.reactivex.rxjava3.core.Single
3233
import io.reactivex.rxjava3.kotlin.withLatestFrom
3334
import io.reactivex.rxjava3.schedulers.Schedulers
3435
import kotlinx.coroutines.Dispatchers
@@ -90,8 +91,42 @@ class FolderSelectActivity : BaseActivity<FolderSelectActivityBinding, FolderSel
9091

9192
binding.toolBar.menu.findItem(R.id.create_new_folder).clicks()
9293
.flatMapSingle {
93-
// TODO: create new folder.
94-
Single.just(Unit)
94+
rxSingle(Dispatchers.Main) {
95+
val inputResult = this@FolderSelectActivity.showTextInputDialog(getString(R.string.folder_select_create_new_folder_hint))
96+
if (inputResult is TextInputDialog.Companion.Result.Success) {
97+
val tree = bindState().firstOrError().await().fileTree
98+
if (tree.isRootFileTree() || !Settings.isDirWriteable(tree.path)) {
99+
this@FolderSelectActivity.showNoOptionalDialog(
100+
title = getString(R.string.folder_select_create_folder_error),
101+
message = getString(R.string.folder_select_error_body, "Can't create new folder.")
102+
).await()
103+
} else {
104+
val createFolderResult = withContext(Dispatchers.IO) {
105+
try {
106+
val f = File(tree.path, inputResult.text)
107+
f.mkdirs()
108+
} catch (e: Throwable) {
109+
e.printStackTrace()
110+
false
111+
}
112+
}
113+
if (createFolderResult) {
114+
updateState { oldState ->
115+
val oldTree = oldState.fileTree
116+
val parentTree = oldTree.parentTree
117+
val dirLeaf = parentTree?.dirLeafs?.find { it.path == oldTree.path }
118+
if (parentTree != null && dirLeaf != null) {
119+
oldState.copy(
120+
fileTree = parentTree.newLocalSubTree(dirLeaf)
121+
)
122+
} else {
123+
oldState
124+
}
125+
}.await()
126+
}
127+
}
128+
}
129+
}
95130
}
96131
.bindLife()
97132

@@ -172,7 +207,7 @@ class FolderSelectActivity : BaseActivity<FolderSelectActivityBinding, FolderSel
172207
if (tree.isRootFileTree()) {
173208
this@FolderSelectActivity.showNoOptionalDialog(
174209
title = getString(R.string.folder_select_error_title),
175-
message = getString(R.string.folder_select_error_body, "Root fold can't be selected.")
210+
message = getString(R.string.folder_select_error_body, "Root folder can't be selected.")
176211
).await()
177212
} else {
178213
if (withContext(Dispatchers.IO) { Settings.isDirWriteable(tree.path) }) {
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<layout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools">
5+
6+
<androidx.constraintlayout.widget.ConstraintLayout
7+
android:layout_width="match_parent"
8+
android:layout_height="wrap_content"
9+
android:background="@drawable/common_dialog_bg"
10+
android:layout_marginStart="?attr/dialogPreferredPadding"
11+
android:layout_marginEnd="?attr/dialogPreferredPadding">
12+
13+
<androidx.appcompat.widget.AppCompatEditText
14+
android:id="@+id/text_et"
15+
android:layout_width="0dp"
16+
android:layout_height="wrap_content"
17+
android:layout_marginStart="?attr/dialogPreferredPadding"
18+
android:layout_marginEnd="?attr/dialogPreferredPadding"
19+
android:layout_marginTop="17dp"
20+
android:textColorHint="@color/gray_3"
21+
app:backgroundTint="@color/teal_200"
22+
app:layout_constraintStart_toStartOf="parent"
23+
app:layout_constraintEnd_toEndOf="parent"
24+
app:layout_constraintTop_toTopOf="parent"
25+
tools:hint="1232131312313"/>
26+
27+
<Button
28+
android:id="@+id/cancel_bt"
29+
style="?attr/buttonBarNegativeButtonStyle"
30+
android:layout_width="wrap_content"
31+
android:layout_height="wrap_content"
32+
android:text="@string/dialog_negative"
33+
android:layout_marginTop="4dp"
34+
android:layout_marginEnd="12dp"
35+
android:layout_marginBottom="4dp"
36+
app:layout_constraintTop_toBottomOf="@id/text_et"
37+
app:layout_constraintEnd_toStartOf="@id/ok_bt"
38+
app:layout_constraintBottom_toBottomOf="parent"/>
39+
40+
<Button
41+
android:id="@+id/ok_bt"
42+
style="?attr/buttonBarNegativeButtonStyle"
43+
android:layout_width="wrap_content"
44+
android:layout_height="wrap_content"
45+
android:text="@string/dialog_positive"
46+
android:layout_marginTop="4dp"
47+
android:layout_marginEnd="12dp"
48+
android:layout_marginBottom="4dp"
49+
app:layout_constraintTop_toBottomOf="@id/text_et"
50+
app:layout_constraintEnd_toEndOf="parent"
51+
app:layout_constraintBottom_toBottomOf="parent"/>
52+
53+
</androidx.constraintlayout.widget.ConstraintLayout>
54+
55+
</layout>

app/src/main/res/values-pt-rBR/strings.xml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<resources>
22
<string name="app_name">tFileTransfer</string>
33
<string name="error_toast">Error: %s</string>
4+
<string name="dialog_positive">OK</string>
5+
<string name="dialog_negative">Cancel</string>
6+
47
<!-- File Transport Activity Start -->
58
<string name="file_transport_activity_tab_my_apps">APPS</string>
69
<string name="file_transport_activity_tab_my_images">IMAGENS</string>
@@ -81,7 +84,7 @@
8184

8285
<!-- Settings Start -->
8386
<string name="settings_title">Settings</string>
84-
<string name="setting_download_dir">Download Dir</string>
87+
<string name="setting_download_dir">Download Folder</string>
8588
<string name="setting_share_my_dir">Share My Folder</string>
8689
<string name="setting_max_connections_size">Max Tcp Connections</string>
8790
<!-- Settings End-->
@@ -96,7 +99,8 @@
9699
<string name="folder_select_create">Create a new folder</string>
97100
<string name="folder_select_error_title">Select folder fail</string>
98101
<string name="folder_select_error_body">Error: %s</string>
99-
<string name="folder_select_create_folder_error">Create dir fail</string>
102+
<string name="folder_select_create_folder_error">Create folder fail</string>
103+
<string name="folder_select_create_new_folder_hint">Input folder name</string>
100104
<!-- Folder Select End -->
101105

102106
</resources>

app/src/main/res/values/colors.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
<color name="black_2">#666666</color>
1414
<color name="gray_1">#777777</color>
1515
<color name="gray_2">#F6F6F6</color>
16+
<color name="gray_3">#999999</color>
1617

1718
<color name="line_color">#F2F2F2</color>
1819

app/src/main/res/values/strings.xml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<resources>
22
<string name="app_name">tFileTransfer</string>
33

4+
<string name="dialog_positive">OK</string>
5+
<string name="dialog_negative">Cancel</string>
6+
47
<string name="error_toast">Error: %s</string>
58
<!-- File Transport Activity Start -->
69
<string name="file_transport_activity_tab_my_apps">MY APPS</string>
@@ -82,7 +85,7 @@
8285

8386
<!-- Settings Start -->
8487
<string name="settings_title">Settings</string>
85-
<string name="setting_download_dir">Download Dir</string>
88+
<string name="setting_download_dir">Download Folder</string>
8689
<string name="setting_share_my_dir">Share My Folder</string>
8790
<string name="setting_max_connections_size">Max Tcp Connections</string>
8891
<!-- Settings End-->
@@ -97,7 +100,8 @@
97100
<string name="folder_select_create">Create a new folder</string>
98101
<string name="folder_select_error_title">Select folder fail</string>
99102
<string name="folder_select_error_body">Error: %s</string>
100-
<string name="folder_select_create_folder_error">Create dir fail</string>
103+
<string name="folder_select_create_folder_error">Create folder fail</string>
104+
<string name="folder_select_create_new_folder_hint">Input folder name</string>
101105
<!-- Folder Select End -->
102106

103107
</resources>

0 commit comments

Comments
 (0)