首页底部Tab获取服务端配置

This commit is contained in:
huangjian
2022-01-17 15:50:30 +08:00
parent 6df8ada83d
commit bd9a8ab679
14 changed files with 349 additions and 270 deletions

View File

@@ -6,7 +6,6 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
@@ -112,7 +111,6 @@ import com.yizhuan.erban.ui.widget.MainTabLayout;
import com.yizhuan.erban.ui.widget.RecallDialog;
import com.yizhuan.erban.utils.CleanLeakUtils;
import com.yizhuan.erban.utils.PushMessageHandler;
import com.yizhuan.erban.utils.UserUtils;
import com.yizhuan.xchat_android_core.Constants;
import com.yizhuan.xchat_android_core.UriProvider;
import com.yizhuan.xchat_android_core.auth.AuthModel;
@@ -123,8 +121,8 @@ import com.yizhuan.xchat_android_core.channel_page.model.ChannelPageModel;
import com.yizhuan.xchat_android_core.community.attachment.DynamicSysAttachment;
import com.yizhuan.xchat_android_core.community.event.SquareTaskEvent;
import com.yizhuan.xchat_android_core.community.event.UnReadCountEvent;
import com.yizhuan.xchat_android_core.home.bean.MainTabType;
import com.yizhuan.xchat_android_core.home.event.VisitorUnreadCountEvent;
import com.yizhuan.xchat_android_core.user.bean.ProtocolInfo;
import com.yizhuan.xchat_android_core.community.im.WorldDynamicAttachment;
import com.yizhuan.xchat_android_core.home.model.GameHomeModel;
import com.yizhuan.xchat_android_core.home.model.HomeModel;
@@ -151,6 +149,7 @@ import com.yizhuan.xchat_android_core.im.custom.bean.RedPackageAttachment;
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.initial.InitialModel;
import com.yizhuan.xchat_android_core.level.event.CharmLevelUpEvent;
import com.yizhuan.xchat_android_core.level.event.LevelUpEvent;
import com.yizhuan.xchat_android_core.linked.LinkedModel;
@@ -160,8 +159,6 @@ import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.manager.IMBroadcastManager;
import com.yizhuan.xchat_android_core.manager.IMMessageManager;
import com.yizhuan.xchat_android_core.manager.RoomEvent;
import com.yizhuan.xchat_android_core.market_verify.MarketVerifyModel;
import com.yizhuan.xchat_android_core.market_verify.event.MarketVerifyUpdateEvent;
import com.yizhuan.xchat_android_core.miniworld.bean.OpenAudioPartyAttachment;
import com.yizhuan.xchat_android_core.patriarch.event.CloseMinRoomEvent;
import com.yizhuan.xchat_android_core.patriarch.event.ImPushMsgPmLimitTimeEvent;
@@ -170,7 +167,6 @@ import com.yizhuan.xchat_android_core.pay.bean.ShowCommonWebEvent;
import com.yizhuan.xchat_android_core.public_chat_hall.attachment.AitMeAttachment;
import com.yizhuan.xchat_android_core.recall.bean.CheckLostUserInfo;
import com.yizhuan.xchat_android_core.recall.event.CheckLostUserEvent;
import com.yizhuan.xchat_android_core.redPacket.bean.RedPacketInfoV2;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_core.statistic.StatisticManager;
import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol;
@@ -180,15 +176,12 @@ 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.utils.LogUtils;
import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils;
import com.yizhuan.xchat_android_core.utils.StringUtils;
import com.yizhuan.xchat_android_library.base.factory.CreatePresenter;
import com.yizhuan.xchat_android_library.threadmgr.ThreadPoolManager;
import com.yizhuan.xchat_android_library.utils.AppMetaDataUtil;
import com.yizhuan.xchat_android_library.utils.JavaUtil;
import com.yizhuan.xchat_android_library.utils.codec.DESUtils;
import com.yizhuan.xchat_android_library.utils.pref.CommonPref;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@@ -200,9 +193,6 @@ import java.util.ArrayList;
import java.util.List;
import io.flutter.embedding.android.FlutterFragment;
import io.reactivex.SingleObserver;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import static com.yizhuan.xchat_android_core.channel_page.model.ChannelPageModel.KEY_FLAG_VALID_CHANNEL_PAGE;
@@ -226,7 +216,7 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
private LivingIconView userLivingView;
private View viewClose;
private MainTabLayout mMainTabLayout;
private int mCurrentMainPosition = MainTabLayout.MAIN_TAB_POS_HOME;
private int mCurrentTabType = MainTabType.TAB_TYPE_HOME;
/**
* 房间最小化动画换成属性动画原先的补间动画影响了activity的生命周期
*/
@@ -268,11 +258,11 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
};
{
fragmentArray.put(MainTabLayout.MAIN_TAB_POS_HOME, new HomeFragment());
fragmentArray.put(MainTabLayout.MAIN_TAB_POS_MSG, new ContactsListFragment());
fragmentArray.put(MainTabLayout.MAIN_TAB_POS_SQUARE, new SquareFragment());
fragmentArray.put(MainTabLayout.MAIN_TAB_POS_ME, new MeFragment());
fragmentArray.put(MainTabLayout.MAIN_TAB_POS_GAME, new GameFragment
fragmentArray.put(MainTabType.TAB_TYPE_HOME, new HomeFragment());
fragmentArray.put(MainTabType.TAB_TYPE_MSG, new ContactsListFragment());
fragmentArray.put(MainTabType.TAB_TYPE_SQUARE, new SquareFragment());
fragmentArray.put(MainTabType.TAB_TYPE_ME, new MeFragment());
fragmentArray.put(MainTabType.TAB_TYPE_GAME, new GameFragment
.CachedEngineFragmentBuilder(GameFragment.class, FlutterBoost.ENGINE_ID)
.url(BuildConfig.DEBUG ? RouterConstants.FLUTTER_PAGE_MAIN_DEBUG : RouterConstants.FLUTTER_PAGE_MAIN)
.build());
@@ -295,14 +285,13 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(Constants.KEY_MAIN_POSITION, mCurrentMainPosition);
outState.putInt(Constants.KEY_MAIN_POSITION, mCurrentTabType);
}
@Override
protected void onRestoreInstanceState(@NotNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mCurrentMainPosition = savedInstanceState.getInt(Constants.KEY_MAIN_POSITION);
mCurrentTabType = savedInstanceState.getInt(Constants.KEY_MAIN_POSITION);
}
@Override
@@ -311,31 +300,14 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class);
NimMiddleActivity.firstEnter = false;
if (savedInstanceState != null) {
mCurrentMainPosition = savedInstanceState.getInt(Constants.KEY_MAIN_POSITION);
mCurrentTabType = savedInstanceState.getInt(Constants.KEY_MAIN_POSITION);
}
Log.e(TAG, "onCreate: " + DESUtils.DESAndBase64("112030"));
setContentView(R.layout.activity_main);
//自动登录
AuthModel.get().autoLogin().subscribe(new SingleObserver<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(String s) {
}
@Override
public void onError(Throwable e) {
onNeedLogin();
//toast(e.getMessage());
}
});
initTitleBar(getString(R.string.app_name));
AuthModel.get().autoLogin()
.doOnError(throwable -> onNeedLogin())
.subscribe();
initView();
//引导页
// startGuild();
initMaterialView();
onParseIntent();
updateDatas();
@@ -344,6 +316,9 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
initTeamSessionCustomization();
EventBus.getDefault().register(this);
otherModelInit();
InitialModel.get().getMainTabInfosLiveData().observe(this, mainTabInfos -> {
mMainTabLayout.setMainTabInfoList(mainTabInfos);
});
}
private void otherModelInit() {
@@ -497,11 +472,7 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
private void updateDatas() {
if ("baidutg".equals(AppMetaDataUtil.getChannelID())) {
mMainTabLayout.select(MainTabLayout.MAIN_TAB_POS_HOME);
} else {
mMainTabLayout.select(mCurrentMainPosition);
}
mMainTabLayout.setDefaultTabType(mCurrentTabType);
handleNimIntent();
}
@@ -535,11 +506,11 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
}
} else if (intent.hasExtra(GAME_TAB) && intent.getBooleanExtra(GAME_TAB, false)) {
if (mMainTabLayout != null) {
mMainTabLayout.select(MainTabLayout.MAIN_TAB_POS_GAME);
mMainTabLayout.setDefaultTabType(MainTabType.TAB_TYPE_GAME);
}
} else if (intent.hasExtra(MSG_TAB) && intent.getBooleanExtra(MSG_TAB, false)) {
if (mMainTabLayout != null) {
mMainTabLayout.select(MainTabLayout.MAIN_TAB_POS_MSG);
mMainTabLayout.setDefaultTabType(MainTabType.TAB_TYPE_MSG);
}
}
}
@@ -636,7 +607,7 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
Log.i("checkLostUser", "onLogin");
//登录成功查询未读信息数量
mMainTabLayout.setmUnReadDynamicCount(0);
mMainTabLayout.setUnReadDynamicCount(0);
int unreadCount = IMMessageManager.get().queryUnreadMsg();
mMainTabLayout.setMsgNum(unreadCount);
openCommunityNotice();
@@ -788,9 +759,9 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
@SuppressLint("RestrictedApi")
@Override
public void onTabClick(int position) {
public void onTabClick(int tabType) {
Fragment showFragment = fragmentArray.get(position);
Fragment showFragment = fragmentArray.get(tabType);
if (showFragment == tempFragment) return;
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
@@ -801,7 +772,7 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
if (tempFragment != null) transaction.hide(tempFragment);
tempFragment = showFragment;
if (!isDestroyed()) transaction.commitNowAllowingStateLoss();
mCurrentMainPosition = position;
mCurrentTabType = tabType;
}
@Override
@@ -815,14 +786,6 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
DaemonService.stop(MainActivity.this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMarketVerifyUpdateEvent(MarketVerifyUpdateEvent event) {
//审核包隐藏tab
if (MarketVerifyModel.get().isMarketChecking()) {
mMainTabLayout.showOrHideTab(MainTabLayout.MAIN_TAB_POS_SQUARE, View.GONE);
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onReceiveRecallStatus(CheckLostUserEvent event) {
@@ -840,7 +803,7 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
}
public boolean isShowMeTab() {
return mCurrentMainPosition == MainTabLayout.MAIN_TAB_POS_ME;
return mCurrentTabType == MainTabType.TAB_TYPE_ME;
}
/**
@@ -1020,7 +983,7 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
@Subscribe(threadMode = ThreadMode.MAIN)
public void onUnReadCount(UnReadCountEvent event) {
mMainTabLayout.setmUnReadDynamicCount(event.getTotal());
mMainTabLayout.setUnReadDynamicCount(event.getTotal());
}
@Subscribe(threadMode = ThreadMode.MAIN)
@@ -1064,7 +1027,7 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
}
boolean isNimPush = intent.getBooleanExtra(NimMiddleActivity.EXTRA_IS_NIM_PUSH, false);
if (isNimPush && mMainTabLayout != null) {
mMainTabLayout.select(MainTabLayout.MAIN_TAB_POS_MSG);
mMainTabLayout.setDefaultTabType(MainTabType.TAB_TYPE_MSG);
}
}

View File

@@ -4,9 +4,11 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.yizhuan.erban.base.BaseViewModel
import com.yizhuan.xchat_android_core.bean.response.ListResult
import com.yizhuan.xchat_android_core.home.bean.*
import com.yizhuan.xchat_android_core.home.bean.BannerInfo
import com.yizhuan.xchat_android_core.home.bean.HomeRoomInfo
import com.yizhuan.xchat_android_core.home.bean.HomeTagInfo
import com.yizhuan.xchat_android_core.home.bean.ResourceInfo
import com.yizhuan.xchat_android_core.home.model.HomeModel
import com.yizhuan.xchat_android_core.utils.net.ServerException
import com.yizhuan.xchat_android_core.utils.toast
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async

View File

@@ -2,34 +2,32 @@ package com.yizhuan.erban.ui.widget;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.netease.nim.uikit.common.ui.draggablebubbles.BubbleMessageTouchListener;
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import com.netease.nim.uikit.common.ui.draggablebubbles.BubbleView;
import com.netease.nim.uikit.common.ui.draggablebubbles.MessageBubbleView;
import com.netease.nim.uikit.support.glide.GlideApp;
import com.yizhuan.erban.R;
import com.yizhuan.xchat_android_core.home.bean.MainTabInfo;
import com.yizhuan.xchat_android_core.home.bean.MainTabType;
import com.yizhuan.xchat_android_core.utils.CheckUtils;
/**
* <p> main tab 有消息个数 控件 (todo:还可以优化,将字体写在字体上面)
* <p> main tab 有消息个数 控件
* </p>
* Created by Administrator on 2017/11/14.
*/
public class MainRedPointTab extends RelativeLayout {
private int mTabIcon, mTabIconSelect;
private MainTab mMainTab;
private TextView mTvNum;
private String mTabText;
private RedPointDismissListener mListener;
private final ImageView ivTabIcon;
private final TextView tvTabName;
private final TextView mTvNum;
private MainTabInfo tabInfo;
public MainRedPointTab(@NonNull Context context) {
this(context, null);
@@ -42,49 +40,37 @@ public class MainRedPointTab extends RelativeLayout {
public MainRedPointTab(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
inflate(context, R.layout.maint_tab_red_poin_layout, this);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MainTab);
mTabIcon = typedArray.getResourceId(R.styleable.MainTab_tab_icon, R.mipmap.ic_main_tab_game_home);
mTabIconSelect = typedArray.getResourceId(R.styleable.MainTab_tab_icon_select, R.mipmap.ic_main_tab_game_pressed);
mTabText = typedArray.getString(R.styleable.MainTab_tab_text);
boolean draggable = typedArray.getBoolean(R.styleable.MainTab_tab_draggable, false);
mMainTab = findViewById(R.id.main_tab_msg);
mMainTab.setmTabIcon(mTabIcon);
mMainTab.setmTabIconSelect(mTabIconSelect);
mMainTab.setText(mTabText);
ivTabIcon = findViewById(R.id.iv_tab_icon);
tvTabName = findViewById(R.id.tv_tab_name);
mTvNum = findViewById(R.id.msg_number);
if (draggable) {
MessageBubbleView.attach(mTvNum, false, new BubbleMessageTouchListener.BubbleDisappearListener() {
@Override
public void dragStart(View view) {
}
}
public void setMainTabInfo(@NonNull MainTabInfo tabInfo) {
this.tabInfo = tabInfo;
tvTabName.setText(tabInfo.getTabName());
}
@Override
public void dismiss(View view) {
if (mListener != null) {
mListener.dismiss();
}
}
@Override
public void dragFinish(View view) {
}
});
}
public MainTabInfo getTabInfo() {
return tabInfo;
}
public void select(boolean select) {
mMainTab.select(select);
if (tabInfo == null) return;
tvTabName.setSelected(select);
int defaultRes = getDefaultRes(tabInfo.getTabType(), select);
GlideApp.with(ivTabIcon).load(select ? tabInfo.getTabSelectedIcon() : tabInfo.getTabIcon())
.dontAnimate()
.placeholder(defaultRes)
.error(defaultRes)
.transform(new CenterCrop())
.into(ivTabIcon);
}
@SuppressLint("SetTextI18n")
public void setNumber(int number) {
if (mTvNum instanceof BubbleView) {
((BubbleView) mTvNum).setNumText(number);
}
else {
} else {
if (number > 99) {
mTvNum.setText("99+");
} else
@@ -94,12 +80,25 @@ public class MainRedPointTab extends RelativeLayout {
mTvNum.setVisibility((CheckUtils.isCheckUser() || number <= 0) ? GONE : VISIBLE);
}
public void setmListener(RedPointDismissListener mListener) {
this.mListener = mListener;
}
public interface RedPointDismissListener {
void dismiss();
private int getDefaultRes(int tabType, boolean select) {
int resId = select ? R.mipmap.ic_main_tab_game_pressed : R.mipmap.ic_main_tab_game_home;
switch (tabType) {
case MainTabType.TAB_TYPE_SQUARE:
resId = select ? R.mipmap.ic_main_tab_find_pressed : R.mipmap.ic_main_tab_find;
break;
case MainTabType.TAB_TYPE_GAME:
resId = select ? R.mipmap.ic_main_tab_peace_pressed : R.mipmap.ic_main_tab_peace;
break;
case MainTabType.TAB_TYPE_MSG:
resId = select ? R.mipmap.ic_main_tab_msg_pressed : R.mipmap.ic_main_tab_msg;
break;
case MainTabType.TAB_TYPE_ME:
resId = select ? R.mipmap.ic_main_tab_me_pressed : R.mipmap.ic_main_tab_me;
break;
default:
break;
}
return resId;
}
}

View File

@@ -5,48 +5,39 @@ import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.Size;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.msg.MsgService;
import com.yizhuan.erban.R;
import com.yizhuan.xchat_android_core.home.bean.MainTabInfo;
import com.yizhuan.xchat_android_core.home.bean.MainTabType;
import com.yizhuan.xchat_android_core.statistic.StatisticManager;
import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol;
import java.util.ArrayList;
import java.util.List;
/**
* <p> 底部tab导航 </p>
* Created by Administrator on 2017/11/14.
*/
public class MainTabLayout extends LinearLayout implements View.OnClickListener {
public static final int MAIN_TAB_POS_MSG = 1;
public static final int MAIN_TAB_POS_SQUARE = 2;
public static final int MAIN_TAB_POS_ME = 3;
public static final int MAIN_TAB_POS_HOME = 4;
public static final int MAIN_TAB_POS_GAME = 5;
private MainTab gameTab, homeTab;
private final List<MainRedPointTab> tabViewList = new ArrayList<>(5);
private MainRedPointTab homeTab;
private MainRedPointTab squareTab;
private MainRedPointTab gameTab;
private MainRedPointTab msgTab;
private MainRedPointTab meTab;
private MainRedPointTab mMsgTab;
private MainRedPointTab mAttentionTab;
private int mLastPosition = -1;
private OnTabClickListener mOnTabClickListener;
private List<MainTabInfo> mainTabInfoList;
private int defaultTabType;
// 切换账号需要重置;接收未读互动消息自定义消息、互动消息未读接口调用需要设置;
private int mUnReadDynamicCount = 0;
private MainRedPointTab.RedPointDismissListener msgListener = new MainRedPointTab.RedPointDismissListener() {
@Override
public void dismiss() {
NIMClient.getService(MsgService.class).clearAllUnreadCount();
}
};
private MainRedPointTab.RedPointDismissListener attentionListener = new MainRedPointTab.RedPointDismissListener() {
@Override
public void dismiss() {
// TODO 互动消息清空未读
}
};
private int msgNumber;
private int meNumber;
private int squareNumber;
public MainTabLayout(Context context) {
this(context, null);
@@ -65,8 +56,8 @@ public class MainTabLayout extends LinearLayout implements View.OnClickListener
setOrientation(HORIZONTAL);
inflate(context, R.layout.main_tab_layout, this);
mAttentionTab = findViewById(R.id.main_attention_tab);
mMsgTab = findViewById(R.id.main_msg_tab);
squareTab = findViewById(R.id.main_square_tab);
msgTab = findViewById(R.id.main_msg_tab);
gameTab = findViewById(R.id.main_game_tab);
homeTab = findViewById(R.id.main_home_tab);
meTab = findViewById(R.id.main_me_tab);
@@ -74,90 +65,122 @@ public class MainTabLayout extends LinearLayout implements View.OnClickListener
homeTab.setOnClickListener(this);
meTab.setOnClickListener(this);
gameTab.setOnClickListener(this);
mAttentionTab.setOnClickListener(this);
mMsgTab.setOnClickListener(this);
squareTab.setOnClickListener(this);
msgTab.setOnClickListener(this);
mAttentionTab.setmListener(attentionListener);
mMsgTab.setmListener(msgListener);
tabViewList.add(homeTab);
tabViewList.add(squareTab);
tabViewList.add(gameTab);
tabViewList.add(msgTab);
tabViewList.add(meTab);
}
public void setMainTabInfoList(@NonNull @Size(5) List<MainTabInfo> mainTabInfoList) {
this.mainTabInfoList = mainTabInfoList;
for (int i = 0; i < mainTabInfoList.size(); i++) {
MainTabInfo mainTabInfo = mainTabInfoList.get(i);
MainRedPointTab redPointTab = tabViewList.get(i);
redPointTab.setMainTabInfo(mainTabInfo);
switch (mainTabInfo.getTabType()) {
case MainTabType.TAB_TYPE_MSG:
redPointTab.setNumber(msgNumber);
break;
case MainTabType.TAB_TYPE_SQUARE:
redPointTab.setNumber(squareNumber);
break;
case MainTabType.TAB_TYPE_ME:
redPointTab.setNumber(meNumber);
break;
}
}
select(defaultTabType);
}
public void setDefaultTabType(int defaultTabType) {
this.defaultTabType = defaultTabType;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.main_home_tab:
select(MAIN_TAB_POS_HOME);
StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_HOME_FIRST_TAB,
"首页tab");
select(mainTabInfoList.get(0).getTabType());
StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_HOME_FIRST_TAB, "首页tab");
break;
case R.id.main_game_tab:
select(MAIN_TAB_POS_GAME);
break;
case R.id.main_attention_tab:
select(MAIN_TAB_POS_SQUARE);
case R.id.main_square_tab:
select(mainTabInfoList.get(1).getTabType());
StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_SQUARE_DONG_TAI_CLICK, "点击广场动态页");
break;
case R.id.main_game_tab:
select(mainTabInfoList.get(2).getTabType());
break;
case R.id.main_msg_tab:
select(MAIN_TAB_POS_MSG);
select(mainTabInfoList.get(3).getTabType());
StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_MESSAGE, "消息页");
break;
case R.id.main_me_tab:
select(MAIN_TAB_POS_ME);
StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_HOME_MINE_TAB,
"我的tab");
select(mainTabInfoList.get(4).getTabType());
StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_HOME_MINE_TAB, "我的tab");
break;
}
}
private void select(int tabType) {
if (tabType == 0) tabType = MainTabType.TAB_TYPE_HOME;
if (mLastPosition == tabType) return;
squareTab.select(tabType == MainTabType.TAB_TYPE_SQUARE);
msgTab.select(tabType == MainTabType.TAB_TYPE_MSG);
gameTab.select(tabType == MainTabType.TAB_TYPE_GAME);
homeTab.select(tabType == MainTabType.TAB_TYPE_HOME);
meTab.select(tabType == MainTabType.TAB_TYPE_ME);
if (mOnTabClickListener != null) {
mOnTabClickListener.onTabClick(tabType);
}
mLastPosition = tabType;
}
public void setMsgNum(int number) {
mMsgTab.setNumber(number);
msgNumber = number;
MainRedPointTab pointTab = findTabInfoByType(MainTabType.TAB_TYPE_MSG);
if (pointTab != null) {
pointTab.setNumber(number);
}
}
public void setUnreadVisitorCount(int count) {
if (meTab != null)
meTab.setNumber(count);
}
public void select(int position) {
if (mLastPosition == position) return;
mAttentionTab.select(position == MAIN_TAB_POS_SQUARE);
mMsgTab.select(position == MAIN_TAB_POS_MSG);
gameTab.select(position == MAIN_TAB_POS_GAME);
homeTab.select(position == MAIN_TAB_POS_HOME);
meTab.select(position == MAIN_TAB_POS_ME);
if (mOnTabClickListener != null) {
mOnTabClickListener.onTabClick(position);
meNumber = count;
MainRedPointTab pointTab = findTabInfoByType(MainTabType.TAB_TYPE_ME);
if (pointTab != null) {
pointTab.setNumber(count);
}
mLastPosition = position;
}
private OnTabClickListener mOnTabClickListener;
public void setUnReadDynamicCount(int mUnReadDynamicCount) {
squareNumber = mUnReadDynamicCount;
MainRedPointTab pointTab = findTabInfoByType(MainTabType.TAB_TYPE_SQUARE);
if (pointTab != null) {
pointTab.setNumber(mUnReadDynamicCount);
}
}
@Nullable
private MainRedPointTab findTabInfoByType(int tabType) {
if (mainTabInfoList == null) return null;
for (MainRedPointTab tabViewList : tabViewList) {
if (tabViewList.getTabInfo() != null && tabViewList.getTabInfo().getTabType() == tabType) {
return tabViewList;
}
}
return null;
}
public void setOnTabClickListener(OnTabClickListener onTabClickListener) {
mOnTabClickListener = onTabClickListener;
}
public void setmUnReadDynamicCount(int mUnReadDynamicCount) {
this.mUnReadDynamicCount = mUnReadDynamicCount;
mAttentionTab.setNumber(mUnReadDynamicCount);
}
public interface OnTabClickListener {
void onTabClick(int position);
}
/**
* 隐藏或显示某些tab
*/
public void showOrHideTab(int position, int visible) {
switch (position) {
case MAIN_TAB_POS_SQUARE:
mAttentionTab.setVisibility(visible);
break;
case MAIN_TAB_POS_MSG:
mMsgTab.setVisibility(visible);
break;
}
void onTabClick(int tabType);
}
}

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/color_333333" android:state_selected="true" />
<item android:color="@color/main_tab_normal" />
</selector>

View File

@@ -16,10 +16,11 @@
<com.yizhuan.erban.ui.widget.MainTabLayout
android:id="@+id/main_tab_layout"
android:layout_width="match_parent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="3dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<FrameLayout

View File

@@ -7,69 +7,39 @@
android:orientation="horizontal"
tools:parentTag="LinearLayout">
<com.yizhuan.erban.ui.widget.MainTab
<com.yizhuan.erban.ui.widget.MainRedPointTab
android:id="@+id/main_home_tab"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_weight="1"
android:textSize="10sp"
app:tab_icon="@mipmap/ic_main_tab_game_home"
app:tab_icon_select="@mipmap/ic_main_tab_game_pressed"
app:tab_text="派对"
app:tab_text_color="@color/main_tab_normal"
app:tab_text_color_select="@color/color_333333" />
android:layout_weight="1" />
<com.yizhuan.erban.ui.widget.MainRedPointTab
android:id="@+id/main_attention_tab"
android:id="@+id/main_square_tab"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_weight="1"
android:textSize="@dimen/sp_10"
app:tab_icon="@mipmap/ic_main_tab_find"
app:tab_icon_select="@mipmap/ic_main_tab_find_pressed"
app:tab_text="广场"
app:tab_text_color="@color/main_tab_normal"
app:tab_text_color_select="@color/color_333333" />
android:layout_weight="1" />
<com.yizhuan.erban.ui.widget.MainTab
<com.yizhuan.erban.ui.widget.MainRedPointTab
android:id="@+id/main_game_tab"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:textSize="10sp"
app:tab_icon="@mipmap/ic_main_tab_peace"
app:tab_icon_select="@mipmap/ic_main_tab_peace_pressed"
app:tab_text="赛事"
app:tab_text_color="@color/main_tab_normal"
app:tab_text_color_select="@color/color_333333" />
android:layout_weight="1" />
<com.yizhuan.erban.ui.widget.MainRedPointTab
android:id="@+id/main_msg_tab"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_weight="1"
android:textSize="@dimen/sp_10"
app:tab_icon="@mipmap/ic_main_tab_msg"
app:tab_icon_select="@mipmap/ic_main_tab_msg_pressed"
app:tab_text="消息"
app:tab_text_color="@color/main_tab_normal"
app:tab_text_color_select="@color/color_333333" />
android:layout_weight="1" />
<com.yizhuan.erban.ui.widget.MainRedPointTab
android:id="@+id/main_me_tab"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_weight="1"
android:textSize="@dimen/sp_10"
app:tab_icon="@mipmap/ic_main_tab_me"
app:tab_icon_select="@mipmap/ic_main_tab_me_pressed"
app:tab_text="我的"
app:tab_text_color="@color/main_tab_normal"
app:tab_text_color_select="@color/color_333333" />
android:layout_weight="1" />
</merge>

View File

@@ -3,29 +3,41 @@
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"
tools:parentTag="android.widget.RelativeLayout" >
android:layout_height="wrap_content"
tools:parentTag="android.widget.RelativeLayout">
<com.yizhuan.erban.ui.widget.MainTab
android:id="@+id/main_tab_msg"
<LinearLayout
android:id="@+id/ll_tab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="10sp"
app:tab_icon="@mipmap/ic_main_tab_game_home"
app:tab_icon_select="@mipmap/ic_main_tab_game_pressed"
app:tab_text="首页"
app:tab_text_color_select="@color/color_333333"
app:tab_text_color="@color/main_tab_normal" />
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_tab_icon"
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/default_cover" />
<TextView
android:id="@+id/tv_tab_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/color_selector_main_tab"
android:textSize="10sp"
tools:text="首页" />
</LinearLayout>
<com.netease.nim.uikit.common.ui.draggablebubbles.BubbleView
android:id="@+id/msg_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/main_tab_msg"
android:layout_alignTop="@+id/ll_tab"
android:layout_marginStart="-12dp"
android:layout_marginTop="1dp"
android:layout_toEndOf="@+id/main_tab_msg"
android:layout_toEndOf="@+id/ll_tab"
android:background="@drawable/bg_msg_number"
android:gravity="center"
android:visibility="invisible"

View File

@@ -0,0 +1,8 @@
package com.yizhuan.xchat_android_core.home.bean
data class MainTabInfo(
val tabIcon: String = "",
val tabSelectedIcon: String = "",
val tabName: String = "",
val tabType: Int = 0
)

View File

@@ -0,0 +1,10 @@
package com.yizhuan.xchat_android_core.home.bean;
public interface MainTabType {
//tabType(1-派对2-广场3-赛事4-消息5-我的)
int TAB_TYPE_HOME = 1;
int TAB_TYPE_SQUARE = 2;
int TAB_TYPE_GAME = 3;
int TAB_TYPE_MSG = 4;
int TAB_TYPE_ME = 5;
}

View File

@@ -189,18 +189,6 @@ object HomeModel : BaseModel() {
@POST("interactive/unreadCount")
fun getUnreadCount(@Query("uid") uid: Long): Single<ServiceResult<UnReadCountInfo>>
/**
* 获取互动消息未读数量
*
* @param uid
* @return
*/
@POST
fun getCode(
@Url url: String,
@Query("user_id") uid: Long
): Single<ServiceResult<UnReadCountInfo>>
/**
* 首页Banner
*
@@ -317,6 +305,14 @@ object HomeModel : BaseModel() {
@GET("/single/broadcast/morePopularityAnchorList")
suspend fun getMoreSingleAnchorList(): ServiceResult<List<HomeRoomInfo>>
/**
* 获取首页Tab配置
*
* @return
*/
@GET("/app/bottomBar/getCurrentAppBottomBar")
suspend fun getMainTabList(): ServiceResult<List<MainTabInfo>>
}
}

View File

@@ -1,19 +1,30 @@
package com.yizhuan.xchat_android_core.initial;
import android.annotation.SuppressLint;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.LiveData;
import com.yizhuan.xchat_android_core.base.IModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.home.bean.MainTabInfo;
import com.yizhuan.xchat_android_core.initial.bean.BoxInfo;
import com.yizhuan.xchat_android_core.initial.bean.InitInfo;
import java.util.List;
import io.reactivex.Single;
/**
* @author: hewenhao
* @date: 2018/9/10 11:32
* @author: hewenhao
* @date: 2018/9/10 11:32
*/
public interface IInitialModel extends IModel {
@NonNull
LiveData<List<MainTabInfo>> getMainTabInfosLiveData();
Single<InitInfo> init(boolean force);
boolean isReportSwitch();
@@ -34,6 +45,9 @@ public interface IInitialModel extends IModel {
String getPublicChatHallUid();
@SuppressLint("CheckResult")
void loadMainTabInfoList();
Single<BoxInfo> getBoxInfo();
boolean isCaptchaSwitch();
@@ -48,7 +62,7 @@ public interface IInitialModel extends IModel {
* @return
*/
Single<ServiceResult> reportAdv(String oaid,String imeiMD5);
Single<ServiceResult> reportAdv(String oaid, String imeiMD5);
int getTeenagerMode();

View File

@@ -1,12 +1,16 @@
package com.yizhuan.xchat_android_core.initial;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import com.bumptech.glide.request.FutureTarget;
import com.bumptech.glide.request.target.Target;
@@ -15,6 +19,8 @@ import com.yizhuan.xchat_android_core.DemoCache;
import com.yizhuan.xchat_android_core.base.BaseModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.certification.CertificationModel;
import com.yizhuan.xchat_android_core.home.bean.MainTabInfo;
import com.yizhuan.xchat_android_core.home.bean.MainTabType;
import com.yizhuan.xchat_android_core.initial.bean.BoxInfo;
import com.yizhuan.xchat_android_core.initial.bean.InitInfo;
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
@@ -23,6 +29,7 @@ import com.yizhuan.xchat_android_core.public_chat_hall.manager.PublicChatHallDat
import com.yizhuan.xchat_android_core.room.face.DynamicFaceModel;
import com.yizhuan.xchat_android_core.utils.CurrentTimeUtils;
import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_core.withdraw.WithdrawModel;
import com.yizhuan.xchat_android_library.net.rxnet.RxNet;
import com.yizhuan.xchat_android_library.utils.JavaUtil;
@@ -31,6 +38,9 @@ import com.yizhuan.xchat_android_library.utils.NetworkUtils;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import io.reactivex.Single;
import io.reactivex.SingleOnSubscribe;
@@ -60,6 +70,7 @@ public class InitialModel extends BaseModel implements IInitialModel {
private static final long TIME_EXPIRED = 24 * 60 * 60 * 1000;
private volatile static IInitialModel model;
private final Api api;
private final MutableLiveData<List<MainTabInfo>> mainTabInfosLiveData = new MutableLiveData<>();
private boolean requesting;
private boolean success;
private BroadcastReceiver receiver;
@@ -71,22 +82,18 @@ public class InitialModel extends BaseModel implements IInitialModel {
* 宝箱开关,等级限制
*/
private BoxInfo boxInfo;
/**
* 注册图片验证码开关
*/
private boolean captchaSwitch;
/**
* 记录服务器与本地的时间差
*/
private long timeDiff;
/**
* 是否需要上报消息的开关
*/
private boolean reportSwitch;
/**
* 家长模式引导 1-强 2- 弱
*/
@@ -110,6 +117,7 @@ public class InitialModel extends BaseModel implements IInitialModel {
private InitialModel() {
api = RxNet.create(Api.class);
loadMainTabInfoList();
IntentFilter filter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
receiver = new BroadcastReceiver() {
@Override
@@ -137,6 +145,12 @@ public class InitialModel extends BaseModel implements IInitialModel {
return model;
}
@Override
@NonNull
public LiveData<List<MainTabInfo>> getMainTabInfosLiveData() {
return mainTabInfosLiveData;
}
@Override
public Single<InitInfo> init(boolean force) {
if (requesting && initResultSingle != null) return initResultSingle;
@@ -396,6 +410,58 @@ public class InitialModel extends BaseModel implements IInitialModel {
.observeOn(AndroidSchedulers.mainThread());
}
@SuppressLint("CheckResult")
@Override
public void loadMainTabInfoList() {
api.getMainTabList()
.compose(RxHelper.handleBeanData())
.doOnError(throwable -> mainTabInfosLiveData.setValue(getDefaultMainTab()))
.subscribe(mainTabInfos -> {
if (mainTabInfos.size() != 5) {
mainTabInfosLiveData.setValue(getDefaultMainTab());
} else {
mainTabInfosLiveData.setValue(mainTabInfos);
}
});
}
private List<MainTabInfo> getDefaultMainTab() {
return new ArrayList<>(Arrays.asList(
new MainTabInfo(
"",
"",
"派对",
MainTabType.TAB_TYPE_HOME
),
new MainTabInfo(
"",
"",
"广场",
MainTabType.TAB_TYPE_SQUARE
),
new MainTabInfo(
"",
"",
"赛事",
MainTabType.TAB_TYPE_GAME
),
new MainTabInfo(
"",
"",
"消息",
MainTabType.TAB_TYPE_MSG
),
new MainTabInfo(
"",
"",
"我的",
MainTabType.TAB_TYPE_ME
)
));
}
/**
* 获取宝箱信息,如果没有,则重新加载
*/
@@ -483,5 +549,13 @@ public class InitialModel extends BaseModel implements IInitialModel {
@POST("/observe/callback")
@FormUrlEncoded
Single<ServiceResult> reportAdv(@Field("imei") String imeiMD5, @Field("oaid") String oaidMD5);
/**
* 获取首页Tab配置
*
* @return
*/
@GET("/app/bottomBar/getCurrentAppBottomBar")
Single<ServiceResult<List<MainTabInfo>>> getMainTabList();
}
}

View File

@@ -149,7 +149,6 @@ public class DynamicFaceModel extends BaseModel implements IDynamicFaceModel {
String offlineEncryptString = DemoCache.readFaceList();
try {
String faceString = DESUtils.DESAndBase64Decrypt(offlineEncryptString);
LogUtils.d(faceString);
offlineFaceList = new Gson().fromJson(faceString, FaceListInfo.class);
} catch (Exception e) {
e.printStackTrace();