From 2ed1093b66147c192ba21d27600a113bba8f6deb Mon Sep 17 00:00:00 2001 From: alone-wolf <1031629044@qq.com> Date: Sat, 22 Jan 2022 13:16:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9icon=EF=BC=8C=E5=AE=8C?= =?UTF-8?q?=E5=96=84=E6=B3=A8=E9=94=80=E9=80=BB=E8=BE=91=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=82=B9=E5=87=BBMessageListItem=E5=A4=8D=E5=88=B6?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/.idea/gradle.xml | 2 + android/.idea/misc.xml | 5 + android/Readme.md | 32 ++- android/app/build.gradle | 3 +- android/app/src/main/AndroidManifest.xml | 17 +- .../app/src/main/ic_launcher-playstore.png | Bin 0 -> 31410 bytes .../main/java/com/pushdeer/os/MainActivity.kt | 54 +++-- .../pushdeer/os/activity/QrScanActivity.kt | 132 +++++------ .../com/pushdeer/os/holder/RequestHolder.kt | 218 ++++++++++-------- .../pushdeer/os/ui/compose/componment/Item.kt | 18 +- .../os/ui/compose/componment/KeyItem.kt | 44 ++-- .../os/ui/compose/componment/MessageItem.kt | 47 ++-- .../pushdeer/os/ui/compose/page/LoginPage.kt | 2 +- .../os/ui/compose/page/main/DeviceListPage.kt | 9 +- .../os/ui/compose/page/main/KeyListPage.kt | 4 +- .../os/ui/compose/page/main/MainPage.kt | 4 +- .../ui/compose/page/main/MessageListPage.kt | 8 +- .../os/ui/compose/page/main/SettingPage.kt | 14 +- .../com/pushdeer/os/util/ActivityOpener.kt | 30 +++ .../drawable-v24/ic_launcher_foreground.xml | 30 --- .../res/drawable/ic_launcher_background.xml | 170 -------------- .../res/drawable/ic_launcher_foreground.xml | 29 +++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 4 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 4 +- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2594 bytes .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1404 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4730 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 2898 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1642 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 982 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2879 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 1772 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3677 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1900 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6862 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3918 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5852 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 2884 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10985 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 5914 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 8118 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 3844 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15668 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 7778 -> 0 bytes .../res/values/ic_launcher_background.xml | 4 + android/common/build.gradle | 5 + android/common/src/main/AndroidManifest.xml | 2 + .../com/wh/common/activity/QrScanActivity.kt | 65 ++++++ .../java/com/wh/common/util/ActivityOpener.kt | 38 +++ .../com/wh/common/util/QRCodeGenerator.java | 54 +++++ .../src/main/res/layout/activity_qr_scan.xml | 46 ++++ android/compose/src/main/AndroidManifest.xml | 1 + android/pushdeercommon/.gitignore | 1 + android/pushdeercommon/build.gradle | 47 ++++ android/pushdeercommon/consumer-rules.pro | 0 android/pushdeercommon/proguard-rules.pro | 21 ++ .../common/ExampleInstrumentedTest.kt | 24 ++ .../src/main/AndroidManifest.xml | 5 + .../com/pushdeer/common/api/PushDeerApi.kt | 93 ++++++++ .../common/api/data/request/DeviceInfo.kt | 24 ++ .../common/api/data/response/DeviceInfo.kt | 12 + .../common/api/data/response/Message.kt | 16 ++ .../common/api/data/response/PushKey.kt | 20 ++ .../common/api/data/response/ReturnData.kt | 15 ++ .../common/api/data/response/UserInfo.kt | 23 ++ .../com/pushdeer/common/ExampleUnitTest.kt | 17 ++ android/settings.gradle | 1 + 67 files changed, 957 insertions(+), 457 deletions(-) create mode 100644 android/app/src/main/ic_launcher-playstore.png create mode 100644 android/app/src/main/java/com/pushdeer/os/util/ActivityOpener.kt delete mode 100644 android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml delete mode 100644 android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 android/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 android/app/src/main/res/values/ic_launcher_background.xml create mode 100644 android/common/src/main/java/com/wh/common/activity/QrScanActivity.kt create mode 100644 android/common/src/main/java/com/wh/common/util/ActivityOpener.kt create mode 100644 android/common/src/main/java/com/wh/common/util/QRCodeGenerator.java create mode 100644 android/common/src/main/res/layout/activity_qr_scan.xml create mode 100644 android/pushdeercommon/.gitignore create mode 100644 android/pushdeercommon/build.gradle create mode 100644 android/pushdeercommon/consumer-rules.pro create mode 100644 android/pushdeercommon/proguard-rules.pro create mode 100644 android/pushdeercommon/src/androidTest/java/com/pushdeer/common/ExampleInstrumentedTest.kt create mode 100644 android/pushdeercommon/src/main/AndroidManifest.xml create mode 100644 android/pushdeercommon/src/main/java/com/pushdeer/common/api/PushDeerApi.kt create mode 100644 android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/request/DeviceInfo.kt create mode 100644 android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/DeviceInfo.kt create mode 100644 android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/Message.kt create mode 100644 android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/PushKey.kt create mode 100644 android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/ReturnData.kt create mode 100644 android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/UserInfo.kt create mode 100644 android/pushdeercommon/src/test/java/com/pushdeer/common/ExampleUnitTest.kt diff --git a/android/.idea/gradle.xml b/android/.idea/gradle.xml index 00ecf65..81148c9 100644 --- a/android/.idea/gradle.xml +++ b/android/.idea/gradle.xml @@ -13,6 +13,8 @@ diff --git a/android/Readme.md b/android/Readme.md index 6cd1893..8e9e348 100644 --- a/android/Readme.md +++ b/android/Readme.md @@ -1,32 +1,34 @@ # PushDeer for Android - - ### 适配进度 * MiPush(状态:已调通、已接入) - * miui 12.5.6 正常 - * 原生、类原生 可成功注册,无法收到推送,可能和地区识别有关,待解决 - * miui下处于"几乎可用"的状态,已接入 appleId + * miui √ + * Mokee √ + * HuaWei √ + * 部分原生、类原生 可成功注册,无法收到推送,可能和地区识别有关,待解决 ### TODO * ~~调通 MiPush~~ * ~~接入 MiPush~~ * 完善 log ~~采集~~ 回传机制,便于调试 -* 测试不同厂商设备上的通知推送效果 +* 测试不同厂商设备/系统上的通知推送效果 miui√ Mokee√ HuaWei√ * ~~接入 PushDeer~~ * ~~界面设计:BottomBar+Navigation(Device Key Message Setting)~~ * 调整 KeyList MessageList 等处的自定义绘制 * ~~增加 DeviceList 外的侧滑手势~~ * ~~增加侧滑手势相关动作~~ -* 增加各种操作前的二次确认弹窗,包括自动登陆 -* 增加非Miui设备的权限获取 -* 增加手动修改服务器地址/退出登陆的逻辑(并放置到登陆界面) +* 增加手动修改服务器地址逻辑(并放置到登陆界面) +* ~~增加退出登陆的逻辑~~ * 增加登陆过程中的图形提示 -* 增加对PushKey重命名的逻辑 -* 增加对设备重命名的逻辑 -* 增加长按复制消息内容的逻辑 +* ~~增加对PushKey重命名的逻辑~~ +* ~~增加对设备重命名的逻辑~~ +* ~~增加长按复制消息内容的逻辑~~ +* 增加点击设置界面用户名修改用户名逻辑 +* ~~适配image类型的消息显示~~ +* ~~修改app图标~~ + ### 日志 @@ -105,6 +107,12 @@ * 修改登陆界面ui * 增加key/device的重命名逻辑 * 适配英语和中文 + * 增加点击PushKey显示二维码功能 + +* 2022-01-22 + * 增加点击 Message 列表项目复制文本功能 + * 增加适配Image类型Message的显示 + * 完善登陆注销逻辑 ### 感谢 diff --git a/android/app/build.gradle b/android/app/build.gradle index 365c115..b00d603 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -91,11 +91,12 @@ dependencies { implementation "androidx.room:room-runtime:$room_version" kapt "androidx.room:room-compiler:$room_version" + // qr implementation 'com.google.zxing:core:3.2.1' implementation 'cn.bingoogolapple:bga-qrcodecore:1.1.7@aar' implementation 'cn.bingoogolapple:bga-zxing:1.1.7@aar' - implementation 'androidx.constraintlayout:constraintlayout:2.1.2' + implementation 'androidx.constraintlayout:constraintlayout:2.1.3' final def markwon_version = '4.6.2' implementation "io.noties.markwon:core:$markwon_version" diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 1bd89e6..9bf459d 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -4,12 +4,13 @@ package="com.pushdeer.os"> + - - + + + @@ -18,8 +19,9 @@ android:protectionLevel="signature" /> - + + @@ -49,11 +51,11 @@ - + - + - diff --git a/android/app/src/main/ic_launcher-playstore.png b/android/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..f745bf0f12316189b8ec32bfad248780eda68e2f GIT binary patch literal 31410 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/java/com/pushdeer/os/MainActivity.kt b/android/app/src/main/java/com/pushdeer/os/MainActivity.kt index 740d9cc..c840559 100644 --- a/android/app/src/main/java/com/pushdeer/os/MainActivity.kt +++ b/android/app/src/main/java/com/pushdeer/os/MainActivity.kt @@ -5,11 +5,8 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.text.util.Linkify -import android.widget.Toast -import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.result.ActivityResultLauncher -import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.compose.animation.ExperimentalAnimationApi @@ -29,7 +26,6 @@ import coil.ImageLoader import com.google.accompanist.insets.ProvideWindowInsets import com.google.accompanist.insets.statusBarsPadding import com.google.accompanist.systemuicontroller.rememberSystemUiController -import com.pushdeer.os.activity.QrScanActivity import com.pushdeer.os.holder.RequestHolder import com.pushdeer.os.store.SettingStore import com.pushdeer.os.ui.compose.componment.MyAlertDialog @@ -37,12 +33,12 @@ import com.pushdeer.os.ui.compose.page.LogDogPage import com.pushdeer.os.ui.compose.page.LoginPage import com.pushdeer.os.ui.compose.page.main.MainPage import com.pushdeer.os.ui.theme.PushDeerTheme +import com.pushdeer.os.util.ActivityOpener import com.pushdeer.os.util.SystemUtil 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.wh.common.util.UiUtils import io.noties.markwon.Markwon import io.noties.markwon.image.coil.CoilImagesPlugin import io.noties.markwon.linkify.LinkifyPlugin @@ -62,18 +58,36 @@ class MainActivity : AppCompatActivity(), RequestHolder { 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 resource: Resources by lazy { this.resource } override val coilImageLoader: ImageLoader by lazy { ImageLoader.Builder(this) .apply { availableMemoryPercentage(0.5) bitmapPoolPercentage(0.5) - crossfade(true) + crossfade(750) + allowHardware(true) } .build() } - override val alert: RequestHolder.AlertRequest by lazy { object : RequestHolder.AlertRequest(resources) {} } + override val alert: RequestHolder.AlertRequest by lazy { + object : RequestHolder.AlertRequest(resources) {} + } + override val key: RequestHolder.KeyRequest by lazy { + object : RequestHolder.KeyRequest(this) {} + } + override val device: RequestHolder.DeviceRequest by lazy { + object : RequestHolder.DeviceRequest(this) {} + } + override val message: RequestHolder.MessageRequest by lazy { + object : RequestHolder.MessageRequest(this) {} + } + override val clip: RequestHolder.ClipRequest by lazy { + object : RequestHolder.ClipRequest( + getSystemService( + Context.CLIPBOARD_SERVICE + ) as ClipboardManager + ) {} + } override val markdown: Markwon by lazy { Markwon.builder(this) @@ -84,10 +98,9 @@ class MainActivity : AppCompatActivity(), RequestHolder { override lateinit var globalNavController: NavHostController override lateinit var coroutineScope: CoroutineScope - override lateinit var myActivity: ComponentActivity - override val clipboardManager by lazy { getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager } - - override lateinit var activityOpener: ActivityResultLauncher + override lateinit var myActivity: AppCompatActivity + override lateinit var qrScanActivityOpener: ActivityResultLauncher + override lateinit var requestPermissionOpener: ActivityResultLauncher> @ExperimentalAnimationApi @ExperimentalMaterialApi @@ -95,28 +108,23 @@ class MainActivity : AppCompatActivity(), RequestHolder { super.onCreate(savedInstanceState) myActivity = this - activityOpener = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - Toast.makeText( - this, - "${result.data?.getStringExtra(QrScanActivity.DataKey)}", - Toast.LENGTH_SHORT - ).show() - } + qrScanActivityOpener = ActivityOpener.forResult(this) + requestPermissionOpener = ActivityOpener.forPermission(this) - UiUtils.keepScreenOn(window) setContent { globalNavController = rememberNavController() coroutineScope = rememberCoroutineScope() val useDarkIcons = MaterialTheme.colors.isLight val systemUiController = rememberSystemUiController() when { - SystemUtil.isMiui() -> systemUiController.setStatusBarColor(Color.Transparent, useDarkIcons) + SystemUtil.isMiui() -> systemUiController.setStatusBarColor( + Color.Transparent, + useDarkIcons + ) else -> systemUiController.setSystemBarsColor(Color.Transparent, useDarkIcons) } WindowCompat.setDecorFitsSystemWindows(window, true) miPushRepository.regId.observe(this) { - // 这个操作放到注册成功后进行 settingStore.thisDeviceId = it } diff --git a/android/app/src/main/java/com/pushdeer/os/activity/QrScanActivity.kt b/android/app/src/main/java/com/pushdeer/os/activity/QrScanActivity.kt index 5aaaae1..fa265a3 100644 --- a/android/app/src/main/java/com/pushdeer/os/activity/QrScanActivity.kt +++ b/android/app/src/main/java/com/pushdeer/os/activity/QrScanActivity.kt @@ -1,66 +1,66 @@ -package com.pushdeer.os.activity - - -import android.content.Context -import android.content.Intent -import android.os.Bundle -import android.util.Log -import androidx.appcompat.app.AppCompatActivity -import cn.bingoogolapple.qrcode.core.QRCodeView -import com.pushdeer.os.R - - -class QrScanActivity : AppCompatActivity(), QRCodeView.Delegate { - - private val TAG = "WH_" + javaClass.simpleName - private lateinit var qrCode: QRCodeView - - companion object { - val RequestCode_get_scan_result = 436 - val DataKey = "qr_scan_result" - - fun forScanResultIntent(context: Context): Intent { - return Intent(context, QrScanActivity::class.java).apply { - putExtra(DataKey, 1) - } - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_qr_scan) - qrCode = findViewById(R.id.qrcode1) - qrCode.setDelegate(this) - } - - override fun onStart() { - super.onStart() - Log.d(TAG, "onStart") - qrCode.startSpotAndShowRect() - } - - override fun onStop() { - Log.d(TAG, "onStop") - qrCode.stopCamera() - super.onStop() - } - - override fun onDestroy() { - qrCode.onDestroy() - super.onDestroy() - } - - override fun onScanQRCodeSuccess(result: String?) { - Log.d(TAG, "onScanQRCodeSuccess: $result") - qrCode.stopCamera() - val intent = Intent() - intent.putExtra(DataKey, result) - setResult(RequestCode_get_scan_result, intent) - finish() - } - - override fun onScanQRCodeOpenCameraError() { - Log.e(TAG, "onScanQRCodeOpenCameraError") - qrCode.startSpotAndShowRect() - } -} \ No newline at end of file +//package com.pushdeer.os.activity +// +// +//import android.content.Context +//import android.content.Intent +//import android.os.Bundle +//import android.util.Log +//import androidx.appcompat.app.AppCompatActivity +//import cn.bingoogolapple.qrcode.core.QRCodeView +//import com.pushdeer.os.R +// +// +//class QrScanActivity : AppCompatActivity(), QRCodeView.Delegate { +// +// private val TAG = "WH_" + javaClass.simpleName +// private lateinit var qrCode: QRCodeView +// +// companion object { +// val RequestCode_get_scan_result = 436 +// val DataKey = "qr_scan_result" +// +// fun forScanResultIntent(context: Context): Intent { +// return Intent(context, QrScanActivity::class.java).apply { +// putExtra(DataKey, 1) +// } +// } +// } +// +// override fun onCreate(savedInstanceState: Bundle?) { +// super.onCreate(savedInstanceState) +// setContentView(R.layout.activity_qr_scan) +// qrCode = findViewById(R.id.qrcode1) +// qrCode.setDelegate(this) +// } +// +// override fun onStart() { +// super.onStart() +// Log.d(TAG, "onStart") +// qrCode.startSpotAndShowRect() +// } +// +// override fun onStop() { +// Log.d(TAG, "onStop") +// qrCode.stopCamera() +// super.onStop() +// } +// +// override fun onDestroy() { +// qrCode.onDestroy() +// super.onDestroy() +// } +// +// override fun onScanQRCodeSuccess(result: String?) { +// Log.d(TAG, "onScanQRCodeSuccess: $result") +// qrCode.stopCamera() +// val intent = Intent() +// intent.putExtra(DataKey, result) +// setResult(RequestCode_get_scan_result, intent) +// finish() +// } +// +// override fun onScanQRCodeOpenCameraError() { +// Log.e(TAG, "onScanQRCodeOpenCameraError") +// qrCode.startSpotAndShowRect() +// } +//} \ No newline at end of file diff --git a/android/app/src/main/java/com/pushdeer/os/holder/RequestHolder.kt b/android/app/src/main/java/com/pushdeer/os/holder/RequestHolder.kt index d6640a0..5fc747e 100644 --- a/android/app/src/main/java/com/pushdeer/os/holder/RequestHolder.kt +++ b/android/app/src/main/java/com/pushdeer/os/holder/RequestHolder.kt @@ -4,9 +4,9 @@ import android.content.ClipData import android.content.ClipboardManager import android.content.Intent import android.content.res.Resources -import androidx.activity.ComponentActivity import androidx.activity.result.ActivityResultLauncher import androidx.annotation.StringRes +import androidx.appcompat.app.AppCompatActivity import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState @@ -15,7 +15,6 @@ import androidx.fragment.app.FragmentManager import androidx.navigation.NavHostController import coil.ImageLoader import com.pushdeer.os.R -import com.pushdeer.os.activity.QrScanActivity import com.pushdeer.os.data.api.data.request.DeviceInfo import com.pushdeer.os.data.api.data.response.Message import com.pushdeer.os.data.api.data.response.PushKey @@ -24,6 +23,7 @@ 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.wh.common.activity.QrScanActivity import io.noties.markwon.Markwon import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay @@ -37,106 +37,22 @@ interface RequestHolder { val settingStore: SettingStore val globalNavController: NavHostController val coroutineScope: CoroutineScope - val myActivity: ComponentActivity + val myActivity: AppCompatActivity val markdown: Markwon - val activityOpener: ActivityResultLauncher + val qrScanActivityOpener: ActivityResultLauncher + val requestPermissionOpener:ActivityResultLauncher> val coilImageLoader: ImageLoader -// val resource:Resources - val fragmentManager: FragmentManager val alert: AlertRequest - - val clipboardManager: ClipboardManager - - fun copyPlainString(str: String) { - clipboardManager.setPrimaryClip(ClipData.newPlainText("pushdeer-pushkey", str)) - } + val key:KeyRequest + val device:DeviceRequest + val message:MessageRequest + val clip:ClipRequest fun startQrScanActivity() { - activityOpener.launch(QrScanActivity.forScanResultIntent(myActivity)) - } - - fun keyGen() { - coroutineScope.launch { - pushDeerViewModel.keyGen() - } - } - - fun keyRegen(keyId: String) { - coroutineScope.launch { - pushDeerViewModel.keyRegen(keyId) - } - } - - fun keyRemove(pushKey: PushKey) { - coroutineScope.launch { - pushDeerViewModel.keyList.remove(pushKey) - pushDeerViewModel.keyRemove(pushKey.id) - } - } - - fun keyRename(pushKey: PushKey){ - coroutineScope.launch { - pushDeerViewModel.keyRename(pushKey){ - coroutineScope.launch { - pushDeerViewModel.keyList() - } - } - } - } - - fun deviceReg(deviceInfo: DeviceInfo) { - coroutineScope.launch { - pushDeerViewModel.deviceReg(deviceInfo) - } - } - - fun deviceRemove(deviceInfo: DeviceInfo) { - coroutineScope.launch { - pushDeerViewModel.deviceList.remove(deviceInfo) - pushDeerViewModel.deviceRemove(deviceInfo.id) - } - } - - fun deviceRename(deviceInfo: DeviceInfo) { - coroutineScope.launch { - pushDeerViewModel.deviceRename(deviceInfo) { - coroutineScope.launch { - pushDeerViewModel.deviceList() - } - } - } - } - - fun messagePush(text: String, desp: String, type: String, pushkey: String) { - coroutineScope.launch { - pushDeerViewModel.messagePush(text, desp, type, pushkey) - } - } - - fun messagePushTest(text: String) { - if (pushDeerViewModel.keyList.isNotEmpty()) { - messagePush(text, "pushtest", "markdown", pushDeerViewModel.keyList[0].key) - coroutineScope.launch { - delay(1000) - pushDeerViewModel.messageList() - } - } else { - alert.alert( - R.string.global_alert_title_alert, - R.string.main_message_send_alert, - onOk = {}) - } - } - - fun messageRemove(message: Message, onDone: () -> Unit = {}) { - coroutineScope.launch { -// pushDeerViewModel.messageList.remove(message) - pushDeerViewModel.messageRemove(message.id) - onDone() - } + qrScanActivityOpener.launch(QrScanActivity.forScanResultIntent(myActivity)) } fun toggleMessageSender() { @@ -145,8 +61,20 @@ interface RequestHolder { } fun clearLogDog() { - coroutineScope.launch { - logDogViewModel.clear() + alert.alert(R.string.global_alert_title_confirm,"Clear?",onOk = { + coroutineScope.launch { + logDogViewModel.clear() + } + }) + } + + abstract class ClipRequest(private val clipboardManager: ClipboardManager) { + fun copyMessagePlainText(str: String) { + clipboardManager.setPrimaryClip(ClipData.newPlainText("pushdeer-copy-plain-text", str)) + } + + fun copyPushKey(str: String){ + clipboardManager.setPrimaryClip(ClipData.newPlainText("pushdeer-copy-pushkey", str)) } } @@ -188,9 +116,105 @@ interface RequestHolder { @StringRes title: Int, content: @Composable () -> Unit, onOk: () -> Unit, - onCancel: () -> Unit={} + onCancel: () -> Unit = {} + ) { + alert(resources.getString(title), content, onOk, onCancel) + } + + fun alert( + @StringRes title: Int, + content: String, + onOk: () -> Unit, + onCancel: () -> Unit = {} ) { alert(resources.getString(title), content, onOk, onCancel) } } + + abstract class KeyRequest(private val requestHolder: RequestHolder){ + fun gen() { + requestHolder.coroutineScope.launch { + requestHolder.pushDeerViewModel.keyGen() + } + } + + fun regen(keyId: String) { + requestHolder.coroutineScope.launch { + requestHolder.pushDeerViewModel.keyRegen(keyId) + } + } + + fun remove(pushKey: PushKey) { + requestHolder.coroutineScope.launch { + requestHolder.pushDeerViewModel.keyList.remove(pushKey) + requestHolder.pushDeerViewModel.keyRemove(pushKey.id) + } + } + + fun rename(pushKey: PushKey) { + requestHolder.coroutineScope.launch { + requestHolder.pushDeerViewModel.keyRename(pushKey) { + requestHolder.coroutineScope.launch { + requestHolder.pushDeerViewModel.keyList() + } + } + } + } + } + + abstract class DeviceRequest(private val requestHolder: RequestHolder){ + fun deviceReg(deviceInfo: DeviceInfo) { + requestHolder.coroutineScope.launch { + requestHolder.pushDeerViewModel.deviceReg(deviceInfo) + } + } + + fun deviceRemove(deviceInfo: DeviceInfo) { + requestHolder.coroutineScope.launch { + requestHolder.pushDeerViewModel.deviceList.remove(deviceInfo) + requestHolder.pushDeerViewModel.deviceRemove(deviceInfo.id) + } + } + + fun deviceRename(deviceInfo: DeviceInfo) { + requestHolder.coroutineScope.launch { + requestHolder.pushDeerViewModel.deviceRename(deviceInfo) { + requestHolder.coroutineScope.launch { + requestHolder.pushDeerViewModel.deviceList() + } + } + } + } + } + + abstract class MessageRequest(private val requestHolder: RequestHolder){ + fun messagePush(text: String, desp: String, type: String, pushkey: String) { + requestHolder.coroutineScope.launch { + requestHolder.pushDeerViewModel.messagePush(text, desp, type, pushkey) + } + } + + fun messagePushTest(text: String) { + if (requestHolder.pushDeerViewModel.keyList.isNotEmpty()) { + messagePush(text, "pushtest", "markdown", requestHolder.pushDeerViewModel.keyList[0].key) + requestHolder.coroutineScope.launch { + delay(1000) + requestHolder.pushDeerViewModel.messageList() + } + } else { + requestHolder.alert.alert( + R.string.global_alert_title_alert, + R.string.main_message_send_alert, + onOk = {}) + } + } + + fun messageRemove(message: Message, onDone: () -> Unit = {}) { + requestHolder.coroutineScope.launch { +// pushDeerViewModel.messageList.remove(message) + requestHolder.pushDeerViewModel.messageRemove(message.id) + onDone() + } + } + } } \ No newline at end of file diff --git a/android/app/src/main/java/com/pushdeer/os/ui/compose/componment/Item.kt b/android/app/src/main/java/com/pushdeer/os/ui/compose/componment/Item.kt index d0fa3dd..418ecf6 100644 --- a/android/app/src/main/java/com/pushdeer/os/ui/compose/componment/Item.kt +++ b/android/app/src/main/java/com/pushdeer/os/ui/compose/componment/Item.kt @@ -108,7 +108,7 @@ fun CardItemMultiLine( @ExperimentalMaterialApi @Composable -fun CardItemWithContent(onClick: () -> Unit = {}, content: @Composable () -> Unit = {}) { +fun CardItemWithContent(onClick: () -> Unit, content: @Composable () -> Unit = {}) { Card( onClick = onClick, shape = RoundedCornerShape(4.dp), @@ -123,6 +123,22 @@ fun CardItemWithContent(onClick: () -> Unit = {}, content: @Composable () -> Uni ) } +@ExperimentalMaterialApi +@Composable +fun CardItemWithContent(content: @Composable () -> Unit = {}) { + Card( + shape = RoundedCornerShape(4.dp), + modifier = Modifier + .border( + width = 1.dp, + color = MainBlue, + shape = RoundedCornerShape(4.dp) + ), + content = content, + elevation = 5.dp + ) +} + @Composable fun ListBottomBlankItem() { Row( diff --git a/android/app/src/main/java/com/pushdeer/os/ui/compose/componment/KeyItem.kt b/android/app/src/main/java/com/pushdeer/os/ui/compose/componment/KeyItem.kt index d1b2b51..517c78c 100644 --- a/android/app/src/main/java/com/pushdeer/os/ui/compose/componment/KeyItem.kt +++ b/android/app/src/main/java/com/pushdeer/os/ui/compose/componment/KeyItem.kt @@ -1,8 +1,10 @@ package com.pushdeer.os.ui.compose.componment +import android.widget.ImageView import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.Image import androidx.compose.foundation.border +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.* @@ -17,15 +19,17 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.compose.ui.viewinterop.AndroidView import com.pushdeer.os.R import com.pushdeer.os.data.api.data.response.PushKey import com.pushdeer.os.holder.RequestHolder import com.pushdeer.os.ui.theme.MBlue +import com.wh.common.util.QRCodeGenerator import com.wh.common.util.TimeUtils @ExperimentalMaterialApi @Composable -fun KeyItem(key: PushKey,requestHolder: RequestHolder) { +fun KeyItem(key: PushKey, requestHolder: RequestHolder) { var name by remember { mutableStateOf(key.name) } @@ -52,7 +56,7 @@ fun KeyItem(key: PushKey,requestHolder: RequestHolder) { }, onOk = { key.name = name - requestHolder.keyRename(key) + requestHolder.key.rename(key) } ) }) { @@ -118,24 +122,36 @@ fun KeyItem(key: PushKey,requestHolder: RequestHolder) { color = Color.Gray, shape = RoundedCornerShape(4.dp) ) + .clickable { + requestHolder.alert.alert("QrCode For ${key.name}", { + Box( + modifier = Modifier.width(400.dp) + ) { + AndroidView( + factory = { + ImageView(it).apply { + this.setImageBitmap( + QRCodeGenerator( + key.key, + 400.dp.value.toInt(), + 400.dp.value.toInt() + ).qrCode + ) + } + }, + modifier = Modifier.align(alignment = Alignment.Center) + ) + } + }, onOk = {}) + } .padding(horizontal = 14.dp, vertical = 8.dp) ) -// Canvas(modifier = Modifier -// .fillMaxWidth() -// .height(16.dp), onDraw = { -// val linePath = Path() -// val linePaint = Paint() -// linePaint.pathEffect = PathEffect.dashPathEffect(FloatArray(10),10F) -// drawIntoCanvas { -// it.drawPath(linePath, linePaint) -// } -// }) Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween ) { OutlinedButton( - onClick = { requestHolder.keyRegen(key.id) }, + onClick = { requestHolder.key.regen(key.id) }, colors = ButtonDefaults.outlinedButtonColors( backgroundColor = Color.Transparent, contentColor = MaterialTheme.colors.MBlue @@ -147,7 +163,7 @@ fun KeyItem(key: PushKey,requestHolder: RequestHolder) { } Button( onClick = { - requestHolder.copyPlainString(key.key) + requestHolder.clip.copyPushKey(key.key) }, colors = ButtonDefaults.buttonColors( backgroundColor = MaterialTheme.colors.MBlue, diff --git a/android/app/src/main/java/com/pushdeer/os/ui/compose/componment/MessageItem.kt b/android/app/src/main/java/com/pushdeer/os/ui/compose/componment/MessageItem.kt index d10a873..c8ca6a2 100644 --- a/android/app/src/main/java/com/pushdeer/os/ui/compose/componment/MessageItem.kt +++ b/android/app/src/main/java/com/pushdeer/os/ui/compose/componment/MessageItem.kt @@ -1,7 +1,9 @@ package com.pushdeer.os.ui.compose.componment +import android.widget.ImageView import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Card @@ -12,12 +14,12 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.viewinterop.AndroidView +import coil.load import com.pushdeer.os.R import com.pushdeer.os.data.database.entity.MessageEntity import com.pushdeer.os.holder.RequestHolder @@ -27,11 +29,14 @@ import com.pushdeer.os.values.ConstValues @ExperimentalMaterialApi @Composable -fun PlainTextMessageItem(message: MessageEntity) { +fun PlainTextMessageItem(message: MessageEntity,requestHolder: RequestHolder) { Column( modifier = Modifier .fillMaxWidth() .clip(RoundedCornerShape(4.dp)) + .clickable { + requestHolder.clip.copyMessagePlainText(message.text) + } .background(color = MaterialTheme.colors.surface) ) { @@ -47,7 +52,7 @@ fun PlainTextMessageItem(message: MessageEntity) { modifier = Modifier.size(40.dp) ) Text( - text = "${message.text}·${ + text = "${message.pushkey_name}·${ CurrentTimeUtil.resolveUTCTimeAndNow( message.created_at, System.currentTimeMillis() @@ -56,9 +61,9 @@ fun PlainTextMessageItem(message: MessageEntity) { ) } - CardItemWithContent() { + CardItemWithContent { Text( - text = message.desp, + text = message.text, overflow = TextOverflow.Visible, lineHeight = 24.sp, modifier = Modifier @@ -71,12 +76,15 @@ fun PlainTextMessageItem(message: MessageEntity) { @ExperimentalMaterialApi @Composable -fun ImageMessageItem(message: MessageEntity) { +fun ImageMessageItem(message: MessageEntity, requestHolder: RequestHolder) { Column( modifier = Modifier .fillMaxWidth() .clip(RoundedCornerShape(4.dp)) - .background (color = MaterialTheme.colors.surface) + .clickable { + requestHolder.clip.copyMessagePlainText(message.text) + } + .background(color = MaterialTheme.colors.surface) ) { Row( @@ -92,7 +100,7 @@ fun ImageMessageItem(message: MessageEntity) { modifier = Modifier.size(40.dp) ) Text( - text = "${message.text}·${ + text = "${message.pushkey_name}·${ CurrentTimeUtil.resolveUTCTimeAndNow( message.created_at, System.currentTimeMillis() @@ -100,12 +108,13 @@ fun ImageMessageItem(message: MessageEntity) { }" ) } - Card(modifier = Modifier.fillMaxWidth(), onClick = {}) { - Image( - painter = painterResource(id = R.drawable.logo_com_x2), - contentDescription = "", - contentScale = ContentScale.FillWidth - ) + Card(modifier = Modifier.fillMaxWidth()) { + AndroidView(factory = { + ImageView(it).apply { + scaleType = ImageView.ScaleType.FIT_CENTER + load(message.text, requestHolder.coilImageLoader) + } + }, modifier = Modifier.fillMaxWidth()) } } } @@ -117,6 +126,9 @@ fun MarkdownMessageItem(message: MessageEntity, requestHolder: RequestHolder) { modifier = Modifier .fillMaxWidth() .clip(RoundedCornerShape(4.dp)) + .clickable { + requestHolder.clip.copyMessagePlainText(message.text) + } .background(color = MaterialTheme.colors.surface) ) { @@ -163,6 +175,13 @@ fun MarkdownMessageItem(message: MessageEntity, requestHolder: RequestHolder) { }, modifier = Modifier .fillMaxWidth() +// .pointerInput(Unit) { +// this.detectTapGestures( +// onLongPress = { +// Log.d("WH_", "MarkdownMessageItem: ") +// } +// ) +// } .padding(16.dp) ) } diff --git a/android/app/src/main/java/com/pushdeer/os/ui/compose/page/LoginPage.kt b/android/app/src/main/java/com/pushdeer/os/ui/compose/page/LoginPage.kt index c636595..cfb79d6 100644 --- a/android/app/src/main/java/com/pushdeer/os/ui/compose/page/LoginPage.kt +++ b/android/app/src/main/java/com/pushdeer/os/ui/compose/page/LoginPage.kt @@ -59,7 +59,7 @@ fun LoginPage(requestHolder: RequestHolder) { } } is SignInWithAppleResult.Failure -> { - requestHolder.alert.alert("Warning", { + requestHolder.alert.alert("Warning Apple Id Login Failed", { result.error.message }, onOk = {}) Log.d( diff --git a/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/DeviceListPage.kt b/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/DeviceListPage.kt index 933c3d7..1b320ad 100644 --- a/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/DeviceListPage.kt +++ b/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/DeviceListPage.kt @@ -1,6 +1,5 @@ package com.pushdeer.os.ui.compose.page.main -import android.util.Log import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize @@ -41,7 +40,7 @@ fun DeviceListPage(requestHolder: RequestHolder) { onOk = {}) // device regid got failed } else { - requestHolder.deviceReg( + requestHolder.device.deviceReg( deviceInfo = DeviceInfo().apply { name = SystemUtil.getDeviceModel() device_id = requestHolder.settingStore.thisDeviceId @@ -72,7 +71,7 @@ fun DeviceListPage(requestHolder: RequestHolder) { mutableStateOf(deviceInfo.name) } SwipeToDismissItem( - onAction = { requestHolder.deviceRemove(deviceInfo) } + onAction = { requestHolder.device.deviceRemove(deviceInfo) } ) { CardItemSingleLineWithIcon( onClick = { @@ -99,7 +98,7 @@ fun DeviceListPage(requestHolder: RequestHolder) { }, onOk = { deviceInfo.name = name - requestHolder.deviceRename(deviceInfo) + requestHolder.device.deviceRename(deviceInfo) } ) }, @@ -110,7 +109,7 @@ fun DeviceListPage(requestHolder: RequestHolder) { ) }) " else deviceInfo.name ) - Log.d("WH_", "DeviceListPage: $deviceInfo") +// Log.d("WH_", "DeviceListPage: $deviceInfo") } } item { diff --git a/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/KeyListPage.kt b/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/KeyListPage.kt index f1b97c3..d531aca 100644 --- a/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/KeyListPage.kt +++ b/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/KeyListPage.kt @@ -25,7 +25,7 @@ import com.pushdeer.os.ui.navigation.Page fun KeyListPage(requestHolder: RequestHolder) { MainPageFrame( titleStringId = Page.Keys.labelStringId, - onSideIconClick = { requestHolder.keyGen() } + onSideIconClick = { requestHolder.key.gen() } ) { if(requestHolder.pushDeerViewModel.keyList.isEmpty()){ Column( @@ -42,7 +42,7 @@ fun KeyListPage(requestHolder: RequestHolder) { items( requestHolder.pushDeerViewModel.keyList, key = { item: PushKey -> item.id }) { pushKey: PushKey -> - SwipeToDismissItem(onAction = { requestHolder.keyRemove(pushKey) } + SwipeToDismissItem(onAction = { requestHolder.key.remove(pushKey) } ) { KeyItem(key = pushKey, requestHolder = requestHolder) } diff --git a/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/MainPage.kt b/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/MainPage.kt index 543f5b0..287fdfa 100644 --- a/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/MainPage.kt +++ b/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/MainPage.kt @@ -43,7 +43,7 @@ fun MainPage(requestHolder: RequestHolder) { } var titleStringId by remember { - mutableStateOf(Page.Devices.labelStringId) + mutableStateOf(Page.Messages.labelStringId) } val navController = rememberNavController() Scaffold( @@ -98,7 +98,7 @@ fun MainPage(requestHolder: RequestHolder) { ) NavHost( navController = navController, - startDestination = Page.Devices.route, + startDestination = Page.Messages.route, ) { composable(Page.Devices.route) { DeviceListPage(requestHolder = requestHolder) diff --git a/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/MessageListPage.kt b/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/MessageListPage.kt index 4265f5f..6c22481 100644 --- a/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/MessageListPage.kt +++ b/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/MessageListPage.kt @@ -73,7 +73,7 @@ fun MessageListPage(requestHolder: RequestHolder) { ) Button( onClick = { - requestHolder.messagePushTest(s) + requestHolder.message.messagePushTest(s) }, colors = ButtonDefaults.buttonColors( backgroundColor = MaterialTheme.colors.MBlue, @@ -90,7 +90,7 @@ fun MessageListPage(requestHolder: RequestHolder) { key = { item: MessageEntity -> item.id }) { message: MessageEntity -> SwipeToDismissItem( onAction = { - requestHolder.messageRemove(message.toMessage(), onDone = { + requestHolder.message.messageRemove(message.toMessage(), onDone = { requestHolder.messageViewModel.delete(message) }) }, @@ -98,8 +98,8 @@ fun MessageListPage(requestHolder: RequestHolder) { ) { when (message.type) { "markdown" -> MarkdownMessageItem(message, requestHolder) - "text" -> PlainTextMessageItem(message) - "image" -> ImageMessageItem(message) + "text" -> PlainTextMessageItem(message, requestHolder) + "image" -> ImageMessageItem(message, requestHolder) } } } diff --git a/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/SettingPage.kt b/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/SettingPage.kt index 1294670..881cefb 100644 --- a/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/SettingPage.kt +++ b/android/app/src/main/java/com/pushdeer/os/ui/compose/page/main/SettingPage.kt @@ -26,10 +26,18 @@ fun SettingPage(requestHolder: RequestHolder) { text = "${stringResource(id = R.string.main_setting_user_hi)} ${requestHolder.pushDeerViewModel.userInfo.name} !", buttonString = stringResource(id = R.string.main_setting_user_logout) ) { + requestHolder.pushDeerViewModel.deviceList.filter { it.device_id == requestHolder.settingStore.thisDeviceId }.forEach { + requestHolder.device.deviceRemove(it) + } requestHolder.settingStore.userToken = "" - // logout 操作: - // 从服务器删除本设备 - // 删除保存的 token + requestHolder.globalNavController.navigate("login") { + requestHolder.globalNavController.popBackStack() + } + requestHolder.alert.alert( + "提示", + "由于厂商推送设备服务限制,暂时不支持更换为自建 PushDeer 服务器,但仅更换登陆账号并不会影响您的使用", + {} + ) } } // item { diff --git a/android/app/src/main/java/com/pushdeer/os/util/ActivityOpener.kt b/android/app/src/main/java/com/pushdeer/os/util/ActivityOpener.kt new file mode 100644 index 0000000..be455b1 --- /dev/null +++ b/android/app/src/main/java/com/pushdeer/os/util/ActivityOpener.kt @@ -0,0 +1,30 @@ +package com.pushdeer.os.util + +import android.content.Intent +import android.util.Log +import android.widget.Toast +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import com.wh.common.activity.QrScanActivity + +object ActivityOpener { + + fun forResult(activity: AppCompatActivity): ActivityResultLauncher { + return activity.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + Toast.makeText( + activity, + "${result.data?.getStringExtra(QrScanActivity.DataKey)}", + Toast.LENGTH_SHORT + ).show() + } + } + + fun forPermission(activity: AppCompatActivity): ActivityResultLauncher> { + return activity.registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { + it.entries.forEach { + Log.d("WH_", "forPermission:${it.key} ${it.value} ") + } + } + } +} \ No newline at end of file diff --git a/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/ic_launcher_background.xml b/android/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/android/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/android/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..ab10448 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index eca70cf..7353dbd 100644 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index eca70cf..7353dbd 100644 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ddfeedb8c8a8c0128dc79439b97af6a5bde577f9 GIT binary patch literal 2594 zcmV+-3f=XIP)qH)PYjWJ_1E~AEIB5n!0EbgKL z3L>k@D!V8M0tyXE#3%?VOM^7c4(gfn9f4`?h0xs+`*v6VRbSoid;j}4=j;ER^PO|) zS6*=r=Wq_^a1Q$(L^O^u-oY?VX{S|#7kX8B&QZn-+h)1|zn;z5&G2P-Gkoj}_?z*! z!-mfE!aEQuD;IBPAV@iUubHxS)+gQxc2sT4@V`4(bwDC zOBEFr{;<^=f?hQk42Q6oBN7Cgcz~c2u+%cKX~|;W1cVl zdrKHSs%ufrA4AxNpjKliEnazyR(&2q7m`b8!Lma%Z}9=jy8Jz_qn>}iwuxLm2&Av~ z#8FsOKE3sh4{dZkOAU>!s<}X4-xGoIycMtwK|p9kp6sGGU3_TSn&VWWt5MAvKv#D! zlXH%y&h@5gj4!rFP@{f$a^Q|J7mDa;@FnVc@fc-0f_}KyKns^2qUrDMqnzBz!SfxR z-PGBsHY`4+gx;9pPM>WKqo(FIIR`ST?(3^Zqyf>UNr1--@YxB06`j#=HRbu5JK z2m+AJW-RcdO>7Ke4-5{C$fX_MUEuc}L*@pD=h8G6Z>p$#Gp zzwj>2SrkAkK0QGXA3aumo)xeyK`<~l{EE1mhhGYn-FhJ3K8!X^;XR!BzT6c{^OhXo zdwPegfdGzxy~#C_7JYPt7A!qTckVW*KFdnjmLLG`^sP@K{e70FeEY~&wGWzy%xTmc zY00W%wB0RMbw6aoUhhQu>vVUycfj40K=AKnW0mJef$a$b;7*7wFmm{c+eqobRJVgtM0eo6aqS>?JwRC#@aL0ohs;CgrW z(ClX>v_lZ$$1cwV$wUy5h1aWS^Vd-{Rou#5$`bFui-U+hUqltRAB`Ay#t7OW2)M-t zL(?Fm)$zC9*49Olao1=*$CgIky$l2qSAiL(o z>B~drbhC=~*`G?W@x@Y>w6%9p$eCOT>W~2+uM3u7-2C`?tu_YG20;j*fk!eWC?5>U zl;DeV?H&JbkjXqI=sVve=>(W&B8LnBc;3U ziW@cPq87tF%JV2CARNE-NfMIQd~r(NE9Y4V+Y^+YbxTq@0yBi7^17u!Rsa6Kp6efD zo4Pw`A#6)fAqQS$r4?&WQZ>pL1~%gvRi<8i}y?F zzA;R*9)T9cCDQqkli5;x>6?tyV(1VFP+g;!BDS==R%)}9j4~k;y(Gk-LnpGVQO-)d ze1hVWOK34GV*rh<%u6Fz;3zGS!qFo_D+D`ZB@0Hl&pS*mG?N77nVwRgK~N%_L3u+x zE7!9EFP|VwfPjql>XoZ^DBy60G{ZmuYBMiZ)5vBC7fYox>3blJ)@=!wOy=pIA}tVP zH|3fZLfZu4;Uct6MP;3+>NOirN#UuShYq6a&RB6nbR%($K3^!Wac#IKC1ygq1VQtx zTL0Xg;4T1M%6(t*ka>tzuDfDcX;+JQ3<|kKDd}Z$?S}5Y^of3~kv0mnOAw4gTsae6 zAn$YXD#g7LE|v_=ftd6OOclkAIxe^14!c?^1sur`vM{HK$-OXBwOY6BN+v}4kaq0jo@eSJ}hDZY=yXWb%S810=JUz7M zj^Y3=U#*nggB^on6#XF>4b5cQc!wLtC0v(S19t)`&_SPWJWT~$yrRIpR(y}HUc1ZL z@|M(k&{nk%&3+`LO@iPK+jhi=!bTyQo^@07(pS6VRC7TJdPjKjn!&0ZnGbasYPRie zF|rfA*$o5P?Qjkfz=Fp@+9U|ErR?SdA!v_RA|<8iq(_a0y>jjVs%x4gfFt#zZ35zo zN~$I0V?DSTq(E|-MgMlAO@aWgfQvMP3A)OzvVPkcX_7%WD(9I3wO3GRjufm7`c|r` zZKiM7J)wufqw?kHh$UsqQ>_w&k^)M3>yBs&J(DNF*?WJgYTj@__JVNS#`orNR>Kk9 zg5918s>j)8K$`?5vyMSMg?eoole2uy3F#s#=lvMah1{?$f)=hgEJ0iOwAM^$lOQzj zQDXs1KMA7mSxGDBm;(bBwug^ri5yT~GZWe*2&o$FRNzJX%&6!cveeKBoCJ*mCqbiN zObBxL-)b;H!LZdTg7kX5!|ov11cJ)S%BZcPNyqvX=$OJo*u%&_6)d{!C;`m!b07wS+m}Rjc#sk z=DU~am^yXp&-w6s#$WvW{9KcglESjHvtu$cGNQ7wvZ76qnVC7{wer2WbAF07`;Srh z+hGH2flaV&^5n_C7;3d;W89=klYYs^-!lHl_!HyLb`ID8TYfWf;>2I^(K6Q>ZZJu& z@osvZj}v&&U)wWaL%%KN2W1Ne*meXshjTcGbJ)fBAHf#`0h0;GO#lD@07*qoM6N<$ Eg1dzJK>z>% literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index c209e78ecd372343283f4157dcfd918ec5165bb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa50499a51b48a8681d83be4fe7c7cb1fb5507a GIT binary patch literal 4730 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 IM6N<$f=tOF9smFU literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp deleted file mode 100644 index b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2898 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 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e36786db350a32d9723e70f09ad20b7f7aed22e1 GIT binary patch literal 1642 zcmV-w29^1VP)r+%^7`L=0bEYr$rI~7`W@?(OKfv)r&8SUjYN>ch@Dh2?%rwoM#xfhs3nI#8L@pu% zDpy?;L0NDSP(THA#YMS^>$(fO3n;J)`0IIIcDLPg7NutPEKNQ$zd2{$%X6OJd!Ebt z?in%SnG9nAFp@CJ&loAS>#0JMo@Yqg{U!g%9`}KCKbG(&;SE25pFP%_ZC=GWfUYkS zA|F3~Z0PUrZ}TS{Hbk;b?lyWAXJ=nuUo=ewO&m6`TCFi;+H->vfFoEsIyzn@0!E%h zR~udX>FO6ao^9jBB)d!(E?juc-Bu5w#!-CLYPIk5_V!vF1Xzb`HIxL~;2>bl%F24* z-Bu5AHfl7QcZq=6Ia#VuX}A+ePEH=@ZmWk#2n@?NkeHbGfxE39^1mX`+uMhhduHmF z_jv=4w-co8LxE2SbaZwjU~x1Wn_I>2h9(n?rVfuW*7iqeGk3BMoHRv3X!_+z9m_Gjiw6%JVK7KnXX=N~59?JAe;WGk^kkHdu`9qR0 zh+U|x{0?k3yXey!EckfpE?n2Ph~GDF>5-CtNsRqtcMi7vo{5K#dSp7K@F@X~g|$DW zV$Xp*>#(e_)mA^9G+1U^KV1Ve!g% zd^UR@u2wg>+G7qEAuQ^g$5T{4|cC_;c&kApe>XtAgZd_QSM zsB4usZB57Nyy`($`AJZO0Q+t-`8FHP1&&i?L6H_!HFr^Ytx?29Ai2g znU2Ar2!Ybew-K-?8reBlk*WH-BC~6-|J!W6uu##8OVVIgP!v|JKPt8sQa#?_a{{++ z8-!5<)mYx|tP2DB`qBBYTNJV{7eqpT-y$0?g-;1^wdED&3hQ)>@+%D@uS>_egM)YR zs(2CD(mpACLLm2ijR@4aOAaDD`aHV2ZLU7m*(#BdGF6p=NNwGHR9tNkF~Re=4sd?SgKv;+N~3LDpjz@>-q?T^WnVpFk}5V$NBbBK6! zeBl$*rxQLQ@FdhXnuL$*4OUT|k7ZmIS&3atQ>vrjtro@?UA%?ZBN}lqlIn1Wq6BC> z8K>BICxU^2BRdzYfUea+4MG5f1o?VEy)2iHSvVM0MjP2sU!)F2KzZ>45D1lBo zV)9Y(0U2lW;to=Db=kyUFVc2*C`!N=__qZ9yMOMMl$5+TT;D)aQqqU+wt5I09}Uve z(_gpS?X5hiZ5dZ#o(Cr4FL6HGX0xH9 zq9TKA8;!v}F|jy0M^2b9VO)86dA7-9GFvQ`c4BYktCDa&v$eI=Tv}Rsa{T!5>^}V6 zdT;_Pjsc?yZ%v*&d17#I@U)B%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp deleted file mode 100644 index 62b611da081676d42f6c3f78a2c91e7bcedddedb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1772 zcmVQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c189529a7dc33750bb0650348991b10fd2fcd187 GIT binary patch literal 3677 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 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..df92f861c3f163e0e823acfa7d3769672ccb8e1c GIT binary patch literal 6862 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 IM6N<$g0a#^W&i*H literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index 1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3918 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 XHDdpY7}z$;00000NkvXXu0mjfjPtrC literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp deleted file mode 100644 index 9287f5083623b375139afb391af71cc533a7dd37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5914 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp 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 i6`lW|$nAyh2T2Z}@47Hi0dh1S4^Waf$8; literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp deleted file mode 100644 index aa7d6427e6fa1074b79ccd52ef67ac15c5637e85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3844 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp deleted file mode 100644 index 9126ae37cbc3587421d6889eadd1d91fbf1994d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7778 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..c5d5899 --- /dev/null +++ b/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/android/common/build.gradle b/android/common/build.gradle index ea139a6..c24cc18 100644 --- a/android/common/build.gradle +++ b/android/common/build.gradle @@ -48,4 +48,9 @@ dependencies { implementation("com.squareup.okhttp3:okhttp:4.9.2") implementation 'com.google.code.gson:gson:2.8.9' + + // qr + implementation 'com.google.zxing:core:3.2.1' + implementation 'cn.bingoogolapple:bga-qrcodecore:1.1.7@aar' + implementation 'cn.bingoogolapple:bga-zxing:1.1.7@aar' } \ No newline at end of file diff --git a/android/common/src/main/AndroidManifest.xml b/android/common/src/main/AndroidManifest.xml index ff551d0..ad933ed 100644 --- a/android/common/src/main/AndroidManifest.xml +++ b/android/common/src/main/AndroidManifest.xml @@ -5,4 +5,6 @@ + + \ No newline at end of file diff --git a/android/common/src/main/java/com/wh/common/activity/QrScanActivity.kt b/android/common/src/main/java/com/wh/common/activity/QrScanActivity.kt new file mode 100644 index 0000000..b17425a --- /dev/null +++ b/android/common/src/main/java/com/wh/common/activity/QrScanActivity.kt @@ -0,0 +1,65 @@ +package com.wh.common.activity + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import cn.bingoogolapple.qrcode.core.QRCodeView +import com.wh.common.R + + +class QrScanActivity : AppCompatActivity(), QRCodeView.Delegate { + + private val TAG = "WH_" + javaClass.simpleName + private lateinit var qrCode: QRCodeView + + companion object { + val RequestCode_get_scan_result = 436 + val DataKey = "qr_scan_result" + + fun forScanResultIntent(context: Context): Intent { + return Intent(context, QrScanActivity::class.java).apply { + putExtra(DataKey, 1) + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_qr_scan) + qrCode = findViewById(R.id.qrcode1) + qrCode.setDelegate(this) + } + + override fun onStart() { + super.onStart() + Log.d(TAG, "onStart") + qrCode.startSpotAndShowRect() + } + + override fun onStop() { + Log.d(TAG, "onStop") + qrCode.stopCamera() + super.onStop() + } + + override fun onDestroy() { + qrCode.onDestroy() + super.onDestroy() + } + + override fun onScanQRCodeSuccess(result: String?) { + Log.d(TAG, "onScanQRCodeSuccess: $result") + qrCode.stopCamera() + val intent = Intent() + intent.putExtra(DataKey, result) + setResult(RequestCode_get_scan_result, intent) + finish() + } + + override fun onScanQRCodeOpenCameraError() { + Log.e(TAG, "onScanQRCodeOpenCameraError") + qrCode.startSpotAndShowRect() + } +} \ No newline at end of file diff --git a/android/common/src/main/java/com/wh/common/util/ActivityOpener.kt b/android/common/src/main/java/com/wh/common/util/ActivityOpener.kt new file mode 100644 index 0000000..96fcbc3 --- /dev/null +++ b/android/common/src/main/java/com/wh/common/util/ActivityOpener.kt @@ -0,0 +1,38 @@ +package com.wh.common.util + +import android.content.Intent +import android.util.Log +import android.widget.Toast +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import com.wh.common.activity.QrScanActivity + +object ActivityOpener { + + fun forQrScanResult( + activity: AppCompatActivity, + onReturn: (String) -> Unit = {} + ): ActivityResultLauncher { + return activity.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + result.data?.getStringExtra(QrScanActivity.DataKey)?.let { + onReturn(it) + Toast.makeText(activity, it, Toast.LENGTH_SHORT).show() + } + } + } + + fun forPermission( + activity: AppCompatActivity, + onReturn: () -> Unit = {} + ): ActivityResultLauncher> { + return activity.registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { + it.entries.forEach { + Log.d("WH_", "forPermission:${it.key} ${it.value} ") + } + if (it.entries.all { it.value == true }){ + onReturn() + } + } + } +} \ No newline at end of file diff --git a/android/common/src/main/java/com/wh/common/util/QRCodeGenerator.java b/android/common/src/main/java/com/wh/common/util/QRCodeGenerator.java new file mode 100644 index 0000000..b8c0da1 --- /dev/null +++ b/android/common/src/main/java/com/wh/common/util/QRCodeGenerator.java @@ -0,0 +1,54 @@ +package com.wh.common.util; + + +import static android.graphics.Color.BLACK; +import static android.graphics.Color.WHITE; + +import android.graphics.Bitmap; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.WriterException; +import com.google.zxing.common.BitMatrix; + +import java.util.HashMap; +import java.util.Map; + +public class QRCodeGenerator { + private final Map hints; + private Bitmap bitmap = null; + private final String str; + private final int WIDTH; + private final int HEIGHT; + + public QRCodeGenerator(String str, int WIDTH, int HEIGHT){ + this.str = (str.length()>300)?"str is too long":str; + this.WIDTH=WIDTH; + this.HEIGHT=HEIGHT; + this.hints = new HashMap<>(); + this.hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + } + + public Bitmap getQRCode() { + try { + BitMatrix Result = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hints);//通过字符串创建二维矩阵 + int width = Result.getWidth(); + int height = Result.getHeight(); + + int[] pixels = new int[width * height]; + for (int y = 0; y < height; y++) { + int offset = y * width; + for (int x = 0; x < width; x++) { + pixels[offset + x] = Result.get(x, y) ? BLACK : WHITE;//根据二维矩阵数据创建数组 + } + } + bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);//创建位图 + bitmap.setPixels(pixels, 0, width, 0, 0, width, height);//将数组加载到位图中 + return bitmap; + } catch (WriterException e) { + e.printStackTrace(); + } + return bitmap; + } +} \ No newline at end of file diff --git a/android/common/src/main/res/layout/activity_qr_scan.xml b/android/common/src/main/res/layout/activity_qr_scan.xml new file mode 100644 index 0000000..9594e0c --- /dev/null +++ b/android/common/src/main/res/layout/activity_qr_scan.xml @@ -0,0 +1,46 @@ + + + + + + \ No newline at end of file diff --git a/android/compose/src/main/AndroidManifest.xml b/android/compose/src/main/AndroidManifest.xml index e9afbff..7b6c631 100644 --- a/android/compose/src/main/AndroidManifest.xml +++ b/android/compose/src/main/AndroidManifest.xml @@ -2,4 +2,5 @@ + \ No newline at end of file diff --git a/android/pushdeercommon/.gitignore b/android/pushdeercommon/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/android/pushdeercommon/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/android/pushdeercommon/build.gradle b/android/pushdeercommon/build.gradle new file mode 100644 index 0000000..cf2998f --- /dev/null +++ b/android/pushdeercommon/build.gradle @@ -0,0 +1,47 @@ +plugins { + id 'com.android.library' + id 'kotlin-android' +} + +android { + compileSdk 32 + + defaultConfig { + minSdk 21 + targetSdk 32 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'com.google.android.material:material:1.5.0' + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'com.squareup.retrofit2:converter-scalars:2.0.0' + implementation 'com.google.code.gson:gson:2.8.9' + implementation 'com.squareup.retrofit2:converter-gson:2.3.0' +} \ No newline at end of file diff --git a/android/pushdeercommon/consumer-rules.pro b/android/pushdeercommon/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/android/pushdeercommon/proguard-rules.pro b/android/pushdeercommon/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/android/pushdeercommon/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/android/pushdeercommon/src/androidTest/java/com/pushdeer/common/ExampleInstrumentedTest.kt b/android/pushdeercommon/src/androidTest/java/com/pushdeer/common/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..595afea --- /dev/null +++ b/android/pushdeercommon/src/androidTest/java/com/pushdeer/common/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.pushdeer.common + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.pushdeer.common.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/android/pushdeercommon/src/main/AndroidManifest.xml b/android/pushdeercommon/src/main/AndroidManifest.xml new file mode 100644 index 0000000..8a0aaf8 --- /dev/null +++ b/android/pushdeercommon/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/android/pushdeercommon/src/main/java/com/pushdeer/common/api/PushDeerApi.kt b/android/pushdeercommon/src/main/java/com/pushdeer/common/api/PushDeerApi.kt new file mode 100644 index 0000000..b867f84 --- /dev/null +++ b/android/pushdeercommon/src/main/java/com/pushdeer/common/api/PushDeerApi.kt @@ -0,0 +1,93 @@ +package com.pushdeer.common.api + +import com.pushdeer.common.api.data.response.* +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.converter.scalars.ScalarsConverterFactory +import retrofit2.http.Field +import retrofit2.http.FieldMap +import retrofit2.http.FormUrlEncoded +import retrofit2.http.POST + +interface PushDeerApi { + companion object { + private const val baseUrl = "https://api2.pushdeer.com" + + fun create(): PushDeerApi { + return Retrofit.Builder() + .baseUrl(baseUrl) + .addConverterFactory(ScalarsConverterFactory.create()) + .addConverterFactory(GsonConverterFactory.create()) + .build() + .create(PushDeerApi::class.java) + } + } + + @FormUrlEncoded + @POST("/login/idtoken") + suspend fun loginIdToken(@Field("idToken") idToken: String): ReturnData + +// @GET("/login/fake") +// suspend fun fakeLogin(): ReturnData + + @FormUrlEncoded + @POST("/user/info") + suspend fun userInfo(@Field("token") token: String): ReturnData + + @FormUrlEncoded + @POST("/device/reg") + suspend fun deviceReg(@FieldMap data: Map): ReturnData + + @FormUrlEncoded + @POST("/device/list") + suspend fun deviceList(@Field("token") token: String): ReturnData + + @FormUrlEncoded + @POST("/device/remove") + suspend fun deviceRemove(@Field("token") token: String, @Field("id") id: Int): String + + @FormUrlEncoded + @POST("/device/rename") + suspend fun deviceRename( + @Field("token") token: String, + @Field("id") id: Int, + @Field("name") newName: String + ): String + + @FormUrlEncoded + @POST("/key/gen") + suspend fun keyGen(@Field("token") token: String): ReturnData + + @FormUrlEncoded + @POST("/key/regen") + suspend fun keyRegen(@FieldMap data: Map): String + + @FormUrlEncoded + @POST("/key/list") + suspend fun keyList(@Field("token") token: String): ReturnData + + @FormUrlEncoded + @POST("/key/remove") + suspend fun keyRemove(@FieldMap data: Map): String + + @FormUrlEncoded + @POST("/key/rename") + suspend fun keyRename( + @Field("token") token: String, + @Field("id") id: String, + @Field("name") newName: String + ): String + + // pushkey text desp type:text/image/markdown + @FormUrlEncoded + @POST("/message/push") + suspend fun messagePush(@FieldMap data: Map): String + + @FormUrlEncoded + @POST("/message/list") + suspend fun messageList(@Field("token") token: String): ReturnData + + @FormUrlEncoded + @POST("/message/remove") + suspend fun messageRemove(@Field("token") token: String, @Field("id") id: Int): String +} \ No newline at end of file diff --git a/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/request/DeviceInfo.kt b/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/request/DeviceInfo.kt new file mode 100644 index 0000000..23aab2b --- /dev/null +++ b/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/request/DeviceInfo.kt @@ -0,0 +1,24 @@ +package com.pushdeer.common.api.data.request + +class DeviceInfo { + var id:Int = 0 + var uid:String = "" + var name:String = "" + var type:String = "" + var device_id: String = "" + var is_clip: Int = 0 + + fun toRequestMap(token:String): Map { + return mapOf( + "token" to token, + "name" to name, + "device_id" to device_id, + "is_clip" to is_clip.toString(), + "type" to "android" + ) + } + + override fun toString(): String { + return "id:$id uid:$uid name:$name type:$type device_id:$device_id is_clip:$is_clip" + } +} \ No newline at end of file diff --git a/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/DeviceInfo.kt b/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/DeviceInfo.kt new file mode 100644 index 0000000..611e488 --- /dev/null +++ b/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/DeviceInfo.kt @@ -0,0 +1,12 @@ +package com.pushdeer.common.api.data.response + +import com.pushdeer.common.api.data.request.DeviceInfo + + +class DeviceInfoList{ + var devices:List = emptyList() + + override fun toString(): String { + return "devices:$devices" + } +} \ No newline at end of file diff --git a/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/Message.kt b/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/Message.kt new file mode 100644 index 0000000..e3390b7 --- /dev/null +++ b/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/Message.kt @@ -0,0 +1,16 @@ +package com.pushdeer.common.api.data.response + + +class Message { + var id = 0 + var uid: String? = null + var text: String? = null + var desp: String? = null + var type: String? = null + var pushkey_name: String? = null + var created_at: String? = null +} + +class MessageList { + var messages = emptyList() +} \ No newline at end of file diff --git a/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/PushKey.kt b/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/PushKey.kt new file mode 100644 index 0000000..09266f5 --- /dev/null +++ b/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/PushKey.kt @@ -0,0 +1,20 @@ +package com.pushdeer.common.api.data.response + +class PushKey { + var id:String = "" + var key: String = "" + var name: String = "" + var created_at = "" + + override fun toString(): String { + return "id:$id key:$key name:$name created_at:$created_at" + } +} + +class PushKeyList { + var keys: List = emptyList() + + override fun toString(): String { + return "keys:$keys" + } +} \ No newline at end of file diff --git a/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/ReturnData.kt b/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/ReturnData.kt new file mode 100644 index 0000000..b07fe18 --- /dev/null +++ b/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/ReturnData.kt @@ -0,0 +1,15 @@ +package com.pushdeer.common.api.data.response + +class ReturnData { + var code: Int = 0 + var content: T?=null + var error:String = "" + + override fun toString(): String { + return "code:${code} error:${error} content:${content.toString()}" + } +} + +class TokenOnly{ + var token:String = "" +} \ No newline at end of file diff --git a/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/UserInfo.kt b/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/UserInfo.kt new file mode 100644 index 0000000..80c0a16 --- /dev/null +++ b/android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/UserInfo.kt @@ -0,0 +1,23 @@ +package com.pushdeer.common.api.data.response + +class UserInfo { + var id: String = "" + var name: String = "" + var email: String = "" + var app_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" + + "name:$name\n" + + "email:$email\n" + + "app_id:$app_id\n" + + "wechat_id:$wechat_id\n" + + "level:$level\n" + + "created:$created_at\n" + + "updated:$updated_at" + } +} \ No newline at end of file diff --git a/android/pushdeercommon/src/test/java/com/pushdeer/common/ExampleUnitTest.kt b/android/pushdeercommon/src/test/java/com/pushdeer/common/ExampleUnitTest.kt new file mode 100644 index 0000000..906e0d2 --- /dev/null +++ b/android/pushdeercommon/src/test/java/com/pushdeer/common/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.pushdeer.common + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/android/settings.gradle b/android/settings.gradle index b6b75fc..1bfaa3c 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -11,3 +11,4 @@ rootProject.name = "PushDeer" include ':app' include ':common' include ':compose' +include ':pushdeercommon'