Skip to content

Commit 5b4371a

Browse files
authored
Merge pull request #31 from alone-wolf/main
主要修改:适配微信登陆
2 parents 3faff74 + ad55b81 commit 5b4371a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+971
-238
lines changed

android/app/build.gradle

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ plugins {
55
}
66

77
android {
8+
89
compileSdk 31
910

1011
defaultConfig {
1112
applicationId "com.pushdeer.os"
1213
minSdk 22
1314
targetSdk 31
14-
versionCode 5
15-
versionName "1.0-dev-5"
15+
versionCode 8
16+
versionName "1.0-dev-8"
1617

1718
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1819
vectorDrawables {
@@ -111,5 +112,7 @@ dependencies {
111112

112113
implementation 'com.github.vishalkumarsinghvi:sign-in-with-apple-button-android:0.6'
113114

114-
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8.1'
115+
api 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0'
116+
117+
// debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8.1'
115118
}
10.6 MB
Binary file not shown.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"version": 3,
3+
"artifactType": {
4+
"type": "APK",
5+
"kind": "Directory"
6+
},
7+
"applicationId": "com.pushdeer.os",
8+
"variantName": "debug",
9+
"elements": [
10+
{
11+
"type": "SINGLE",
12+
"filters": [],
13+
"attributes": [],
14+
"versionCode": 8,
15+
"versionName": "1.0-dev-8",
16+
"outputFile": "app-debug.apk"
17+
}
18+
],
19+
"elementType": "File"
20+
}

android/app/proguard-rules.pro

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,18 @@
2727
# MiPush
2828
-keep class com.pushdeer.os.receiver.MessageReceiver {*;}
2929
#可以防止一个误报的 warning 导致无法成功编译,如果编译使用的 Android 版本是 23。
30-
-dontwarn com.xiaomi.push.**
30+
-dontwarn com.xiaomi.push.**
31+
32+
33+
# XiaoErMei
34+
-keep class com.tencent.mm.opensdk.** {
35+
*;
36+
}
37+
38+
-keep class com.tencent.wxop.** {
39+
*;
40+
}
41+
42+
-keep class com.tencent.mm.sdk.** {
43+
*;
44+
}

android/app/release/app-release.apk

8.23 MB
Binary file not shown.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"version": 3,
3+
"artifactType": {
4+
"type": "APK",
5+
"kind": "Directory"
6+
},
7+
"applicationId": "com.pushdeer.os",
8+
"variantName": "release",
9+
"elements": [
10+
{
11+
"type": "SINGLE",
12+
"filters": [],
13+
"attributes": [],
14+
"versionCode": 5,
15+
"versionName": "1.0-dev-5",
16+
"outputFile": "app-release.apk"
17+
}
18+
],
19+
"elementType": "File"
20+
}

android/app/src/main/AndroidManifest.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@
5555
android:theme="@style/Theme.PushDeer.NoActionBar"
5656
/>
5757

58+
<activity
59+
android:name=".wxapi.WXEntryActivity"
60+
android:label="@string/app_name"
61+
android:theme="@android:style/Theme.Translucent.NoTitleBar"
62+
android:exported="true"
63+
android:taskAffinity="com.pushdeer.os"
64+
android:launchMode="singleTask">
65+
</activity>
66+
5867
<!-- miPush components start -->
5968

6069
<service

android/app/src/main/java/com/pushdeer/os/App.kt

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import com.pushdeer.os.factory.ViewModelFactory
1010
import com.pushdeer.os.keeper.RepositoryKeeper
1111
import com.pushdeer.os.keeper.StoreKeeper
1212
import com.pushdeer.os.values.AppKeys
13+
import com.tencent.mm.opensdk.openapi.IWXAPI
14+
import com.tencent.mm.opensdk.openapi.WXAPIFactory
1315
import com.xiaomi.channel.commonutils.logger.LoggerInterface
1416
import com.xiaomi.mipush.sdk.Logger
1517
import com.xiaomi.mipush.sdk.MiPushClient
@@ -21,7 +23,7 @@ class App : Application() {
2123

2224
val storeKeeper by lazy { StoreKeeper(this) }
2325
val database by lazy { AppDatabase.getDatabase(this) }
24-
val repositoryKeeper by lazy { RepositoryKeeper(database) }
26+
val repositoryKeeper by lazy { RepositoryKeeper(database,storeKeeper.settingStore) }
2527
private val pushDeerService: PushDeerApi by lazy {
2628
Retrofit.Builder()
2729
.baseUrl(PushDeerApi.baseUrl)
@@ -38,6 +40,8 @@ class App : Application() {
3840
)
3941
}
4042

43+
val iwxapi:IWXAPI by lazy { WXAPIFactory.createWXAPI(this, AppKeys.WX_Id, true) }
44+
4145
override fun onCreate() {
4246
super.onCreate()
4347
//初始化push推送服务
@@ -52,10 +56,27 @@ class App : Application() {
5256

5357
override fun log(content: String, t: Throwable) {
5458
Log.d(TAG, content, t)
59+
Thread{
60+
repositoryKeeper.logDogRepository.log(
61+
entity = "mipush",
62+
level = "e",
63+
event = t.message.toString(),
64+
log = content
65+
)
66+
}.start()
5567
}
5668

5769
override fun log(content: String) {
5870
Log.d(TAG, content)
71+
// Thread{
72+
// repositoryKeeper.logDogRepository.log(
73+
// entity = "mipush",
74+
// level = "d",
75+
// event = "",
76+
// log = content
77+
// )
78+
// }.start()
79+
5980
}
6081
})
6182
}

android/app/src/main/java/com/pushdeer/os/MainActivity.kt

Lines changed: 73 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package com.pushdeer.os
22

3-
import android.content.ClipboardManager
4-
import android.content.Context
5-
import android.content.Intent
3+
import android.content.*
64
import android.os.Bundle
75
import android.text.util.Linkify
6+
import android.util.Log
87
import androidx.activity.compose.setContent
98
import androidx.activity.result.ActivityResultLauncher
109
import androidx.activity.viewModels
@@ -17,7 +16,7 @@ import androidx.compose.runtime.*
1716
import androidx.compose.ui.Modifier
1817
import androidx.compose.ui.graphics.Color
1918
import androidx.core.view.WindowCompat
20-
import androidx.fragment.app.FragmentManager
19+
import androidx.lifecycle.lifecycleScope
2120
import androidx.navigation.NavHostController
2221
import androidx.navigation.compose.NavHost
2322
import androidx.navigation.compose.composable
@@ -36,10 +35,13 @@ import com.pushdeer.os.ui.theme.PushDeerTheme
3635
import com.pushdeer.os.util.ActivityOpener
3736
import com.pushdeer.os.util.NotificationUtil
3837
import com.pushdeer.os.util.SystemUtil
38+
import com.pushdeer.os.values.AppKeys
3939
import com.pushdeer.os.viewmodel.LogDogViewModel
4040
import com.pushdeer.os.viewmodel.MessageViewModel
4141
import com.pushdeer.os.viewmodel.PushDeerViewModel
4242
import com.pushdeer.os.viewmodel.UiViewModel
43+
import com.pushdeer.os.wxapi.WXEntryActivity
44+
import com.tencent.mm.opensdk.constants.ConstantsAPI
4345
import io.noties.markwon.Markwon
4446
import io.noties.markwon.image.coil.CoilImagesPlugin
4547
import io.noties.markwon.linkify.LinkifyPlugin
@@ -58,7 +60,6 @@ class MainActivity : AppCompatActivity(), RequestHolder {
5860
override val logDogViewModel: LogDogViewModel by viewModels { viewModelFactory }
5961
override val messageViewModel: MessageViewModel by viewModels { viewModelFactory }
6062
override val settingStore: SettingStore by lazy { (application as App).storeKeeper.settingStore }
61-
override val fragmentManager: FragmentManager by lazy { this.supportFragmentManager }
6263

6364
override val coilImageLoader: ImageLoader by lazy {
6465
ImageLoader.Builder(this)
@@ -89,6 +90,13 @@ class MainActivity : AppCompatActivity(), RequestHolder {
8990
) as ClipboardManager
9091
) {}
9192
}
93+
override val weChatLogin: RequestHolder.WeChatLoginRequest by lazy {
94+
object : RequestHolder.WeChatLoginRequest((application as App).iwxapi) {}
95+
}
96+
97+
override val appleLogin: RequestHolder.AppleLoginRequest by lazy {
98+
object : RequestHolder.AppleLoginRequest(supportFragmentManager, this) {}
99+
}
92100

93101
override val markdown: Markwon by lazy {
94102
Markwon.builder(this)
@@ -103,11 +111,64 @@ class MainActivity : AppCompatActivity(), RequestHolder {
103111
override lateinit var qrScanActivityOpener: ActivityResultLauncher<Intent>
104112
override lateinit var requestPermissionOpener: ActivityResultLauncher<Array<String>>
105113

114+
val wxRegReceiver: BroadcastReceiver by lazy {
115+
object : BroadcastReceiver() {
116+
override fun onReceive(context: Context?, intent: Intent?) {
117+
intent?.let {
118+
when (it.action) {
119+
ConstantsAPI.ACTION_REFRESH_WXAPP -> {
120+
weChatLogin.iwxapi.registerApp(AppKeys.WX_Id)
121+
}
122+
WXEntryActivity.ACTION_RETURN_CODE -> {
123+
val code = intent.getStringExtra(WXEntryActivity.CODE_KEY)!!
124+
lifecycleScope.launch {
125+
if (pushDeerViewModel.userInfo.isAppleLogin) {
126+
Log.d("WH_", "onReceive: isAppleLogin")
127+
// if login, perform merge
128+
coroutineScope.launch {
129+
pushDeerViewModel.userMerge(
130+
"wechat",
131+
code
132+
) {
133+
coroutineScope.launch {
134+
pushDeerViewModel.userInfo()
135+
}
136+
}
137+
}
138+
} else {
139+
Log.d("WH_", "onReceive: plainLogin")
140+
// if not, plain login
141+
coroutineScope.launch {
142+
pushDeerViewModel.loginWithWeiXin(code) {
143+
globalNavController.navigate("main") {
144+
globalNavController.popBackStack()
145+
}
146+
}
147+
}
148+
}
149+
}
150+
}
151+
else -> {
152+
}
153+
}
154+
}
155+
156+
}
157+
}
158+
}
159+
106160
@ExperimentalAnimationApi
107161
@ExperimentalMaterialApi
108162
override fun onCreate(savedInstanceState: Bundle?) {
109163
super.onCreate(savedInstanceState)
110164

165+
registerReceiver(wxRegReceiver,
166+
IntentFilter().apply {
167+
addAction(ConstantsAPI.ACTION_REFRESH_WXAPP)
168+
addAction(WXEntryActivity.ACTION_RETURN_CODE)
169+
})
170+
171+
111172
NotificationUtil.setupChannel(this)
112173

113174
myActivity = this
@@ -124,7 +185,7 @@ class MainActivity : AppCompatActivity(), RequestHolder {
124185
Color.Transparent,
125186
useDarkIcons
126187
)
127-
else -> systemUiController.setSystemBarsColor(Color.Transparent, useDarkIcons)
188+
else -> systemUiController.setSystemBarsColor(Color.Transparent, !useDarkIcons)
128189
}
129190
WindowCompat.setDecorFitsSystemWindows(window, true)
130191
miPushRepository.regId.observe(this) {
@@ -133,7 +194,7 @@ class MainActivity : AppCompatActivity(), RequestHolder {
133194

134195
SideEffect {
135196
coroutineScope.launch {
136-
pushDeerViewModel.login(onReturn = {
197+
pushDeerViewModel.loginWithApple(onReturn = {
137198
globalNavController.navigate("main") {
138199
globalNavController.popBackStack()
139200
}
@@ -165,4 +226,9 @@ class MainActivity : AppCompatActivity(), RequestHolder {
165226
}
166227
}
167228
}
229+
230+
override fun onDestroy() {
231+
super.onDestroy()
232+
unregisterReceiver(wxRegReceiver)
233+
}
168234
}

android/app/src/main/java/com/pushdeer/os/data/api/PushDeerApi.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,19 @@ interface PushDeerApi {
1313

1414
@FormUrlEncoded
1515
@POST("/login/idtoken")
16-
suspend fun loginIdToken(@Field("idToken") idToken: String): ReturnData<TokenOnly>
16+
suspend fun loginWithAppleIdToken(@Field("idToken") idToken: String): ReturnData<TokenOnly>
17+
18+
@FormUrlEncoded
19+
@POST("/login/wecode")
20+
suspend fun loginWithWeXin(@Field("code") code: String): ReturnData<TokenOnly>
21+
22+
@FormUrlEncoded
23+
@POST("/user/merge")
24+
suspend fun userMerge(
25+
@Field("token") token: String,
26+
@Field("type") type: String, // apple wechat
27+
@Field("tokenorcode") tokenorcode: String // input idToken / code
28+
): String
1729

1830
// @GET("/login/fake")
1931
// suspend fun fakeLogin(): ReturnData<TokenOnly>

0 commit comments

Comments
 (0)