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