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