基线备份:thirdparty 变体完成 + Android 4.2 兼容改造前

包含内容:
- thirdparty flavor 独立 applicationId + Intent 入口(ThirdPartyEntryActivity)
- 58 后端接口适配(单 /api 路径、code 0/200、camelCase 字段、UNBOUND 轮询)
- MAC 硬件锚定校验(防一凭证多设备共用)
- EPG mac 覆盖 SDK init(sMacOverride)+ ChannelManger 初始化对齐
- 提示文案优化(设备未注册/权益未绑定)
This commit is contained in:
zhaogd
2026-08-25 11:16:40 +08:00
commit d11464d466
1287 changed files with 154945 additions and 0 deletions

View File

@@ -0,0 +1,408 @@
/**
* @file BaseActivity.java
* @description Activity 基类,提供公共功能:按键节流、网络监听、返回按钮等
* @author ainetv
* @date 2026-04-16
*/
package com.pukka.jiecheng.base;
import android.content.Context;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.MutableLiveData;
import com.pukka.jiecheng.BuildConfig;
import com.pukka.jiecheng.R;
import com.pukka.jiecheng.config.AppConfiguration;
import com.pukka.jiecheng.monitor.HomeMonitor;
import com.pukka.jiecheng.monitor.NetworkMonitor;
import com.pukka.jiecheng.newtv.NewTvListner;
import com.pukka.jiecheng.newtv.NewTvManager;
import com.pukka.jiecheng.newtv.NewTvUtils;
import com.pukka.jiecheng.newtv.NewTvView;
import com.pukka.jiecheng.utils.ChannelManger;
import com.pukka.libcore.boxShared.BoxSharedParamsUtils;
import com.pukka.libcore.utils.AppManager;
import com.pukka.libcore.utils.AppUtils;
import com.pukka.libcore.utils.GreyingManager;
import com.pukka.libcore.utils.LogUtils;
import com.pukka.libcore.utils.StringUtils;
/**
* Activity 基类
*
* 主要功能:
* 1. 按键节流机制(防止快速连续按键)
* 2. 网络状态监听
* 3. 返回按钮管理(触摸模式)
* 4. 未来认证页面显示
* 5. 应用变灰功能
*
* 架构设计:
* - 提供模板方法模式,子类可重写特定方法
* - 使用策略模式实现按键节流
* - 使用观察者模式监听网络状态
*
* @author ainetv
*/
public class BaseActivity extends AppCompatActivity implements NetworkMonitor.NetworkReceiver {
private static final String TAG = "BaseActivity ";
protected long mLastKeyDownTime;
protected boolean goToOtherApp;
public static boolean isResumeVideo = false;
protected Context mContext;
protected NetworkMonitor networkMonitor;
private NewTvListner newTvListner;
private boolean newtvState;
protected ImageView mIvGamePad;
private LinearLayout mBackButton;
private boolean mBackButtonEnabled = false;
private OnBackButtonClickListener mBackButtonClickListener;
public interface OnBackButtonClickListener {
void onBackButtonClick();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
goToOtherApp = false;
AppManager.getAppManager().addActivity(this);
themeGrey();
registerBroadcastReceiver();
HomeMonitor.registerReceiver(this);
}
@Override
protected void onStart() {
super.onStart();
//可见但不在前台
LogUtils.d("BaseActivity onStart()");
AppManager.getAppManager().addCount();
}
@Override
protected void onResume() {
super.onResume();
LogUtils.d("BaseActivity onResume()");
}
@Override
protected void onStop() {
super.onStop();
//完全不可见
LogUtils.d("BaseActivity onStop()");
AppManager.getAppManager().reduceCount();
}
public void killApp() {
NewTvUtils.getInstance().newTvLogAppExit();
AppManager.getAppManager().appExit();
}
@Override
protected void onDestroy() {
super.onDestroy();
AppManager.getAppManager().finishActivity(this);
unregisterBroadcastReceiver();
}
/**
* 所有Activity变灰
*/
private void themeGrey() {
int type = SystemConfigManager.getInstance().isGreying();
if (type == 0) {
GreyingManager.themeGrey(type, getWindow());
}
}
/**
* 按键节流策略配置
*
* 设计意图:
* - 防止用户快速连续按键导致的重复操作
* - 子类可重写 shouldThrottleKey() 方法自定义节流策略
* - 子类可重写 getThrottleInterval() 方法自定义节流间隔
*
* 默认策略:
* - 所有按键节流间隔为 100ms
* - 子类可通过重写 shouldThrottleKey() 排除特定按键
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean dispatch = super.onKeyDown(keyCode, event);
if (event.getAction() == KeyEvent.ACTION_DOWN) {
// 检查是否需要节流该按键
if (shouldThrottleKey(keyCode, event)) {
long current = System.currentTimeMillis();
long interval = getThrottleInterval(keyCode);
if (current - mLastKeyDownTime < interval) {
LogUtils.d(TAG, "按键被节流: keyCode=" + keyCode + ", interval=" + interval + "ms");
return true;
}
mLastKeyDownTime = current;
}
} else if (keyCode == KeyEvent.KEYCODE_HOME) {
// 处理Home键按下事件
NewTvUtils.getInstance().newTvLogAppExit();
AppManager.getAppManager().appExit();
return dispatch;
}
return dispatch;
}
/**
* 判断是否需要节流该按键
* 子类可重写此方法自定义节流策略
*
* @param keyCode 按键代码
* @param event 按键事件
* @return true 表示需要节流,false 表示不节流
*/
protected boolean shouldThrottleKey(int keyCode, KeyEvent event) {
// 默认对所有按键进行节流
return true;
}
/**
* 获取按键节流间隔(毫秒)
* 子类可重写此方法自定义节流间隔
*
* @param keyCode 按键代码
* @return 节流间隔(毫秒)
*/
protected long getThrottleInterval(int keyCode) {
// 默认节流间隔为 100ms
return 100;
}
@Override
protected void onUserLeaveHint() {
super.onUserLeaveHint();
LogUtils.e(TAG + "onUserLeaveHint ---Activity : " + AppUtils.getTopActivity());
}
@Override
public void currentNetType(String currentNetType) {
LogUtils.d(TAG, "currentNetType:" + currentNetType);
if ("unknown".equals(currentNetType)) {
isResumeVideo = true;
//NoNetworkActivity.start(this);
} else {
//AppManager.getAppManager().finishAppointActivity(NoNetworkActivity.class);
}
}
/**
* 注册网络广播、install广播
*/
public void registerBroadcastReceiver() {
networkMonitor = new NetworkMonitor();
networkMonitor.setNetworkNativeReceiver(this);
IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
filter.addAction("android.net.wifi.WIFI_STATE_CHANGED");
filter.addAction("android.net.wifi.STATE_CHANGE");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
mContext.registerReceiver(networkMonitor, filter, Context.RECEIVER_NOT_EXPORTED);
} else {
mContext.registerReceiver(networkMonitor, filter);
}
}
/**
* 反注册网络广播、install广播
*/
public void unregisterBroadcastReceiver() {
mContext.unregisterReceiver(networkMonitor);
}
/**
* 未来认证页面显示
*/
public void activityShowNewTv() {
String saveState = NewTvManager.getInstance().getNewtvState();
if (!StringUtils.isEmpty(saveState)){
return;
}
// 获取Activity的DecorView
View decorView = getWindow().getDecorView();
// 获取DecorView的ViewGroup
ViewGroup decorViewGroup = (ViewGroup) decorView;
String state = NewTvManager.getInstance().getState();
NewTvManager.getInstance().setNewtvState(state);
boolean isFail = "fail".equals(state);
newtvState = isFail;
if (isFail) {
removeDecorView(decorViewGroup);
if (NewTvManager.getInstance().getNewTvView() != null) {
NewTvManager.getInstance().getNewTvView().showError(isFail);
decorViewGroup.addView(NewTvManager.getInstance().getNewTvView());
}
} else {
MutableLiveData<String> goActivityData = new MutableLiveData<String>();
goActivityData.observe(this, s -> {
LogUtils.d("activityShowNewTv --observe : "+s);
NewTvManager.getInstance().setNewtvState(s);
removeDecorView(decorViewGroup);
boolean fail = "fail".equals(s);
newtvState = fail;
if (fail) {
if (NewTvManager.getInstance().getNewTvView() != null) {
NewTvManager.getInstance().getNewTvView().showError(fail);
decorViewGroup.addView(NewTvManager.getInstance().getNewTvView());
}
if (newTvListner != null) {
newTvListner.playerPause();
}
}
});
}
LogUtils.d("activityShowNewTv --state : "+state);
}
private void removeDecorView(ViewGroup decorViewGroup){
try {
int size = decorViewGroup.getChildCount();
for (int i = 0; i < size; i++) {
View view = decorViewGroup.getChildAt(i);
if (view instanceof NewTvView) {
decorViewGroup.removeView(view);
LogUtils.d("activityShowNewTv: removeDecorView ");
}
}
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 获取当前未来认证的状态
* @return
*/
public boolean getNewTvState(){
LogUtils.d("getNewTvState -- :"+newtvState);
return newtvState;
}
public void setNewTvListner(NewTvListner listner){
newTvListner = listner;
}
protected void initGamePad(){
if(BoxSharedParamsUtils.isJcCloud() || ChannelManger.isAnNingHotel()){
//安柠游戏和安柠酒店版本显示手柄
mIvGamePad = findViewById(R.id.id_iv_game_pad);
if(null != mIvGamePad) {
LogUtils.d("显示手柄");
mIvGamePad.setVisibility(View.VISIBLE);
}
}
}
protected void enableBackButton() {
if(AppConfiguration.getInstance().isTouchMode()) {
enableBackButton(null);
}
}
protected void enableBackButton(OnBackButtonClickListener listener) {
if(AppConfiguration.getInstance().isTouchMode()) {
mBackButtonClickListener = listener;
mBackButtonEnabled = true;
createAndShowBackButton();
}
}
protected void disableBackButton() {
mBackButtonEnabled = false;
removeBackButton();
}
private void createAndShowBackButton() {
if (mBackButton != null) {
mBackButton.setVisibility(View.VISIBLE);
return;
}
FrameLayout contentLayout = findViewById(android.R.id.content);
if (contentLayout == null) {
return;
}
mBackButton = new LinearLayout(this);
mBackButton.setId(R.id.id_back_button_floating);
mBackButton.setOrientation(LinearLayout.VERTICAL);
mBackButton.setGravity(Gravity.CENTER);
mBackButton.setFocusable(true);
mBackButton.setClickable(true);
mBackButton.setBackground(ContextCompat.getDrawable(this, R.drawable.bg_search_back_btn_selector));
int buttonSize = (int) getResources().getDimension(R.dimen.qb_px_80);
int iconSize = (int) getResources().getDimension(R.dimen.qb_px_28);
int marginEnd = (int) getResources().getDimension(R.dimen.qb_px_40);
int marginBottom = (int) getResources().getDimension(R.dimen.qb_px_40);
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(buttonSize, buttonSize);
layoutParams.gravity = Gravity.BOTTOM | Gravity.END;
layoutParams.setMargins(0, 0, marginEnd, marginBottom);
mBackButton.setLayoutParams(layoutParams);
ImageView iconView = new ImageView(this);
LinearLayout.LayoutParams iconParams = new LinearLayout.LayoutParams(iconSize, iconSize);
iconView.setLayoutParams(iconParams);
iconView.setImageResource(R.drawable.icon_detail_back_normal);
mBackButton.addView(iconView);
mBackButton.setOnClickListener(v -> {
if (mBackButtonClickListener != null) {
mBackButtonClickListener.onBackButtonClick();
} else {
finish();
}
});
contentLayout.addView(mBackButton);
}
private void removeBackButton() {
if (mBackButton != null && mBackButton.getParent() != null) {
ViewGroup parent = (ViewGroup) mBackButton.getParent();
parent.removeView(mBackButton);
mBackButton = null;
}
}
protected LinearLayout getBackButton() {
return mBackButton;
}
protected boolean isBackButtonEnabled() {
return mBackButtonEnabled;
}
}

View File

@@ -0,0 +1,20 @@
package com.pukka.jiecheng.base;
import android.view.View;
/**
* 列表Item点击事件接口基类
*
* @author MajorLL
*/
public interface BaseOnItemClickListener<T> {
/**
* item 点击事件
*
* @param view 点击view
* @param position 点击位置
* @param t item 泛型数据类
*/
public void onItemClick(View view, int position,T t);
}

View File

@@ -0,0 +1,22 @@
package com.pukka.jiecheng.base;
import android.view.View;
/**
* item 焦点变化事件
*
* @author MajorLL
*/
public interface BaseOnItemFocusChangeListener<T> {
/**
* item 焦点变化
*
* @param v 当前view
* @param hasFocus 是否获取焦点
* @param position 获取位置
* @param t 对应泛型数据
*/
public void onItemFocusChange(View v , boolean hasFocus, int position ,T t);
}

View File

@@ -0,0 +1,118 @@
package com.pukka.jiecheng.base;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.leanback.widget.Presenter;
import com.pukka.libcore.utils.LogUtils;
import java.util.List;
public abstract class BasePresenter<VH extends BasePresenterViewHolder, D> extends Presenter {
/**
* item 点击事件
*/
protected OnItemClickListener<D> onItemClickListener = null;
public void setOnItemClickListener(OnItemClickListener<D> onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup) {
// long time = System.currentTimeMillis();
View view;
int layoutResId = getLayoutResId();
if (layoutResId <= 0) {
view = new View(viewGroup.getContext());
} else {
view = LayoutInflater.from(viewGroup.getContext()).inflate(getLayoutResId(), viewGroup, false);
}
ViewHolder viewHolder = createViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, Object o) {
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, Object item, List<Object> payloads) {
try {
((VH) viewHolder).bindViewHolderPayloads(item,payloads);
if (onItemClickListener != null) {
((VH) viewHolder).view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClickListener.onItemClick(viewHolder.view, (D) item);
}
});
}
} catch (ClassCastException e) {
LogUtils.e(getLogTag() + "onBindViewHolder, cast param failed. " +e);
}
}
@Override
public void onViewAttachedToWindow(ViewHolder viewHolder) {
super.onViewAttachedToWindow(viewHolder);
try {
((VH) viewHolder).setAttachedToWindow(true);
} catch (ClassCastException e) {
LogUtils.e(getLogTag() + "onViewAttachedToWindow, cast param failed." + e);
}
}
@Override
public void onViewDetachedFromWindow(ViewHolder viewHolder) {
super.onViewDetachedFromWindow(viewHolder);
try {
((VH) viewHolder).setAttachedToWindow(false);
} catch (ClassCastException e) {
LogUtils.e(getLogTag() + "onViewDetachedFromWindow, cast param failed." + e);
}
}
@Override
public void onUnbindViewHolder(ViewHolder viewHolder) {
try {
// long time = System.currentTimeMillis();
((VH) viewHolder).unBindViewHolder();
// Logger.d(getLogTag(), "onUnbindViewHolder. cost: " + (System.currentTimeMillis() - time));
} catch (ClassCastException e) {
LogUtils.e(getLogTag() + "onUnbindViewHolder, cast param failed." + e);
}
}
/**
* 获取布局的资源Id
*
* @return 布局的资源Id
*/
protected abstract int getLayoutResId();
/**
* 创建一个ViewHolder的实例
*
* @param view view对象
* @return viewHolder的实例
*/
protected abstract VH createViewHolder(View view);
/**
* 获取日志的TAG
*
* @return 日志的TAG
*/
protected abstract String getLogTag();
public interface OnItemClickListener<D> {
void onItemClick(View view, D d);
}
}

View File

@@ -0,0 +1,75 @@
package com.pukka.jiecheng.base;
import android.view.View;
import androidx.leanback.widget.Presenter;
import com.pukka.libcore.utils.LogUtils;
import java.util.List;
public abstract class BasePresenterViewHolder<D> extends Presenter.ViewHolder {
/**
* 布局是否绑定到窗口
*/
protected boolean mIsAttachedToWindow = false;
/**
* 构造函数
*
* @param view 布局对象
*/
public BasePresenterViewHolder(View view) {
super(view);
initView(view);
}
/**
* 初始化布局<BR>
* 子类可以进行布局的findViewById等操作,提升bindData的性能
*
* @param itemView 布局
*/
protected abstract void initView(View itemView);
/**
* 绑定数据(刷新时调用)
*
* @param data 数据对象
*/
protected abstract void onBindDataPayloads(D data, List<Object> payloads);
/**
* 接触绑定数据
*/
protected abstract void onUnbindData();
void bindViewHolderPayloads(Object item, List<Object> payloads) {
try {
onBindDataPayloads((D) item,payloads);
} catch (ClassCastException e) {
LogUtils.e("bindViewHolder, cast param failed." + e);
}
}
/**
* 解绑视图ViewHolder
*/
void unBindViewHolder() {
onUnbindData();
}
/**
* 设置是否绑定到窗口
*
* @param isAttachedInWindow true表示绑定到窗口
*/
void setAttachedToWindow(boolean isAttachedInWindow) {
mIsAttachedToWindow = isAttachedInWindow;
}
}

View File

@@ -0,0 +1,144 @@
package com.pukka.jiecheng.base;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
/**
* @author MajorLL
*/
public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<BaseRecyclerViewHolder<T>> {
/**
* 源数据
*/
protected List<T> mData;
/**
* item 点击事件
*/
protected BaseOnItemClickListener<T> onItemClickListener = null;
/**
* item 焦点变化事件
*/
protected BaseOnItemFocusChangeListener<T> onItemFocusChangeListener = null;
/**
* 获取当前布局资源文件ID
*
* @param viewType viewType类型
* @return 返回资源ID
*/
protected abstract int getLayoutId(int viewType);
/**
* 获取对应ViewHolder
*
* @param view
* @param viewType
* @return
*/
public abstract BaseRecyclerViewHolder<T> getViewHolder(View view, int viewType);
public BaseRecyclerAdapter(@NonNull List<T> mData) {
this.mData = mData;
}
/**
* 获取对应位置泛型数据对象
*
* @param position 位置
* @return 泛型数据
*/
protected T getIndexData(int position) {
if (mData == null || mData.size() <= position) {
return null;
}
return mData.get(position);
}
@NonNull
@Override
public BaseRecyclerViewHolder<T> onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(getLayoutId(viewType), parent, false);
return getViewHolder(view, viewType);
}
@Override
public void onBindViewHolder(@NonNull BaseRecyclerViewHolder<T> holder, int position) {
holder.setData(getIndexData(position));
final int index = position;
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.onItemClick(v, index, getIndexData(index));
if (onItemClickListener != null) {
onItemClickListener.onItemClick(v, index, getIndexData(index));
}
}
});
holder.itemView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
holder.onItemFocusChange(v, hasFocus);
if (onItemFocusChangeListener != null) {
onItemFocusChangeListener.onItemFocusChange(v, hasFocus, index, getIndexData(index));
}
}
});
}
@Override
public int getItemCount() {
if (mData == null) {
return 0;
}
return mData.size();
}
/**
* 获取空页面数量
* @return 空页面数量
*/
public int getEmptyCount() {
if (mData == null) {
return 0;
}
int index = 0;
for (T mDatum : mData) {
if (mDatum == null) {
index++;
}
}
return index;
}
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
/**
* 设置对应得Item点击事件
*
* @param onItemClickListener item点击事件回调
*/
public void setOnItemClickListener(BaseOnItemClickListener<T> onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
/**
* 设置对应item焦点事件
*
* @param onItemFocusChangeListener item焦点事件回调
*/
public void setOnItemFocusChangeListener(BaseOnItemFocusChangeListener<T> onItemFocusChangeListener) {
this.onItemFocusChangeListener = onItemFocusChangeListener;
}
}

View File

@@ -0,0 +1,35 @@
package com.pukka.jiecheng.base;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
/**
* RecyclerViewHolder基类
*
* @author MajorLL
*/
public abstract class BaseRecyclerViewHolder<T> extends RecyclerView.ViewHolder {
public BaseRecyclerViewHolder(@NonNull View itemView) {
super(itemView);
}
/**
* 设置数据
*
* @param t 泛型数据对象
*/
public abstract void setData(T t);
/**
* item焦点变化
*
* @param v 视图view
* @param hasFocus 是否获取焦点
*/
public abstract void onItemFocusChange(View v, boolean hasFocus);
public abstract void onItemClick(View view, int position,T t);
}

View File

@@ -0,0 +1,75 @@
package com.pukka.jiecheng.base;
import android.view.View;
import androidx.leanback.widget.Presenter;
import com.pukka.libcore.utils.LogUtils;
public abstract class BaseViewHolder<D> extends Presenter.ViewHolder {
/**
* 布局是否绑定到窗口
*/
protected boolean mIsAttachedToWindow = false;
/**
* 构造函数
*
* @param view 布局对象
*/
public BaseViewHolder(View view) {
super(view);
initView(view);
}
/**
* 初始化布局<BR>
* 子类可以进行布局的findViewById等操作,提升bindData的性能
*
* @param itemView 布局
*/
protected abstract void initView(View itemView);
/**
* 绑定数据
*
* @param data 数据对象
*/
protected abstract void onBindData(D data);
/**
* 接触绑定数据
*/
protected abstract void onUnbindData();
/**
* 绑定视图ViewHolder
*
* @param data 数据对象
*/
void bindViewHolder(Object data) {
try {
onBindData((D) data);
} catch (ClassCastException e) {
LogUtils.e("bindViewHolder, cast param failed." + e);
}
}
/**
* 解绑视图ViewHolder
*/
void unBindViewHolder() {
onUnbindData();
}
/**
* 设置是否绑定到窗口
*
* @param isAttachedInWindow true表示绑定到窗口
*/
void setAttachedToWindow(boolean isAttachedInWindow) {
mIsAttachedToWindow = isAttachedInWindow;
}
}

View File

@@ -0,0 +1,537 @@
package com.pukka.jiecheng.base;
import android.text.TextUtils;
import com.migu.bean.GetLayoutNavBean;
import com.migu.bean.GetsystemBean;
import com.migu.callback.AijiaCallback;
import com.migu.httputils.HomeHttpUtils;
import com.pukka.libcore.boxShared.BoxSharedParameters;
import com.pukka.libcore.utils.ListUtils;
import com.pukka.libcore.utils.LogUtils;
import com.pukka.libcore.utils.SharedPreferenceUtils;
import java.util.Iterator;
import java.util.List;
/**
* Author: wxf
* Date: 2023/3/23 17:28
* Description:全局配置管理
*/
public class SystemConfigManager {
private static final SystemConfigManager M_INSTANCE = new SystemConfigManager();
//一键变灰
private static final int GREY_TYPE = 2;
//是否驻留
private static final int APP_KEEP_TYPE = 25;
//是否隐藏VR
private static final int HIDE_VR_TYPE = 13;
//是否隐藏4K
private static final int HIDE_4K_TYPE = 14;
//VR测试流
private static final int VRPLAYURL_TYPE = 21;
//试看时长
private static final int TRY_SEEING_TYPE = 3;
//直播试看时长
private static final int TRY_SEEING_LIVE_TYPE = 38;
//首页垫片 shimCode
private static final int INDEX_SHIM_CODE = 4;
//广东iptv tid
private static final int GUANGDONG_IPTV_TID = 62;
//四川cdn信息
private static final int SICHUAN_CDN = 42;
private boolean isUserAgree;
private String agreeDes;
private String vrTestUrl;
private int agreeLookDuration;
private int tryLookDuration;
private int tryLiveDuration;
private String indexShimCode;
//退订周期 单位:天 默认365天
private int cancelOrderPeriod = 365;
//短视频息屏
private int shortParseNum = 999;
//登录页背景图
private String loginBg = "";
public String getLoginBg() {
return loginBg;
}
public int getCancelOrderPeriod() {
return cancelOrderPeriod;
}
public int getShortParseNum(){
return shortParseNum;
}
public static SystemConfigManager getInstance() {
return M_INSTANCE;
}
public GetsystemBean getsystemBean;
public void setGetsystemBean(GetsystemBean getsystemBean) {
this.getsystemBean = getsystemBean;
}
/**
* 通过type值获取实体
*
* @param type type
* @return 实体
*/
public GetsystemBean.ResultBean getResultBeanByType(int type) {
if (null == getsystemBean) {
return null;
}
List<GetsystemBean.ResultBean> resultBeanList = getsystemBean.getResult();
if (ListUtils.isEmpty(resultBeanList)) {
return null;
}
int size = resultBeanList.size();
for (int i = 0; i < size; i++) {
if (type == resultBeanList.get(i).getType()) {
return resultBeanList.get(i);
}
}
return null;
}
/**
* 是否一键变灰
* 0:灰 1:正常
*/
public int isGreying() {
int isGrey = 1;
GetsystemBean.ResultBean resultBean = getResultBeanByType(GREY_TYPE);
if (null != resultBean) {
int status = resultBean.getStatus();
if (status == 11) {
// 变灰
isGrey = 0;
}
}
return isGrey;
}
/**
* 是否驻留
*/
public boolean isAppKeep() {
GetsystemBean.ResultBean resultBean = getResultBeanByType(APP_KEEP_TYPE);
return resultBean != null && 1 == resultBean.getStatus();
}
/**
* VR黑白名单
* status 1支持 2不支持 3正常
* 判断不支持隐藏首页vr tab (vr tab的判断在layoutnav接口里 type值为4的表示为vr tab)
*/
public int vrBlacklist() {
GetsystemBean.ResultBean resultBean = getResultBeanByType(HIDE_VR_TYPE);
if (null != resultBean) {
return resultBean.getStatus();
}
return 3;
}
/**
* 4K黑白名单 == 是否隐藏4k
* 取item里的status 1支持 2不支持 3正常
* 判断不支持隐藏首页4k tab(4k tab的判断在layoutnav接口里 type值为3的表示为4k tab)
*/
public int isHide4K() {
GetsystemBean.ResultBean resultBean = getResultBeanByType(HIDE_4K_TYPE);
if (null != resultBean) {
return resultBean.getStatus();
}
return 0;
}
/**
* 隐藏4K导航tab
*
* @param response response
*/
public void hide4K(GetLayoutNavBean response) {
boolean needHide4k = response != null && (isHide4K() == 2
|| (isHide4K() != 1 && "0".equals(SharedPreferenceUtils.getString("epgToApk", "issupport4k", ""))));
if (needHide4k) {
for (GetLayoutNavBean.DataBean item : response.getData()) {
if (ListUtils.isEmpty(item.getNavList())) {
return;
}
Iterator<GetLayoutNavBean.DataBean.SubNavDataBean> iteratorSub = item.getNavList().iterator();
while (iteratorSub.hasNext()) {
GetLayoutNavBean.DataBean.SubNavDataBean itemSub = iteratorSub.next();
if (3 == itemSub.getType()) {
iteratorSub.remove();
}
}
}
removeEmptyData(response);
}
}
/**
* 隐藏VR导航tab
*
* @param response response
*/
public void hideVr(GetLayoutNavBean response) {
boolean needHideVr = response != null && (vrBlacklist() == 2
|| (vrBlacklist() != 1 && "0".equals(SharedPreferenceUtils.getString("epgToApk", "issupportVr", ""))));
if (needHideVr) {
for (GetLayoutNavBean.DataBean item : response.getData()) {
if (ListUtils.isEmpty(item.getNavList())) {
return;
}
Iterator<GetLayoutNavBean.DataBean.SubNavDataBean> iteratorSub = item.getNavList().iterator();
while (iteratorSub.hasNext()) {
GetLayoutNavBean.DataBean.SubNavDataBean itemSub = iteratorSub.next();
if (4 == itemSub.getType()) {
iteratorSub.remove();
}
}
}
removeEmptyData(response);
}
}
/**
* 如果VR或者4K配置在组nav中,在这个组为空时 要移除这组数据
*
* @param response response
*/
private void removeEmptyData(GetLayoutNavBean response) {
Iterator<GetLayoutNavBean.DataBean> iterator = response.getData().iterator();
while (iterator.hasNext()) {
GetLayoutNavBean.DataBean item = iterator.next();
if (item.getNavList().size() == 0) {
iterator.remove();
}
}
}
public boolean isUserAgree() {
return isUserAgree;
}
public void getSystemResponse(OnPassData onPassData) {
HomeHttpUtils.getsystemData(new AijiaCallback.GetsystemCallBack() {
@Override
public void onResponse(GetsystemBean response) {
passResponse(response, onPassData);
}
@Override
public void netFail() {
onPassData.fail();
}
@Override
public void fail() {
onPassData.fail();
}
});
}
/**
* 配置信息
*
* @param getSystemBean getSystemBean
* @param onPassData onPassData
*/
private void passResponse(GetsystemBean getSystemBean, OnPassData onPassData) {
try {
for (GetsystemBean.ResultBean resultBean : getSystemBean.getResult()) {
int type = resultBean.getType();
int status = resultBean.getStatus();
String description = resultBean.getDescription();
boolean descriptionIsNotEmpty = !TextUtils.isEmpty(description);
LogUtils.d("resultBean -- type : " + type);
switch (type) {
case 1:
//退出挽留弹窗
break;
case 2:
//退订限制时长
cancelOrderPeriod = resultBean.getLookDuration();
LogUtils.d("cancelOrderPeriod:"+cancelOrderPeriod);
break;
case 3:
shortParseNum = resultBean.getLookDuration();
LogUtils.d("shortParseNum:"+shortParseNum);
break;
case 7:
loginBg = resultBean.getCorner_url();
LogUtils.d("loginBg:"+loginBg);
break;
// case 27:
// // 设置登陆放通开关 status 0 关闭,1 打开
// if (status == 1) {
// BoxSharedParameters.getInstance().setToPass(true);
// }
// break;
// case 40:
// // 获取未来播控 id
// if (descriptionIsNotEmpty) {
// LogUtils.d("resultBean -- if 40:" + description);
// String[] str = description.split("@@@");
// if (str.length == 3) {
//// if (!TextUtils.isEmpty(str[0]) && !TextUtils.isEmpty(str[1]) && !TextUtils.isEmpty(str[2])) {
//// String channelCodePs = SpTimeUtils.getInstance(ContextUtils.getContext())
//// .getString("NewtvSdk_channelCode", "");
//// if (TextUtils.isEmpty(channelCodePs)) {
//// SpTimeUtils.getInstance(ContextUtils.getContext())
//// .setString("NewtvSdk_channelCode", str[0], 24 * SpTimeUtils.TIME_HOUR);
//// SpTimeUtils.getInstance(ContextUtils.getContext())
//// .setString("NewtvSdk_appKey", str[1], 24 * SpTimeUtils.TIME_HOUR);
//// SpTimeUtils.getInstance(ContextUtils.getContext())
//// .setString("NewtvSdk_appSecret", str[2], 24 * SpTimeUtils.TIME_HOUR);
//// }
//// }
// }
// }
//
// break;
// case 35:
// LogUtils.d("resultBean -- if 35:" + status);
// BoxSharedParameters.getInstance().setIsNetPass(status == 1);
// break;
// case 41:
// LogUtils.d("resultBean -- if 41:" + status);
// //未来认证放通
// BoxSharedParameters.getInstance().setSwitchNewtvPassSwitch(status != 1);
// break;
// case 36:
// // 设置省份id 和 code
// String name = resultBean.getName();
// if (!TextUtils.isEmpty(name)) {
// LogUtils.d("resultBean -- if 36:" + name);
// String[] str = name.split("@@@");
// if (str.length == 2) {
// if (str[0].length() == 2) {
// BoxSharedParameters.getInstance().setProvinceId(str[0]);
// BoxSharedParameters.getInstance().setProvinceCode(str[1]);
// } else {
// BoxSharedParameters.getInstance().setProvinceId(str[1]);
// BoxSharedParameters.getInstance().setProvinceCode(str[0]);
// }
// }
// // 全国走基地逻辑
// if (!TextUtils.isEmpty(BoxSharedParameters.getInstance().getProvinceId())
// && BoxSharedParameters.getInstance().getProvinceId().equals("90")) {
// BoxSharedParameters.getInstance().setChannelType("jd");
// }
// }
// break;
// case 23:
// // 设置网络Base api
// if (descriptionIsNotEmpty) {
// LogUtils.d("resultBean -- if 23:" + description);
//// HttpRetrofitRequest.getInstances().setHttpBaseUrl(description);
// }
// break;
// case 26:
// LogUtils.d("resultBean -- if 26:" + description);
// // 取description 字段,0:vr-mediaplayer 1:vr-mediacodec 2:vr-软解
// BoxSharedParameters.getInstance().setVrType(description);
// break;
// case 31:
// if (descriptionIsNotEmpty) {
// LogUtils.d("resultBean -- if 31:" + description);
// BoxSharedParameters.getInstance().setHotSearchId(description);
// }
// break;
// case 34:
// LogUtils.d("resultBean -- if 34:" + status);
// BoxSharedParameters.getInstance().setShowSearchHot(status != 1);
// break;
// case 43:
// // 取description 字段,0:系统播放器 1:杭研播放器
// if (descriptionIsNotEmpty) {
// LogUtils.d("resultBean -- if 43:" + description);
// if (description.equals("0")) {
// BoxSharedParameters.getInstance().setVideoPlayType(0);
// } else if (description.equals("1")) {
// BoxSharedParameters.getInstance().setVideoPlayType(1);
// }
// }
// break;
// case 44:
// // 取description 字段,0:系统键盘 1:tsg自研键盘
// if (descriptionIsNotEmpty) {
// LogUtils.d("resultBean -- if 44:" + description);
//// if (description.equals("0")) {
//// ShowLogon.keybordStatus = 0;
//// } else {
//// ShowLogon.keybordStatus = 1;
//// }
// }
// break;
// case 47:
// // 取description EPG地址
// if (descriptionIsNotEmpty) {
// LogUtils.d("resultBean -- if 47:" + description);
// // BoxSharedParameters.getInstance().setEpgUrl(description);
// // BaseUrl.getSingleton().setHomeUrl(description);
// }
// break;
// case 53:
// // 取description 域名白名单
// if (descriptionIsNotEmpty) {
// LogUtils.d("resultBean -- if 53:" + description);
//// BaseWay.getSingleton().setcmdUrl(description);
//// BaseWay.getSingleton().setPassUrl(description);
// }
// break;
// case 56:
// // 取description 省测鉴权主接口
// if (descriptionIsNotEmpty) {
// LogUtils.d("resultBean -- if 56:" + description);
// BoxSharedParameters.getInstance().setProvInteface(description);
// }
// break;
// case 64:
// // 取status 1 :NATIVE 模式 2 :H5 模式
// LogUtils.d("resultBean -- if 64:" + status);
// BoxSharedParameters.getInstance().setLoadType(status);
//
// break;
// case 37:
// // 用户协议
// if (status == 1) {
// // 开
// isUserAgree = true;
// agreeDes = description;
// agreeLookDuration = resultBean.getLookDuration();
// LogUtils.d("resultBean -- if 37:" + description);
// LogUtils.d("resultBean -- if 37:" + agreeLookDuration);
// } else {
// isUserAgree = false;
// }
//
// break;
// case 61:
// //免杀白名单
// LogUtils.d("resultBean -- if 61:" + resultBean.getDescription());
//// if(!TextUtils.isEmpty(resultBean.getDescription())){
//// DifferenceData.UserLeaveHintDF.addNoKillPackage(Arrays.asList(resultBean.getDescription().split("@@@")));
//// }
//
// break;
// case VRPLAYURL_TYPE:
// // VR测试流
// vrTestUrl = resultBean.getCornerurl();
// LogUtils.d("resultBean -- if 21:" + vrTestUrl);
// break;
// case TRY_SEEING_TYPE:
// // 试看时长
// tryLookDuration = resultBean.getLookDuration();
// break;
// case TRY_SEEING_LIVE_TYPE:
// // 直播试看时长
// tryLiveDuration = resultBean.getLookDuration();
// break;
// case INDEX_SHIM_CODE:
// // 首页垫片 shimCode
// indexShimCode = resultBean.getShimCode();
// break;
// case GUANGDONG_IPTV_TID:
// // 广东iptv tid
// if (descriptionIsNotEmpty) {
// String tid = description.split("@@@")[0];
// String cpid = description.split("@@@")[1];
// SharedPreferenceUtils.put("guangdong","iptvTid",tid);
// SharedPreferenceUtils.put("guangdong","iptvCpid",cpid);
// LogUtils.d("resultBean --tid : "+tid);
// LogUtils.d("resultBean --cpid : "+cpid);
// }
// break;
// case SICHUAN_CDN:
// if (descriptionIsNotEmpty) {
// LogUtils.d("resultBean -- if 42:" + description);
// BoxSharedParameters.getInstance().setCdnInfo(description);
// }
// break;
default:
break;
}
}
//setData();
LogUtils.d("resultBean -- over ");
LogUtils.e("resultBean -- resultBean :执行over 前");
onPassData.onResponse(getSystemBean);
LogUtils.e("resultBean -- resultBean :执行over ");
} catch (Exception e) {
LogUtils.d("resultBean -- Exception " + e);
onPassData.onResponse(getSystemBean);
}
}
// private void setData() {
// String channelCodePs = SpTimeUtils.getInstance(ContextUtils.getContext()).getString("NewtvSdk_channelCode", "");
// String appKeyPs = SpTimeUtils.getInstance(ContextUtils.getContext()).getString("NewtvSdk_appKey", "");
// String appSecretPs = SpTimeUtils.getInstance(ContextUtils.getContext()).getString("NewtvSdk_appSecret", "");
// if (!TextUtils.isEmpty(channelCodePs) && !TextUtils.isEmpty(appKeyPs) && !TextUtils.isEmpty(appSecretPs)) {
// DifferenceData.NewtvSdk.channelCodePs = channelCodePs;
// DifferenceData.NewtvSdk.appKeyPs = appKeyPs;
// DifferenceData.NewtvSdk.appSecretPs = appSecretPs;
// }
// LogUtils.d("resultBean -- channelCodePs:" + DifferenceData.NewtvSdk.channelCodePs);
// }
public String getAgreeDes() {
return agreeDes;
}
public String getVrTestUrl() {
return vrTestUrl;
}
public int getAgreeLookDuration() {
return agreeLookDuration;
}
public int getTryLookDuration() {
if (tryLookDuration <= 0) {
tryLookDuration = 6;
}
return tryLookDuration;
}
public int getTryLiveDuration() {
if (tryLiveDuration <= 0) {
tryLiveDuration = 6;
}
return tryLiveDuration;
}
/**
* 获取首页垫片 shimCode
*
* @return 首页垫片 shimCode
*/
public String getIndexShimCode() {
return indexShimCode;
}
public interface OnPassData {
void onResponse(GetsystemBean getsystemBean);
void fail();
}
}