Compare commits

...

28 Commits

Author SHA1 Message Date
Max
7291b61e44 fix:临时方案修复WEB弹窗因导航栏导致的显示被裁剪问题 2023-11-21 19:36:30 +08:00
Max
034185d13b Merge branch 'habu_3.3.1/optimize' into habu_3.3.1/test 2023-11-21 11:08:56 +08:00
Max
39a9e277bd fix:修复房间轮博索引不一致问题 2023-11-21 11:08:46 +08:00
Max
b11b6928c5 Merge branch 'habu_3.3.1/isolate' into habu_3.3.1/test 2023-11-20 20:03:29 +08:00
Max
41c00cadcd fix:【MainActivity】自动登录逻辑调整:去掉每次获取ticket的动作(接口并发大概率造成401现象);和后台沟通:现阶段不需要每次刷新即可 2023-11-20 20:03:21 +08:00
Max
4cbc12487b Merge branch 'habu_3.3.1/isolate' into habu_3.3.1/test 2023-11-20 18:32:19 +08:00
Max
345cf1a112 feat:删除绑定授权码相关业务代码 2023-11-20 18:32:11 +08:00
Max
7cb27f61b1 Merge branch 'habu_3.3.1/isolate' into habu_3.3.1/test 2023-11-20 16:38:28 +08:00
Max
865dbb09b6 fix:401处理策略调整(仅发送事件会有意外的bug,改用清除本地登录信息+事件) 2023-11-20 16:33:12 +08:00
Max
a38190e2f9 Merge branch 'habu_3.3.1/isolate' into habu_3.3.1/test 2023-11-20 11:08:55 +08:00
Max
ef5e0a8f59 feat:大陆隔离改用单独接口方式请求 2023-11-20 11:08:47 +08:00
Max
774965a2ec merge:优化合并到test 2023-11-20 10:14:49 +08:00
Max
0d488877c8 feat:取消Tab为1时的自动隐藏逻辑 2023-11-20 10:10:29 +08:00
Max
b647785244 feat:完成房间Banner展示需求 2023-11-17 20:15:26 +08:00
Max
9063aee884 feat:追加对401的处理 2023-11-17 18:05:54 +08:00
Max
a3f2f1324c feat:新增banner-Tab展示图片地址 2023-11-17 17:39:35 +08:00
Max
fe3347fd00 feat:ticket为空的判断移到参数拦截器中(怕影响其他原有业务) 2023-11-17 17:39:01 +08:00
Max
e97f5b3953 fix:修复添加空值请求头导致的异常(pub_ticket) 2023-11-17 17:18:19 +08:00
Max
72f12588c0 feat:完成大陆隔离需求(请求信息添加:运营商、本机语言) 2023-11-17 16:46:55 +08:00
Max
995278f44f feat:完善房间Banner展示弹窗逻辑 2023-11-17 15:34:56 +08:00
Max
382eeb3a89 feat:初步搭建房间banner-Web展示页面 2023-11-17 14:07:20 +08:00
Max
9462b4a1be Merge branch 'habu_3.3.1/optimize' into habu_3.3.1/test
# Conflicts:
#	app/src/main/java/com/yizhuan/habu/ui/setting/SettingActivity.kt
2023-11-17 10:46:35 +08:00
Max
cfdb30b1d5 feat:删除测试代码 2023-11-17 10:45:58 +08:00
Max
b598d6d3a6 feat:完成加入公会优化 2023-11-16 18:50:32 +08:00
Max
ab08a85a2a feat:增加几个测试入口给H5 2023-11-16 18:24:48 +08:00
Max
2b79b7ae6a feat:配置测试入口给王龙 2023-11-16 18:07:41 +08:00
Max
7e05a6514f feat:完成飘窗延时功能 2023-11-16 17:58:49 +08:00
Max
ee28779a01 feat:测试环境域名暂且还有peko的 2023-11-16 15:12:14 +08:00
36 changed files with 816 additions and 513 deletions

View File

@@ -147,7 +147,7 @@ android {
}
buildTypes {
def server_url_debug = '"http://beta.api.anan.chat/"'
def server_url_debug = '"http://beta.api.pekolive.com/"'
def server_url_release = '"https://api.anan.chat/"'
debug {

View File

@@ -830,6 +830,10 @@
<activity
android:name=".ui.webview.DatingRuleWebViewActivity"
android:theme="@style/dialog_web_view_activity" />
<activity
android:name=".ui.webview.room_banner.RoomBannerWebDialogActivity"
android:theme="@style/dialog_web_view_activity"
android:windowSoftInputMode="adjustPan" />
<activity
android:name=".ui.webview.TarotPayWebViewActivity"
android:theme="@style/dialog_web_view_activity" />
@@ -958,11 +962,6 @@
android:configChanges="screenSize|orientation|keyboardHidden|mcc|mnc|locale|touchscreen|screenLayout|keyboard|navigation|fontScale|uiMode|smallestScreenSize|layoutDirection"
android:exported="false"
android:screenOrientation="portrait" />
<activity
android:name=".ui.login.LoginBoundAuthCodeActivity"
android:configChanges="screenSize|orientation|keyboardHidden|mcc|mnc|locale|touchscreen|screenLayout|keyboard|navigation|fontScale|uiMode|smallestScreenSize|layoutDirection"
android:exported="false"
android:screenOrientation="portrait" />
<activity
android:name=".ui.setting.ShieldManageActivity"
android:configChanges="screenSize|orientation|keyboardHidden|mcc|mnc|locale|touchscreen|screenLayout|keyboard|navigation|fontScale|uiMode|smallestScreenSize|layoutDirection"

View File

@@ -68,7 +68,6 @@ import com.yizhuan.habu.ui.im.ImInitHelper;
import com.yizhuan.habu.ui.im.avtivity.NimP2PMessageActivity;
import com.yizhuan.habu.ui.login.BindPhoneActivity;
import com.yizhuan.habu.ui.login.LoginActivity;
import com.yizhuan.habu.ui.login.LoginBoundAuthCodeActivity;
import com.yizhuan.habu.ui.login.fragment.AddUserInfoFragment;
import com.yizhuan.habu.ui.patriarch.help.LimitEnterRoomHelper;
import com.yizhuan.habu.ui.patriarch.help.PmDialogShowMrg;
@@ -111,11 +110,9 @@ import com.yizhuan.xchat_android_core.user.event.LoadLoginUserInfoEvent;
import com.yizhuan.xchat_android_core.user.event.LoginUserInfoUpdateEvent;
import com.yizhuan.xchat_android_core.user.event.NeedBindPhoneEvent;
import com.yizhuan.xchat_android_core.user.event.NeedCompleteInfoEvent;
import com.yizhuan.xchat_android_core.user.event.NeedVerifyBoundAuthCodeEvent;
import com.yizhuan.xchat_android_core.utils.CurrentTimeUtils;
import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils;
import com.yizhuan.xchat_android_core.utils.StringUtils;
import com.yizhuan.xchat_android_core.utils.net.BeanObserver;
import com.yizhuan.xchat_android_library.base.factory.CreatePresenter;
import com.yizhuan.xchat_android_library.threadmgr.ThreadPoolManager;
import com.yizhuan.xchat_android_library.utils.JavaUtil;
@@ -254,6 +251,7 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
mMainTabLayout.setMainTabInfoList(mainTabInfo);
}
});
InitialModel.get().regionCheck();
//检测更新
AppUpgradeHelper.checkAppUpgrade(this);
initMaterialView();
@@ -410,6 +408,7 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
}
onParseIntent();
handleNimIntent();
InitialModel.get().regionCheck();
}
private void onParseIntent() {
@@ -558,29 +557,6 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
mMainTabLayout.setMsgNum(unreadCount);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void NeedVerifyBoundAuthCode(NeedVerifyBoundAuthCodeEvent event) {
AuthModel.get()
.isBoundPhoneAuthCode()
.compose(bindUntilEvent(ActivityEvent.DESTROY))
.subscribe(new BeanObserver<Boolean>() {
@Override
public void onErrorMsg(String error) {
com.yizhuan.xchat_android_core.utils.Logger.info("isBoundAuthCode", error);
}
@Override
public void onSuccess(Boolean flag) {
if (!flag) {
LoginBoundAuthCodeActivity.start(MainActivity.this);
} else {
//首次注册需要完善昵称和头像
UIHelper.showAddInfoAct(MainActivity.this);
}
}
});
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onNeedCompleteInfo(NeedCompleteInfoEvent event) {
getDialogManager().dismissDialog();

View File

@@ -3,7 +3,6 @@ package com.yizhuan.habu.application;
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_OPEN_ROOM_NOTI;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.graphics.Color;
@@ -16,6 +15,7 @@ import android.util.Log;
import androidx.multidex.MultiDex;
import com.bumptech.glide.request.target.ViewTarget;
import com.chuhai.utils.LanguageUtils;
import com.coorchice.library.utils.LogUtils;
import com.facebook.stetho.Stetho;
import com.hjq.toast.ToastUtils;
@@ -39,7 +39,6 @@ import com.scwang.smartrefresh.header.MaterialHeader;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.tencent.vasdolly.helper.ChannelReaderUtil;
import com.yizhuan.habu.AgentActivity;
import com.yizhuan.habu.BuildConfig;
import com.yizhuan.habu.NimMiddleActivity;
import com.yizhuan.habu.R;
@@ -241,6 +240,10 @@ public class XChatApplication extends BaseApp {
SingleToastUtil.showToast(serviceResult.getMessage());
EventBus.getDefault().post(new NeedCompleteInfoEvent());
throw new ServerException(serviceResult.getMessage(), serviceResult.getCode());
} else if (serviceResult.getCode() == 401) {
SingleToastUtil.showToast(serviceResult.getMessage());
AuthModel.get().cleanLogInfo();
throw new ServerException(serviceResult.getMessage(), serviceResult.getCode());
}
}
return null;
@@ -400,6 +403,7 @@ public class XChatApplication extends BaseApp {
httpParams.put("deviceId", DeviceUuidFactory.getDeviceId(context));
httpParams.put("androidId", MD5Utils.getMD5String(Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID)));
httpParams.put("channel", AppMetaDataUtil.getChannelID());
httpParams.put("lang", LanguageUtils.INSTANCE.getSystemLanguage().toLanguageTag());
RxNet.init(context)
.debug(BuildConfig.DEBUG)
.setBaseUrl(url)

View File

@@ -513,9 +513,6 @@ open class BaseRoomFragment<V : IBaseRoomView?, P : BaseRoomPresenter<V>?> :
//設置透明度
rollPagerView.setAnimationDurtion(500)
bannerAdapter.notifyDataSetChanged()
bannerAdapter.setRoomActClickListener { url ->
DialogWebViewActivity.start(mContext, url)
}
// 模擬指示器在viewpager底部效果
val viewPager = rollPagerView.viewPager

View File

@@ -1,95 +0,0 @@
package com.yizhuan.habu.home.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.netease.nim.uikit.support.glide.GlideApp;
import com.yizhuan.habu.R;
import com.yizhuan.habu.avroom.firstcharge.FirstChargeDialog;
import com.yizhuan.habu.shipantics.PullRadishActivity;
import com.yizhuan.habu.treasure_box.widget.GoldBoxHelper;
import com.yizhuan.habu.treasurefairy.HomeFairyActivity;
import com.yizhuan.habu.ui.utils.ImageLoadUtils;
import com.yizhuan.habu.ui.widget.rollviewpager.adapter.StaticPagerAdapter;
import com.yizhuan.habu.utils.CommonJumpHelper;
import com.yizhuan.xchat_android_core.home.bean.BannerInfo;
import com.yizhuan.xchat_android_core.room.model.AvRoomModel;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import java.util.List;
public class RoomActAdapter extends StaticPagerAdapter {
private Context mContext;
private List<BannerInfo> data;
private RoomActClickListener listener;
public RoomActAdapter(Context context, List<BannerInfo> data) {
this.data = data;
this.mContext = context;
}
@Override
public View getView(ViewGroup container, int position) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_room_act, container, false);
ImageView ivCover = view.findViewById(R.id.iv_cover);
BannerInfo bannerInfo = data.get(position);
String actId = String.valueOf(bannerInfo.getBannerId());
ivCover.setScaleType(ImageView.ScaleType.CENTER_CROP);
if (bannerInfo.isFairy()) {
ivCover.setImageResource(R.drawable.ic_fairy_entrance);
} else if (bannerInfo.isFirstCharge()) {
ivCover.setImageResource(R.drawable.ic_first_charge_enter);
} else if (bannerInfo.isBox()) {
GlideApp.with(BasicConfig.INSTANCE.getAppContext())
.load(GoldBoxHelper.getBoxIcon())
.error(R.drawable.icon_room_treasure_box)
.into(ivCover);
} else if (bannerInfo.isRadish()) {
ivCover.setImageResource(R.drawable.ic_radish_entrance);
} else {
ImageLoadUtils.loadImage(mContext, bannerInfo.getBannerPic(), ivCover, R.drawable.default_cover);
}
ivCover.setOnClickListener(v -> {
if (bannerInfo.isFairy()) {
HomeFairyActivity.start(mContext);
} else if (bannerInfo.isFirstCharge()) {
FirstChargeDialog.start(mContext);
} else if (bannerInfo.isBox()) {
GoldBoxHelper.handleBoxClick(mContext);
} else if (bannerInfo.isRadish()) {
PullRadishActivity.start(mContext);
} else {
AvRoomModel.get().activityClickLog("2", actId).subscribe();
if (bannerInfo.getSkipType() == 3 && bannerInfo.getShowType() != 1) {
if (listener != null) {
listener.onWebClick(bannerInfo.getSkipUri());
}
} else {
CommonJumpHelper.bannerJump(mContext, bannerInfo);
}
}
});
return view;
}
@Override
public int getCount() {
if (data != null) {
return data.size();
} else {
return 0;
}
}
public void setRoomActClickListener(RoomActClickListener listener) {
this.listener = listener;
}
public interface RoomActClickListener {
void onWebClick(String url);
}
}

View File

@@ -0,0 +1,80 @@
package com.yizhuan.habu.home.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import com.netease.nim.uikit.support.glide.GlideApp
import com.yizhuan.habu.R
import com.yizhuan.habu.avroom.firstcharge.FirstChargeDialog
import com.yizhuan.habu.shipantics.PullRadishActivity
import com.yizhuan.habu.treasure_box.widget.GoldBoxHelper
import com.yizhuan.habu.treasurefairy.HomeFairyActivity
import com.yizhuan.habu.ui.utils.ImageLoadUtils
import com.yizhuan.habu.ui.webview.room_banner.RoomBannerWebDialogActivity
import com.yizhuan.habu.ui.widget.rollviewpager.adapter.StaticPagerAdapter
import com.yizhuan.habu.utils.CommonJumpHelper
import com.yizhuan.xchat_android_core.home.bean.BannerInfo
import com.yizhuan.xchat_android_core.room.model.AvRoomModel
import com.yizhuan.xchat_android_library.utils.config.BasicConfig
import okhttp3.internal.filterList
class RoomActAdapter(private val mContext: Context, private val data: List<BannerInfo>) :
StaticPagerAdapter() {
override fun getView(container: ViewGroup, position: Int): View {
val view = LayoutInflater.from(mContext).inflate(R.layout.item_room_act, container, false)
val ivCover = view.findViewById<ImageView>(R.id.iv_cover)
val bannerInfo = data[position]
val actId = bannerInfo.bannerId.toString()
ivCover.scaleType = ImageView.ScaleType.CENTER_CROP
if (bannerInfo.isFairy) {
ivCover.setImageResource(R.drawable.ic_fairy_entrance)
} else if (bannerInfo.isFirstCharge) {
ivCover.setImageResource(R.drawable.ic_first_charge_enter)
} else if (bannerInfo.isBox) {
GlideApp.with(BasicConfig.INSTANCE.appContext)
.load(GoldBoxHelper.getBoxIcon())
.error(R.drawable.icon_room_treasure_box)
.into(ivCover)
} else if (bannerInfo.isRadish) {
ivCover.setImageResource(R.drawable.ic_radish_entrance)
} else {
ImageLoadUtils.loadImage(
mContext,
bannerInfo.bannerPic,
ivCover,
R.drawable.default_cover
)
}
ivCover.setOnClickListener { v: View? ->
if (bannerInfo.isFairy) {
HomeFairyActivity.start(mContext)
} else if (bannerInfo.isFirstCharge) {
FirstChargeDialog.start(mContext)
} else if (bannerInfo.isBox) {
GoldBoxHelper.handleBoxClick(mContext)
} else if (bannerInfo.isRadish) {
PullRadishActivity.start(mContext)
} else {
AvRoomModel.get().activityClickLog("2", actId).subscribe()
if (bannerInfo.skipType == 3) {
val list = data.filterList {
skipType == 3
}
val newPosition = list.indexOfFirst {
it == bannerInfo
}
RoomBannerWebDialogActivity.start(mContext, newPosition, list)
} else {
CommonJumpHelper.bannerJump(mContext, bannerInfo)
}
}
}
return view
}
override fun getCount(): Int {
return data.size
}
}

View File

@@ -1,111 +0,0 @@
package com.yizhuan.habu.ui.login
import android.content.Context
import android.content.Intent
import android.text.Editable
import android.text.TextWatcher
import android.view.KeyEvent
import android.view.MotionEvent
import android.view.View
import android.widget.EditText
import com.netease.nim.uikit.StatusBarUtil
import com.trello.rxlifecycle3.android.ActivityEvent
import com.yizhuan.habu.R
import com.yizhuan.habu.base.BaseViewBindingActivity
import com.yizhuan.habu.databinding.ActivityLoginBoundAuthCodeBinding
import com.yizhuan.xchat_android_core.auth.AuthModel
import com.yizhuan.xchat_android_core.user.event.NeedCompleteInfoEvent
import com.yizhuan.xchat_android_core.utils.TextUtils
import com.yizhuan.xchat_android_core.utils.net.BeanObserver
import org.greenrobot.eventbus.EventBus
/**
* 绑定授权码
*/
class LoginBoundAuthCodeActivity : BaseViewBindingActivity<ActivityLoginBoundAuthCodeBinding>(),
View.OnClickListener {
companion object {
@JvmStatic
fun start(context: Context) {
val starter = Intent(context, LoginBoundAuthCodeActivity::class.java)
context.startActivity(starter)
}
}
override fun init() {
binding.btnNext.setOnClickListener(this)
binding.etAccount.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
override fun afterTextChanged(s: Editable?) {
val enabled = binding.etAccount.text.toString().trim { it <= ' ' }.isNotEmpty()
binding.btnNext.isEnabled = enabled
}
})
}
override fun onClick(view: View?) {
when (view?.id) {
R.id.btnNext -> {
if (TextUtils.isEmptyText(binding.etAccount.text.toString())) {
toast(getString(R.string.bound_auth_code_is_empty))
return
}
AuthModel.get()
.boundAuthCode(binding.etAccount.text.toString())
.compose(bindUntilEvent(ActivityEvent.DESTROY))
.subscribe(object : BeanObserver<String?>() {
override fun onErrorMsg(error: String) {
toast(error)
}
override fun onSuccess(s: String) {
//首次注册需要完善昵称和头像
EventBus.getDefault().post(NeedCompleteInfoEvent())
finish()
}
})
}
}
}
override fun onTouchEvent(event: MotionEvent): Boolean {
val view = currentFocus
var isPressEdit = false
if (view is EditText) {
if (event.rawX >= view.getX() && event.rawX <= view.getX() + view.getWidth() && event.rawY >= view.getY() && event.rawY <= view.getY() + view.getHeight()) {
isPressEdit = true
}
}
if (!isPressEdit) {
hideIME()
}
return super.onTouchEvent(event)
}
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true)
return true
}
return super.onKeyDown(keyCode, event)
}
override fun needSteepStateBar() = true
override fun setStatusBar() {
super.setStatusBar()
StatusBarUtil.transparencyBar(this)
StatusBarUtil.StatusBarLightMode(this)
}
}

View File

@@ -37,13 +37,13 @@ import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import java.io.File
import kotlin.random.Random
/**
* 设置页
* Created by wushaocheng on 2023/2/1.
*/
class SettingActivity : BaseViewBindingActivity<ActivitySettingBinding>(), View.OnClickListener,ILog {
class SettingActivity : BaseViewBindingActivity<ActivitySettingBinding>(), View.OnClickListener,
ILog {
override fun init() {
EventBus.getDefault().register(this)
initWhiteTitleBar(ResUtil.getString(R.string.ui_setting_settingactivity_01))
@@ -219,6 +219,10 @@ class SettingActivity : BaseViewBindingActivity<ActivitySettingBinding>(), View.
private fun debug() {
// RedPackageOpenDialog2().show(this)
// val json = "{\"first\":3,\"second\":32,\"data\":{\"recvUserUid\":2735,\"recvUserAvatar\":\"https://img.pekolive.com/default_avatar.png\",\"recvUserNick\":\"66丢丢丢丢丢多多多的hhhh\",\"sendUserNick\":\"11的ass\",\"sendUserAvatar\":\"http://beta.img.pekolive.com/Fk7aur-1RBqKXC-qqBwMTjivZ3lV?imageslim\",\"sendUserUid\":2737,\"giftUrl\":\"http://beta.img.pekolive.com/Fn6h_gPFD5MwA-Ql_kcWqNpKp0JM?imageslim\",\"giftName\":\"幽靈糖果\",\"giftId\":2075,\"giftNum\":${Random.nextInt(1,1000)},\"giftGolds\":33440,\"notifyStaySecond\":5,\"isHomeShow\":true,\"isSkipRoom\":true,\"isFullScreen\":false,\"isSendMsg\":false,\"roomUid\":2737,\"roomErbanNo\":11,\"roomTitle\":\"11的工会\",\"levelNum\":${Random.nextInt(1,4)}}}"
// onReceivedNimBroadcastMessage(json)
// CommonWebViewActivity.start(this,"http://192.168.0.19:5500/#/Rank")
// val json =
// "{\"first\":85,\"second\":855,\"data\":{\"nick\":\"66丢丢丢丢丢多多多的hhhh\",\"preVipName\":\"子爵\",\"floatPic\":\"https://image.hfighting.com/Fq3JtbK2acO3FN-3vWZo8ldtHfse\",\"uid\":2735,\"currVipName\":\"侯爵\",\"erbanNo\":66,\"roomUid\":2734,\"avatar\":\"https://img.pekolive.com/default_avatar.png\",\"currVipLevel\":5}}"
// onReceivedNimBroadcastMessage(json)
}
}

View File

@@ -9,11 +9,11 @@ import android.content.ClipboardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.view.View;
import android.webkit.SslErrorHandler;
@@ -59,7 +59,6 @@ import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Map;
@@ -99,32 +98,6 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O
private static final String POSITION = "position";
private int mPosition;
private int mProgress;
private Handler mHandler = new Handler();
private ProgressRunnable mProgressRunnable = new ProgressRunnable(this);
private static class ProgressRunnable implements Runnable {
private WeakReference<CommonWebViewActivity> mWeakReference;
ProgressRunnable(CommonWebViewActivity activity) {
mWeakReference = new WeakReference<>(activity);
}
@Override
public void run() {
CommonWebViewActivity activity = mWeakReference.get();
if (activity == null) return;
if (activity.mProgress < 96) {
activity.mProgress += 3;
activity.mProgressBar.setProgress(activity.mProgress);
activity.mHandler.postDelayed(activity.mProgressRunnable, 10);
}
}
}
public static void start(Context context, String url) {
Intent intent = new Intent(context, CommonWebViewActivity.class);
intent.putExtra("url", url);
@@ -222,7 +195,6 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O
@SuppressLint("SetJavaScriptEnabled")
private void initData() {
mHandler.post(mProgressRunnable);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setLoadWithOverviewMode(true);
@@ -290,9 +262,20 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O
mProgressBar.setVisibility(View.GONE);
super.onPageFinished(view, url);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
mProgressBar.setVisibility(View.VISIBLE);
}
});
//获取webviewtitle作为titlebar的title
wvcc = new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
mProgressBar.setProgress(newProgress);
}
@Override
public void onReceivedTitle(WebView view, String title) {
@@ -520,11 +503,6 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O
@Override
protected void onDestroy() {
if (mHandler != null) {
mHandler.removeCallbacks(mProgressRunnable);
mProgressRunnable = null;
mHandler = null;
}
EventBus.getDefault().unregister(this);
if (webViewCallBack != null) {

View File

@@ -3,8 +3,8 @@ package com.yizhuan.habu.ui.webview;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
@@ -28,8 +28,18 @@ public class DialogWebViewActivity extends CommonWebViewActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, ScreenUtil.screenHeight / 3 * 2);
getWindow().setGravity(Gravity.BOTTOM);
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
);
getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
View topView = findViewById(R.id.v_top);
topView.setOnClickListener(v -> finish());
ViewGroup.LayoutParams params = topView.getLayoutParams();
params.height = ScreenUtil.screenHeight / 3;
topView.setLayoutParams(params);
showTitleBar = getIntent().getBooleanExtra("showTitleBar", true);
if (!showTitleBar) {
layoutTitleBar.setVisibility(View.GONE);

View File

@@ -0,0 +1,47 @@
package com.yizhuan.habu.ui.webview.room_banner
import android.view.View
import android.widget.ImageView
import androidx.core.view.isInvisible
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.yizhuan.habu.R
import com.yizhuan.habu.ui.utils.load
import com.yizhuan.xchat_android_core.home.bean.BannerInfo
/**
* Created by Max on 2023/11/17 12:30
* Desc:
**/
class RoomBannerTabAdapter :
BaseQuickAdapter<BannerInfo, BaseViewHolder>(R.layout.room_banner_item_tab) {
private var selectedPosition = -1
override fun convert(helper: BaseViewHolder, item: BannerInfo?) {
helper.getView<ImageView>(R.id.iv_content).load(item?.bannerUrl)
convertState(helper, item)
}
override fun convertPayloads(
helper: BaseViewHolder,
item: BannerInfo?,
payloads: MutableList<Any>
) {
super.convertPayloads(helper, item, payloads)
convertState(helper, item)
}
private fun convertState(helper: BaseViewHolder, item: BannerInfo?) {
helper.getView<View>(R.id.v_selector).isInvisible =
helper.absoluteAdapterPosition != selectedPosition
}
fun getSelectedPosition(): Int {
return selectedPosition
}
fun select(position: Int) {
this.selectedPosition = position
notifyItemRangeChanged(0, itemCount, true)
}
}

View File

@@ -0,0 +1,91 @@
package com.yizhuan.habu.ui.webview.room_banner
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import androidx.recyclerview.widget.RecyclerView
import com.chuhai.utils.UiUtils
import com.yizhuan.habu.R
import com.yizhuan.habu.ui.webview.CommonWebViewActivity
import com.yizhuan.xchat_android_core.home.bean.BannerInfo
/**
* Created by Max on 2023/11/17 11:38
* Desc:房间内-Banner-WEB展示页面
**/
class RoomBannerWebDialogActivity : CommonWebViewActivity() {
private var recyclerView: RecyclerView? = null
private var adapter: RoomBannerTabAdapter? = null
companion object {
@JvmStatic
fun start(context: Context, position: Int, list: List<BannerInfo>) {
val newList = ArrayList<BannerInfo>()
newList.addAll(list)
val intent = Intent(context, RoomBannerWebDialogActivity::class.java)
intent.putExtra("position", position)
intent.putExtra("list", newList)
context.startActivity(intent)
}
}
override fun getLayoutId(): Int {
return R.layout.room_banner_dialog
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_FULLSCREEN
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
window.setLayout(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT
)
val topView = findViewById<View>(R.id.v_top)
topView.setOnClickListener { v: View? -> finish() }
val params = topView.layoutParams
params.height = UiUtils.dip2px(168f)
topView.layoutParams = params
webView.setBackgroundColor(Color.parseColor("#C9CBD1"))
recyclerView = findViewById(R.id.recyclerView)
val position = 0.coerceAtLeast(intent.getIntExtra("position", 0))
val list = intent.getSerializableExtra("list") as? ArrayList<BannerInfo>
// if ((list?.size ?: 0) <= 1) {
// recyclerView?.isVisible = false
// }
adapter = RoomBannerTabAdapter().apply {
setOnItemClickListener { adapter, view, position ->
if (this@RoomBannerWebDialogActivity.adapter?.getSelectedPosition() == position) {
return@setOnItemClickListener
}
switchTab(position)
}
}
recyclerView?.adapter = adapter
adapter?.setNewData(list)
switchTab(position)
}
private fun switchTab(position: Int) {
val url = adapter?.getItem(position)?.skipUri
showWebView(url)
adapter?.select(position)
recyclerView?.post {
recyclerView?.scrollToPosition(position)
}
}
override fun showWebView(url: String?) {
if (url.isNullOrEmpty()) {
return
}
super.showWebView(url)
}
}

View File

@@ -16,6 +16,7 @@ import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import com.chuhai.utils.ServiceTime;
import com.opensource.svgaplayer.SVGADrawable;
import com.opensource.svgaplayer.SVGADynamicEntity;
import com.opensource.svgaplayer.SVGAImageView;
@@ -41,6 +42,8 @@ public class AllServiceVipLevelUPDialog extends BaseDialog {
private final VipMessageInfo vipMessageInfo;
private DialogVipAllServiceLevelUpBinding binding;
private long startTime = 0;
private int frameCount = 0;
public AllServiceVipLevelUPDialog(Context context, @NonNull VipMessageInfo vipMessageInfo) {
super(context, R.style.FullScreenDialog);
@@ -77,7 +80,7 @@ public class AllServiceVipLevelUPDialog extends BaseDialog {
.append(ResUtil.getString(R.string.widget_dialog_allserviceviplevelupdialog_01), new ForegroundColorSpan(Color.WHITE))
.append("-", new CircleImageSpan(new ColorDrawable(Color.TRANSPARENT), vipMessageInfo.getAvatar(), 50, 50))
.append(" " + StringExtensionKt.sub(vipMessageInfo.getNick(), 6) + " ", new ForegroundColorSpan(getContext().getResources().getColor(R.color.notice_nick)))
.append(ResUtil.getString(R.string.widget_dialog_allserviceviplevelupdialog_02) + vipMessageInfo.getCurrVipName(), new ForegroundColorSpan(Color.WHITE)+"!");
.append(ResUtil.getString(R.string.widget_dialog_allserviceviplevelupdialog_02) + vipMessageInfo.getCurrVipName(), new ForegroundColorSpan(Color.WHITE) + "!");
SVGAImageView svgaImageView = new SVGAImageView(getContext());
svgaImageView.setLoops(1);
@@ -87,7 +90,19 @@ public class AllServiceVipLevelUPDialog extends BaseDialog {
svgaImageView.setCallback(new SimpleSvgaCallback() {
@Override
public void onFinished() {
long offset = ServiceTime.INSTANCE.getTime() - startTime;
if (offset < 6000) {
int centerFrame = frameCount / 2;
if (centerFrame > 0) {
// 目前的SVGA资源最后一帧是半透明的这里强制跳到中间帧最大程度避免这种情况
svgaImageView.stepToFrame(centerFrame, false);
}
svgaImageView.postDelayed(() -> {
closeSelf();
}, 6000 - offset);
} else {
closeSelf();
}
}
});
binding.flSvgaVipNotify.addView(svgaImageView);
@@ -95,6 +110,8 @@ public class AllServiceVipLevelUPDialog extends BaseDialog {
SVGAParser.Companion.shareParser().decodeFromURL(new URL(vipMessageInfo.getFloatPic()), new SVGAParser.ParseCompletion() {
@Override
public void onComplete(@NonNull SVGAVideoEntity svgaVideoEntity) {
frameCount = svgaVideoEntity.getFrames();
startTime = ServiceTime.INSTANCE.getTime();
SVGADynamicEntity dynamicEntity = new SVGADynamicEntity();
TextPaint textPaint = new TextPaint();
textPaint.setColor(Color.WHITE);//字体颜色

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@android:id/background"
android:drawable="@color/transparent" />
<item android:id="@android:id/progress">
<scale android:scaleWidth="100%">
<shape>
<corners android:radius="2dp" />
<solid android:color="@color/white" />
</shape>
</scale>
</item>
</layer-list>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#9168fa" />
<corners android:radius="4dp" />
</shape>

View File

@@ -1,9 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<View
android:id="@+id/v_top"
android:layout_width="match_parent"
android:layout_height="0dp" />
<androidx.cardview.widget.CardView
android:id="@+id/layout_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
@@ -92,4 +103,5 @@
</WebView>
</LinearLayout>
</androidx.cardview.widget.CardView>
</androidx.cardview.widget.CardView>
</LinearLayout>

View File

@@ -1,90 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:background="@color/color_white"
android:layout_width="match_parent"
android:layout_height="match_parent">
<View
android:id="@+id/view_bg_top"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@drawable/bg_login_new"
app:layout_constraintDimensionRatio="750:666"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_slogan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_24"
android:layout_marginBottom="@dimen/dp_24"
android:fontFamily="sans-serif-medium"
android:text="@string/text_login_auth_code"
android:textColor="@color/text_title_color"
android:textSize="28sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toTopOf="@+id/view_bg_bottom"/>
<LinearLayout
android:id="@+id/view_bg_bottom"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@drawable/shape_white_top_25dp"
android:gravity="center_horizontal"
android:orientation="vertical"
android:layout_marginTop="-120dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/view_bg_top"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<LinearLayout
android:layout_marginTop="68dp"
android:layout_marginStart="34dp"
android:layout_marginEnd="34dp"
android:gravity="center_vertical"
android:background="@drawable/shape_login_btn_bg"
android:layout_width="match_parent"
android:layout_height="52dp">
<EditText
android:id="@+id/etAccount"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@null"
android:gravity="center_vertical"
android:paddingStart="@dimen/dp_24"
android:paddingEnd="@dimen/dp_10"
android:inputType="text"
android:hint="@string/Please_enter_the_authorization_code"
android:textColorHint="@color/color_B3B3C3"
android:singleLine="true"
android:textColor="@color/text_title_color"
android:textSize="@dimen/dp_14"
tools:ignore="SpUsage" />
</LinearLayout>
<Button
android:id="@+id/btnNext"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginStart="@dimen/dp_36"
android:layout_marginTop="48dp"
android:layout_marginEnd="@dimen/dp_36"
android:background="@drawable/bg_common_enabled"
android:enabled="false"
android:gravity="center"
android:text="@string/finish"
android:textColor="@color/white"
android:textSize="@dimen/sp_16"
android:textStyle="bold" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -7,8 +7,8 @@
android:orientation="horizontal">
<TextView
android:id="@+id/btn_cancel"
android:layout_width="110dp"
android:layout_height="@dimen/dp_38"
android:layout_width="105dp"
android:layout_height="35dp"
android:gravity="center"
android:text="@string/cancel"
android:textColor="@color/color_B3B3C3"

View File

@@ -0,0 +1,118 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<View
android:id="@+id/v_top"
android:layout_width="match_parent"
android:layout_height="0dp" />
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cardBackgroundColor="@color/color_262629"
app:cardCornerRadius="8dp"
app:cardElevation="0dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/layout_title_bar"
android:layout_width="0dp"
android:layout_height="0dp"
android:visibility="gone">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_back"
android:layout_width="45dp"
android:layout_height="45dp"
android:scaleType="center"
android:src="@drawable/arrow_left" />
<ImageView
android:id="@+id/iv_close"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_gravity="center_vertical|start"
android:scaleType="center"
android:src="@drawable/ic_close_black" />
</LinearLayout>
<TextView
android:id="@+id/tv_title"
android:layout_width="200dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:textColor="@color/text_title_color"
android:textSize="18sp" />
<ImageView
android:id="@+id/img_share"
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="15dp"
android:src="@drawable/ic_share_white"
android:visibility="gone" />
<TextView
android:id="@+id/tv_title_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="15dp"
android:textColor="@color/text_normal_c6c6e9"
android:textSize="14sp"
android:visibility="gone"
tools:text="@string/layout_activity_dialog_web_view_01" />
</FrameLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_60"
android:orientation="horizontal"
android:paddingHorizontal="8dp"
android:paddingTop="@dimen/dp_2"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cardCornerRadius="8dp"
app:cardElevation="0dp">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ProgressBar
android:id="@+id/progress_bar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="4dp"
android:max="100"
android:progress="0"
android:progressDrawable="@drawable/progress_drawable_room_banner" />
</androidx.cardview.widget.CardView>
</LinearLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginEnd="5dp">
<View
android:id="@+id/v_selector"
android:layout_width="@dimen/dp_93"
android:layout_height="@dimen/dp_45"
android:layout_gravity="center"
android:background="@drawable/shape_9168fa_4" />
<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/iv_content"
android:layout_width="@dimen/dp_90"
android:layout_height="@dimen/dp_42"
android:layout_gravity="center"
android:scaleType="centerCrop"
app:riv_corner_radius="4dp"
tools:src="@drawable/default_cover" />
</FrameLayout>

View File

@@ -711,5 +711,6 @@
<color name="color_FFF87A">#FFFFF87A</color>
<color name="color_ffffff_30">#4CFFFFFF</color>
<color name="color_FFE468">#FFFFE468</color>
<color name="color_C9CBD1">#C9CBD1</color>
</resources>

View File

@@ -3,6 +3,7 @@ package com.yizhuan.habu.module_hall.hall.fragment
import android.content.Context
import android.os.Bundle
import android.text.Editable
import android.text.SpannableString
import android.text.TextUtils
import android.text.TextWatcher
import android.view.KeyEvent
@@ -16,6 +17,7 @@ import com.chad.library.adapter.base.BaseQuickAdapter
import com.yizhuan.habu.R
import com.yizhuan.habu.base.BaseViewBindingFragment
import com.yizhuan.habu.common.EmptyViewHelper
import com.yizhuan.habu.common.widget.dialog.DialogManager
import com.yizhuan.habu.databinding.FragmentAssociationRoomBinding
import com.yizhuan.habu.module_hall.hall.activity.ModuleHallActivity
import com.yizhuan.habu.module_hall.hall.adapter.AssociationRoomAdapter
@@ -39,8 +41,8 @@ class AssociationRoomFragment : BaseViewBindingFragment<FragmentAssociationRoomB
}
}
private var associationRoomAdapter: AssociationRoomAdapter ?= null
private var rvDelegate: RVDelegate<HallListInfo> ?= null
private var associationRoomAdapter: AssociationRoomAdapter? = null
private var rvDelegate: RVDelegate<HallListInfo>? = null
private var list: MutableList<HallListInfo> = ArrayList()
@@ -51,7 +53,7 @@ class AssociationRoomFragment : BaseViewBindingFragment<FragmentAssociationRoomB
if (!TextUtils.isEmpty(binding.etSearch.text.toString())) {
val hallList = list
val list = hallList.filter {
it.hallName.contains(binding.etSearch.text.toString()) || it.hallId.toString()
it.hallName.contains(binding.etSearch.text.toString()) || it.ownerErbanNo.toString()
.contains(binding.etSearch.text.toString())
}
if (list.isEmpty()) {
@@ -124,25 +126,19 @@ class AssociationRoomFragment : BaseViewBindingFragment<FragmentAssociationRoomB
}
if (it.hallBtnStatus == 3) {
NimP2PMessageActivity.startRecord(
mContext, bean.hallMessageUid.toString(),
bean.hallRecordId.toString()
mContext, it.hallMessageUid.toString(),
it.hallRecordId.toString()
)
return@let
}
dialogManager.showProgressDialog(context)
HallModel.get().applyJoinHall(it.hallId)
.compose(RxHelper.bindFragment(this))
.subscribe(object : BeanObserver<String?>() {
override fun onErrorMsg(error: String) {
dialogManager.dismissDialog()
toast(error)
}
override fun onSuccess(s: String) {
dialogManager.dismissDialog()
it.hallBtnStatus = 2
associationRoomAdapter?.notifyItemChanged(position)
toast(getString(R.string.apply_success_wait_to_join_room))
dialogManager.showOkCancelWithTitleDialog(ResUtil.getString(R.string.join_organization_tips),
it.hallName ?: "",
ResUtil.getString(R.string.join_organization_ok),
ResUtil.getString(R.string.join_organization_no),
object : DialogManager.OkCancelDialogListener {
override fun onCancel() {}
override fun onOk() {
applyJoin(it, position)
}
})
}
@@ -167,6 +163,25 @@ class AssociationRoomFragment : BaseViewBindingFragment<FragmentAssociationRoomB
associationViewModel.getHallList()
}
private fun applyJoin(item: HallListInfo, position: Int) {
dialogManager.showProgressDialog(context)
HallModel.get().applyJoinHall(item.hallId)
.compose(RxHelper.bindFragment(this))
.subscribe(object : BeanObserver<String?>() {
override fun onErrorMsg(error: String) {
dialogManager.dismissDialog()
toast(error)
}
override fun onSuccess(s: String) {
dialogManager.dismissDialog()
item.hallBtnStatus = 2
associationRoomAdapter?.notifyItemChanged(position)
toast(getString(R.string.apply_success_wait_to_join_room))
}
})
}
private fun hideSoftInput() {
val imm = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(

View File

@@ -27,4 +27,7 @@
<string name="lu_hteam_has_mute_num">已禁言人數 : %d人</string>
<string name="lu_hteam_manager_num">群管理人數 : %d人</string>
<string name="join_organization_tips">確認加入公會</string>
<string name="join_organization_ok"></string>
<string name="join_organization_no"></string>
</resources>

View File

@@ -7,4 +7,5 @@
<color name="color_FF9C7E">#FF9C7E</color>
<color name="color_FE6974">#FE6974</color>
<color name="color_45C21A">#45C21A</color>
<color name="color_262629">#262629</color>
</resources>

View File

@@ -103,12 +103,9 @@ public class GoldBoxHelper {
}
public static boolean isShowFairy() {
return false;
// UserInfo userInfo = UserModel.get().getCacheLoginUserInfo();
// FairyOpenInfo fairyOpenInfo = InitialModel.get().getFairyOpenInfo();
// if (fairyOpenInfo == null || userInfo == null) return false;
//
// return fairyOpenInfo.isOpen() && userInfo.getUserLevelVo().getExperLevelSeq() >= fairyOpenInfo.getLevelLimit();
FairyOpenInfo fairyOpenInfo = InitialModel.get().getFairyOpenInfo();
if (fairyOpenInfo == null) return false;
return fairyOpenInfo.isOpen();
}
}

View File

@@ -61,6 +61,7 @@ public class BannerInfo implements Parcelable, Serializable {
private boolean isRadish;
private boolean isFairy;
private String bannerUrl;
public BannerInfo(){
}
@@ -71,6 +72,7 @@ public class BannerInfo implements Parcelable, Serializable {
bannerPic = in.readString();
skipType = in.readInt();
skipUri = in.readString();
bannerUrl = in.readString();
}
@Override
@@ -80,6 +82,7 @@ public class BannerInfo implements Parcelable, Serializable {
dest.writeString(bannerPic);
dest.writeInt(skipType);
dest.writeString(skipUri);
dest.writeString(bannerUrl);
}
@Override

View File

@@ -219,20 +219,9 @@ public class AuthModel extends BaseModel implements IAuthModel {
if (currentAccountInfo == null || TextUtils.isEmpty(currentAccountInfo.getAccess_token())) {
return Single.error(new Throwable(""));//没有账号信息
}
return requestTicket().flatMap(ticketResult -> {
if (!ticketResult.isSuccess()) {
return Single.error(new Throwable(ticketResult.getMessage()));
}
ticketInfo = ticketResult.getData();
DemoCache.saveTicketInfo(ticketInfo);
return Single.just(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_01));
})
return imLogin(currentAccountInfo)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap((Function<String, SingleSource<String>>) s -> {
Log.i("IMLogin", "apply");
return imLogin(currentAccountInfo);
})
.doOnSuccess(s -> {
EventBus.getDefault().post(new LoginEvent());
});
@@ -781,7 +770,7 @@ public class AuthModel extends BaseModel implements IAuthModel {
});
}
private void cleanLogInfo() {
public void cleanLogInfo() {
reset();//这里先重置状态后调用IM登出因为这里观察了IM的在线状态
NIMClient.getService(AuthService.class).logout();
EventBus.getDefault().post(new LogoutEvent());

View File

@@ -78,4 +78,5 @@ public interface IInitialModel extends IModel {
@Nullable
FairyOpenInfo getFairyOpenInfo();
void regionCheck();
}

View File

@@ -1,5 +1,6 @@
package com.yizhuan.xchat_android_core.initial;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -14,6 +15,8 @@ import androidx.lifecycle.MutableLiveData;
import com.bumptech.glide.request.FutureTarget;
import com.bumptech.glide.request.target.Target;
import com.chuhai.utils.LanguageUtils;
import com.chuhai.utils.TelephonyUtils;
import com.netease.nim.uikit.support.glide.GlideApp;
import com.yizhuan.xchat_android_core.R;
import com.yizhuan.xchat_android_core.DemoCache;
@@ -49,11 +52,14 @@ import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.Single;
import io.reactivex.SingleOnSubscribe;
import io.reactivex.SingleSource;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Action;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
@@ -131,6 +137,8 @@ public class InitialModel extends BaseModel implements IInitialModel {
@Nullable
private InitInfo cacheInitInfo;
private Disposable regionCheckTimer;
private InitialModel() {
api = RxNet.create(Api.class);
loadMainTabInfoList();
@@ -514,6 +522,31 @@ public class InitialModel extends BaseModel implements IInitialModel {
.observeOn(AndroidSchedulers.mainThread());
}
/**
* 地区检测
*/
@Override
public void regionCheck() {
String operatorCode;
if (TelephonyUtils.INSTANCE.isChinaOperator()) {
operatorCode = "460";
} else {
operatorCode = TelephonyUtils.INSTANCE.getOperatorFirstSim();
}
api.regionCheck(LanguageUtils.INSTANCE.getSystemLanguage().toLanguageTag(), operatorCode)
.compose(RxHelper.handleSchedulers())
.doOnSuccess(longServiceResult -> {
if (regionCheckTimer != null && !regionCheckTimer.isDisposed()) {
regionCheckTimer.dispose();
}
if (longServiceResult.isSuccess() && longServiceResult.getData() != null && longServiceResult.getData() > 0) {
regionCheckTimer = Observable.timer(Math.max(longServiceResult.getData(), 30 * 1000), TimeUnit.MILLISECONDS).subscribe(aLong -> {
regionCheck();
});
}
}).subscribe();
}
@Override
public int getTeenagerMode() {
@@ -591,5 +624,16 @@ public class InitialModel extends BaseModel implements IInitialModel {
@GET("act/seize-treasure/status")
Single<ServiceResult<FairyOpenInfo>> getFairyOpenInfo();
/**
* 地区检测
*
* @param lang 语言
* @param mcc 运营商码
* @return
*/
@POST("/ipRegion/check")
@FormUrlEncoded
Single<ServiceResult<Long>> regionCheck(@Field("lang") String lang, @Field("mcc") String mcc);
}
}

View File

@@ -5,6 +5,7 @@ import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.chuhai.utils.TelephonyUtils;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.utils.APIEncryptUtil;
import com.yizhuan.xchat_android_core.utils.OaidUtil;
@@ -34,6 +35,12 @@ public class ParamsInterceptor implements Interceptor {
private Map<String, String> mHttpParams;
// 运营商码
private String operatorCode;
// 运营商码的获取时间
private long operatorCodeTime;
public ParamsInterceptor(Map<String, String> params) {
this.mHttpParams = params;
}
@@ -97,10 +104,13 @@ public class ParamsInterceptor implements Interceptor {
// Log.e("ParamsInterceptor", " url: " + oldRequest.url()+ " params Map : " + paramsMap.toString());
long uid = 0;
String ticket = "";
String ticket;
uid = AuthModel.get().getCurrentUid();
ticket = AuthModel.get().getTicket();
if (ticket == null) {
ticket = "";
}
String timestamp = String.valueOf(System.currentTimeMillis());
paramsMap.put("pub_timestamp", timestamp);
@@ -124,7 +134,6 @@ public class ParamsInterceptor implements Interceptor {
// Log.e("ParamsInterceptor", " url: " + oldRequest.url()+ " final params Map : " + paramsMap.toString());
// Log.e("ParamsInterceptor", "timestamp:"+timestamp + " url: " + oldRequest.url()+ " sign : " + signStr);
Headers headers = oldRequest.headers().newBuilder()
.add("pub_ticket", ticket)
.add("pub_uid", uid == 0 ? "" : String.valueOf(uid))
@@ -137,6 +146,7 @@ public class ParamsInterceptor implements Interceptor {
}
builder.addQueryParameter("pub_timestamp", timestamp);
builder.addQueryParameter("pub_sign", signStr);
addHeaderWithOperator(builder);
Request newRequest = oldRequest.newBuilder()
.method(oldRequest.method(), oldRequest.body())
.headers(headers)
@@ -146,5 +156,19 @@ public class ParamsInterceptor implements Interceptor {
}
private void addHeaderWithOperator(HttpUrl.Builder builder) {
if ((System.currentTimeMillis() - operatorCodeTime) > (1000 * 60 * 10)) {
loadOperatorCode();
}
builder.addQueryParameter("mcc", operatorCode);
}
private void loadOperatorCode() {
if (TelephonyUtils.INSTANCE.isChinaOperator()) {
operatorCode = "460";
} else {
operatorCode = TelephonyUtils.INSTANCE.getOperatorFirstSim();
}
operatorCodeTime = System.currentTimeMillis();
}
}

View File

@@ -37,7 +37,6 @@ import com.yizhuan.xchat_android_core.user.event.CurrentUserInfoCompleteFailEven
import com.yizhuan.xchat_android_core.user.event.LoadLoginUserInfoEvent;
import com.yizhuan.xchat_android_core.user.event.LoginUserInfoUpdateEvent;
import com.yizhuan.xchat_android_core.user.event.NeedCompleteInfoEvent;
import com.yizhuan.xchat_android_core.user.event.NeedVerifyBoundAuthCodeEvent;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_library.net.rxnet.RxNet;
import com.yizhuan.xchat_android_library.utils.ListUtils;
@@ -153,11 +152,7 @@ public final class UserModel extends BaseModel implements IUserModel {
UserInfo userInfo = userResult.getData();
//用户信息不全的情况下,currentUserInfo并不会被保存,这里单独保存下预填写的邀请码...
preFillInviteCode = userInfo.getPrefillInviteCode();
boolean isBoundAuthPhone = DemoCache.readBoundAuthCode();
if (isBoundAuthPhone && (TextUtils.isEmpty(userInfo.getNick()) || TextUtils.isEmpty(userInfo.getAvatar()))) {
EventBus.getDefault().post(new NeedVerifyBoundAuthCodeEvent());
return Single.error(new Throwable("need verify bound auth code"));
} else if (TextUtils.isEmpty(userInfo.getNick()) || TextUtils.isEmpty(userInfo.getAvatar())) {
if (TextUtils.isEmpty(userInfo.getNick()) || TextUtils.isEmpty(userInfo.getAvatar())) {
//首次注册需要完善昵称和头像
EventBus.getDefault().post(new NeedCompleteInfoEvent());
return Single.error(new Throwable("need nick and avatar"));

View File

@@ -1,8 +0,0 @@
package com.yizhuan.xchat_android_core.user.event;
/**
* create by lvzebiao on 2018/8/31
*/
public class NeedVerifyBoundAuthCodeEvent {
}

View File

@@ -63,13 +63,14 @@ public final class RxNetManager {
if (RxNetLog.DEBUG) {
//正式环境千万不要加这玩意,为了方便日志查看,拦截器里面加了synchronized关键字,接口请求是串行的
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
RxNetLog.d("OKHttp-------%s", message);
}
});
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
// HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
// @Override
// public void log(String message) {
// RxNetLog.d("OKHttp-------%s", message);
// }
// });
okhttp3.logging.HttpLoggingInterceptor loggingInterceptor = new okhttp3.logging.HttpLoggingInterceptor();
loggingInterceptor.setLevel(okhttp3.logging.HttpLoggingInterceptor.Level.BODY);
mBuilder.addInterceptor(loggingInterceptor);
mBuilder.addNetworkInterceptor(new StethoInterceptor());

View File

@@ -0,0 +1,19 @@
package com.chuhai.utils
import android.os.Build
import android.os.LocaleList
import java.util.Locale
/**
* Created by Max on 2023/11/17 16:12
* Desc:
**/
object LanguageUtils {
fun getSystemLanguage(): Locale {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
LocaleList.getDefault()[0]
} else {
Locale.getDefault()
}
}
}

View File

@@ -0,0 +1,133 @@
package com.chuhai.utils
import android.content.Context
import android.telephony.TelephonyManager
import com.chuhai.utils.log.ILog
/**
* Created by Max on 2023/11/14 10:17
* Desc:TelephonyManager 相关工具
**/
object TelephonyUtils : ILog {
/**
* 是否为中国运营商任意卡属于中国就为true
*/
fun isChinaOperator(): Boolean {
val tm =
AppUtils.getApp().getSystemService(Context.TELEPHONY_SERVICE) as? TelephonyManager
?: return false
if (tm.simState == TelephonyManager.SIM_STATE_READY) {
if (!tm.simOperator.isNullOrEmpty() && tm.simOperator.startsWith("460")) {
return true
}
if (isChainOperator(tm.simOperatorName)) {
return true
}
}
if (!tm.networkOperator.isNullOrEmpty() && tm.networkOperator.startsWith("460")) {
return true
}
if (isChainOperator(tm.networkOperatorName)) {
return true
}
return false
}
/**
* 获取运营商优先SIM
*/
fun getOperatorFirstSim(): String? {
val operator = getSimOperator()
return if (operator.isNullOrEmpty()) {
getNetWorkOperator()
} else {
operator
}
}
/**
* 获取SIM运营商名称
*/
fun getSimOperator(): String? {
val tm =
AppUtils.getApp().getSystemService(Context.TELEPHONY_SERVICE) as? TelephonyManager
?: return null
if (tm.simState != TelephonyManager.SIM_STATE_READY) {
logD("SIM状态不对${tm.simState}")
return null
}
val simOperator = tm.simOperator
logD("getSimOperator()获取的MCC+MNC为$simOperator")
logD("getOperatorName()方法获取的运营商名称为:${tm.simOperatorName} ")
logD("通过getSimOperator()人为判断的运营商名称是: ${getOperatorName(simOperator)}")
return simOperator
}
/**
* 获取网络运营商
*/
fun getNetWorkOperator(): String? {
val tm = AppUtils.getApp().getSystemService(Context.TELEPHONY_SERVICE) as? TelephonyManager
?: return null
//用于判断拨号那张卡的运营商
val networkOperator = tm.networkOperator
logD("getNetWorkOperator() 获取的MCC+MNC为$networkOperator")
logD("getNetWorkOperator() phoneType${tm.phoneType}")
logD("getNetworkOperatorName()方法获取的网络类型名称是: ${tm.networkOperatorName}")
logD("通过getNetWorkOperator()人为判断的运营商名称是: ${getOperatorName(networkOperator)}")
return tm.networkOperator
}
/**
* 是否中国运营商
*/
private fun isChainOperator(operatorName: String?): Boolean {
if (operatorName == null) return false
if (operatorName == "CUCC"
|| operatorName == "CMCC"
|| operatorName == "CTCC"
|| operatorName == "CTT"
|| operatorName.contains("中国")
|| operatorName.contains("中國")
) {
return true
}
return false
}
/**
* 运营商类型
*/
private fun getOperatorName(simOperator: String?): String? {
if (simOperator == null) {
return null
}
return when (simOperator) {
"46001", "46006", "46009" -> {
// 联通
"CUCC"
}
"46000", "46002", "46004", "46007" -> {
// 移动
"CMCC"
}
"46003", "46005", "46011" -> {
// 电信
"CTCC"
}
"46020" -> {
// 铁通
"CTT"
}
else -> {
"OHTER"
}
}
}
}