diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..7643783 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,123 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1a4aeb6..b61a07e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -39,6 +39,9 @@ + + + = context.datastore.data.map { - it[stringPreferencesKey(key)] + override suspend fun getString(key: String): Flow { + return context.datastore.data.map { + it[stringPreferencesKey(key)] + } } override suspend fun saveInt(key: String, content: Int) { @@ -47,11 +49,14 @@ class PreferencesRepositoryImp @Inject constructor( } } + override suspend fun getInt(key: String): Flow = context.datastore.data.map { it[intPreferencesKey(key)] } override fun loginUser(): Flow { - return loginUser.data + val f = loginUser.data + Log.e("jingo", "获取用户信息总接口 ${f.hashCode()}") + return f } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/MainActivity.kt b/app/src/main/java/com/navinfo/volvo/ui/MainActivity.kt index 63ed490..bac72a2 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/MainActivity.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/MainActivity.kt @@ -2,20 +2,16 @@ package com.navinfo.volvo.ui import android.content.DialogInterface import android.os.Bundle -import android.view.Gravity +import android.util.Log import android.view.View import android.widget.Toast import androidx.activity.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle +import androidx.navigation.NavOptions import androidx.navigation.findNavController -import androidx.navigation.ui.AppBarConfiguration -import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupWithNavController -import androidx.transition.Slide -import androidx.transition.Transition -import androidx.transition.TransitionManager import com.easytools.tools.FileUtils import com.elvishew.xlog.BuildConfig import com.elvishew.xlog.LogConfiguration @@ -45,14 +41,12 @@ class MainActivity : BaseActivity() { private lateinit var binding: ActivityMainBinding private val viewModel by viewModels() - - + private var curId: Int = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - + initView() XXPermissions.with(this) // 申请单个权限 .permission(Permission.WRITE_EXTERNAL_STORAGE) @@ -83,25 +77,32 @@ class MainActivity : BaseActivity() { } else { onSDCardDenied() showRationaleForSDCard(permissions) + setupNavigation() } } }) } + private fun initView() { +// supportActionBar.setDefaultDisplayHomeAsUpEnabled() + } + + /** + * 设置底部导航栏 + */ private fun setupNavigation() { val navView: BottomNavigationView = binding.navView val newMessageView = binding.newMessageFab val navController = findNavController(R.id.nav_host_fragment_activity_main) - val appBarConfiguration = AppBarConfiguration( - setOf( - R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications, - R.id.navigation_setting, - ) - ) - setupActionBarWithNavController(navController, appBarConfiguration) +// val appBarConfiguration = AppBarConfiguration( +// setOf( +// R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications, +// R.id.navigation_setting, +// ) +// ) +// setupActionBarWithNavController(navController, appBarConfiguration) navView.setupWithNavController(navController) - lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.getUnreadCount().collect { @@ -114,44 +115,88 @@ class MainActivity : BaseActivity() { } } } + navView.setOnItemSelectedListener { + if (it.itemId != curId) { + val options = NavOptions.Builder().setPopUpTo( + curId, + inclusive = true, + saveState = true + ).build() + navController.navigate(it.itemId, null, options) +// when (it.itemId) { +// R.id.navigation_home -> { +// +// } +// R.id.navigation_dashboard -> { +// navController.navigate(it.itemId) +// } +// R.id.navigation_setting -> { +// navController.navigate(it.itemId) +// } +// R.id.navigation_notifications -> { +// navController.navigate(it.itemId) +// } +// } + } + true + } + + navView.setOnItemReselectedListener { + when (it.itemId) { + R.id.navigation_home -> Log.e("jingo", "我是 Reselected navigation_home") + R.id.navigation_dashboard -> Log.e("jingo", "我是 Reselected navigation_dashboard") + R.id.navigation_setting -> Log.e("jingo", "我是 Reselected navigation_setting") + R.id.navigation_notifications -> Log.e( + "jingo", + "我是 Reselected navigation_notifications" + ) + } + true + } navController.addOnDestinationChangedListener { _, destination, _ -> - if (supportActionBar != null) { - if (destination.id == R.id.navigation_login) { - supportActionBar!!.hide() - } else if (!supportActionBar!!.isShowing) { - supportActionBar!!.show() - } - } - - if (destination.id == R.id.navigation_home || destination.id == R.id.navigation_dashboard || destination.id == R.id.navigation_notifications) { - runOnUiThread { - val transition: Transition = Slide(Gravity.BOTTOM) - transition.duration = 500; - TransitionManager.beginDelayedTransition(binding.root, transition); +// if (supportActionBar != null) { +// if (destination.id == R.id.navigation_login || destination.id == R.id.navigation_splash) { +// supportActionBar!!.hide() +// } else if (!supportActionBar!!.isShowing) { +// supportActionBar!!.show() +// } +// } + curId = destination.id + if (destination.id == R.id.navigation_home + || destination.id == R.id.navigation_dashboard + || destination.id == R.id.navigation_notifications + || destination.id == R.id.navigation_setting + ) { + if (navView.visibility != View.VISIBLE) { +// runOnUiThread { +// val transition: Transition = Slide(Gravity.BOTTOM) +// transition.duration = 500; +// TransitionManager.beginDelayedTransition(binding.root, transition); navView.visibility = View.VISIBLE newMessageView.visibility = View.VISIBLE +// } } } else { - runOnUiThread { - val transition: Transition = Slide(Gravity.BOTTOM) - transition.duration = 500; - TransitionManager.beginDelayedTransition(binding.root, transition); + if (navView.visibility != View.GONE) { +// runOnUiThread { +// val transition: Transition = Slide(Gravity.BOTTOM) +// transition.duration = 500; +// TransitionManager.beginDelayedTransition(binding.root, transition); navView.visibility = View.GONE newMessageView.visibility = View.GONE +// } } } } binding.newMessageFab.setOnClickListener { -// val intent: Intent = Intent(this@MainActivity, MessageActivity::class.java) -// startActivity(intent) navController.navigate(R.id.navigation_obtain_message) } } - override fun onSupportNavigateUp() = - findNavController(R.id.nav_host_fragment_activity_main).navigateUp() +// override fun onSupportNavigateUp() = +// findNavController(R.id.nav_host_fragment_activity_main).navigateUp() // @NeedsPermission(Manifest.permission.MANAGE_EXTERNAL_STORAGE) fun createRootFolder() { diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/BaseFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/BaseFragment.kt index 93cd6e2..18bacfc 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/BaseFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/BaseFragment.kt @@ -1,10 +1,29 @@ package com.navinfo.volvo.ui.fragments +import android.view.animation.Animation +import android.view.animation.AnimationUtils import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider -import javax.inject.Inject -abstract class BaseFragment : Fragment() { -// @Inject +abstract class BaseFragment : Fragment(){//}, Animation.AnimationListener { + // @Inject // lateinit var viewModelFactoryProvider: ViewModelProvider.Factory + +// override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation { +// val anima = AnimationUtils.loadAnimation(requireActivity(), nextAnim) +// anima.setAnimationListener(this) +// return anima +// } +// +// override fun onAnimationRepeat(animation: Animation?) { +// +// } +// +// override fun onAnimationEnd(animation: Animation?) { +// +// } +// +// override fun onAnimationStart(animation: Animation?) { +// +// } + } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/dashboard/DashboardFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/dashboard/DashboardFragment.kt index 5d0998b..801e6b2 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/dashboard/DashboardFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/dashboard/DashboardFragment.kt @@ -8,8 +8,9 @@ import android.widget.TextView import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.navinfo.volvo.databinding.FragmentDashboardBinding +import com.navinfo.volvo.ui.fragments.BaseFragment -class DashboardFragment : Fragment() { +class DashboardFragment : BaseFragment() { private var _binding: FragmentDashboardBinding? = null diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeFragment.kt index d00bb13..7b7e494 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeFragment.kt @@ -42,15 +42,17 @@ class HomeFragment : BaseFragment(), OnItemClickListener, OnItemMenuClickListene inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false) -// _binding = FragmentHomeBinding.inflate(inflater, container, false) val root: View = _binding.root _binding.lifecycleOwner = this - headView = HomeAdapterNotingBinding.inflate(inflater, container, false) - initView() return root } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initView() + } + private fun initView() { //创建菜单选项 //注意:使用滑动菜单不能开启滑动删除,否则只有滑动删除没有滑动菜单 diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeViewModel.kt index 9a429bc..b5a3c62 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeViewModel.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/home/HomeViewModel.kt @@ -42,18 +42,19 @@ class HomeViewModel @Inject constructor( var userName: String = "" init { - Log.e("jingo","当前的homeviewmodel 是 ${hashCode()}") + Log.e("jingo", "当前的homeviewmodel 是 ${hashCode()}") viewModelScope.launch { shard.loginUser().collectLatest { - userName = it!!.username - Log.e("jingo","用户赋值结束 是 ${userName.hashCode()}") + if (it != null) { + userName = it.username + } + Log.e("jingo", "用户赋值结束 是 ${it.hashCode()}") } } - } suspend fun getNetMessageList(): Flow> { - Log.e("jingo","用户赋值了吗? $userName ${userName.hashCode()}") + Log.e("jingo", "用户赋值了吗? $userName ${hashCode()}") val messagePost = NetworkMessageListPost(who = userName) return netRepository.getMessagePaging(context = application, messagePost) diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/login/LoginFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/login/LoginFragment.kt index d248c92..37c12ee 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/login/LoginFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/login/LoginFragment.kt @@ -8,7 +8,6 @@ import android.widget.Toast import androidx.databinding.DataBindingUtil import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle -import androidx.lifecycle.Observer import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.navigation.fragment.findNavController @@ -16,7 +15,6 @@ import com.navinfo.volvo.R import com.navinfo.volvo.databinding.FragmentLoginBinding import com.navinfo.volvo.ui.fragments.BaseFragment import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.cancel import kotlinx.coroutines.launch @@ -34,24 +32,31 @@ class LoginFragment : BaseFragment() { viewBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_login, container, false) viewBinding.lifecycleOwner = this - initView() return viewBinding.root } - private fun initView() { + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initView() + } - lifecycleScope.launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.user.collect { - if (it != null) { - viewBinding.loginUser = it - } - } - } - } + private fun initView() { +// //获取用户信息,设置到用户登录框中 +// lifecycleScope.launch { +// repeatOnLifecycle(Lifecycle.State.STARTED) { +// viewModel.userFlow.collect { +// if (it != null) { +// viewBinding.loginUser = it +// } +// } +// } +// } + viewBinding.loginUser = viewModel.loginUser + //注册按钮点击 viewBinding.loginFragmentRegisterButton.setOnClickListener { } + //登录按钮点击 viewBinding.loginFragmentLoginButton.setOnClickListener { if (viewBinding.loginUsername.text!!.isEmpty()) { Toast.makeText(context, "请输入用户名", Toast.LENGTH_SHORT).show() @@ -61,8 +66,8 @@ class LoginFragment : BaseFragment() { Toast.makeText(context, "请输入密码", Toast.LENGTH_SHORT).show() return@setOnClickListener } - lifecycleScope.launch{ - repeatOnLifecycle(Lifecycle.State.STARTED){ + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.onClickLogin( viewBinding.loginUsername.text.toString(), viewBinding.loginPassword.text.toString() diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/login/LoginViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/login/LoginViewModel.kt index 1b08bcc..75ad6df 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/login/LoginViewModel.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/login/LoginViewModel.kt @@ -1,22 +1,30 @@ package com.navinfo.volvo.ui.fragments.login -import androidx.lifecycle.MutableLiveData +import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.navinfo.volvo.model.proto.LoginUser import com.navinfo.volvo.repository.preferences.PreferencesRepository -import com.navinfo.volvo.util.asLiveData -//import com.navinfo.volvo.repository.preferences.PreferencesRepository import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.Job -import kotlinx.coroutines.cancel +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class LoginViewModel @Inject constructor(private val repository: PreferencesRepository) : ViewModel() { + var loginUser: LoginUser? = null + + init { + Log.e("jingo", "LoginViewModel 是 ${hashCode()}") + viewModelScope.launch { + repository.loginUser().collectLatest { + Log.e("jingo", "用户赋值结束 是 ${it.hashCode()}") + loginUser = it + } + } + } - val user = repository.loginUser() suspend fun onClickLogin(name: String, password: String) { repository.saveLoginUser(id = "", name = name, password = password) diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/message/ObtainMessageFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/message/ObtainMessageFragment.kt index 67dbd67..9f97995 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/message/ObtainMessageFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/message/ObtainMessageFragment.kt @@ -46,6 +46,7 @@ import com.navinfo.volvo.database.entity.GreetingMessage import com.navinfo.volvo.databinding.FragmentObtainMessageBinding import com.navinfo.volvo.http.DownloadCallback import com.navinfo.volvo.model.VolvoModel +import com.navinfo.volvo.ui.fragments.BaseFragment import com.navinfo.volvo.ui.markRequiredInRed import com.navinfo.volvo.util.PhotoLoader import com.navinfo.volvo.utils.EasyMediaFile @@ -64,7 +65,7 @@ import kotlin.streams.toList @AndroidEntryPoint -class ObtainMessageFragment : Fragment() { +class ObtainMessageFragment : BaseFragment() { private var _binding: FragmentObtainMessageBinding? = null private val obtainMessageViewModel by viewModels() private val photoHelper by lazy { diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/message/ObtainMessageViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/message/ObtainMessageViewModel.kt index 052c21f..e14b02d 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/message/ObtainMessageViewModel.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/message/ObtainMessageViewModel.kt @@ -37,7 +37,7 @@ class ObtainMessageViewModel @Inject constructor( viewModelScope.launch { pre.loginUser().collectLatest { username = it!!.username - Log.e("jingo", "用户赋值结束 是 ${username.hashCode()}") + Log.e("jingo", "用户赋值结束 是 ${it.hashCode()}") } } } diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/notifications/NotificationsFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/notifications/NotificationsFragment.kt index 19bfb9c..7d3837d 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/notifications/NotificationsFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/notifications/NotificationsFragment.kt @@ -8,8 +8,9 @@ import android.widget.TextView import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.navinfo.volvo.databinding.FragmentNotificationsBinding +import com.navinfo.volvo.ui.fragments.BaseFragment -class NotificationsFragment : Fragment() { +class NotificationsFragment : BaseFragment() { private var _binding: FragmentNotificationsBinding? = null diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/setting/SettingFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/setting/SettingFragment.kt index 441b003..65ad38d 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/setting/SettingFragment.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/setting/SettingFragment.kt @@ -6,11 +6,15 @@ import android.view.View import android.view.ViewGroup import androidx.databinding.DataBindingUtil import androidx.fragment.app.viewModels +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import androidx.navigation.fragment.findNavController import com.navinfo.volvo.R import com.navinfo.volvo.databinding.FragmentSettingBinding import com.navinfo.volvo.ui.fragments.BaseFragment import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch @AndroidEntryPoint class SettingFragment : BaseFragment() { @@ -25,14 +29,23 @@ class SettingFragment : BaseFragment() { ): View { viewBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_setting, container, false) viewBinding.lifecycleOwner = this - initView() return viewBinding.root } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initView() + } + private fun initView() { //退出登录 viewBinding.loginFragmentLoginButton.setOnClickListener { - findNavController().navigate(R.id.action_setting_to_login) + lifecycleScope.launch{ + repeatOnLifecycle(Lifecycle.State.STARTED){ + viewModel.clearUser() + findNavController().navigate(R.id.action_setting_to_login) + } + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/setting/SettingModel.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/setting/SettingModel.kt index 86443c3..378af99 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/fragments/setting/SettingModel.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/setting/SettingModel.kt @@ -1,8 +1,19 @@ package com.navinfo.volvo.ui.fragments.setting +import android.util.Log import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.navinfo.volvo.repository.preferences.PreferencesRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch import javax.inject.Inject -class SettingModel @Inject constructor() : ViewModel() { +@HiltViewModel +class SettingModel @Inject constructor(private val pre: PreferencesRepository) : ViewModel() { + suspend fun clearUser() { + Log.e("jingo", "SettingModel clearUser") + pre.saveLoginUser("", "", "") + } } diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/splash/SplashFragment.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/splash/SplashFragment.kt new file mode 100644 index 0000000..73bd801 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/splash/SplashFragment.kt @@ -0,0 +1,144 @@ +package com.navinfo.volvo.ui.fragments.splash + +import android.annotation.SuppressLint +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.text.Html +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.viewModels +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.navigation.fragment.findNavController +import com.navinfo.volvo.R +import com.navinfo.volvo.databinding.FragmentSplashBinding +import com.navinfo.volvo.ui.fragments.BaseFragment +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.onCompletion +import kotlinx.coroutines.launch + +@AndroidEntryPoint +class SplashFragment : BaseFragment() { + + private val viewModel by viewModels() + private lateinit var viewBinding: FragmentSplashBinding + + // 位置的协程监听器 + private var timeDownJob: Job? = null + override fun onStart() { + Log.e("jingo", "onStart") + super.onStart() + + } + + override fun onCreate(savedInstanceState: Bundle?) { + Log.e("jingo", "onStart") + super.onCreate(savedInstanceState) + } + + override fun onPause() { + Log.e("jingo", "onPause") + super.onPause() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + Log.e("jingo", "onViewCreated") + super.onViewCreated(view, savedInstanceState) + initView() + } + + override fun onAttach(context: Context) { + Log.e("jingo", "onAttach") + super.onAttach(context) + } + + override fun onStop() { + Log.e("jingo", "onStop") + super.onStop() + timeDownJob?.apply { + this.cancel() + } + } + + override fun onResume() { + Log.e("jingo", "onResume") + super.onResume() + } + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + Log.e("jingo", "onCreateView") + viewBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_splash, container, false) + viewBinding.lifecycleOwner = this + return viewBinding.root + } + + private fun initView() { + //倒计时文字按钮 + viewBinding.timeDown.setOnClickListener { + navigate() + } + viewBinding.splashGoWeb.setOnClickListener { + //实现跳转网页的主要代码 + val intent = Intent(); + intent.action = "android.intent.action.VIEW"; + val contentUrl = Uri.parse("https://www.volvocars.com.cn/zh-cn"); + intent.data = contentUrl; + startActivity(intent); + } + // 由于 repeatOnLifecycle 是一个挂起函数, + // 因此从 lifecycleScope 中创建新的协程 + timeDownJob = lifecycleScope.launch { + // 直到 lifecycle 进入 DESTROYED 状态前都将当前协程挂起。 + // repeatOnLifecycle 每当生命周期处于 STARTED 或以后的状态时会在新的协程中 + // 启动执行代码块,并在生命周期进入 STOPPED 时取消协程。 + repeatOnLifecycle(Lifecycle.State.STARTED) { + // 当生命周期处于 STARTED 时安全地从 locations 中获取数据 + // 当生命周期进入 STOPPED 时停止收集数据 + viewModel.countDown().collect { + Log.e("jingo", "collect $it") + if (it == 0) { + navigate() + } else { + viewBinding.timeDown.text = "跳过:${it}秒" + } + } + // 注意:运行到此处时,生命周期已经处于 DESTROYED 状态! + } + } + } + + private fun navigate() { + if (viewModel.userName == "") { + findNavController().navigate(R.id.action_splash_to_login) + } else { + findNavController().navigate(R.id.action_splash_to_home) + } + } + + override fun onDestroy() { + Log.e("jingo", "onDestroy") + super.onDestroy() + } + + override fun onDetach() { + Log.e("jingo", "onDetach") + super.onDetach() + } + + override fun onDestroyView() { + Log.e("jingo", "onDestroyView") + super.onDestroyView() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/volvo/ui/fragments/splash/SplashViewModel.kt b/app/src/main/java/com/navinfo/volvo/ui/fragments/splash/SplashViewModel.kt new file mode 100644 index 0000000..a2a1d87 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/splash/SplashViewModel.kt @@ -0,0 +1,54 @@ +package com.navinfo.volvo.ui.fragments.splash + +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.navinfo.volvo.repository.preferences.PreferencesRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.* +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class SplashViewModel @Inject constructor(private val pre: PreferencesRepository) : ViewModel() { + + var userName: String = "" + + init { + Log.e("jingo", "SplashViewModel init ${hashCode()}") + viewModelScope.launch { + pre.loginUser().collectLatest { + if (it != null) { + Log.e("jingo", "SplashViewModel 获取用户${it.username}") + userName = it.username + } + } + } + } + + + suspend fun countDown(): Flow { + Log.e("jingo", "viewModel countDown ${hashCode()}") + var time = 3 + // 在这个范围内启动的协程会在Lifecycle被销毁的时候自动取消 + return flow { + (time downTo 0).forEach() { + emit(it) + delay(1000) + } + } +// .onStart { +// // 倒计时开始 ,在这里可以让Button 禁止点击状态 +// }.onCompletion { +// // 倒计时结束 ,在这里可以让Button 恢复点击状态 +// }.catch { +// //错误 +// } + } + + override fun onCleared() { + Log.e("jingo", "viewModel onCleared ${hashCode()}") + super.onCleared() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_navigate_next_24.xml b/app/src/main/res/drawable/ic_baseline_navigate_next_24.xml deleted file mode 100644 index e7cf886..0000000 --- a/app/src/main/res/drawable/ic_baseline_navigate_next_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_person_24.xml b/app/src/main/res/drawable/ic_baseline_person_24.xml deleted file mode 100644 index 98730cd..0000000 --- a/app/src/main/res/drawable/ic_baseline_person_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_star_8.xml b/app/src/main/res/drawable/ic_baseline_star_8.xml deleted file mode 100644 index f064c89..0000000 --- a/app/src/main/res/drawable/ic_baseline_star_8.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_volume_down_24.xml b/app/src/main/res/drawable/ic_baseline_volume_down_24.xml deleted file mode 100644 index f3ae1ba..0000000 --- a/app/src/main/res/drawable/ic_baseline_volume_down_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_volume_mute_24.xml b/app/src/main/res/drawable/ic_baseline_volume_mute_24.xml deleted file mode 100644 index 16a576c..0000000 --- a/app/src/main/res/drawable/ic_baseline_volume_mute_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/shape_white_frame.xml b/app/src/main/res/drawable/shape_white_frame.xml new file mode 100644 index 0000000..7bcbc74 --- /dev/null +++ b/app/src/main/res/drawable/shape_white_frame.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index b56fc98..eb171c2 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,13 +6,13 @@ android:layout_height="match_parent"> - - - - -