Files
rider-pro-android-app/app/src/main/java/com/aiosman/riderpro/MainActivity.kt

197 lines
7.5 KiB
Kotlin
Raw Normal View History

2024-06-22 04:25:20 +08:00
package com.aiosman.riderpro
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
2024-09-05 22:04:41 +08:00
import androidx.activity.result.contract.ActivityResultContracts
2024-07-20 16:06:37 +08:00
import androidx.compose.animation.AnimatedContentScope
import androidx.compose.animation.ExperimentalSharedTransitionApi
import androidx.compose.animation.SharedTransitionScope
2024-07-19 10:05:06 +08:00
import androidx.compose.animation.animateColorAsState
2024-07-12 01:36:59 +08:00
import androidx.compose.animation.core.tween
2024-07-12 23:37:21 +08:00
import androidx.compose.foundation.layout.Box
2024-06-22 04:25:20 +08:00
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.material3.Icon
import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.NavigationBarItemColors
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
2024-07-12 23:37:21 +08:00
import androidx.compose.runtime.compositionLocalOf
2024-06-22 04:25:20 +08:00
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp
2024-09-05 22:04:41 +08:00
import androidx.core.content.ContextCompat
2024-07-13 17:41:51 +08:00
import androidx.core.view.WindowCompat
2024-06-22 04:25:20 +08:00
import androidx.navigation.NavHostController
import androidx.navigation.compose.currentBackStackEntryAsState
2024-07-31 14:50:55 +08:00
import com.aiosman.riderpro.data.AccountService
2024-08-23 18:31:14 +08:00
import com.aiosman.riderpro.data.AccountServiceImpl
2024-07-23 15:25:00 +08:00
import com.aiosman.riderpro.ui.Navigation
2024-07-30 16:57:25 +08:00
import com.aiosman.riderpro.ui.NavigationRoute
2024-07-23 15:25:00 +08:00
import com.aiosman.riderpro.ui.index.NavigationItem
2024-07-12 01:36:59 +08:00
import com.google.accompanist.systemuicontroller.rememberSystemUiController
2024-07-15 19:02:42 +08:00
import com.google.android.libraries.places.api.Places
import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.ktx.Firebase
2024-07-30 16:57:25 +08:00
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
2024-09-05 22:04:41 +08:00
import android.Manifest
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.util.Log
import android.widget.Toast
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.viewModelScope
import androidx.navigation.findNavController
import com.aiosman.riderpro.ui.post.PostViewModel
import com.google.android.gms.tasks.OnCompleteListener
import com.google.firebase.messaging.FirebaseMessaging
2024-06-22 04:25:20 +08:00
class MainActivity : ComponentActivity() {
2024-09-05 22:04:41 +08:00
// Firebase Analytics
private lateinit var analytics: FirebaseAnalytics
2024-07-30 16:57:25 +08:00
private val scope = CoroutineScope(Dispatchers.Main)
2024-09-05 22:04:41 +08:00
// 请求通知权限
private val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission(),
) { isGranted: Boolean ->
if (isGranted) {
// FCM SDK (and your app) can post notifications.
} else {
// TODO: Inform user that that your app will not show notifications.
}
}
/**
* 获取账号信息
*/
private suspend fun getAccount(): Boolean {
2024-08-23 18:31:14 +08:00
val accountService: AccountService = AccountServiceImpl()
2024-08-11 17:15:17 +08:00
try {
val resp = accountService.getMyAccount()
// 设置当前登录用户 ID
AppState.UserId = resp.id
2024-08-11 17:15:17 +08:00
return true
2024-08-13 22:32:27 +08:00
} catch (e: Exception) {
2024-08-11 17:15:17 +08:00
return false
}
2024-07-30 16:57:25 +08:00
}
2024-08-11 17:15:17 +08:00
2024-06-22 04:25:20 +08:00
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
2024-09-05 22:04:41 +08:00
// 监听应用生命周期
ProcessLifecycleOwner.get().lifecycle.addObserver(MainActivityLifecycleObserver())
// 创建通知渠道
createNotificationChannel()
// 沉浸式状态栏
2024-07-13 17:41:51 +08:00
WindowCompat.setDecorFitsSystemWindows(window, false)
2024-09-05 22:04:41 +08:00
// 初始化 Places SDK
2024-07-15 19:02:42 +08:00
if (!Places.isInitialized()) {
2024-07-15 20:21:03 +08:00
Places.initialize(applicationContext, "AIzaSyDpgLDH1-SECw_pdjJq_msynq1XrxwgKVI")
2024-07-15 19:02:42 +08:00
}
2024-09-05 22:04:41 +08:00
// 初始化 Firebase Analytics
analytics = Firebase.analytics
2024-09-05 22:04:41 +08:00
// 请求通知权限
askNotificationPermission()
// 加载一些本地化的配置
2024-07-30 16:57:25 +08:00
AppStore.init(this)
2024-06-22 04:25:20 +08:00
enableEdgeToEdge()
2024-07-30 16:57:25 +08:00
scope.launch {
2024-09-05 22:04:41 +08:00
// 检查是否有登录态
2024-08-11 17:15:17 +08:00
val isAccountValidate = getAccount()
2024-07-30 16:57:25 +08:00
var startDestination = NavigationRoute.Login.route
2024-09-05 22:04:41 +08:00
// 如果有登录态,且记住登录状态,且账号有效,则初始化 FCM下一步进入首页
2024-08-11 17:15:17 +08:00
if (AppStore.token != null && AppStore.rememberMe && isAccountValidate) {
2024-09-05 22:04:41 +08:00
Messaging.InitFCM(scope)
2024-07-30 16:57:25 +08:00
startDestination = NavigationRoute.Index.route
}
setContent {
2024-09-05 22:04:41 +08:00
Navigation(startDestination) { navController ->
// 处理带有 postId 的通知点击
val postId = intent.getStringExtra("POST_ID")
if (postId != null) {
Log.d("MainActivity", "Navigation to Post$postId")
PostViewModel.postId = postId
PostViewModel.viewModelScope.launch {
PostViewModel.initData()
navController.navigate(NavigationRoute.Post.route.replace("{id}", postId))
}
}
}
2024-07-30 16:57:25 +08:00
}
2024-09-05 22:04:41 +08:00
2024-06-22 04:25:20 +08:00
}
}
2024-09-05 22:04:41 +08:00
/**
* 请求通知权限
*/
private fun askNotificationPermission() {
// This is only necessary for API level >= 33 (TIRAMISU)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
PackageManager.PERMISSION_GRANTED
) {
// FCM SDK (and your app) can post notifications.
} else if (shouldShowRequestPermissionRationale(android.Manifest.permission.POST_NOTIFICATIONS)) {
} else {
// Directly ask for the permission
requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
}
}
}
/**
* 创建通知渠道
*/
private fun createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channelId = ConstVars.MOMENT_LIKE_CHANNEL_ID
val channelName = ConstVars.MOMENT_LIKE_CHANNEL_NAME
val channel =
NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT)
val notificationManager =
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(channel)
}
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
}
2024-06-22 04:25:20 +08:00
}
2024-07-12 23:37:21 +08:00
val LocalNavController = compositionLocalOf<NavHostController> {
error("NavController not provided")
}
2024-07-20 16:06:37 +08:00
@OptIn(ExperimentalSharedTransitionApi::class)
val LocalSharedTransitionScope = compositionLocalOf<SharedTransitionScope> {
error("SharedTransitionScope not provided")
}
val LocalAnimatedContentScope = compositionLocalOf<AnimatedContentScope> {
error("AnimatedContentScope not provided")
}