diff --git a/app/and_res_guard.gradle b/app/and_res_guard.gradle index 33cd337c3..5209d663c 100644 --- a/app/and_res_guard.gradle +++ b/app/and_res_guard.gradle @@ -53,7 +53,41 @@ andResGuard { "R.id.iv_group_like", "R.id.iv_group_dont_like", "R.id.fl_group_content", - "R.id.svga_group_voice_like" + "R.id.svga_group_voice_like", + //for yidun + "R.drawable.bg_quick_pass*", + "R.drawable.quick_pass_*", + //for yidun liantong + "R.layout.activity_oauth", + "R.id.oauth_back", + "R.id.is_agree", + "R.id.oauth_title", + "R.id.app_name", + "R.id.oauth_mobile_et", + "R.id.oauth_login", + "R.id.service_and_privacy", + "R.id.authorize_app", + "R.id.brand", + "R.id.navigation_bar_line", + "R.id.oauth_logo", + "R.id.navigation_bar", + "R.id.protocol", + "R.id.oauth_content", + "R.id.other_login", + "R.id.login_before_text", + + "R.layout.oauth_loading_dialog", + "R.id.oauth_loading_dialog_txt", + "R.id.loading_parent", + "R.id.oauth_loading_dialog_img", + //for yidongka + "R.anim.umcsdk_*", + "R.drawable.dialog_loading", + "R.drawable.umcsdk_*", + "R.drawable.loading", + "R.string.umcsdk_*", + + ] compressFilePattern = [ "*.png", diff --git a/app/build.gradle b/app/build.gradle index 931080496..f15227a01 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -94,7 +94,8 @@ android { 'src/module_treasure_box/java', 'src/module_community/java', - 'src/module_album/java' + 'src/module_album/java', + 'src/module_quick_pass/java' ] @@ -115,7 +116,8 @@ android { 'src/module_treasure_box/res', 'src/module_community/res', - 'src/module_album/res' + 'src/module_album/res', + 'src/module_quick_pass/res' ] } @@ -241,6 +243,8 @@ dependencies { api(name: 'push-2.6.0.301', ext: 'aar') // 魅族推送 implementation 'com.meizu.flyme.internet:push-internal:3.6.3@aar' + // vivo推送 + implementation files("libs/vivo_pushsdk-v2.9.0.0.aar") // api 'com.aliyun.dpa:oss-android-sdk:2.2.0' api files('aliyun-libs/aliyun-oss-sdk-android-2.3.0.1.jar') @@ -271,10 +275,16 @@ dependencies { implementation 'it.sephiroth.android.library.imagezoom:library:1.0.4' + // 易盾一键登录 + implementation(name: 'quicklogin_libary-external-release', ext: 'aar') + implementation(name: 'CMCCSSOSDK-WY', ext: 'aar') + implementation(name: 'Ui-factory_oauth_mobile_3.8.3.1', ext: 'aar') + implementation(name: 'CTAccount_sdk_api_v3.7.0_all', ext: 'aar') + } repositories { flatDir { - dirs 'aliyun-libs', 'hw-push-libs' + dirs 'aliyun-libs', 'hw-push-libs', 'quick-pass-libs' } } diff --git a/app/libs/vivo_pushsdk-v2.9.0.0.aar b/app/libs/vivo_pushsdk-v2.9.0.0.aar new file mode 100644 index 000000000..c68c7630d Binary files /dev/null and b/app/libs/vivo_pushsdk-v2.9.0.0.aar differ diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 42b4c27d4..603b587be 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -304,3 +304,32 @@ #linkedMe -keep class com.microquation.linkedme.android.** { *; } + +# vivo推送 +-dontwarn com.vivo.push.** +-keep class com.vivo.push.**{*; } +-keep class com.vivo.vms.**{*; } +-keep class com.netease.nimlib.mixpush.vivo.VivoPush* {*;} +-keep class com.netease.nimlib.mixpush.vivo.VivoPushReceiver{*;} + +#一键登录 +-dontwarn com.cmic.sso.sdk.** +-keep public class com.cmic.sso.sdk.**{*;} +-keep class cn.com.chinatelecom.account.api.**{*;} +-keep class com.netease.nis.quicklogin.entity.**{*;} +-keep class com.netease.nis.quicklogin.listener.**{*;} +-keep class com.netease.nis.quicklogin.QuickLogin{ + public ; + public ; +} +-keep class com.netease.nis.quicklogin.helper.UnifyUiConfig{*;} +-keep class com.netease.nis.quicklogin.helper.UnifyUiConfig$Builder{ + public ; + public ; + } +-keep class com.netease.nis.quicklogin.utils.LoginUiHelper$CustomViewListener{ + public ; + public ; +} +-dontwarn com.sdk.** +-keep class com.sdk.** { *;} diff --git a/app/quick-pass-libs/CMCCSSOSDK-WY.aar b/app/quick-pass-libs/CMCCSSOSDK-WY.aar new file mode 100644 index 000000000..adf4c19c5 Binary files /dev/null and b/app/quick-pass-libs/CMCCSSOSDK-WY.aar differ diff --git a/app/quick-pass-libs/CTAccount_sdk_api_v3.7.0_all.aar b/app/quick-pass-libs/CTAccount_sdk_api_v3.7.0_all.aar new file mode 100644 index 000000000..412bc5f19 Binary files /dev/null and b/app/quick-pass-libs/CTAccount_sdk_api_v3.7.0_all.aar differ diff --git a/app/quick-pass-libs/Ui-factory_oauth_mobile_3.8.3.1.aar b/app/quick-pass-libs/Ui-factory_oauth_mobile_3.8.3.1.aar new file mode 100644 index 000000000..cbd2d4e83 Binary files /dev/null and b/app/quick-pass-libs/Ui-factory_oauth_mobile_3.8.3.1.aar differ diff --git a/app/quick-pass-libs/quicklogin_libary-external-release.aar b/app/quick-pass-libs/quicklogin_libary-external-release.aar new file mode 100644 index 000000000..e1726d21d Binary files /dev/null and b/app/quick-pass-libs/quicklogin_libary-external-release.aar differ diff --git a/app/resource_mapping.txt b/app/resource_mapping.txt index ded759141..57f11c375 100644 --- a/app/resource_mapping.txt +++ b/app/resource_mapping.txt @@ -1,2 +1,5 @@ res path mapping: res/drawable -> res/drawable + res/layout -> res/layout + res/anim -> res/anim + res/drawable-xxhdpi-v4 -> res/drawable-xxhdpi-v4 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3d567f194..1b8894209 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -74,6 +74,9 @@ + + + --> + + + + + + + + + + + + + + @@ -401,7 +428,7 @@ @@ -1129,6 +1157,12 @@ android:name=".ui.setting.NoticeSettingActivity" android:screenOrientation="portrait" /> + + \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/MainActivity.java b/app/src/main/java/com/yizhuan/erban/MainActivity.java index c437f5a96..58438cffd 100644 --- a/app/src/main/java/com/yizhuan/erban/MainActivity.java +++ b/app/src/main/java/com/yizhuan/erban/MainActivity.java @@ -62,6 +62,7 @@ import com.yizhuan.erban.decoration.view.widgets.ShowCarGuideDialog; import com.yizhuan.erban.family.view.activity.FamilyHomeActivity; import com.yizhuan.erban.guide.GuideActivity; import com.yizhuan.erban.home.dialog.RecommendRoomForNewerDialog; +import com.yizhuan.erban.home.fragment.CommunityNoticeAct; import com.yizhuan.erban.home.fragment.FindTabFragment; import com.yizhuan.erban.home.fragment.GameHomeFragment; import com.yizhuan.erban.home.fragment.MeFragment; @@ -71,11 +72,13 @@ import com.yizhuan.erban.home.presenter.MainPresenter; import com.yizhuan.erban.home.view.IMainView; import com.yizhuan.erban.luckymoney.viewholder.LuckyMoneyMsgViewHolder; import com.yizhuan.erban.luckymoney.viewholder.LuckyMoneyTipsViewHolder; +import com.yizhuan.erban.main.helper.NoticationsUiHelper; import com.yizhuan.erban.miniworld.activity.MiniWorldGuestPageActivity; import com.yizhuan.erban.module.Extras; import com.yizhuan.erban.module_hall.HallDataManager; import com.yizhuan.erban.module_hall.secretcode.PwdCodeMgr; import com.yizhuan.erban.public_chat_hall.msg.viewholder.MsgViewHolderAitMe; +import com.yizhuan.erban.quick_pass.QuickPassLoginAct; import com.yizhuan.erban.radish.signin.SignDialogTimeManager; import com.yizhuan.erban.service.DaemonService; import com.yizhuan.erban.treasure_box.service.OpenBoxService; @@ -101,6 +104,7 @@ import com.yizhuan.erban.ui.im.chat.MsgViewHolderText; import com.yizhuan.erban.ui.im.chat.MsgViewHolderTip; import com.yizhuan.erban.ui.im.chat.MsgViewHolderVoiceBottleSayHi; import com.yizhuan.erban.ui.im.chat.SignInNoticeMsgViewHolder; +import com.yizhuan.erban.ui.im.chat.SysMsgV2ViewHolder; import com.yizhuan.erban.ui.im.chat.SysMsgViewHolder; import com.yizhuan.erban.ui.im.chat.SysMsgVoiceViewHolder; import com.yizhuan.erban.ui.login.BinderPhoneActivity; @@ -164,6 +168,7 @@ import com.yizhuan.xchat_android_core.im.custom.bean.OpenRoomNotiAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.OpenSignInAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.RedPacketAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.SysMsgAttachment; +import com.yizhuan.xchat_android_core.im.custom.bean.SysMsgV2Attachment; import com.yizhuan.xchat_android_core.im.custom.bean.SysMsgVoiceAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.VoiceBottleSayHiAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.VoiceBottleShakeHeartAttachment; @@ -309,6 +314,9 @@ public class MainActivity extends BaseMvpActivity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + NimMiddleActivity.firstEnter = false; + if (savedInstanceState != null) { mCurrentMainPosition = savedInstanceState.getInt(Constants.KEY_MAIN_POSITION); } @@ -417,6 +425,8 @@ public class MainActivity extends BaseMvpActivity NimUIKit.registerMsgItemViewHolder(InAppSharingMiniWorldAttachment.class, InAppSharingMsgViewHolder.class); NimUIKit.registerMsgItemViewHolder(InAppSharingTeamAttachment.class, InAppSharingMsgViewHolder.class); NimUIKit.registerMsgItemViewHolder(SysMsgAttachment.class, SysMsgViewHolder.class); + //V2系统消息,废弃23 V1 + NimUIKit.registerMsgItemViewHolder(SysMsgV2Attachment.class, SysMsgV2ViewHolder.class); NimUIKit.registerMsgItemViewHolder(LevelUpAttachment.class, MsgViewHolderLevel.class); NimUIKit.registerMsgItemViewHolder(AitMeAttachment.class, MsgViewHolderAitMe.class); // 声音瓶子 @@ -649,14 +659,8 @@ public class MainActivity extends BaseMvpActivity */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { -// if (keyCode == KeyEvent.KEYCODE_BACK) { -// moveTaskToBack(true); -// return true; -// } -// return super.onKeyDown(keyCode, event); if (keyCode == KeyEvent.KEYCODE_BACK) { - /** * 防止华为机型未加入白名单时按返回键回到桌面再锁屏后几秒钟进程被杀 */ @@ -684,8 +688,6 @@ public class MainActivity extends BaseMvpActivity } catch (Exception e) { e.printStackTrace(); } -// moveTaskToBack(true); -// super.onBackPressed(); } @Subscribe(threadMode = ThreadMode.MAIN) @@ -788,6 +790,7 @@ public class MainActivity extends BaseMvpActivity } }); + openCommunityNotice(); } @Subscribe(threadMode = ThreadMode.MAIN) @@ -814,12 +817,14 @@ public class MainActivity extends BaseMvpActivity public void onLogout() { Logger.e(TAG, "onLogout Success ~~~~"); getMvpPresenter().exitRoom(); - LoginActivity.start(MainActivity.this); +// LoginActivity.start(MainActivity.this); + QuickPassLoginAct.start(MainActivity.this); PmDialogShowMrg.get().onLogout(); } public void onNeedLogin() { - LoginActivity.start(MainActivity.this); + NimMiddleActivity.openCommunity = false; + QuickPassLoginAct.start(MainActivity.this); } @@ -1172,6 +1177,7 @@ public class MainActivity extends BaseMvpActivity //这里稍微晚点访问 Single.timer(400, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread()) + .compose(bindUntilEvent(ActivityEvent.DESTROY)) .flatMap(new Function>() { @Override public SingleSource apply(Long aLong) throws Exception { @@ -1179,6 +1185,10 @@ public class MainActivity extends BaseMvpActivity } }) .subscribe(); + + //通知栏权限判断 + NoticationsUiHelper.handle(this, getDialogManager()); + } public LimitEnterRoomHelper getLimitEnterRoomHelper() { @@ -1243,6 +1253,8 @@ public class MainActivity extends BaseMvpActivity * 云信通知栏跳转的处理 */ private void handleNimIntent() { + openCommunityNotice(); + Intent intent = getIntent(); if (intent == null) { return; @@ -1253,6 +1265,19 @@ public class MainActivity extends BaseMvpActivity } } + /** + * 点击互动通知通知栏,重启进程打开互动通知页 + */ + private void openCommunityNotice() { + if (NimMiddleActivity.delayOpenCommunity) { + return; + } + if (NimMiddleActivity.openCommunity) { + NimMiddleActivity.openCommunity = false; + CommunityNoticeAct.start(this); + } + } + private Single handleChannelPageInfo(boolean isSplashOrLinkedme) { return ChannelPageModel.get().handleSplashOrLinkedmeJump(isSplashOrLinkedme) .compose(bindUntilEvent(ActivityEvent.DESTROY)) diff --git a/app/src/main/java/com/yizhuan/erban/NimMiddleActivity.java b/app/src/main/java/com/yizhuan/erban/NimMiddleActivity.java index 1c50b3642..ee279e90f 100644 --- a/app/src/main/java/com/yizhuan/erban/NimMiddleActivity.java +++ b/app/src/main/java/com/yizhuan/erban/NimMiddleActivity.java @@ -2,13 +2,18 @@ package com.yizhuan.erban; import android.content.Intent; import android.os.Bundle; +import android.util.Log; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.netease.nimlib.sdk.NimIntent; import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; import com.netease.nimlib.sdk.msg.model.IMMessage; import com.yizhuan.erban.avroom.activity.AVRoomActivity; import com.yizhuan.erban.base.BaseActivity; +import com.yizhuan.erban.home.fragment.CommunityNoticeAct; import com.yizhuan.erban.radish.signin.SignInActivity; +import com.yizhuan.erban.utils.PushMessageHandler; import com.yizhuan.xchat_android_core.auth.AuthModel; import com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.OpenRoomNotiAttachment; @@ -16,6 +21,7 @@ import com.yizhuan.xchat_android_core.im.custom.bean.OpenSignInAttachment; import com.yizhuan.xchat_android_library.utils.UIUtils; import java.util.ArrayList; +import java.util.Map; /** * Created by chenran on 2017/8/5. @@ -23,7 +29,7 @@ import java.util.ArrayList; public class NimMiddleActivity extends BaseActivity { - private static final String TAG = "NimMiddleActivity"; + private static final String TAG = "mix_push"; /** * 通知栏启动Main后,自动跳转到 msg tab */ @@ -32,16 +38,35 @@ public class NimMiddleActivity extends BaseActivity { public static String EXTRA_FROM_NOTIFICATION = "from_notification"; public static final String INTENT_ACTION_AVCHAT = "INTENT_ACTION_AVCHAT"; + public static boolean firstEnter = true; // 是否首次进入 + + /** + * 用于点击动态通知栏跳转到CommunityNoticeAct + * openCommunity:打开CommunityNoticeAct + * + * delayOpenCommunity:控制CommunityNoticeAct打开时机: + * 原因:部分机型可以直接打开NimMiddleActivity; 可以直接调用MainActivity.openCommunityNotice启动CommunityNoticeAct; + * 部分机型(魅蓝Note5(android7.0,Flyme7.3.0.0A))会先打开Splash,再打开NimMiddleActivity; 会导致Splash启动MainActivity.onNewIntent; + * 所以添加delayOpenCommunity字段让CommunityNoticeAct在MainActivity.onNewIntent再启动; + */ + public static boolean openCommunity = false; + public static boolean delayOpenCommunity = false; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Log.i(TAG, "NimMiddleActivity"); Intent intent = getIntent(); if (intent != null) { + + Map payload= (Map) intent.getSerializableExtra(PushMessageHandler.PAYLOAD_DATA); + if (intent.hasExtra(NimIntent.EXTRA_NOTIFY_CONTENT)) { parseNotifyIntent(intent); - return; } else if (intent.hasExtra(EXTRA_FROM_NOTIFICATION) || intent.hasExtra(INTENT_ACTION_AVCHAT)) { parseNormalIntent(intent); + } else if (payload != null) { + parsePayloadData(payload); } else { parseNormalIntent(null); } @@ -79,4 +104,42 @@ public class NimMiddleActivity extends BaseActivity { MainActivity.start(NimMiddleActivity.this, intent); finish(); } + + private void parsePayloadData(Map payload) { + Log.i(TAG, "rev pushMessage payload true"); + String data = payload.get("data"); + + try { + JSONObject object = JSON.parseObject(data); + int first = object.getInteger("first"); + int second = object.getInteger("second"); + + if (second == CustomAttachment.CUSTOM_DYNAMTC_UNREADCOUNT && AuthModel.get().getCurrentUid() > 0) { + + if (!firstEnter) { + CommunityNoticeAct.start(this); + finish(); + } else { + openCommunity = true; + parseNormalIntent(null); + } + + } else { + if (firstEnter) { + parseNormalIntent(null); + } else { + finish(); + } + } + + } catch (Exception ex) { + ex.printStackTrace(); + if (firstEnter) { + parseNormalIntent(null); + } else { + finish(); + } + } + + } } diff --git a/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java b/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java index 569b5e0f7..b44621f6d 100644 --- a/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java +++ b/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java @@ -31,6 +31,7 @@ import com.netease.nimlib.sdk.NIMClient; import com.netease.nimlib.sdk.SDKOptions; import com.netease.nimlib.sdk.StatusBarNotificationConfig; import com.netease.nimlib.sdk.mixpush.MixPushConfig; +import com.netease.nimlib.sdk.mixpush.NIMPushClient; import com.netease.nimlib.sdk.msg.MessageNotifierCustomization; import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; import com.netease.nimlib.sdk.msg.model.IMMessage; @@ -51,6 +52,7 @@ import com.yizhuan.erban.R; import com.yizhuan.erban.module_hall.HallDataManager; import com.yizhuan.erban.radish.wallet.RadishWalletManager; import com.yizhuan.erban.reciever.ConnectiveChangedReceiver; +import com.yizhuan.erban.utils.PushMessageHandler; import com.yizhuan.xchat_android_constants.XChatConstants; import com.yizhuan.xchat_android_core.Constants; import com.yizhuan.xchat_android_core.DemoCache; @@ -140,6 +142,9 @@ public class XChatApplication extends Application { instance = this; String channel = PackerNg.getChannel(this); initEnv(channel); + + // 注册自定义推送消息处理,这个是可选项 + NIMPushClient.registerMixPushMessageHandler(new PushMessageHandler()); //延迟初始化云信 NIMClient.init(this, null, options()); @@ -311,12 +316,23 @@ public class XChatApplication extends Application { MixPushConfig mixPushConfig = new MixPushConfig(); mixPushConfig.hwCertificateName = "tutuHuaweiAndroid"; - mixPushConfig.mzAppId = "118040"; - mixPushConfig.mzAppKey = "8ff2b4ccd52040399af1c3d526db32b2"; - mixPushConfig.mzCertificateName = "tutuMeizuAndroid"; - mixPushConfig.xmAppId = "2882303761517873288"; - mixPushConfig.xmAppKey = "5331787348288"; - mixPushConfig.xmCertificateName = "tutuXiaomiAndroid"; + + mixPushConfig.mzAppId = "125242"; + mixPushConfig.mzAppKey = "1c478e5eaace4c41ba269d2ca7c9bd69"; + mixPushConfig.mzCertificateName = "qingxunMeizuAndroid2"; + + mixPushConfig.xmAppId = "2882303761518089228"; + mixPushConfig.xmAppKey = "5781808939228"; + mixPushConfig.xmCertificateName = "qingxunXiaomiAndroid"; + + mixPushConfig.vivoCertificateName = "qingxunVivoAndroid"; + + // 下架状态,没有完成接入 +// mixPushConfig.oppoAppId = "30156338"; +// mixPushConfig.oppoAppKey = "4659eff1cab747c48fb6f44e2f522e83"; +// mixPushConfig.oppoAppSercet = "8c6a21854c8045068247c7e1168e29a8"; +// mixPushConfig.oppoCertificateName = "qingxunOppoAndroid"; + options.mixPushConfig = mixPushConfig; return options; @@ -538,7 +554,7 @@ public class XChatApplication extends Application { if (isDebug()) { //禁掉沙盒模式 - //EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX); + EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX); } RPSDK.initialize(getApplicationContext()); diff --git a/app/src/main/java/com/yizhuan/erban/avroom/adapter/BaseMicroViewAdapter.java b/app/src/main/java/com/yizhuan/erban/avroom/adapter/BaseMicroViewAdapter.java index 1a6edf2fc..7afc81fdf 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/adapter/BaseMicroViewAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/adapter/BaseMicroViewAdapter.java @@ -281,10 +281,10 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter implements View.OnClickListener, GiftDialog.OnGiftDialogBtnClickListener, IHomePartyView, OnMicroItemClickListener, PKBoardView.OnActionListener { - /** - * 显示关注房主的时间 - */ - public static final int SHOW_FOLLOW_TIME = 3 * 60 * 1000; + public static final int SHOW_JOIN_MINI_WORLD_TIME = 2 * 60 * 1000; private static final int MINI_WORLD_REQUEST_CODE = 101; private long myUid; @@ -3083,7 +3080,7 @@ public class HomePartyRoomFragment extends BaseMvpFragment { + + /** + * 显示关注房主的时间 + */ + public static final int SHOW_FOLLOW_TIME = 3 * 60 * 1000; + private final HomePartyModel mHomePartyMode; private final AvRoomModel mAvRoomModel; private final SuperAdminModel mSuperAdminModel; @@ -764,13 +773,21 @@ public class HomePartyPresenter extends BaseMvpPresenter { */ @SuppressLint("CheckResult") public void checkFollow(long uid) { - PraiseModel.get().isPraised(AuthModel.get().getCurrentUid(), uid) + Single.just("") + .delay(SHOW_FOLLOW_TIME, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .flatMap(new Function>() { + @Override + public SingleSource apply(String s) throws Exception { + return PraiseModel.get().isPraised(AuthModel.get().getCurrentUid(), uid); + } + }) .compose(bindUntilEvent(PresenterEvent.DESTROY)) .compose(RxHelper.handleSchAndExce()) .subscribe(new BiConsumer() { @Override public void accept(Boolean aBoolean, Throwable throwable) throws Exception { - if (getMvpView() == null) { + if (throwable != null || getMvpView() == null) { return; } //如果没有关注 diff --git a/app/src/main/java/com/yizhuan/erban/avroom/presenter/RoomManagerPresenter.java b/app/src/main/java/com/yizhuan/erban/avroom/presenter/RoomManagerPresenter.java index bd6608d86..fadf3b494 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/presenter/RoomManagerPresenter.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/presenter/RoomManagerPresenter.java @@ -50,6 +50,9 @@ public class RoomManagerPresenter extends BaseMvpPresenter { uids.add(member.getAccount()); } } + if (uids.size() == 0) { + return Single.just(new ArrayList()); + } return Single.zip( UserModel.get().loadUserInfoByUids(uids), Single.just(chatRoomMembers), diff --git a/app/src/main/java/com/yizhuan/erban/avroom/widget/GiftV2View.java b/app/src/main/java/com/yizhuan/erban/avroom/widget/GiftV2View.java index e42239705..4dac2b2a8 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/widget/GiftV2View.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/widget/GiftV2View.java @@ -23,6 +23,8 @@ import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; +import com.netease.nim.uikit.common.util.log.LogUtil; + import com.opensource.svgaplayer.SVGACallback; import com.opensource.svgaplayer.SVGADrawable; import com.opensource.svgaplayer.SVGAImageView; @@ -192,6 +194,12 @@ public class GiftV2View extends FrameLayout implements GiftEffectView.GiftEffect int senderPosition = AvRoomDataManager.get().getMicPosition(magicReceivedInfo.getUid()); int receivePosition = AvRoomDataManager.get().getMicPosition(magicReceivedInfo.getTargetUid()); + if (micViewPoint == null) { + //空的原因是麦位坐标延迟了500ms初始化 + LogUtil.print("magic micViewPoint is null"); + continue; + } + Point senderPoint = micViewPoint.get(senderPosition); Point receivePoint = micViewPoint.get(receivePosition); if (receivePoint == null) { //这种情况就是接收者已经不在麦上 @@ -252,6 +260,12 @@ public class GiftV2View extends FrameLayout implements GiftEffectView.GiftEffect if (roomInfo.isLeaveMode() && giftReceiveInfo.getTargetUid() == roomInfo.getUid()) receivePosition = -1; + if (micViewPoint == null) { + //产生空的原因是麦位坐标初始化有500ms延迟 + LogUtil.print("gift micViewPoint is null"); + continue; + } + Point senderPoint = micViewPoint.get(senderPosition); Point receivePoint = micViewPoint.get(receivePosition); if (receivePoint == null) { //这种情况就是接收者已经不在麦上 @@ -399,8 +413,6 @@ public class GiftV2View extends FrameLayout implements GiftEffectView.GiftEffect } private String getValidExplodeAnimationUrl(int magicId, String url) { - if (XChatApplication.isDebug() && TextUtils.isEmpty(url)) - return "https://img.erbanyy.com/FpjaLK6_69udWlC_T6P5rmpaWlvT"; if (!TextUtils.isEmpty(url)) return url; MagicInfo magicInfo = MagicModel.get().getMagicInfo(magicId); if (magicInfo == null) return ""; diff --git a/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java b/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java index 9b80a562b..963d4d0bf 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java @@ -29,6 +29,7 @@ import android.widget.TextView; import com.netease.nim.uikit.business.uinfo.UserInfoHelper; import com.netease.nim.uikit.common.ui.span.RadiusBackgroundSpan; +import com.netease.nim.uikit.common.util.log.LogUtil; import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessageExtension; @@ -46,7 +47,6 @@ import com.yizhuan.erban.avroom.game.PlayGameActivity; import com.yizhuan.erban.common.widget.CustomImageSpan; import com.yizhuan.erban.common.widget.OriginalDrawStatusClickSpan; import com.yizhuan.erban.common.widget.dialog.DialogManager; -import com.yizhuan.erban.event.OpenRoomIntroEvent; import com.yizhuan.erban.ui.widget.DividerItemDecoration; import com.yizhuan.erban.ui.widget.MyItemAnimator; import com.yizhuan.erban.ui.widget.UserInfoDialog; @@ -61,6 +61,7 @@ import com.yizhuan.xchat_android_core.decoration.car.bean.CarInfo; import com.yizhuan.xchat_android_core.gift.bean.GiftInfo; import com.yizhuan.xchat_android_core.gift.bean.GiftReceiveInfo; import com.yizhuan.xchat_android_core.gift.bean.GiftReceiver; +import com.yizhuan.xchat_android_core.helper.ImHelperUtils; import com.yizhuan.xchat_android_core.im.custom.bean.AuctionAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.CarveUpGoldAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment; @@ -84,6 +85,7 @@ import com.yizhuan.xchat_android_core.im.custom.bean.RoomBoxPrizeAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.RoomFollowOwnerAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.RoomNoticeAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.RoomTipAttachment; +import com.yizhuan.xchat_android_core.im.custom.bean.WelcomeAttachment; import com.yizhuan.xchat_android_core.im.game.ImGameInfo; import com.yizhuan.xchat_android_core.im.game.ImGameMode; import com.yizhuan.xchat_android_core.level.UserLevelResourceType; @@ -101,8 +103,10 @@ import com.yizhuan.xchat_android_core.monsterhunting.bean.MonsterProtocol; import com.yizhuan.xchat_android_core.noble.NobleInfo; import com.yizhuan.xchat_android_core.noble.NobleResourceType; import com.yizhuan.xchat_android_core.noble.NobleUtil; +import com.yizhuan.xchat_android_core.praise.PraiseModel; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; import com.yizhuan.xchat_android_core.room.bean.RoomMessageViewNoticeInfo; +import com.yizhuan.xchat_android_core.room.bean.WelcomeInfo; import com.yizhuan.xchat_android_core.room.face.DynamicFaceModel; import com.yizhuan.xchat_android_core.room.face.FaceInfo; import com.yizhuan.xchat_android_core.room.face.FaceReceiveInfo; @@ -110,15 +114,21 @@ import com.yizhuan.xchat_android_core.room.game.GameModel; import com.yizhuan.xchat_android_core.room.game.GameRespondEvent; import com.yizhuan.xchat_android_core.room.game.GameResultInfo; import com.yizhuan.xchat_android_core.room.ktv.bean.MusicInfo; +import com.yizhuan.xchat_android_core.room.model.AvRoomModel; import com.yizhuan.xchat_android_core.room.pk.attachment.RoomPkAttachment; import com.yizhuan.xchat_android_core.room.pk.bean.PKTeamInfo; import com.yizhuan.xchat_android_core.room.pk.bean.RoomPKInvitedUpMicMember; import com.yizhuan.xchat_android_core.room.pk.bean.RoomPkData; import com.yizhuan.xchat_android_core.room.queuing_mic.attachment.QueuingMicAttachment; import com.yizhuan.xchat_android_core.room.queuing_mic.bean.QueuingMicInfo; +import com.yizhuan.xchat_android_core.statistic.StatisticManager; +import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol; import com.yizhuan.xchat_android_core.super_admin.util.SuperAdminUtil; +import com.yizhuan.xchat_android_core.user.UserModel; import com.yizhuan.xchat_android_core.user.bean.UserInfo; - +import com.yizhuan.xchat_android_core.utils.ExtensionUtil; +import com.yizhuan.xchat_android_core.utils.net.DontWarnObserver; +import com.yizhuan.xchat_android_core.utils.net.RxHelper; import com.yizhuan.xchat_android_library.rxbus.RxBus; import com.yizhuan.xchat_android_library.utils.FormatUtils; import com.yizhuan.xchat_android_library.utils.JavaUtil; @@ -135,8 +145,11 @@ import java.util.Map; import java.util.Objects; import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.functions.Consumer; +import io.reactivex.functions.Function; import lombok.Setter; /** @@ -231,7 +244,12 @@ public class MessageView extends FrameLayout { } + private int imageHeight; + private int imageWidth; private void init(Context context) { + imageHeight= Utils.dip2px(context, 15); + imageWidth= Utils.dip2px(context, 59); + whiteColor = ContextCompat.getColor(context, R.color.white); greyColor = ContextCompat.getColor(context, R.color.white_transparent_50); roomTipNickColor = ContextCompat.getColor(context, R.color.color_FFEA7F); @@ -481,7 +499,7 @@ public class MessageView extends FrameLayout { // 清除聊天背景 clearBackground(tvContent); // 加上勋章 - setMsgNotification(chatRoomMessage, tvContent); + setMsgNotification(chatRoomMessage, tvContent, baseViewHolder.getAdapterPosition()); } else if (chatRoomMessage.getMsgType() == MsgTypeEnum.custom) { CustomAttachment attachment = (CustomAttachment) chatRoomMessage.getAttachment(); int first = attachment.getFirst(); @@ -715,6 +733,11 @@ public class MessageView extends FrameLayout { tvContent.setText(tvContent.getResources().getText(R.string.not_support_message_tip)); break; } + } else if (first == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_PUBLIC_SCREEN) { + if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_PUBLIC_SCREEN_WELCOME) { + //麦上用户对你的欢迎语 + setMicWelcomeContent(chatRoomMessage, tvContent, baseViewHolder.getAdapterPosition()); + } } else { tvContent.setTextColor(Color.WHITE); tvContent.setText(tvContent.getResources().getText(R.string.not_support_message_tip)); @@ -1485,17 +1508,27 @@ public class MessageView extends FrameLayout { String userLevel = NobleUtil.getLevel(UserLevelResourceType.EXPER_URL, chatRoomMessage); boolean newUser = NobleUtil.getIsNewUser(UserInfo.IS_NEW_USER, chatRoomMessage); boolean isOfficial = NobleUtil.getIsOfficial(UserInfo.IS_OFFICIAL, chatRoomMessage); - // LogUtil.e("mylog","是否新用户"+newUser); - // 内容 - SpannableBuilder text = new SpannableBuilder(tvContent) - .append(isOfficial ? ResourcesCompat.getDrawable(getResources(), + + SpannableBuilder text = new SpannableBuilder(tvContent); + text.append(isOfficial ? ResourcesCompat.getDrawable(getResources(), R.mipmap.ic_user_official_13dp, null) : null, badgeWidth, badgeHeight) .append(newUser ? Constants.NEW_USER_ICON : "", badgeWidth, badgeHeight) - .append(NobleUtil.getLocalResourcePath(userBadge), badgeWidth, badgeHeight) - .append(userLevel, expLevelWidth, expLevelHeight) + .append(NobleUtil.getLocalResourcePath(userBadge), badgeWidth, badgeHeight); + + // 官方主播认证 + String tvOfficialMask = NobleUtil.getLevel(UserInfo.OAC_NAME, chatRoomMessage); + String ivOfficialMask = NobleUtil.getLevel(UserInfo.OAC_ICON, chatRoomMessage); + if (!TextUtils.isEmpty(tvOfficialMask) && !TextUtils.isEmpty(ivOfficialMask) && extension != null) { // extension != null 表示自己 + text.appendBgAndContent(ivOfficialMask, tvOfficialMask, SizeUtils.dp2px(tvContent.getContext(), 59), + SizeUtils.dp2px(tvContent.getContext(), 15)); + } + + text.append(userLevel, expLevelWidth, expLevelHeight) .append(extension == null ? "我" : RegexUtil.getPrintableString(extension.getSenderNick()), new ForegroundColorSpan(greyColor)) - .append(":" + chatRoomMessage.getContent(), new ForegroundColorSpan(getResources().getColor(R.color.white))); + .append(":" + chatRoomMessage.getContent(), new ForegroundColorSpan(getResources().getColor(R.color.white))) + ; + tvContent.setText(text.build()); } @@ -1852,7 +1885,7 @@ public class MessageView extends FrameLayout { * @param chatRoomMessage - * @param tvContent - */ - private void setMsgNotification(ChatRoomMessage chatRoomMessage, TextView tvContent) { + private void setMsgNotification(ChatRoomMessage chatRoomMessage, TextView tvContent, int position) { ChatRoomNotificationAttachment attachment = (ChatRoomNotificationAttachment) chatRoomMessage.getAttachment(); String senderNick = ""; List nicks = attachment.getTargetNicks(); @@ -1864,6 +1897,7 @@ public class MessageView extends FrameLayout { //String userLevel = NobleUtil.getLevel(UserLevelResourceType.EXPER_URL, chatRoomMessage); boolean newUser = NobleUtil.getIsNewUser(UserInfo.IS_NEW_USER, chatRoomMessage); boolean isOfficial = NobleUtil.getIsOfficial(UserInfo.IS_OFFICIAL, chatRoomMessage); + // 座驾 String carName = NobleUtil.getCarName(CarInfo.CAR_NAME, chatRoomMessage); carName = TextUtils.isEmpty(carName) ? "" : "\"" + carName + "\""; @@ -1875,11 +1909,69 @@ public class MessageView extends FrameLayout { //2018.12.24 @测试 陈陈琳,进房不显示贵族勋章 // .append(NobleUtil.getLocalResourcePath(userBadge), badgeWidth, badgeHeight) // .append(userLevel, expLevelWidth, expLevelHeight) - .append(senderNick, new ForegroundColorSpan(roomTipColor)) + .append(senderNick, new ForegroundColorSpan(roomTipColor), + new OriginalDrawStatusClickSpan() { + @Override + public void onClick(@NonNull View view) { + if (clickConsumer != null) { + Single.just(chatRoomMessage.getFromAccount()) + .doOnSuccess(clickConsumer).subscribe(); + } + } + }) .append(TextUtils.isEmpty(carName) ? "" : " 驾着 ", new ForegroundColorSpan(greyColor)) .append(carName, new ForegroundColorSpan(roomTipColor)) .append(" 进入了房间 ", new ForegroundColorSpan(greyColor)); + + //如果自己在麦上,增加一个欢迎ta的按钮,并且这条消息不是自己的 + if (AvRoomDataManager.get().isOwnerOnMic() + && !UserModel.get().isMyseft(chatRoomMessage.getFromAccount()) + && !ExtensionUtil.isWelcomeLocal(chatRoomMessage)) { + text.append( + ResourcesCompat.getDrawable(getResources(), + R.drawable.icon_room_welcome, null), + UIUtil.dip2px(mContext, 47), + UIUtil.dip2px(mContext, 17), + new OriginalDrawStatusClickSpan() { + @Override + public void onClick(@NonNull View view) { + + StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_ROOM_WELCOME_HIM, "欢迎TA"); + + ExtensionUtil.setWelcomeLocal(chatRoomMessage, true); + mMessageAdapter.notifyItemChanged(position); + + long targetUid = JavaUtil.str2long(chatRoomMessage.getFromAccount()); + Single.zip(AvRoomModel.get().getWelcomeConfig(targetUid), + UserModel.get().getUserInfo(targetUid), (roomWelcomeConfig, info) -> { + WelcomeInfo welcomeInfo = new WelcomeInfo(); + welcomeInfo.setContent(roomWelcomeConfig.getMsg()); + welcomeInfo.setTargetUid(targetUid); + welcomeInfo.setTargetNick(info.getNick()); + welcomeInfo.setFans(roomWelcomeConfig.isFans()); + return welcomeInfo; + }) + .observeOn(AndroidSchedulers.mainThread()) + .flatMap((Function>) welcomeInfo -> { + WelcomeAttachment attachment = new WelcomeAttachment(); + attachment.setWelcomeInfo(welcomeInfo); + return ImHelperUtils.sendChatRoomMessage(attachment); + }) + //添加到自己的公屏 + .doOnSuccess(chatRoomMessage -> + IMNetEaseManager.get().addMessages(chatRoomMessage)) + .doOnError(throwable -> { + LogUtil.e("send welcome msg failed, error: " + throwable.getMessage()); + }) + .subscribe(); + + } + }); + } + tvContent.setText(text.build()); + tvContent.setOnClickListener(null); + tvContent.setMovementMethod(new LinkMovementMethod()); } /** @@ -1986,6 +2078,118 @@ public class MessageView extends FrameLayout { tvContent.setText(text.build()); } + /** + * 麦上用户对你的欢迎语 + */ + private void setMicWelcomeContent(ChatRoomMessage chatRoomMessage, TextView tvContent, int position) { + clearBackground(tvContent); + tvContent.setOnClickListener(null); + tvContent.setMovementMethod(new LinkMovementMethod()); + if (!(chatRoomMessage.getAttachment() instanceof WelcomeAttachment)) { + return; + } + WelcomeAttachment attachment = (WelcomeAttachment) chatRoomMessage.getAttachment(); + WelcomeInfo welcomeInfo = attachment.getWelcomeInfo(); + if (welcomeInfo == null) { + return; + } + ChatRoomMessageExtension extension = chatRoomMessage.getChatRoomMessageExtension(); + String userBadge = NobleUtil.getResource(NobleResourceType.KEY_BADGE, chatRoomMessage); + String userLevel = NobleUtil.getLevel(UserLevelResourceType.EXPER_URL, chatRoomMessage); + boolean newUser = NobleUtil.getIsNewUser(UserInfo.IS_NEW_USER, chatRoomMessage); + boolean isOfficial = NobleUtil.getIsOfficial(UserInfo.IS_OFFICIAL, chatRoomMessage); + + // 内容 + String fromAccount = chatRoomMessage.getFromAccount(); + SpannableBuilder text = new SpannableBuilder(tvContent) + .append(isOfficial ? ResourcesCompat.getDrawable(getResources(), + R.mipmap.ic_user_official_13dp, null) : null, + badgeWidth, badgeHeight) + .append(newUser ? Constants.NEW_USER_ICON : "", badgeWidth, badgeHeight) + .append(NobleUtil.getLocalResourcePath(userBadge), badgeWidth, badgeHeight); + + // 官方主播认证 + String tvOfficialMask = NobleUtil.getLevel(UserInfo.OAC_NAME, chatRoomMessage); + String ivOfficialMask = NobleUtil.getLevel(UserInfo.OAC_ICON, chatRoomMessage); + if (!TextUtils.isEmpty(tvOfficialMask) && !TextUtils.isEmpty(ivOfficialMask) && extension != null) { // extension != null 表示自己 + text.appendBgAndContent(ivOfficialMask, tvOfficialMask, SizeUtils.dp2px(tvContent.getContext(), 59), + SizeUtils.dp2px(tvContent.getContext(), 15)); + } + + text.append(userLevel, expLevelWidth, expLevelHeight) + .append(extension == null ? "我" : RegexUtil.getPrintableString(extension.getSenderNick()), + new ForegroundColorSpan(greyColor), + new OriginalDrawStatusClickSpan() { + @Override + public void onClick(@NonNull View widget) { + Single.just(String.valueOf(chatRoomMessage.getFromAccount())) + .doOnSuccess(clickConsumer).subscribe(); + } + }) + .append(":" + welcomeInfo.getLastConent(), new ForegroundColorSpan(whiteColor)) + .append(welcomeInfo.getTargetNick(), new ForegroundColorSpan(roomTipNickColor), + new OriginalDrawStatusClickSpan() { + @Override + public void onClick(@NonNull View widget) { + Single.just(String.valueOf(welcomeInfo.getTargetUid())) + .doOnSuccess(clickConsumer).subscribe(); + } + }) + .append(welcomeInfo.getNextContent(), new ForegroundColorSpan(whiteColor)); + + //自己的消息不显示关注按钮 + //被欢迎人必须是自己 + if (!UserModel.get().isMyseft(fromAccount) && UserModel.get().isMyseft(welcomeInfo.getTargetUid())) { + if (!welcomeInfo.isFans()) { + text.append(" ").append( + ResourcesCompat.getDrawable(getResources(), + R.drawable.icon_room_attent, null), + UIUtil.dip2px(mContext, 47), + UIUtil.dip2px(mContext, 17), + new OriginalDrawStatusClickSpan() { + @Override + public void onClick(@NonNull View view) { + if (welcomeInfo.isConnecting()) { + return; + } + + StatisticManager.Instance().onEvent( + StatisticsProtocol.Event.EVENT_ROOM_FOLLOW_HIM, "关注TA"); + + welcomeInfo.setConnecting(true); + //关注 + PraiseModel.get().praise(JavaUtil.str2long(chatRoomMessage.getFromAccount()), true) + .compose(RxHelper.bindContext(mContext)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(String s, String error) { + super.accept(s, error); + welcomeInfo.setConnecting(false); + if (error != null) { + SingleToastUtil.showToast(error); + return; + } + welcomeInfo.setFans(true); + welcomeInfo.setShowAttentedBtn(true); + mMessageAdapter.notifyItemChanged(position); + } + }); + + } + }); + } else if (welcomeInfo.isShowAttentedBtn()){ + text.append(" ").append( + ResourcesCompat.getDrawable(getResources(), + R.drawable.icon_room_attent_gray, null), + UIUtil.dip2px(mContext, 47), + UIUtil.dip2px(mContext, 17)); + } + } + + tvContent.setText(text.build()); + + } + @Override public void onClick(View v) { String account = ""; @@ -2116,6 +2320,18 @@ public class MessageView extends FrameLayout { return this; } + /** + * 文本和背景分离的情况 + */ + public SpannableBuilder appendBgAndContent(String drawable, String content, int width, int height) { + if (TextUtils.isEmpty(drawable)) return this; + int start = builder.length(); + builder.append("-"); + CustomImageSpan imageSpan = new CustomImageSpan(new ColorDrawable(Color.TRANSPARENT), textView, drawable, content, width, height); + builder.setSpan(imageSpan, start, builder.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + return this; + } + /** * @param drawable -icon * @param width 宽 @@ -2131,6 +2347,30 @@ public class MessageView extends FrameLayout { return this; } + /** + * @param drawable -icon + * @param width 宽 + * @param height 高 + * @return -返回一个spannableStringBuilder + */ + public SpannableBuilder append(Drawable drawable, int width, int height, Object... whats) { + if (drawable == null) return this; + try { + drawable.setBounds(0, 0, width, height); + int start = builder.length(); + builder.append("-"); + builder.setSpan(new CustomImageSpan(drawable), start, builder.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + if (whats != null) { + for (int i = 0; i < whats.length; i++) { + builder.setSpan(whats[0], start, builder.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + } + } + } catch (Exception ex) { + + } + return this; + } + /** * @param text -文字 * @param what -span类型 diff --git a/app/src/main/java/com/yizhuan/erban/base/BaseLoginAct.java b/app/src/main/java/com/yizhuan/erban/base/BaseLoginAct.java new file mode 100644 index 000000000..a2a98694a --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/base/BaseLoginAct.java @@ -0,0 +1,232 @@ +package com.yizhuan.erban.base; + +import android.annotation.SuppressLint; +import android.graphics.Color; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.content.ContextCompat; +import android.text.SpannableString; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.text.style.ForegroundColorSpan; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.ishumei.smantifraud.SmAntiFraud; +import com.netease.mobsec.rjsb.watchman; +import com.yizhuan.erban.R; +import com.yizhuan.erban.common.widget.OriginalDrawStatusClickSpan; +import com.yizhuan.erban.ui.webview.CommonWebViewActivity; +import com.yizhuan.xchat_android_constants.XChatConstants; +import com.yizhuan.xchat_android_core.UriProvider; +import com.yizhuan.xchat_android_core.auth.AuthModel; +import com.yizhuan.xchat_android_core.bean.LoginTipsInfo; +import com.yizhuan.xchat_android_core.market_verify.MarketVerifyModel; +import com.yizhuan.xchat_android_core.statistic.StatisticManager; +import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol; + +import io.reactivex.SingleObserver; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.BiConsumer; + +public abstract class BaseLoginAct extends BaseActivity { + + protected TextView tvProtocol; + protected ImageView wxLogin; + protected ImageView qqLogin; + protected TextView tvLoginTip; + protected TextView tvDesc; + + protected boolean canClick = true; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + protected void setProtocol() { + + if (tvProtocol == null) { + return; + } + + String privacyAgreementTip = context.getString(R.string.tip_privacy_agreement); + String userAgreementTip = context.getString(R.string.tip_user_agreement); + String privacyAgreementDescTip = context.getString(R.string.text_login_protocol, privacyAgreementTip, userAgreementTip); + SpannableString ss = new SpannableString(privacyAgreementDescTip); + int privacyAgreementTipIndex = privacyAgreementDescTip.indexOf(privacyAgreementTip); + int userAgreementTipIndex = privacyAgreementDescTip.indexOf(userAgreementTip); + + + ss.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, R.color.design_color)), privacyAgreementTipIndex, privacyAgreementTipIndex + privacyAgreementTip.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + ss.setSpan(new OriginalDrawStatusClickSpan(ContextCompat.getColor(context, R.color.design_color)) { + @Override + public void onClick(@NonNull View widget) { + if (!canClick) { + return; + } + if (widget instanceof TextView) + ((TextView) widget).setHighlightColor(getResources().getColor(android.R.color.transparent)); + + CommonWebViewActivity.start(context, UriProvider.getPrivacyAgreement()); + } + }, privacyAgreementTipIndex, privacyAgreementTipIndex + privacyAgreementTip.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + ss.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, R.color.design_color)), userAgreementTipIndex, userAgreementTipIndex + userAgreementTip.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + ss.setSpan(new OriginalDrawStatusClickSpan(ContextCompat.getColor(context, R.color.design_color)) { + @Override + public void onClick(@NonNull View widget) { + if (!canClick) { + return; + } + if (widget instanceof TextView) + ((TextView) widget).setHighlightColor(getResources().getColor(android.R.color.transparent)); + + CommonWebViewActivity.start(context, UriProvider.getUserProtocolUrl()); + } + }, userAgreementTipIndex, userAgreementTipIndex + privacyAgreementTip.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + + tvProtocol.setText(ss); + tvProtocol.setHighlightColor(Color.TRANSPARENT); + tvProtocol.setMovementMethod(new LinkMovementMethod()); + } + + @SuppressLint("CheckResult") + protected void showLoginTip() { + MarketVerifyModel.get().loadLoginTip() + .compose(bindToLifecycle()) + .subscribe(new BiConsumer() { + @Override + public void accept(LoginTipsInfo loginTipsInfo, Throwable throwable) throws Exception { + if (throwable == null) { + showTvDesc(loginTipsInfo.getTips()); + + showTvLoginTip(loginTipsInfo.isShowWechat() || loginTipsInfo.isShowQq()); + showThirdPartLogin(loginTipsInfo.isShowWechat(), loginTipsInfo.isShowQq()); + + } else { + showTvLoginTip(false); + showThirdPartLogin(false, false); + } + } + }); + } + + protected void showThirdPartLogin(boolean isShowWechat, boolean isShowQq) { + showwxLogin(isShowWechat); + showqqLogin(isShowQq); + } + + private void showTvLoginTip(boolean visible) { + if (tvLoginTip != null) { + tvLoginTip.setVisibility(visible ? View.VISIBLE : View.GONE); + } + } + + private void showwxLogin(boolean visible) { + if (wxLogin != null) { + wxLogin.setVisibility(visible ? View.VISIBLE : View.GONE); + } + } + + private void showqqLogin(boolean visible) { + if (qqLogin != null) { + qqLogin.setVisibility(visible ? View.VISIBLE : View.GONE); + } + } + + private void showTvDesc(String tips) { + if (tvDesc != null && !TextUtils.isEmpty(tips)) { + SpannableStringBuilder builder = new SpannableStringBuilder(tips); + int start = tips.indexOf("如何登录"); + + if (start > -1) { + builder.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, R.color.color_FE4C62)), start, start + 5, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + builder.setSpan(new OriginalDrawStatusClickSpan() { + @Override + public void onClick(@NonNull View widget) { + if (!canClick) { + return; + } + CommonWebViewActivity.start(BaseLoginAct.this, UriProvider.JAVA_WEB_URL + XChatConstants.LOGIN_ERBAN_ACCOUNT_URL); + } + }, start, start + 5, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + + } + + + tvDesc.setText(builder); + tvDesc.setHighlightColor(Color.TRANSPARENT); + tvDesc.setMovementMethod(new LinkMovementMethod()); + + } + } + + protected void wxLogin() { + // 易盾保护 token + String yiDunToken = watchman.getToken(XChatConstants.YI_DUN_BUSINESS_ID); + // 数美天网 deviceId + String shuMeiDeviceId = SmAntiFraud.getDeviceId(); + getDialogManager().showProgressDialog(this, "请稍后"); + AuthModel.get() + .wxLogin(yiDunToken, shuMeiDeviceId) + .subscribe(new SingleObserver() { + @Override + public void onSubscribe(Disposable d) { + mCompositeDisposable.add(d); + } + + @Override + public void onSuccess(String s) { + getDialogManager().dismissDialog(); + setResult(RESULT_OK); + finish(); + } + + @Override + public void onError(Throwable e) { + getDialogManager().dismissDialog(); + dealWithLoginError(e); + } + }); + StatisticManager.Instance().onEvent(this, + StatisticsProtocol.Event.EVENT_LOGIN_WX_CLICK, "点击微信登录", null); + + } + + protected void qqLogin() { + // 易盾保护 token + String yiDunToken = watchman.getToken(XChatConstants.YI_DUN_BUSINESS_ID); + // 数美天网 deviceId + String shuMeiDeviceId = SmAntiFraud.getDeviceId(); + getDialogManager().showProgressDialog(this, "请稍后"); + AuthModel.get() + .qqLogin(yiDunToken, shuMeiDeviceId) + .subscribe(new SingleObserver() { + @Override + public void onSubscribe(Disposable d) { + mCompositeDisposable.add(d); + } + + @Override + public void onSuccess(String s) { + getDialogManager().dismissDialog(); + setResult(RESULT_OK); + finish(); + } + + @Override + public void onError(Throwable e) { + getDialogManager().dismissDialog(); + dealWithLoginError(e); + } + }); + StatisticManager.Instance().onEvent(this, + StatisticsProtocol.Event.EVENT_LOGIN_QQ_CLICK, "点击qq登录", null); + + } + + public abstract void dealWithLoginError(Throwable e); +} diff --git a/app/src/main/java/com/yizhuan/erban/common/widget/CustomImageSpan.java b/app/src/main/java/com/yizhuan/erban/common/widget/CustomImageSpan.java index d36abc94a..07f90d382 100644 --- a/app/src/main/java/com/yizhuan/erban/common/widget/CustomImageSpan.java +++ b/app/src/main/java/com/yizhuan/erban/common/widget/CustomImageSpan.java @@ -6,6 +6,7 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; import android.support.annotation.Nullable; import android.text.TextUtils; import android.text.style.ImageSpan; @@ -19,6 +20,7 @@ import com.bumptech.glide.request.target.Target; import com.netease.nim.uikit.support.glide.GlideApp; import com.yizhuan.erban.ui.widget.magicindicator.buildins.UIUtil; import com.yizhuan.erban.ui.widget.marqueeview.Utils; +import com.yizhuan.xchat_android_library.utils.SizeUtils; import com.yizhuan.xchat_android_library.utils.config.BasicConfig; import java.lang.ref.WeakReference; @@ -32,6 +34,8 @@ public class CustomImageSpan extends ImageSpan { private int height; private Drawable drawable; + private String content; + public CustomImageSpan(Drawable drawable) { super(drawable); this.drawable = drawable; @@ -57,6 +61,26 @@ public class CustomImageSpan extends ImageSpan { loadPicAsync(); } + /** + * 官方主播铭牌类似情况:背景图和文本组合展示 + * @param url + * 图标链接 + * @param content + * 文本 + */ + public CustomImageSpan(Drawable defaultDrawable, TextView textView, String url, String content, int width, int height) { + super(defaultDrawable); + this.content = content; + + this.url = url; + this.reference = new WeakReference<>(textView); + this.width = width; + this.height = height; + this.drawable = defaultDrawable; + getDrawable().setBounds(0, 0, width, height); + loadPicAsync(); + } + private void loadPicAsyncNoWidthHeight() { if (!loading && !TextUtils.isEmpty(url) && reference.get() != null) { if (isDestroyedActivity(reference.get().getContext())) { @@ -82,6 +106,8 @@ public class CustomImageSpan extends ImageSpan { loading = false; TextView textView = reference.get(); if (textView == null || resource == null) return true; + resource = getNewDrawable(textView, resource); + CustomImageSpan.this.drawable = resource; int i = resource.getMinimumHeight() / 15; CustomImageSpan.this.drawable.setBounds(0, 0, @@ -129,6 +155,8 @@ public class CustomImageSpan extends ImageSpan { loading = false; TextView textView = reference.get(); if (textView == null || resource == null) return true; + resource = getNewDrawable(textView, resource); + CustomImageSpan.this.drawable = resource; CustomImageSpan.this.drawable.setBounds(0, 0, width, height); textView.postInvalidate(); @@ -143,6 +171,26 @@ public class CustomImageSpan extends ImageSpan { } } + private Drawable getNewDrawable(TextView textView, Drawable resource) { + if (!TextUtils.isEmpty(content)) { + float extraXOffset = SizeUtils.dp2px(textView.getContext(), 1); + + int width = resource.getIntrinsicWidth(); + float xLOffset = SizeUtils.dp2px(textView.getContext(), 15); + float xROffset = SizeUtils.dp2px(textView.getContext(), 6); + float tempWidth = width - xLOffset - xROffset; + float x = tempWidth / 2 + xLOffset + extraXOffset; + int size = SizeUtils.dp2px(textView.getContext(), 10); + + TextDrawable textDrawable = new TextDrawable(content, x, resource.getIntrinsicHeight(), size); + Drawable[] array = new Drawable[] {resource, textDrawable}; + LayerDrawable id = new LayerDrawable(array); + resource = id; + } + + return resource; + } + @Override public Drawable getDrawable() { return drawable; diff --git a/app/src/main/java/com/yizhuan/erban/common/widget/TextDrawable.java b/app/src/main/java/com/yizhuan/erban/common/widget/TextDrawable.java new file mode 100644 index 000000000..69ab8ce73 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/common/widget/TextDrawable.java @@ -0,0 +1,65 @@ +package com.yizhuan.erban.common.widget; + +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.PixelFormat; +import android.graphics.drawable.Drawable; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.text.TextUtils; +import android.util.Log; + +public class TextDrawable extends Drawable { + + private String mContent; + private Paint mPaint; + private float mWidth; + private float mHeight; + + public TextDrawable(String content, float width, float height, int size) { + mContent = content; + mWidth = width; + mHeight = height; + + mPaint = new Paint(); + mPaint.setColor(Color.WHITE); + mPaint.setAntiAlias(true); + mPaint.setStrokeWidth(5); + mPaint.setStyle(Paint.Style.FILL); + mPaint.setTextAlign(Paint.Align.CENTER); + mPaint.setTextSize(size); + } + + @Override + public void draw(@NonNull Canvas canvas) { + if (!TextUtils.isEmpty(mContent)) { + Paint.FontMetrics fontMetrics = mPaint.getFontMetrics(); + float top = fontMetrics.top;//为基线到字体上边框的距离 + float bottom = fontMetrics.bottom;//为基线到字体下边框的距离 + Log.i("TextDrawable", "top:" + top); + Log.i("TextDrawable", "bottom:" + bottom); + + float y = mHeight / 2 - top / 2 - bottom / 2; + + canvas.drawText(mContent, mWidth, y, mPaint); + } + + } + + @Override + public void setAlpha(int alpha) { + + } + + @Override + public void setColorFilter(@Nullable ColorFilter colorFilter) { + + } + + @Override + public int getOpacity() { + return PixelFormat.TRANSLUCENT; + } +} diff --git a/app/src/main/java/com/yizhuan/erban/home/adapter/HomeFragmentAdapter.java b/app/src/main/java/com/yizhuan/erban/home/adapter/HomeFragmentAdapter.java index 53adf60d9..c0974eacb 100644 --- a/app/src/main/java/com/yizhuan/erban/home/adapter/HomeFragmentAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/home/adapter/HomeFragmentAdapter.java @@ -67,6 +67,7 @@ import com.yizhuan.xchat_android_core.market_verify.MarketVerifyModel; import com.yizhuan.xchat_android_core.noble.NobleUtil; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; import com.yizhuan.xchat_android_core.user.bean.RecommendationUserInfo; +import com.yizhuan.xchat_android_core.user.bean.UserInfo; import com.yizhuan.xchat_android_library.utils.ListUtils; import com.yizhuan.xchat_android_library.utils.StringUtils; @@ -211,6 +212,22 @@ public class HomeFragmentAdapter extends BaseMultiItemQuickAdapter -1) { mBinding.tvNobleRemainTime.setVisibility(View.VISIBLE); @@ -379,6 +410,12 @@ public class MeFragment extends BaseFragment implements View.OnClickListener { CommonWebViewActivity.start(getActivity(), UriProvider.getTutuAprove()); break; + case R.id.ll_anchor_certification: + StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_MY_OFFICIAL_ANCHOR, "官方主播"); + + CommonWebViewActivity.start(getActivity(), UriProvider.getAnchorCertification()); + break; + case R.id.ll_authen: checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA) .subscribe(result -> { diff --git a/app/src/main/java/com/yizhuan/erban/main/helper/NoticationsUiHelper.java b/app/src/main/java/com/yizhuan/erban/main/helper/NoticationsUiHelper.java new file mode 100644 index 000000000..ad4c0662d --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/main/helper/NoticationsUiHelper.java @@ -0,0 +1,103 @@ +package com.yizhuan.erban.main.helper; + +import android.app.Activity; + +import com.yizhuan.erban.common.widget.dialog.DialogManager; +import com.yizhuan.erban.utils.NotificationsUtils; +import com.yizhuan.xchat_android_core.statistic.StatisticManager; +import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol; +import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils; +import com.yizhuan.xchat_android_core.utils.net.DontWarnObserver; +import com.yizhuan.xchat_android_core.utils.net.RxHelper; +import com.yizhuan.xchat_android_library.utils.TimeUtils; + +import java.util.concurrent.TimeUnit; + +import io.reactivex.Single; +import io.reactivex.SingleEmitter; +import io.reactivex.SingleOnSubscribe; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; + +/** + * 通知栏ui处理逻辑 + * Created by lvzebiao on 2020/3/16. + */ +public class NoticationsUiHelper { + + /** + * 用于处理,用户关闭通知栏时,每N天,弹一次 + */ + private static final String KEY_NOTICATIONS_DIALOG_TIME = "notications_dialog_time"; + + private static final long CACHE_DISTANCE_TIME = 3 * TimeUtils.MILLIS_OF_A_DAY; + + public static void handle(Activity activity, DialogManager dialogManager) { + if (NotificationsUtils.isNotificationEnabled(activity)) { + return; + } + Single.create(new SingleOnSubscribe() { + @Override + public void subscribe(SingleEmitter emitter) throws Exception { + long lastDialogTime = (long) SharedPreferenceUtils + .get(KEY_NOTICATIONS_DIALOG_TIME, 0L); + long currTime = System.currentTimeMillis(); + if (lastDialogTime == 0L || currTime - lastDialogTime >= CACHE_DISTANCE_TIME) { + //超过三天需要重新弹窗 + emitter.onSuccess(""); + return; + } + emitter.onError(new Throwable("no need to show notications dialog")); + } + }) + .flatMap(new Function>() { + @Override + public SingleSource apply(String s) throws Exception { + return Single.just(s).delay(60, TimeUnit.SECONDS); + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(RxHelper.bindContext(activity)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(String s, String error) { + super.accept(s, error); + if (error != null) { + return; + } + if (NotificationsUtils.isNotificationEnabled(activity)) { + return; + } + DialogManager tempDialogManager = dialogManager; + if (tempDialogManager == null) { + tempDialogManager = new DialogManager(activity); + } + SharedPreferenceUtils.put(KEY_NOTICATIONS_DIALOG_TIME, System.currentTimeMillis()); + tempDialogManager.showOkCancelDialog( + "开启推送通知", + "活动、福利、好友消息,各种精彩瞬间再也不怕错过啦!", + "立即开启", + "下次再说", + new DialogManager.OkCancelDialogListener() { + + @Override + public void onCancel() { + StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_HOME_PUSH_INQUIRE, + "通知权限弹窗-区分-下次再说"); + } + + @Override + public void onOk() { + StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_HOME_PUSH_INQUIRE, + "通知权限弹窗-区分-立即开启"); + NotificationsUtils.openPush(activity); + } + }); + } + }); + } + +} diff --git a/app/src/main/java/com/yizhuan/erban/other/activity/SplashActivity.java b/app/src/main/java/com/yizhuan/erban/other/activity/SplashActivity.java index 72f1be107..5215ce2d2 100644 --- a/app/src/main/java/com/yizhuan/erban/other/activity/SplashActivity.java +++ b/app/src/main/java/com/yizhuan/erban/other/activity/SplashActivity.java @@ -5,12 +5,14 @@ import android.content.Intent; import android.databinding.DataBindingUtil; import android.os.Bundle; import android.text.TextUtils; +import android.util.Log; import android.view.View; import com.bumptech.glide.request.RequestOptions; import com.netease.nim.uikit.StatusBarUtil; import com.netease.nim.uikit.support.glide.GlideApp; import com.yizhuan.erban.MainActivity; +import com.yizhuan.erban.NimMiddleActivity; import com.yizhuan.erban.R; import com.yizhuan.erban.base.BaseActivity; import com.yizhuan.erban.databinding.ActivitySplashBinding; @@ -36,6 +38,7 @@ public class SplashActivity extends BaseActivity implements View.OnClickListener @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + NimMiddleActivity.delayOpenCommunity = true; //修复 https://blog.csdn.net/u011153817/article/details/77335255 // https://blog.csdn.net/zhangcanyan/article/details/52777265 这样的启动异常问题. @@ -95,6 +98,7 @@ public class SplashActivity extends BaseActivity implements View.OnClickListener .apply(RequestOptions.bitmapTransform(new SplashBitmapTransformation())) .into(mBinding.ivActivity); } else { + NimMiddleActivity.delayOpenCommunity = false; MainActivity.start(SplashActivity.this); finish(); } @@ -111,6 +115,8 @@ public class SplashActivity extends BaseActivity implements View.OnClickListener if (needJump) { return; } + + NimMiddleActivity.delayOpenCommunity = false; MainActivity.start(SplashActivity.this); finish(); } @@ -130,6 +136,8 @@ public class SplashActivity extends BaseActivity implements View.OnClickListener Intent intent = new Intent(); intent.putExtra("url", link); intent.putExtra("type", type); + + NimMiddleActivity.delayOpenCommunity = false; MainActivity.start(this, intent); break; case R.id.tv_skip: @@ -137,6 +145,8 @@ public class SplashActivity extends BaseActivity implements View.OnClickListener return; } needJump = true; + + NimMiddleActivity.delayOpenCommunity = false; MainActivity.start(this); break; default: diff --git a/app/src/main/java/com/yizhuan/erban/ui/im/RouterHandler.java b/app/src/main/java/com/yizhuan/erban/ui/im/RouterHandler.java index 697aa9997..597ff0508 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/im/RouterHandler.java +++ b/app/src/main/java/com/yizhuan/erban/ui/im/RouterHandler.java @@ -28,6 +28,7 @@ import com.yizhuan.erban.ui.login.BinderPhoneActivity; import com.yizhuan.erban.ui.login.ShowBindPhoneActivity; import com.yizhuan.erban.ui.patriarch.help.LimitEnterRoomHelper; import com.yizhuan.erban.ui.pay.ChargeActivity; +import com.yizhuan.erban.ui.setting.FeedbackActivity; import com.yizhuan.erban.ui.setting.ModifyPwdActivity; import com.yizhuan.erban.ui.user.UserInfoActivity; import com.yizhuan.erban.ui.wallet.WalletActivity; @@ -282,6 +283,10 @@ public class RouterHandler { EventBus.getDefault().post(new SquareTaskEvent()); break; + case RouterType.FEED_BACK: + FeedbackActivity.start(context); + break; + default: SingleToastUtil.showToast("暂不支持哟!"); return false; diff --git a/app/src/main/java/com/yizhuan/erban/ui/im/chat/SysMsgV2ViewHolder.java b/app/src/main/java/com/yizhuan/erban/ui/im/chat/SysMsgV2ViewHolder.java new file mode 100644 index 000000000..344cd97ec --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/ui/im/chat/SysMsgV2ViewHolder.java @@ -0,0 +1,299 @@ +package com.yizhuan.erban.ui.im.chat; + +import android.graphics.Color; +import android.support.v4.content.ContextCompat; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextPaint; +import android.text.TextUtils; +import android.text.style.AbsoluteSizeSpan; +import android.text.style.ForegroundColorSpan; +import android.text.style.MetricAffectingSpan; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.alibaba.fastjson.JSON; +import com.netease.nim.uikit.business.session.viewholder.MsgViewHolderBase; +import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemFetchLoadAdapter; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.yizhuan.erban.R; +import com.yizhuan.erban.sys.ErbanSysMsgViewModel; +import com.yizhuan.erban.ui.im.RouterHandler; +import com.yizhuan.xchat_android_core.im.custom.bean.SysMsgV2Attachment; +import com.yizhuan.xchat_android_core.manager.IMNetEaseManager; +import com.yizhuan.xchat_android_core.msg.sys.ApproveMsgInfo; +import com.yizhuan.xchat_android_core.msg.sysv2.ErbanSysMsgV2Component; +import com.yizhuan.xchat_android_core.msg.sysv2.ErbanSysMsgV2Info; +import com.yizhuan.xchat_android_core.msg.sysv2.ErbanSysMsgV2Layout; +import com.yizhuan.xchat_android_core.utils.net.RxHelper; +import com.yizhuan.xchat_android_library.utils.SingleToastUtil; +import com.yizhuan.xchat_android_library.utils.SizeUtils; + +import java.util.List; +import java.util.Objects; + +import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_COMMON_SYSTEM_MSG_V2; +import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_TYPE_COMMON_SYSTEM_MSG_V2_APPROVAL; +import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_TYPE_COMMON_SYSTEM_MSG_V2_TEXT; + +/** + * Created by lvzebiao on 2020/3/28. + */ + +public class SysMsgV2ViewHolder extends MsgViewHolderBase implements View.OnClickListener { + + private View container; + private TextView title; + private TextView timestamp; + private TextView content; + private TextView approvalState; + private TextView tvRejoinMW; + private FrameLayout flRejoin; + private RelativeLayout resultLayout; + private RelativeLayout operationLayout; + private ErbanSysMsgV2Info erbanSysMsgV2Info; + private ErbanSysMsgViewModel viewModel; + + public SysMsgV2ViewHolder(BaseMultiItemFetchLoadAdapter adapter) { + super(adapter); + } + + @Override + protected int getContentResId() { + return R.layout.layout_sys_msg_view_holder; + } + + @Override + protected void inflateContentView() { + container = findViewById(R.id.ll_container); + approvalState = findViewById(R.id.tv_result); + resultLayout = findViewById(R.id.rl_result_layout); + operationLayout = findViewById(R.id.rl_operators); + tvRejoinMW = findViewById(R.id.tv_rejoin_mw); + flRejoin = findViewById(R.id.fl_rejoin); + title = findViewById(R.id.tv_title); + timestamp = findViewById(R.id.tv_timestamp); + content = findViewById(R.id.tv_content); + viewModel = new ErbanSysMsgViewModel(); + container.setOnClickListener(this); + tvRejoinMW.setOnClickListener(this); + findViewById(R.id.btn_reject).setOnClickListener(this); + findViewById(R.id.btn_agree).setOnClickListener(this); + } + + @Override + protected void bindContentView() { + IMMessage sysMsgInfoMessage = IMNetEaseManager.get().queryMessageByUuid(message.getUuid()); + SysMsgV2Attachment sysMsgV2Attachment; + if (sysMsgInfoMessage == null) { + sysMsgV2Attachment = (SysMsgV2Attachment) message.getAttachment(); + IMNetEaseManager.get().saveMessageToLocal(message); + erbanSysMsgV2Info = sysMsgV2Attachment.getErbanSysMsgV2Info(); + if (erbanSysMsgV2Info == null) { + return; + } + message.setLocalExtension(ErbanSysMsgV2Info.convertToMap(erbanSysMsgV2Info)); + IMNetEaseManager.get().updateErbanSysMsgV2InfoMessage(message.getUuid(), erbanSysMsgV2Info); + } else { + sysMsgV2Attachment = (SysMsgV2Attachment) sysMsgInfoMessage.getAttachment(); + if (sysMsgInfoMessage.getLocalExtension() == null) { + erbanSysMsgV2Info = sysMsgV2Attachment.getErbanSysMsgV2Info(); + } else { + erbanSysMsgV2Info = ErbanSysMsgV2Info.convertMapToObject(sysMsgInfoMessage.getLocalExtension()); + } + if (erbanSysMsgV2Info == null) { + return; + } + sysMsgInfoMessage.setLocalExtension(ErbanSysMsgV2Info.convertToMap(erbanSysMsgV2Info)); + IMNetEaseManager.get().updateErbanSysMsgV2InfoMessage(sysMsgInfoMessage.getUuid(), erbanSysMsgV2Info); + } + + String layout = erbanSysMsgV2Info.getLayout(); + ErbanSysMsgV2Layout ErbanSysMsgV2Layout; + try { + ErbanSysMsgV2Layout = JSON.parseObject(layout, ErbanSysMsgV2Layout.class); + + } catch (Exception ex) { // json解析出错 + ex.printStackTrace(); + return; + } + + // title + setupView(title, ErbanSysMsgV2Layout.getTitle()); + // timestamp + setupView(timestamp, ErbanSysMsgV2Layout.getTime()); + // content + List erbanSysMsgV2LayoutContent = ErbanSysMsgV2Layout.getContents(); + if (erbanSysMsgV2LayoutContent != null) { + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); + for (ErbanSysMsgV2Component ErbanSysMsgV2Component : erbanSysMsgV2LayoutContent) { + int start = spannableStringBuilder.length(); + String msgBody = ErbanSysMsgV2Component.getContent(); + if (Objects.equals(msgBody, "/r/n")) { + msgBody = "\r\n"; + spannableStringBuilder.append(msgBody); + continue; + } + spannableStringBuilder.append(msgBody); + if (ErbanSysMsgV2Component.getFontColor() != null) { + spannableStringBuilder.setSpan(new ForegroundColorSpan(Color.parseColor(ErbanSysMsgV2Component.getFontColor())), + start, spannableStringBuilder.length(), + Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + } + if (ErbanSysMsgV2Component.getFontSize() > 0) { + spannableStringBuilder.setSpan(new AbsoluteSizeSpan(SizeUtils.sp2px(content.getContext(), ErbanSysMsgV2Component.getFontSize() + 0.5F)), + start, spannableStringBuilder.length(), + Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + } + spannableStringBuilder.setSpan( + new MetricAffectingSpan() { + @Override + public void updateMeasureState(TextPaint p) { + + } + + @Override + public void updateDrawState(TextPaint tp) { + tp.setFakeBoldText(ErbanSysMsgV2Component.isFontBold()); + } + }, + start, spannableStringBuilder.length(), + Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + } + content.setText(spannableStringBuilder); + } + + operationLayout.setVisibility(View.GONE); + resultLayout.setVisibility(View.GONE); + flRejoin.setVisibility(View.GONE); + + if (sysMsgV2Attachment.getFirst() == CUSTOM_MSG_HEADER_COMMON_SYSTEM_MSG_V2) { + switch (sysMsgV2Attachment.getSecond()) { + case CUSTOM_MSG_SUB_TYPE_COMMON_SYSTEM_MSG_V2_TEXT: + break; + + case CUSTOM_MSG_SUB_TYPE_COMMON_SYSTEM_MSG_V2_APPROVAL: + operationLayout.setVisibility(View.VISIBLE); + break; + } + + } + + // bottom layout + switch (erbanSysMsgV2Info.getState()) { + case ErbanSysMsgV2Info.STATE_UNTREATED: + break; + + case ErbanSysMsgV2Info.STATE_AGREE: + displayAgreedResult(); + break; + + case ErbanSysMsgV2Info.STATE_REFUSED: + displayRejectedResult(); + break; + + case ErbanSysMsgV2Info.STATE_OUT_DATE: + displayOutDateResult(); + break; + } + } + + public void setupView(TextView view, ErbanSysMsgV2Component ErbanSysMsgV2Component) { + if (ErbanSysMsgV2Component != null) { + setupComponent(view, ErbanSysMsgV2Component.getContent(), ErbanSysMsgV2Component.getFontColor(), ErbanSysMsgV2Component.getFontSize(), + ErbanSysMsgV2Component.getRouterType(), ErbanSysMsgV2Component.getRouterValue()); + } + } + + public void setupComponent(TextView view, String text, String textColor, float fontSize, int routerType, String routerValue) { + view.setText(text); + view.setTextColor(Color.parseColor(textColor)); + view.setTextSize(fontSize); + if (routerType > 0) { + view.setOnClickListener(v -> RouterHandler.handle(context, routerType, routerValue)); + } + } + + @Override + public void onClick(View v) { + if (erbanSysMsgV2Info == null) { + return; + } + switch (v.getId()) { + case R.id.ll_container: + if (erbanSysMsgV2Info.getRouterType() != 0) + RouterHandler.handle(context, erbanSysMsgV2Info.getRouterType(), erbanSysMsgV2Info.getRouterValue()); + break; + + case R.id.btn_reject: + viewModel.requestUrl(erbanSysMsgV2Info.getUrl(), 0, erbanSysMsgV2Info.getParams()) + .subscribe((approveMsgInfo, throwable) -> { + if (throwable != null) { + throwable.printStackTrace(); + String tips = throwable.getMessage(); + if (!TextUtils.isEmpty(tips) && !RxHelper.ERROR_TIPS.equals(tips)) + SingleToastUtil.showToast(context, throwable.getMessage(), Toast.LENGTH_SHORT); + } else { + if (approveMsgInfo.getStatus() == ErbanSysMsgV2Info.STATE_OUT_DATE) { + displayOutDateResult(); + }else if (approveMsgInfo.getStatus() == ErbanSysMsgV2Info.STATE_REFUSED){ + displayRejectedResult(); + } + updateMessageToLocal(approveMsgInfo); + } + }); + break; + + case R.id.btn_agree: + viewModel.requestUrl(erbanSysMsgV2Info.getUrl(), 1, erbanSysMsgV2Info.getParams()) + .subscribe((approveMsgInfo, throwable) -> { + if (throwable != null) { + throwable.printStackTrace(); + String tips = throwable.getMessage(); + if (!TextUtils.isEmpty(tips) && !RxHelper.ERROR_TIPS.equals(tips)) + SingleToastUtil.showToast(context, throwable.getMessage(), Toast.LENGTH_SHORT); + } else { + if (approveMsgInfo.getStatus() == ErbanSysMsgV2Info.STATE_OUT_DATE) { + displayOutDateResult(); + }else if (approveMsgInfo.getStatus() == ErbanSysMsgV2Info.STATE_AGREE){ + displayAgreedResult(); + } + updateMessageToLocal(approveMsgInfo); + } + }); + break; + + } + } + + private void updateMessageToLocal(ApproveMsgInfo approveMsgInfo) { + erbanSysMsgV2Info.setState(approveMsgInfo.getStatus()); + IMNetEaseManager.get().updateErbanSysMsgV2InfoMessage(message.getUuid(), erbanSysMsgV2Info); + } + + private void displayAgreedResult() { + resultLayout.setVisibility(View.VISIBLE); + operationLayout.setVisibility(View.GONE); + approvalState.setCompoundDrawablesWithIntrinsicBounds(R.drawable.icon_state_agreed, 0, 0, 0); + approvalState.setText(R.string.text_erban_sys_msg_state_agreed); + approvalState.setTextColor(ContextCompat.getColor(context, R.color.green_color_light)); + } + + private void displayRejectedResult() { + resultLayout.setVisibility(View.VISIBLE); + operationLayout.setVisibility(View.GONE); + approvalState.setCompoundDrawablesWithIntrinsicBounds(R.drawable.icon_state_rejected, 0, 0, 0); + approvalState.setText(R.string.text_erban_sys_msg_state_rejected); + approvalState.setTextColor(ContextCompat.getColor(context, R.color.color_ff6565)); + } + + private void displayOutDateResult() { + resultLayout.setVisibility(View.VISIBLE); + operationLayout.setVisibility(View.GONE); + approvalState.setText(R.string.text_erban_sys_msg_state_out_date); + approvalState.setTextColor(ContextCompat.getColor(context, R.color.color_ff6565)); + } +} diff --git a/app/src/main/java/com/yizhuan/erban/ui/im/recent/RecentListFragment.java b/app/src/main/java/com/yizhuan/erban/ui/im/recent/RecentListFragment.java index 6443e2648..b81ec3056 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/im/recent/RecentListFragment.java +++ b/app/src/main/java/com/yizhuan/erban/ui/im/recent/RecentListFragment.java @@ -377,7 +377,8 @@ public class RecentListFragment extends BaseFragment { } } } else if (customAttachment.getFirst() == CUSTOM_MSG_HEADER_COMMON_SYSTEM_MSG - || customAttachment.getFirst() == CUSTOM_MSG_SHIFT_OUT) { + || customAttachment.getFirst() == CUSTOM_MSG_SHIFT_OUT + || customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_COMMON_SYSTEM_MSG_V2) { return "[您收到一条系统消息]"; } else if (customAttachment.getFirst() == CUSTOM_MSG_PUBLIC_CHAT_HALL) { switch (customAttachment.getSecond()) { diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/BinderPhoneActivity.java b/app/src/main/java/com/yizhuan/erban/ui/login/BinderPhoneActivity.java index 2e74f77ac..442e9719c 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/login/BinderPhoneActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/login/BinderPhoneActivity.java @@ -130,7 +130,6 @@ public class BinderPhoneActivity extends BaseActivity implements View.OnClickLis etAlipayAccount.getText().toString(), etSmsCode.getText().toString() ) - .flatMap(s -> UserModel.get().updateCurrentUserInfo()) .compose(bindUntilEvent(ActivityEvent.DESTROY)) .subscribe(new SingleObserver() { @Override diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/LoginActivity.java b/app/src/main/java/com/yizhuan/erban/ui/login/LoginActivity.java index b02a87a72..10285c0fd 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/login/LoginActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/login/LoginActivity.java @@ -1,55 +1,40 @@ package com.yizhuan.erban.ui.login; -import android.Manifest; import android.annotation.SuppressLint; +import android.app.Activity; import android.content.Context; import android.content.Intent; -import android.graphics.Color; import android.os.Bundle; -import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.text.Editable; import android.text.Spannable; import android.text.SpannableString; -import android.text.SpannableStringBuilder; -import android.text.Spanned; import android.text.TextUtils; import android.text.TextWatcher; -import android.text.method.LinkMovementMethod; import android.text.style.ForegroundColorSpan; -import android.util.Log; -import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.EditText; -import android.widget.ImageView; -import android.widget.TextView; import com.ishumei.smantifraud.SmAntiFraud; import com.netease.mobsec.rjsb.watchman; import com.orhanobut.logger.Logger; -import com.tongdaxing.erban.upgrade.AppUpgradeHelper; import com.trello.rxlifecycle2.android.ActivityEvent; import com.yizhuan.erban.R; import com.yizhuan.erban.UIHelper; -import com.yizhuan.erban.base.BaseActivity; -import com.yizhuan.erban.common.widget.OriginalDrawStatusClickSpan; +import com.yizhuan.erban.base.BaseLoginAct; import com.yizhuan.erban.ui.webview.CommonWebViewActivity; import com.yizhuan.erban.utils.KeyBoardUtils; import com.yizhuan.xchat_android_constants.XChatConstants; -import com.yizhuan.xchat_android_core.Env; import com.yizhuan.xchat_android_core.UriProvider; import com.yizhuan.xchat_android_core.auth.AuthModel; import com.yizhuan.xchat_android_core.auth.event.LoginEvent; import com.yizhuan.xchat_android_core.auth.exception.BanAccountException; import com.yizhuan.xchat_android_core.auth.exception.IsSuperAdminException; import com.yizhuan.xchat_android_core.auth.exception.ShowPhoneCodeException; -import com.yizhuan.xchat_android_core.bean.LoginTipsInfo; import com.yizhuan.xchat_android_core.code.CodeModel; import com.yizhuan.xchat_android_core.code.CodeType; -import com.yizhuan.xchat_android_core.initial.InitialModel; -import com.yizhuan.xchat_android_core.market_verify.MarketVerifyModel; import com.yizhuan.xchat_android_core.statistic.StatisticManager; import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol; import com.yizhuan.xchat_android_library.utils.DeviceUuidFactory; @@ -66,44 +51,21 @@ import java.util.Locale; import io.reactivex.SingleObserver; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; -import io.reactivex.functions.BiConsumer; /** * @author zhouxiangfeng * @date 17/2/26 */ -public class LoginActivity extends BaseActivity implements View.OnClickListener { +public class LoginActivity extends BaseLoginAct implements View.OnClickListener { private static final String TAG = "LoginActivity"; - private static final String KICK_OUT = "KICK_OUT"; - - /** - * 基本权限管理 - */ - private final String[] BASIC_PERMISSIONS = new String[]{ - Manifest.permission.READ_PHONE_STATE, - Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE, -// Manifest.permission.CAMERA, -// Manifest.permission.RECORD_AUDIO, -// Manifest.permission.ACCESS_COARSE_LOCATION, -// Manifest.permission.ACCESS_FINE_LOCATION - }; - private EditText accountEt; private EditText passwordEt; - private ImageView wxLogin; - private ImageView qqLogin; private Button btnLogin; - private TextView tvLoginTip; private EditText codeEditText; private Button getCodeButton; -// private volatile boolean isCheckingState = false; - private TextView tvProtocol; - - private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日", Locale.getDefault()); private AccountValidator accountValidator = new AccountValidator(); private SMSCodeValidator smsCodeValidator = new SMSCodeValidator(); private CodeDownTimer timer; @@ -113,7 +75,6 @@ public class LoginActivity extends BaseActivity implements View.OnClickListener checkInput(); } }; - private TextView tvDesc; private boolean isSuperAdmin = false; public static void start(Context context) { @@ -121,104 +82,46 @@ public class LoginActivity extends BaseActivity implements View.OnClickListener context.startActivity(intent); } + public static void startForResult(Activity context, int requestCode) { + Intent intent = new Intent(context, LoginActivity.class); + context.startActivityForResult(intent, requestCode); // startActivityForResult会导致singletop,singletask失效 + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); + initTitleBar(""); onFindViews(); onSetListener(); - permission(); - showLoginTip(); +// permission(); +// showLoginTip(); EventBus.getDefault().register(this); AuthModel.get().isFromLogin = true; - AppUpgradeHelper.checkAppUpgrade(this); } @Override protected void setStatusBar() { -// super.setStatusBar(); StatusBarLightModes(true); } - private void permission() { - checkPermission(() -> { - InitialModel.get().reportBaiduAdv().subscribe(); - }, - R.string.ask_again, - BASIC_PERMISSIONS); - } - private void onFindViews() { accountEt = findViewById(R.id.et_account); passwordEt = findViewById(R.id.et_password); - tvProtocol = (TextView) findViewById(R.id.tv_protocol); - wxLogin = (ImageView) findViewById(R.id.img_wx_login); - qqLogin = (ImageView) findViewById(R.id.img_qq_login); - tvLoginTip = (TextView) findViewById(R.id.tv_login_tip); + tvProtocol = findViewById(R.id.tv_protocol); + wxLogin = findViewById(R.id.img_wx_login); + qqLogin = findViewById(R.id.img_qq_login); + tvLoginTip = findViewById(R.id.tv_login_tip); codeEditText = findViewById(R.id.et_code); getCodeButton = findViewById(R.id.btn_get_code); tvDesc = findViewById(R.id.tv_desc); - String privacyAgreementTip = context.getString(R.string.tip_privacy_agreement); - String userAgreementTip = context.getString(R.string.tip_user_agreement); - String privacyAgreementDescTip = context.getString(R.string.text_login_protocol, privacyAgreementTip, userAgreementTip); - SpannableString ss = new SpannableString(privacyAgreementDescTip); - int privacyAgreementTipIndex = privacyAgreementDescTip.indexOf(privacyAgreementTip); - int userAgreementTipIndex = privacyAgreementDescTip.indexOf(userAgreementTip); - - - ss.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, R.color.design_color)), privacyAgreementTipIndex, privacyAgreementTipIndex + privacyAgreementTip.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - ss.setSpan(new OriginalDrawStatusClickSpan(ContextCompat.getColor(context, R.color.design_color)) { - @Override - public void onClick(@NonNull View widget) { - if (widget instanceof TextView) - ((TextView) widget).setHighlightColor(getResources().getColor(android.R.color.transparent)); - - CommonWebViewActivity.start(context, UriProvider.getPrivacyAgreement()); - } - }, privacyAgreementTipIndex, privacyAgreementTipIndex + privacyAgreementTip.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - ss.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, R.color.design_color)), userAgreementTipIndex, userAgreementTipIndex + userAgreementTip.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - ss.setSpan(new OriginalDrawStatusClickSpan(ContextCompat.getColor(context, R.color.design_color)) { - @Override - public void onClick(@NonNull View widget) { - if (widget instanceof TextView) - ((TextView) widget).setHighlightColor(getResources().getColor(android.R.color.transparent)); - - CommonWebViewActivity.start(context, UriProvider.getUserProtocolUrl()); - } - }, userAgreementTipIndex, userAgreementTipIndex + privacyAgreementTip.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - - tvProtocol.setText(ss); - tvProtocol.setHighlightColor(Color.TRANSPARENT); - tvProtocol.setMovementMethod(new LinkMovementMethod()); - - -// initOldAccount(); + setProtocol(); codeEditText.setVisibility(View.GONE); getCodeButton.setVisibility(View.GONE); } -// private void initOldAccount() { -// String howLogin = context.getString(R.string.tip_login_how_login); -// String content = context.getString(R.string.tip_login_old_account, context.getString(R.string.old_app_name), context.getString(R.string.app_name),howLogin); -// SpannableString ss = new SpannableString(content); -// int howLoginIndex = content.indexOf(howLogin); -// -// -// ss.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, R.color.design_color)), howLoginIndex, howLoginIndex + howLogin.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); -// ss.setSpan(new OriginalDrawStatusClickSpan() { -// @Override -// public void onClick(@NonNull View widget) { -// CommonWebViewActivity.start(context, UriProvider.getPrivacyAgreement()); -// } -// }, howLoginIndex, howLoginIndex + howLogin.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); -// -// tvDesc.setText(ss); -// tvDesc.setMovementMethod(new LinkMovementMethod()); -// } - - private void onSetListener() { btnLogin = findViewById(R.id.btn_login); btnLogin.setOnClickListener(this); @@ -227,9 +130,6 @@ public class LoginActivity extends BaseActivity implements View.OnClickListener findViewById(R.id.btn_forget).setOnClickListener(this); wxLogin.setOnClickListener(this); qqLogin.setOnClickListener(this); -// tvDesc.setOnClickListener(this); -// tvLoginTip.setOnClickListener(this); -// tvProtocol.setOnClickListener(this); accountEt.addTextChangedListener(textWatcher); passwordEt.addTextChangedListener(textWatcher); @@ -256,23 +156,8 @@ public class LoginActivity extends BaseActivity implements View.OnClickListener } } - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK) { - moveTaskToBack(true); - return true; - } - return super.onKeyDown(keyCode, event); - } - @Override public void onClick(View v) { - // 易盾保护 token - String yiDunToken = watchman.getToken(XChatConstants.YI_DUN_BUSINESS_ID); - // 易盾保护 token 登录 - String yiDunLoginToken = watchman.getToken(XChatConstants.YI_DUN_LOGIN_BUSINESS_ID); - // 数美天网 deviceId - String shuMeiDeviceId = SmAntiFraud.getDeviceId(); switch (v.getId()) { case R.id.btn_login: if (!accountValidator.isValid(accountEt.getText().toString())) { @@ -293,6 +178,10 @@ public class LoginActivity extends BaseActivity implements View.OnClickListener KeyBoardUtils.hideKeyBoard(this, accountEt); KeyBoardUtils.hideKeyBoard(this, passwordEt); getDialogManager().showProgressDialog(this, "正在登录..."); + // 易盾保护 token 登录 + String yiDunLoginToken = watchman.getToken(XChatConstants.YI_DUN_LOGIN_BUSINESS_ID); + // 数美天网 deviceId + String shuMeiDeviceId = SmAntiFraud.getDeviceId(); AuthModel.get().login( account, password, @@ -308,6 +197,7 @@ public class LoginActivity extends BaseActivity implements View.OnClickListener @Override public void onSuccess(String s) { getDialogManager().dismissDialog(); + setResult(RESULT_OK); finish(); } @@ -331,63 +221,12 @@ public class LoginActivity extends BaseActivity implements View.OnClickListener break; case R.id.img_wx_login: - getDialogManager().showProgressDialog(this, "请稍后"); - AuthModel.get() - .wxLogin(yiDunToken, shuMeiDeviceId) - .subscribe(new SingleObserver() { - @Override - public void onSubscribe(Disposable d) { - mCompositeDisposable.add(d); - } - - @Override - public void onSuccess(String s) { - getDialogManager().dismissDialog(); - finish(); - } - - @Override - public void onError(Throwable e) { - getDialogManager().dismissDialog(); - dealWithLoginError(e); - } - }); - StatisticManager.Instance().onEvent(this, - StatisticsProtocol.Event.EVENT_LOGIN_WX_CLICK, "点击微信登录", null); + wxLogin(); break; case R.id.img_qq_login: - getDialogManager().showProgressDialog(this, "请稍后"); - AuthModel.get() - .qqLogin(yiDunToken, shuMeiDeviceId) - .subscribe(new SingleObserver() { - @Override - public void onSubscribe(Disposable d) { - mCompositeDisposable.add(d); - } - - @Override - public void onSuccess(String s) { - getDialogManager().dismissDialog(); - finish(); - } - - @Override - public void onError(Throwable e) { - getDialogManager().dismissDialog(); - dealWithLoginError(e); - } - }); - StatisticManager.Instance().onEvent(this, - StatisticsProtocol.Event.EVENT_LOGIN_QQ_CLICK, "点击qq登录", null); -// } else { -// QQLoginSelectMemberTypeActivity.start(this); -// } + qqLogin(); break; -// case R.id.tv_desc: -// case R.id.tv_login_tip: -// CommonWebViewActivity.start(this, UriProvider.JAVA_WEB_URL + XChatConstants.LOGIN_ERBAN_ACCOUNT_URL); -// break; case R.id.tv_protocol: CommonWebViewActivity.start(this, UriProvider.getUserProtocolUrl()); break; @@ -400,7 +239,8 @@ public class LoginActivity extends BaseActivity implements View.OnClickListener } } - private void dealWithLoginError(Throwable e) { + @Override + public void dealWithLoginError(Throwable e) { if (!(e instanceof IsSuperAdminException)) { String msg = e.getMessage(); StringBuilder eventLabel = new StringBuilder("登录注册页-登录失败"); @@ -415,6 +255,7 @@ public class LoginActivity extends BaseActivity implements View.OnClickListener BanAccountException exception = (BanAccountException) e; String text = "您的账号因" + exception.getMessage() + "被封禁\n解封时间:"; int start = text.length(); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日", Locale.getDefault()); text += simpleDateFormat.format(new Date(exception.getDate())); SpannableString spannableString = new SpannableString(text); spannableString.setSpan(new ForegroundColorSpan(ContextCompat.getColor(LoginActivity.this, R.color.appColor)), @@ -544,57 +385,10 @@ public class LoginActivity extends BaseActivity implements View.OnClickListener @Subscribe(threadMode = ThreadMode.MAIN) public void onLoginEvent(LoginEvent event) { getDialogManager().dismissDialog(); + setResult(RESULT_OK); finish(); } - @SuppressLint("CheckResult") - private void showLoginTip() { - MarketVerifyModel.get().loadLoginTip() - .compose(bindToLifecycle()) - .subscribe(new BiConsumer() { - @Override - public void accept(LoginTipsInfo loginTipsInfo, Throwable throwable) throws Exception { - if (throwable == null) { - String tips = loginTipsInfo.getTips(); - - if (!TextUtils.isEmpty(tips)) { - SpannableStringBuilder builder = new SpannableStringBuilder(tips); - int start = tips.indexOf("如何登录"); - - if (start > -1) { - builder.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, R.color.color_FE4C62)), start, start + 5, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - builder.setSpan(new OriginalDrawStatusClickSpan() { - @Override - public void onClick(@NonNull View widget) { - CommonWebViewActivity.start(LoginActivity.this, UriProvider.JAVA_WEB_URL + XChatConstants.LOGIN_ERBAN_ACCOUNT_URL); - } - }, start, start + 5, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - - } - - - tvDesc.setText(builder); - tvDesc.setHighlightColor(Color.TRANSPARENT); - tvDesc.setMovementMethod(new LinkMovementMethod()); - - } else { -// isCheckingState = true; - } - - tvLoginTip.setVisibility(loginTipsInfo.isShowWechat() || loginTipsInfo.isShowQq() ? View.VISIBLE : View.GONE); - wxLogin.setVisibility(loginTipsInfo.isShowWechat() ? View.VISIBLE : View.GONE); - qqLogin.setVisibility(loginTipsInfo.isShowQq() ? View.VISIBLE : View.GONE); - - } else { - tvLoginTip.setVisibility(View.GONE); - wxLogin.setVisibility(View.GONE); - qqLogin.setVisibility(View.GONE); - - } - } - }); - } - @Override public boolean onTouchEvent(MotionEvent event) { View view = getCurrentFocus(); diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/fragment/AddUserInfoFragment.java b/app/src/main/java/com/yizhuan/erban/ui/login/fragment/AddUserInfoFragment.java index 391156795..48a583790 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/login/fragment/AddUserInfoFragment.java +++ b/app/src/main/java/com/yizhuan/erban/ui/login/fragment/AddUserInfoFragment.java @@ -10,6 +10,7 @@ import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; +import android.widget.ImageView; import android.widget.TextView; import com.fourmob.datetimepicker.date.DatePickerDialog; @@ -24,6 +25,7 @@ import com.yizhuan.erban.base.BaseFragment; import com.yizhuan.erban.common.widget.CircleImageView; import com.yizhuan.erban.ui.login.AddUserInfoActivity; import com.yizhuan.erban.ui.utils.ImageLoadUtils; +import com.yizhuan.erban.ui.utils.ImageLoadUtilsV2; import com.yizhuan.erban.ui.widget.ButtonItem; import com.yizhuan.xchat_android_core.auth.AuthModel; import com.yizhuan.xchat_android_core.auth.entity.ThirdUserInfo; @@ -34,6 +36,8 @@ import com.yizhuan.xchat_android_core.statistic.StatisticManager; import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol; import com.yizhuan.xchat_android_core.user.UserModel; import com.yizhuan.xchat_android_core.user.bean.UserInfo; +import com.yizhuan.xchat_android_core.user.bean.UserRandomConfig; +import com.yizhuan.xchat_android_core.utils.net.DontWarnObserver; import com.yizhuan.xchat_android_library.utils.StringUtils; import com.yizhuan.xchat_android_library.utils.TimeUtils; @@ -47,6 +51,7 @@ import java.util.Map; import io.reactivex.SingleObserver; import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; /** * @author jack @@ -67,6 +72,10 @@ public class AddUserInfoFragment extends BaseFragment // private TextView tvGenderMen; // private TextView tvGenderWomen; + private ImageView ivRandomAvatar; + + private TextView tvRandomNick; + private DatePickerDialog datePickerDialog; private String avatarUrl; @@ -98,6 +107,10 @@ public class AddUserInfoFragment extends BaseFragment okBtn = view.findViewById(R.id.ok_btn); // tvGenderMen = view.findViewById(R.id.tv_gender_men); // tvGenderWomen = view.findViewById(R.id.tv_gender_women); + ivRandomAvatar = view.findViewById(R.id.iv_random_avatar); + tvRandomNick = view.findViewById(R.id.tv_random_nick); + ivRandomAvatar.setVisibility(View.GONE); + tvRandomNick.setVisibility(View.GONE); } @Override @@ -109,6 +122,8 @@ public class AddUserInfoFragment extends BaseFragment okBtn.setOnClickListener(this); // tvGenderMen.setOnClickListener(this); // tvGenderWomen.setOnClickListener(this); + ivRandomAvatar.setOnClickListener(this); + tvRandomNick.setOnClickListener(this); init(); addWXUserInfo(); } @@ -145,6 +160,18 @@ public class AddUserInfoFragment extends BaseFragment tvBirthday.setText(String.format(Locale.getDefault(), "%d-01-01", year)); // 设置默认昵称 tvNick.setText(R.string.text_default_nick); + + UserModel.get().getRandomConfig() + .compose(bindUntilEvent(FragmentEvent.DESTROY_VIEW)) + .doOnSuccess(userRandomConfig -> { + if (userRandomConfig.isAvatar()) { + ivRandomAvatar.setVisibility(View.VISIBLE); + } + if (userRandomConfig.isNick()) { + tvRandomNick.setVisibility(View.VISIBLE); + } + }) + .subscribe(); } @Override @@ -247,26 +274,54 @@ public class AddUserInfoFragment extends BaseFragment buttonItemList.add(localItem); getDialogManager().showCommonPopupDialog(buttonItemList, "取消", false); break; + + case R.id.iv_random_avatar: + StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_INFORMATION_RANDOM_AVATAR, + "随机头像"); + ivRandomAvatar.setEnabled(false); + UserModel.get().getRandomAvatar() + .compose(bindUntilEvent(FragmentEvent.DESTROY_VIEW)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(String avatar, String error) { + super.accept(avatar, error); + ivRandomAvatar.setEnabled(true); + if (error != null) { + toast(error); + return; + } + if (!TextUtils.isEmpty(avatar)) { + avatarUrl = avatar; + ImageLoadUtilsV2.loadAvatar(civAvatar, avatar); + } + } + }); + break; + + case R.id.tv_random_nick: + StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_INFORMATION_RANDOM_NAME, + "随机昵称"); + tvRandomNick.setEnabled(false); + UserModel.get().getRandomNick() + .compose(bindUntilEvent(FragmentEvent.DESTROY_VIEW)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(String nick, String error) { + super.accept(nick, error); + tvRandomNick.setEnabled(true); + if (error != null) { + toast(error); + return; + } + if (!TextUtils.isEmpty(nick)) { + tvNick.setText(nick); + } + } + }); + break; + default: -// case R.id.tv_gender_men: -// tvGenderMen.setSelected(!tvGenderMen.isSelected()); -// if (tvGenderMen.isSelected()) { -// gender = UserInfo.GENDER_MALE; -// tvGenderWomen.setSelected(false); -// } else { -// gender = -1; -// } -// break; -// -// case R.id.tv_gender_women: -// tvGenderWomen.setSelected(!tvGenderWomen.isSelected()); -// if (tvGenderWomen.isSelected()) { -// gender = UserInfo.GENDER_FEMALE; -// tvGenderMen.setSelected(false); -// } else { -// gender = -1; -// } break; } } diff --git a/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java b/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java index 1fcf78ef7..715e37e8d 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java @@ -301,6 +301,10 @@ public class ChargeActivity extends BaseActivity { protected void onResume() { super.onResume(); EventBus.getDefault().register(this); + if (PayModel.get().isFirstChargeSuccess()) { + PayModel.get().setFirstChargeSuccess(false); + onRefreshing(); + } } @Override @@ -311,10 +315,20 @@ public class ChargeActivity extends BaseActivity { public void onGetChargeList(List chargeBeanList) { if (chargeBeanList != null && chargeBeanList.size() > 0) { + //先判断存不存在1元档位 + boolean isExistOneYuan = false; for (int i = 0; i < chargeBeanList.size(); i++) { ChargeBean chargeBean = chargeBeanList.get(i); - chargeBean.isSelected = chargeBean.getMoney() == 48; - if (48 == chargeBean.getMoney()) { + if (chargeBean.getMoney() == 1) { + isExistOneYuan = true; + break; + } + } + int selectedMoney = isExistOneYuan ? 1 : 48; + for (int i = 0; i < chargeBeanList.size(); i++) { + ChargeBean chargeBean = chargeBeanList.get(i); + chargeBean.isSelected = chargeBean.getMoney() == selectedMoney; + if (selectedMoney == chargeBean.getMoney()) { mSelectChargeBean = chargeBean; } } @@ -444,6 +458,10 @@ public class ChargeActivity extends BaseActivity { disposeCompositeDisposable(); if (stringServiceResult != null) { toast(stringServiceResult.getMessage()); + if (stringServiceResult.getCode() == ServiceResult.SC_SUCCESS) { + PayModel.get().setFirstChargeSuccess(false); + onRefreshing(); + } } }, throwable -> { throwable.printStackTrace(); diff --git a/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeAdapter.java b/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeAdapter.java index a29a52cf8..61bfef18a 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeAdapter.java @@ -42,6 +42,10 @@ public class ChargeAdapter extends BaseQuickAdapter tv_money_gold.setTextColor(mContext.getResources().getColor(R.color.color_999999)); cb_money.setTextColor(mContext.getResources().getColor(R.color.color_999999)); } + + //跟iOS逻辑一致,如果1元则显示首充的icon + baseViewHolder.setGone(R.id.iv_first_recharge, chargeBean.getMoney() == 1); + } } diff --git a/app/src/main/java/com/yizhuan/erban/ui/search/SearchActivity.java b/app/src/main/java/com/yizhuan/erban/ui/search/SearchActivity.java index 02aa7f6c9..72e07dbd3 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/search/SearchActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/search/SearchActivity.java @@ -236,6 +236,8 @@ public class SearchActivity extends BaseMvpActivity= 0 && position < list.size()) { String record = list.get(position); searchEdit.setText(record); + + toSearch(); } } diff --git a/app/src/main/java/com/yizhuan/erban/ui/setting/FeedbackActivity.java b/app/src/main/java/com/yizhuan/erban/ui/setting/FeedbackActivity.java index 9932dce62..9b7f4f7e4 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/setting/FeedbackActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/setting/FeedbackActivity.java @@ -1,5 +1,7 @@ package com.yizhuan.erban.ui.setting; +import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.widget.Button; import android.widget.EditText; @@ -20,6 +22,11 @@ public class FeedbackActivity extends BaseActivity { private EditText edtContact; private Button btnCommit; + public static void start(Context context) { + Intent intent = new Intent(context, FeedbackActivity.class); + context.startActivity(intent); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/app/src/main/java/com/yizhuan/erban/ui/setting/ModifyPwdActivity.java b/app/src/main/java/com/yizhuan/erban/ui/setting/ModifyPwdActivity.java index 9edaf2238..e31bf408c 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/setting/ModifyPwdActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/setting/ModifyPwdActivity.java @@ -7,14 +7,20 @@ import android.text.InputFilter; import android.text.TextUtils; import android.view.View; +import com.trello.rxlifecycle2.android.ActivityEvent; import com.yizhuan.erban.R; import com.yizhuan.erban.UIHelper; import com.yizhuan.erban.base.BaseBindingActivity; import com.yizhuan.erban.databinding.ActivityModifyPwdBinding; +import com.yizhuan.erban.ui.login.CodeDownTimer; import com.yizhuan.erban.ui.login.PasswordValidator; import com.yizhuan.xchat_android_core.auth.AuthModel; +import com.yizhuan.xchat_android_core.code.CodeModel; +import com.yizhuan.xchat_android_core.code.CodeType; import com.yizhuan.xchat_android_core.user.UserModel; +import com.yizhuan.xchat_android_core.user.bean.UserInfo; import com.yizhuan.xchat_android_core.utils.net.BeanObserver; +import com.yizhuan.xchat_android_core.utils.net.DontWarnObserver; import com.yizhuan.xchat_android_library.annatation.ActLayoutRes; import io.reactivex.SingleObserver; @@ -31,6 +37,12 @@ public class ModifyPwdActivity extends BaseBindingActivity() { + @Override + public void accept(String s, String error) { + super.accept(s, error); + if (error != null) { + mBinding.btnGetCode.setClickable(true); + return; + } + mBinding.tvCodeTips.setText(getString(R.string.send_code_success_tips, userInfo.getPhone())); + startCountDownTimer(); + } + }); + break; + } + } + + private void startCountDownTimer() { + stopCountDownTimer(); + timer = new CodeDownTimer(mBinding.btnGetCode, 60000, 1000); + timer.start(); + } + + private void stopCountDownTimer() { + if (timer != null) { + timer.cancel(); + timer = null; } } @@ -155,6 +210,10 @@ public class ModifyPwdActivity extends BaseBindingActivity() { @Override public void onErrorMsg(String error) { diff --git a/app/src/main/java/com/yizhuan/erban/ui/setting/NoticeSettingActivity.java b/app/src/main/java/com/yizhuan/erban/ui/setting/NoticeSettingActivity.java index a974f1096..a77f901ed 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/setting/NoticeSettingActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/setting/NoticeSettingActivity.java @@ -40,9 +40,11 @@ public class NoticeSettingActivity extends BaseActivity { } private View systemNoticeView; - private TutuSwitchView switchSystemNotice; + private View communityNoticeView; + private TutuSwitchView switchCommunityNotice; + private UserInfo.Location userExpand; @Override @@ -97,6 +99,38 @@ public class NoticeSettingActivity extends BaseActivity { } }); + if (communityNoticeView == null) { + communityNoticeView = LayoutInflater.from(context).inflate(R.layout.item_system_notice, null); + switchCommunityNotice = communityNoticeView.findViewById(R.id.switch_notice); + llContainer.addView(communityNoticeView, new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + getResources().getDimensionPixelOffset(R.dimen.dp_setting_sys_notice_item_height)) + ); + setName(communityNoticeView, "互动通知"); + setDesc(communityNoticeView, "关闭后,收到动态互动消息不再提示"); + } + switchCommunityNotice.setOn(userExpand.isInteractiveMsgNotify()); + + switchCommunityNotice.setOnSwitchStateChangeListener(new IOSSwitchView.OnSwitchStateChangeListener() { + @Override + public void onStateSwitched(boolean isOn) { + SettingsModel.get().interactiveMsgNotify(isOn) + .compose(bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(String s, String error) { + super.accept(s, error); + if (error == null) { + userExpand.setInteractiveMsgNotify(isOn); + } else { + toast(error); + } + } + }); + + } + }); + } private void setName(View targetView, String name) { diff --git a/app/src/main/java/com/yizhuan/erban/ui/user/UserInfoActivity.java b/app/src/main/java/com/yizhuan/erban/ui/user/UserInfoActivity.java index b671b7ff4..c69c85d45 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/user/UserInfoActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/user/UserInfoActivity.java @@ -143,6 +143,9 @@ public class UserInfoActivity extends BaseBindingActivity) userInfo.getUserInfoSkillVo().getLiveSkillVoList(), - UserInfoItem.TYPE_DES_TAG, false); - } - mUserDesAdapter.setUserInfo(userInfo); //设置家族 if (FamilyInfo.NO_FAMILY_ID.equals(userInfo.getFamilyId()) || TextUtils.isEmpty(userInfo.getFamilyId()) @@ -582,16 +566,6 @@ public class UserInfoFragment extends BaseFragment implements View.OnClickListen return mView; } - private void tagOption(View view) { - switch (view.getId()) { - case R.id.tv_edit: - LiveTagDialog liveTagDialog = new LiveTagDialog(getActivity(), userInfo.getUserInfoSkillVo().getLiveSkillVoList()); - liveTagDialog.openDialog(); - break; - } - - } - @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/yizhuan/erban/ui/user/adapter/UserDesAdapter.java b/app/src/main/java/com/yizhuan/erban/ui/user/adapter/UserDesAdapter.java index 5ffdc8c74..2b3c96114 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/user/adapter/UserDesAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/ui/user/adapter/UserDesAdapter.java @@ -62,7 +62,6 @@ public class UserDesAdapter extends UserTabBaseAdapter implements UserPhotoAdapt addItemType(UserInfoItem.TYPE_DES_HALL, R.layout.include_user_module_hall); addItemType(UserInfoItem.TYPE_DES_GAME, R.layout.layout_desc_game); addItemType(UserInfoItem.TYPE_DES_JOIN_WORLDS, R.layout.layout_user_join_worlds); - addItemType(UserInfoItem.TYPE_DES_TAG, R.layout.layout_desc_tag); } public void setPlaying(boolean playing) { @@ -101,10 +100,6 @@ public class UserDesAdapter extends UserTabBaseAdapter implements UserPhotoAdapt setGame(helper, item); break; - case UserInfoItem.TYPE_DES_TAG: - setTag(helper, item); - break; - case UserInfoItem.TYPE_DES_JOIN_WORLDS: setJoinWorlds(helper, item); break; @@ -113,36 +108,6 @@ public class UserDesAdapter extends UserTabBaseAdapter implements UserPhotoAdapt } - private LinearLayoutManager tagManager; - - private void setTag(BaseViewHolder helper, UserInfoItem item) { - if (item == null) - return; - - ArrayList liveSkillVoListBeans = (ArrayList) item.getData(); - if (liveSkillVoListBeans == null) - return; - - RecyclerView rvTag = helper.itemView.findViewById(R.id.rv_tag); - if (rvTag == null) - return; - - if (tagManager == null) - tagManager = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false); - rvTag.setLayoutManager(tagManager); - - BaseAdapter liveTagAdapter = new BaseAdapter(R.layout.item_live_tag, BR.tagInfo); - rvTag.setAdapter(liveTagAdapter); - - helper.setGone(R.id.rv_tag, true); - helper.setGone(R.id.ll_tag, true); - liveTagAdapter.setNewData(liveSkillVoListBeans); - - helper.setGone(R.id.tv_edit, isOwner()); - helper.addOnClickListener(R.id.tv_edit); - - } - private LinearLayoutManager gameManager; private void setGame(BaseViewHolder helper, UserInfoItem item) { diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/GiftDialog.java b/app/src/main/java/com/yizhuan/erban/ui/widget/GiftDialog.java index a2602b9c7..8a9b8f55d 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/widget/GiftDialog.java +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/GiftDialog.java @@ -72,6 +72,7 @@ import com.yizhuan.xchat_android_core.manager.IMNetEaseManager; import com.yizhuan.xchat_android_core.manager.RoomEvent; import com.yizhuan.xchat_android_core.pay.PayModel; import com.yizhuan.xchat_android_core.pay.bean.WalletInfo; +import com.yizhuan.xchat_android_core.pay.event.FirstRechargeEvent; import com.yizhuan.xchat_android_core.pay.event.UpdateWalletInfoEvent; import com.yizhuan.xchat_android_core.radish.RadishModel; import com.yizhuan.xchat_android_core.radish.RadishWalletInfo; @@ -107,6 +108,7 @@ import io.reactivex.Single; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; +import io.reactivex.functions.BiConsumer; import io.reactivex.functions.Consumer; /** @@ -138,6 +140,7 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene private TextView giftNumberText; private ImageView giftNumberOptions; private ImageView ivOpenNoble; + private View ivFirstRecharge; private EditText etSendMessage; private Button sendGiftButton; private View layoutEmpty; @@ -387,15 +390,11 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene // 更新所有礼物 updateGiftView(giftIndicator.getCurrrentType()); goldWalletInfo = PayModel.get().getCurrentWalletInfo(); - // 如果自己是贵族,则不需要显示开通贵族的入口 - UserInfo myUserInfo = UserModel.get().getCacheLoginUserInfo(); - if (myUserInfo != null) { - if (myUserInfo.getNobleInfo() != null && myUserInfo.getNobleInfo().getLevel() > 0) { - ivOpenNoble.setVisibility(View.GONE); - } else { - ivOpenNoble.setVisibility(View.VISIBLE); - } - } + + ivFirstRecharge = root.findViewById(R.id.iv_first_recharge); + ivFirstRecharge.setOnClickListener(this); + //首充逻辑 + updateFirstRechargeStatus(); View descLayout = root.findViewById(R.id.desc_layout); @@ -470,6 +469,35 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene }; RadishWalletManager.get().getLdRadishNumber().observeForever(radishObserver); RadishModel.get().updateRadishWallet().subscribe(); + + } + + /** + * 首充逻辑 有首充则优先显示首充,没有则走贵族的逻辑 + */ + private void updateFirstRechargeStatus() { + + ivFirstRecharge.setVisibility(View.GONE); + ivOpenNoble.setVisibility(View.GONE); + + Disposable isFirstChargeDis = PayModel.get().isFirstCharge() + .compose(RxHelper.bindContext(context)) + .subscribe((aBoolean, throwable) -> { + if (aBoolean != null && aBoolean) { + ivFirstRecharge.setVisibility(View.VISIBLE); + return; + } + // 如果自己是贵族,则不需要显示开通贵族的入口 + UserInfo myUserInfo = UserModel.get().getCacheLoginUserInfo(); + if (myUserInfo != null) { + if (myUserInfo.getNobleInfo() != null && myUserInfo.getNobleInfo().getLevel() > 0) { + ivOpenNoble.setVisibility(View.GONE); + } else { + ivOpenNoble.setVisibility(View.VISIBLE); + } + } + }); + compositeDisposable.add(isFirstChargeDis); } @NonNull @@ -1112,6 +1140,12 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene CommonWebViewActivity.start(context, UriProvider.getNobleIntro() + query); break; + case R.id.iv_first_recharge: + StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_ROOM_GIFT_ONEYUAN_ENTRANCE, + "礼物面板_一元首充-区分-" + GIFT_DIALOG_FROM); + ChargeActivity.start(context); + break; + case R.id.tv_reload: reloadData(); break; @@ -1319,6 +1353,11 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene } } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onFirstRechargeEvent(FirstRechargeEvent event) { + updateFirstRechargeStatus(); + } + private void onGiftOutOfDate(String message) { ((BaseActivity) getContext()).toast(message); } diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java b/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java index bf7281583..2804e2b36 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java @@ -127,8 +127,8 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe private TextView tvFamilyNameLabel; private TextView tvFamilyName; private FlexboxLayout flexbox; - private ImageView iv101; - private ImageView ivTag; + + private View inOfficialMask; private long myUid; private Disposable subscribe; @@ -184,6 +184,8 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe //ivTopBg = findViewById(R.id.iv_top_bg); flexbox = findViewById(R.id.flexbox); + inOfficialMask = findViewById(R.id.in_official_mask); + ivAvatarHeadWear = findViewById(R.id.iv_avatar_head_wear); ivBadge = findViewById(R.id.iv_badge); ivBadge.setVisibility(View.GONE); @@ -196,8 +198,6 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe llFamily = (LinearLayout) findViewById(R.id.ll_family); tvFamilyNameLabel = (TextView) findViewById(R.id.tv_family_name_label); tvFamilyName = (TextView) findViewById(R.id.tv_family_name); - iv101 = findViewById(R.id.iv_101); - ivTag = findViewById(R.id.iv_tag); avatarLayout.setOnClickListener(this); closeImage.setOnClickListener(this); @@ -469,16 +469,16 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe ImageLoadUtils.loadImage(context, userLevelVo.getCharmUrl(), mIvUserCharm); } } - if (userInfo.getUserInfoSkillVo() != null) { - iv101.setVisibility(userInfo.getUserInfoSkillVo().isLiveTag() ? View.VISIBLE : View.GONE); - if (!TextUtils.isEmpty(userInfo.getUserInfoSkillVo().getSkillTag())) { - ImageLoadUtils.loadImage(context, userInfo.getUserInfoSkillVo().getSkillTag(), ivTag); - ivTag.setVisibility(View.VISIBLE); - } - } // 改变贵族 updateNobleView(); + UserInfo.NamePlate namePlate = userInfo.getNameplate(); + if (namePlate != null) { + setOfficialMask(namePlate.getFixedWord(), namePlate.getIconPic()); + } else { + setOfficialMask(null, null); + } + if (null != findHimView) { //获取用户房间信息 AvRoomModel.get().getUserRoom(userInfo.getUid()) @@ -527,6 +527,27 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe } } + private void setOfficialMask(String name, String icon) { + if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(icon)) { + inOfficialMask.setVisibility(View.VISIBLE); + inOfficialMask.setVisibility(View.VISIBLE); + TextView tvOfficialMask; + tvOfficialMask = inOfficialMask.findViewById(R.id.tv_official_mask); + if (tvOfficialMask != null) { + tvOfficialMask.setText(name); + } + + ImageView ivOfficialMask; + ivOfficialMask = inOfficialMask.findViewById(R.id.iv_official_mask); + if (ivOfficialMask != null) { + NobleUtil.loadResource(icon, ivOfficialMask); + } + + } else { + inOfficialMask.setVisibility(View.GONE); + } + } + private void loadSimpleFamilyInfo(String familyId) { FamilyModel.Instance().loadFamilySimpleInfo( familyId diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/marqueeview/Utils.java b/app/src/main/java/com/yizhuan/erban/ui/widget/marqueeview/Utils.java index 68b4438e5..df76e386f 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/widget/marqueeview/Utils.java +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/marqueeview/Utils.java @@ -125,4 +125,30 @@ public class Utils { return false; } + public static int getScreenPxWidth(Context context) { + WindowManager wm = (WindowManager) context + .getSystemService(Context.WINDOW_SERVICE); + DisplayMetrics outMetrics = new DisplayMetrics(); + wm.getDefaultDisplay().getMetrics(outMetrics); + return outMetrics.widthPixels; + } + + public static int getScreenDpWidth(Context context) { + int pxWidth = getScreenPxWidth(context); + return (int) px2dip(context, pxWidth); + } + + public static int getScreenPxHeight(Context context) { + WindowManager wm = (WindowManager) context + .getSystemService(Context.WINDOW_SERVICE); + DisplayMetrics outMetrics = new DisplayMetrics(); + wm.getDefaultDisplay().getMetrics(outMetrics); + return outMetrics.heightPixels; + } + + public static int getScreenDpHeight(Context context) { + int pxHeight = getScreenPxHeight(context); + return (int) px2dip(context, pxHeight); + } + } \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/utils/NotificationsUtils.java b/app/src/main/java/com/yizhuan/erban/utils/NotificationsUtils.java new file mode 100644 index 000000000..ddb9eac2d --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/utils/NotificationsUtils.java @@ -0,0 +1,125 @@ +package com.yizhuan.erban.utils; + +import android.app.Activity; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.Settings; +import android.support.v4.app.NotificationManagerCompat; + +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.yizhuan.xchat_android_library.utils.SingleToastUtil; + +/** + * 通知栏监测工具 + * Created by lvzebiao on 2020/3/16. + */ +public class NotificationsUtils { + + public static boolean isNotificationEnabled(Context context) { + return NotificationManagerCompat.from(context.getApplicationContext()).areNotificationsEnabled(); + } + + private static boolean miuiOpen(Activity activity) { + try { + if (OSUtils.isMIUI()) { + Intent intent = new Intent(); + ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.Settings$NotificationFilterActivity"); + Bundle bundle = new Bundle(); + bundle.putString("appName", activity.getResources().getString(activity.getApplicationInfo().labelRes)); + bundle.putString("packageName", activity.getPackageName()); + bundle.putString(":android:show_fragment", "NotificationAccessSettings"); + intent.putExtras(bundle); + intent.setComponent(cn); + activity.startActivity(intent); + return true; + } + } catch (Exception ex) { + ex.printStackTrace(); + } + return false; + } + + public static void openPush(Activity activity) { + try { + if (miuiOpen(activity)) { + //如果是MIUI系统,能成功跳转,则用MIUI跳转,否则走官方方法 + return; + } + + Intent intent = new Intent(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + //这种方案适用于 API 26, 即8.0(含8.0)以上可以用 + intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); + intent.putExtra(Settings.EXTRA_APP_PACKAGE, activity.getPackageName()); + intent.putExtra(Settings.EXTRA_CHANNEL_ID, activity.getApplicationInfo().uid); + activity.startActivity(intent); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); + intent.putExtra("app_package", activity.getPackageName()); + intent.putExtra("app_uid", activity.getApplicationInfo().uid); + activity.startActivity(intent); + } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { + intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.addCategory(Intent.CATEGORY_DEFAULT); + intent.setData(Uri.parse("package:" + activity.getPackageName())); + activity.startActivity(intent); + } else { + toPermissionSetting(activity); + } + } catch (Exception ex) { + String log = "请去应用设置界面开启"; + SingleToastUtil.showToast(log); + LogUtil.e("跳转通知栏页面失败:" + log); + } + } + + /** + * 跳转到权限设置 + * + * @param activity + */ + public static void toPermissionSetting(Activity activity) { + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) { + toSystemConfig(activity); + } else { + try { + toApplicationInfo(activity); + } catch (Exception e) { + e.printStackTrace(); + toSystemConfig(activity); + } + } + } + + /** + * 应用信息界面 + * + * @param activity + */ + public static void toApplicationInfo(Activity activity) { + Intent localIntent = new Intent(); + localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + localIntent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + localIntent.setData(Uri.fromParts("package", activity.getPackageName(), null)); + activity.startActivity(localIntent); + } + + /** + * 系统设置界面 + * + * @param activity + */ + public static void toSystemConfig(Activity activity) { + try { + Intent intent = new Intent(Settings.ACTION_SETTINGS); + activity.startActivity(intent); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/app/src/main/java/com/yizhuan/erban/utils/OSUtils.java b/app/src/main/java/com/yizhuan/erban/utils/OSUtils.java new file mode 100644 index 000000000..bc3df8f15 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/utils/OSUtils.java @@ -0,0 +1,62 @@ +package com.yizhuan.erban.utils; + +import android.text.TextUtils; + + +import com.netease.nim.uikit.common.util.log.LogUtil; + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +/** + * + */ +public class OSUtils { + //小米 + private static final String KEY_MIUI_VERSION_NANE = "ro.miui.ui.version.name"; // "V8" + private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code"; + //vivo + private static final String KEY_FUNTOUCHOS_OS_NAME = "ro.vivo.os.name"; // "Funtouch" + private static final String KEY_FUNTOUCHOS_OS_VERSION = "ro.vivo.os.version"; // "3.0" + private static final String KEY_FUNTOUCHOS_DISPLAY_ID = "ro.vivo.os.build.display.id"; // "FuntouchOS_3.0" + + public static boolean isMIUI() { + return hasBuildPropertie(KEY_MIUI_VERSION_NANE) || hasBuildPropertie(KEY_MIUI_VERSION_CODE); + } + + public static boolean isFuntouchOS() { + return hasBuildPropertie(KEY_FUNTOUCHOS_OS_NAME) || hasBuildPropertie(KEY_FUNTOUCHOS_OS_VERSION) + || hasBuildPropertie(KEY_FUNTOUCHOS_DISPLAY_ID); + } + + public static String getMIUIName() { + return getSystemProperty(KEY_MIUI_VERSION_NANE); + } + + public static boolean hasBuildPropertie(String propName) { + return !TextUtils.isEmpty(getSystemProperty(propName)); + } + + public static String getSystemProperty(String propName) { + String line; + BufferedReader input = null; + try { + Process p = Runtime.getRuntime().exec("getprop " + propName); + input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024); + line = input.readLine(); + input.close(); + } catch (Exception ex) { + return null; + } finally { + if (input != null) { + try { + input.close(); + } catch (Exception e) { + + } + } + } + return line; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/utils/PushMessageHandler.java b/app/src/main/java/com/yizhuan/erban/utils/PushMessageHandler.java new file mode 100644 index 000000000..58f9b12de --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/utils/PushMessageHandler.java @@ -0,0 +1,66 @@ +package com.yizhuan.erban.utils; + +import android.app.Activity; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.text.TextUtils; +import android.util.Log; + +import com.netease.nimlib.sdk.StatusBarNotificationConfig; +import com.netease.nimlib.sdk.mixpush.MixPushMessageHandler; +import com.yizhuan.xchat_android_core.DemoCache; +import com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment; + +import java.io.Serializable; +import java.util.Map; + +public class PushMessageHandler implements MixPushMessageHandler { + private static final String TAG = "mix_push"; + public static final String PAYLOAD_SESSION_ID = "sessionID"; + public static final String PAYLOAD_SESSION_TYPE = "sessionType"; + public static final String PAYLOAD_DATA = "payload_data"; + + @Override + public boolean onNotificationClicked(Context context, Map payload) { + Log.i(TAG, "rev pushMessage payload " + payload); + + String sessionId = payload.get(PAYLOAD_SESSION_ID); + String type = payload.get(PAYLOAD_SESSION_TYPE); + + String skiptype = payload.get("skiptype"); + if (!TextUtils.isEmpty(skiptype) && CustomAttachment.CUSTOM_MSG_HEADER_TYPE_WORLD_DYNAMIC == Integer.valueOf(skiptype)) { + Log.i(TAG, "second"); + Intent notifyIntent = new Intent(); + notifyIntent.setComponent(initLaunchComponent(context)); + notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + notifyIntent.setAction(Intent.ACTION_VIEW); + notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须 + notifyIntent.putExtra(PAYLOAD_DATA, (Serializable) payload); + + context.startActivity(notifyIntent); + return true; + + } else { + Log.i(TAG, "rev pushMessage payload false"); + return false; + } + } + + private ComponentName initLaunchComponent(Context context) { + ComponentName launchComponent; + StatusBarNotificationConfig config = DemoCache.getNotificationConfig(); + Class entrance = config.notificationEntrance; + if (entrance == null) { + launchComponent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()).getComponent(); + } else { + launchComponent = new ComponentName(context, entrance); + } + return launchComponent; + } + + @Override + public boolean cleanMixPushNotifications(int pushType) { + return false; + } +} diff --git a/app/src/main/res/drawable-xhdpi/ic_eyes_close.webp b/app/src/main/res/drawable-xhdpi/ic_eyes_close.webp index 4e06cc728..ec109357a 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_eyes_close.webp and b/app/src/main/res/drawable-xhdpi/ic_eyes_close.webp differ diff --git a/app/src/main/res/drawable-xhdpi/ic_eyes_open.webp b/app/src/main/res/drawable-xhdpi/ic_eyes_open.webp index 8f76d31ef..d8735c240 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_eyes_open.webp and b/app/src/main/res/drawable-xhdpi/ic_eyes_open.webp differ diff --git a/app/src/main/res/drawable-xhdpi/ic_temp_official_mask.png b/app/src/main/res/drawable-xhdpi/ic_temp_official_mask.png new file mode 100644 index 000000000..a4eec9786 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_temp_official_mask.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_first_recharge.webp b/app/src/main/res/drawable-xhdpi/icon_first_recharge.webp new file mode 100644 index 000000000..3a00551fe Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_first_recharge.webp differ diff --git a/app/src/main/res/drawable-xhdpi/icon_oneyuan_gift.webp b/app/src/main/res/drawable-xhdpi/icon_oneyuan_gift.webp new file mode 100644 index 000000000..af569d32a Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_oneyuan_gift.webp differ diff --git a/app/src/main/res/drawable-xhdpi/icon_room_attent.webp b/app/src/main/res/drawable-xhdpi/icon_room_attent.webp new file mode 100644 index 000000000..9114a9649 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_room_attent.webp differ diff --git a/app/src/main/res/drawable-xhdpi/icon_room_attent_gray.webp b/app/src/main/res/drawable-xhdpi/icon_room_attent_gray.webp new file mode 100644 index 000000000..9f9fde6c7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_room_attent_gray.webp differ diff --git a/app/src/main/res/drawable-xhdpi/icon_room_welcome.png b/app/src/main/res/drawable-xhdpi/icon_room_welcome.png new file mode 100644 index 000000000..5ebf76734 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_room_welcome.png differ diff --git a/app/src/main/res/drawable-xhdpi/switch_random_avatar.webp b/app/src/main/res/drawable-xhdpi/switch_random_avatar.webp new file mode 100644 index 000000000..a3553cc59 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/switch_random_avatar.webp differ diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 193cbd49c..f43deec06 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -6,6 +6,14 @@ android:layout_height="match_parent" android:background="@color/white"> + + + + + + +