diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0d558663..00ae1a18 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -15,7 +15,7 @@ android { minSdk = 21 targetSdk = 30 versionCode = 1 - versionName = "9.2.11" + versionName = "9.2.12" multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -55,12 +55,12 @@ dependencies { // implementation(project(":teamkit-ui")) // implementation(project(":chatkit-ui")) // implementation(project(":searchkit-ui")) - implementation("com.netease.yunxin.kit.contact:contactkit-ui:9.2.11") - implementation("com.netease.yunxin.kit.qchat:qchatkit-ui:9.2.11") - implementation("com.netease.yunxin.kit.conversation:conversationkit-ui:9.2.11") - implementation("com.netease.yunxin.kit.team:teamkit-ui:9.2.11") - implementation("com.netease.yunxin.kit.chat:chatkit-ui:9.2.11") - implementation("com.netease.yunxin.kit.search:searchkit-ui:9.2.11") + implementation("com.netease.yunxin.kit.contact:contactkit-ui:9.2.12-rc01") + implementation("com.netease.yunxin.kit.qchat:qchatkit-ui:9.2.12-rc01") + implementation("com.netease.yunxin.kit.conversation:conversationkit-ui:9.2.12-rc01") + implementation("com.netease.yunxin.kit.team:teamkit-ui:9.2.12-rc01") + implementation("com.netease.yunxin.kit.chat:chatkit-ui:9.2.12-rc01") + implementation("com.netease.yunxin.kit.search:searchkit-ui:9.2.12-rc01") implementation("com.airbnb.android:lottie:5.0.3") implementation("com.github.bumptech.glide:glide:4.13.1") implementation("com.squareup.retrofit2:retrofit:2.9.0") diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index e7aae2aa..0c7dae72 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -19,10 +19,41 @@ # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile + +## IM SDK +-dontwarn com.netease.nim.** +-keep class com.netease.nim.** {*;} + +-dontwarn com.netease.nimlib.** +-keep class com.netease.nimlib.** {*;} + +-dontwarn com.netease.share.** +-keep class com.netease.share.** {*;} + +-dontwarn com.netease.mobsec.** +-keep class com.netease.mobsec.** {*;} + +#如果你使用全文检索插件,需要加入 +-dontwarn org.apache.lucene.** +-keep class org.apache.lucene.** {*;} + +## IMUIKit +-dontwarn com.netease.yunxin.kit.** +-keep class com.netease.yunxin.kit.** {*;} -keep public class * extends com.netease.yunxin.kit.corekit.XKitInitOptions +-keep class * implements com.netease.yunxin.kit.corekit.XKitService {*;} --dontwarn com.netease.** --keep class com.netease.** {*;} +### glide 4 +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep public class * extends com.bumptech.glide.module.AppGlideModule +-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { + **[] $VALUES; + public *; +} + +#okhttp +-dontwarn okhttp3.** +-keep class okhttp3.**{*;} #如果你使用全文检索插件,需要加入 -dontwarn org.apache.lucene.** @@ -71,33 +102,20 @@ -keep class com.vivo.vms.** {*;} -keep class com.netease.nimlib.mixpush.vivo.VivoPushReceiver {*;} -### APP 3rd party jars(glide) --keep public class * implements com.bumptech.glide.module.GlideModule --keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { - **[] $VALUES; - public *; -} +#oppo +-keep public class * extends android.app.Service +-keep class com.heytap.msp.** { *;} + ### org.json xml -dontwarn org.json.** -keep class org.json.**{*;} -#okhttp --dontwarn okhttp3.** --keep class okhttp3.**{*;} + #okio -dontwarn okio.** -keep class okio.**{*;} -### glide 4 --keep public class * implements com.bumptech.glide.module.GlideModule --keep public class * extends com.bumptech.glide.module.AppGlideModule --keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { - **[] $VALUES; - public *; -} - - -keepclasseswithmembernames class * { native ; } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2b1ee904..3b9cd62b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ diff --git a/app/src/main/java/com/netease/yunxin/app/im/IMApplication.java b/app/src/main/java/com/netease/yunxin/app/im/IMApplication.java index 9fb8f64e..0f06cc71 100644 --- a/app/src/main/java/com/netease/yunxin/app/im/IMApplication.java +++ b/app/src/main/java/com/netease/yunxin/app/im/IMApplication.java @@ -13,7 +13,7 @@ import com.netease.nimlib.sdk.SDKOptions; import com.netease.yunxin.app.im.crash.AppCrashHandler; import com.netease.yunxin.app.im.main.MainActivity; -import com.netease.yunxin.app.im.main.mine.UserInfoActivity; +import com.netease.yunxin.app.im.main.mine.MineInfoActivity; import com.netease.yunxin.app.im.push.PushMessageHandler; import com.netease.yunxin.app.im.utils.Constant; import com.netease.yunxin.app.im.utils.DataUtils; @@ -46,7 +46,7 @@ public void onCreate() { initUIKit(); // temp register for mine - XKitRouter.registerRouter(RouterConstant.PATH_MINE_INFO_PAGE, UserInfoActivity.class); + XKitRouter.registerRouter(RouterConstant.PATH_MINE_INFO_PAGE, MineInfoActivity.class); } private void initUIKit() { diff --git a/app/src/main/java/com/netease/yunxin/app/im/XKitInitOptionsImpl.java b/app/src/main/java/com/netease/yunxin/app/im/XKitInitOptionsImpl.java deleted file mode 100644 index b05e3650..00000000 --- a/app/src/main/java/com/netease/yunxin/app/im/XKitInitOptionsImpl.java +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2022 NetEase, Inc. All rights reserved. -// Use of this source code is governed by a MIT license that can be -// found in the LICENSE file. - -package com.netease.yunxin.app.im; - -import android.content.Context; -import androidx.annotation.Keep; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import com.netease.nimlib.sdk.NIMClient; -import com.netease.yunxin.app.im.utils.DataUtils; -import com.netease.yunxin.kit.corekit.XKitInitOptions; -import com.netease.yunxin.kit.corekit.XKitLogLevel; -import com.netease.yunxin.kit.corekit.XKitLogOptions; -import com.netease.yunxin.kit.corekit.XKitReporterInfoOptions; - -@Keep -public class XKitInitOptionsImpl implements XKitInitOptions { - - @Nullable - @Override - public XKitLogOptions logOption() { - return new XKitLogOptions.Builder().level(XKitLogLevel.VERBOSE).build(); - } - - @Nullable - @Override - public XKitReporterInfoOptions reporterInfoOption(@NonNull Context context) { - return new XKitReporterInfoOptions.Builder() - .appKey(DataUtils.readAppKey(context)) - .imVersion(NIMClient.getSDKVersion()) - .debug(true) - .build(); - } -} diff --git a/app/src/main/java/com/netease/yunxin/app/im/main/mine/MineFragment.java b/app/src/main/java/com/netease/yunxin/app/im/main/mine/MineFragment.java index 2172faa2..c4f6f301 100644 --- a/app/src/main/java/com/netease/yunxin/app/im/main/mine/MineFragment.java +++ b/app/src/main/java/com/netease/yunxin/app/im/main/mine/MineFragment.java @@ -70,7 +70,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat binding.userInfoClick.setOnClickListener( v -> { - UserInfoActivity.launch( + MineInfoActivity.launch( getContext(), new ActivityResultLauncher() { @Override diff --git a/app/src/main/java/com/netease/yunxin/app/im/main/mine/UserInfoActivity.java b/app/src/main/java/com/netease/yunxin/app/im/main/mine/MineInfoActivity.java similarity index 98% rename from app/src/main/java/com/netease/yunxin/app/im/main/mine/UserInfoActivity.java rename to app/src/main/java/com/netease/yunxin/app/im/main/mine/MineInfoActivity.java index 6b32fb7a..b94ae2da 100644 --- a/app/src/main/java/com/netease/yunxin/app/im/main/mine/UserInfoActivity.java +++ b/app/src/main/java/com/netease/yunxin/app/im/main/mine/MineInfoActivity.java @@ -40,7 +40,7 @@ import java.util.HashMap; import java.util.Map; -public class UserInfoActivity extends AppCompatActivity { +public class MineInfoActivity extends AppCompatActivity { private ActivityUserInfoBinding binding; private ActivityResultLauncher launcher; private UserInfo userInfo; @@ -110,7 +110,7 @@ private void initView() { selectIndex = 2; } TypeSelectActivity.launch( - UserInfoActivity.this, + MineInfoActivity.this, getResources().getString(R.string.user_info_sexual), content, selectIndex, @@ -154,7 +154,7 @@ private void copyAccount() { } private void choicePhoto() { - new PhotoChoiceDialog(UserInfoActivity.this) + new PhotoChoiceDialog(MineInfoActivity.this) .show( new CommonCallback() { @Override @@ -333,7 +333,7 @@ public void finish() { } public static void launch(Context context, @NonNull ActivityResultLauncher launcher) { - Intent intent = new Intent(context, UserInfoActivity.class); + Intent intent = new Intent(context, MineInfoActivity.class); launcher.launch(intent); } } diff --git a/app/src/main/res/layout/activity_edit_nickname.xml b/app/src/main/res/layout/activity_edit_nickname.xml index 4838e0af..b59eb18d 100644 --- a/app/src/main/res/layout/activity_edit_nickname.xml +++ b/app/src/main/res/layout/activity_edit_nickname.xml @@ -10,7 +10,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/color_e9eff5" - tools:context=".main.mine.UserInfoActivity"> + tools:context=".main.mine.MineInfoActivity"> + tools:context=".main.mine.MineInfoActivity"> permissionLauncher; + private Observer>> messageLiveDataObserver; + private Observer> sendLiveDataObserver; + private Observer> revokeLiveDataObserver; + private Observer> attachLiveDataObserver; + private Observer>> userInfoLiveDataObserver; + private Observer> addPinLiveDataObserver; + private Observer removePinLiveDataObserver; + ChatPopMenu popMenu; private IChatViewCustom chatViewCustom; @@ -295,7 +308,7 @@ public void captureVideo() { } @Override - public boolean sendFile(ChatMessageBean replyMsg) { + public boolean sendFile() { //todo send file return false; } @@ -471,6 +484,15 @@ public boolean onUserIconLongClick(View view, int position, ChatMessageBean mess return true; } + @Override + public boolean onSelfIconLongClick(View view, int position, ChatMessageBean messageInfo) { + if (delegateListener == null + || !delegateListener.onSelfIconLongClick(view, position, messageInfo)) { + //todo + } + return true; + } + @Override public boolean onReEditRevokeMessage(View view, int position, ChatMessageBean messageBean) { //only support text message @@ -748,95 +770,85 @@ private void watchVideo(IMMessage message) { protected void initDataObserver() { ALog.d(LOG_TAG, "initDataObserver"); - viewModel - .getQueryMessageLiveData() - .observe( - getViewLifecycleOwner(), - listFetchResult -> { - boolean hasMore = listFetchResult.getLoadStatus() != LoadStatus.Finish; - if (listFetchResult.getTypeIndex() == 0) { - ALog.d(LOG_TAG, "message observe older forward has more:" + hasMore); - binding.chatView.getMessageListView().setHasMoreForwardMessages(hasMore); - binding.chatView.addMessageListForward(listFetchResult.getData()); - } else { - ALog.d(LOG_TAG, "message observe newer load has more:" + hasMore); - binding.chatView.getMessageListView().setHasMoreNewerMessages(hasMore); - binding.chatView.appendMessageList(listFetchResult.getData()); - } - }); - - viewModel - .getSendMessageLiveData() - .observe( - getViewLifecycleOwner(), - chatMessageBeanFetchResult -> { - if (chatMessageBeanFetchResult.getType() == FetchResult.FetchType.Add) { - ALog.d(LOG_TAG, "send message add"); - if (binding.chatView.getMessageListView().hasMoreNewerMessages()) { - binding.chatView.clearMessageList(); - binding.chatView.appendMessage(chatMessageBeanFetchResult.getData()); - if (chatMessageBeanFetchResult.getData() != null) { - binding.chatView.getMessageListView().setHasMoreNewerMessages(false); - viewModel.fetchMoreMessage( - chatMessageBeanFetchResult.getData().getMessageData().getMessage(), - QueryDirectionEnum.QUERY_OLD); - } - } else { - binding.chatView.appendMessage(chatMessageBeanFetchResult.getData()); - } - } else { - binding.chatView.updateMessage(chatMessageBeanFetchResult.getData()); - } - }); - viewModel - .getAttachmentProgressMutableLiveData() - .observe( - getViewLifecycleOwner(), - attachmentProgressFetchResult -> - binding.chatView.updateProgress(attachmentProgressFetchResult.getData())); - - viewModel - .getRevokeMessageLiveData() - .observe( - getViewLifecycleOwner(), - messageResult -> { - if (messageResult.getLoadStatus() == LoadStatus.Success) { - binding.chatView.getMessageListView().revokeMessage(messageResult.getData()); - } else if (messageResult.getLoadStatus() == LoadStatus.Error) { - FetchResult.ErrorMsg errorMsg = messageResult.getError(); - if (errorMsg != null) { - ToastX.showShortToast(errorMsg.getRes()); - } - } - }); - - viewModel - .getUserInfoLiveData() - .observe( - getViewLifecycleOwner(), - userResult -> { - if (userResult.getLoadStatus() == LoadStatus.Finish - && userResult.getType() == FetchResult.FetchType.Update) { - binding.chatView.getMessageListView().updateUserInfo(userResult.getData()); + messageLiveDataObserver = + listFetchResult -> { + boolean hasMore = listFetchResult.getLoadStatus() != LoadStatus.Finish; + if (listFetchResult.getTypeIndex() == 0) { + ALog.d(LOG_TAG, "message observe older forward has more:" + hasMore); + binding.chatView.getMessageListView().setHasMoreForwardMessages(hasMore); + binding.chatView.addMessageListForward(listFetchResult.getData()); + } else { + ALog.d(LOG_TAG, "message observe newer load has more:" + hasMore); + binding.chatView.getMessageListView().setHasMoreNewerMessages(hasMore); + binding.chatView.appendMessageList(listFetchResult.getData()); + } + }; + viewModel.getQueryMessageLiveData().observeForever(messageLiveDataObserver); + + sendLiveDataObserver = + chatMessageBeanFetchResult -> { + if (chatMessageBeanFetchResult.getType() == FetchResult.FetchType.Add) { + ALog.d(LOG_TAG, "send message add"); + if (binding.chatView.getMessageListView().hasMoreNewerMessages()) { + binding.chatView.clearMessageList(); + binding.chatView.appendMessage(chatMessageBeanFetchResult.getData()); + if (chatMessageBeanFetchResult.getData() != null) { + binding.chatView.getMessageListView().setHasMoreNewerMessages(false); + viewModel.fetchMoreMessage( + chatMessageBeanFetchResult.getData().getMessageData().getMessage(), + QueryDirectionEnum.QUERY_OLD); } - }); - - viewModel - .getAddPinMessageLiveData() - .observe( - getViewLifecycleOwner(), - responseOption -> - binding - .chatView - .getMessageListView() - .addPinMessage(responseOption.first, responseOption.second)); - - viewModel - .getRemovePinMessageLiveData() - .observe( - getViewLifecycleOwner(), - uuid -> binding.chatView.getMessageListView().removePinMessage(uuid)); + } else { + binding.chatView.appendMessage(chatMessageBeanFetchResult.getData()); + } + } else { + binding.chatView.updateMessage(chatMessageBeanFetchResult.getData()); + } + }; + viewModel.getSendMessageLiveData().observeForever(sendLiveDataObserver); + + attachLiveDataObserver = + attachmentProgressFetchResult -> { + binding.chatView.updateProgress(attachmentProgressFetchResult.getData()); + }; + viewModel.getAttachmentProgressMutableLiveData().observeForever(attachLiveDataObserver); + + revokeLiveDataObserver = + messageResult -> { + if (messageResult.getLoadStatus() == LoadStatus.Success) { + binding.chatView.getMessageListView().revokeMessage(messageResult.getData()); + } else if (messageResult.getLoadStatus() == LoadStatus.Error) { + FetchResult.ErrorMsg errorMsg = messageResult.getError(); + if (errorMsg != null) { + ToastX.showShortToast(errorMsg.getRes()); + } + } + }; + viewModel.getRevokeMessageLiveData().observeForever(revokeLiveDataObserver); + + userInfoLiveDataObserver = + userResult -> { + if (userResult.getLoadStatus() == LoadStatus.Finish + && userResult.getType() == FetchResult.FetchType.Update) { + binding.chatView.getMessageListView().updateUserInfo(userResult.getData()); + } + }; + viewModel.getUserInfoLiveData().observeForever(userInfoLiveDataObserver); + + addPinLiveDataObserver = + responseOption -> + binding + .chatView + .getMessageListView() + .addPinMessage(responseOption.first, responseOption.second); + viewModel.getAddPinMessageLiveData().observeForever(addPinLiveDataObserver); + + removePinLiveDataObserver = + uuid -> { + binding.chatView.getMessageListView().removePinMessage(uuid); + }; + viewModel.getRemovePinMessageLiveData().observeForever(removePinLiveDataObserver); pickMediaLauncher = registerForActivityResult( @@ -990,11 +1002,18 @@ public void onLost(NetworkInfo network) { @Override public void onDestroyView() { ALog.d(LOG_TAG, "onDestroyView"); + super.onDestroyView(); NetworkUtils.unregisterNetworkStatusChangedListener(networkStateListener); if (popMenu != null) { popMenu.hide(); } - super.onDestroyView(); + viewModel.getUserInfoLiveData().removeObserver(userInfoLiveDataObserver); + viewModel.getQueryMessageLiveData().removeObserver(messageLiveDataObserver); + viewModel.getAddPinMessageLiveData().removeObserver(addPinLiveDataObserver); + viewModel.getRemovePinMessageLiveData().removeObserver(removePinLiveDataObserver); + viewModel.getSendMessageLiveData().removeObserver(sendLiveDataObserver); + viewModel.getRevokeMessageLiveData().removeObserver(revokeLiveDataObserver); + viewModel.getAttachmentProgressMutableLiveData().removeObserver(attachLiveDataObserver); } /** for custom layout for ChatView */ diff --git a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/page/viewmodel/ChatBaseViewModel.java b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/page/viewmodel/ChatBaseViewModel.java index f3216d5a..acd56ff9 100644 --- a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/page/viewmodel/ChatBaseViewModel.java +++ b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/page/viewmodel/ChatBaseViewModel.java @@ -25,7 +25,7 @@ import com.netease.nimlib.sdk.msg.model.MsgPinOption; import com.netease.nimlib.sdk.msg.model.MsgPinSyncResponseOption; import com.netease.nimlib.sdk.msg.model.QueryDirectionEnum; -import com.netease.nimlib.sdk.msg.model.ShowNotificationWhenRevokeFilter; +import com.netease.nimlib.sdk.msg.model.RevokeMsgNotification; import com.netease.yunxin.kit.alog.ALog; import com.netease.yunxin.kit.chatkit.media.ImageUtil; import com.netease.yunxin.kit.chatkit.model.IMMessageInfo; @@ -78,6 +78,7 @@ public abstract class ChatBaseViewModel extends BaseViewModel { private long credibleTimestamp = -1; private final int messagePageSize = 100; + private final String Orientation_Vertical = "90"; private final EventObserver> receiveMessageObserver = new EventObserver>() { @@ -88,7 +89,7 @@ public void onEvent(@Nullable List event) { messageFetchResult.setData(convert(event)); messageFetchResult.setType(FetchResult.FetchType.Add); messageFetchResult.setTypeIndex(-1); - messageLiveData.setValue(messageFetchResult); + messageLiveData.postValue(messageFetchResult); } }; @@ -105,7 +106,19 @@ public void onEvent(@Nullable IMMessageInfo event) { sendMessageFetchResult.setData(new ChatMessageBean(event)); sendMessageFetchResult.setType(FetchResult.FetchType.Update); sendMessageFetchResult.setTypeIndex(-1); - sendMessageLiveData.setValue(sendMessageFetchResult); + sendMessageLiveData.postValue(sendMessageFetchResult); + } + }; + + private final EventObserver> msgSendingObserver = + new EventObserver>() { + @Override + public void onEvent(@Nullable List event) { + ALog.d( + LIB_TAG, TAG, "msg sending change -->> " + (event == null ? "null" : event.size())); + if (event != null && event.size() > 0) { + postMessageSend(event.get(0), false); + } } }; @@ -125,13 +138,13 @@ public void onEvent(@Nullable IMMessageInfo event) { attachmentProgressMutableLiveData.postValue(result); }; - private final ShowNotificationWhenRevokeFilter revokeFilter = - notification -> { - ALog.d(LIB_TAG, TAG, "revoke msg notification: " + notification.getMessage().toString()); + private Observer revokeMsgObserver = + revokeMsgNotification -> { + ALog.d(LIB_TAG, TAG, "revokeMsgObserver"); FetchResult fetchResult = new FetchResult<>(LoadStatus.Success); - fetchResult.setData(new ChatMessageBean(new IMMessageInfo(notification.getMessage()))); + fetchResult.setData( + new ChatMessageBean(new IMMessageInfo(revokeMsgNotification.getMessage()))); revokeMessageLiveData.postValue(fetchResult); - return true; }; private final UserInfoObserver userInfoObserver = @@ -140,7 +153,7 @@ public void onEvent(@Nullable IMMessageInfo event) { userInfoFetchResult.setData(userList); userInfoFetchResult.setType(FetchResult.FetchType.Update); userInfoFetchResult.setTypeIndex(-1); - userInfoLiveData.setValue(userInfoFetchResult); + userInfoLiveData.postValue(userInfoFetchResult); }; /** chat message revoke live data */ @@ -236,7 +249,8 @@ public void registerObservers() { ChatObserverRepo.registerReceiveMessageObserve(mSessionId, receiveMessageObserver); ChatObserverRepo.registerMsgStatusObserve(msgStatusObserver); ChatObserverRepo.registerAttachmentProgressObserve(attachmentProgressObserver); - ChatRepo.registerShowNotificationWhenRevokeFilter(revokeFilter); + ChatObserverRepo.registerMessageSendingObserve(mSessionId, msgSendingObserver); + ChatObserverRepo.registerRevokeMessageObserve(revokeMsgObserver); ChatRepo.registerUserInfoObserver(userInfoObserver); ChatObserverRepo.registerAddMessagePinObserve(msgPinAddObserver); ChatObserverRepo.registerRemoveMessagePinObserve(msgPinRemoveObserver); @@ -247,6 +261,8 @@ public void unregisterObservers() { ChatObserverRepo.unregisterReceiveMessageObserve(mSessionId, receiveMessageObserver); ChatObserverRepo.unregisterMsgStatusObserve(msgStatusObserver); ChatObserverRepo.unregisterAttachmentProgressObserve(attachmentProgressObserver); + ChatObserverRepo.unregisterMessageSendingObserve(mSessionId, msgSendingObserver); + ChatObserverRepo.unregisterRevokeMessageObserve(revokeMsgObserver); ChatRepo.unregisterUserInfoObserver(userInfoObserver); ChatObserverRepo.unregisterAddMessagePinObserve(msgPinAddObserver); ChatObserverRepo.unregisterRemoveMessagePinObserve(msgPinRemoveObserver); @@ -311,7 +327,7 @@ public void replyImageMessage(File imageFile, IMMessage message) { public void sendVideoMessage( File videoFile, long duration, int width, int height, String displayName) { if (videoFile != null) { - ALog.d(LIB_TAG, TAG, "replyImageMessage:" + videoFile.getPath()); + ALog.d(LIB_TAG, TAG, "sendVideoMessage:" + videoFile.getPath()); IMMessage message = MessageBuilder.createVideoMessage( mSessionId, mSessionType, videoFile, duration, width, height, displayName); @@ -345,6 +361,17 @@ public void sendImageOrVideoMessage(Uri uri) { String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); String width = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); String height = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); + String orientation = + mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); + if (TextUtils.equals(orientation, Orientation_Vertical)) { + String local = width; + width = height; + height = local; + } + ALog.e( + LIB_TAG, + TAG, + "width:" + width + "height" + height + "orientation:" + orientation); sendVideoMessage( file, Long.parseLong(duration), @@ -409,9 +436,9 @@ public void sendMessage(IMMessage message, boolean resend, boolean needSendMessa if (SettingRepo.getShowReadStatus()) { message.setMsgAck(); } - if (needSendMessage) { - onMessageSend(message, resend); - } + // if (needSendMessage) { + // onMessageSend(message, resend); + // } ChatRepo.sendMessage(message, resend, null); } } @@ -652,7 +679,7 @@ public void replyMessage(IMMessage message, IMMessage replyMsg, boolean resend) ALog.d(LIB_TAG, TAG, "replyMessage,message" + (message == null ? "null" : message.getUuid())); message.setThreadOption(replyMsg); message.setMsgAck(); - onMessageSend(message, resend); + // onMessageSend(message, resend); ChatRepo.replyMessage(message, replyMsg, resend, null); } @@ -705,11 +732,11 @@ public MutableLiveData getRemovePinMessageLiveData() { new Pair<>( msgPinSyncResponseOption.getKey().getUuid(), msgPinSyncResponseOption.getPinOption()); - addPinMessageLiveData.setValue(pinInfo); + addPinMessageLiveData.postValue(pinInfo); }; private final Observer msgPinRemoveObserver = - responseOption -> removePinMessageLiveData.setValue(responseOption.getKey().getUuid()); + responseOption -> removePinMessageLiveData.postValue(responseOption.getKey().getUuid()); public void addMessagePin(IMMessageInfo messageInfo, String ext) { ALog.d( @@ -749,7 +776,7 @@ public long getUpdateTime() { }; Pair pinInfo = new Pair<>(messageInfo.getMessage().getUuid(), pinOption); - addPinMessageLiveData.setValue(pinInfo); + addPinMessageLiveData.postValue(pinInfo); } }); } diff --git a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/page/viewmodel/ChatP2PViewModel.java b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/page/viewmodel/ChatP2PViewModel.java index 61423b21..42ef12c8 100644 --- a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/page/viewmodel/ChatP2PViewModel.java +++ b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/page/viewmodel/ChatP2PViewModel.java @@ -131,6 +131,13 @@ public void registerObservers() { ChatObserverRepo.registerCustomNotificationObserve(customNotificationObserver); } + @Override + public void unregisterObservers() { + super.unregisterObservers(); + ChatObserverRepo.unregisterMessageReceiptObserve(messageReceiptObserver); + ChatObserverRepo.unregisterCustomNotificationObserve(customNotificationObserver); + } + @Override public void sendReceipt(IMMessage message) { ALog.d(LIB_TAG, TAG, "sendReceipt:" + (message == null ? "null" : message.getUuid())); diff --git a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/page/viewmodel/ChatTeamViewModel.java b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/page/viewmodel/ChatTeamViewModel.java index f45b1ae0..13f92e6e 100644 --- a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/page/viewmodel/ChatTeamViewModel.java +++ b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/page/viewmodel/ChatTeamViewModel.java @@ -98,6 +98,13 @@ public void registerObservers() { ChatObserverRepo.registerTeamUpdateObserver(teamObserver); } + @Override + public void unregisterObservers() { + super.unregisterObservers(); + ChatObserverRepo.unregisterTeamMessageReceiptObserve(teamMessageReceiptObserver); + ChatObserverRepo.unregisterTeamUpdateObserver(teamObserver); + } + @Override public void sendReceipt(IMMessage message) { ALog.d(LIB_TAG, TAG, "sendReceipt:" + (message == null ? "null" : message.getUuid())); diff --git a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/input/MessageBottomLayout.java b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/input/MessageBottomLayout.java index 17ee8818..68e39f35 100644 --- a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/input/MessageBottomLayout.java +++ b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/input/MessageBottomLayout.java @@ -95,7 +95,7 @@ public void init(List items, IMessageProxy proxy) { onAlbumClick(); break; case ActionConstants.ACTION_TYPE_FILE: - mProxy.sendFile(replyMessage); + mProxy.sendFile(); clearReplyMsg(); break; case ActionConstants.ACTION_TYPE_MORE: diff --git a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/interfaces/IMessageItemClickListener.java b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/interfaces/IMessageItemClickListener.java index 1354d3fa..59b8cc20 100644 --- a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/interfaces/IMessageItemClickListener.java +++ b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/interfaces/IMessageItemClickListener.java @@ -25,6 +25,10 @@ default boolean onSelfIconClick(View view, int position, ChatMessageBean message return false; } + default boolean onSelfIconLongClick(View view, int position, ChatMessageBean messageInfo) { + return false; + } + default boolean onUserIconLongClick(View view, int position, ChatMessageBean messageInfo) { return false; } diff --git a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/interfaces/IMessageProxy.java b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/interfaces/IMessageProxy.java index e9b923a3..f2201dac 100644 --- a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/interfaces/IMessageProxy.java +++ b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/interfaces/IMessageProxy.java @@ -19,7 +19,7 @@ public interface IMessageProxy { void captureVideo(); - boolean sendFile(ChatMessageBean replyMsg); + boolean sendFile(); boolean sendAudio(File audioFile, long audioLength, ChatMessageBean replyMsg); diff --git a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/message/viewholder/ChatBaseMessageViewHolder.java b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/message/viewholder/ChatBaseMessageViewHolder.java index d47cb44f..e304b32e 100644 --- a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/message/viewholder/ChatBaseMessageViewHolder.java +++ b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/message/viewholder/ChatBaseMessageViewHolder.java @@ -496,9 +496,15 @@ private void setStatusCallback() { baseViewBinding.fromAvatar.setOnClickListener( v -> itemClickListener.onUserIconClick(v, position, currentMessage)); + baseViewBinding.fromAvatar.setOnLongClickListener( + v -> itemClickListener.onUserIconLongClick(v, position, currentMessage)); + baseViewBinding.avatarMine.setOnClickListener( v -> itemClickListener.onSelfIconClick(v, position, currentMessage)); + baseViewBinding.avatarMine.setOnLongClickListener( + v -> itemClickListener.onSelfIconLongClick(v, position, currentMessage)); + baseViewBinding.messageContainer.setOnLongClickListener( v -> itemClickListener.onMessageLongClick(v, position, currentMessage)); diff --git a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/message/viewholder/ChatTipsMessageViewHolder.java b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/message/viewholder/ChatTipsMessageViewHolder.java index c13a3cc6..e6bc1963 100644 --- a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/message/viewholder/ChatTipsMessageViewHolder.java +++ b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/message/viewholder/ChatTipsMessageViewHolder.java @@ -37,12 +37,19 @@ public void addContainer() { @Override public void bindData(ChatMessageBean message, ChatMessageBean lastMessage) { super.bindData(message, lastMessage); - Map extension = message.getMessageData().getMessage().getRemoteExtension(); - if (extension != null && extension.get(KEY_TEAM_CREATED_TIP) != null) { + String content = message.getMessageData().getMessage().getContent(); + if (content == null || content.isEmpty()) { + // create team tip + Map extension = message.getMessageData().getMessage().getRemoteExtension(); + if (extension != null && extension.get(KEY_TEAM_CREATED_TIP) != null) { + content = extension.get(KEY_TEAM_CREATED_TIP).toString(); + } + } + if (content != null && !content.isEmpty()) { textBinding.messageText.setTextColor( IMKitClient.getApplicationContext().getResources().getColor(R.color.color_999999)); textBinding.messageText.setTextSize(12); - textBinding.messageText.setText(extension.get(KEY_TEAM_CREATED_TIP).toString()); + textBinding.messageText.setText(content); } else { baseViewBinding.baseRoot.setVisibility(View.GONE); } diff --git a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/popmenu/ChatActionFactory.java b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/popmenu/ChatActionFactory.java index 15f4acc8..03aad141 100644 --- a/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/popmenu/ChatActionFactory.java +++ b/chatkit-ui/src/main/java/com/netease/yunxin/kit/chatkit/ui/view/popmenu/ChatActionFactory.java @@ -11,6 +11,7 @@ import com.netease.yunxin.kit.chatkit.ui.R; import com.netease.yunxin.kit.chatkit.ui.model.ChatMessageBean; import com.netease.yunxin.kit.chatkit.ui.view.input.ActionConstants; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -18,9 +19,9 @@ public class ChatActionFactory { private static volatile ChatActionFactory instance; - private IChatPopMenuClickListener actionListener; + private WeakReference actionListener; - private IChatPopMenu customPopMenu; + private WeakReference customPopMenu; private ChatActionFactory() {} @@ -36,11 +37,11 @@ public static ChatActionFactory getInstance() { } public void setActionListener(IChatPopMenuClickListener actionListener) { - this.actionListener = actionListener; + this.actionListener = new WeakReference<>(actionListener); } public void setChatPopMenu(IChatPopMenu popMenu) { - this.customPopMenu = popMenu; + this.customPopMenu = new WeakReference<>(popMenu); } public List getNormalActions(ChatMessageBean message) { @@ -48,7 +49,9 @@ public List getNormalActions(ChatMessageBean message) { if (message.getMessageData() == null) { return actions; } - if (customPopMenu == null || customPopMenu.showDefaultPopMenu()) { + if (customPopMenu == null + || customPopMenu.get() == null + || customPopMenu.get().showDefaultPopMenu()) { if (message.getMessageData().getMessage().getStatus() == MsgStatusEnum.fail || message.getMessageData().getMessage().getStatus() == MsgStatusEnum.sending) { if (message.getViewType() == MsgTypeEnum.text.getValue()) { @@ -65,7 +68,9 @@ public List getNormalActions(ChatMessageBean message) { if (message.getViewType() != MsgTypeEnum.audio.getValue()) { actions.add(getTransmitAction(message)); } - actions.add(getPinAction(message)); + if (message.getViewType() != MsgTypeEnum.location.getValue()) { + actions.add(getPinAction(message)); + } // actions.add(getMultiSelectAction(message)); // actions.add(getCollectionAction(message)); actions.add(getDeleteAction(message)); @@ -73,8 +78,8 @@ public List getNormalActions(ChatMessageBean message) { actions.add(getRecallAction(message)); } } - if (customPopMenu != null) { - return customPopMenu.customizePopMenu(actions, message); + if (customPopMenu != null && customPopMenu.get() != null) { + return customPopMenu.get().customizePopMenu(actions, message); } return actions; } @@ -86,7 +91,7 @@ private ChatPopMenuAction getReplyAction(ChatMessageBean message) { R.drawable.ic_message_reply, (view, messageInfo) -> { if (actionListener != null) { - actionListener.onReply(messageInfo); + actionListener.get().onReply(messageInfo); } }); } @@ -98,7 +103,7 @@ private ChatPopMenuAction getCopyAction(ChatMessageBean message) { R.drawable.ic_message_copy, (view, messageInfo) -> { if (actionListener != null) { - actionListener.onCopy(messageInfo); + actionListener.get().onCopy(messageInfo); } }); } @@ -110,7 +115,7 @@ private ChatPopMenuAction getRecallAction(ChatMessageBean message) { R.drawable.ic_message_recall, (view, messageInfo) -> { if (actionListener != null) { - actionListener.onRecall(messageInfo); + actionListener.get().onRecall(messageInfo); } }); } @@ -124,7 +129,9 @@ private ChatPopMenuAction getPinAction(ChatMessageBean message) { R.drawable.ic_message_sign, (view, messageInfo) -> { if (actionListener != null) { - actionListener.onSignal(messageInfo, !TextUtils.isEmpty(messageInfo.getPinAccid())); + actionListener + .get() + .onSignal(messageInfo, !TextUtils.isEmpty(messageInfo.getPinAccid())); } }); } @@ -136,7 +143,7 @@ private ChatPopMenuAction getMultiSelectAction(ChatMessageBean message) { R.drawable.ic_message_multi_select, (view, messageInfo) -> { if (actionListener != null) { - actionListener.onMultiSelected(messageInfo); + actionListener.get().onMultiSelected(messageInfo); } }); } @@ -148,7 +155,7 @@ private ChatPopMenuAction getCollectionAction(ChatMessageBean message) { R.drawable.ic_message_collection, (view, messageInfo) -> { if (actionListener != null) { - actionListener.onCollection(messageInfo); + actionListener.get().onCollection(messageInfo); } }); } @@ -160,7 +167,7 @@ private ChatPopMenuAction getDeleteAction(ChatMessageBean message) { R.drawable.ic_message_delete, (view, messageInfo) -> { if (actionListener != null) { - actionListener.onDelete(message); + actionListener.get().onDelete(message); } }); } @@ -172,7 +179,7 @@ private ChatPopMenuAction getTransmitAction(ChatMessageBean message) { R.drawable.ic_message_transmit, (view, messageInfo) -> { if (actionListener != null) { - actionListener.onForward(messageInfo); + actionListener.get().onForward(messageInfo); } }); } diff --git a/chatkit-ui/src/main/res/drawable/chat_message_other_bg.xml b/chatkit-ui/src/main/res/drawable/chat_message_other_bg.xml index ce843b7c..f5dcc016 100644 --- a/chatkit-ui/src/main/res/drawable/chat_message_other_bg.xml +++ b/chatkit-ui/src/main/res/drawable/chat_message_other_bg.xml @@ -1,8 +1,6 @@ - + + + diff --git a/chatkit-ui/src/main/res/drawable/chat_message_self_bg.xml b/chatkit-ui/src/main/res/drawable/chat_message_self_bg.xml index 59720c4f..7c77afee 100644 --- a/chatkit-ui/src/main/res/drawable/chat_message_self_bg.xml +++ b/chatkit-ui/src/main/res/drawable/chat_message_self_bg.xml @@ -1,8 +1,6 @@ - + + + diff --git a/chatkit-ui/src/main/res/drawable/ic_arrow_bottom.xml b/chatkit-ui/src/main/res/drawable/ic_arrow_bottom.xml index bd23c738..342b7b3a 100644 --- a/chatkit-ui/src/main/res/drawable/ic_arrow_bottom.xml +++ b/chatkit-ui/src/main/res/drawable/ic_arrow_bottom.xml @@ -1,8 +1,6 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + diff --git a/chatkit-ui/src/main/res/drawable/switch_thumb_on.xml b/chatkit-ui/src/main/res/drawable/switch_thumb_on.xml index 315599fb..1c8ba392 100644 --- a/chatkit-ui/src/main/res/drawable/switch_thumb_on.xml +++ b/chatkit-ui/src/main/res/drawable/switch_thumb_on.xml @@ -1,9 +1,7 @@ - + + + diff --git a/chatkit-ui/src/main/res/drawable/switch_thumb_selector.xml b/chatkit-ui/src/main/res/drawable/switch_thumb_selector.xml index fb76bace..704995dc 100644 --- a/chatkit-ui/src/main/res/drawable/switch_thumb_selector.xml +++ b/chatkit-ui/src/main/res/drawable/switch_thumb_selector.xml @@ -1,8 +1,6 @@ - + + + diff --git a/chatkit-ui/src/main/res/drawable/switch_track_off.xml b/chatkit-ui/src/main/res/drawable/switch_track_off.xml index ea397e56..33260587 100644 --- a/chatkit-ui/src/main/res/drawable/switch_track_off.xml +++ b/chatkit-ui/src/main/res/drawable/switch_track_off.xml @@ -1,9 +1,7 @@ - + + + diff --git a/chatkit-ui/src/main/res/drawable/switch_track_on.xml b/chatkit-ui/src/main/res/drawable/switch_track_on.xml index bfec6242..11d8b7c4 100644 --- a/chatkit-ui/src/main/res/drawable/switch_track_on.xml +++ b/chatkit-ui/src/main/res/drawable/switch_track_on.xml @@ -1,9 +1,7 @@ - + + + diff --git a/chatkit-ui/src/main/res/drawable/switch_track_selector.xml b/chatkit-ui/src/main/res/drawable/switch_track_selector.xml index 59a51738..bd96695a 100644 --- a/chatkit-ui/src/main/res/drawable/switch_track_selector.xml +++ b/chatkit-ui/src/main/res/drawable/switch_track_selector.xml @@ -1,8 +1,6 @@ - + + + diff --git a/chatkit-ui/src/main/res/drawable/view_normal_selector.xml b/chatkit-ui/src/main/res/drawable/view_normal_selector.xml index b1afd866..25a3875a 100644 --- a/chatkit-ui/src/main/res/drawable/view_normal_selector.xml +++ b/chatkit-ui/src/main/res/drawable/view_normal_selector.xml @@ -1,9 +1,7 @@ - + + + diff --git a/contactkit-ui/build.gradle.kts b/contactkit-ui/build.gradle.kts index f4f284a1..19a91fb8 100644 --- a/contactkit-ui/build.gradle.kts +++ b/contactkit-ui/build.gradle.kts @@ -17,7 +17,7 @@ android { targetSdk = 30 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") - buildConfigField("String", "versionName", "\"9.2.11\"") + buildConfigField("String", "versionName", "\"9.2.12\"") } buildTypes { @@ -39,7 +39,7 @@ android { dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) - api("com.netease.yunxin.kit.contact:contactkit:9.2.11") + api("com.netease.yunxin.kit.contact:contactkit:9.2.12-rc01") api("com.netease.yunxin.kit.common:common-ui:1.1.10") api("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21") implementation("androidx.appcompat:appcompat:1.4.2") diff --git a/contactkit-ui/src/main/java/com/netease/yunxin/kit/contactkit/ui/userinfo/UserInfoViewModel.java b/contactkit-ui/src/main/java/com/netease/yunxin/kit/contactkit/ui/userinfo/UserInfoViewModel.java index a11400aa..a3401f91 100644 --- a/contactkit-ui/src/main/java/com/netease/yunxin/kit/contactkit/ui/userinfo/UserInfoViewModel.java +++ b/contactkit-ui/src/main/java/com/netease/yunxin/kit/contactkit/ui/userinfo/UserInfoViewModel.java @@ -198,8 +198,8 @@ public void updateAlias(String account, String alias) { } @Override - public void onDestroy() { - super.onDestroy(); + protected void onCleared() { + super.onCleared(); ContactRepo.unregisterUserInfoObserver(userInfoObserver); } } diff --git a/contactkit-ui/src/main/java/com/netease/yunxin/kit/contactkit/ui/verify/VerifyViewModel.java b/contactkit-ui/src/main/java/com/netease/yunxin/kit/contactkit/ui/verify/VerifyViewModel.java index a2a3bea3..7e148f00 100644 --- a/contactkit-ui/src/main/java/com/netease/yunxin/kit/contactkit/ui/verify/VerifyViewModel.java +++ b/contactkit-ui/src/main/java/com/netease/yunxin/kit/contactkit/ui/verify/VerifyViewModel.java @@ -211,6 +211,6 @@ private void resetMessageStatus(List infoList) { @Override protected void onCleared() { super.onCleared(); - ContactRepo.registerNotificationObserver(infoObserver); + ContactRepo.unregisterNotificationObserver(infoObserver); } } diff --git a/contactkit-ui/src/main/res/drawable/bg_shape_red_dot.xml b/contactkit-ui/src/main/res/drawable/bg_shape_red_dot.xml index f0f245e6..e34d1a6d 100644 --- a/contactkit-ui/src/main/res/drawable/bg_shape_red_dot.xml +++ b/contactkit-ui/src/main/res/drawable/bg_shape_red_dot.xml @@ -1,8 +1,6 @@ - + + + diff --git a/contactkit-ui/src/main/res/drawable/radio_button_not_selected.xml b/contactkit-ui/src/main/res/drawable/radio_button_not_selected.xml index 6f7206f8..3e03124c 100644 --- a/contactkit-ui/src/main/res/drawable/radio_button_not_selected.xml +++ b/contactkit-ui/src/main/res/drawable/radio_button_not_selected.xml @@ -1,8 +1,6 @@ - + + + + + + + + + diff --git a/conversationkit-ui/build.gradle.kts b/conversationkit-ui/build.gradle.kts index f994ecdc..41955ed3 100644 --- a/conversationkit-ui/build.gradle.kts +++ b/conversationkit-ui/build.gradle.kts @@ -17,7 +17,7 @@ android { targetSdk = 30 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") - buildConfigField("String", "versionName", "\"9.2.11\"") + buildConfigField("String", "versionName", "\"9.2.12\"") } buildTypes { @@ -39,7 +39,7 @@ android { dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) - api("com.netease.yunxin.kit.conversation:conversationkit:9.2.11") + api("com.netease.yunxin.kit.conversation:conversationkit:9.2.12-rc01") api("com.netease.yunxin.kit.common:common-ui:1.1.10") api("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21") implementation("androidx.appcompat:appcompat:1.4.2") diff --git a/conversationkit-ui/src/main/java/com/netease/yunxin/kit/conversationkit/ui/ConversationCustom.java b/conversationkit-ui/src/main/java/com/netease/yunxin/kit/conversationkit/ui/ConversationCustom.java new file mode 100644 index 00000000..4e2b2a12 --- /dev/null +++ b/conversationkit-ui/src/main/java/com/netease/yunxin/kit/conversationkit/ui/ConversationCustom.java @@ -0,0 +1,43 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.netease.yunxin.kit.conversationkit.ui; + +import android.content.Context; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.netease.yunxin.kit.conversationkit.model.ConversationInfo; +import com.netease.yunxin.kit.corekit.im.model.AttachmentContent; + +public abstract class ConversationCustom { + public String customContentText(Context context, ConversationInfo conversationInfo) { + if (conversationInfo != null && context != null) { + MsgTypeEnum typeEnum = conversationInfo.getMsgType(); + switch (typeEnum) { + case notification: + return context.getString(R.string.msg_type_notification); + case text: + return conversationInfo.getContent(); + case audio: + return context.getString(R.string.msg_type_audio); + case video: + return context.getString(R.string.msg_type_video); + case tip: + return context.getString(R.string.msg_type_tip); + case image: + return context.getString(R.string.msg_type_image); + case file: + return context.getString(R.string.msg_type_file); + case custom: + String result = conversationInfo.getContent(); + if (conversationInfo.getAttachment() instanceof AttachmentContent) { + result = ((AttachmentContent) conversationInfo.getAttachment()).getContent(); + } + return result; + default: + return context.getString(R.string.msg_type_no_tips); + } + } + return ""; + } +} diff --git a/conversationkit-ui/src/main/java/com/netease/yunxin/kit/conversationkit/ui/ConversationUIConfig.java b/conversationkit-ui/src/main/java/com/netease/yunxin/kit/conversationkit/ui/ConversationUIConfig.java index 9c893c67..dde9eea7 100644 --- a/conversationkit-ui/src/main/java/com/netease/yunxin/kit/conversationkit/ui/ConversationUIConfig.java +++ b/conversationkit-ui/src/main/java/com/netease/yunxin/kit/conversationkit/ui/ConversationUIConfig.java @@ -41,6 +41,7 @@ public class ConversationUIConfig { public float avatarCornerRadius = INT_DEFAULT_NULL; public Drawable itemStickTopBackground; public Drawable itemBackground; + public ConversationCustom conversationCustom; public IConversationViewLayout customLayout; } diff --git a/conversationkit-ui/src/main/java/com/netease/yunxin/kit/conversationkit/ui/common/ConversationUtils.java b/conversationkit-ui/src/main/java/com/netease/yunxin/kit/conversationkit/ui/common/ConversationUtils.java index 3315c574..8ea3895a 100644 --- a/conversationkit-ui/src/main/java/com/netease/yunxin/kit/conversationkit/ui/common/ConversationUtils.java +++ b/conversationkit-ui/src/main/java/com/netease/yunxin/kit/conversationkit/ui/common/ConversationUtils.java @@ -5,59 +5,44 @@ package com.netease.yunxin.kit.conversationkit.ui.common; import android.content.Context; -import android.text.TextUtils; import com.netease.nimlib.sdk.msg.attachment.NotificationAttachment; -import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; import com.netease.nimlib.sdk.msg.constant.NotificationType; import com.netease.yunxin.kit.conversationkit.model.ConversationInfo; -import com.netease.yunxin.kit.conversationkit.ui.R; -import com.netease.yunxin.kit.corekit.im.IMKitClient; -import com.netease.yunxin.kit.corekit.im.model.AttachmentContent; +import com.netease.yunxin.kit.conversationkit.ui.ConversationCustom; +import com.netease.yunxin.kit.conversationkit.ui.ConversationKitClient; public class ConversationUtils { + private static ConversationCustom custom = + new ConversationCustom() { + @Override + public String customContentText(Context context, ConversationInfo conversationInfo) { + return super.customContentText(context, conversationInfo); + } + }; + public static boolean isMineLeave(ConversationInfo conversationInfo) { if (conversationInfo.getAttachment() instanceof NotificationAttachment) { NotificationAttachment notify = (NotificationAttachment) conversationInfo.getAttachment(); - if (notify.getType() == NotificationType.DismissTeam - || notify.getType() == NotificationType.KickMember - || (notify.getType() == NotificationType.LeaveTeam - && TextUtils.equals(conversationInfo.getFromAccount(), IMKitClient.account()))) { + if (notify.getType() == NotificationType.DismissTeam) { return true; } + return (notify.getType() == NotificationType.KickMember + || notify.getType() == NotificationType.LeaveTeam) + && conversationInfo.getTeamInfo() != null + && !conversationInfo.getTeamInfo().isMyTeam(); } return false; } public static String getConversationText(Context context, ConversationInfo conversationInfo) { - if (conversationInfo != null && context != null) { - MsgTypeEnum typeEnum = conversationInfo.getMsgType(); - switch (typeEnum) { - case notification: - return context.getString(R.string.msg_type_notification); - // case file: - // return context.getString(R.string.msg_type_file); - case text: - return conversationInfo.getContent(); - case audio: - return context.getString(R.string.msg_type_audio); - case video: - return context.getString(R.string.msg_type_video); - case tip: - return context.getString(R.string.msg_type_tip); - case image: - return context.getString(R.string.msg_type_image); - case custom: - String result = conversationInfo.getContent(); - if (conversationInfo.getAttachment() instanceof AttachmentContent) { - result = ((AttachmentContent) conversationInfo.getAttachment()).getContent(); - } - return result; - default: - return context.getString(R.string.msg_type_no_tips); - } + if (ConversationKitClient.getConversationUIConfig() != null + && ConversationKitClient.getConversationUIConfig().conversationCustom != null) { + return ConversationKitClient.getConversationUIConfig() + .conversationCustom + .customContentText(context, conversationInfo); } - return ""; + return custom.customContentText(context, conversationInfo); } } diff --git a/qchatkit-ui/build.gradle.kts b/qchatkit-ui/build.gradle.kts index b67153ad..25f6d498 100644 --- a/qchatkit-ui/build.gradle.kts +++ b/qchatkit-ui/build.gradle.kts @@ -17,7 +17,7 @@ android { targetSdk = 30 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") - buildConfigField("String", "versionName", "\"9.2.10\"") + buildConfigField("String", "versionName", "\"9.2.12\"") } buildTypes { @@ -39,7 +39,7 @@ android { dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) - api("com.netease.yunxin.kit.qchat:qchatkit:9.2.11") + api("com.netease.yunxin.kit.qchat:qchatkit:9.2.12-rc01") api("com.netease.yunxin.kit.common:common-ui:1.1.10") api("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21") implementation("androidx.appcompat:appcompat:1.4.2") diff --git a/qchatkit-ui/src/main/java/com/netease/yunxin/kit/qchatkit/ui/message/QChatChannelMessageFragment.java b/qchatkit-ui/src/main/java/com/netease/yunxin/kit/qchatkit/ui/message/QChatChannelMessageFragment.java index 5854f658..4aa244a3 100644 --- a/qchatkit-ui/src/main/java/com/netease/yunxin/kit/qchatkit/ui/message/QChatChannelMessageFragment.java +++ b/qchatkit-ui/src/main/java/com/netease/yunxin/kit/qchatkit/ui/message/QChatChannelMessageFragment.java @@ -341,9 +341,7 @@ public void onSuccess(@Nullable Integer param) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Uri uri; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - uri = - CommonFileProvider.Companion.getUriForFile( - getActivity(), getActivity().getPackageName() + ".IMKitFileProvider", file); + uri = CommonFileProvider.Companion.getUriForFile(getActivity(), file); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } else { uri = Uri.fromFile(file); diff --git a/qchatkit-ui/src/main/res/drawable/ic_add.xml b/qchatkit-ui/src/main/res/drawable/ic_add.xml index 50075a30..c6ebbe98 100644 --- a/qchatkit-ui/src/main/res/drawable/ic_add.xml +++ b/qchatkit-ui/src/main/res/drawable/ic_add.xml @@ -1,8 +1,6 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/qchatkit-ui/src/main/res/drawable/ic_red_close.xml b/qchatkit-ui/src/main/res/drawable/ic_red_close.xml index e83da3a5..fdcdfacd 100644 --- a/qchatkit-ui/src/main/res/drawable/ic_red_close.xml +++ b/qchatkit-ui/src/main/res/drawable/ic_red_close.xml @@ -1,8 +1,6 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + +