diff --git a/app/src/main/java/jp/atled/agileworks/view/base/BaseViewModel.kt b/app/src/main/java/jp/atled/agileworks/view/base/BaseViewModel.kt index 31e7adecf0a97477a7ec4983e0293be98eb607cb..571531a7271a199d8c211eeee3b484300aa650f8 100644 --- a/app/src/main/java/jp/atled/agileworks/view/base/BaseViewModel.kt +++ b/app/src/main/java/jp/atled/agileworks/view/base/BaseViewModel.kt @@ -1,11 +1,26 @@ package jp.atled.agileworks.view.base +import androidx.annotation.IdRes import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.launch open class BaseViewModel : ViewModel() { val dataLoading = MutableLiveData().apply { value = false } val logout = MutableLiveData() + + private val reselectedItemSource : MutableSharedFlow = MutableSharedFlow() + val reselectedItem: SharedFlow = reselectedItemSource.asSharedFlow() + + fun reselectBottomNavigationItem(@IdRes selectedId: Int){ + viewModelScope.launch { + reselectedItemSource.emit(selectedId) + } + } } \ No newline at end of file diff --git a/app/src/main/java/jp/atled/agileworks/view/ui/MainActivity.kt b/app/src/main/java/jp/atled/agileworks/view/ui/MainActivity.kt index 1322ca82587e5de13e46754bfda378ef1c4c3482..f365be262335c2df3cfc4364563d2990e581d7fa 100644 --- a/app/src/main/java/jp/atled/agileworks/view/ui/MainActivity.kt +++ b/app/src/main/java/jp/atled/agileworks/view/ui/MainActivity.kt @@ -9,6 +9,7 @@ import android.os.Build import android.os.Bundle import android.util.Log import android.widget.TextView +import androidx.activity.viewModels import androidx.annotation.RequiresApi import androidx.annotation.StringRes import androidx.appcompat.app.ActionBar @@ -27,6 +28,7 @@ import jp.atled.agileworks.common.util.toFormattedString import jp.atled.agileworks.model.DeviceInfoRepository import jp.atled.agileworks.model.FcmRepository import jp.atled.agileworks.view.base.BaseActivity +import jp.atled.agileworks.view.base.BaseViewModel import jp.atled.agileworks.view.ui.documentweb.DocumentWebFragment import jp.atled.agileworks.view.ui.login.LoginUtil import jp.atled.agileworks.view.utils.putNonNullStingFromExtra @@ -38,6 +40,7 @@ class MainActivity : BaseActivity() { private var currentNavController: LiveData? = null private lateinit var appBarConfiguration: AppBarConfiguration + private val viewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { Log.d(TAG, "call onCreate, url = ${intent?.getStringExtra("url")}, title = ${intent?.getStringExtra("title")}") @@ -135,7 +138,8 @@ class MainActivity : BaseActivity() { navGraphIds = navGraphIds, fragmentManager = flagmentManager, containerId = R.id.main_nav_fragment, - intent = intent + intent = intent, + viewModel = viewModel ) /* webview 表示時 BottomNavigation を非表示にするリスト(残しておく) */ diff --git a/app/src/main/java/jp/atled/agileworks/view/ui/NavigationExtensions.kt b/app/src/main/java/jp/atled/agileworks/view/ui/NavigationExtensions.kt index ef206a4e3f17f8d655d336b5780d75ac623c22b8..f88b25dca3d22968b79c5caceb8ad1034bf13068 100644 --- a/app/src/main/java/jp/atled/agileworks/view/ui/NavigationExtensions.kt +++ b/app/src/main/java/jp/atled/agileworks/view/ui/NavigationExtensions.kt @@ -27,6 +27,7 @@ import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment import com.google.android.material.bottomnavigation.BottomNavigationView import jp.atled.agileworks.R +import jp.atled.agileworks.view.base.BaseViewModel /** * Manages the various graphs needed for a [BottomNavigationView]. @@ -37,7 +38,8 @@ fun BottomNavigationView.setupWithNavController( navGraphIds: List, fragmentManager: FragmentManager, containerId: Int, - intent: Intent + intent: Intent, + viewModel: BaseViewModel ): LiveData { // Map of tags @@ -133,7 +135,7 @@ fun BottomNavigationView.setupWithNavController( } // Optional: on item reselected, pop back stack to the destination of the graph - setupItemReselected(graphIdToTagMap, fragmentManager) + setupItemReselected(graphIdToTagMap, fragmentManager, viewModel) // Handle deep link setupDeepLinks(navGraphIds, fragmentManager, containerId, intent) @@ -181,13 +183,15 @@ private fun BottomNavigationView.setupDeepLinks( private fun BottomNavigationView.setupItemReselected( graphIdToTagMap: SparseArray, - fragmentManager: FragmentManager + fragmentManager: FragmentManager, + viewModel: BaseViewModel ) { setOnNavigationItemReselectedListener { item -> val newlySelectedItemTag = graphIdToTagMap[item.itemId] val selectedFragment = fragmentManager.findFragmentByTag(newlySelectedItemTag) as NavHostFragment val navController = selectedFragment.navController + viewModel.reselectBottomNavigationItem(item.itemId) // Pop the back stack to the start destination of the current navController graph navController.popBackStack( navController.graph.startDestination, false diff --git a/app/src/main/java/jp/atled/agileworks/view/ui/documentweb/DocumentWebFragment.kt b/app/src/main/java/jp/atled/agileworks/view/ui/documentweb/DocumentWebFragment.kt index 6fe824773832bc605aeacc6b69ac21f5d532f655..df918789684b4b3d37dfe936bc6934fe9777f586 100644 --- a/app/src/main/java/jp/atled/agileworks/view/ui/documentweb/DocumentWebFragment.kt +++ b/app/src/main/java/jp/atled/agileworks/view/ui/documentweb/DocumentWebFragment.kt @@ -16,12 +16,17 @@ import android.widget.TextView import android.widget.Toolbar import androidx.core.view.GestureDetectorCompat import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import jp.atled.agileworks.R import jp.atled.agileworks.AwApp import jp.atled.agileworks.databinding.FragmentWebviewDetailBinding import jp.atled.agileworks.model.SessionRepository +import jp.atled.agileworks.view.base.BaseViewModel import kotlinx.android.synthetic.main.fragment_webview_detail.* +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.launch import java.lang.Exception import kotlin.math.absoluteValue @@ -36,11 +41,14 @@ class DocumentWebFragment : Fragment(), DocumentWebPresenter { private var webview: WebView? = null private var lastUrl: String? = null private var connectUrl: String? = null + private var getUrl: String? = null // スワイプのジェスチャー。折に触れて状態設定をする必要があるのでメンバーとして持つ。 // 必要とされるタイミング次第で null のままのことがある恐れがあるので lateinit にはしていない。 private var swipeGestureListener: SwipeGestureListener? = null + private val baseViewModel by activityViewModels() + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { viewDataBinding = FragmentWebviewDetailBinding.inflate(inflater, container, false).apply { viewModel = ViewModelProvider(this@DocumentWebFragment).get(DocumentWebViewModel::class.java) @@ -49,6 +57,17 @@ class DocumentWebFragment : Fragment(), DocumentWebPresenter { networkEvent = NetworkEvent(viewDataBinding) multilingualControl = MultilingualControl(requireActivity()) + lifecycleScope.launch { + baseViewModel.reselectedItem + .collect { + webview?.let { + getUrl = it.getUrl() + } + if(getUrl != connectUrl){ + applyCookieManager(connectUrl, true) + } + } + } return viewDataBinding.root }