Skip to content

Commit ea6d05c

Browse files
committed
Fragment Add scroll.
1 parent 3b70480 commit ea6d05c

File tree

7 files changed

+125
-156
lines changed

7 files changed

+125
-156
lines changed

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,23 @@ abstract class BaseFragment<Binding: ViewDataBinding, State>(
4242
val rootView = this.rootView
4343
return if (rootView == null) {
4444
binding = DataBindingUtil.inflate(inflater, layoutId, container, false)
45-
initViews(binding)
4645
this.rootView = binding.root
4746
binding.root
4847
} else {
4948
rootView
5049
}
5150
}
5251

52+
53+
var isInit = false
54+
override fun onResume() {
55+
super.onResume()
56+
if (!isInit) {
57+
initViews(binding)
58+
isInit = true
59+
}
60+
}
61+
5362
open fun initViews(binding: Binding) {
5463

5564
}

app/src/main/java/com/tans/tfiletransporter/ui/activity/filetransport/MyAppsFragment.kt

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import com.tans.tfiletransporter.databinding.MyAppsFragmentLayoutBinding
1414
import com.tans.tfiletransporter.net.model.File
1515
import com.tans.tfiletransporter.ui.activity.BaseFragment
1616
import com.tans.tfiletransporter.ui.activity.commomdialog.loadingDialog
17+
import com.tans.tfiletransporter.ui.activity.filetransport.activity.DirTabType
18+
import com.tans.tfiletransporter.ui.activity.filetransport.activity.FileTransportActivity
1719
import com.tans.tfiletransporter.ui.activity.filetransport.activity.FileTransportScopeData
1820
import com.tans.tfiletransporter.ui.activity.filetransport.activity.newFilesShareWriterHandle
1921
import com.tans.tfiletransporter.utils.dp2px
@@ -112,31 +114,38 @@ class MyAppsFragment : BaseFragment<MyAppsFragmentLayoutBinding, MyAppsState>(
112114
)
113115

114116
scopeData.floatBtnEvent
115-
.filter { !isHidden }
116-
.observeOn(Schedulers.io())
117-
.switchMapSingle {
118-
rxSingle {
119-
val selectedApps = bindState().firstOrError().map { it.selected }.await()
120-
val files = selectedApps.filter { Files.isReadable(Paths.get(it.sourceDir)) }.map {
121-
File(name = "${it.name}_${it.packageName}.apk",
122-
path = it.sourceDir,
123-
size = it.appSize,
124-
lastModify = OffsetDateTime.now())
125-
}
126-
if (selectedApps.isNotEmpty()) {
127-
scopeData.fileTransporter.startWriterHandleWhenFinish(
128-
requireActivity().newFilesShareWriterHandle(
129-
files = files,
130-
pathConverter = { file -> Paths.get(file.path) }
131-
)
117+
.flatMapSingle {
118+
(activity as FileTransportActivity).bindState().map { it.selectedTabType }
119+
.firstOrError()
120+
}
121+
.filter { it == DirTabType.MyApps }
122+
.observeOn(Schedulers.io())
123+
.switchMapSingle {
124+
rxSingle {
125+
val selectedApps = bindState().firstOrError().map { it.selected }.await()
126+
val files =
127+
selectedApps.filter { Files.isReadable(Paths.get(it.sourceDir)) }.map {
128+
File(
129+
name = "${it.name}_${it.packageName}.apk",
130+
path = it.sourceDir,
131+
size = it.appSize,
132+
lastModify = OffsetDateTime.now()
132133
)
133-
updateState { it.copy(selected = emptySet()) }.await()
134134
}
135-
}.onErrorResumeNext {
136-
Single.just(Unit)
135+
if (selectedApps.isNotEmpty()) {
136+
scopeData.fileTransporter.startWriterHandleWhenFinish(
137+
requireActivity().newFilesShareWriterHandle(
138+
files = files,
139+
pathConverter = { file -> Paths.get(file.path) }
140+
)
141+
)
142+
updateState { it.copy(selected = emptySet()) }.await()
137143
}
144+
}.onErrorResumeNext {
145+
Single.just(Unit)
138146
}
139-
.bindLife()
147+
}
148+
.bindLife()
140149
}
141150

142151
@SuppressLint("QueryPermissionsNeeded")

app/src/main/java/com/tans/tfiletransporter/ui/activity/filetransport/MyDirFragment.kt

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ import com.tans.tfiletransporter.file.FileConstants.homePath
2121
import com.tans.tfiletransporter.file.FileConstants.homePathString
2222
import com.tans.tfiletransporter.ui.activity.BaseFragment
2323
import com.tans.tfiletransporter.ui.activity.commomdialog.loadingDialog
24-
import com.tans.tfiletransporter.ui.activity.filetransport.activity.FileTransportScopeData
25-
import com.tans.tfiletransporter.ui.activity.filetransport.activity.newFilesShareWriterHandle
26-
import com.tans.tfiletransporter.ui.activity.filetransport.activity.toFile
24+
import com.tans.tfiletransporter.ui.activity.filetransport.activity.*
2725
import com.tans.tfiletransporter.utils.dp2px
2826
import io.reactivex.Single
2927
import io.reactivex.android.schedulers.AndroidSchedulers
@@ -204,18 +202,22 @@ class MyDirFragment : BaseFragment<MyDirFragmentBinding, MyDirFragmentState>(R.l
204202
)
205203

206204
fileTransportScopeData.floatBtnEvent
207-
.withLatestFrom(bindState().map { it.selectedFiles })
208-
.filter { !isHidden && it.second.isNotEmpty() }
209-
.flatMapSingle { (_, selectedFiles) ->
210-
rxSingle {
211-
fileTransportScopeData.fileTransporter.writerHandleChannel.send(requireActivity().newFilesShareWriterHandle(
212-
selectedFiles.map { it.toFile() }
213-
))
214-
}.flatMap {
215-
updateState { state -> state.copy(selectedFiles = emptySet()) }
216-
}
205+
.flatMapSingle {
206+
(activity as FileTransportActivity).bindState().map { it.selectedTabType }
207+
.firstOrError()
208+
}
209+
.withLatestFrom(bindState().map { it.selectedFiles })
210+
.filter { it.first == DirTabType.MyDir && it.second.isNotEmpty() }
211+
.flatMapSingle { (_, selectedFiles) ->
212+
rxSingle {
213+
fileTransportScopeData.fileTransporter.writerHandleChannel.send(requireActivity().newFilesShareWriterHandle(
214+
selectedFiles.map { it.toFile() }
215+
))
216+
}.flatMap {
217+
updateState { state -> state.copy(selectedFiles = emptySet()) }
217218
}
218-
.bindLife()
219+
}
220+
.bindLife()
219221

220222
binding.refreshLayout.refreshes()
221223
.flatMapSingle {

app/src/main/java/com/tans/tfiletransporter/ui/activity/filetransport/MyImagesFragment.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import com.tans.tfiletransporter.databinding.MyImagesFragmentLayoutBinding
1717
import com.tans.tfiletransporter.net.commonNetBufferPool
1818
import com.tans.tfiletransporter.net.model.File
1919
import com.tans.tfiletransporter.ui.activity.BaseFragment
20+
import com.tans.tfiletransporter.ui.activity.filetransport.activity.DirTabType
21+
import com.tans.tfiletransporter.ui.activity.filetransport.activity.FileTransportActivity
2022
import com.tans.tfiletransporter.ui.activity.filetransport.activity.FileTransportScopeData
2123
import com.tans.tfiletransporter.ui.activity.filetransport.activity.newFilesShareWriterHandle
2224
import com.tans.tfiletransporter.utils.readFrom
@@ -125,7 +127,11 @@ class MyImagesFragment : BaseFragment<MyImagesFragmentLayoutBinding, MyImagesSta
125127
.bindLife()
126128

127129
scopeData.floatBtnEvent
128-
.filter { !isHidden }
130+
.flatMapSingle {
131+
(activity as FileTransportActivity).bindState().map { it.selectedTabType }
132+
.firstOrError()
133+
}
134+
.filter { it == DirTabType.MyImages }
129135
.observeOn(Schedulers.io())
130136
.switchMapSingle {
131137
rxSingle {

app/src/main/java/com/tans/tfiletransporter/ui/activity/filetransport/RemoteDirFragment.kt

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,7 @@ import com.tans.tfiletransporter.file.*
1919
import com.tans.tfiletransporter.ui.activity.BaseFragment
2020
import com.tans.tfiletransporter.ui.activity.commomdialog.loadingDialog
2121
import com.tans.tfiletransporter.ui.activity.commomdialog.showLoadingDialog
22-
import com.tans.tfiletransporter.ui.activity.filetransport.activity.FileTransportScopeData
23-
import com.tans.tfiletransporter.ui.activity.filetransport.activity.newRequestFilesShareWriterHandle
24-
import com.tans.tfiletransporter.ui.activity.filetransport.activity.newRequestFolderChildrenShareWriterHandle
25-
import com.tans.tfiletransporter.ui.activity.filetransport.activity.toFile
22+
import com.tans.tfiletransporter.ui.activity.filetransport.activity.*
2623
import com.tans.tfiletransporter.utils.dp2px
2724
import io.reactivex.Single
2825
import io.reactivex.android.schedulers.AndroidSchedulers
@@ -190,23 +187,30 @@ class RemoteDirFragment : BaseFragment<RemoteDirFragmentBinding, RemoteDirState>
190187
)
191188

192189
fileTransportScopeData.floatBtnEvent
193-
.withLatestFrom(bindState().map { it.selectedFiles })
194-
.map { it.second }
195-
.filter { !isHidden && it.isNotEmpty() }
196-
.observeOn(AndroidSchedulers.mainThread())
197-
.flatMapSingle {
198-
rxSingle {
199-
val dialog = withContext(Dispatchers.Main) { requireActivity().showLoadingDialog() }
200-
withContext(Dispatchers.IO) {
201-
fileTransportScopeData.fileTransporter.startWriterHandleWhenFinish(newRequestFilesShareWriterHandle(it.map { it.toFile() }))
202-
}
203-
updateState {
204-
it.copy(selectedFiles = emptySet())
205-
}.await()
206-
withContext(Dispatchers.Main) { dialog.cancel() }
190+
.flatMapSingle {
191+
(activity as FileTransportActivity).bindState().map { it.selectedTabType }
192+
.firstOrError()
193+
}
194+
.withLatestFrom(bindState().map { it.selectedFiles })
195+
.filter { it.first == DirTabType.RemoteDir && it.second.isNotEmpty() }
196+
.map { it.second }
197+
.observeOn(AndroidSchedulers.mainThread())
198+
.flatMapSingle {
199+
rxSingle {
200+
val dialog =
201+
withContext(Dispatchers.Main) { requireActivity().showLoadingDialog() }
202+
withContext(Dispatchers.IO) {
203+
fileTransportScopeData.fileTransporter.startWriterHandleWhenFinish(
204+
newRequestFilesShareWriterHandle(it.map { it.toFile() })
205+
)
207206
}
207+
updateState {
208+
it.copy(selectedFiles = emptySet())
209+
}.await()
210+
withContext(Dispatchers.Main) { dialog.cancel() }
208211
}
209-
.bindLife()
212+
}
213+
.bindLife()
210214

211215
binding.refreshLayout.refreshes()
212216
.flatMapSingle {

app/src/main/java/com/tans/tfiletransporter/ui/activity/filetransport/activity/FileTransportActivity.kt

Lines changed: 36 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@ import android.content.Context
44
import android.content.Intent
55
import android.util.Log
66
import android.view.View
7+
import androidx.appcompat.app.AppCompatActivity
8+
import androidx.fragment.app.Fragment
79
import com.google.android.material.appbar.AppBarLayout
810
import com.google.android.material.tabs.TabLayout
11+
import com.google.android.material.tabs.TabLayoutMediator
912
import com.jakewharton.rxbinding3.view.clicks
1013
import com.squareup.moshi.Types
14+
import com.tans.rxutils.switchThread
1115
import com.tans.tfiletransporter.R
1216
import com.tans.tfiletransporter.databinding.FileTransportActivityBinding
1317
import com.tans.tfiletransporter.moshi
@@ -17,10 +21,13 @@ import com.tans.tfiletransporter.net.filetransporter.launchFileTransport
1721
import com.tans.tfiletransporter.net.model.File
1822
import com.tans.tfiletransporter.net.model.ResponseFolderModelJsonAdapter
1923
import com.tans.tfiletransporter.ui.activity.BaseActivity
24+
import com.tans.tfiletransporter.ui.activity.BaseFragment
2025
import com.tans.tfiletransporter.ui.activity.commomdialog.showLoadingDialog
2126
import com.tans.tfiletransporter.ui.activity.commomdialog.showNoOptionalDialog
2227
import com.tans.tfiletransporter.ui.activity.filetransport.*
2328
import com.tans.tfiletransporter.utils.*
29+
import com.tans.tfiletransporter.viewpager2.FragmentStateAdapter
30+
import io.reactivex.android.schedulers.AndroidSchedulers
2431
import io.reactivex.rxkotlin.cast
2532
import kotlinx.coroutines.Dispatchers
2633
import kotlinx.coroutines.launch
@@ -35,11 +42,17 @@ import java.util.*
3542
import kotlin.runCatching
3643

3744
data class FileTransportActivityState(
38-
val selectedTabType: DirTabType = DirTabType.MyApps,
39-
val connectionStatus: ConnectionStatus = ConnectionStatus.Connecting
45+
val selectedTabType: DirTabType = DirTabType.MyApps,
46+
val connectionStatus: ConnectionStatus = ConnectionStatus.Connecting
4047
)
4148

42-
enum class DirTabType { MyApps, MyImages, MyDir, RemoteDir, Message }
49+
enum class DirTabType(val tabName: String) {
50+
MyApps("MY APPS"),
51+
MyImages("MY IMAGES"),
52+
MyDir("MY FOLDER"),
53+
RemoteDir("REMOTE FOLDER"),
54+
Message("MESSAGE")
55+
}
4356

4457

4558
sealed class ConnectionStatus {
@@ -56,6 +69,13 @@ class FileTransportActivity : BaseActivity<FileTransportActivityBinding, FileTra
5669

5770
private val fileTransportScopeData by instance<FileTransportScopeData>()
5871

72+
private val fragments: Map<DirTabType, BaseFragment<*, *>> = mapOf(
73+
DirTabType.MyApps to MyAppsFragment(),
74+
DirTabType.MyImages to MyImagesFragment(),
75+
DirTabType.MyDir to MyDirFragment(),
76+
DirTabType.RemoteDir to RemoteDirFragment(),
77+
DirTabType.Message to MessageFragment())
78+
5979
override fun DI.MainBuilder.addDIInstance() {
6080
bind<FileTransportScopeData>() with singleton {
6181
val connected = bindState().firstOrError().map { it.connectionStatus as ConnectionStatus.Connected }.blockingGet()
@@ -166,6 +186,13 @@ class FileTransportActivity : BaseActivity<FileTransportActivityBinding, FileTra
166186
}
167187
loadingDialog.cancel()
168188

189+
binding.viewPager.adapter = object : FragmentStateAdapter(this@FileTransportActivity) {
190+
override fun getItemCount(): Int = fragments.size
191+
override fun createFragment(position: Int): Fragment = fragments[DirTabType.values()[position]]!!
192+
}
193+
194+
TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position -> tab.text = DirTabType.values()[position].tabName }.attach()
195+
169196
binding.tabLayout.addOnTabSelectedListener(object :
170197
TabLayout.OnTabSelectedListener {
171198
override fun onTabSelected(tab: TabLayout.Tab?) {
@@ -203,10 +230,6 @@ class FileTransportActivity : BaseActivity<FileTransportActivityBinding, FileTra
203230

204231
render({ it.selectedTabType }) {
205232

206-
if (binding.tabLayout.selectedTabPosition != it.ordinal) {
207-
binding.tabLayout.selectTab(binding.tabLayout.getTabAt(it.ordinal))
208-
}
209-
210233
when (it) {
211234
DirTabType.MyApps, DirTabType.MyImages, DirTabType.MyDir, DirTabType.RemoteDir -> {
212235
val lpCollapsing = (binding.collapsingLayout.layoutParams as? AppBarLayout.LayoutParams)
@@ -233,65 +256,18 @@ class FileTransportActivity : BaseActivity<FileTransportActivityBinding, FileTra
233256
binding.floatingActionBt.visibility = View.GONE
234257
}
235258
}
236-
changeDirFragment(it)
259+
binding.appbarLayout.setExpanded(true, true)
237260
}.bindLife()
238261
}
239262
}
240263

241-
private fun changeDirFragment(dirTabType: DirTabType) {
242-
val transaction = supportFragmentManager.beginTransaction()
243-
binding.appbarLayout.setExpanded(true, true)
244-
val showFragment = when (dirTabType) {
245-
DirTabType.MyApps -> {
246-
var fragment = supportFragmentManager.findFragmentByTag(MyAppsFragment.FRAGMENT_TAG)
247-
if (fragment == null) {
248-
fragment = MyAppsFragment()
249-
transaction.add(R.id.fragment_container_layout, fragment, MyAppsFragment.FRAGMENT_TAG)
250-
}
251-
fragment
252-
}
253-
254-
DirTabType.MyImages -> {
255-
var fragment = supportFragmentManager.findFragmentByTag(MyImagesFragment.FRAGMENT_TAG)
256-
if (fragment == null) {
257-
fragment = MyImagesFragment()
258-
transaction.add(R.id.fragment_container_layout, fragment, MyImagesFragment.FRAGMENT_TAG)
259-
}
260-
fragment
261-
}
262-
263-
DirTabType.MyDir -> {
264-
var fragment = supportFragmentManager.findFragmentByTag(MyDirFragment.FRAGMENT_TAG)
265-
if (fragment == null) {
266-
fragment = MyDirFragment()
267-
transaction.add(R.id.fragment_container_layout, fragment, MyDirFragment.FRAGMENT_TAG)
268-
}
269-
fragment
270-
}
271-
272-
DirTabType.RemoteDir -> {
273-
var fragment = supportFragmentManager.findFragmentByTag(RemoteDirFragment.FRAGMENT_TAG)
274-
if (fragment == null) {
275-
fragment = RemoteDirFragment()
276-
transaction.add(R.id.fragment_container_layout, fragment, RemoteDirFragment.FRAGMENT_TAG)
277-
}
278-
fragment
279-
}
280-
281-
DirTabType.Message -> {
282-
var fragment = supportFragmentManager.findFragmentByTag(MessageFragment.FRAGMENT_TAG)
283-
if (fragment == null) {
284-
fragment = MessageFragment()
285-
transaction.add(R.id.fragment_container_layout, fragment, MessageFragment.FRAGMENT_TAG)
286-
}
287-
fragment
264+
override fun onBackPressed() {
265+
launch {
266+
val tabType = withContext(Dispatchers.IO) { bindState().firstOrError().map { it.selectedTabType }.await() }
267+
if (fragments[tabType]?.onBackPressed() != true) {
268+
finish()
288269
}
289270
}
290-
transaction.show(showFragment)
291-
for (f in supportFragmentManager.fragments) {
292-
if (f != showFragment) { transaction.hide(f) }
293-
}
294-
transaction.commitAllowingStateLoss()
295271
}
296272

297273
companion object {

0 commit comments

Comments
 (0)