diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index da1553b..fe5bc55 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -7,6 +7,7 @@
+
- val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
- v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
- insets
- }
- val navController: NavController = this.setupNavigation()
+ setupUI()
+ setupNavigation()
+ }
- if(isUserAuthenticated()) { navigateTo(navController, R.id.action_nav_main_to_nav_profile)} else {navigateTo(navController, R.id.action_nav_main_to_nav_auth)}
- }
- fun navigateTo(navController: NavController, @IdRes actionId: Int) {
- navController.navigate(actionId)
- }
- private fun setupNavigation(): NavController {
+ private fun setupNavigation() {
val navView = findViewById(R.id.bottom_navigation)
- val toolbar = findViewById(R.id.toolbar);
+ val toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar)
- val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as? NavHostFragment
- if (navHostFragment == null){
- throw IllegalStateException("NavHostFragment is null")
- }
+ val navHostFragment =
+ supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as? NavHostFragment
+ ?: throw IllegalStateException("NavHostFragment is null")
val navController = navHostFragment.navController
- val appBarConfiguration = AppBarConfiguration(setOf(R.id.nav_auth,R.id.nav_scan, R.id.nav_profile, R.id.nav_admin))
+ val appBarConfiguration = AppBarConfiguration(
+ setOf(R.id.nav_auth, R.id.nav_scan, R.id.nav_profile, R.id.nav_admin)
+ )
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration)
NavigationUI.setupWithNavController(navView, navController)
navController.addOnDestinationChangedListener { _, destination, _ ->
Log.d("Navigate", "Navigate to " + destination.label)
- navView.visibility = if (destination.id == R.id.nav_auth) View.GONE else View.VISIBLE
- val userDTO = UserServiceST.getInstance().getUserDTO()
+ navView.visibility = if (destination.id == R.id.nav_auth || destination.id == R.id.nav_init) View.GONE else View.VISIBLE
+
+ val userDTO = getCachedUser()
if (userDTO != null) {
if (!userDTO.roles.any { it.name == "ROLE_ADMIN" }) navView.menu.findItem(R.id.nav_admin)
.setVisible(false) else navView.menu.findItem(R.id.nav_admin).setVisible(true)
}
}
- return navController
}
- private fun isUserAuthenticated(): Boolean {
- return UserServiceST.getInstance().hasTokens()
+ private fun getCachedUser(): UserDTO? {
+ return UserServiceST.getInstance().getUserDTO();
}
- private fun checkForAdmin() {
- val userDTO = UserServiceST.getInstance().getUserDTO()
- if (userDTO != null){
- if (userDTO.roles.any {it.name == "ROLE_ADMIN"}) {
- Log.d("adminlog", "i'm admin")
- }
+
+ private fun setupUI() {
+ enableEdgeToEdge()
+ setContentView(R.layout.activity_main)
+
+ ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
+ val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
+ v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
+ insets
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/displaynone/acss/components/main/utils/utils.kt b/app/src/main/java/com/displaynone/acss/components/main/utils/utils.kt
new file mode 100644
index 0000000..e0584b3
--- /dev/null
+++ b/app/src/main/java/com/displaynone/acss/components/main/utils/utils.kt
@@ -0,0 +1,22 @@
+package com.displaynone.acss.components.main.utils
+
+import com.displaynone.acss.config.Constants.serverUrl
+import com.displaynone.acss.config.Network
+import io.ktor.client.request.get
+import io.ktor.client.request.headers
+import io.ktor.http.HttpHeaders
+import io.ktor.http.HttpStatusCode
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.withContext
+
+suspend fun pingServer(token: String): Result = withContext(Dispatchers.IO) {
+ runCatching {
+ val result = Network.client.get("$serverUrl/api/ping") {
+ headers {
+ append(HttpHeaders.Authorization, "Bearer $token")
+ }
+ }
+
+ result.status == HttpStatusCode.OK
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/displaynone/acss/ui/init/InitFragment.kt b/app/src/main/java/com/displaynone/acss/ui/init/InitFragment.kt
new file mode 100644
index 0000000..a08fedd
--- /dev/null
+++ b/app/src/main/java/com/displaynone/acss/ui/init/InitFragment.kt
@@ -0,0 +1,94 @@
+package com.displaynone.acss.ui.init
+
+import android.content.Context
+import android.net.ConnectivityManager
+import android.net.NetworkCapabilities
+import android.os.Bundle
+import android.util.Log
+import android.view.View
+import androidx.fragment.app.Fragment
+import androidx.navigation.NavController
+import androidx.navigation.fragment.findNavController
+import com.displaynone.acss.R
+import com.displaynone.acss.components.auth.models.user.UserServiceST
+import com.displaynone.acss.components.auth.models.user.repository.dto.UserDTO
+import com.displaynone.acss.databinding.FragmentInitBinding
+import com.displaynone.acss.util.navigateTo
+
+class InitFragment : Fragment(R.layout.fragment_init) {
+ private var _binding: FragmentInitBinding? = null
+ private val binding: FragmentInitBinding get() = _binding!!
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ _binding = FragmentInitBinding.bind(view)
+
+ if (!checkInternetConnection()) {
+ handleError(R.string.noInternet)
+ return
+ }
+
+ if (!pingServer()) {
+ handleError(R.string.serverIsUnabailable)
+ return
+ }
+
+ val navController: NavController = findNavController()
+
+ if (!isUserAuthenticated()) {
+ navigateTo(navController, R.id.action_nav_init_to_nav_auth)
+ return
+ }
+
+ val user: UserDTO? = updateUser()
+ if (user == null) {
+ navigateTo(navController, R.id.action_nav_init_to_nav_auth)
+ return
+ }
+
+ navigateTo(navController, R.id.action_nav_init_to_nav_profile)
+ }
+
+ private fun pingServer(): Boolean {
+ return true
+ }
+
+ private fun updateUser(): UserDTO? {
+ return null
+ }
+
+ private fun checkInternetConnection(): Boolean {
+ if (context == null) return false;
+
+ val connectivityManager =
+ context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+ val capabilities =
+ connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
+ ?: return false
+
+ if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
+ Log.i("Internet", "NetworkCapabilities.TRANSPORT_CELLULAR")
+ return true
+ } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
+ Log.i("Internet", "NetworkCapabilities.TRANSPORT_WIFI")
+ return true
+ } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
+ Log.i("Internet", "NetworkCapabilities.TRANSPORT_ETHERNET")
+ return true
+ }
+
+ return false
+ }
+
+ private fun getCachedUser(): UserDTO? {
+ return UserServiceST.getInstance().getUserDTO();
+ }
+
+ private fun isUserAuthenticated(): Boolean {
+ return UserServiceST.getInstance().hasTokens()
+ }
+
+ private fun handleError(string: Int) {
+ binding.error.text = requireContext().getString(string)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/displaynone/acss/ui/init/InitFragmentViewModel.kt b/app/src/main/java/com/displaynone/acss/ui/init/InitFragmentViewModel.kt
new file mode 100644
index 0000000..d295983
--- /dev/null
+++ b/app/src/main/java/com/displaynone/acss/ui/init/InitFragmentViewModel.kt
@@ -0,0 +1,14 @@
+package com.displaynone.acss.ui.init
+
+import androidx.lifecycle.ViewModel
+import com.displaynone.acss.components.auth.models.user.repository.dto.UserDTO
+
+class InitFragmentViewModel: ViewModel() {
+ private fun pingServer(): Boolean {
+
+ }
+
+ private fun updateUser(): UserDTO? {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_init.xml b/app/src/main/res/layout/fragment_init.xml
new file mode 100644
index 0000000..ffebd8a
--- /dev/null
+++ b/app/src/main/res/layout/fragment_init.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml
index f883975..ded010f 100644
--- a/app/src/main/res/navigation/nav_graph.xml
+++ b/app/src/main/res/navigation/nav_graph.xml
@@ -2,7 +2,18 @@
+ app:startDestination="@id/nav_init">
+
+
+
+
-
-
-
-
Your profile
Change rights using smartphone
Admin panel
-
+ Internet disconnected
\ No newline at end of file
diff --git a/app/src/main/res/values-ru/strings-ru.xml b/app/src/main/res/values-ru/strings-ru.xml
index 18da3e6..856606d 100644
--- a/app/src/main/res/values-ru/strings-ru.xml
+++ b/app/src/main/res/values-ru/strings-ru.xml
@@ -1,6 +1,6 @@
- AS
+ AS
Введите логин
Введите пароль
Здравствуйте!
@@ -15,9 +15,10 @@
Логина не существует или неверный
ОК
Ошибка
- Введите логин пользователя
- 🔍 Поиск 🔍
- Профиль
- Изменить права входа с помощью смартфона
- >Панель администратора
+ Введите логин пользователя
+ 🔍 Поиск 🔍
+ Профиль
+ Изменить права входа с помощью смартфона
+ Панель администратора
+ Интернет соединение потеряно
\ 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 2250060..67f2329 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -20,6 +20,6 @@
Change rights using smartphone
Admin panel
Profile
-
-
+ Internet disconnected
+ Server is unavailable
\ No newline at end of file