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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ xmlns:android
+
+ ^$
+
+
+
+
+
+
+
+
+ xmlns:.*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:id
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:name
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ name
+
+ ^$
+
+
+
+
+
+
+
+
+ style
+
+ ^$
+
+
+
+
+
+
+
+
+ .*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+
+ http://schemas.android.com/apk/res/android
+
+
+ ANDROID_ATTRIBUTE_ORDER
+
+
+
+
+
+
+ .*
+
+ .*
+
+
+ BY_NAME
+
+
+
+
+
+
+
+
+
+
\ 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 e687a08..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,24 +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,
- )
- )
- 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 {
@@ -113,36 +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 (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 = 300;
- 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 = 300;
- 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 56db5c9..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,17 +15,13 @@ 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
@AndroidEntryPoint
class LoginFragment : BaseFragment() {
- // private var loginViewModel:LoginViewModel by viewModel(get())
private lateinit var viewBinding: FragmentLoginBinding
-
-
private val viewModel by viewModels()
override fun onCreateView(
@@ -34,26 +29,34 @@ class LoginFragment : BaseFragment() {
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
+
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()
@@ -63,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 0a3e3f6..719aedf 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
@@ -47,6 +47,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
@@ -65,7 +66,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 12e5990..81d9357 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
new file mode 100644
index 0000000..65ad38d
--- /dev/null
+++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/setting/SettingFragment.kt
@@ -0,0 +1,51 @@
+package com.navinfo.volvo.ui.fragments.setting
+
+import android.os.Bundle
+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.FragmentSettingBinding
+import com.navinfo.volvo.ui.fragments.BaseFragment
+import dagger.hilt.android.AndroidEntryPoint
+import kotlinx.coroutines.launch
+
+@AndroidEntryPoint
+class SettingFragment : BaseFragment() {
+
+ private lateinit var viewBinding: FragmentSettingBinding
+ private val viewModel by viewModels()
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ viewBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_setting, container, false)
+ viewBinding.lifecycleOwner = this
+ return viewBinding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ initView()
+ }
+
+ private fun initView() {
+ //退出登录
+ viewBinding.loginFragmentLoginButton.setOnClickListener {
+ 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
new file mode 100644
index 0000000..378af99
--- /dev/null
+++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/setting/SettingModel.kt
@@ -0,0 +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
+
+@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_settings_24.xml b/app/src/main/res/drawable/ic_baseline_settings_24.xml
new file mode 100644
index 0000000..298a5a1
--- /dev/null
+++ b/app/src/main/res/drawable/ic_baseline_settings_24.xml
@@ -0,0 +1,5 @@
+
+
+
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_radius.xml b/app/src/main/res/drawable/shape_radius.xml
new file mode 100644
index 0000000..e702f8a
--- /dev/null
+++ b/app/src/main/res/drawable/shape_radius.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_radius_bg_white.xml b/app/src/main/res/drawable/shape_radius_bg_white.xml
new file mode 100644
index 0000000..d2244f1
--- /dev/null
+++ b/app/src/main/res/drawable/shape_radius_bg_white.xml
@@ -0,0 +1,23 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
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">
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
index 733bb88..c2c11b0 100644
--- a/app/src/main/res/layout/fragment_home.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -29,6 +29,68 @@
android:hint="请输入查询内容" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_setting.xml b/app/src/main/res/layout/fragment_setting.xml
new file mode 100644
index 0000000..266123b
--- /dev/null
+++ b/app/src/main/res/layout/fragment_setting.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_splash.xml b/app/src/main/res/layout/fragment_splash.xml
new file mode 100644
index 0000000..1dacb84
--- /dev/null
+++ b/app/src/main/res/layout/fragment_splash.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml
index 3217db0..a7db9bf 100644
--- a/app/src/main/res/menu/bottom_nav_menu.xml
+++ b/app/src/main/res/menu/bottom_nav_menu.xml
@@ -3,7 +3,7 @@
-
-
-
-
+ android:id="@+id/navigation_setting"
+ android:icon="@drawable/ic_baseline_settings_24"
+ android:title="@string/my" />
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-xxhdpi/volvo_s90.jpg b/app/src/main/res/mipmap-xxhdpi/volvo_s90.jpg
new file mode 100644
index 0000000..be3d6e4
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/volvo_s90.jpg differ
diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml
index c7c719a..cabe2f8 100644
--- a/app/src/main/res/navigation/mobile_navigation.xml
+++ b/app/src/main/res/navigation/mobile_navigation.xml
@@ -3,7 +3,26 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mobile_navigation"
- app:startDestination="@+id/navigation_login">
+ app:startDestination="@id/navigation_splash">
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-land/dimens.xml b/app/src/main/res/values-land/dimens.xml
index 22d7f00..e5f8fdc 100644
--- a/app/src/main/res/values-land/dimens.xml
+++ b/app/src/main/res/values-land/dimens.xml
@@ -1,3 +1,2 @@
- 48dp
\ No newline at end of file
diff --git a/app/src/main/res/values-w1240dp/dimens.xml b/app/src/main/res/values-w1240dp/dimens.xml
index d73f4a3..e5f8fdc 100644
--- a/app/src/main/res/values-w1240dp/dimens.xml
+++ b/app/src/main/res/values-w1240dp/dimens.xml
@@ -1,3 +1,2 @@
- 200dp
\ No newline at end of file
diff --git a/app/src/main/res/values-w600dp/dimens.xml b/app/src/main/res/values-w600dp/dimens.xml
index 22d7f00..e5f8fdc 100644
--- a/app/src/main/res/values-w600dp/dimens.xml
+++ b/app/src/main/res/values-w600dp/dimens.xml
@@ -1,3 +1,2 @@
- 48dp
\ No newline at end of file
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index cbbbf5f..e03d532 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -6,6 +6,7 @@
删除
分享
我的
+ 设置
SecondActivity
First Fragment
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 109143d..9808816 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -9,7 +9,6 @@
#FFFFFFFF
#FA5151
#5E5E5E
- #D2CACA
#1285EC
#F99C3E
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 077a3f2..462e800 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -1,9 +1,6 @@
16dp
- 16dp
12dp
- 18sp
6dp
- 16dp
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 02a0bec..55fc2bb 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -7,6 +7,7 @@
Share
Preview
My
+ setting
SecondActivity
First Fragment
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index aaa9818..1096199 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -1,6 +1,6 @@
-