diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f567213..cb8071d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -21,6 +21,14 @@ android { vectorDrawables { useSupportLibrary = true } + addManifestPlaceholders( + mapOf( + "JPUSH_PKGNAME " to applicationId!!, + "JPUSH_APPKEY" to "ad805ee9f2760376f4f47178", + "JPUSH_CHANNEL" to "developer-default", + ) + + ) } buildTypes { @@ -50,6 +58,7 @@ android { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } + } dependencies { @@ -101,5 +110,6 @@ dependencies { implementation("com.google.firebase:firebase-analytics") implementation("com.google.firebase:firebase-perf") implementation("com.google.firebase:firebase-messaging-ktx") + implementation ("cn.jiguang.sdk:jpush:5.4.0") // 必选,此处以JPush 5.4.0 版本为例,注意:5.0.0 版本 } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 96d767b..9f8c9d1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,10 +46,12 @@ + + @@ -57,6 +59,27 @@ + + + + + + + + + + + + + + + + - \ No newline at end of file diff --git a/app/src/main/java/com/aiosman/riderpro/JpushReciver.kt b/app/src/main/java/com/aiosman/riderpro/JpushReciver.kt new file mode 100644 index 0000000..c10940f --- /dev/null +++ b/app/src/main/java/com/aiosman/riderpro/JpushReciver.kt @@ -0,0 +1,41 @@ +package com.aiosman.riderpro + +import android.content.Context +import android.content.Intent +import android.util.Log +import cn.jpush.android.api.NotificationMessage +import cn.jpush.android.service.JPushMessageReceiver +import com.google.gson.Gson +import com.google.gson.annotations.SerializedName + +data class ActionExtra( + @SerializedName("action") + val action: String, + @SerializedName("postId") + val postId: String?, +) + +class JpushReciver : JPushMessageReceiver() { + val gson = Gson() + override fun onInAppMessageClick(p0: Context?, p1: NotificationMessage?) { + super.onInAppMessageClick(p0, p1) + // 打开自定义的页面 + Log.d("JpushReciver", "onInAppMessageClick") + } + + override fun onNotifyMessageOpened(context: Context?, message: NotificationMessage) { + super.onNotifyMessageOpened(context, message) + // 打开自定义的页面 + Log.d("JpushReciver", "onNotifyMessageOpened") + val actionExtra = message.notificationExtras?.let { + gson.fromJson(it, ActionExtra::class.java) + } + actionExtra?.postId?.let { + val intent = Intent(context, MainActivity::class.java).apply { + putExtra("POST_ID", it) + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + } + context?.startActivity(intent) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/aiosman/riderpro/JpushService.kt b/app/src/main/java/com/aiosman/riderpro/JpushService.kt new file mode 100644 index 0000000..fe621f2 --- /dev/null +++ b/app/src/main/java/com/aiosman/riderpro/JpushService.kt @@ -0,0 +1,9 @@ +package com.aiosman.riderpro + +import android.content.Context +import cn.jpush.android.service.JCommonService + +class JpushService : JCommonService() { + + +} \ No newline at end of file diff --git a/app/src/main/java/com/aiosman/riderpro/MainActivity.kt b/app/src/main/java/com/aiosman/riderpro/MainActivity.kt index d7791e4..f467337 100644 --- a/app/src/main/java/com/aiosman/riderpro/MainActivity.kt +++ b/app/src/main/java/com/aiosman/riderpro/MainActivity.kt @@ -21,18 +21,16 @@ import androidx.compose.runtime.compositionLocalOf import androidx.core.content.ContextCompat import androidx.core.view.WindowCompat import androidx.lifecycle.ProcessLifecycleOwner -import androidx.lifecycle.viewModelScope import androidx.navigation.NavHostController +import cn.jiguang.api.utils.JCollectionAuth +import cn.jpush.android.api.JPushInterface import com.aiosman.riderpro.data.AccountService import com.aiosman.riderpro.data.AccountServiceImpl import com.aiosman.riderpro.ui.Navigation import com.aiosman.riderpro.ui.NavigationRoute import com.aiosman.riderpro.ui.post.NewPostViewModel -import com.aiosman.riderpro.ui.post.PostViewModel 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 import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -81,21 +79,33 @@ class MainActivity : ComponentActivity() { Places.initialize(applicationContext, "AIzaSyDpgLDH1-SECw_pdjJq_msynq1XrxwgKVI") } // 初始化 Firebase Analytics - analytics = Firebase.analytics +// analytics = Firebase.analytics // 请求通知权限 askNotificationPermission() // 加载一些本地化的配置 AppStore.init(this) + JPushInterface.setDebugMode(true); + + // 调整点一:初始化代码前增加setAuth调用 + JCollectionAuth.setAuth(this, true) + + JPushInterface.init(this) + +// JPushInterface.setAlias(this, 0, "myTest") + +// Log.d("MainActivity", "pushId: $pushId") enableEdgeToEdge() + + scope.launch { // 检查是否有登录态 val isAccountValidate = getAccount() var startDestination = NavigationRoute.Login.route // 如果有登录态,且记住登录状态,且账号有效,则初始化 FCM,下一步进入首页 if (AppStore.token != null && AppStore.rememberMe && isAccountValidate) { - Messaging.InitFCM(scope) + Messaging.RegistDevice(scope,this@MainActivity) startDestination = NavigationRoute.Index.route } setContent { diff --git a/app/src/main/java/com/aiosman/riderpro/Messaging.kt b/app/src/main/java/com/aiosman/riderpro/Messaging.kt index c514452..689a67a 100644 --- a/app/src/main/java/com/aiosman/riderpro/Messaging.kt +++ b/app/src/main/java/com/aiosman/riderpro/Messaging.kt @@ -1,6 +1,8 @@ package com.aiosman.riderpro +import android.content.Context import android.util.Log +import cn.jpush.android.api.JPushInterface import com.aiosman.riderpro.data.AccountService import com.aiosman.riderpro.data.AccountServiceImpl import com.google.android.gms.tasks.OnCompleteListener @@ -9,7 +11,21 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch object Messaging { - fun InitFCM(scope: CoroutineScope) { + fun RegistDevice(scope: CoroutineScope, context: Context) { + + registerJpush(scope, context) +// registerFCM(scope) + } + + fun registerJpush(scope: CoroutineScope, context: Context) { + val accountService: AccountService = AccountServiceImpl() + val regId = JPushInterface.getRegistrationID(context) + scope.launch { + accountService.registerMessageChannel(client = "jpush", identifier = regId) + } + } + + fun registerFCM(scope: CoroutineScope) { val accountService: AccountService = AccountServiceImpl() FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task -> if (!task.isSuccessful) { @@ -27,4 +43,5 @@ object Messaging { } }) } + } \ No newline at end of file diff --git a/app/src/main/java/com/aiosman/riderpro/ui/composables/DragAndDrop.kt b/app/src/main/java/com/aiosman/riderpro/ui/composables/DragAndDrop.kt index dc25aeb..15ad97e 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/composables/DragAndDrop.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/composables/DragAndDrop.kt @@ -273,6 +273,7 @@ class GridDragDropState internal constructor( get() = this.offset + this.size } + operator fun IntOffset.plus(size: IntSize): IntOffset { return IntOffset(x + size.width, y + size.height) } diff --git a/app/src/main/java/com/aiosman/riderpro/ui/login/emailsignup.kt b/app/src/main/java/com/aiosman/riderpro/ui/login/emailsignup.kt index 55d8cce..0228133 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/login/emailsignup.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/login/emailsignup.kt @@ -4,19 +4,13 @@ import android.widget.Toast import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.LocalMinimumInteractiveComponentEnforcement -import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -24,12 +18,10 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.scale import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import com.aiosman.riderpro.AppState import com.aiosman.riderpro.AppStore import com.aiosman.riderpro.ErrorCode @@ -43,9 +35,7 @@ import com.aiosman.riderpro.getErrorMessageCode import com.aiosman.riderpro.ui.NavigationRoute import com.aiosman.riderpro.ui.comment.NoticeScreenHeader import com.aiosman.riderpro.ui.composables.ActionButton -import com.aiosman.riderpro.ui.composables.Checkbox import com.aiosman.riderpro.ui.composables.CheckboxWithLabel -import com.aiosman.riderpro.ui.composables.StatusBarMaskLayout import com.aiosman.riderpro.ui.composables.StatusBarSpacer import com.aiosman.riderpro.ui.composables.TextInputField import kotlinx.coroutines.Dispatchers @@ -165,7 +155,7 @@ fun EmailSignupScreen() { try { val resp = accountService.getMyAccount() AppState.UserId = resp.id - Messaging.InitFCM(scope) + Messaging.RegistDevice(scope, context) } catch (e: ServiceException) { scope.launch(Dispatchers.Main) { Toast.makeText(context, "Failed to get account", Toast.LENGTH_SHORT).show() diff --git a/app/src/main/java/com/aiosman/riderpro/ui/login/signup.kt b/app/src/main/java/com/aiosman/riderpro/ui/login/signup.kt index 5e88129..bfeb637 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/login/signup.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/login/signup.kt @@ -85,7 +85,7 @@ fun SignupScreen() { try { val resp = accountService.getMyAccount() AppState.UserId = resp.id - Messaging.InitFCM(coroutineScope) + Messaging.RegistDevice(coroutineScope, context) } catch (e: ServiceException) { coroutineScope.launch(Dispatchers.Main) { Toast.makeText(context, "Failed to get account", Toast.LENGTH_SHORT) diff --git a/app/src/main/java/com/aiosman/riderpro/ui/login/userauth.kt b/app/src/main/java/com/aiosman/riderpro/ui/login/userauth.kt index 5a1fb08..2bb5bb4 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/login/userauth.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/login/userauth.kt @@ -14,13 +14,9 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.material3.Checkbox -import androidx.compose.material3.CheckboxDefaults import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.LocalMinimumInteractiveComponentEnforcement import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -34,7 +30,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.credentials.CredentialManager import com.aiosman.riderpro.AppStore import com.aiosman.riderpro.LocalNavController import com.aiosman.riderpro.Messaging @@ -45,7 +40,6 @@ import com.aiosman.riderpro.data.ServiceException import com.aiosman.riderpro.ui.NavigationRoute import com.aiosman.riderpro.ui.comment.NoticeScreenHeader import com.aiosman.riderpro.ui.composables.ActionButton -import com.aiosman.riderpro.ui.composables.StatusBarMaskLayout import com.aiosman.riderpro.ui.composables.StatusBarSpacer import com.aiosman.riderpro.ui.composables.TextInputField import com.aiosman.riderpro.ui.modifiers.noRippleClickable @@ -86,7 +80,7 @@ fun UserAuthScreen() { this.rememberMe = rememberMe saveData() } - Messaging.InitFCM(scope) + Messaging.RegistDevice(scope, context) navController.navigate(NavigationRoute.Index.route) { popUpTo(NavigationRoute.Login.route) { inclusive = true } } diff --git a/build.gradle.kts b/build.gradle.kts index c53520f..0d60e7b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,3 +7,4 @@ plugins { id("com.google.firebase.firebase-perf") version "1.4.2" apply false } +