From e16fff638cafaba020df8ba035b7e8af071a8622 Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Fri, 31 Jul 2020 13:22:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E6=8E=A8=E9=80=81=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=8E=A5=E5=85=A5=E4=B8=BB=E5=B7=A5=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/functions/socketpush.gradle | 12 +- .../com/mogo/launcher/MogoApplication.java | 6 +- config.gradle | 9 + modules/mogo-module-push-base/.gitignore | 1 + modules/mogo-module-push-base/build.gradle | 47 ++ .../mogo-module-push-base/consumer-rules.pro | 0 .../mogo-module-push-base/gradle.properties | 3 + .../mogo-module-push-base/proguard-rules.pro | 21 + .../src/main/AndroidManifest.xml | 3 + .../module/push/base/PushUIConstants.java | 7 + modules/mogo-module-push-noop/.gitignore | 1 + modules/mogo-module-push-noop/README.md | 4 + modules/mogo-module-push-noop/build.gradle | 57 ++ .../mogo-module-push-noop/consumer-rules.pro | 0 .../mogo-module-push-noop/gradle.properties | 3 + .../mogo-module-push-noop/proguard-rules.pro | 21 + .../src/main/AndroidManifest.xml | 3 + .../module/push/noop/PushModuleProvider.java | 80 ++ modules/mogo-module-push/.gitignore | 1 + modules/mogo-module-push/README.md | 12 + modules/mogo-module-push/build.gradle | 71 ++ modules/mogo-module-push/consumer-rules.pro | 0 modules/mogo-module-push/gradle.properties | 3 + modules/mogo-module-push/proguard-rules.pro | 21 + .../src/main/AndroidManifest.xml | 17 + .../main/java/com/mogo/module/push/Config.kt | 20 + .../mogo/module/push/PushModuleProvider.java | 89 ++ .../push/activity/PushMessageActivity.kt | 108 +++ .../module/push/adapter/PushMessageAdapter.kt | 127 +++ .../com/mogo/module/push/dao/PushBeanDao.kt | 25 + .../mogo/module/push/dao/PushBeanDatabase.kt | 10 + .../com/mogo/module/push/model/PushBean.kt | 54 ++ .../module/push/repository/PushRepository.kt | 233 ++++++ .../mogo/module/push/utils/AnalyticsUtils.kt | 22 + .../mogo/module/push/utils/AnimatorUtils.kt | 25 + .../mogo/module/push/utils/HandlerUtils.kt | 14 + .../com/mogo/module/push/utils/SchemaUtils.kt | 130 +++ .../java/com/mogo/module/push/utils/Utils.kt | 33 + .../com/mogo/module/push/view/FloatView.kt | 563 +++++++++++++ .../com/mogo/module/push/view/GlobalTools.kt | 40 + .../module/push/view/PushItemAnimator.java | 657 +++++++++++++++ .../module/push/view/SwipeItemLayout.java | 790 ++++++++++++++++++ .../module/push/view/roundimage/Corner.java | 19 + .../push/view/roundimage/RoundedDrawable.java | 633 ++++++++++++++ .../view/roundimage/RoundedImageView.java | 587 +++++++++++++ .../module/push/viewmodel/MessageViewModel.kt | 33 + .../module/push/viewmodel/PushViewModel.kt | 192 +++++ .../res/drawable-ldpi/module_push_close.png | Bin 0 -> 1072 bytes .../res/drawable-xhdpi/module_push_close.png | Bin 0 -> 1815 bytes .../module_push_activity_clear_bg.xml | 7 + .../main/res/drawable/module_push_close.png | Bin 0 -> 1815 bytes .../module_push_content_background.xml | 6 + .../module_push_decrease_timer_bkg.xml | 9 + .../drawable/module_push_item_background.xml | 7 + .../res/drawable/module_push_left_button.xml | 15 + ...odule_push_message_activity_background.xml | 5 + .../module_push_recycler_item_background.xml | 12 + .../res/drawable/module_push_right_button.xml | 16 + .../module_push_ui_delay_background.xml | 19 + .../drawable/module_push_ui_ic_message2.png | Bin 0 -> 1152 bytes .../src/main/res/layout/module_push_item.xml | 146 ++++ .../res/layout/module_push_item_vertical.xml | 136 +++ .../layout/module_push_message_activity.xml | 57 ++ .../res/layout/module_push_message_item.xml | 106 +++ .../src/main/res/values-ldpi/dimens.xml | 90 ++ .../src/main/res/values-mdpi/dimens.xml | 90 ++ .../src/main/res/values-xhdpi/dimens.xml | 90 ++ .../src/main/res/values/attr.xml | 30 + .../src/main/res/values/dimens.xml | 90 ++ .../src/main/res/values/strings.xml | 3 + .../src/main/res/values/styles.xml | 9 + settings.gradle | 6 +- upload.sh | 8 +- 73 files changed, 5754 insertions(+), 10 deletions(-) create mode 100644 modules/mogo-module-push-base/.gitignore create mode 100644 modules/mogo-module-push-base/build.gradle create mode 100644 modules/mogo-module-push-base/consumer-rules.pro create mode 100644 modules/mogo-module-push-base/gradle.properties create mode 100644 modules/mogo-module-push-base/proguard-rules.pro create mode 100644 modules/mogo-module-push-base/src/main/AndroidManifest.xml create mode 100644 modules/mogo-module-push-base/src/main/java/com/mogo/module/push/base/PushUIConstants.java create mode 100644 modules/mogo-module-push-noop/.gitignore create mode 100644 modules/mogo-module-push-noop/README.md create mode 100644 modules/mogo-module-push-noop/build.gradle create mode 100644 modules/mogo-module-push-noop/consumer-rules.pro create mode 100644 modules/mogo-module-push-noop/gradle.properties create mode 100644 modules/mogo-module-push-noop/proguard-rules.pro create mode 100644 modules/mogo-module-push-noop/src/main/AndroidManifest.xml create mode 100644 modules/mogo-module-push-noop/src/main/java/com/mogo/module/push/noop/PushModuleProvider.java create mode 100644 modules/mogo-module-push/.gitignore create mode 100644 modules/mogo-module-push/README.md create mode 100644 modules/mogo-module-push/build.gradle create mode 100644 modules/mogo-module-push/consumer-rules.pro create mode 100644 modules/mogo-module-push/gradle.properties create mode 100644 modules/mogo-module-push/proguard-rules.pro create mode 100644 modules/mogo-module-push/src/main/AndroidManifest.xml create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/Config.kt create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/PushModuleProvider.java create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/activity/PushMessageActivity.kt create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/adapter/PushMessageAdapter.kt create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/dao/PushBeanDao.kt create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/dao/PushBeanDatabase.kt create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/model/PushBean.kt create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/repository/PushRepository.kt create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/utils/AnalyticsUtils.kt create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/utils/AnimatorUtils.kt create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/utils/HandlerUtils.kt create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/utils/SchemaUtils.kt create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/utils/Utils.kt create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/view/FloatView.kt create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/view/GlobalTools.kt create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/view/PushItemAnimator.java create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/view/SwipeItemLayout.java create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/view/roundimage/Corner.java create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/view/roundimage/RoundedDrawable.java create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/view/roundimage/RoundedImageView.java create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/viewmodel/MessageViewModel.kt create mode 100644 modules/mogo-module-push/src/main/java/com/mogo/module/push/viewmodel/PushViewModel.kt create mode 100644 modules/mogo-module-push/src/main/res/drawable-ldpi/module_push_close.png create mode 100644 modules/mogo-module-push/src/main/res/drawable-xhdpi/module_push_close.png create mode 100644 modules/mogo-module-push/src/main/res/drawable/module_push_activity_clear_bg.xml create mode 100644 modules/mogo-module-push/src/main/res/drawable/module_push_close.png create mode 100644 modules/mogo-module-push/src/main/res/drawable/module_push_content_background.xml create mode 100644 modules/mogo-module-push/src/main/res/drawable/module_push_decrease_timer_bkg.xml create mode 100644 modules/mogo-module-push/src/main/res/drawable/module_push_item_background.xml create mode 100644 modules/mogo-module-push/src/main/res/drawable/module_push_left_button.xml create mode 100644 modules/mogo-module-push/src/main/res/drawable/module_push_message_activity_background.xml create mode 100644 modules/mogo-module-push/src/main/res/drawable/module_push_recycler_item_background.xml create mode 100644 modules/mogo-module-push/src/main/res/drawable/module_push_right_button.xml create mode 100644 modules/mogo-module-push/src/main/res/drawable/module_push_ui_delay_background.xml create mode 100644 modules/mogo-module-push/src/main/res/drawable/module_push_ui_ic_message2.png create mode 100644 modules/mogo-module-push/src/main/res/layout/module_push_item.xml create mode 100644 modules/mogo-module-push/src/main/res/layout/module_push_item_vertical.xml create mode 100644 modules/mogo-module-push/src/main/res/layout/module_push_message_activity.xml create mode 100644 modules/mogo-module-push/src/main/res/layout/module_push_message_item.xml create mode 100644 modules/mogo-module-push/src/main/res/values-ldpi/dimens.xml create mode 100644 modules/mogo-module-push/src/main/res/values-mdpi/dimens.xml create mode 100644 modules/mogo-module-push/src/main/res/values-xhdpi/dimens.xml create mode 100644 modules/mogo-module-push/src/main/res/values/attr.xml create mode 100644 modules/mogo-module-push/src/main/res/values/dimens.xml create mode 100644 modules/mogo-module-push/src/main/res/values/strings.xml create mode 100644 modules/mogo-module-push/src/main/res/values/styles.xml diff --git a/app/functions/socketpush.gradle b/app/functions/socketpush.gradle index ef9923abfd..b42be11b59 100644 --- a/app/functions/socketpush.gradle +++ b/app/functions/socketpush.gradle @@ -1,7 +1,13 @@ // 基于socket长链的push推送 project.dependencies { - implementation rootProject.ext.dependencies.modulepushbase - launcherImplementation rootProject.ext.dependencies.modulepush - independentImplementation rootProject.ext.dependencies.modulepushnoop + if (Boolean.valueOf(RELEASE)) { + implementation rootProject.ext.dependencies.modulepushbase + launcherImplementation rootProject.ext.dependencies.modulepush + independentImplementation rootProject.ext.dependencies.modulepushnoop + } else { + implementation project(":modules:mogo-module-push-base") + launcherImplementation project(":modules:mogo-module-push") + independentImplementation project(":modules:mogo-module-push-noop") + } } \ No newline at end of file diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index 2fd042befb..a067f4bf8e 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -67,10 +67,8 @@ public class MogoApplication extends AbsMogoApplication { MogoModulePaths.addModule( new MogoModule( TanluConstants.TAG, TanluConstants.MODEL_NAME ) ); MogoModulePaths.addModule( new MogoModule( MogoServicePaths.PATH_SHARE, "ShareControl" ) ); - MogoModulePaths.addModule( new MogoModule( EventPanelConstants.PATH_NAME, - EventPanelConstants.MODULE_NAME ) ); - MogoModulePaths.addModule( new MogoModule( LeftPanelConst.PATH_NAME, - LeftPanelConst.MODULE_NAME ) ); + MogoModulePaths.addModule( new MogoModule( EventPanelConstants.PATH_NAME, EventPanelConstants.MODULE_NAME ) ); + MogoModulePaths.addModule( new MogoModule( LeftPanelConst.PATH_NAME, LeftPanelConst.MODULE_NAME ) ); MogoModulePaths.addBaseModule( new MogoModule( ServiceConst.PATH_REFRESH_STRATEGY, ServiceConst.PATH_REFRESH_STRATEGY ) ); MogoModulePaths.addBaseModule( new MogoModule( V2XConst.PATH_V2X_UI, V2XConst.PATH_V2X_UI ) ); diff --git a/config.gradle b/config.gradle index 161085a014..e4e542a469 100644 --- a/config.gradle +++ b/config.gradle @@ -172,5 +172,14 @@ targetSdkVersion : 22, // 基础服务实现 mogobaseservicesdk : "com.mogo.base:services-sdk:${MOGO_BASE_SERVICES_SDK_VERSION}", mogobaseserviceapk : "com.mogo.base:services-apk:${MOGO_BASE_SERVICES_APK_VERSION}", + + // google + googlezxing : "com.google.zxing:core:3.3.3", + litezxing : "com.google.zxing:litezxing:1.0.29.8", + + // android - room + androidxroomruntime : "androidx.room:room-runtime:2.2.3", + androidxroomcompiler : "androidx.room:room-compiler:2.2.3", + androidxroomktx : "androidx.room:room-ktx:2.2.3", ] } \ No newline at end of file diff --git a/modules/mogo-module-push-base/.gitignore b/modules/mogo-module-push-base/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/modules/mogo-module-push-base/.gitignore @@ -0,0 +1 @@ +/build diff --git a/modules/mogo-module-push-base/build.gradle b/modules/mogo-module-push-base/build.gradle new file mode 100644 index 0000000000..3f5839e3b9 --- /dev/null +++ b/modules/mogo-module-push-base/build.gradle @@ -0,0 +1,47 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' +android { + compileSdkVersion rootProject.ext.android.compileSdkVersion + buildToolsVersion rootProject.ext.android.buildToolsVersion + + + defaultConfig { + minSdkVersion rootProject.ext.android.minSdkVersion + targetSdkVersion rootProject.ext.android.targetSdkVersion + versionCode Integer.valueOf(VERSION_CODE) + versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION") + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles 'consumer-rules.pro' + kapt { + arguments { + arg("AROUTER_MODULE_NAME", project.getName()) + } + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + targetCompatibility 1.8 + sourceCompatibility 1.8 + } + + kotlinOptions { + jvmTarget = "1.8" + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) +} + +apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() diff --git a/modules/mogo-module-push-base/consumer-rules.pro b/modules/mogo-module-push-base/consumer-rules.pro new file mode 100644 index 0000000000..e69de29bb2 diff --git a/modules/mogo-module-push-base/gradle.properties b/modules/mogo-module-push-base/gradle.properties new file mode 100644 index 0000000000..653f4713ca --- /dev/null +++ b/modules/mogo-module-push-base/gradle.properties @@ -0,0 +1,3 @@ +GROUP=com.mogo.module +POM_ARTIFACT_ID=module-push-base +VERSION_CODE=1 diff --git a/modules/mogo-module-push-base/proguard-rules.pro b/modules/mogo-module-push-base/proguard-rules.pro new file mode 100644 index 0000000000..f1b424510d --- /dev/null +++ b/modules/mogo-module-push-base/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 diff --git a/modules/mogo-module-push-base/src/main/AndroidManifest.xml b/modules/mogo-module-push-base/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..9a8574da7b --- /dev/null +++ b/modules/mogo-module-push-base/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/modules/mogo-module-push-base/src/main/java/com/mogo/module/push/base/PushUIConstants.java b/modules/mogo-module-push-base/src/main/java/com/mogo/module/push/base/PushUIConstants.java new file mode 100644 index 0000000000..4cfde10760 --- /dev/null +++ b/modules/mogo-module-push-base/src/main/java/com/mogo/module/push/base/PushUIConstants.java @@ -0,0 +1,7 @@ +package com.mogo.module.push.base; + +public class PushUIConstants { + public static final String NAME = "PUSH_UI"; + public static final String PATH = "/push/ui"; + public static final String Push_MESSAGE_ACTIVITY_PATH = "/push/ui/message"; //消息列表activity +} diff --git a/modules/mogo-module-push-noop/.gitignore b/modules/mogo-module-push-noop/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/modules/mogo-module-push-noop/.gitignore @@ -0,0 +1 @@ +/build diff --git a/modules/mogo-module-push-noop/README.md b/modules/mogo-module-push-noop/README.md new file mode 100644 index 0000000000..a15717364f --- /dev/null +++ b/modules/mogo-module-push-noop/README.md @@ -0,0 +1,4 @@ +# 基于 socketserver 实现的push推送(空) + +--- +目前,仅 launcher 实现推送,独立 app 不用 \ No newline at end of file diff --git a/modules/mogo-module-push-noop/build.gradle b/modules/mogo-module-push-noop/build.gradle new file mode 100644 index 0000000000..369d2a1a49 --- /dev/null +++ b/modules/mogo-module-push-noop/build.gradle @@ -0,0 +1,57 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' +android { + compileSdkVersion rootProject.ext.android.compileSdkVersion + buildToolsVersion rootProject.ext.android.buildToolsVersion + + + defaultConfig { + minSdkVersion rootProject.ext.android.minSdkVersion + targetSdkVersion rootProject.ext.android.targetSdkVersion + versionCode Integer.valueOf(VERSION_CODE) + versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION") + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles 'consumer-rules.pro' + kapt { + arguments { + arg("AROUTER_MODULE_NAME", project.getName()) + } + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + targetCompatibility 1.8 + sourceCompatibility 1.8 + } + + kotlinOptions { + jvmTarget = "1.8" + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + // 小智语音,免唤醒词等服务 + compileOnly rootProject.ext.dependencies.mogoserviceapi + compileOnly rootProject.ext.dependencies.arouter + kapt rootProject.ext.dependencies.aroutercompiler + + if( Boolean.valueOf(RELEASE) ){ + implementation rootProject.ext.dependencies.modulepushbase + } else { + implementation project(":modules:mogo-module-push-base") + } +} + +apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() diff --git a/modules/mogo-module-push-noop/consumer-rules.pro b/modules/mogo-module-push-noop/consumer-rules.pro new file mode 100644 index 0000000000..e69de29bb2 diff --git a/modules/mogo-module-push-noop/gradle.properties b/modules/mogo-module-push-noop/gradle.properties new file mode 100644 index 0000000000..9142345995 --- /dev/null +++ b/modules/mogo-module-push-noop/gradle.properties @@ -0,0 +1,3 @@ +GROUP=com.mogo.module +POM_ARTIFACT_ID=module-push-noop +VERSION_CODE=1 diff --git a/modules/mogo-module-push-noop/proguard-rules.pro b/modules/mogo-module-push-noop/proguard-rules.pro new file mode 100644 index 0000000000..f1b424510d --- /dev/null +++ b/modules/mogo-module-push-noop/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 diff --git a/modules/mogo-module-push-noop/src/main/AndroidManifest.xml b/modules/mogo-module-push-noop/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..50c17495d9 --- /dev/null +++ b/modules/mogo-module-push-noop/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/modules/mogo-module-push-noop/src/main/java/com/mogo/module/push/noop/PushModuleProvider.java b/modules/mogo-module-push-noop/src/main/java/com/mogo/module/push/noop/PushModuleProvider.java new file mode 100644 index 0000000000..11555a184c --- /dev/null +++ b/modules/mogo-module-push-noop/src/main/java/com/mogo/module/push/noop/PushModuleProvider.java @@ -0,0 +1,80 @@ +package com.mogo.module.push.noop; + +import android.content.Context; +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.map.listener.IMogoMapListener; +import com.mogo.map.location.IMogoLocationListener; +import com.mogo.map.marker.IMogoMarkerClickListener; +import com.mogo.map.navi.IMogoNaviListener; +import com.mogo.module.push.base.PushUIConstants; +import com.mogo.service.module.IMogoModuleLifecycle; +import com.mogo.service.module.IMogoModuleProvider; + +@Route(path = PushUIConstants.PATH) +public class PushModuleProvider implements IMogoModuleProvider { + @Override + public Fragment createFragment(Context context, Bundle data) { + return null; + } + + @Override + public View createView(Context context) { + return null; + } + + @NonNull + @Override + public String getModuleName() { + return ""; + } + + @Override + public IMogoModuleLifecycle getCardLifecycle() { + return null; + } + + @Override + public IMogoMapListener getMapListener() { + return null; + } + + @Override + public int getType() { + return 0; + } + + @Override + public IMogoNaviListener getNaviListener() { + return null; + } + + @Override + public IMogoLocationListener getLocationListener() { + return null; + } + + @Override + public IMogoMarkerClickListener getMarkerClickListener() { + return null; + } + + @Override + public String getAppPackage() { + return " "; + } + + @Override + public String getAppName() { + return " "; + } + + @Override + public void init(final Context context) { + } +} diff --git a/modules/mogo-module-push/.gitignore b/modules/mogo-module-push/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/modules/mogo-module-push/.gitignore @@ -0,0 +1 @@ +/build diff --git a/modules/mogo-module-push/README.md b/modules/mogo-module-push/README.md new file mode 100644 index 0000000000..e262a8de52 --- /dev/null +++ b/modules/mogo-module-push/README.md @@ -0,0 +1,12 @@ +# 基于 socketserver 实现的push推送 + +--- +目前,仅 launcher 实现推送,独立 app 不用 + +## launcher 在前台 + + 通过launcher内部空白区域的弹层承载推送内容 + +## launcher 在后台 + + 通过 windowmanger 方式承载推送内容 \ No newline at end of file diff --git a/modules/mogo-module-push/build.gradle b/modules/mogo-module-push/build.gradle new file mode 100644 index 0000000000..80fa923f80 --- /dev/null +++ b/modules/mogo-module-push/build.gradle @@ -0,0 +1,71 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' +android { + compileSdkVersion rootProject.ext.android.compileSdkVersion + buildToolsVersion rootProject.ext.android.buildToolsVersion + + + defaultConfig { + minSdkVersion rootProject.ext.android.minSdkVersion + targetSdkVersion rootProject.ext.android.targetSdkVersion + versionCode Integer.valueOf(VERSION_CODE) + versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION") + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles 'consumer-rules.pro' + kapt { + arguments { + arg("AROUTER_MODULE_NAME", project.getName()) + } + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + targetCompatibility 1.8 + sourceCompatibility 1.8 + } + + kotlinOptions { + jvmTarget = "1.8" + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + // 小智语音,免唤醒词等服务 + compileOnly rootProject.ext.dependencies.mogomap + compileOnly rootProject.ext.dependencies.mogoutils + compileOnly rootProject.ext.dependencies.mogocommons + compileOnly rootProject.ext.dependencies.mogoserviceapi + compileOnly rootProject.ext.dependencies.modulecommon + compileOnly rootProject.ext.dependencies.androidxconstraintlayout + compileOnly rootProject.ext.dependencies.arouter + compileOnly rootProject.ext.dependencies.aiassist + kapt rootProject.ext.dependencies.aroutercompiler + compileOnly rootProject.ext.dependencies.androidxrecyclerview + implementation rootProject.ext.dependencies.androidxappcompat + implementation rootProject.ext.dependencies.kotlinstdlibjdk7 + implementation rootProject.ext.dependencies.androidxccorektx + implementation rootProject.ext.dependencies.litezxing + implementation rootProject.ext.dependencies.androidxroomruntime + implementation rootProject.ext.dependencies.androidxroomktx + kapt rootProject.ext.dependencies.androidxroomcompiler + + if( Boolean.valueOf(RELEASE) ){ + implementation rootProject.ext.dependencies.modulepushbase + } else { + implementation project(":modules:mogo-module-push-base") + } +} + +apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() diff --git a/modules/mogo-module-push/consumer-rules.pro b/modules/mogo-module-push/consumer-rules.pro new file mode 100644 index 0000000000..e69de29bb2 diff --git a/modules/mogo-module-push/gradle.properties b/modules/mogo-module-push/gradle.properties new file mode 100644 index 0000000000..cf466ecef3 --- /dev/null +++ b/modules/mogo-module-push/gradle.properties @@ -0,0 +1,3 @@ +GROUP=com.mogo.module +POM_ARTIFACT_ID=module-push +VERSION_CODE=1 diff --git a/modules/mogo-module-push/proguard-rules.pro b/modules/mogo-module-push/proguard-rules.pro new file mode 100644 index 0000000000..f1b424510d --- /dev/null +++ b/modules/mogo-module-push/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 diff --git a/modules/mogo-module-push/src/main/AndroidManifest.xml b/modules/mogo-module-push/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..3334a218b2 --- /dev/null +++ b/modules/mogo-module-push/src/main/AndroidManifest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-push/src/main/java/com/mogo/module/push/Config.kt b/modules/mogo-module-push/src/main/java/com/mogo/module/push/Config.kt new file mode 100644 index 0000000000..d5de33e9d7 --- /dev/null +++ b/modules/mogo-module-push/src/main/java/com/mogo/module/push/Config.kt @@ -0,0 +1,20 @@ +package com.mogo.module.push + +object Config { + const val PUSH_TYPE = 100 //注册长连接类型 + const val NEWS_ARRIVE = "news_arrive" //Push到达 + const val NEWS_CARD_SHOW = "news_card_show"//push 展示 + const val NEWS_CARD_DISAPPEAR = "news_card_disappear"// push 展示到期,自动消失 + const val NEWS_CARD_CLICK = "news_card_click"//点击消息体 + const val NEWS_CARD_SWIPE = "news_card_swipe"//划掉消息 + const val NEWS_CARD_CLICK_BTN = "news_card_click_btn"//点击按钮 + + + const val NEWS_HISTORY_OPEN = "news_history_open"//打开消息列表 + const val NEWS_HISTORY_CLOSE = "news_history_close"//关闭消息列表 + const val NEWS_HISTORY_ALL_CLEAR = "news_history_all_clear"//清除消息列表 + const val NEWS_HISTORY_ONE_CLEAR = "news_history_one_clear"//清除消息历史中的消息 + const val NEWS_HISTORY_ONE_CLICK = "news_history_one_click"//点击消息历史中的消息 + + +} \ No newline at end of file diff --git a/modules/mogo-module-push/src/main/java/com/mogo/module/push/PushModuleProvider.java b/modules/mogo-module-push/src/main/java/com/mogo/module/push/PushModuleProvider.java new file mode 100644 index 0000000000..83ef3d1b42 --- /dev/null +++ b/modules/mogo-module-push/src/main/java/com/mogo/module/push/PushModuleProvider.java @@ -0,0 +1,89 @@ +package com.mogo.module.push; + +import android.content.Context; +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.map.listener.IMogoMapListener; +import com.mogo.map.location.IMogoLocationListener; +import com.mogo.map.marker.IMogoMarkerClickListener; +import com.mogo.map.navi.IMogoNaviListener; +import com.mogo.module.push.base.PushUIConstants; +import com.mogo.module.push.repository.PushRepository; +import com.mogo.module.push.utils.HandlerUtils; +import com.mogo.service.module.IMogoModuleLifecycle; +import com.mogo.service.module.IMogoModuleProvider; + + +@Route(path = PushUIConstants.PATH) +public class PushModuleProvider implements IMogoModuleProvider { + @Override + public Fragment createFragment(Context context, Bundle data) { + return null; + } + + @Override + public View createView(Context context) { + return null; + } + + @NonNull + @Override + public String getModuleName() { + return ""; + } + + @Override + public IMogoModuleLifecycle getCardLifecycle() { + return null; + } + + @Override + public IMogoMapListener getMapListener() { + return null; + } + + @Override + public int getType() { + return 0; + } + + @Override + public IMogoNaviListener getNaviListener() { + return null; + } + + @Override + public IMogoLocationListener getLocationListener() { + return null; + } + + @Override + public IMogoMarkerClickListener getMarkerClickListener() { + return null; + } + + @Override + public String getAppPackage() { + return " "; + } + + @Override + public String getAppName() { + return " "; + } + + @Override + public void init(final Context context) { + HandlerUtils.INSTANCE.getMBgHandler().post(new Runnable() { + @Override + public void run() { + PushRepository.Companion.init(context); + } + }); + } +} diff --git a/modules/mogo-module-push/src/main/java/com/mogo/module/push/activity/PushMessageActivity.kt b/modules/mogo-module-push/src/main/java/com/mogo/module/push/activity/PushMessageActivity.kt new file mode 100644 index 0000000000..a77b140ebb --- /dev/null +++ b/modules/mogo-module-push/src/main/java/com/mogo/module/push/activity/PushMessageActivity.kt @@ -0,0 +1,108 @@ +package com.mogo.module.push.activity + +import android.os.Bundle +import android.view.View +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.LinearLayoutManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.mogo.module.push.Config +import com.mogo.module.push.base.PushUIConstants +import com.mogo.module.push.R +import com.mogo.module.push.adapter.PushMessageAdapter +import com.mogo.module.push.model.PushBean +import com.mogo.module.push.repository.PushRepository +import com.mogo.module.push.utils.AnalyticsUtils +import com.mogo.module.push.utils.HandlerUtils +import com.mogo.module.push.utils.startClearAnimator +import com.mogo.module.push.view.PushItemAnimator +import com.mogo.module.push.view.SwipeItemLayout +import com.mogo.module.push.viewmodel.MessageViewModel +import com.mogo.utils.UiThreadHandler +import kotlinx.android.synthetic.main.module_push_message_activity.* + +@Route(path = PushUIConstants.Push_MESSAGE_ACTIVITY_PATH) +class PushMessageActivity : AppCompatActivity() { + private lateinit var viewModel: MessageViewModel + private var adapter = PushMessageAdapter() + private var clearing = false + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) +// window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) + setContentView(R.layout.module_push_message_activity) + AnalyticsUtils.track(Config.NEWS_HISTORY_OPEN) + module_push_activity_close.setOnClickListener { + AnalyticsUtils.track(Config.NEWS_HISTORY_CLOSE) + finish() + } + module_push_activity_clear.setOnClickListener { + AnalyticsUtils.track(Config.NEWS_HISTORY_ALL_CLEAR) + if (!clearing) { + clearing = true + startClearAnimator(module_push_activity_recycler_view) { + viewModel.deleteAll() + clearing = false + } + } + } + adapter.deletePushBean = object : PushMessageAdapter.PushAdapterListener { + override fun lastItemShow(show: Boolean) { + if (!show && !clearing) { + val size = viewModel.list?.size ?: 0 + if (size > 0 && size < module_push_activity_recycler_view.childCount) { + return + } + } + module_push_activity_clear.visibility = + if (show) View.VISIBLE else View.GONE + } + + override fun deleteBean(bean: PushBean, action: Boolean) { + if (clearing) return + viewModel.delete(bean) + if (action) { + AnalyticsUtils.track(Config.NEWS_HISTORY_ONE_CLICK, "title", bean.title) + finish() + } else { + AnalyticsUtils.track(Config.NEWS_HISTORY_ONE_CLEAR, "title", bean.title) + adapter.removeItem(bean) + if (adapter.datas?.size ?: 0 == 0) { + module_push_activity_not_data.visibility = View.VISIBLE + } + updateHistoryMessageCount() + } + } + } + module_push_activity_recycler_view.layoutManager = LinearLayoutManager(this) + module_push_activity_recycler_view.adapter = adapter + module_push_activity_recycler_view.itemAnimator = PushItemAnimator() + module_push_activity_recycler_view.addOnItemTouchListener( + SwipeItemLayout.OnSwipeItemTouchListener(this) + ) + viewModel = MessageViewModel(object : + MessageViewModel.MessageListChange { + override fun messageListChange(list: MutableList?) { + runOnUiThread { + var size = list?.size ?: 0 + adapter.datas = list + module_push_activity_not_data.visibility = if (size > 0) View.GONE else View.VISIBLE + updateHistoryMessageCount() + } + } + }) + } + + private fun updateHistoryMessageCount(){ + HandlerUtils.mBgHandler.post{ + var count = PushRepository.pushRepository.pushBeanDao.getAllCount() + UiThreadHandler.post { + module_push_activity_title.text = if (count > 0) "历史消息(${count})" else "历史消息" + } + } + } + + override fun onResume() { + super.onResume() + adapter.notifyDataSetChanged() + } +} \ No newline at end of file diff --git a/modules/mogo-module-push/src/main/java/com/mogo/module/push/adapter/PushMessageAdapter.kt b/modules/mogo-module-push/src/main/java/com/mogo/module/push/adapter/PushMessageAdapter.kt new file mode 100644 index 0000000000..868a609d29 --- /dev/null +++ b/modules/mogo-module-push/src/main/java/com/mogo/module/push/adapter/PushMessageAdapter.kt @@ -0,0 +1,127 @@ +package com.mogo.module.push.adapter + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.mogo.module.push.R +import com.mogo.module.push.model.PushBean +import com.mogo.module.push.repository.PushRepository +import com.mogo.module.push.utils.dealSchema +import com.mogo.module.push.utils.stringConverterBitmap +import com.mogo.module.push.view.getApis +import com.mogo.service.imageloader.MogoImageView +import kotlin.math.abs + +class PushMessageAdapter : RecyclerView.Adapter() { + interface PushAdapterListener { + fun deleteBean(bean: PushBean, action: Boolean) + + fun lastItemShow(show: Boolean) + } + + var onAttachStateChangeListener = object : View.OnAttachStateChangeListener { + override fun onViewDetachedFromWindow(p0: View?) { + deletePushBean.lastItemShow(false) + } + + override fun onViewAttachedToWindow(p0: View?) { + deletePushBean.lastItemShow(true) + } + + } + + lateinit var deletePushBean: PushAdapterListener + + var datas: MutableList? = null + set(value) { + field = value + notifyDataSetChanged() + } + + fun removeItem(bean: PushBean) { + datas?.let { + val position = it.indexOf(bean) + if (position >= 0) { + it.removeAt(position) + notifyItemRemoved(position) + } + if (itemCount == 0) { + deletePushBean.lastItemShow(false) + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MessageViewHolder { + return MessageViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.module_push_message_item, + parent, + false + ) + ) + } + + override fun getItemCount(): Int { + return datas?.size ?: 0 + } + + override fun onBindViewHolder(holder: MessageViewHolder, position: Int) { + holder.setPushBean(datas!![position], position) + } + + + inner class MessageViewHolder(view: View) : RecyclerView.ViewHolder(view) { + private val pushAppIcon: MogoImageView = view.findViewById(R.id.module_push_item_app_icon) + private val pushTitle: TextView = view.findViewById(R.id.module_push_item_title) + private val pushContent: TextView = view.findViewById(R.id.module_push_item_content) + private val pushImage: MogoImageView = view.findViewById(R.id.module_push_item_image) + private val pushTimer: TextView = view.findViewById(R.id.module_push_item_time) + private val pushDelete: TextView = view.findViewById(R.id.module_push_item_delete) + private val pushClick: View = view.findViewById(R.id.module_push_item_click) + + fun setPushBean(bean: PushBean, position: Int) { + if (position == (datas?.size ?: 0) - 1) { + itemView.addOnAttachStateChangeListener(onAttachStateChangeListener) + } else { + itemView.removeOnAttachStateChangeListener(onAttachStateChangeListener) + } + pushDelete.setOnClickListener { + deletePushBean.deleteBean(bean, false) + } + if (!bean.mainSchema.isNullOrEmpty()) { + pushClick.setOnClickListener { + dealSchema(bean.mainSchema, itemView.context) + deletePushBean.deleteBean(bean, true) + } + } else { + pushClick.setOnClickListener(null) + } + getApis(itemView.context).imageLoaderApi.displayImage(bean.appIcon, pushAppIcon) + pushTitle.text = bean.title + pushContent.text = bean.content + pushContent.visibility = if (bean.content.isNullOrEmpty()) View.GONE else View.VISIBLE + if (bean.QRCode.isNullOrEmpty() && bean.imageUrl.isNotEmpty()) { + getApis(itemView.context).imageLoaderApi.displayImage(bean.imageUrl, pushImage) + } + if (!bean.QRCode.isNullOrEmpty()) { + pushImage.setImageBitmap( + stringConverterBitmap( + bean.QRCode, + pushImage.context.resources.getDimensionPixelSize(R.dimen.module_push_message_item_image_size), + pushImage.context.resources.getDimensionPixelSize(R.dimen.module_push_message_item_image_size) + ) + ) + } + val diff = abs((System.currentTimeMillis() - bean.timestamp) / 1000).toInt() + pushTimer.text = when { + diff == 0 -> "现在" + diff < 60 -> "${diff}秒前" + diff < 60 * 60 -> "${diff / 60}分钟前" + diff < 60 * 60 * 24 -> "${diff / 60 / 60}小时前" + else -> "${diff / 60 / 60 / 24}天前" + } + } + } +} \ No newline at end of file diff --git a/modules/mogo-module-push/src/main/java/com/mogo/module/push/dao/PushBeanDao.kt b/modules/mogo-module-push/src/main/java/com/mogo/module/push/dao/PushBeanDao.kt new file mode 100644 index 0000000000..ff2548093d --- /dev/null +++ b/modules/mogo-module-push/src/main/java/com/mogo/module/push/dao/PushBeanDao.kt @@ -0,0 +1,25 @@ +package com.mogo.module.push.dao + +import androidx.room.* +import com.mogo.module.push.model.PushBean + +@Dao +interface PushBeanDao { + @Query("SELECT * FROM pushBean ORDER BY timestamp DESC") + fun getAll(): MutableList + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertAll(vararg bean: PushBean) + + @Delete + fun delete(vararg bean: PushBean) + + @Query("DELETE FROM pushBean") + fun deleteAll() + + @Query("SELECT count(1) FROM pushBean") + fun getAllCount(): Int + + @Query("DELETE FROM pushBean WHERE timestamp IN (SELECT MIN(timestamp) FROM pushBean)") + fun deleteMin() +} \ No newline at end of file diff --git a/modules/mogo-module-push/src/main/java/com/mogo/module/push/dao/PushBeanDatabase.kt b/modules/mogo-module-push/src/main/java/com/mogo/module/push/dao/PushBeanDatabase.kt new file mode 100644 index 0000000000..7631c88a18 --- /dev/null +++ b/modules/mogo-module-push/src/main/java/com/mogo/module/push/dao/PushBeanDatabase.kt @@ -0,0 +1,10 @@ +package com.mogo.module.push.dao + +import androidx.room.Database +import androidx.room.RoomDatabase +import com.mogo.module.push.model.PushBean + +@Database(entities = [PushBean::class], version = 1) +abstract class PushBeanDatabase : RoomDatabase() { + abstract fun pushBeanDao(): PushBeanDao +} \ No newline at end of file diff --git a/modules/mogo-module-push/src/main/java/com/mogo/module/push/model/PushBean.kt b/modules/mogo-module-push/src/main/java/com/mogo/module/push/model/PushBean.kt new file mode 100644 index 0000000000..452a62f19e --- /dev/null +++ b/modules/mogo-module-push/src/main/java/com/mogo/module/push/model/PushBean.kt @@ -0,0 +1,54 @@ +package com.mogo.module.push.model + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Ignore +import androidx.room.PrimaryKey +import com.google.gson.annotations.SerializedName + +@Entity +data class PushBean( + @Ignore + val speedLimit: Int = 0, //超过速度后延迟显示 + @Ignore + var showTimeout: Int = 0, //显示等待时长 + @Ignore + var showTimeoutShadow: Int = 0, // 显示等待时长备份 + @ColumnInfo(name = "icon") + var appIcon: String = "", //目标app icon图标地址 + @ColumnInfo(name = "title") + var title: String = "", //标题 + @ColumnInfo(name = "content") + var content: String = "", //详细内容 + @ColumnInfo(name = "image") + var imageUrl: String = "", //图片地址 + @ColumnInfo(name = "qr") + var QRCode: String = "", //二维码地址 + @Ignore + val tts: String = "", //语音播报词 + @ColumnInfo(name = "scheme") + var mainSchema: String = "", //schema跳转协议 + @Ignore + val mainVoiceCmd: List? = null, //触发主schema 命令词 + @Ignore + val cancelVoiceCmd: List? = null, //隐藏当前push命令词 + @Ignore + val buttons: List