+ * 长链实现:基于 netty + */ +@Keep +public class SocketManager implements IMogoSocketManager, OnSocketReceiveCallback, OnSocketAckCallback { + + private static final String TAG = "SocketManager-apk"; + + public static final int MSG_PRODUCT_LINE = MogoCommon.Product.mogoBussiness_VALUE; + private static final int MSG_HEADER_TYPE = MogoConnsvr.MsgType.mogoMsgTypeDispatchSvrNoRspReq_VALUE; + + private static volatile SocketManager sInstance; + + private SocketManager( Context context ) { + mSocketConnManager = SocketConnManagerImpl.getInstance( context ); + mSocketConnManager.addSocketMessageCallback( this ); + mSocketConnManager.addSocketAckCallback( this ); + } + + @Keep + public static SocketManager getInstance( Context context ) { + if ( sInstance == null ) { + synchronized ( SocketManager.class ) { + if ( sInstance == null ) { + sInstance = new SocketManager( context ); + } + } + } + return sInstance; + } + + /** + * 管理消息分发 + *
+ * key - msgType + */ + private Map< Integer, List< IMogoOnMessageListener > > mListeners = new ConcurrentHashMap<>(); + + /** + * 管理消息回执 + *
+ * key - msgId
+ */
+ private Map< Long, IMogoMsgAckListener > mAckListeners = new ConcurrentHashMap<>();
+
+
+ private SocketConnManager mSocketConnManager;
+ public static final int MAX_CAP = 64; //保证充足的容量应对非常延时的推送
+ private ArrayList< Long > mReceivedMsgId = new ArrayList<>( MAX_CAP );
+ private int mCurrentIndex = 0;
+
+ @Override
+ public void init( Context context, String appId ) {
+ if ( mSocketConnManager != null ) {
+ mSocketConnManager.init( appId );
+ }
+ }
+
+ @Override
+ public void onMessageReceived( byte[] content, long msgId ) {
+ try {
+ MogoConnsvr.Payload payload = MogoConnsvr.Payload.parseFrom( content );
+ int msgType = payload.getMsgType();
+ Logger.d( TAG, "received msg type = %d", msgType );
+ List< IMogoOnMessageListener > listeners = mListeners.get( msgType );
+ if ( listeners != null && !listeners.isEmpty() ) {
+ Iterator< IMogoOnMessageListener > iterator = listeners.iterator();
+ if ( msgId != 0 ) { //兼容老版本
+ if ( mReceivedMsgId.contains( msgId ) ) { // 避免消息重发
+ return;
+ }
+ cacheLastReceivedMsgId( msgId );
+ }
+ Object object = null;
+ while ( iterator.hasNext() ) {
+ IMogoOnMessageListener listener = iterator.next();
+ if ( object == null ) {
+ object = GsonUtil.objectFromJson( payload.getPayload().toStringUtf8(), listener.target() );
+ }
+ if ( listener != null ) {
+ Logger.d( TAG, "received msgId = %s, content = %s", msgId, payload.getPayload().toStringUtf8() );
+ listener.onMsgReceived( object );
+ }
+ }
+ }
+ } catch ( InvalidProtocolBufferException e ) {
+ Logger.e( TAG, e, "parse msg error." );
+ }
+ }
+
+ private void cacheLastReceivedMsgId( long msgId ) {
+ if ( msgId == 0 ) {
+ return;
+ }
+ synchronized ( this ){
+ mReceivedMsgId.add( mCurrentIndex % MAX_CAP, msgId );
+ mCurrentIndex++;
+ }
+ }
+
+ @Override
+ public void onAck( byte[] headerBytes, byte[] payloadBytes ) {
+ try {
+ MogoConnsvr.Header header = MogoConnsvr.Header.parseFrom( headerBytes );
+ int msgType = header.getMsgType();
+ String appId = header.getAppId();
+ int productLine = header.getProductLine();
+ long msgId = header.getMsgId();
+ IMogoMsgAckListener listener = mAckListeners.remove( msgId );
+ if ( listener != null ) {
+ listener.onAck( msgId );
+ }
+ Logger.d( TAG, "send message success: msgType = %d, appId = %s, productLine = %d", msgType, appId, productLine );
+ } catch ( InvalidProtocolBufferException e ) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void registerOnMessageListener( int msgType, IMogoOnMessageListener listener ) {
+ if ( mListeners.containsKey( msgType ) ) {
+ Logger.w( TAG, "msgType %d is exist.", msgType );
+ }
+ if ( !mListeners.containsKey( msgType ) ) {
+ mListeners.put( msgType, new ArrayList< IMogoOnMessageListener >() );
+ }
+ mListeners.get( msgType ).add( listener );
+ }
+
+ @Override
+ public void unregisterOnMessageListener( int msgType ) {
+ mListeners.remove( msgType );
+ }
+
+ @Override
+ public void unregisterOnMessageListener( int msgType, IMogoOnMessageListener listener ) {
+ if ( listener == null ) {
+ return;
+ }
+ if ( !mListeners.containsKey( msgType ) ) {
+ return;
+ }
+ List< IMogoOnMessageListener > listeners = mListeners.get( msgType );
+ if ( listeners != null && listeners.contains( listener ) ) {
+ listeners.remove( listener );
+ }
+ }
+
+ @Override
+ public void sendMsg( MsgBody body, IMogoMsgAckListener listener ) {
+ Logger.d( TAG, "sendMsg." );
+ if ( mSocketConnManager != null ) {
+ if ( mSocketConnManager.isConnected() ) {
+ Logger.d( TAG, "isConnected." );
+ final byte[] pb = convertToPBBytes( body.getMsgType(), objectToBytes( body.getContent() ) );
+ mSocketConnManager.sendPayload(
+ MSG_PRODUCT_LINE,
+ pb,
+ MSG_HEADER_TYPE,
+ body.isAck(),
+ body.getMsgId()
+ );
+ mAckListeners.put( body.getMsgId(), listener );
+ } else {
+ Logger.e( TAG, "sendMsg error, connect is lost." );
+ }
+ } else {
+ Logger.e( TAG, "sendMsg error, client is null." );
+ }
+ }
+
+ public byte[] objectToBytes( Object obj ) {
+ String jsonStr = GsonUtil.jsonFromObject( obj );
+ return jsonStr.getBytes();
+ }
+
+ private byte[] convertToPBBytes( int msgType, byte[] payloadBytes ) {
+ MogoConnsvr.Payload payloadData = MogoConnsvr.Payload.newBuilder()
+ .setMsgType( msgType )
+ .setPayload( ByteString.copyFrom( payloadBytes ) ).build();
+ return payloadData.toByteArray();
+ }
+
+ public synchronized void release() {
+ mListeners.clear();
+ mListeners = null;
+ sInstance = null;
+ }
+
+
+ @Override
+ public void init( Context context ) {
+ }
+}
diff --git a/foudations/mogo-base-services-apk/src/test/java/com/mogo/base/services/apk/ExampleUnitTest.java b/foudations/mogo-base-services-apk/src/test/java/com/mogo/base/services/apk/ExampleUnitTest.java
new file mode 100644
index 0000000000..7b81601a73
--- /dev/null
+++ b/foudations/mogo-base-services-apk/src/test/java/com/mogo/base/services/apk/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.mogo.base.services.apk;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals( 4, 2 + 2 );
+ }
+}
\ No newline at end of file
diff --git a/foudations/mogo-base-services-sdk/.gitignore b/foudations/mogo-base-services-sdk/.gitignore
new file mode 100644
index 0000000000..42afabfd2a
--- /dev/null
+++ b/foudations/mogo-base-services-sdk/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/foudations/mogo-base-services-sdk/README.md b/foudations/mogo-base-services-sdk/README.md
new file mode 100644
index 0000000000..d5fa09de5b
--- /dev/null
+++ b/foudations/mogo-base-services-sdk/README.md
@@ -0,0 +1,3 @@
+## sdk实现功能
+
+脱离基础服务apk实现对应功能:位置上报、长连接、passport
\ No newline at end of file
diff --git a/foudations/mogo-base-services-sdk/build.gradle b/foudations/mogo-base-services-sdk/build.gradle
new file mode 100644
index 0000000000..1dd7e70249
--- /dev/null
+++ b/foudations/mogo-base-services-sdk/build.gradle
@@ -0,0 +1,53 @@
+apply plugin: 'com.android.library'
+
+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"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: "libs", include: ["*.jar"])
+ implementation rootProject.ext.dependencies.arouter
+ // 上报位置
+ implementation 'com.zhidao.locupload:loc-upload-sdk:1.0.6'
+ // 长链
+ implementation 'com.zhidao.socket:built-in-socket:1.0.11'
+ // passport
+ implementation 'com.zhidao.tcloginsdk:tclogin:1.0.6'
+
+ annotationProcessor 'com.elegant.spi:compiler:1.0.3'
+
+
+ if (Boolean.valueOf(RELEASE)) {
+ implementation rootProject.ext.dependencies.mogoutils
+ implementation rootProject.ext.dependencies.mogocommons
+ implementation rootProject.ext.dependencies.mogoserviceapi
+ } else {
+ implementation project(":foudations:mogo-utils")
+ implementation project(":foudations:mogo-commons")
+ implementation project(":services:mogo-service-api")
+ }
+}
+
+apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()
\ No newline at end of file
diff --git a/foudations/mogo-base-services-sdk/consumer-rules.pro b/foudations/mogo-base-services-sdk/consumer-rules.pro
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/foudations/mogo-base-services-sdk/gradle.properties b/foudations/mogo-base-services-sdk/gradle.properties
new file mode 100644
index 0000000000..a753d03b00
--- /dev/null
+++ b/foudations/mogo-base-services-sdk/gradle.properties
@@ -0,0 +1,3 @@
+GROUP=com.mogo.connection
+POM_ARTIFACT_ID=mogo-base-services-sdk
+VERSION_CODE=1
diff --git a/foudations/mogo-base-services-sdk/proguard-rules.pro b/foudations/mogo-base-services-sdk/proguard-rules.pro
new file mode 100644
index 0000000000..481bb43481
--- /dev/null
+++ b/foudations/mogo-base-services-sdk/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/foudations/mogo-base-services-sdk/src/androidTest/java/com/mogo/base/services/ExampleInstrumentedTest.java b/foudations/mogo-base-services-sdk/src/androidTest/java/com/mogo/base/services/ExampleInstrumentedTest.java
new file mode 100644
index 0000000000..856a560f77
--- /dev/null
+++ b/foudations/mogo-base-services-sdk/src/androidTest/java/com/mogo/base/services/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.mogo.base.services;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith( AndroidJUnit4.class )
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals( "com.mogo.base.services.test", appContext.getPackageName() );
+ }
+}
\ No newline at end of file
diff --git a/foudations/mogo-base-services-sdk/src/main/AndroidManifest.xml b/foudations/mogo-base-services-sdk/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..d7ee25b198
--- /dev/null
+++ b/foudations/mogo-base-services-sdk/src/main/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+ * key - msgType + */ + private Map< Integer, List< IMogoOnMessageListener > > mListeners = new ConcurrentHashMap<>(); + + /** + * 管理消息回执 + *
+ * key - msgId + */ + private Map< Long, IMogoMsgAckListener > mAckListeners = new ConcurrentHashMap<>(); + + + public static final int MAX_CAP = 64; //保证充足的容量应对非常延时的推送 + private ArrayList< Long > mReceivedMsgId = new ArrayList<>( MAX_CAP ); + private int mCurrentIndex = 0; + + @Override + public void init( Context context, String appId ) { + mAppId = appId; + SocketConfig.instance() + .setAppContext( context.getApplicationContext() ) + .setEnvironment( getEnvironment() ) + .setClient( Platform.getClient( Platform.car ) ) + .setAppId( appId ) + .setDebug( DebugConfig.isDebug() ); + SocketMessageDispatcher.getInstance().start( context ); + } + + private Environment getEnvironment() { + switch ( DebugConfig.getNetMode() ) { + case 1: + return Environment.dev; + case 2: + case 4: + return Environment.qa; + case 3: + default: + return Environment.release; + } + } + + @Override + public void update( @NonNull CallbackManager manager, @NonNull byte[] content, String appId, long msgId ) { + try { + MogoConnsvr.Payload payload = MogoConnsvr.Payload.parseFrom( content ); + int msgType = payload.getMsgType(); + Logger.d( TAG, "received msg type = %d", msgType ); + List< IMogoOnMessageListener > listeners = mListeners.get( msgType ); + if ( listeners != null && !listeners.isEmpty() ) { + Iterator< IMogoOnMessageListener > iterator = listeners.iterator(); + if ( msgId != 0 ) { //兼容老版本 + if ( mReceivedMsgId.contains( msgId ) ) { // 避免消息重发 + return; + } + cacheLastReceivedMsgId( msgId ); + } + Object object = null; + while ( iterator.hasNext() ) { + IMogoOnMessageListener listener = iterator.next(); + if ( object == null ) { + object = GsonUtil.objectFromJson( payload.getPayload().toStringUtf8(), listener.target() ); + } + if ( listener != null ) { + Logger.d( TAG, "received msgId = %s, content = %s", msgId, payload.getPayload().toStringUtf8() ); + listener.onMsgReceived( object ); + } + } + } + } catch ( InvalidProtocolBufferException e ) { + Logger.e( TAG, e, "parse msg error." ); + } + } + + @Override + public void onAck( @NonNull CallbackManager manager, @NonNull byte[] headerBytes, byte[] content ) { + try { + MogoConnsvr.Header header = MogoConnsvr.Header.parseFrom( headerBytes ); + int msgType = header.getMsgType(); + String appId = header.getAppId(); + int productLine = header.getProductLine(); + long msgId = header.getMsgId(); + IMogoMsgAckListener listener = mAckListeners.remove( msgId ); + if ( listener != null ) { + listener.onAck( msgId ); + } + Logger.d( TAG, "send message success: msgType = %d, appId = %s, productLine = %d", msgType, appId, productLine ); + } catch ( InvalidProtocolBufferException e ) { + e.printStackTrace(); + } + } + + private void cacheLastReceivedMsgId( long msgId ) { + if ( msgId == 0 ) { + return; + } + synchronized ( this ) { + mReceivedMsgId.add( mCurrentIndex % MAX_CAP, msgId ); + mCurrentIndex++; + } + } + + @Override + public void registerOnMessageListener( int msgType, IMogoOnMessageListener listener ) { + if ( mListeners.containsKey( msgType ) ) { + Logger.w( TAG, "msgType %d is exist.", msgType ); + } + if ( !mListeners.containsKey( msgType ) ) { + mListeners.put( msgType, new ArrayList< IMogoOnMessageListener >() ); + } + mListeners.get( msgType ).add( listener ); + } + + @Override + public void unregisterOnMessageListener( int msgType ) { + mListeners.remove( msgType ); + } + + @Override + public void unregisterOnMessageListener( int msgType, IMogoOnMessageListener listener ) { + if ( listener == null ) { + return; + } + if ( !mListeners.containsKey( msgType ) ) { + return; + } + List< IMogoOnMessageListener > listeners = mListeners.get( msgType ); + if ( listeners != null && listeners.contains( listener ) ) { + listeners.remove( listener ); + } + } + + @Override + public void sendMsg( MsgBody body, IMogoMsgAckListener listener ) { + Logger.d( TAG, "sendMsg." ); + final byte[] pb = convertToPBBytes( body.getMsgType(), objectToBytes( body.getContent() ) ); + RequestUtil.sendPayloadData( mAppId, 2, pb, 1, true, System.currentTimeMillis() ); + } + + public byte[] objectToBytes( Object obj ) { + String jsonStr = GsonUtil.jsonFromObject( obj ); + return jsonStr.getBytes(); + } + + private byte[] convertToPBBytes( int msgType, byte[] payloadBytes ) { + MogoConnsvr.Payload payloadData = MogoConnsvr.Payload.newBuilder() + .setMsgType( msgType ) + .setPayload( ByteString.copyFrom( payloadBytes ) ).build(); + return payloadData.toByteArray(); + } + + public synchronized void release() { + mListeners.clear(); + mListeners = null; + sInstance = null; + } + + + @Override + public void init( Context context ) { + } + +} diff --git a/foudations/mogo-base-services-sdk/src/test/java/com/mogo/base/services/ExampleUnitTest.java b/foudations/mogo-base-services-sdk/src/test/java/com/mogo/base/services/ExampleUnitTest.java new file mode 100644 index 0000000000..ec74ef013f --- /dev/null +++ b/foudations/mogo-base-services-sdk/src/test/java/com/mogo/base/services/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.mogo.base.services; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals( 4, 2 + 2 ); + } +} \ No newline at end of file diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java index 943ad1417d..c38e5425c7 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java @@ -1,9 +1,7 @@ package com.mogo.commons; import android.app.Application; -import android.content.Context; import android.text.TextUtils; -import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; @@ -20,11 +18,7 @@ import com.mogo.commons.network.X509TrustManagerImpl; import com.mogo.commons.storage.SpStorage; import com.mogo.utils.ThreadPoolService; import com.mogo.utils.TipToast; -import com.mogo.utils.logger.Logger; import com.mogo.utils.network.NetConfig; -import com.zhidao.account.sdk.AccountClientManager; -import com.zhidao.account.sdk.callback.TicketInfoCallback; -import com.zhidao.account.sdk.network.NetEnvironManager; import java.io.IOException; import java.security.SecureRandom; @@ -98,7 +92,6 @@ public class AbsMogoApplication extends Application { private void asyncInit() { ThreadPoolService.execute( () -> { initNetConfig(); - initAccountSdk(); // 初始化toast // 初始化埋点 Analytics.getInstance().start( sApp ); @@ -109,37 +102,42 @@ public class AbsMogoApplication extends Application { AnalyticsConfig.getInstance( sApp ).shouldLog( DebugConfig.isDebug() ); Devices.init( getApp() ); Devices.checkBindState(); + asyncInitImpl(); } ); } - private static void initAccountSdk() { - int mode = DebugConfig.getNetMode(); - if ( mode == DebugConfig.NET_MODE_DEMO ) { - // 演示环境用 qa 的 - mode = DebugConfig.NET_MODE_QA; - } - AccountClientManager.init( sApp, mode, NetEnvironManager.OS_2C, "os2.0-launcher" ); - getTicket( new TicketInfoCallback() { - @Override - public void onSuccess( String ticket ) { - SpStorage.setTicket( ticket ); - Logger.w( TAG, "request ticket success" ); - } + protected void asyncInitImpl(){ - @Override - public void onFailure( int code, String msg ) { - Logger.w( TAG, "request ticket error code = %d, msg = %s", code, msg ); - } - } ); } - private static void getTicket( TicketInfoCallback callback ) { - if ( DebugConfig.isLauncher() ) { - AccountClientManager.getTicket( callback ); - } else { - AccountClientManager.getAppTicket( callback ); - } - } +// private static void initAccountSdk() { +// int mode = DebugConfig.getNetMode(); +// if ( mode == DebugConfig.NET_MODE_DEMO ) { +// // 演示环境用 qa 的 +// mode = DebugConfig.NET_MODE_QA; +// } +// AccountClientManager.init( sApp, mode, NetEnvironManager.OS_2C, "os2.0-launcher" ); +// getTicket( new TicketInfoCallback() { +// @Override +// public void onSuccess( String ticket ) { +// SpStorage.setTicket( ticket ); +// Logger.w( TAG, "request ticket success" ); +// } +// +// @Override +// public void onFailure( int code, String msg ) { +// Logger.w( TAG, "request ticket error code = %d, msg = %s", code, msg ); +// } +// } ); +// } +// +// private static void getTicket( TicketInfoCallback callback ) { +// if ( DebugConfig.isLauncher() ) { +// AccountClientManager.getTicket( callback ); +// } else { +// AccountClientManager.getAppTicket( callback ); +// } +// } private static void initNetConfig() { diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/network/Utils.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/network/Utils.java index 21c8991b5a..f4040a23c5 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/network/Utils.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/network/Utils.java @@ -7,6 +7,7 @@ import android.telephony.CellLocation; import android.telephony.TelephonyManager; import android.telephony.cdma.CdmaCellLocation; import android.telephony.gsm.GsmCellLocation; +import android.text.TextUtils; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -55,11 +56,16 @@ public class Utils { public static final String GET = "get"; public static final String GSM_SERIAL = "gsm.serial"; + public static final String BYD_SERIAL = "ro.serialno"; public static final String FOTA_VERSION = "ro.fota.version"; public static final String PROPERTIES = "android.os.SystemProperties"; public static String getSn() { - return getSystemProperties( GSM_SERIAL ); + String sn = getSystemProperties( GSM_SERIAL ); + if ( TextUtils.isEmpty( sn ) ) { + sn = getSystemProperties( BYD_SERIAL ); + } + return sn; } public static String getFotaVersion() { diff --git a/foudations/mogo-connection/src/main/java/com/mogo/connection/socket/MsgBody.java b/foudations/mogo-connection/src/main/java/com/mogo/connection/socket/MsgBody.java deleted file mode 100644 index d2ff058a25..0000000000 --- a/foudations/mogo-connection/src/main/java/com/mogo/connection/socket/MsgBody.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.mogo.connection.socket; - -import com.zhidao.ptech.connsvr.commom.protocol.MogoCommon; -import com.zhidao.ptech.connsvr.protocol.MogoConnsvr; - -/** - * @author congtaowang - * @since 2019-12-31 - *
- * 描述 - */ -public class MsgBody { - - private int mMsgType; - - /** - * 服务端分发,业务线 - */ - private int mProductLine = MogoCommon.Product.mogoBussiness_VALUE; - - /** - * - */ - private int mHeaderType = MogoConnsvr.MsgType.mogoMsgTypeDispatchSvrNoRspReq_VALUE; - - /** - * 是否回执 - */ - private boolean mAck = false; - - /** - * 消息ID - */ - private final long mMsgId = System.currentTimeMillis(); - - private Object mContent; - - public MsgBody msgType( int msgType ) { - this.mMsgType = msgType; - return this; - } - - public MsgBody ack( boolean ack ) { - this.mAck = ack; - return this; - } - - public MsgBody content( Object content ) { - this.mContent = content; - return this; - } - - public int getMsgType() { - return mMsgType; - } - - public int getProductLine() { - return mProductLine; - } - - public int getHeaderType() { - return mHeaderType; - } - - public boolean ismAck() { - return mAck; - } - - public long getMsgId() { - return mMsgId; - } - - public Object getContent() { - return mContent; - } -} diff --git a/gradle.properties b/gradle.properties index da46466c07..70a08e92f1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -71,9 +71,9 @@ MOGO_MODULE_ONLINECAR_VERSION=1.0.3.2 # v2x MOGO_MODULE_V2X_VERSION=1.2.8 # 推送 -MOGO_MODULE_PUSH_VERSION=1.1.5.6 +MOGO_MODULE_PUSH_VERSION=1.1.5.7 MOGO_MODULE_PUSH_BASE_VERSION=1.1.5.5 -MOGO_MODULE_PUSH_NOOP_VERSION=1.1.5.5 +MOGO_MODULE_PUSH_NOOP_VERSION=1.1.5.6 # 广告资源位 MOGO_MODULE_AD_CARD_VERSION=1.0.1 # 探路上报和分享模块 @@ -96,6 +96,10 @@ MOGO_MODULE_OBU_VERSION = 1.2.1.10-SNAPSHOT MOGO_MODULE_SPLASH_VERSION = 1.0.0-SNAPSHOT MOGO_MODULE_SPLASH_NOOP_VERSION = 1.0.0-SNAPSHOT +# 基础服务实现:passport、socket、location +MOGO_BASE_SERVICES_APK_VERSION = 1.0.0 +MOGO_BASE_SERVICES_SDK_VERSION = 1.0.0 + ## 产品库必备配置 applicationId=com.mogo.launcer applicationName=IntelligentPilot diff --git a/modules/mogo-module-main/build.gradle b/modules/mogo-module-main/build.gradle index e06cc617ba..2f686a9f62 100644 --- a/modules/mogo-module-main/build.gradle +++ b/modules/mogo-module-main/build.gradle @@ -50,7 +50,6 @@ dependencies { api rootProject.ext.dependencies.mogoservice api rootProject.ext.dependencies.moduleservice api rootProject.ext.dependencies.moduleapps - api rootProject.ext.dependencies.mogoconnection api rootProject.ext.dependencies.moduleextensions api rootProject.ext.dependencies.mogomoduleback } else { @@ -62,7 +61,6 @@ dependencies { api project(':services:mogo-service-api') api project(':services:mogo-service') api project(':modules:mogo-module-apps') - api project(':foudations:mogo-connection') api project(':modules:mogo-module-extensions') api project(':modules:mogo-module-back') } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/UserDataMarkerInfoWindowAdapter.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/UserDataMarkerInfoWindowAdapter.java index ae5fc33693..31116f19a2 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/UserDataMarkerInfoWindowAdapter.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/UserDataMarkerInfoWindowAdapter.java @@ -96,6 +96,8 @@ public class UserDataMarkerInfoWindowAdapter implements IMogoInfoWindowAdapter { mContent = mInfoWindowView.findViewById( R.id.module_service_id_content ); mTag = mInfoWindowView.findViewById( R.id.module_service_id_tag ); mCall = mInfoWindowView.findViewById( R.id.module_service_id_call ); + + mCall.setVisibility( DebugConfig.getCarMachineType() == DebugConfig.CAR_MACHINE_TYPE_BYD ? View.GONE : View.VISIBLE ); } try { diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java b/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java index af5689f31d..4580f14cf6 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java @@ -14,6 +14,7 @@ import com.mogo.service.fragmentmanager.IMogoFragmentManager; import com.mogo.service.imageloader.IMogoImageloader; import com.mogo.service.intent.IMogoIntentManager; import com.mogo.service.launcher.IMogoLauncher; +import com.mogo.service.locationinfo.IMogoLocationInfoService; import com.mogo.service.map.IMogoMapService; import com.mogo.service.module.IMogoActionManager; import com.mogo.service.module.IMogoAddressManager; @@ -23,6 +24,7 @@ import com.mogo.service.module.IMogoSearchManager; import com.mogo.service.module.IMogoSettingManager; import com.mogo.service.network.IMogoNetwork; import com.mogo.service.obu.IMogoObuManager; +import com.mogo.service.passport.IMogoPassportManager; import com.mogo.service.share.IMogoShareManager; import com.mogo.service.statusmanager.IMogoMsgCenter; import com.mogo.service.statusmanager.IMogoStatusManager; @@ -188,31 +190,50 @@ public interface IMogoServiceApis extends IProvider { /** * 获取顶部1/2屏界面管理类 + * * @return */ IMogoTopViewManager getTopViewManager(); /** * 其他模块调用公共的marker打点 + * * @return */ IMogoMarkerService getMarkerService(); /** * 其他模块调用分享框的显示和隐藏 + * * @return */ IMogoShareManager getShareManager(); /** * 获取obuManager + * * @return obuManager */ IMogoObuManager getObuManager(); /** * 获取事件面板manager + * * @return eventPanelProvider */ IEventPanelProvider getEventPanelManager(); + + /** + * 获取位置上报服务接口 + * + * @return + */ + IMogoLocationInfoService getLocationInfoApi(); + + /** + * 获取位置上报服务接口 + * + * @return + */ + IMogoPassportManager getPassportManagerApi(); } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java b/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java index 5a83ba8509..c9090a0edd 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java @@ -208,4 +208,16 @@ public class MogoServicePaths { */ @Deprecated public static final String PATH_SPLASH = "/splash/api"; + + /** + * 位置上报 + */ + @Deprecated + public static final String PATH_LOCATION_INFO = "/locationinfo/api"; + + /** + * passport + */ + @Deprecated + public static final String PATH_PASSPORT = "/passport/api"; } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/locationinfo/IMogoLocationInfoService.java b/services/mogo-service-api/src/main/java/com/mogo/service/locationinfo/IMogoLocationInfoService.java new file mode 100644 index 0000000000..cd9548372c --- /dev/null +++ b/services/mogo-service-api/src/main/java/com/mogo/service/locationinfo/IMogoLocationInfoService.java @@ -0,0 +1,25 @@ +package com.mogo.service.locationinfo; + +import com.alibaba.android.arouter.facade.template.IProvider; +import com.mogo.map.location.MogoLocation; + +public +/** + * @author congtaowang + * @since 2020/7/16 + * + * 位置服务:上报位置信息和车机状态 + */ +interface IMogoLocationInfoService extends IProvider { + + /** + * 提供位置信息 + * + * @param location + */ + void provideLocation( MogoLocation location ); + + void start(); + + void stop(); +} diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/passport/IMogoPassportManager.java b/services/mogo-service-api/src/main/java/com/mogo/service/passport/IMogoPassportManager.java new file mode 100644 index 0000000000..fb6f7d6b85 --- /dev/null +++ b/services/mogo-service-api/src/main/java/com/mogo/service/passport/IMogoPassportManager.java @@ -0,0 +1,15 @@ +package com.mogo.service.passport; + +import com.alibaba.android.arouter.facade.template.IProvider; + +public +/** + * @author congtaowang + * @since 2020/7/16 + * + * 描述 + */ +interface IMogoPassportManager extends IProvider { + + void requestTicket( IMogoTicketCallback callback ); +} diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/passport/IMogoTicketCallback.java b/services/mogo-service-api/src/main/java/com/mogo/service/passport/IMogoTicketCallback.java new file mode 100644 index 0000000000..306e71c3bd --- /dev/null +++ b/services/mogo-service-api/src/main/java/com/mogo/service/passport/IMogoTicketCallback.java @@ -0,0 +1,15 @@ +package com.mogo.service.passport; + +public +/** + * @author congtaowang + * @since 2020/7/16 + *
+ * ticket 回调 + */ +interface IMogoTicketCallback { + + void onSuccess( String ticket ); + + void onError( int code, String msg ); +} diff --git a/services/mogo-service/build.gradle b/services/mogo-service/build.gradle index 2a95b0f6c7..8f434c63b9 100644 --- a/services/mogo-service/build.gradle +++ b/services/mogo-service/build.gradle @@ -47,7 +47,6 @@ dependencies { implementation rootProject.ext.dependencies.mogoutils implementation rootProject.ext.dependencies.mogocommons implementation rootProject.ext.dependencies.mogoserviceapi - implementation rootProject.ext.dependencies.mogoconnection implementation rootProject.ext.dependencies.modulecommon } else { api project(":libraries:mogo-map") @@ -55,7 +54,6 @@ dependencies { implementation project(":foudations:mogo-utils") implementation project(":foudations:mogo-commons") implementation project(":services:mogo-service-api") - implementation project(":foudations:mogo-connection") implementation project(":modules:mogo-module-common") } } diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java b/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java index b65fe03b70..7881bc7374 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java @@ -5,7 +5,6 @@ import android.content.Context; import com.alibaba.android.arouter.facade.annotation.Route; import com.alibaba.android.arouter.facade.template.IProvider; import com.alibaba.android.arouter.launcher.ARouter; -import com.mogo.connection.socket.SocketManager; import com.mogo.service.IMogoServiceApis; import com.mogo.service.MogoServicePaths; import com.mogo.service.adas.IMogoADASController; @@ -23,6 +22,7 @@ import com.mogo.service.impl.intent.IntentManager; import com.mogo.service.impl.singleton.SingletonsHolder; import com.mogo.service.intent.IMogoIntentManager; import com.mogo.service.launcher.IMogoLauncher; +import com.mogo.service.locationinfo.IMogoLocationInfoService; import com.mogo.service.map.IMogoMapService; import com.mogo.service.module.IMogoActionManager; import com.mogo.service.module.IMogoAddressManager; @@ -32,6 +32,7 @@ import com.mogo.service.module.IMogoSearchManager; import com.mogo.service.module.IMogoSettingManager; import com.mogo.service.network.IMogoNetwork; import com.mogo.service.obu.IMogoObuManager; +import com.mogo.service.passport.IMogoPassportManager; import com.mogo.service.share.IMogoShareManager; import com.mogo.service.statusmanager.IMogoMsgCenter; import com.mogo.service.statusmanager.IMogoStatusManager; @@ -61,7 +62,7 @@ public class MogoServiceApis implements IMogoServiceApis { @Override public IMogoSocketManager getSocketManagerApi( Context context ) { - return SocketManager.getInstance( context ); + return getApiInstance( IMogoSocketManager.class, MogoServicePaths.PATH_SOCKET_MANAGER ); } @Override @@ -176,20 +177,30 @@ public class MogoServiceApis implements IMogoServiceApis { @Override public IMogoShareManager getShareManager() { - return getApiInstance(IMogoShareManager.class,MogoServicePaths.PATH_SHARE); + return getApiInstance( IMogoShareManager.class, MogoServicePaths.PATH_SHARE ); } @Override public IMogoObuManager getObuManager() { - return getApiInstance(IMogoObuManager.class, MogoServicePaths.PATH_OBU); + return getApiInstance( IMogoObuManager.class, MogoServicePaths.PATH_OBU ); } @Override public IEventPanelProvider getEventPanelManager() { - return getApiInstance(IEventPanelProvider.class, MogoServicePaths.PATH_EVENT_PANEL); + return getApiInstance( IEventPanelProvider.class, MogoServicePaths.PATH_EVENT_PANEL ); } - private static < T extends IProvider > T getApiInstance(Class< T > clazz, String path ) { + @Override + public IMogoLocationInfoService getLocationInfoApi() { + return getApiInstance( IMogoLocationInfoService.class, MogoServicePaths.PATH_LOCATION_INFO ); + } + + @Override + public IMogoPassportManager getPassportManagerApi() { + return getApiInstance( IMogoPassportManager.class, MogoServicePaths.PATH_PASSPORT ); + } + + private static < T extends IProvider > T getApiInstance( Class< T > clazz, String path ) { T inst = SingletonsHolder.get( clazz ); if ( inst == null ) { synchronized ( sLock ) { diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/connection/MogoSocketManager.java b/services/mogo-service/src/main/java/com/mogo/service/impl/connection/MogoSocketManager.java index 1984aee994..ba4e8154e6 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/connection/MogoSocketManager.java +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/connection/MogoSocketManager.java @@ -3,12 +3,14 @@ package com.mogo.service.impl.connection; import android.content.Context; import com.alibaba.android.arouter.facade.annotation.Route; -import com.mogo.connection.socket.SocketManager; import com.mogo.service.MogoServicePaths; import com.mogo.service.connection.IMogoMsgAckListener; import com.mogo.service.connection.IMogoOnMessageListener; import com.mogo.service.connection.IMogoSocketManager; import com.mogo.service.connection.MsgBody; +import com.mogo.utils.logger.Logger; + +import java.lang.reflect.Method; /** * @author congtaowang @@ -19,6 +21,7 @@ import com.mogo.service.connection.MsgBody; @Route( path = MogoServicePaths.PATH_SOCKET_MANAGER ) public class MogoSocketManager implements IMogoSocketManager { + private static final String TAG = "MogoSocketManager"; private IMogoSocketManager mDelegate; @Override @@ -58,6 +61,18 @@ public class MogoSocketManager implements IMogoSocketManager { @Override public void init( Context context ) { - mDelegate = SocketManager.getInstance( context ); + + try { + Class< ? > clazz = Class.forName( "com.mogo.base.services.socket.SocketManager" ); + Method getInstanceMethod = clazz.getMethod( "getInstance", Context.class ); + getInstanceMethod.setAccessible( true ); + mDelegate = ( IMogoSocketManager ) getInstanceMethod.invoke( null, context ); + } catch ( Exception e ) { + Logger.e( TAG, e, "error." ); + } + + if ( mDelegate != null ) { + mDelegate.init( context ); + } } } diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/locationinfo/MogoLocationInfoService.java b/services/mogo-service/src/main/java/com/mogo/service/impl/locationinfo/MogoLocationInfoService.java new file mode 100644 index 0000000000..9f5135aa35 --- /dev/null +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/locationinfo/MogoLocationInfoService.java @@ -0,0 +1,64 @@ +package com.mogo.service.impl.locationinfo; + +import android.content.Context; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.map.location.MogoLocation; +import com.mogo.service.MogoServicePaths; +import com.mogo.service.locationinfo.IMogoLocationInfoService; +import com.mogo.utils.logger.Logger; + +import java.lang.reflect.Method; + +public +/** + * @author congtaowang + * @since 2020/7/16 + * + * 描述 + */ +@Route( path = MogoServicePaths.PATH_LOCATION_INFO ) +class MogoLocationInfoService implements IMogoLocationInfoService { + + private static final String TAG = "MogoLocationInfoService"; + + private IMogoLocationInfoService mDelegate; + + @Override + public void provideLocation( MogoLocation location ) { + if ( mDelegate != null ) { + mDelegate.provideLocation( location ); + } + } + + @Override + public void start() { + if ( mDelegate != null ) { + mDelegate.start(); + } + } + + @Override + public void stop() { + if ( mDelegate != null ) { + mDelegate.stop(); + } + } + + @Override + public void init( Context context ) { + + try { + Class< ? > clazz = Class.forName( "com.mogo.base.services.locationinfo.MogoLocationInfoServices" ); + Method getInstanceMethod = clazz.getMethod( "getInstance" ); + getInstanceMethod.setAccessible( true ); + mDelegate = ( IMogoLocationInfoService ) getInstanceMethod.invoke( null ); + } catch ( Exception e ) { + Logger.e( TAG, e, "error." ); + } + + if ( mDelegate != null ) { + mDelegate.init( context ); + } + } +} diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/passport/MogoPassportManager.java b/services/mogo-service/src/main/java/com/mogo/service/impl/passport/MogoPassportManager.java new file mode 100644 index 0000000000..b9f4aba0bf --- /dev/null +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/passport/MogoPassportManager.java @@ -0,0 +1,49 @@ +package com.mogo.service.impl.passport; + +import android.content.Context; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.service.MogoServicePaths; +import com.mogo.service.connection.IMogoSocketManager; +import com.mogo.service.passport.IMogoPassportManager; +import com.mogo.service.passport.IMogoTicketCallback; +import com.mogo.utils.logger.Logger; + +import java.lang.reflect.Method; + +public +/** + * @author congtaowang + * @since 2020/7/16 + * + * 描述 + */ +@Route( path = MogoServicePaths.PATH_PASSPORT ) +class MogoPassportManager implements IMogoPassportManager { + + private static final String TAG = "MogoPassportManager"; + + private IMogoPassportManager mDelegate; + + @Override + public void requestTicket( IMogoTicketCallback callback ) { + if ( mDelegate != null ) { + mDelegate.requestTicket( callback ); + } + } + + @Override + public void init( Context context ) { + try { + Class< ? > clazz = Class.forName( "com.mogo.base.services.passport.PassportManager" ); + Method getInstanceMethod = clazz.getMethod( "getInstance" ); + getInstanceMethod.setAccessible( true ); + mDelegate = ( IMogoPassportManager ) getInstanceMethod.invoke( null ); + } catch ( Exception e ) { + Logger.e( TAG, e, "error." ); + } + if ( mDelegate != null ) { + mDelegate.init( context ); + } + } +} diff --git a/settings.gradle b/settings.gradle index 517b853c59..57fe30c6f1 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,5 @@ +include ':foudations:mogo-base-services-apk' +include ':foudations:mogo-base-services-sdk' include ':modules:mogo-module-splash-noop' include ':modules:mogo-module-splash' include ':modules:mogo-module-left-panel-noop' @@ -25,7 +27,7 @@ include ':libraries:map-amap' include ':libraries:mogo-map-api' include ':modules:mogo-module-apps' include ':modules:mogo-module-extensions' -include ':foudations:mogo-connection' +//include ':foudations:mogo-connection' include ':modules:mogo-module-gps-simulator' include ':modules:mogo-module-gps-simulator-debug' include ':modules:mogo-module-gps-simulator-noop' diff --git a/upload.sh b/upload.sh index 90133449ee..ca7a1df0d9 100755 --- a/upload.sh +++ b/upload.sh @@ -4,7 +4,6 @@ ./gradlew :foudations:mogo-commons:clean :foudations:mogo-commons:uploadArchives ./gradlew :libraries:mogo-map-api:clean :libraries:mogo-map-api:uploadArchives ./gradlew :services:mogo-service-api:clean :services:mogo-service-api:uploadArchives -./gradlew :foudations:mogo-connection:clean :foudations:mogo-connection:uploadArchives ./gradlew :libraries:map-amap:clean :libraries:map-amap:uploadArchives ./gradlew :libraries:map-autonavi:clean :libraries:map-autonavi:uploadArchives ./gradlew :libraries:mogo-map:clean :libraries:mogo-map:uploadArchives @@ -32,4 +31,6 @@ ./gradlew :modules:mogo-module-left-panel:clean :modules:mogo-module-left-panel:uploadArchives ./gradlew :modules:mogo-module-left-panel-noop:clean :modules:mogo-module-left-panel-noop:uploadArchives ./gradlew :modules:mogo-module-byd:clean :modules:mogo-module-byd:uploadArchives +./gradlew :foudations:mogo-base-services-apk:clean :foudations:mogo-base-services-apk:uploadArchives +./gradlew :foudations:mogo-base-services-sdk:clean :foudations:mogo-base-services-sdk:uploadArchives