From 261be09fb9ab76ca75747f13bddf06c297a7f60d Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Fri, 13 Jan 2023 14:47:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/navinfo/volvo/ui/MainActivity.kt | 13 +++- .../volvo/ui/fragments/login/LoginFragment.kt | 4 +- .../ui/fragments/setting/SettingFragment.kt | 38 ++++++++++++ .../ui/fragments/setting/SettingModel.kt | 8 +++ .../res/drawable/ic_baseline_settings_24.xml | 5 ++ app/src/main/res/drawable/shape_radius.xml | 6 ++ .../res/drawable/shape_radius_bg_white.xml | 23 +++++++ app/src/main/res/layout/fragment_home.xml | 62 +++++++++++++++++++ app/src/main/res/layout/fragment_setting.xml | 25 ++++++++ app/src/main/res/menu/bottom_nav_menu.xml | 12 ++-- .../main/res/navigation/mobile_navigation.xml | 15 ++++- app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + gradle.properties | 10 +-- 14 files changed, 204 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/com/navinfo/volvo/ui/fragments/setting/SettingFragment.kt create mode 100644 app/src/main/java/com/navinfo/volvo/ui/fragments/setting/SettingModel.kt create mode 100644 app/src/main/res/drawable/ic_baseline_settings_24.xml create mode 100644 app/src/main/res/drawable/shape_radius.xml create mode 100644 app/src/main/res/drawable/shape_radius_bg_white.xml create mode 100644 app/src/main/res/layout/fragment_setting.xml 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..63ed490 100644 --- a/app/src/main/java/com/navinfo/volvo/ui/MainActivity.kt +++ b/app/src/main/java/com/navinfo/volvo/ui/MainActivity.kt @@ -96,6 +96,7 @@ class MainActivity : BaseActivity() { val appBarConfiguration = AppBarConfiguration( setOf( R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications, + R.id.navigation_setting, ) ) setupActionBarWithNavController(navController, appBarConfiguration) @@ -115,10 +116,18 @@ class MainActivity : BaseActivity() { } 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 = 300; + transition.duration = 500; TransitionManager.beginDelayedTransition(binding.root, transition); navView.visibility = View.VISIBLE newMessageView.visibility = View.VISIBLE @@ -126,7 +135,7 @@ class MainActivity : BaseActivity() { } else { runOnUiThread { val transition: Transition = Slide(Gravity.BOTTOM) - transition.duration = 300; + transition.duration = 500; TransitionManager.beginDelayedTransition(binding.root, transition); navView.visibility = View.GONE newMessageView.visibility = View.GONE 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..d248c92 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 @@ -23,10 +23,7 @@ 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,6 +31,7 @@ class LoginFragment : BaseFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { + viewBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_login, container, false) viewBinding.lifecycleOwner = this initView() 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..441b003 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/setting/SettingFragment.kt @@ -0,0 +1,38 @@ +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.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 + +@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 + initView() + return viewBinding.root + } + + private fun initView() { + //退出登录 + viewBinding.loginFragmentLoginButton.setOnClickListener { + 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..86443c3 --- /dev/null +++ b/app/src/main/java/com/navinfo/volvo/ui/fragments/setting/SettingModel.kt @@ -0,0 +1,8 @@ +package com.navinfo.volvo.ui.fragments.setting + +import androidx.lifecycle.ViewModel +import javax.inject.Inject + +class SettingModel @Inject constructor() : ViewModel() { + +} 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/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/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/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/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index c7c719a..c82b7e0 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -47,6 +47,19 @@ android:id="@+id/navigation_obtain_message" android:name="com.navinfo.volvo.ui.fragments.message.ObtainMessageFragment" android:label="问候编辑" - tools:layout="@layout/fragment_obtain_message"> + tools:layout="@layout/fragment_setting"> + + + + + \ 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/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/gradle.properties b/gradle.properties index a9dca93..a7033f3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,8 +22,8 @@ kotlin.code.style=official # thereby reducing the size of the R class for that library android.nonTransitiveRClass=true android.enableJetifier=true -systemProp.http.proxyHost=127.0.0.1 -systemProp.http.proxyPort=10080 -systemProp.https.proxyHost=127.0.0.1 -systemProp.https.proxyPort=10080 -org.gradle.configureondemand=true \ No newline at end of file + systemProp.http.proxyHost=127.0.0.1 + systemProp.http.proxyPort=10080 + systemProp.https.proxyHost=127.0.0.1 + systemProp.https.proxyPort=10080 + org.gradle.configureondemand=true \ No newline at end of file From 36dccede60bf037278bbf94d9dc676c9f06ca182 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Mon, 27 Mar 2023 10:22:15 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/codeStyles/Project.xml | 123 +++++++++++++++ .idea/codeStyles/codeStyleConfig.xml | 5 + app/src/main/AndroidManifest.xml | 3 + .../main/java/com/navinfo/volvo/Constant.kt | 4 +- .../navinfo/volvo/http/NavinfoVolvoCall.kt | 5 +- .../preferences/PreferencesRepositoryImp.kt | 11 +- .../java/com/navinfo/volvo/ui/MainActivity.kt | 123 ++++++++++----- .../volvo/ui/fragments/BaseFragment.kt | 27 +++- .../fragments/dashboard/DashboardFragment.kt | 3 +- .../volvo/ui/fragments/home/HomeFragment.kt | 8 +- .../volvo/ui/fragments/home/HomeViewModel.kt | 11 +- .../volvo/ui/fragments/login/LoginFragment.kt | 35 +++-- .../ui/fragments/login/LoginViewModel.kt | 20 ++- .../message/ObtainMessageFragment.kt | 3 +- .../message/ObtainMessageViewModel.kt | 2 +- .../notifications/NotificationsFragment.kt | 3 +- .../ui/fragments/setting/SettingFragment.kt | 17 ++- .../ui/fragments/setting/SettingModel.kt | 13 +- .../ui/fragments/splash/SplashFragment.kt | 144 ++++++++++++++++++ .../ui/fragments/splash/SplashViewModel.kt | 54 +++++++ .../drawable/ic_baseline_navigate_next_24.xml | 5 - .../res/drawable/ic_baseline_person_24.xml | 5 - .../main/res/drawable/ic_baseline_star_8.xml | 5 - .../drawable/ic_baseline_volume_down_24.xml | 5 - .../drawable/ic_baseline_volume_mute_24.xml | 5 - .../main/res/drawable/shape_white_frame.xml | 10 ++ app/src/main/res/layout/activity_main.xml | 4 +- app/src/main/res/layout/fragment_first.xml | 28 ---- app/src/main/res/layout/fragment_second.xml | 27 ---- app/src/main/res/layout/fragment_splash.xml | 44 ++++++ app/src/main/res/mipmap-xxhdpi/volvo_s90.jpg | Bin 0 -> 463423 bytes .../main/res/navigation/mobile_navigation.xml | 31 +++- app/src/main/res/values-land/dimens.xml | 1 - app/src/main/res/values-w1240dp/dimens.xml | 1 - app/src/main/res/values-w600dp/dimens.xml | 1 - app/src/main/res/values/colors.xml | 1 - app/src/main/res/values/dimens.xml | 3 - app/src/main/res/values/themes.xml | 2 +- gradle.properties | 10 +- 39 files changed, 616 insertions(+), 186 deletions(-) create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 app/src/main/java/com/navinfo/volvo/ui/fragments/splash/SplashFragment.kt create mode 100644 app/src/main/java/com/navinfo/volvo/ui/fragments/splash/SplashViewModel.kt delete mode 100644 app/src/main/res/drawable/ic_baseline_navigate_next_24.xml delete mode 100644 app/src/main/res/drawable/ic_baseline_person_24.xml delete mode 100644 app/src/main/res/drawable/ic_baseline_star_8.xml delete mode 100644 app/src/main/res/drawable/ic_baseline_volume_down_24.xml delete mode 100644 app/src/main/res/drawable/ic_baseline_volume_mute_24.xml create mode 100644 app/src/main/res/drawable/shape_white_frame.xml delete mode 100644 app/src/main/res/layout/fragment_first.xml delete mode 100644 app/src/main/res/layout/fragment_second.xml create mode 100644 app/src/main/res/layout/fragment_splash.xml create mode 100644 app/src/main/res/mipmap-xxhdpi/volvo_s90.jpg 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"> - - - - -