Jelajahi Sumber

fix 架构Navigation实现

RobinTan1024 4 tahun lalu
induk
melakukan
0461ffcf89

+ 1 - 1
app/src/main/java/com/doverfuelingsolutions/issp/api/CloudApi.kt

@@ -62,7 +62,7 @@ object CloudApi {
                     DataStore.accountName = accountName
                     DataStore.password = password
                     DataStore.accessToken = body.access_token
-                    DataStore.accessTokenExpire = body.expires_in.toLong()
+                    DataStore.accessTokenExpire = System.currentTimeMillis() + body.expires_in.toLong() * 1000
                     // [{\"Id\":\"dfc5cc2d-a5ef-4bc4-b1b0-4aa0c82a73de\",\"Name\":\"GlobalUnit\"}]
                     if (body.BusinessUnits.isNotBlank()) {
                         val jsonArray = JSONArray(body.BusinessUnits)

+ 3 - 3
app/src/main/java/com/doverfuelingsolutions/issp/data/DataStore.kt

@@ -1,6 +1,7 @@
 package com.doverfuelingsolutions.issp.data
 
 import com.doverfuelingsolutions.issp.utils.DeviceUtil
+import com.doverfuelingsolutions.issp.utils.log.DFSLog
 import com.doverfuelingsolutions.issp.utils.sp.SPKeys
 import com.doverfuelingsolutions.issp.utils.sp.SPUtil
 import kotlin.properties.ObservableProperty
@@ -27,9 +28,8 @@ object DataStore {
         }
     var accessTokenExpire = 0L
         set(value) {
-            val expireTime = System.currentTimeMillis() + value * 1000
-            field = expireTime
-            SPUtil.putLong(SPKeys.ACCESS_TOKEN_EXPIRE, expireTime)
+            field = value
+            SPUtil.putLong(SPKeys.ACCESS_TOKEN_EXPIRE, value)
         }
     var buId = ""
         set(value) {

+ 0 - 1
app/src/main/java/com/doverfuelingsolutions/issp/utils/ActivityUtil.kt

@@ -23,7 +23,6 @@ class ActivityUtil {
         private fun makeFullscreen(activity: AppCompatActivity) {
             val systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
             activity.lifecycleScope.launchWhenStarted {
-                activity.supportActionBar?.hide()
                 activity.window.decorView.systemUiVisibility = systemUiVisibility
                 delay(1000)
                 activity.window.decorView.systemUiVisibility = systemUiVisibility

+ 37 - 2
app/src/main/java/com/doverfuelingsolutions/issp/view/MainActivity.kt

@@ -2,23 +2,44 @@ package com.doverfuelingsolutions.issp.view
 
 import android.os.Bundle
 import androidx.appcompat.app.AppCompatActivity
+import androidx.appcompat.widget.Toolbar
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
+import androidx.navigation.NavController
+import androidx.navigation.NavDestination
+import androidx.navigation.findNavController
+import androidx.navigation.fragment.NavHostFragment
+import androidx.navigation.fragment.findNavController
+import androidx.navigation.ui.AppBarConfiguration
+import androidx.navigation.ui.setupWithNavController
 import com.doverfuelingsolutions.issp.R
 import com.doverfuelingsolutions.issp.data.DataStore
 import com.doverfuelingsolutions.issp.utils.ActivityUtil
 import com.doverfuelingsolutions.issp.utils.PermissionUtil
+import com.doverfuelingsolutions.issp.utils.StringUtil
+import com.doverfuelingsolutions.issp.utils.log.DFSLog
+import kotlinx.android.synthetic.main.activity_main.*
 
-class MainActivity : AppCompatActivity() {
+class MainActivity : AppCompatActivity(), NavController.OnDestinationChangedListener {
 
     private val globalViewModel = GlobalViewModel()
 
+    private val mNavController: NavController by lazy {
+        val navHostFragment = supportFragmentManager.findFragmentById(R.id.navActivity) as NavHostFragment
+        navHostFragment.navController
+    }
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_main)
 
         PermissionUtil.requestPermissions(this)
 
+        setSupportActionBar(materialToolbar)
+        mNavController.addOnDestinationChangedListener(this)
+        val appBarConfiguration = AppBarConfiguration(mNavController.graph)
+        materialToolbar.setupWithNavController(mNavController, appBarConfiguration)
+
         // lifecycle.addObserver(FusionManager)
     }
 
@@ -27,8 +48,22 @@ class MainActivity : AppCompatActivity() {
         ActivityUtil.setFullscreen(this)
     }
 
+    override fun onDestroy() {
+        super.onDestroy()
+
+        mNavController.removeOnDestinationChangedListener(this)
+    }
+
+    override fun onDestinationChanged(controller: NavController, destination: NavDestination, arguments: Bundle?) {
+        if (destination.label == StringUtil.get(R.string.app_name)) {
+            supportActionBar?.hide()
+        } else {
+            supportActionBar?.show()
+        }
+    }
+
     class GlobalViewModel : ViewModel() {
 
-        val isLogin = MutableLiveData(System.currentTimeMillis() < DataStore.accessTokenExpire) // TODO 确认TOKEN过期处理办法
+        val isLogin = MutableLiveData(System.currentTimeMillis() < DataStore.accessTokenExpire)
     }
 }

+ 2 - 2
app/src/main/java/com/doverfuelingsolutions/issp/view/SettingsActivity.kt

@@ -6,7 +6,7 @@ import android.os.Bundle
 import android.view.MenuItem
 import androidx.appcompat.app.AppCompatActivity
 import com.doverfuelingsolutions.issp.R
-import com.doverfuelingsolutions.issp.view.fragment.SettingsFragment
+import com.doverfuelingsolutions.issp.view.fragment.FragmentPreference
 
 class SettingsActivity : AppCompatActivity() {
 
@@ -24,7 +24,7 @@ class SettingsActivity : AppCompatActivity() {
         if (savedInstanceState == null) {
             supportFragmentManager
                 .beginTransaction()
-                .replace(R.id.settings, SettingsFragment())
+                .replace(R.id.settings, FragmentPreference())
                 .commit()
         }
     }

+ 14 - 2
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentLogin.kt

@@ -22,6 +22,11 @@ import kotlinx.coroutines.launch
 
 class FragmentLogin : Fragment(), View.OnClickListener {
 
+    companion object {
+
+        const val KEY_LOGIN_RESULT = "loginResult"
+    }
+
     private val globalViewModel: MainActivity.GlobalViewModel by activityViewModels()
     private val loginViewModel = LoginViewModel()
 
@@ -31,6 +36,12 @@ class FragmentLogin : Fragment(), View.OnClickListener {
             .apply { anchorView = binding.loginForm }
     }
 
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        findNavController().previousBackStackEntry?.savedStateHandle?.set(KEY_LOGIN_RESULT, false)
+    }
+
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
         binding = DataBindingUtil.inflate(inflater, R.layout.fragment_login, container, false)
         binding.lifecycleOwner = this
@@ -48,7 +59,7 @@ class FragmentLogin : Fragment(), View.OnClickListener {
     override fun onClick(v: View?) {
         when (v) {
             binding.buttonLogin -> submit()
-            binding.buttonPreference -> {}
+            binding.buttonPreference -> findNavController().navigate(R.id.action_fragmentLogin_to_fragmentPreference)
         }
     }
 
@@ -66,7 +77,8 @@ class FragmentLogin : Fragment(), View.OnClickListener {
                     if (!result.success) snackbar.setText(StringUtil.get(R.string.login_fail, result.message)).show()
                     else {
                         globalViewModel.isLogin.value = true
-                        findNavController().navigate(R.id.action_login_to_main)
+                        findNavController().previousBackStackEntry?.savedStateHandle?.set(KEY_LOGIN_RESULT, true)
+                        findNavController().popBackStack()
                     }
                 }
             }

+ 33 - 7
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentMain.kt

@@ -15,7 +15,9 @@ import androidx.navigation.fragment.findNavController
 import com.doverfuelingsolutions.issp.R
 import com.doverfuelingsolutions.issp.data.DataStore
 import com.doverfuelingsolutions.issp.databinding.FragmentMainBinding
+import com.doverfuelingsolutions.issp.utils.log.DFSLog
 import com.doverfuelingsolutions.issp.view.MainActivity
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
 import com.youth.banner.adapter.BannerImageAdapter
 import com.youth.banner.holder.BannerImageHolder
 import java.io.File
@@ -31,18 +33,42 @@ class FragmentMain : Fragment() {
         binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false)
         binding.lifecycleOwner = this
         binding.mainViewModel = mainViewModel
+
         return binding.root
     }
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        // Destination will only be joined in back stack after it's resumed.
-        // Navigate before that resume looks like redirect.
-        if (globalViewModel.isLogin.value != true) {
-            findNavController().navigate(R.id.action_main_to_login)
-            return
+        when (findNavController().currentBackStackEntry?.savedStateHandle?.get<Boolean>(FragmentLogin.KEY_LOGIN_RESULT)) {
+            null, true -> {
+                globalViewModel.isLogin.observe(viewLifecycleOwner, {
+                    if (!it) {
+                        findNavController().navigate(R.id.action_fragmentMain_to_fragmentLogin)
+                    } else {
+                        initialize()
+                    }
+                })
+            }
+            else -> {
+                context?.let {
+                    MaterialAlertDialogBuilder(it)
+                        .setTitle(resources.getString(R.string.login_tip))
+                        .setMessage(R.string.login_tip_detail)
+                        .setPositiveButton(resources.getString(R.string.confirm)) { _, _ ->
+                            findNavController().navigate(R.id.action_fragmentMain_to_fragmentLogin)
+                        }
+                        .setNegativeButton(R.string.cancel) { _, _ ->
+                            activity?.onBackPressed()
+                        }
+                        .setCancelable(false)
+                        .show()
+                }
+            }
         }
+    }
 
-        binding.stationLogo.setImageURI(Uri.fromFile(File(context?.filesDir, DataStore.stationLogoFile)))
+    private fun initialize() {
+        mainViewModel.stationName.value = DataStore.buName
+        if (DataStore.stationLogoFile.isNotEmpty()) binding.stationLogo.setImageURI(Uri.fromFile(File(context?.filesDir, DataStore.stationLogoFile)))
         initBanner()
     }
 
@@ -60,6 +86,6 @@ class FragmentMain : Fragment() {
     }
 
     class MainViewModel : ViewModel() {
-        val stationName = MutableLiveData(DataStore.buName)
+        val stationName = MutableLiveData("")
     }
 }

+ 3 - 5
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/SettingsFragment.kt → app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentPreference.kt

@@ -12,7 +12,7 @@ import com.doverfuelingsolutions.issp.utils.log.DFSLog
 import com.doverfuelingsolutions.issp.utils.sp.SPKeys
 import com.google.android.material.snackbar.Snackbar
 
-class SettingsFragment : PreferenceFragmentCompat(), EditTextPreference.OnBindEditTextListener, Preference.OnPreferenceChangeListener {
+class FragmentPreference : PreferenceFragmentCompat(), EditTextPreference.OnBindEditTextListener, Preference.OnPreferenceChangeListener {
 
     private val snackbar: Snackbar by lazy { Snackbar.make(requireView(), R.string.blank, 4000) }
 
@@ -28,8 +28,6 @@ class SettingsFragment : PreferenceFragmentCompat(), EditTextPreference.OnBindEd
         setValidate(SPKeys.FUEL_IP)
         setValidate(SPKeys.MIDDLE_IP)
         setValidate(SPKeys.SERVER_DOMAIN)
-
-        DFSLog.i("view = $view", "listView = $listView")
     }
 
     override fun onBindEditText(editText: EditText) {
@@ -55,7 +53,7 @@ class SettingsFragment : PreferenceFragmentCompat(), EditTextPreference.OnBindEd
     }
 
     private fun setNumberInput(key: String): EditTextPreference? {
-        val fragment = this@SettingsFragment
+        val fragment = this@FragmentPreference
         return findPreference<EditTextPreference>(key)?.apply {
             setOnBindEditTextListener(fragment)
             onPreferenceChangeListener = fragment
@@ -63,7 +61,7 @@ class SettingsFragment : PreferenceFragmentCompat(), EditTextPreference.OnBindEd
     }
 
     private fun setValidate(key: String) {
-        val fragment = this@SettingsFragment
+        val fragment = this@FragmentPreference
         findPreference<EditTextPreference>(key)?.apply {
             onPreferenceChangeListener = fragment
         }

+ 16 - 0
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentPreferenceWrapper.kt

@@ -0,0 +1,16 @@
+package com.doverfuelingsolutions.issp.view.fragment
+
+import android.os.Bundle
+import android.text.InputType
+import android.widget.EditText
+import androidx.fragment.app.Fragment
+import androidx.preference.EditTextPreference
+import androidx.preference.Preference
+import androidx.preference.PreferenceFragmentCompat
+import com.doverfuelingsolutions.issp.R
+import com.doverfuelingsolutions.issp.utils.ValidateUtil
+import com.doverfuelingsolutions.issp.utils.log.DFSLog
+import com.doverfuelingsolutions.issp.utils.sp.SPKeys
+import com.google.android.material.snackbar.Snackbar
+
+class FragmentPreferenceWrapper : Fragment(R.layout.fragment_preference_wrapper)

+ 45 - 0
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentStart.kt

@@ -0,0 +1,45 @@
+package com.doverfuelingsolutions.issp.view.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.activityViewModels
+import androidx.navigation.fragment.findNavController
+import com.doverfuelingsolutions.issp.R
+import com.doverfuelingsolutions.issp.utils.log.DFSLog
+import com.doverfuelingsolutions.issp.view.MainActivity
+import kotlinx.android.synthetic.main.fragment_start.*
+
+class FragmentStart : Fragment() {
+
+    private val globalViewModel: MainActivity.GlobalViewModel by activityViewModels()
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+        return inflater.inflate(R.layout.fragment_start, container, false)
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        val loginResult = findNavController().currentBackStackEntry?.savedStateHandle?.get<Boolean>(FragmentLogin.KEY_LOGIN_RESULT)
+        when {
+            loginResult == null -> {
+                globalViewModel.isLogin.observe(viewLifecycleOwner, {
+                })
+            }
+            loginResult -> {
+                initialize()
+            }
+            else -> {
+                // TODO 提示必须登录
+                DFSLog.w("先登录OK?")
+            }
+        }
+
+    }
+
+    private fun initialize() {
+        DFSLog.i("action_fragmentStart_to_fragmentMain")
+        // TODO: init data and Fusion
+    }
+}

+ 21 - 4
app/src/main/res/layout/activity_main.xml

@@ -1,19 +1,36 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     style="@style/match"
+    android:layout_weight="1"
     android:background="@mipmap/activity_background"
+    android:orientation="vertical"
     tools:context=".view.MainActivity">
 
+    <com.google.android.material.appbar.AppBarLayout
+        style="@style/fullWidth"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <com.google.android.material.appbar.MaterialToolbar
+            android:id="@+id/materialToolbar"
+            style="@style/Widget.MaterialComponents.Toolbar.Primary"
+            android:layout_width="match_parent"
+            android:layout_height="?attr/actionBarSize" />
+
+    </com.google.android.material.appbar.AppBarLayout>
+
     <androidx.fragment.app.FragmentContainerView
         android:id="@+id/navActivity"
         android:name="androidx.navigation.fragment.NavHostFragment"
-        style="@style/match"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
         app:defaultNavHost="true"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"
-        app:navGraph="@navigation/nav_activity" />
-</androidx.constraintlayout.widget.ConstraintLayout>
+        app:navGraph="@navigation/nav_main" />
+</androidx.appcompat.widget.LinearLayoutCompat>

+ 1 - 1
app/src/main/res/layout/fragment_main.xml

@@ -78,7 +78,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="0dp"
                 android:layout_weight="2"
-                app:navGraph="@navigation/nav_main" />
+                app:navGraph="@navigation/nav_business" />
         </LinearLayout>
     </LinearLayout>
 </layout>

+ 14 - 0
app/src/main/res/layout/fragment_preference_wrapper.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    style="@style/fullWidth">
+
+    <androidx.fragment.app.FragmentContainerView
+        android:id="@+id/fragmentPreference"
+        android:name="com.doverfuelingsolutions.issp.view.fragment.FragmentPreference"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:tag="FragmentPreference"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 27 - 0
app/src/main/res/layout/fragment_start.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    style="@style/match">
+
+    <androidx.appcompat.widget.LinearLayoutCompat
+        style="@style/wrap"
+        android:gravity="center"
+        android:orientation="horizontal"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <androidx.core.widget.ContentLoadingProgressBar
+            android:id="@+id/progressBar"
+            style="@android:style/Widget.Material.Light.ProgressBar"
+            android:layout_marginEnd="20dp"
+            android:layout_width="40dp"
+            android:layout_height="40dp" />
+
+        <androidx.appcompat.widget.AppCompatTextView
+            style="@style/wrap"
+            android:textSize="26sp"
+            android:text="@string/in_loading" />
+    </androidx.appcompat.widget.LinearLayoutCompat>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 27
app/src/main/res/navigation/nav_activity.xml

@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<navigation xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/nav_main"
-    app:startDestination="@id/activityMain">
-
-    <fragment
-        android:id="@+id/activityMain"
-        android:name="com.doverfuelingsolutions.issp.view.fragment.FragmentMain"
-        android:label="@string/app_name">
-        <action
-            android:id="@+id/action_main_to_login"
-            app:destination="@id/activityLogin" />
-    </fragment>
-
-    <fragment
-        android:id="@+id/activityLogin"
-        android:name="com.doverfuelingsolutions.issp.view.fragment.FragmentLogin"
-        android:label="@string/login">
-        <action
-            android:id="@+id/action_login_to_main"
-            app:destination="@id/activityMain"
-            app:popUpTo="@id/activityMain"
-            app:popUpToInclusive="true" />
-    </fragment>
-</navigation>

+ 13 - 0
app/src/main/res/navigation/nav_business.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<navigation xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/nav_main"
+    app:startDestination="@id/mainSelect">
+
+    <fragment
+        android:id="@+id/mainSelect"
+        android:name="com.doverfuelingsolutions.issp.view.fragment.FragmentSearchType"
+        android:label="@string/app_name">
+    </fragment>
+</navigation>

+ 21 - 4
app/src/main/res/navigation/nav_main.xml

@@ -3,11 +3,28 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/nav_main"
-    app:startDestination="@id/mainSelect">
+    app:startDestination="@id/fragmentMain">
 
     <fragment
-        android:id="@+id/mainSelect"
-        android:name="com.doverfuelingsolutions.issp.view.fragment.FragmentSearchType"
-        android:label="@string/app_name">
+        android:id="@+id/fragmentMain"
+        android:name="com.doverfuelingsolutions.issp.view.fragment.FragmentMain"
+        android:label="@string/app_name" >
+        <action
+            android:id="@+id/action_fragmentMain_to_fragmentLogin"
+            app:destination="@id/fragmentLogin" />
     </fragment>
+
+    <fragment
+        android:id="@+id/fragmentLogin"
+        android:name="com.doverfuelingsolutions.issp.view.fragment.FragmentLogin"
+        android:label="@string/login">
+        <action
+            android:id="@+id/action_fragmentLogin_to_fragmentPreference"
+            app:destination="@id/fragmentPreferenceWrapper" />
+    </fragment>
+
+    <fragment
+        android:id="@+id/fragmentPreferenceWrapper"
+        android:name="com.doverfuelingsolutions.issp.view.fragment.FragmentPreferenceWrapper"
+        android:label="@string/preference" />
 </navigation>

+ 1 - 1
app/src/main/res/values-night/themes.xml

@@ -1,6 +1,6 @@
 <resources xmlns:tools="http://schemas.android.com/tools">
     <!-- Base application theme. -->
-    <style name="Theme.Issp" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
+    <style name="Theme.Issp" parent="Theme.MaterialComponents.DayNight.NoActionBar">
         <!-- Primary brand color. -->
         <item name="colorPrimary">@color/colorPrimaryNight</item>
         <item name="colorPrimaryVariant">@color/colorPrimaryVariant</item>

+ 7 - 0
app/src/main/res/values/strings.xml

@@ -7,8 +7,15 @@
     <string name="preference">应用设置</string>
     <string name="blank"> </string>
 
+    <string name="start">开始</string>
+    <string name="confirm">确认</string>
+    <string name="cancel">取消</string>
+
     <string name="in_login">登录中&#8230;</string>
+    <string name="in_loading">加载中&#8230;</string>
     <string name="login_fail">登录失败:%1$s</string>
+    <string name="login_tip">登录提示</string>
+    <string name="login_tip_detail">请先登录</string>
     <string name="input_not_right">填写数据不正确</string>
     <string name="network_error">网络异常</string>
     <string name="data_null">数据为空</string>

+ 1 - 1
app/src/main/res/values/themes.xml

@@ -1,6 +1,6 @@
 <resources xmlns:tools="http://schemas.android.com/tools">
     <!-- Base application theme. -->
-    <style name="Theme.Issp" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
+    <style name="Theme.Issp" parent="Theme.MaterialComponents.DayNight.NoActionBar">
         <!-- Primary brand color. -->
         <item name="colorPrimary">@color/colorPrimary</item>
         <item name="colorPrimaryVariant">@color/colorPrimaryVariant</item>