Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@ plugins {
}

android {

compileSdk 31

defaultConfig {
applicationId "com.pushdeer.os"
minSdk 22
targetSdk 31
versionCode 5
versionName "1.0-dev-5"
versionCode 8
versionName "1.0-dev-8"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
Expand Down Expand Up @@ -111,5 +112,7 @@ dependencies {

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

debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8.1'
api 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0'

// debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8.1'
}
Binary file added android/app/debug/PushDeer-v1.0-dev-8.apk
Binary file not shown.
20 changes: 20 additions & 0 deletions android/app/debug/output-metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "com.pushdeer.os",
"variantName": "debug",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 8,
"versionName": "1.0-dev-8",
"outputFile": "app-debug.apk"
}
],
"elementType": "File"
}
16 changes: 15 additions & 1 deletion android/app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,18 @@
# MiPush
-keep class com.pushdeer.os.receiver.MessageReceiver {*;}
#可以防止一个误报的 warning 导致无法成功编译,如果编译使用的 Android 版本是 23。
-dontwarn com.xiaomi.push.**
-dontwarn com.xiaomi.push.**


# XiaoErMei
-keep class com.tencent.mm.opensdk.** {
*;
}

-keep class com.tencent.wxop.** {
*;
}

-keep class com.tencent.mm.sdk.** {
*;
}
Binary file added android/app/release/app-release.apk
Binary file not shown.
20 changes: 20 additions & 0 deletions android/app/release/output-metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "com.pushdeer.os",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 5,
"versionName": "1.0-dev-5",
"outputFile": "app-release.apk"
}
],
"elementType": "File"
}
9 changes: 9 additions & 0 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,15 @@
android:theme="@style/Theme.PushDeer.NoActionBar"
/>

<activity
android:name=".wxapi.WXEntryActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:exported="true"
android:taskAffinity="com.pushdeer.os"
android:launchMode="singleTask">
</activity>

<!-- miPush components start -->

<service
Expand Down
23 changes: 22 additions & 1 deletion android/app/src/main/java/com/pushdeer/os/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import com.pushdeer.os.factory.ViewModelFactory
import com.pushdeer.os.keeper.RepositoryKeeper
import com.pushdeer.os.keeper.StoreKeeper
import com.pushdeer.os.values.AppKeys
import com.tencent.mm.opensdk.openapi.IWXAPI
import com.tencent.mm.opensdk.openapi.WXAPIFactory
import com.xiaomi.channel.commonutils.logger.LoggerInterface
import com.xiaomi.mipush.sdk.Logger
import com.xiaomi.mipush.sdk.MiPushClient
Expand All @@ -21,7 +23,7 @@ class App : Application() {

val storeKeeper by lazy { StoreKeeper(this) }
val database by lazy { AppDatabase.getDatabase(this) }
val repositoryKeeper by lazy { RepositoryKeeper(database) }
val repositoryKeeper by lazy { RepositoryKeeper(database,storeKeeper.settingStore) }
private val pushDeerService: PushDeerApi by lazy {
Retrofit.Builder()
.baseUrl(PushDeerApi.baseUrl)
Expand All @@ -38,6 +40,8 @@ class App : Application() {
)
}

val iwxapi:IWXAPI by lazy { WXAPIFactory.createWXAPI(this, AppKeys.WX_Id, true) }

override fun onCreate() {
super.onCreate()
//初始化push推送服务
Expand All @@ -52,10 +56,27 @@ class App : Application() {

override fun log(content: String, t: Throwable) {
Log.d(TAG, content, t)
Thread{
repositoryKeeper.logDogRepository.log(
entity = "mipush",
level = "e",
event = t.message.toString(),
log = content
)
}.start()
}

override fun log(content: String) {
Log.d(TAG, content)
// Thread{
// repositoryKeeper.logDogRepository.log(
// entity = "mipush",
// level = "d",
// event = "",
// log = content
// )
// }.start()

}
})
}
Expand Down
80 changes: 73 additions & 7 deletions android/app/src/main/java/com/pushdeer/os/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package com.pushdeer.os

import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import android.content.*
import android.os.Bundle
import android.text.util.Linkify
import android.util.Log
import androidx.activity.compose.setContent
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.viewModels
Expand All @@ -17,7 +16,7 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.core.view.WindowCompat
import androidx.fragment.app.FragmentManager
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
Expand All @@ -36,10 +35,13 @@ import com.pushdeer.os.ui.theme.PushDeerTheme
import com.pushdeer.os.util.ActivityOpener
import com.pushdeer.os.util.NotificationUtil
import com.pushdeer.os.util.SystemUtil
import com.pushdeer.os.values.AppKeys
import com.pushdeer.os.viewmodel.LogDogViewModel
import com.pushdeer.os.viewmodel.MessageViewModel
import com.pushdeer.os.viewmodel.PushDeerViewModel
import com.pushdeer.os.viewmodel.UiViewModel
import com.pushdeer.os.wxapi.WXEntryActivity
import com.tencent.mm.opensdk.constants.ConstantsAPI
import io.noties.markwon.Markwon
import io.noties.markwon.image.coil.CoilImagesPlugin
import io.noties.markwon.linkify.LinkifyPlugin
Expand All @@ -58,7 +60,6 @@ class MainActivity : AppCompatActivity(), RequestHolder {
override val logDogViewModel: LogDogViewModel by viewModels { viewModelFactory }
override val messageViewModel: MessageViewModel by viewModels { viewModelFactory }
override val settingStore: SettingStore by lazy { (application as App).storeKeeper.settingStore }
override val fragmentManager: FragmentManager by lazy { this.supportFragmentManager }

override val coilImageLoader: ImageLoader by lazy {
ImageLoader.Builder(this)
Expand Down Expand Up @@ -89,6 +90,13 @@ class MainActivity : AppCompatActivity(), RequestHolder {
) as ClipboardManager
) {}
}
override val weChatLogin: RequestHolder.WeChatLoginRequest by lazy {
object : RequestHolder.WeChatLoginRequest((application as App).iwxapi) {}
}

override val appleLogin: RequestHolder.AppleLoginRequest by lazy {
object : RequestHolder.AppleLoginRequest(supportFragmentManager, this) {}
}

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

val wxRegReceiver: BroadcastReceiver by lazy {
object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
intent?.let {
when (it.action) {
ConstantsAPI.ACTION_REFRESH_WXAPP -> {
weChatLogin.iwxapi.registerApp(AppKeys.WX_Id)
}
WXEntryActivity.ACTION_RETURN_CODE -> {
val code = intent.getStringExtra(WXEntryActivity.CODE_KEY)!!
lifecycleScope.launch {
if (pushDeerViewModel.userInfo.isAppleLogin) {
Log.d("WH_", "onReceive: isAppleLogin")
// if login, perform merge
coroutineScope.launch {
pushDeerViewModel.userMerge(
"wechat",
code
) {
coroutineScope.launch {
pushDeerViewModel.userInfo()
}
}
}
} else {
Log.d("WH_", "onReceive: plainLogin")
// if not, plain login
coroutineScope.launch {
pushDeerViewModel.loginWithWeiXin(code) {
globalNavController.navigate("main") {
globalNavController.popBackStack()
}
}
}
}
}
}
else -> {
}
}
}

}
}
}

@ExperimentalAnimationApi
@ExperimentalMaterialApi
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

registerReceiver(wxRegReceiver,
IntentFilter().apply {
addAction(ConstantsAPI.ACTION_REFRESH_WXAPP)
addAction(WXEntryActivity.ACTION_RETURN_CODE)
})


NotificationUtil.setupChannel(this)

myActivity = this
Expand All @@ -124,7 +185,7 @@ class MainActivity : AppCompatActivity(), RequestHolder {
Color.Transparent,
useDarkIcons
)
else -> systemUiController.setSystemBarsColor(Color.Transparent, useDarkIcons)
else -> systemUiController.setSystemBarsColor(Color.Transparent, !useDarkIcons)
}
WindowCompat.setDecorFitsSystemWindows(window, true)
miPushRepository.regId.observe(this) {
Expand All @@ -133,7 +194,7 @@ class MainActivity : AppCompatActivity(), RequestHolder {

SideEffect {
coroutineScope.launch {
pushDeerViewModel.login(onReturn = {
pushDeerViewModel.loginWithApple(onReturn = {
globalNavController.navigate("main") {
globalNavController.popBackStack()
}
Expand Down Expand Up @@ -165,4 +226,9 @@ class MainActivity : AppCompatActivity(), RequestHolder {
}
}
}

override fun onDestroy() {
super.onDestroy()
unregisterReceiver(wxRegReceiver)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,19 @@ interface PushDeerApi {

@FormUrlEncoded
@POST("/login/idtoken")
suspend fun loginIdToken(@Field("idToken") idToken: String): ReturnData<TokenOnly>
suspend fun loginWithAppleIdToken(@Field("idToken") idToken: String): ReturnData<TokenOnly>

@FormUrlEncoded
@POST("/login/wecode")
suspend fun loginWithWeXin(@Field("code") code: String): ReturnData<TokenOnly>

@FormUrlEncoded
@POST("/user/merge")
suspend fun userMerge(
@Field("token") token: String,
@Field("type") type: String, // apple wechat
@Field("tokenorcode") tokenorcode: String // input idToken / code
): String

// @GET("/login/fake")
// suspend fun fakeLogin(): ReturnData<TokenOnly>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,44 @@ package com.pushdeer.os.data.api.data.response

class UserInfo {
var id: String = ""
// var uid: String = ""
var name: String = ""
var email: String = ""
var app_id: String = ""
var wechat_id: String = ""
var apple_id: String? = ""
var wechat_id: String? = ""
var level: Int = 1
var created_at: String = ""
var updated_at: String = ""

override fun toString(): String {
return "id:$id\n" +
// "uid:$uid\n" +
"name:$name\n" +
"email:$email\n" +
"app_id:$app_id\n" +
"apple_id:$apple_id\n" +
"wechat_id:$wechat_id\n" +
"level:$level\n" +
"created:$created_at\n" +
"updated:$updated_at"
}

val isWeChatLogin: Boolean
get() {
return if (wechat_id == null) {
false
} else {
wechat_id!!.length > 4
}
}
val isAppleLogin: Boolean
get() {
return if (apple_id == null) {
false
} else {
apple_id!!.length > 4
}
}

val isLogin: Boolean
get() = isWeChatLogin or isAppleLogin
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ interface LogDogDao {
@Insert
suspend fun insert(vararg logDog: LogDog)

@Insert
fun insert1(vararg logDog: LogDog)

@Query("delete from LogDog")
suspend fun clear()
}
Loading