From 85c014ce6989ce18278179e19f66d4c0b29cd515 Mon Sep 17 00:00:00 2001 From: "jun.xia@click-v.com" Date: Wed, 16 Aug 2017 12:34:57 +0800 Subject: [PATCH] =?UTF-8?q?1=20=E4=BF=AE=E6=94=B9SDK=E4=B8=AD=E5=81=B6?= =?UTF-8?q?=E7=84=B6=E5=87=BA=E7=8E=B0sqlite=E9=94=81=E5=BA=93=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=202=20=E4=BF=AE=E6=94=B9sendbody=E4=BC=A0nul?= =?UTF-8?q?l=E5=80=BC=20=E5=AF=BC=E8=87=B4=E5=BC=82=E5=B8=B8=E6=AD=BB?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3.0.0.VERSION => 3.1.0.VERSION | 0 README.md | 2 +- cim_for_mina/cim-android-sdk/.classpath | 2 +- .../cim/sdk/android/CIMCacheManager.java | 109 +++++++ .../cim/sdk/android/CIMCacheProvider.java | 74 +++++ .../cim/sdk/android/CIMCacheToolkit.java | 170 ----------- .../cim/sdk/android/CIMConnectorManager.java | 33 +- .../android/CIMEventBroadcastReceiver.java | 37 +-- .../cim/sdk/android/CIMEventListener.java | 2 +- .../cim/sdk/android/CIMListenerManager.java | 2 +- .../cim/sdk/android/CIMPushManager.java | 51 ++-- .../cim/sdk/android/CIMPushService.java | 12 +- .../cim/sdk/android/constant/CIMConstant.java | 7 +- .../exception/NetworkDisabledException.java | 9 +- ...ption.java => SessionClosedException.java} | 9 +- .../filter/ClientMessageCodecFactory.java | 2 +- .../android/filter/ClientMessageDecoder.java | 2 +- .../android/filter/ClientMessageEncoder.java | 2 +- .../sdk/android/model/HeartbeatRequest.java | 2 +- .../sdk/android/model/HeartbeatResponse.java | 2 +- .../cim/sdk/android/model/Message.java | 2 +- .../cim/sdk/android/model/Protobufable.java | 2 +- .../cim/sdk/android/model/ReplyBody.java | 26 +- .../cim/sdk/android/model/SentBody.java | 17 +- .../sdk/android/model/proto/MessageProto.java | 24 +- .../android/model/proto/ReplyBodyProto.java | 24 +- .../android/model/proto/SentBodyProto.java | 24 +- .../cim-client-android/.idea/compiler.xml | 22 ++ .../.idea/copyright/profiles_settings.xml | 3 + .../cim-client-android/.idea/gradle.xml | 18 ++ .../cim-client-android/.idea/misc.xml | 59 ---- .../cim-client-android/.idea/modules.xml | 9 + .../.idea/runConfigurations.xml | 12 + .../cim-client-android/app/build.gradle | 8 +- .../app/libs/cim-server-sdk-3.0.jar | Bin 87773 -> 0 bytes .../app/libs/cim-server-sdk-3.1.jar | Bin 0 -> 88119 bytes .../app/src/main/AndroidManifest.xml | 12 +- .../farsunset/ichat/example/app/Constant.java | 2 +- cim_for_mina/cim-client-android/build.gradle | 2 +- cim_for_mina/cim-server/.classpath | 6 +- cim_for_netty/cim-android-sdk/.classpath | 2 +- .../cim/sdk/android/CIMCacheManager.java | 109 +++++++ .../cim/sdk/android/CIMCacheProvider.java | 74 +++++ .../cim/sdk/android/CIMConnectorManager.java | 21 +- .../android/CIMEventBroadcastReceiver.java | 37 +-- .../cim/sdk/android/CIMEventListener.java | 2 +- .../cim/sdk/android/CIMListenerManager.java | 2 +- .../cim/sdk/android/CIMPushManager.java | 51 ++-- .../cim/sdk/android/CIMPushService.java | 12 +- .../cim/sdk/android/constant/CIMConstant.java | 11 +- .../exception/NetworkDisabledException.java | 9 +- ...ption.java => SessionClosedException.java} | 9 +- .../android/filter/ClientMessageDecoder.java | 2 + .../sdk/android/model/HeartbeatRequest.java | 2 +- .../sdk/android/model/HeartbeatResponse.java | 2 +- .../cim/sdk/android/model/Message.java | 2 +- .../cim/sdk/android/model/Protobufable.java | 2 +- .../cim/sdk/android/model/ReplyBody.java | 26 +- .../cim/sdk/android/model/SentBody.java | 17 +- .../sdk/android/model/proto/MessageProto.java | 24 +- .../android/model/proto/ReplyBodyProto.java | 24 +- .../android/model/proto/SentBodyProto.java | 24 +- .../cim-client-android/.idea/encodings.xml | 6 - .../cim-client-android/.idea/gradle.xml | 3 +- .../cim-client-android/.idea/misc.xml | 64 +--- .../.idea/qaplug_profiles.xml | 289 ------------------ .../cim-client-android/app/build.gradle | 12 +- .../app/libs/cim-server-sdk-3.0.jar | Bin 87027 -> 0 bytes .../app/libs/cim-server-sdk-3.1.jar | Bin 0 -> 89833 bytes .../app/src/main/AndroidManifest.xml | 12 +- .../farsunset/ichat/example/app/Constant.java | 2 +- .../receiver/CIMPushManagerReceiver.java | 1 - .../ichat/example/ui/LoginActivity.java | 4 +- .../ichat/example/ui/SplanshActivity.java | 9 +- cim_for_netty/cim-client-android/build.gradle | 2 +- 75 files changed, 688 insertions(+), 981 deletions(-) rename 3.0.0.VERSION => 3.1.0.VERSION (100%) create mode 100644 cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheManager.java create mode 100644 cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheProvider.java delete mode 100644 cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheToolkit.java rename cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetworkDisconnectedException.java => cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetworkDisabledException.java (82%) rename cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/{SessionDisconnectedException.java => SessionClosedException.java} (83%) create mode 100644 cim_for_mina/cim-client-android/.idea/compiler.xml create mode 100644 cim_for_mina/cim-client-android/.idea/copyright/profiles_settings.xml create mode 100644 cim_for_mina/cim-client-android/.idea/gradle.xml create mode 100644 cim_for_mina/cim-client-android/.idea/modules.xml create mode 100644 cim_for_mina/cim-client-android/.idea/runConfigurations.xml delete mode 100644 cim_for_mina/cim-client-android/app/libs/cim-server-sdk-3.0.jar create mode 100644 cim_for_mina/cim-client-android/app/libs/cim-server-sdk-3.1.jar create mode 100644 cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheManager.java create mode 100644 cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheProvider.java rename cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetworkDisconnectedException.java => cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetworkDisabledException.java (82%) rename cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/{SessionDisconnectedException.java => SessionClosedException.java} (83%) delete mode 100644 cim_for_netty/cim-client-android/.idea/encodings.xml delete mode 100644 cim_for_netty/cim-client-android/.idea/qaplug_profiles.xml delete mode 100644 cim_for_netty/cim-client-android/app/libs/cim-server-sdk-3.0.jar create mode 100644 cim_for_netty/cim-client-android/app/libs/cim-server-sdk-3.1.jar diff --git a/3.0.0.VERSION b/3.1.0.VERSION similarity index 100% rename from 3.0.0.VERSION rename to 3.1.0.VERSION diff --git a/README.md b/README.md index 752aa22..2147d5c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ #说明: 此开源版本为基础功能版本,只有消息推送的基础功能!netty版本,和mina版本结构和功能完全一致,大家可以选择自己喜欢的或者合适的版本学习或者使用! -#侣信专业版2.2.0版本发布 +#侣信专业版2.2.3版本发布 #[http://farsunset.com](http://farsunset.com) diff --git a/cim_for_mina/cim-android-sdk/.classpath b/cim_for_mina/cim-android-sdk/.classpath index 7e9f666..a46165e 100644 --- a/cim_for_mina/cim-android-sdk/.classpath +++ b/cim_for_mina/cim-android-sdk/.classpath @@ -3,8 +3,8 @@ - + diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheManager.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheManager.java new file mode 100644 index 0000000..eae048b --- /dev/null +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheManager.java @@ -0,0 +1,109 @@ +/** + * Copyright 2013-2033 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.sdk.android; + +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +class CIMCacheManager { + + + public static final String CIM_CONFIG_INFO = "CIM_CONFIG_INFO"; + + public static final String KEY_ACCOUNT = "KEY_ACCOUNT"; + + public static final String KEY_MANUAL_STOP = "KEY_MANUAL_STOP"; + + public static final String KEY_CIM_DESTROYED = "KEY_CIM_DESTROYED"; + + public static final String KEY_CIM_SERVIER_HOST = "KEY_CIM_SERVIER_HOST"; + + public static final String KEY_CIM_SERVIER_PORT = "KEY_CIM_SERVIER_PORT"; + + public static final String KEY_CIM_CONNECTION_STATE = "KEY_CIM_CONNECTION_STATE"; + + + public static void remove(Context context ,String key) + { + ContentResolver resolver = context.getContentResolver(); + resolver.delete(Uri.parse(CIMCacheProvider.CONTENT_URI), key, null); + } + + + public static void putString(Context context ,String key,String value) + { + + ContentResolver resolver = context.getContentResolver(); + ContentValues values = new ContentValues(); + values.put("value", value); + values.put("key", key); + resolver.insert(Uri.parse(CIMCacheProvider.CONTENT_URI), values); + + } + + public static String getString(Context context ,String key) + { + String value = null; + ContentResolver resolver = context.getContentResolver(); + Cursor cursor = resolver.query(Uri.parse(CIMCacheProvider.CONTENT_URI), new String[]{key}, null,null,null); + if (cursor!=null && cursor.moveToFirst()) + { + value = cursor.getString(0); + cursor.close(); + } + closeQuietly(cursor); + return value; + } + + private static void closeQuietly(Cursor cursor){ + try{ + if(cursor!=null) + cursor.close(); + }catch(Exception e){} + } + + public static void putBoolean(Context context,String key,boolean value) + { + putString(context,key,Boolean.toString(value)); + } + + public static boolean getBoolean(Context context,String key) + { + String value = getString(context,key); + return value == null?false:Boolean.parseBoolean(value); + } + + + public static void putInt(Context context,String key,int value) + { + putString(context,key, String.valueOf(value)); + } + + public static int getInt(Context context,String key) + { + String value = getString(context,key); + return value == null?0:Integer.parseInt(value); + } + +} diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheProvider.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheProvider.java new file mode 100644 index 0000000..3109416 --- /dev/null +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheProvider.java @@ -0,0 +1,74 @@ +/** + * Copyright 2013-2033 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.sdk.android; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.MatrixCursor; +import android.net.Uri; + +public class CIMCacheProvider extends ContentProvider { + public static final String CONTENT_URI="content://com.farsunset.cim.provider"; + static final String MODEL_KEY = "PRIVATE_CIM_CONFIG"; + + + @Override + public int delete(Uri arg0, String key, String[] arg2) { + getContext().getSharedPreferences(MODEL_KEY, Context.MODE_PRIVATE).edit().remove(key).apply(); + return 0; + } + + @Override + public String getType(Uri arg0) { + return null; + } + + @Override + public Uri insert(Uri arg0, ContentValues values) { + String key = values.getAsString("key"); + String value = values.getAsString("value"); + getContext().getSharedPreferences(MODEL_KEY, Context.MODE_PRIVATE).edit().putString(key, value).apply(); + return null; + } + + @Override + public boolean onCreate() { + return true; + } + + @Override + public Cursor query(Uri arg0, String[] arg1, String key, String[] arg3, String arg4) { + MatrixCursor cursor = new MatrixCursor(new String[]{"value"}); + String value = getContext().getSharedPreferences(MODEL_KEY, Context.MODE_PRIVATE).getString(arg1[0], null); + cursor.addRow(new Object[]{value}); + return cursor; + } + + @Override + public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) { + return 0; + } + + +} diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheToolkit.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheToolkit.java deleted file mode 100644 index 4557dab..0000000 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheToolkit.java +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *************************************************************************************** - * * - * Website : http://www.farsunset.com * - * * - *************************************************************************************** - */ -package com.farsunset.cim.sdk.android; - -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; - -class CIMCacheToolkit extends SQLiteOpenHelper { - - private static final String DATABASE_NAME = "CIM_CONFIG_INFO.db"; - private static final int DATABASE_VERSION = 20160406; - private static final String TABLE_NAME = "T_CIM_CONFIG"; - private static CIMCacheToolkit toolkit; - - private static final String TABLE_SQL = "CREATE TABLE IF NOT EXISTS "+TABLE_NAME+" (KEY VARCHAR(64) PRIMARY KEY,VALUE TEXT)"; - - private static final String DELETE_SQL = "DELETE FROM "+TABLE_NAME+" WHERE KEY = ?"; - - private static final String QUERY_SQL = "SELECT VALUE FROM "+TABLE_NAME+" WHERE KEY = ?"; - - private SQLiteDatabase mSQLiteDatabase; - - public static final String CIM_CONFIG_INFO = "CIM_CONFIG_INFO"; - - public static final String KEY_ACCOUNT = "KEY_ACCOUNT"; - - public static final String KEY_MANUAL_STOP = "KEY_MANUAL_STOP"; - - public static final String KEY_CIM_DESTROYED = "KEY_CIM_DESTROYED"; - - public static final String KEY_CIM_SERVIER_HOST = "KEY_CIM_SERVIER_HOST"; - - public static final String KEY_CIM_SERVIER_PORT = "KEY_CIM_SERVIER_PORT"; - - public static final String KEY_CIM_CONNECTION_STATE = "KEY_CIM_CONNECTION_STATE"; - - - public synchronized static CIMCacheToolkit getInstance(Context context){ - - if(toolkit==null){ - toolkit = new CIMCacheToolkit(context); - } - - return toolkit; - } - - - public CIMCacheToolkit(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { - super(context, name, factory, version); - } - - public CIMCacheToolkit(Context context){ - this(context, DATABASE_NAME,null, DATABASE_VERSION); - } - - - public synchronized void remove(String key) - { - getSQLiteDatabase().execSQL(DELETE_SQL,new String[]{key}); - } - - - public synchronized void putString(String key,String value) - { - - ContentValues values = new ContentValues(); - values.put("VALUE", value); - int result = getSQLiteDatabase().updateWithOnConflict(TABLE_NAME, values, "KEY=?",new String[]{key},SQLiteDatabase.CONFLICT_FAIL); - if(result<=0){ - - values.put("KEY", key); - getSQLiteDatabase().insert(TABLE_NAME, null, values); - } - - } - - public synchronized String getString(String key) - { - String value = null; - Cursor cursor = getSQLiteDatabase().rawQuery(QUERY_SQL, new String[]{key}); - if (cursor!=null) - { - if(cursor.moveToFirst()){ - value = cursor.getString(0); - } - - cursor.close(); - } - - return value; - } - - public void putBoolean(String key,boolean value) - { - putString(key,Boolean.toString(value)); - } - - public boolean getBoolean(String key) - { - String value = getString(key); - return value == null?false:Boolean.parseBoolean(value); - } - - - public void putInt(String key,int value) - { - putString(key, String.valueOf(value)); - } - - public int getInt(String key) - { - String value = getString(key); - return value == null?0:Integer.parseInt(value); - } - - @Override - public void onCreate(SQLiteDatabase database) { - database.execSQL(TABLE_SQL); - } - - - public static synchronized void destroy(){ - if (toolkit!=null){ - try{toolkit.mSQLiteDatabase.close();}catch(Exception e){} - try{toolkit.close();}catch(Exception e){} - } - - toolkit = null; - - } - - - private SQLiteDatabase getSQLiteDatabase(){ - if(mSQLiteDatabase!=null){ - return mSQLiteDatabase; - }else - { - mSQLiteDatabase = getWritableDatabase(); - } - return mSQLiteDatabase; - } - - - @Override - public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { - - } -} diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java index 4bb71ed..6589742 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,6 @@ *************************************************************************************** */ package com.farsunset.cim.sdk.android; -import java.io.Serializable; import java.net.InetSocketAddress; import java.util.Map; import java.util.Random; @@ -44,8 +43,8 @@ import android.net.NetworkInfo; import android.util.Log; import com.farsunset.cim.sdk.android.constant.CIMConstant; -import com.farsunset.cim.sdk.android.exception.SessionDisconnectedException; -import com.farsunset.cim.sdk.android.exception.NetworkDisconnectedException; +import com.farsunset.cim.sdk.android.exception.SessionClosedException; +import com.farsunset.cim.sdk.android.exception.NetworkDisabledException; import com.farsunset.cim.sdk.android.filter.ClientMessageCodecFactory; import com.farsunset.cim.sdk.android.model.HeartbeatRequest; import com.farsunset.cim.sdk.android.model.HeartbeatResponse; @@ -66,7 +65,7 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageF private final int WRITE_TIMEOUT = 10 * 1000;//秒 private final int READ_IDLE_TIME = 120;//秒 - private final int HEARBEAT_TIME_OUT = (READ_IDLE_TIME + 20) * 1000;// 收到服务端心跳请求超时时间 毫秒 + private final int HEARBEAT_TIME_OUT = (READ_IDLE_TIME + 10) * 1000;// 收到服务端心跳请求超时时间 毫秒 private final String KEY_LAST_HEART_TIME = "KEY_LAST_HEART_TIME" ; private NioSocketConnector connector; @@ -117,7 +116,7 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageF Log.i(TAG, "****************CIM正在连接服务器 "+host+":"+port+"......"); - CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_CONNECTION_STATE, false); + CIMCacheManager.putBoolean(context,CIMCacheManager.KEY_CIM_CONNECTION_STATE, false); InetSocketAddress remoteSocketAddress = new InetSocketAddress(host, port); connectFuture = connector.connect(remoteSocketAddress); connectFuture.awaitUninterruptibly(); @@ -128,7 +127,7 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageF Intent intent = new Intent(); intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED); - intent.putExtra(Exception.class.getName(), e); + intent.putExtra(Exception.class.getName(), e.getClass().getSimpleName()); intent.putExtra("interval", interval); context.sendBroadcast(intent); @@ -144,7 +143,7 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageF Intent intent = new Intent(); intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED); - intent.putExtra(Exception.class.getName(), new NetworkDisconnectedException()); + intent.putExtra(Exception.class.getName(),NetworkDisabledException.class.getSimpleName()); context.sendBroadcast(intent); return; @@ -163,7 +162,7 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageF boolean isSuccessed = false; - Throwable exception = new SessionDisconnectedException(); + String exceptionName =SessionClosedException.class.getSimpleName(); IoSession session = getCurrentSession(); if(session!=null && session.isConnected()) @@ -172,18 +171,16 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageF // 消息发送超时 5秒 wf.awaitUninterruptibly(WRITE_TIMEOUT); isSuccessed = wf.isWritten(); - - if(wf.getException() instanceof Serializable) + if(wf.getException() != null) { - exception = wf.getException(); + exceptionName =wf.getException().getClass().getSimpleName(); } - } if(!isSuccessed){ Intent intent = new Intent(); intent.setAction(CIMConstant.IntentAction.ACTION_SENT_FAILED); - intent.putExtra(Exception.class.getName(),exception); + intent.putExtra(Exception.class.getName(),exceptionName); intent.putExtra(SentBody.class.getName(), body); context.sendBroadcast(intent); } @@ -200,9 +197,6 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageF connector.dispose(); } - - CIMCacheToolkit.destroy(); - manager = null; } @@ -286,11 +280,6 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageF if(cause!=null && cause.getMessage()!=null){ Log.e(TAG, cause.getMessage()); } - - Intent intent = new Intent(); - intent.setAction(CIMConstant.IntentAction.ACTION_UNCAUGHT_EXCEPTION); - intent.putExtra(Exception.class.getName(), cause); - context.sendBroadcast(intent); } @Override diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java index 596b8f2..8feddb0 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,9 +22,8 @@ package com.farsunset.cim.sdk.android; - import com.farsunset.cim.sdk.android.constant.CIMConstant; -import com.farsunset.cim.sdk.android.exception.SessionDisconnectedException; +import com.farsunset.cim.sdk.android.exception.SessionClosedException; import com.farsunset.cim.sdk.android.model.Message; import com.farsunset.cim.sdk.android.model.ReplyBody; import com.farsunset.cim.sdk.android.model.SentBody; @@ -55,7 +54,6 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver{ { startPushService(); } - /* * 设备网络状态变化事件 @@ -80,7 +78,8 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver{ if(intent.getAction().equals(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED)) { long interval = intent.getLongExtra("interval", CIMConstant.RECONN_INTERVAL_TIME); - onConnectionFailed((Exception) intent.getSerializableExtra(Exception.class.getName()),interval); + String exceptionName = intent.getStringExtra(Exception.class.getName()); + onConnectionFailed(exceptionName,interval); } /* @@ -114,9 +113,9 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver{ */ if(intent.getAction().equals(CIMConstant.IntentAction.ACTION_SENT_FAILED)) { - Exception exception = (Exception) intent.getSerializableExtra(Exception.class.getName()); + String exceptionName = intent.getStringExtra(Exception.class.getName()); SentBody sentBody = (SentBody)intent.getSerializableExtra(SentBody.class.getName()); - onSentFailed(exception,sentBody); + onSentFailed(exceptionName,sentBody); } /* @@ -128,15 +127,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver{ } - /* - * 获取cim数据传输异常事件 - */ - if(intent.getAction().equals(CIMConstant.IntentAction.ACTION_UNCAUGHT_EXCEPTION)) - { - onUncaughtException((Exception)intent.getSerializableExtra(Exception.class.getName())); - } - - + /* * 重新连接,如果断开的话 */ @@ -153,7 +144,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver{ } private void onInnerConnectionClosed(){ - CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_CONNECTION_STATE, false); + CIMCacheManager.putBoolean(context,CIMCacheManager.KEY_CIM_CONNECTION_STATE, false); if(CIMConnectorManager.isNetworkConnected(context)) { CIMPushManager.connect(context,0); @@ -162,7 +153,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver{ onConnectionClosed(); } - private void onConnectionFailed(Exception e,long reinterval){ + private void onConnectionFailed(String exceptionName,long reinterval){ if(CIMConnectorManager.isNetworkConnected(context)) { @@ -173,14 +164,12 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver{ } private void onInnerConnectionSuccessed(){ - CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_CONNECTION_STATE, true); + CIMCacheManager.putBoolean(context,CIMCacheManager.KEY_CIM_CONNECTION_STATE, true); boolean autoBind = CIMPushManager.autoBindAccount(context); onConnectionSuccessed(autoBind); } - private void onUncaughtException(Throwable arg0) {} - private void onDevicesNetworkChanged(NetworkInfo info) { if(info !=null) @@ -202,13 +191,13 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver{ private boolean isForceOfflineMessage(String action) { - return CIMConstant.MessageAction.ACTION_999.equals(action) || CIMConstant.MessageAction.ACTION_444.equals(action); + return CIMConstant.MessageAction.ACTION_999.equals(action); } - private void onSentFailed(Exception e, SentBody body){ + private void onSentFailed(String exceptionName, SentBody body){ //与服务端端开链接,重新连接 - if(e instanceof SessionDisconnectedException) + if(SessionClosedException.class.getSimpleName().equals(exceptionName)) { CIMPushManager.connect(context,0); }else diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventListener.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventListener.java index 1bc8191..b936dc6 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventListener.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventListener.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMListenerManager.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMListenerManager.java index 0008d0d..1826f00 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMListenerManager.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMListenerManager.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java index 6d27800..9bff670 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,6 +48,7 @@ public class CIMPushManager { static String KEY_SEND_BODY ="KEY_SEND_BODY"; + static String KEY_CIM_CONNECTION_STATUS ="KEY_CIM_CONNECTION_STATUS"; /** * 初始化,连接服务端,在程序启动页或者 在Application里调用 @@ -63,20 +64,20 @@ public class CIMPushManager { private static void connect(Context context,String ip,int port,boolean autoBind,long delayedTime){ - CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED, false); - CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_MANUAL_STOP, false); + CIMCacheManager.putBoolean(context,CIMCacheManager.KEY_CIM_DESTROYED, false); + CIMCacheManager.putBoolean(context,CIMCacheManager.KEY_MANUAL_STOP, false); - CIMCacheToolkit.getInstance(context).putString( CIMCacheToolkit.KEY_CIM_SERVIER_HOST, ip); - CIMCacheToolkit.getInstance(context).putInt( CIMCacheToolkit.KEY_CIM_SERVIER_PORT, port); + CIMCacheManager.putString(context, CIMCacheManager.KEY_CIM_SERVIER_HOST, ip); + CIMCacheManager.putInt(context, CIMCacheManager.KEY_CIM_SERVIER_PORT, port); if(!autoBind) { - CIMCacheToolkit.getInstance(context).remove(CIMCacheToolkit.KEY_ACCOUNT); + CIMCacheManager.remove(context,CIMCacheManager.KEY_ACCOUNT); } Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.putExtra(CIMCacheToolkit.KEY_CIM_SERVIER_HOST, ip); - serviceIntent.putExtra(CIMCacheToolkit.KEY_CIM_SERVIER_PORT, port); + serviceIntent.putExtra(CIMCacheManager.KEY_CIM_SERVIER_HOST, ip); + serviceIntent.putExtra(CIMCacheManager.KEY_CIM_SERVIER_PORT, port); serviceIntent.putExtra(CIMPushService.KEY_DELAYED_TIME, delayedTime); serviceIntent.setAction(ACTION_CREATE_CIM_CONNECTION); context.startService(serviceIntent); @@ -85,16 +86,16 @@ public class CIMPushManager { protected static void connect(Context context,long delayedTime){ - boolean isManualStop = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_MANUAL_STOP); - boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + boolean isManualStop = CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_MANUAL_STOP); + boolean isManualDestory = CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_CIM_DESTROYED); if(isManualStop || isManualDestory) { return ; } - String host = CIMCacheToolkit.getInstance(context).getString( CIMCacheToolkit.KEY_CIM_SERVIER_HOST); - int port =CIMCacheToolkit.getInstance(context).getInt( CIMCacheToolkit.KEY_CIM_SERVIER_PORT); + String host = CIMCacheManager.getString(context, CIMCacheManager.KEY_CIM_SERVIER_HOST); + int port =CIMCacheManager.getInt(context, CIMCacheManager.KEY_CIM_SERVIER_PORT); connect(context,host,port,true,delayedTime); @@ -108,7 +109,7 @@ public class CIMPushManager { public static void bindAccount(Context context,String account){ - boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + boolean isManualDestory = CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_CIM_DESTROYED); if(isManualDestory || account==null || account.trim().length()==0) { return ; @@ -121,8 +122,8 @@ public class CIMPushManager { private static void sendBindRequest(Context context, String account){ - CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_MANUAL_STOP, false); - CIMCacheToolkit.getInstance(context).putString(CIMCacheToolkit.KEY_ACCOUNT, account); + CIMCacheManager.putBoolean(context,CIMCacheManager.KEY_MANUAL_STOP, false); + CIMCacheManager.putString(context,CIMCacheManager.KEY_ACCOUNT, account); String imei = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); imei += context.getPackageName(); @@ -140,8 +141,8 @@ public class CIMPushManager { protected static boolean autoBindAccount(Context context){ - String account = CIMCacheToolkit.getInstance(context).getString(CIMCacheToolkit.KEY_ACCOUNT); - boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + String account = CIMCacheManager.getString(context,CIMCacheManager.KEY_ACCOUNT); + boolean isManualDestory = CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_CIM_DESTROYED); if( account==null || account.trim().length()==0 || isManualDestory ) { return false; @@ -161,8 +162,8 @@ public class CIMPushManager { */ public static void sendRequest(Context context, SentBody body){ - boolean isManualStop = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_MANUAL_STOP); - boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + boolean isManualStop = CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_MANUAL_STOP); + boolean isManualDestory = CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_CIM_DESTROYED); if(isManualStop || isManualDestory) { @@ -182,12 +183,12 @@ public class CIMPushManager { */ public static void stop(Context context){ - boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + boolean isManualDestory = CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_CIM_DESTROYED); if(isManualDestory){ return ; } - CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_MANUAL_STOP, true); + CIMCacheManager.putBoolean(context,CIMCacheManager.KEY_MANUAL_STOP, true); Intent serviceIntent = new Intent(context, CIMPushService.class); serviceIntent.setAction(ACTION_CLOSE_CIM_CONNECTION); @@ -203,8 +204,8 @@ public class CIMPushManager { public static void destroy(Context context){ - CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED, true); - CIMCacheToolkit.getInstance(context).putString(CIMCacheToolkit.KEY_ACCOUNT, null); + CIMCacheManager.putBoolean(context,CIMCacheManager.KEY_CIM_DESTROYED, true); + CIMCacheManager.putString(context,CIMCacheManager.KEY_ACCOUNT, null); Intent serviceIntent = new Intent(context, CIMPushService.class); serviceIntent.setAction(ACTION_DESTORY); @@ -219,7 +220,7 @@ public class CIMPushManager { */ public static void resume(Context context){ - boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + boolean isManualDestory = CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_CIM_DESTROYED); if(isManualDestory){ return ; } @@ -228,7 +229,7 @@ public class CIMPushManager { } public static boolean isConnected(Context context){ - return CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_CONNECTION_STATE); + return CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_CIM_CONNECTION_STATE); } diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java index 9ae1cc7..09bdb87 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,8 +51,8 @@ import com.farsunset.cim.sdk.android.model.SentBody; connectionHandler.removeMessages(0); - String host = message.getData().getString(CIMCacheToolkit.KEY_CIM_SERVIER_HOST); - int port = message.getData().getInt(CIMCacheToolkit.KEY_CIM_SERVIER_PORT,0); + String host = message.getData().getString(CIMCacheManager.KEY_CIM_SERVIER_HOST); + int port = message.getData().getInt(CIMCacheManager.KEY_CIM_SERVIER_PORT,0); manager.connect(host, port); } }; @@ -79,8 +79,8 @@ import com.farsunset.cim.sdk.android.model.SentBody; }else { - String host = intent.getStringExtra(CIMCacheToolkit.KEY_CIM_SERVIER_HOST); - int port = intent.getIntExtra(CIMCacheToolkit.KEY_CIM_SERVIER_PORT,0); + String host = intent.getStringExtra(CIMCacheManager.KEY_CIM_SERVIER_HOST); + int port = intent.getIntExtra(CIMCacheManager.KEY_CIM_SERVIER_PORT,0); manager.connect(host,port); } } @@ -105,7 +105,7 @@ import com.farsunset.cim.sdk.android.model.SentBody; { if(!manager.isConnected()){ - boolean isManualStop = CIMCacheToolkit.getInstance(this).getBoolean(CIMCacheToolkit.KEY_MANUAL_STOP); + boolean isManualStop = CIMCacheManager.getBoolean(getApplicationContext(),CIMCacheManager.KEY_MANUAL_STOP); Log.w(TAG, "manager.isConnected() == false, isManualStop == " + isManualStop); CIMPushManager.connect(this,0); diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/constant/CIMConstant.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/constant/CIMConstant.java index 8198c48..83dfc01 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/constant/CIMConstant.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/constant/CIMConstant.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -74,8 +74,6 @@ public interface CIMConstant { //被其他设备登录挤下线消息 String ACTION_999 ="999"; - //被系统禁用消息 - String ACTION_444 ="444"; } @@ -105,9 +103,6 @@ public interface CIMConstant { // 网络变化广播 String ACTION_NETWORK_CHANGED = "android.net.conn.CONNECTIVITY_CHANGE"; - // 未知异常 - String ACTION_UNCAUGHT_EXCEPTION = "com.farsunset.cim.UNCAUGHT_EXCEPTION"; - //重试连接 String ACTION_CONNECTION_RECOVERY = "com.farsunset.cim.CONNECTION_RECOVERY"; } diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetworkDisconnectedException.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetworkDisabledException.java similarity index 82% rename from cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetworkDisconnectedException.java rename to cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetworkDisabledException.java index 151d878..b811f4e 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetworkDisconnectedException.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetworkDisabledException.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,16 +21,17 @@ */ package com.farsunset.cim.sdk.android.exception; +import java.io.Serializable; -public class NetworkDisconnectedException extends Exception { +public class NetworkDisabledException extends Exception implements Serializable { private static final long serialVersionUID = 1L; - public NetworkDisconnectedException() { + public NetworkDisabledException() { super(); } - public NetworkDisconnectedException(String s) { + public NetworkDisabledException(String s) { super(s); } } diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/SessionDisconnectedException.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/SessionClosedException.java similarity index 83% rename from cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/SessionDisconnectedException.java rename to cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/SessionClosedException.java index 149098d..b2440b7 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/SessionDisconnectedException.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/SessionClosedException.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,16 +21,17 @@ */ package com.farsunset.cim.sdk.android.exception; +import java.io.Serializable; -public class SessionDisconnectedException extends Exception { +public class SessionClosedException extends Exception implements Serializable { private static final long serialVersionUID = 1L; - public SessionDisconnectedException() { + public SessionClosedException() { super(); } - public SessionDisconnectedException(String s) { + public SessionClosedException(String s) { super(s); } } diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageCodecFactory.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageCodecFactory.java index 7aab39b..a123941 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageCodecFactory.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageCodecFactory.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageDecoder.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageDecoder.java index 3da1a6c..ac1972c 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageDecoder.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageDecoder.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageEncoder.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageEncoder.java index 8aa1894..4b958d2 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageEncoder.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageEncoder.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/HeartbeatRequest.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/HeartbeatRequest.java index ece6cfa..671f74a 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/HeartbeatRequest.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/HeartbeatRequest.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/HeartbeatResponse.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/HeartbeatResponse.java index 5250fb0..80fbbe2 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/HeartbeatResponse.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/HeartbeatResponse.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Message.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Message.java index d8e46a7..5708fdf 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Message.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Message.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Protobufable.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Protobufable.java index d504891..b7cbcb1 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Protobufable.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Protobufable.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/ReplyBody.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/ReplyBody.java index 3a834ce..685a3a8 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/ReplyBody.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/ReplyBody.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,9 +22,10 @@ package com.farsunset.cim.sdk.android.model; import java.io.Serializable; -import java.util.HashMap; +import java.util.Hashtable; import java.util.Map; import java.util.Set; + /** * 请求应答对象 * @@ -49,19 +50,16 @@ public class ReplyBody implements Serializable { */ private String message; - /** - * 返回数据集合 - */ - private HashMap data; - private long timestamp; - public ReplyBody() - { - data = new HashMap(); - timestamp = System.currentTimeMillis(); - } + + /** + * 返回数据集合 + */ + private Hashtable data = new Hashtable(); + + public long getTimestamp() { return timestamp; } @@ -81,9 +79,7 @@ public class ReplyBody implements Serializable { } public void put(String k, String v) { - if(v!=null && k!=null){ - data.put(k, v); - } + data.put(k, v); } public String get(String k) { diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/SentBody.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/SentBody.java index d73c444..e27aa31 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/SentBody.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/SentBody.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,12 +22,12 @@ package com.farsunset.cim.sdk.android.model; import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; +import java.util.Hashtable; import java.util.Set; import com.farsunset.cim.sdk.android.constant.CIMConstant; import com.farsunset.cim.sdk.android.model.proto.SentBodyProto; + /** * java |android 客户端请求结构 * @@ -38,7 +38,7 @@ public class SentBody implements Serializable,Protobufable { private String key; - private HashMap data = new HashMap();; + private Hashtable data = new Hashtable();; private long timestamp; @@ -67,13 +67,12 @@ public class SentBody implements Serializable,Protobufable { } public void put(String k, String v) { - if(v!=null && k!=null){ - data.put(k, v); + if(k == null || v == null){ + return; } + data.put(k, v); } - public void putAll(Map map) { - data.putAll(map); - } + public Set getKeySet() { return data.keySet(); diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/MessageProto.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/MessageProto.java index 39d9167..10f6db4 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/MessageProto.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/MessageProto.java @@ -1,24 +1,6 @@ -/** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *************************************************************************************** - * * - * Website : http://www.farsunset.com * - * * - *************************************************************************************** - */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: Message.proto + package com.farsunset.cim.sdk.android.model.proto; public final class MessageProto { diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/ReplyBodyProto.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/ReplyBodyProto.java index d370594..2cdd619 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/ReplyBodyProto.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/ReplyBodyProto.java @@ -1,24 +1,6 @@ -/** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *************************************************************************************** - * * - * Website : http://www.farsunset.com * - * * - *************************************************************************************** - */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: ReplyBody.proto + package com.farsunset.cim.sdk.android.model.proto; public final class ReplyBodyProto { diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/SentBodyProto.java b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/SentBodyProto.java index a781e8b..07fb5a7 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/SentBodyProto.java +++ b/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/SentBodyProto.java @@ -1,24 +1,6 @@ -/** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *************************************************************************************** - * * - * Website : http://www.farsunset.com * - * * - *************************************************************************************** - */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: SentBody.proto + package com.farsunset.cim.sdk.android.model.proto; public final class SentBodyProto { diff --git a/cim_for_mina/cim-client-android/.idea/compiler.xml b/cim_for_mina/cim-client-android/.idea/compiler.xml new file mode 100644 index 0000000..96cc43e --- /dev/null +++ b/cim_for_mina/cim-client-android/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cim_for_mina/cim-client-android/.idea/copyright/profiles_settings.xml b/cim_for_mina/cim-client-android/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/cim_for_mina/cim-client-android/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/cim_for_mina/cim-client-android/.idea/gradle.xml b/cim_for_mina/cim-client-android/.idea/gradle.xml new file mode 100644 index 0000000..7ac24c7 --- /dev/null +++ b/cim_for_mina/cim-client-android/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/cim_for_mina/cim-client-android/.idea/misc.xml b/cim_for_mina/cim-client-android/.idea/misc.xml index 5e6e78a..5d19981 100644 --- a/cim_for_mina/cim-client-android/.idea/misc.xml +++ b/cim_for_mina/cim-client-android/.idea/misc.xml @@ -27,46 +27,6 @@ - - - - - - - - - Android - - - Android > Lint > Correctness - - - Android > Lint > Internationalization - - - Android > Lint > Security - - - CorrectnessLintAndroid - - - Gradle - - - LintAndroid - - - Probable bugsGradle - - - - - Android - - - - - @@ -83,23 +43,4 @@ - - - - - - - 1.8 - - - - - - - \ No newline at end of file diff --git a/cim_for_mina/cim-client-android/.idea/modules.xml b/cim_for_mina/cim-client-android/.idea/modules.xml new file mode 100644 index 0000000..8b941a4 --- /dev/null +++ b/cim_for_mina/cim-client-android/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/cim_for_mina/cim-client-android/.idea/runConfigurations.xml b/cim_for_mina/cim-client-android/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/cim_for_mina/cim-client-android/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/cim_for_mina/cim-client-android/app/build.gradle b/cim_for_mina/cim-client-android/app/build.gradle index 1f042fa..7033f0f 100644 --- a/cim_for_mina/cim-client-android/app/build.gradle +++ b/cim_for_mina/cim-client-android/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId "com.farsunset.ichat.example" minSdkVersion 14 targetSdkVersion 21 - versionCode 1 - versionName "1.0" + versionCode 31 + versionName "3.1.0" } buildTypes { release { @@ -27,8 +27,8 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:25.1.0' - compile 'com.google.protobuf:protobuf-java:3.2.0' + compile 'com.android.support:appcompat-v7:25.3.1' + compile 'com.google.protobuf:protobuf-java:3.3.0' compile 'org.apache.mina:mina-core:2.0.16' compile 'org.slf4j:slf4j-api:1.7.24' compile 'org.slf4j:slf4j-nop:1.7.24' diff --git a/cim_for_mina/cim-client-android/app/libs/cim-server-sdk-3.0.jar b/cim_for_mina/cim-client-android/app/libs/cim-server-sdk-3.0.jar deleted file mode 100644 index fb2f179da27800ad9f950c9ae856d7b1194ec59b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87773 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 diff --git a/cim_for_mina/cim-client-android/app/libs/cim-server-sdk-3.1.jar b/cim_for_mina/cim-client-android/app/libs/cim-server-sdk-3.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..da4e4f2f5527f114ca35417bfea34b378af7b4a3 GIT binary patch literal 88119 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

RTI9qF6W9!BnTvqAS&I_hoyDsd>a3h>BK) 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

OW3z)6v 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

rMwRqyQ#>o*|=||N)dSo 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 + > @@ -47,8 +46,13 @@ android:launchMode="singleTop" android:screenOrientation="portrait" /> - - + + + + diff --git a/cim_for_mina/cim-client-android/app/src/main/java/com/farsunset/ichat/example/app/Constant.java b/cim_for_mina/cim-client-android/app/src/main/java/com/farsunset/ichat/example/app/Constant.java index 15b6ee8..3b3c32a 100644 --- a/cim_for_mina/cim-client-android/app/src/main/java/com/farsunset/ichat/example/app/Constant.java +++ b/cim_for_mina/cim-client-android/app/src/main/java/com/farsunset/ichat/example/app/Constant.java @@ -24,7 +24,7 @@ package com.farsunset.ichat.example.app; public interface Constant { //服务端IP地址 - public static final String CIM_SERVER_HOST = "172.168.11.28"; + public static final String CIM_SERVER_HOST = "172.168.11.13"; //注意,这里的端口不是tomcat的端口,CIM端口在服务端spring-cim.xml中配置的,没改动就使用默认的23456 diff --git a/cim_for_mina/cim-client-android/build.gradle b/cim_for_mina/cim-client-android/build.gradle index 74b2ab0..1ea4bd0 100644 --- a/cim_for_mina/cim-client-android/build.gradle +++ b/cim_for_mina/cim-client-android/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.3' + classpath 'com.android.tools.build:gradle:2.3.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/cim_for_mina/cim-server/.classpath b/cim_for_mina/cim-server/.classpath index 0d97d57..262d7c8 100644 --- a/cim_for_mina/cim-server/.classpath +++ b/cim_for_mina/cim-server/.classpath @@ -2,11 +2,6 @@ - - - - - @@ -14,5 +9,6 @@ + diff --git a/cim_for_netty/cim-android-sdk/.classpath b/cim_for_netty/cim-android-sdk/.classpath index 8b81c43..2af04b4 100644 --- a/cim_for_netty/cim-android-sdk/.classpath +++ b/cim_for_netty/cim-android-sdk/.classpath @@ -3,12 +3,12 @@ - + diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheManager.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheManager.java new file mode 100644 index 0000000..eae048b --- /dev/null +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheManager.java @@ -0,0 +1,109 @@ +/** + * Copyright 2013-2033 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.sdk.android; + +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +class CIMCacheManager { + + + public static final String CIM_CONFIG_INFO = "CIM_CONFIG_INFO"; + + public static final String KEY_ACCOUNT = "KEY_ACCOUNT"; + + public static final String KEY_MANUAL_STOP = "KEY_MANUAL_STOP"; + + public static final String KEY_CIM_DESTROYED = "KEY_CIM_DESTROYED"; + + public static final String KEY_CIM_SERVIER_HOST = "KEY_CIM_SERVIER_HOST"; + + public static final String KEY_CIM_SERVIER_PORT = "KEY_CIM_SERVIER_PORT"; + + public static final String KEY_CIM_CONNECTION_STATE = "KEY_CIM_CONNECTION_STATE"; + + + public static void remove(Context context ,String key) + { + ContentResolver resolver = context.getContentResolver(); + resolver.delete(Uri.parse(CIMCacheProvider.CONTENT_URI), key, null); + } + + + public static void putString(Context context ,String key,String value) + { + + ContentResolver resolver = context.getContentResolver(); + ContentValues values = new ContentValues(); + values.put("value", value); + values.put("key", key); + resolver.insert(Uri.parse(CIMCacheProvider.CONTENT_URI), values); + + } + + public static String getString(Context context ,String key) + { + String value = null; + ContentResolver resolver = context.getContentResolver(); + Cursor cursor = resolver.query(Uri.parse(CIMCacheProvider.CONTENT_URI), new String[]{key}, null,null,null); + if (cursor!=null && cursor.moveToFirst()) + { + value = cursor.getString(0); + cursor.close(); + } + closeQuietly(cursor); + return value; + } + + private static void closeQuietly(Cursor cursor){ + try{ + if(cursor!=null) + cursor.close(); + }catch(Exception e){} + } + + public static void putBoolean(Context context,String key,boolean value) + { + putString(context,key,Boolean.toString(value)); + } + + public static boolean getBoolean(Context context,String key) + { + String value = getString(context,key); + return value == null?false:Boolean.parseBoolean(value); + } + + + public static void putInt(Context context,String key,int value) + { + putString(context,key, String.valueOf(value)); + } + + public static int getInt(Context context,String key) + { + String value = getString(context,key); + return value == null?0:Integer.parseInt(value); + } + +} diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheProvider.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheProvider.java new file mode 100644 index 0000000..3109416 --- /dev/null +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMCacheProvider.java @@ -0,0 +1,74 @@ +/** + * Copyright 2013-2033 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.sdk.android; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.MatrixCursor; +import android.net.Uri; + +public class CIMCacheProvider extends ContentProvider { + public static final String CONTENT_URI="content://com.farsunset.cim.provider"; + static final String MODEL_KEY = "PRIVATE_CIM_CONFIG"; + + + @Override + public int delete(Uri arg0, String key, String[] arg2) { + getContext().getSharedPreferences(MODEL_KEY, Context.MODE_PRIVATE).edit().remove(key).apply(); + return 0; + } + + @Override + public String getType(Uri arg0) { + return null; + } + + @Override + public Uri insert(Uri arg0, ContentValues values) { + String key = values.getAsString("key"); + String value = values.getAsString("value"); + getContext().getSharedPreferences(MODEL_KEY, Context.MODE_PRIVATE).edit().putString(key, value).apply(); + return null; + } + + @Override + public boolean onCreate() { + return true; + } + + @Override + public Cursor query(Uri arg0, String[] arg1, String key, String[] arg3, String arg4) { + MatrixCursor cursor = new MatrixCursor(new String[]{"value"}); + String value = getContext().getSharedPreferences(MODEL_KEY, Context.MODE_PRIVATE).getString(arg1[0], null); + cursor.addRow(new Object[]{value}); + return cursor; + } + + @Override + public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) { + return 0; + } + + +} diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java index 4272927..fb47578 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java @@ -45,10 +45,10 @@ import io.netty.handler.timeout.IdleStateEvent; import io.netty.handler.timeout.IdleStateHandler; import io.netty.util.AttributeKey; import com.farsunset.cim.sdk.android.constant.CIMConstant; -import com.farsunset.cim.sdk.android.exception.SessionDisconnectedException; import com.farsunset.cim.sdk.android.filter.ClientMessageDecoder; import com.farsunset.cim.sdk.android.filter.ClientMessageEncoder; -import com.farsunset.cim.sdk.android.exception.NetworkDisconnectedException; +import com.farsunset.cim.sdk.android.exception.NetworkDisabledException; +import com.farsunset.cim.sdk.android.exception.SessionClosedException; import com.farsunset.cim.sdk.android.model.HeartbeatRequest; import com.farsunset.cim.sdk.android.model.HeartbeatResponse; import com.farsunset.cim.sdk.android.model.Message; @@ -129,7 +129,7 @@ class CIMConnectorManager extends SimpleChannelInboundHandler { Intent intent = new Intent(); intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED); - intent.putExtra(Exception.class.getName(), e); + intent.putExtra(Exception.class.getName(), e.getClass().getSimpleName()); intent.putExtra("interval", interval); context.sendBroadcast(intent); @@ -145,7 +145,7 @@ class CIMConnectorManager extends SimpleChannelInboundHandler { Intent intent = new Intent(); intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED); - intent.putExtra(Exception.class.getName(), new NetworkDisconnectedException()); + intent.putExtra(Exception.class.getName(), NetworkDisabledException.class.getSimpleName()); context.sendBroadcast(intent); return; @@ -164,17 +164,22 @@ class CIMConnectorManager extends SimpleChannelInboundHandler { boolean isSuccessed = false; - Throwable exception = new SessionDisconnectedException(); + String exceptionName = SessionClosedException.class.getSimpleName(); if(channel!=null && channel.isActive()) { - isSuccessed = channel.writeAndFlush(body).awaitUninterruptibly(WRITE_TIMEOUT); + ChannelFuture future = channel.writeAndFlush(body); + isSuccessed = future.awaitUninterruptibly(WRITE_TIMEOUT); + if(!isSuccessed && future.cause()!=null){ + exceptionName = future.cause().getClass().getSimpleName(); + } + } if(!isSuccessed){ Intent intent = new Intent(); intent.setAction(CIMConstant.IntentAction.ACTION_SENT_FAILED); - intent.putExtra(Exception.class.getName(),exception); + intent.putExtra(Exception.class.getName(),exceptionName); intent.putExtra(SentBody.class.getName(), body); context.sendBroadcast(intent); }else @@ -279,7 +284,7 @@ class CIMConnectorManager extends SimpleChannelInboundHandler { Intent intent = new Intent(); intent.setAction(CIMConstant.IntentAction.ACTION_UNCAUGHT_EXCEPTION); - intent.putExtra(Exception.class.getName(), cause); + intent.putExtra(Exception.class.getName(), cause.getClass().getSimpleName()); context.sendBroadcast(intent); } diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java index 596b8f2..8feddb0 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,9 +22,8 @@ package com.farsunset.cim.sdk.android; - import com.farsunset.cim.sdk.android.constant.CIMConstant; -import com.farsunset.cim.sdk.android.exception.SessionDisconnectedException; +import com.farsunset.cim.sdk.android.exception.SessionClosedException; import com.farsunset.cim.sdk.android.model.Message; import com.farsunset.cim.sdk.android.model.ReplyBody; import com.farsunset.cim.sdk.android.model.SentBody; @@ -55,7 +54,6 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver{ { startPushService(); } - /* * 设备网络状态变化事件 @@ -80,7 +78,8 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver{ if(intent.getAction().equals(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED)) { long interval = intent.getLongExtra("interval", CIMConstant.RECONN_INTERVAL_TIME); - onConnectionFailed((Exception) intent.getSerializableExtra(Exception.class.getName()),interval); + String exceptionName = intent.getStringExtra(Exception.class.getName()); + onConnectionFailed(exceptionName,interval); } /* @@ -114,9 +113,9 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver{ */ if(intent.getAction().equals(CIMConstant.IntentAction.ACTION_SENT_FAILED)) { - Exception exception = (Exception) intent.getSerializableExtra(Exception.class.getName()); + String exceptionName = intent.getStringExtra(Exception.class.getName()); SentBody sentBody = (SentBody)intent.getSerializableExtra(SentBody.class.getName()); - onSentFailed(exception,sentBody); + onSentFailed(exceptionName,sentBody); } /* @@ -128,15 +127,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver{ } - /* - * 获取cim数据传输异常事件 - */ - if(intent.getAction().equals(CIMConstant.IntentAction.ACTION_UNCAUGHT_EXCEPTION)) - { - onUncaughtException((Exception)intent.getSerializableExtra(Exception.class.getName())); - } - - + /* * 重新连接,如果断开的话 */ @@ -153,7 +144,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver{ } private void onInnerConnectionClosed(){ - CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_CONNECTION_STATE, false); + CIMCacheManager.putBoolean(context,CIMCacheManager.KEY_CIM_CONNECTION_STATE, false); if(CIMConnectorManager.isNetworkConnected(context)) { CIMPushManager.connect(context,0); @@ -162,7 +153,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver{ onConnectionClosed(); } - private void onConnectionFailed(Exception e,long reinterval){ + private void onConnectionFailed(String exceptionName,long reinterval){ if(CIMConnectorManager.isNetworkConnected(context)) { @@ -173,14 +164,12 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver{ } private void onInnerConnectionSuccessed(){ - CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_CONNECTION_STATE, true); + CIMCacheManager.putBoolean(context,CIMCacheManager.KEY_CIM_CONNECTION_STATE, true); boolean autoBind = CIMPushManager.autoBindAccount(context); onConnectionSuccessed(autoBind); } - private void onUncaughtException(Throwable arg0) {} - private void onDevicesNetworkChanged(NetworkInfo info) { if(info !=null) @@ -202,13 +191,13 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver{ private boolean isForceOfflineMessage(String action) { - return CIMConstant.MessageAction.ACTION_999.equals(action) || CIMConstant.MessageAction.ACTION_444.equals(action); + return CIMConstant.MessageAction.ACTION_999.equals(action); } - private void onSentFailed(Exception e, SentBody body){ + private void onSentFailed(String exceptionName, SentBody body){ //与服务端端开链接,重新连接 - if(e instanceof SessionDisconnectedException) + if(SessionClosedException.class.getSimpleName().equals(exceptionName)) { CIMPushManager.connect(context,0); }else diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventListener.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventListener.java index 1bc8191..b936dc6 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventListener.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMEventListener.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMListenerManager.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMListenerManager.java index 0008d0d..1826f00 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMListenerManager.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMListenerManager.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java index 6d27800..9bff670 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,6 +48,7 @@ public class CIMPushManager { static String KEY_SEND_BODY ="KEY_SEND_BODY"; + static String KEY_CIM_CONNECTION_STATUS ="KEY_CIM_CONNECTION_STATUS"; /** * 初始化,连接服务端,在程序启动页或者 在Application里调用 @@ -63,20 +64,20 @@ public class CIMPushManager { private static void connect(Context context,String ip,int port,boolean autoBind,long delayedTime){ - CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED, false); - CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_MANUAL_STOP, false); + CIMCacheManager.putBoolean(context,CIMCacheManager.KEY_CIM_DESTROYED, false); + CIMCacheManager.putBoolean(context,CIMCacheManager.KEY_MANUAL_STOP, false); - CIMCacheToolkit.getInstance(context).putString( CIMCacheToolkit.KEY_CIM_SERVIER_HOST, ip); - CIMCacheToolkit.getInstance(context).putInt( CIMCacheToolkit.KEY_CIM_SERVIER_PORT, port); + CIMCacheManager.putString(context, CIMCacheManager.KEY_CIM_SERVIER_HOST, ip); + CIMCacheManager.putInt(context, CIMCacheManager.KEY_CIM_SERVIER_PORT, port); if(!autoBind) { - CIMCacheToolkit.getInstance(context).remove(CIMCacheToolkit.KEY_ACCOUNT); + CIMCacheManager.remove(context,CIMCacheManager.KEY_ACCOUNT); } Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.putExtra(CIMCacheToolkit.KEY_CIM_SERVIER_HOST, ip); - serviceIntent.putExtra(CIMCacheToolkit.KEY_CIM_SERVIER_PORT, port); + serviceIntent.putExtra(CIMCacheManager.KEY_CIM_SERVIER_HOST, ip); + serviceIntent.putExtra(CIMCacheManager.KEY_CIM_SERVIER_PORT, port); serviceIntent.putExtra(CIMPushService.KEY_DELAYED_TIME, delayedTime); serviceIntent.setAction(ACTION_CREATE_CIM_CONNECTION); context.startService(serviceIntent); @@ -85,16 +86,16 @@ public class CIMPushManager { protected static void connect(Context context,long delayedTime){ - boolean isManualStop = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_MANUAL_STOP); - boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + boolean isManualStop = CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_MANUAL_STOP); + boolean isManualDestory = CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_CIM_DESTROYED); if(isManualStop || isManualDestory) { return ; } - String host = CIMCacheToolkit.getInstance(context).getString( CIMCacheToolkit.KEY_CIM_SERVIER_HOST); - int port =CIMCacheToolkit.getInstance(context).getInt( CIMCacheToolkit.KEY_CIM_SERVIER_PORT); + String host = CIMCacheManager.getString(context, CIMCacheManager.KEY_CIM_SERVIER_HOST); + int port =CIMCacheManager.getInt(context, CIMCacheManager.KEY_CIM_SERVIER_PORT); connect(context,host,port,true,delayedTime); @@ -108,7 +109,7 @@ public class CIMPushManager { public static void bindAccount(Context context,String account){ - boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + boolean isManualDestory = CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_CIM_DESTROYED); if(isManualDestory || account==null || account.trim().length()==0) { return ; @@ -121,8 +122,8 @@ public class CIMPushManager { private static void sendBindRequest(Context context, String account){ - CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_MANUAL_STOP, false); - CIMCacheToolkit.getInstance(context).putString(CIMCacheToolkit.KEY_ACCOUNT, account); + CIMCacheManager.putBoolean(context,CIMCacheManager.KEY_MANUAL_STOP, false); + CIMCacheManager.putString(context,CIMCacheManager.KEY_ACCOUNT, account); String imei = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); imei += context.getPackageName(); @@ -140,8 +141,8 @@ public class CIMPushManager { protected static boolean autoBindAccount(Context context){ - String account = CIMCacheToolkit.getInstance(context).getString(CIMCacheToolkit.KEY_ACCOUNT); - boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + String account = CIMCacheManager.getString(context,CIMCacheManager.KEY_ACCOUNT); + boolean isManualDestory = CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_CIM_DESTROYED); if( account==null || account.trim().length()==0 || isManualDestory ) { return false; @@ -161,8 +162,8 @@ public class CIMPushManager { */ public static void sendRequest(Context context, SentBody body){ - boolean isManualStop = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_MANUAL_STOP); - boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + boolean isManualStop = CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_MANUAL_STOP); + boolean isManualDestory = CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_CIM_DESTROYED); if(isManualStop || isManualDestory) { @@ -182,12 +183,12 @@ public class CIMPushManager { */ public static void stop(Context context){ - boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + boolean isManualDestory = CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_CIM_DESTROYED); if(isManualDestory){ return ; } - CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_MANUAL_STOP, true); + CIMCacheManager.putBoolean(context,CIMCacheManager.KEY_MANUAL_STOP, true); Intent serviceIntent = new Intent(context, CIMPushService.class); serviceIntent.setAction(ACTION_CLOSE_CIM_CONNECTION); @@ -203,8 +204,8 @@ public class CIMPushManager { public static void destroy(Context context){ - CIMCacheToolkit.getInstance(context).putBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED, true); - CIMCacheToolkit.getInstance(context).putString(CIMCacheToolkit.KEY_ACCOUNT, null); + CIMCacheManager.putBoolean(context,CIMCacheManager.KEY_CIM_DESTROYED, true); + CIMCacheManager.putString(context,CIMCacheManager.KEY_ACCOUNT, null); Intent serviceIntent = new Intent(context, CIMPushService.class); serviceIntent.setAction(ACTION_DESTORY); @@ -219,7 +220,7 @@ public class CIMPushManager { */ public static void resume(Context context){ - boolean isManualDestory = CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_DESTROYED); + boolean isManualDestory = CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_CIM_DESTROYED); if(isManualDestory){ return ; } @@ -228,7 +229,7 @@ public class CIMPushManager { } public static boolean isConnected(Context context){ - return CIMCacheToolkit.getInstance(context).getBoolean(CIMCacheToolkit.KEY_CIM_CONNECTION_STATE); + return CIMCacheManager.getBoolean(context,CIMCacheManager.KEY_CIM_CONNECTION_STATE); } diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java index 9ae1cc7..09bdb87 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,8 +51,8 @@ import com.farsunset.cim.sdk.android.model.SentBody; connectionHandler.removeMessages(0); - String host = message.getData().getString(CIMCacheToolkit.KEY_CIM_SERVIER_HOST); - int port = message.getData().getInt(CIMCacheToolkit.KEY_CIM_SERVIER_PORT,0); + String host = message.getData().getString(CIMCacheManager.KEY_CIM_SERVIER_HOST); + int port = message.getData().getInt(CIMCacheManager.KEY_CIM_SERVIER_PORT,0); manager.connect(host, port); } }; @@ -79,8 +79,8 @@ import com.farsunset.cim.sdk.android.model.SentBody; }else { - String host = intent.getStringExtra(CIMCacheToolkit.KEY_CIM_SERVIER_HOST); - int port = intent.getIntExtra(CIMCacheToolkit.KEY_CIM_SERVIER_PORT,0); + String host = intent.getStringExtra(CIMCacheManager.KEY_CIM_SERVIER_HOST); + int port = intent.getIntExtra(CIMCacheManager.KEY_CIM_SERVIER_PORT,0); manager.connect(host,port); } } @@ -105,7 +105,7 @@ import com.farsunset.cim.sdk.android.model.SentBody; { if(!manager.isConnected()){ - boolean isManualStop = CIMCacheToolkit.getInstance(this).getBoolean(CIMCacheToolkit.KEY_MANUAL_STOP); + boolean isManualStop = CIMCacheManager.getBoolean(getApplicationContext(),CIMCacheManager.KEY_MANUAL_STOP); Log.w(TAG, "manager.isConnected() == false, isManualStop == " + isManualStop); CIMPushManager.connect(this,0); diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/constant/CIMConstant.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/constant/CIMConstant.java index bfd66c2..28bd932 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/constant/CIMConstant.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/constant/CIMConstant.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ package com.farsunset.cim.sdk.android.constant; public interface CIMConstant { long RECONN_INTERVAL_TIME= 30 * 1000; + //消息头长度为3个字节,第一个字节为消息类型,第二,第三字节 转换int后为消息长度 int DATA_HEADER_LENGTH = 3; public static interface ReturnCode{ @@ -73,8 +74,6 @@ public interface CIMConstant { //被其他设备登录挤下线消息 String ACTION_999 ="999"; - //被系统禁用消息 - String ACTION_444 ="444"; } @@ -104,11 +103,11 @@ public interface CIMConstant { // 网络变化广播 String ACTION_NETWORK_CHANGED = "android.net.conn.CONNECTIVITY_CHANGE"; - // 未知异常 - String ACTION_UNCAUGHT_EXCEPTION = "com.farsunset.cim.UNCAUGHT_EXCEPTION"; - //重试连接 String ACTION_CONNECTION_RECOVERY = "com.farsunset.cim.CONNECTION_RECOVERY"; + + // 未知异常 + String ACTION_UNCAUGHT_EXCEPTION = "com.farsunset.cim.UNCAUGHT_EXCEPTION"; } } diff --git a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetworkDisconnectedException.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetworkDisabledException.java similarity index 82% rename from cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetworkDisconnectedException.java rename to cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetworkDisabledException.java index 151d878..b811f4e 100644 --- a/cim_for_mina/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetworkDisconnectedException.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/NetworkDisabledException.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,16 +21,17 @@ */ package com.farsunset.cim.sdk.android.exception; +import java.io.Serializable; -public class NetworkDisconnectedException extends Exception { +public class NetworkDisabledException extends Exception implements Serializable { private static final long serialVersionUID = 1L; - public NetworkDisconnectedException() { + public NetworkDisabledException() { super(); } - public NetworkDisconnectedException(String s) { + public NetworkDisabledException(String s) { super(s); } } diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/SessionDisconnectedException.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/SessionClosedException.java similarity index 83% rename from cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/SessionDisconnectedException.java rename to cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/SessionClosedException.java index 149098d..b2440b7 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/SessionDisconnectedException.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/exception/SessionClosedException.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,16 +21,17 @@ */ package com.farsunset.cim.sdk.android.exception; +import java.io.Serializable; -public class SessionDisconnectedException extends Exception { +public class SessionClosedException extends Exception implements Serializable { private static final long serialVersionUID = 1L; - public SessionDisconnectedException() { + public SessionClosedException() { super(); } - public SessionDisconnectedException(String s) { + public SessionClosedException(String s) { super(s); } } diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageDecoder.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageDecoder.java index 898f251..747e5f1 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageDecoder.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/filter/ClientMessageDecoder.java @@ -53,6 +53,8 @@ public class ClientMessageDecoder extends ByteToMessageDecoder { buffer.markReaderIndex(); + buffer.markReaderIndex(); + byte conetnType = buffer.readByte(); byte lv = buffer.readByte();// int 低位 diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/HeartbeatRequest.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/HeartbeatRequest.java index ece6cfa..671f74a 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/HeartbeatRequest.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/HeartbeatRequest.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/HeartbeatResponse.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/HeartbeatResponse.java index 5250fb0..80fbbe2 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/HeartbeatResponse.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/HeartbeatResponse.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Message.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Message.java index d8e46a7..5708fdf 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Message.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Message.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Protobufable.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Protobufable.java index d504891..b7cbcb1 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Protobufable.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/Protobufable.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/ReplyBody.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/ReplyBody.java index 3a834ce..685a3a8 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/ReplyBody.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/ReplyBody.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,9 +22,10 @@ package com.farsunset.cim.sdk.android.model; import java.io.Serializable; -import java.util.HashMap; +import java.util.Hashtable; import java.util.Map; import java.util.Set; + /** * 请求应答对象 * @@ -49,19 +50,16 @@ public class ReplyBody implements Serializable { */ private String message; - /** - * 返回数据集合 - */ - private HashMap data; - private long timestamp; - public ReplyBody() - { - data = new HashMap(); - timestamp = System.currentTimeMillis(); - } + + /** + * 返回数据集合 + */ + private Hashtable data = new Hashtable(); + + public long getTimestamp() { return timestamp; } @@ -81,9 +79,7 @@ public class ReplyBody implements Serializable { } public void put(String k, String v) { - if(v!=null && k!=null){ - data.put(k, v); - } + data.put(k, v); } public String get(String k) { diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/SentBody.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/SentBody.java index d73c444..e27aa31 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/SentBody.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/SentBody.java @@ -1,5 +1,5 @@ /** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). + * Copyright 2013-2033 Xia Jun(3979434@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,12 +22,12 @@ package com.farsunset.cim.sdk.android.model; import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; +import java.util.Hashtable; import java.util.Set; import com.farsunset.cim.sdk.android.constant.CIMConstant; import com.farsunset.cim.sdk.android.model.proto.SentBodyProto; + /** * java |android 客户端请求结构 * @@ -38,7 +38,7 @@ public class SentBody implements Serializable,Protobufable { private String key; - private HashMap data = new HashMap();; + private Hashtable data = new Hashtable();; private long timestamp; @@ -67,13 +67,12 @@ public class SentBody implements Serializable,Protobufable { } public void put(String k, String v) { - if(v!=null && k!=null){ - data.put(k, v); + if(k == null || v == null){ + return; } + data.put(k, v); } - public void putAll(Map map) { - data.putAll(map); - } + public Set getKeySet() { return data.keySet(); diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/MessageProto.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/MessageProto.java index 39d9167..10f6db4 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/MessageProto.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/MessageProto.java @@ -1,24 +1,6 @@ -/** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *************************************************************************************** - * * - * Website : http://www.farsunset.com * - * * - *************************************************************************************** - */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: Message.proto + package com.farsunset.cim.sdk.android.model.proto; public final class MessageProto { diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/ReplyBodyProto.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/ReplyBodyProto.java index d370594..2cdd619 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/ReplyBodyProto.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/ReplyBodyProto.java @@ -1,24 +1,6 @@ -/** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *************************************************************************************** - * * - * Website : http://www.farsunset.com * - * * - *************************************************************************************** - */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: ReplyBody.proto + package com.farsunset.cim.sdk.android.model.proto; public final class ReplyBodyProto { diff --git a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/SentBodyProto.java b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/SentBodyProto.java index a781e8b..07fb5a7 100644 --- a/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/SentBodyProto.java +++ b/cim_for_netty/cim-android-sdk/src/com/farsunset/cim/sdk/android/model/proto/SentBodyProto.java @@ -1,24 +1,6 @@ -/** - * Copyright 2013-2023 Xia Jun(3979434@qq.com). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *************************************************************************************** - * * - * Website : http://www.farsunset.com * - * * - *************************************************************************************** - */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: SentBody.proto + package com.farsunset.cim.sdk.android.model.proto; public final class SentBodyProto { diff --git a/cim_for_netty/cim-client-android/.idea/encodings.xml b/cim_for_netty/cim-client-android/.idea/encodings.xml deleted file mode 100644 index 97626ba..0000000 --- a/cim_for_netty/cim-client-android/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/cim_for_netty/cim-client-android/.idea/gradle.xml b/cim_for_netty/cim-client-android/.idea/gradle.xml index 3aff3ca..7ac24c7 100644 --- a/cim_for_netty/cim-client-android/.idea/gradle.xml +++ b/cim_for_netty/cim-client-android/.idea/gradle.xml @@ -3,9 +3,8 @@