wangkai

添加模块

Showing 33 changed files with 3631 additions and 90 deletions

Too many changes to show.

To preserve performance only 33 of 33+ files are displayed.

... ... @@ -55,7 +55,13 @@ repositories {
dependencies {
// implementation 'androidx.appcompat:appcompat:1.6.1'
implementation "com.google.android.material:material:1.4.0"
//alpha 启动优化
implementation rootProject.ext.dependencies["alpha-start"]
implementation rootProject.ext.dependencies["androidxAppCompat"]
implementation rootProject.ext.dependencies["material"]
implementation project(':lib_base')
implementation project(path: ':wdinterfaceimpl')
implementation project(path: ':module_home')
// annotationProcessor 'com.alibaba:arouter-compiler:1.5.2'
}
\ No newline at end of file
... ...
... ... @@ -2,27 +2,36 @@
package com.wd.fastcoding.app;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.Nullable;
/**
* @ProjectName: PeopleDailyVideo
* @Package: com.people.displayui.main
* @ClassName: WelcomeActivity
* @Description: 启动APP过渡页面
* @Author: wd
* @CreateDate: 2022/10/28 17:36
* @UpdateUser: wd
* @UpdateDate: 2022/10/28 17:36
* @UpdateRemark: 更新说明:
* @Version: 1.0
*/
import com.wd.common.utils.ProcessUtils;
import com.wd.module_home.AppMainActivity;
public class MainActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 直接进入首页
/* 解决部分手机点击home键返回桌面后,再回到应用时,会先进入启动页的问题*/
if (!this.isTaskRoot()) {
Intent intent = getIntent();
if (intent != null) {
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(intent.getAction())) {
finish();
return;
}
}
}
// Intent intent = new Intent();
// intent.setClass(this, AppMainActivity.class);
// startActivity(intent);
ProcessUtils.goMainPage();
overridePendingTransition(0, 0);
finish();
}
}
... ...
... ... @@ -2,10 +2,14 @@
package com.wd.fastcoding.app;
import android.app.Application;
import android.util.Log;
import com.wd.capability.network.RetrofitClient;
import com.wd.common.interceptor.TokenInterceptor;
import com.wd.capability.router.ArouteInit;
import com.wd.foundation.wdkit.utils.CommonUtil;
import com.wd.fastcoding.app.start.StartTaskConfig;
import com.wd.fastcoding.app.start.StartTaskTool;
import com.wd.foundation.wdkitcore.tools.AppContext;
import com.wd.foundation.wdkitcore.tools.StringUtils;
/**
* @author devel
... ... @@ -15,12 +19,35 @@ public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Log.e("zzzz","MyApplication onCreate");
// TODO 初始化实际业务 test
AppContext.init(this,true);
// 第三方库初始化
if (isCurProcess()) {
initLibs();
// 主进程,只执行一次
// 启动初始化管理,子线程管理
StartTaskConfig taskConfig = new StartTaskConfig(this);
taskConfig.start();
StartTaskTool.startTaskInMain(this);
StartTaskTool.startPrivate(this);
StartTaskTool.startTaskInSplash(this);
}
}
/**
* 初始化第三方库
*/
private void initLibs() {
// 网络请求初始化,主线程立即调用
RetrofitClient.init(this, new TokenInterceptor(RetrofitClient.getInterceptorHosts()));
// 路由初始化,主线程立即调用
ArouteInit.getInstance().init(this);
}
/**
* 是否是主进程
* * @return true:是,false:否
*/
public boolean isCurProcess() {
String curProcessName = CommonUtil.getProcessName(this);
String name = getPackageName();
return StringUtils.isEmpty(curProcessName) || StringUtils.isEmpty(name) || name.equals(curProcessName);
}
}
... ...
... ... @@ -7,9 +7,9 @@ package com.wd.fastcoding.app.start;
import android.content.Context;
import android.util.Log;
import com.alibaba.android.alpha.AlphaManager;
import com.alibaba.android.alpha.Project;
import com.wd.fastcoding.app.task.MyTaskCreator;
import com.wd.base.starttask.AlphaManager;
import com.wd.base.starttask.Project;
/**
* 描述:启动初始化任务
... ...
... ... @@ -6,12 +6,8 @@ package com.wd.fastcoding.app.task;
import android.content.Context;
import com.alibaba.android.alpha.Task;
import com.wd.base.log.Logger;
import com.wd.base.starttask.Task;
//import com.people.kittools.constant.CommonConstant;
//import com.people.kittools.sp.SpUtils;
//import com.people.umeng.UmSdkHelper;
/**
* 描述:在主页初始化,不着急使用,进入主页用户必然已经同意隐私政策
... ...
... ... @@ -8,10 +8,9 @@ import java.lang.ref.WeakReference;
import android.content.Context;
import com.wd.base.starttask.Task;
import com.alibaba.android.alpha.Task;
//import com.people.kittools.file.MyFileUtils;
//import com.people.uiframework.CompComponent;
/**
* 描述:本地代码初始化context,都在子线程执行
... ...
... ... @@ -4,11 +4,11 @@
package com.wd.fastcoding.app.task;
import com.alibaba.android.alpha.Task;
import com.wd.base.log.AndroidLogAdapter;
import com.wd.base.log.FormatStrategy;
import com.wd.base.log.Logger;
import com.wd.base.log.PrettyFormatStrategy;
import com.wd.base.starttask.Task;
/**
* 描述:com.orhanobut.logger 初始化,子线程初始化
... ...
... ... @@ -7,8 +7,9 @@ package com.wd.fastcoding.app.task;
import android.content.Context;
import android.util.Log;
import com.wd.base.starttask.ITaskCreator;
import com.wd.base.starttask.Task;
import com.alibaba.android.alpha.ITaskCreator;
import com.alibaba.android.alpha.Task;
/**
* 描述:create task
... ...
... ... @@ -6,13 +6,9 @@ package com.wd.fastcoding.app.task;
import android.content.Context;
import com.wd.base.starttask.Task;
import com.alibaba.android.alpha.Task;
//import com.orhanobut.logger.Logger;
//import com.people.kittools.sp.SpUtils;
//import com.people.umeng.UmSdkHelper;
/**
* 描述:需要用户同意隐私政策的SDK初始化
... ...
... ... @@ -8,7 +8,8 @@ package com.wd.fastcoding.app.task;
//import com.wondertek.wheat.ability.scheduler.listener.IComponentRegister;
//import com.wondertek.wheat.ability.scheduler.listener.InitListener;
import com.wd.base.starttask.Task;
import com.alibaba.android.alpha.Task;
/**
* 描述:组件注册,反射多了影响性能
... ...
apply plugin: 'maven'
apply from: "config.gradle"
buildscript {
ext.kotlin_version = "1.4.32"
... ... @@ -11,17 +12,17 @@ buildscript {
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/releases' }
// //阿里云 maven
// maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
// maven { url 'https://maven.aliyun.com/repository/releases' }
//阿里云 maven
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/repository/releases' }
google()
// maven { url "https://jitpack.io" }
// //华为
// maven { url 'https://developer.huawei.com/repo/' }
// //阿里云QuickTracking
// maven { url 'https://repo1.maven.org/maven2/' }
maven { url "https://jitpack.io" }
//华为
maven { url 'https://developer.huawei.com/repo/' }
//阿里云QuickTracking
maven { url 'https://repo1.maven.org/maven2/' }
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven {
... ... @@ -37,6 +38,7 @@ buildscript {
classpath "com.android.tools.build:gradle:4.0.2"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.billy.android:autoregister:1.4.2'
classpath 'com.github.kezong:fat-aar:1.3.8'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
... ... @@ -53,20 +55,20 @@ allprojects {
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/releases' }
//阿里云 maven
// maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
// maven { url 'https://maven.aliyun.com/repository/releases' }
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/repository/releases' }
google()
// maven { url "https://jitpack.io" }
maven { url "https://jitpack.io" }
//华为
// maven { url 'https://developer.huawei.com/repo/' }
maven { url 'https://developer.huawei.com/repo/' }
//阿里云QuickTracking
// maven { url 'https://repo1.maven.org/maven2/' }
// maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
// maven {
// url 'https://maven.aliyun.com/nexus/content/repositories/google/'
// name 'aliyun-google'
// }
maven { url 'https://repo1.maven.org/maven2/' }
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven {
url 'https://maven.aliyun.com/nexus/content/repositories/google/'
name 'aliyun-google'
}
flatDir { dirs 'src/main/libs' }
... ... @@ -90,7 +92,7 @@ allprojects {
// 强制依赖
configurations.configureEach {
//exclude group: 'com.alipay.android.phone.thirdparty', module: 'securityguard-build'
exclude group: 'com.alipay.android.phone.thirdparty', module: 'securityguard-build'
resolutionStrategy {
force 'androidx.activity:activity:1.2.1'
force 'androidx.annotation:annotation:1.1.0'
... ... @@ -106,15 +108,15 @@ allprojects {
force 'androidx.fragment:fragment:1.3.1'
force 'androidx.lifecycle:lifecycle-common:2.3.0'
force 'androidx.multidex:multidex:2.0.1'
// force 'androidx.recyclerview:recyclerview:1.2.0'
// force 'androidx.vectordrawable:vectordrawable:1.1.0'
// force 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
// force 'com.squareup.okhttp3:okhttp:4.9.1'
// force 'com.squareup.okio:okio:2.7.0'
// force 'org.jetbrains.kotlin:kotlin-stdlib:1.4.32'
// force 'org.jetbrains.kotlin:kotilin-stdlib-jdk8:1.4.32'
// force 'org.jetbrains:annotations:15.0'
// force 'net.sf.proguard:proguard-base:6.1.0'
force 'androidx.recyclerview:recyclerview:1.2.0'
force 'androidx.vectordrawable:vectordrawable:1.1.0'
force 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
force 'com.squareup.okhttp3:okhttp:4.9.1'
force 'com.squareup.okio:okio:2.7.0'
force 'org.jetbrains.kotlin:kotlin-stdlib:1.4.32'
force 'org.jetbrains.kotlin:kotilin-stdlib-jdk8:1.4.32'
force 'org.jetbrains:annotations:15.0'
force 'net.sf.proguard:proguard-base:6.1.0'
}
}
}
... ...
ext {
isRelease = true
// version配置
versions = ["support-version": "1.2.0",
"room-version" : "2.4.3",]
// support配置
support = ["appcompat-v7" : "androidx.appcompat:appcompat:${versions["support-version"]}",
"recyclerview-v7" : "androidx.recyclerview:recyclerview:${versions["support-version"]}",
"support-fragment": "androidx.fragment:fragment:${versions["support-version"]}",
"constraintlayout": "androidx.constraintlayout:constraintlayout:2.0.4",
"annotation" : "androidx.annotation:annotation:1.1.0",
"kotlin-jdk" : "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32",]
// 依赖第三方配置
dependencies = ["rxjava" : "io.reactivex.rxjava2:rxjava:2.2.3",
"rxandroid" : "io.reactivex.rxjava2:rxandroid:2.1.0",
"okhttp" : "com.squareup.okhttp3:okhttp:4.9.1",
"retrofit" : "com.squareup.retrofit2:retrofit:2.9.0",
"converter-gson" : "com.squareup.retrofit2:converter-gson:2.9.0",
"adapter-rxjava" : "com.squareup.retrofit2:adapter-rxjava2:2.9.0",
// glide图片加载
"glide" : "com.github.bumptech.glide:glide:4.13.0",
"glide-compiler" : "com.github.bumptech.glide:compiler:4.13.0",
"glide-transformations" : "jp.wasabeef:glide-transformations:4.3.0",
// json解析
"gson" : "com.google.code.gson:gson:2.9.1",
"gsonfactory" : "com.github.getActivity:GsonFactory:6.3",
"lifecycle-extensions" : "androidx.lifecycle:lifecycle-extensions:2.0.0",
"lifecycle-compiler" : "androidx.lifecycle:lifecycle-compiler:2.0.0",
"multidex" : "com.android.support:multidex:1.0.3",
"refresh-layout" : "io.github.scwang90:refresh-layout-kernel:2.0.5",
"refresh-header" : "io.github.scwang90:refresh-header-classics:2.0.5",
"refresh-footer" : "io.github.scwang90:refresh-footer-classics:2.0.5",
"arouter-api" : "com.alibaba:arouter-api:1.5.2",
"arouter-compiler" : "com.alibaba:arouter-compiler:1.5.2",
"umsdk-share" : "com.umeng.umsdk:share-core:7.1.7",//分享核心库,必选
"umsdk-share-wx" : "com.umeng.umsdk:share-wx:7.1.7",
"umsdk-share-sina" : "com.umeng.umsdk:share-sina:7.1.7",
"umsdk-share-qq" : 'com.umeng.umsdk:share-qq:7.1.7',
"BaseRecyclerViewAdapterHelper": "com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.50",
"ucrop" : "com.github.yalantis:ucrop:2.2.1-native",
"fastjson" : "com.alibaba:fastjson:1.2.83",
"jsoup" : "org.jsoup:jsoup:1.14.3",
"material" : "com.google.android.material:material:1.4.0",
"banner" : "com.youth.banner:banner:2.1.0",
"googleflexbox" : "com.google.android.flexbox:flexbox:3.0.0",
"MagicIndicator" : "com.github.hackware1993:MagicIndicator:1.5.0",
"PagerIndicatorView" : "com.github.zhaohe9981:PagerIndicatorView:v200",
"html-textview" : "org.sufficientlysecure:html-textview:4.0",
"jetbrains-annotations" : "org.jetbrains:annotations:15.0",
"fresco" : "com.facebook.fresco:fresco:1.13.0",
"leanback" : "androidx.leanback:leanback:1.1.0-alpha03",
"eventbus" : "org.greenrobot:eventbus:3.1.1",
"tencent-opensdk" : "com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.8.0",
"tencent-qqopensdk" : 'com.tencent.tauth:qqopensdk:3.52.0',
// V5.4.7.1及之后版本的Android播放器SDK必须按以下操作配置License后,方可使用。播放器SDK现免费提供,License有效期为1年,1年后若无特殊约定我们将为您免费自动续期。License配置完成后,查看日志若无License相关报错,则表示License配置成功。使用5.4.6版本不用注册
"alirtcLivePusher" : "com.aliyun.sdk.android:AliyunPlayer:5.5.6.0-full",
"netWorkInternetSpeed" : "com.facebook.network.connectionclass:connectionclass:1.0.1",
"androidtagview" : "co.lujun:androidtagview:1.1.7",
"android-pickerView" : 'com.contrarywind:Android-PickerView:4.1.9',
// 日志
"orhanobut-logger" : 'com.orhanobut:logger:2.2.0',
// Alpha是一个基于PERT图构建的Android异步启动框架,它简单,高效,功能完善。
"alpha-start" : 'com.alibaba.android:alpha:1.0.0.1@aar',
"support-appcompat-v7" : 'com.android.support:appcompat-v7:28.0.0',
// 点赞效果
"jd-LikeButton" : 'com.github.jd-alexander:LikeButton:0.2.3',
// 折叠 textview
"expandableTextView" : 'cn.carbs.android:ExpandableTextView:1.0.3',
//高德定位和搜索
"gd-location" : 'com.amap.api:location:6.4.7',
"gd-search" : 'com.amap.api:search:9.4.0',
// QMUI
"qmui" : 'com.qmuiteam:qmui:2.0.0-alpha07',
// 权限请求框架:https://github.com/getActivity/XXPermissions
"xxPermissions" : 'com.github.getActivity:XXPermissions:16.8',
// lottie
"lottie" : "com.airbnb.android:lottie:5.2.0",
"pag" : "com.tencent.tav:libpag:4.3.33",
"desugar_jdk_libs" : "com.android.tools:desugar_jdk_libs:1.1.5",
"okhttp3-integration" : 'com.github.bumptech.glide:okhttp3-integration:4.3.1',
"toaster" : 'com.github.getActivity:Toaster:12.0',
"core-ktx" : 'androidx.core:core-ktx:1.6.0',
"TagTextView" : 'com.github.ChinaLike:TagTextView:0.2.0',
"androidxAppCompat" : 'androidx.appcompat:appcompat:1.6.1',]
}
... ...
... ... @@ -36,28 +36,27 @@ android {
}
dependencies {
api fileTree(include: ['commons-lang3-3.0.jar'], dir: 'src/main/commonlibs')
// 快马基础库
api 'com.wd:wdkitcore:1.0.5'
api 'com.wd:wdkit:1.0.1'
api 'com.wd:wdnetwork:1.0.0'
api 'com.wd:wdinterface:1.0.3'
// api 'com.wd:servicekit:1.0.3'
api 'com.wd:wdrouter:1.0.0'
api 'com.wd:log:1.0.1'
api 'com.wd:startup:1.0.0'
api project(path: ':wdrouter')
api project(path: ':wdlog')
api project(path: ':wdkit')
api project(path: ':wdnetwork')
// 基础依赖库
api 'com.alibaba:arouter-api:1.5.2'
api 'com.squareup.okhttp3:okhttp:4.8.0'
api 'com.squareup.retrofit2:retrofit:2.9.0'
api 'com.squareup.retrofit2:converter-gson:2.9.0'
api 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'
//rxjava
api 'io.reactivex.rxjava2:rxjava:2.2.8'
api 'io.reactivex.rxjava2:rxandroid:2.1.0'
//解析bean
api 'com.alibaba:fastjson:1.2.62'
api 'com.airbnb.android:lottie:5.2.0'
api 'androidx.appcompat:appcompat:1.2.0'
api 'androidx.lifecycle:lifecycle-extensions:2.2.0'
// api 'com.wd:wdkitcore:1.0.5'
// api 'com.wd:wdkit:1.0.1'
// api 'com.wd:wdnetwork:1.0.0'
// api 'com.wd:wdinterface:1.0.3'
// api 'com.wd:servicekit:1.0.3'
// api 'com.wd:wdrouter:1.0.0'
// api 'com.wd:log:1.0.1'
// api 'com.wd:startup:1.0.0'
api rootProject.ext.dependencies["lifecycle-extensions"]
api rootProject.ext.dependencies["lifecycle-compiler"]
api rootProject.ext.dependencies["refresh-layout"]// 核心必须依赖
api rootProject.ext.dependencies["refresh-header"]// 经典刷新头
api rootProject.ext.dependencies["refresh-footer"]// 经典加载
}
\ No newline at end of file
... ...
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.wd.fastcoding.base">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.REORDER_TASKS" />
</manifest>
\ No newline at end of file
... ...
package com.wd.common;
import com.wd.foundation.wdkit.mvvm.vm.BaseViewModel;
/**
* 注意判断网络请求 问题
*/
public class UIViewModel extends BaseViewModel {
}
... ...
package com.wd.common.adv;
import com.wd.foundation.bean.adv.CompAdvBean;
import com.wd.foundation.wdkit.utils.TimeUtil;
import com.wd.foundation.wdkitcore.tools.ArrayUtils;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
/**
* 广告工具类
* @author baozhaoxin
* @version [V1.0.0, 2023/10/30]
* @since V1.0.0
*/
public class AdvUtils {
/**
* 根据开屏广告规则,获取符合条件的数据
* @param launchAdInfo
* @return
*/
public static CompAdvBean getLaunchAdInfoForRule(List<CompAdvBean> launchAdInfo){
if(ArrayUtils.isEmpty(launchAdInfo)){
return null;
}
//A、按时间维度过滤数据
List<CompAdvBean> timeDatas = AdvUtils.getDataForTime(launchAdInfo);
if(ArrayUtils.isEmpty(timeDatas)){
return null;
}
//B、根据displayRound维度,获取符合条件的数据
CompAdvBean compAdvBean = AdvUtils.getDataForDisplayRound(timeDatas);
return compAdvBean;
}
/**
* 获取符合时间要求的广告数据
* @param advBeanList
* @return
*/
public static List<CompAdvBean> getDataForTime(List<CompAdvBean> advBeanList){
if(ArrayUtils.isEmpty(advBeanList)){
return null;
}
long serverTimeLong = TimeUtil.millis();
List<CompAdvBean> newDatas = new ArrayList<>();
for (CompAdvBean compAdvBean : advBeanList) {
// 检测投放开始和结束日期
/*String startTimeStr = compAdvBean.getStartTime();
String endTimeStr = compAdvBean.getEndTime();*/
/*long startLong = TimeUtil.jsonToTimeInMillis2(startTimeStr);
long endLong = TimeUtil.jsonToTimeInMillis2(endTimeStr);*/
//现在接口返回的是时间戳
long startLong = compAdvBean.getStartTime();
long endLong = compAdvBean.getEndTime();
if (serverTimeLong >= startLong && serverTimeLong <= endLong) {
//符合开始时间和结束时间要求
newDatas.add(compAdvBean);
}
}
return newDatas;
}
/**
* 根据displayRound维度,获取符合条件的数据
* @param advBeanList
* @return
*/
public static CompAdvBean getDataForDisplayRound(List<CompAdvBean> advBeanList){
if(ArrayUtils.isEmpty(advBeanList)){
return null;
}
int totalRounds = 0;
for (CompAdvBean compAdvBean : advBeanList) {
totalRounds = totalRounds + compAdvBean.getDisplayRound();
}
CompAdvBean resultAdvBean = null;
try {
SecureRandom random = new SecureRandom();
double randomNumber = random.nextDouble();
double adProbability = 0;
for (CompAdvBean compAdvBean : advBeanList) {
int adRound = compAdvBean.getDisplayRound();
double temp = (double) adRound / totalRounds;
adProbability = temp + adProbability;
if (randomNumber < adProbability && adRound > 0) {
resultAdvBean = compAdvBean;
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return resultAdvBean;
}
}
... ...
package com.wd.common.adv;
import android.app.Activity;
import android.content.Context;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.FrameLayout;
import com.wd.common.utils.GrayManager;
import com.wd.common.utils.ProcessUtils;
import com.wd.common.widget.floating.DragView;
import com.wd.foundation.bean.adv.AdvertsBean;
import com.wd.foundation.bean.adv.AdvsRuleBean;
import com.wd.foundation.bean.adv.CompAdvBean;
import com.wd.foundation.bean.adv.CompAdvMatInfoBean;
import com.wd.foundation.bean.adv.CompAdvSlotInfoBean;
import com.wd.foundation.bean.custom.comp.PageBean;
import com.wd.foundation.bean.custom.content.ContentBean;
import com.wd.foundation.wdkit.system.FastClickUtil;
import com.wd.foundation.wdkitcore.tools.ArrayUtils;
import com.wd.foundation.wdkitcore.tools.StringUtils;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* @Description: 挂角广告
* @Author: Li Yubing
* @Email: liyubing@wondert.com.cn
* @CreateDate: 2023/5/4 16:11
* @Version: 1.0
*/
public class CornerAdvLogic {
/**
* 挂角广告(左边)
*/
DragView leftDragView;
/**
* 挂角广告(右边)
*/
DragView rightDragView;
/**
* 0:默认类型
* 1:系统状态栏
*/
private int dragViewType = 0;
/**
* 左挂角广告是否点击过关闭
*/
private boolean isLeftDragViewClose = false;
/**
* 右挂角广告是否点击过关闭
*/
private boolean isRightDragViewClose = false;
private Activity activity;
/**
* 本地记录展示的广告数据(只有广告中心挂角才需要缓存)
*/
private CompAdvBean localCompAdvBean = null;
/**
* 本地记录展示的PageBean数据
*/
private PageBean localPageBean = null;
private String linkType = "";
public CornerAdvLogic(Activity activity) {
this.activity = activity;
}
public void setDragViewType(int dragViewType) {
this.dragViewType = dragViewType;
}
/**
* 处理挂角广告view 展示逻辑
*/
public void handlerAdLogic(Context mContext, PageBean mPageBean, boolean contryGrayFlag,
Window window,boolean isResume) {
if(isResume && localCompAdvBean != null){
//页面获取焦点且上次有展示的挂角,直接展示
removeAllDragView(false);
showCornersAdv2(mContext,localCompAdvBean,mPageBean,contryGrayFlag,window,true,
null);
return;
}else{
//false为接口刷新,更新挂角显示
isLeftDragViewClose = false;
isRightDragViewClose = false;
}
removeAllDragView(true);
if (mPageBean == null) {
return;
}
if (mPageBean.isHasAdInfo() && mPageBean.getCornersAdv() != null) {
// 优先展示展现中心广告
showDragView(mPageBean.getCornersAdv(), mPageBean, contryGrayFlag, window);
} else if (!ArrayUtils.isEmpty(mPageBean.getCornersAdv2())) {
// 广告中心-挂角广告信息
List<CompAdvBean> cornersAdv2 = mPageBean.getCornersAdv2();
List<CompAdvBean> compAdvBeanList = handlerCornersAdv2Data(mContext,cornersAdv2,mPageBean);
if(ArrayUtils.isEmpty(compAdvBeanList)){
return;
}
CompAdvBean compAdvBean = compAdvBeanList.get(0);
showCornersAdv2(mContext,compAdvBean,mPageBean,contryGrayFlag,window,false,
compAdvBeanList);
}
}
/**
* 显示挂角广告
*
* @param cornersAdBean
*/
private void showDragView(AdvsRuleBean cornersAdBean, PageBean mPageBean,
boolean contryGrayFlag, Window window) {
ViewGroup.LayoutParams lp =
new ViewGroup.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
if ("left_down".equals(cornersAdBean.getPos())) {
if (isLeftDragViewClose) {
return;
}
if (cornersAdBean.getAdvert() == null) {
return;
}
if (leftDragView != null && leftDragView.getParent() != null) {
((ViewGroup) leftDragView.getParent()).removeView(leftDragView);
}
leftDragView = new DragView(activity, cornersAdBean, dragViewType);
if (contryGrayFlag) {
//处理挂角国殇模式
GrayManager.getInstance().setLayerGrayType(leftDragView);
}
// superRootLayout.addView(leftDragView, lp);
ViewGroup viewgroup = (ViewGroup) window.getDecorView();
viewgroup.addView(leftDragView,lp);
if (leftDragView.getAdvertsBean() != null) {
// 挂角广告埋点-曝光事件
// AdvsTrack.dragViewContentTrack(0, mPageBean, cornersAdBean);
}
leftDragView.setOnDragViewClick(new DragView.DragViewClickListener() {
@Override
public void onImgClick() {
if (FastClickUtil.isFastClick()) {
return;
}
if (leftDragView.getAdvertsBean() != null) {
// 挂角广告埋点-点击事件
// AdvsTrack.dragViewContentTrack(1, mPageBean, cornersAdBean);
dragViewJump(leftDragView.getAdvertsBean());
}
}
@Override
public void onCloseClick() {
isLeftDragViewClose = true;
removeLeftDragView();
}
});
} else {
if (isRightDragViewClose) {
return;
}
if (cornersAdBean.getAdvert() == null) {
return;
}
if (rightDragView != null && rightDragView.getParent() != null) {
((ViewGroup) rightDragView.getParent()).removeView(rightDragView);
}
rightDragView = new DragView(activity, cornersAdBean, dragViewType);
if (contryGrayFlag) {
//处理挂角国殇模式
GrayManager.getInstance().setLayerGrayType(rightDragView);
}
// superRootLayout.addView(rightDragView, lp);
// window.addContentView(rightDragView,lp);
ViewGroup viewgroup = (ViewGroup) window.getDecorView();
viewgroup.addView(rightDragView,lp);
if (rightDragView.getAdvertsBean() != null) {
// 挂角广告埋点-曝光事件
// AdvsTrack.dragViewContentTrack(0, mPageBean, cornersAdBean);
}
rightDragView.setOnDragViewClick(new DragView.DragViewClickListener() {
@Override
public void onImgClick() {
if (FastClickUtil.isFastClick()) {
return;
}
if (rightDragView.getAdvertsBean() != null) {
// 挂角广告埋点-点击事件
// AdvsTrack.dragViewContentTrack(1, mPageBean, cornersAdBean);
dragViewJump(rightDragView.getAdvertsBean());
}
}
@Override
public void onCloseClick() {
isRightDragViewClose = true;
removeRightDragView();
}
});
}
}
/**
* 移除挂角广告
* @param clearLocalData 是否清除本地的广告数据(只有广告中心挂角才需要)
*/
public void removeAllDragView(boolean clearLocalData) {
removeLeftDragView();
removeRightDragView();
if(clearLocalData){
localCompAdvBean = null;
}
}
/**
* 移除左边挂角广告
*/
private void removeLeftDragView() {
if (leftDragView != null && leftDragView.getParent() != null) {
((ViewGroup) leftDragView.getParent()).removeView(leftDragView);
}
}
/**
* 移除右边挂角广告
*/
private void removeRightDragView() {
if (rightDragView != null && rightDragView.getParent() != null) {
((ViewGroup) rightDragView.getParent()).removeView(rightDragView);
}
}
/**
* 挂角广告跳转
*
* @param advertsBean
*/
private void dragViewJump(AdvertsBean advertsBean) {
if (advertsBean == null) {
return;
}
ContentBean contentBean = new ContentBean();
contentBean.setLinkUrl(advertsBean.getLinkUrl());
contentBean.setPageId(advertsBean.getPageId());
contentBean.setObjectId(advertsBean.getObjectId());
contentBean.setObjectLevel(advertsBean.getObjectLevel());
contentBean.setObjectType(advertsBean.getObjectType());
contentBean.setBottomNavId(advertsBean.getBottomNavId());
contentBean.setRelId(advertsBean.getRelId());
if(advertsBean.getShareInfo() != null){
contentBean.setShowH5Share(true);
contentBean.setShareInfo(advertsBean.getShareInfo());
}
//专题模板 --->专题样式 1:常规, 2:作者, 3:时间线
// contentBean.setTopicTemplate(advertsBean.getTopicTemplate());
ProcessUtils.processPage(contentBean);
}
/**
* 处理广告中心挂角数据
* @param mContext
* @param cornersAdv2
* @param mPageBean
* @return
*/
private List<CompAdvBean> handlerCornersAdv2Data(Context mContext,List<CompAdvBean> cornersAdv2,
PageBean mPageBean){
if(mPageBean == null){
return null;
}
if(ArrayUtils.isEmpty(cornersAdv2)){
return null;
}
//A、按时间维度过滤数据
List<CompAdvBean> timeDatas = AdvUtils.getDataForTime(cornersAdv2);
if(ArrayUtils.isEmpty(timeDatas)){
return null;
}
//接口返回的数据已经过滤了符合时间规则的数据——页面会有缓存数据
// List<CompAdvBean> timeDatas = cornersAdv2;
int size = timeDatas.size();
if (size > 1) {
//B、按展现优先级维度 数值越小,等级越高
Collections.sort(timeDatas, new Comparator<CompAdvBean>() {
@Override
public int compare(CompAdvBean p1, CompAdvBean p2) {
return p1.getDisplayPriority() - p2.getDisplayPriority();
}
});
// C、 依据 展示的次数来过滤数据
//查询缓存数据,设置展示的次数
// for (CompAdvBean compAdvBean:timeDatas) {
// String pageId = mPageBean.getId();
// String advId = compAdvBean.getId() + "";
// CornersAdvModel cornersAdvModel = CornersAdvDaoHelper.getInstance(mContext).
// getByPageIdAndAdvId(pageId,advId);
// if(cornersAdvModel != null){
// compAdvBean.setShowCount(cornersAdvModel.showCount);
// }
// }
//通过展示次数进行排序,升序
Collections.sort(timeDatas, new Comparator<CompAdvBean>() {
@Override
public int compare(CompAdvBean p1, CompAdvBean p2) {
return p1.getShowCount() - p2.getShowCount();
}
});
}
return timeDatas;
}
/**
* 展示广告中心-挂角广告信息
* @param mContext
* @param compAdvBean
* @param mPageBean
* @param contryGrayFlag
* @param window
*/
private void showCornersAdv2(Context mContext,CompAdvBean compAdvBean, PageBean mPageBean,
boolean contryGrayFlag, Window window,boolean isResume,
List<CompAdvBean> compAdvBeanList) {
if(mPageBean == null){
return;
}
if(compAdvBean == null ){
return;
}
compAdvBean.setPageId(mPageBean.getId());
CompAdvMatInfoBean compAdvMatInfoBean = compAdvBean.getMatInfo();
if(compAdvMatInfoBean == null){
return;
}
if(ArrayUtils.isEmpty(compAdvMatInfoBean.getMatImageUrl())){
return;
}
CompAdvSlotInfoBean compAdvSlotInfoBean = compAdvBean.getSlotInfo();
if(compAdvSlotInfoBean == null){
return;
}
localPageBean = mPageBean;
localCompAdvBean = compAdvBean;
// if(!isResume){
// //不是获取焦点
// int count = 0;
// String pageId = mPageBean.getId();
// String advId = compAdvBean.getId() + "";
// CornersAdvModel cornersAdvModel = CornersAdvDaoHelper.getInstance(mContext).
// getByPageIdAndAdvId(pageId,advId);
// if(cornersAdvModel == null){
// //缓存中没有,为新广告,展示时存入缓存
// cornersAdvModel = new CornersAdvModel();
// cornersAdvModel.showCount = 1;
// cornersAdvModel.pageId = pageId;
// cornersAdvModel.advId = advId;
// cornersAdvModel.keys = pageId+"_"+advId;
// CornersAdvDaoHelper.getInstance(mContext).insert(cornersAdvModel);
// count = 1;
// }else {
// int showCount = compAdvBean.getShowCount();
// if(showCount == 0){
// cornersAdvModel.showCount = 1;
// count = 1;
// CornersAdvDaoHelper.getInstance(mContext).insert(cornersAdvModel);
// }
// }
// if(!ArrayUtils.isEmpty(compAdvBeanList)){
//
// for (CompAdvBean bean:compAdvBeanList) {
// if(bean.getShowCount() == 1){
// count++;
// }
// }
// if(count == compAdvBeanList.size()){
// //新一轮开始
// CornersAdvDaoHelper.getInstance(mContext).updateAllShowCountTo0();
// }
// }
// }
ViewGroup.LayoutParams lp =
new ViewGroup.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT);
if (compAdvSlotInfoBean.getPosition() == 0) {
if (isLeftDragViewClose) {
return;
}
if (leftDragView != null && leftDragView.getParent() != null) {
((ViewGroup) leftDragView.getParent()).removeView(leftDragView);
}
leftDragView = new DragView(activity, compAdvBean, dragViewType);
if (contryGrayFlag) {
//处理挂角国殇模式
GrayManager.getInstance().setLayerGrayType(leftDragView);
}
// superRootLayout.addView(leftDragView, lp);
// window.addContentView(leftDragView,lp);
ViewGroup viewgroup = (ViewGroup) window.getDecorView();
viewgroup.addView(leftDragView,lp);
if (leftDragView.getCompAdvBean() != null) {
// 挂角广告埋点-曝光事件
// AdvsTrack.dragViewContentTrack(0, mPageBean, cornersAdBean);
}
leftDragView.setOnDragViewClick(new DragView.DragViewClickListener() {
@Override
public void onImgClick() {
if (FastClickUtil.isFastClick()) {
return;
}
if (leftDragView.getCompAdvBean() != null) {
// 挂角广告埋点-点击事件
// AdvsTrack.dragViewContentTrack(1, mPageBean, cornersAdBean);
dragViewJump(mContext,leftDragView.getCompAdvBean());
}
}
@Override
public void onCloseClick() {
isLeftDragViewClose = true;
removeLeftDragView();
}
});
} else {
if (isRightDragViewClose) {
return;
}
if (rightDragView != null && rightDragView.getParent() != null) {
((ViewGroup) rightDragView.getParent()).removeView(rightDragView);
}
rightDragView = new DragView(activity, compAdvBean, dragViewType);
if (contryGrayFlag) {
//处理挂角国殇模式
GrayManager.getInstance().setLayerGrayType(rightDragView);
}
// superRootLayout.addView(rightDragView, lp);
// window.addContentView(rightDragView,lp);
ViewGroup viewgroup = (ViewGroup) window.getDecorView();
viewgroup.addView(rightDragView,lp);
if (rightDragView.getCompAdvBean() != null) {
// 挂角广告埋点-曝光事件
// AdvsTrack.dragViewContentTrack(0, mPageBean, cornersAdBean);
}
rightDragView.setOnDragViewClick(new DragView.DragViewClickListener() {
@Override
public void onImgClick() {
if (FastClickUtil.isFastClick()) {
return;
}
if (rightDragView.getCompAdvBean() != null) {
// 挂角广告埋点-点击事件
// AdvsTrack.dragViewContentTrack(1, mPageBean, cornersAdBean);
dragViewJump(mContext,rightDragView.getCompAdvBean());
}
}
@Override
public void onCloseClick() {
isRightDragViewClose = true;
removeRightDragView();
}
});
}
}
/**
* 广告中心挂角广告跳转
* @param mContext
* @param compAdvBean
*/
private void dragViewJump(Context mContext,CompAdvBean compAdvBean) {
if (compAdvBean == null) {
return;
}
CompAdvMatInfoBean matInfoBean = compAdvBean.getMatInfo();
if(matInfoBean == null){
return;
}
//优先openType,再取linkType
if (StringUtils.isNotBlank(matInfoBean.getOpenType())){
linkType = matInfoBean.getOpenType();
}else {
linkType = matInfoBean.getLinkType();
}
if(StringUtils.isEqual("0",linkType)){
// 0:无链接;
return;
}
String linkUrl = matInfoBean.getLinkUrl();
if(StringUtils.isEmpty(linkUrl)){
return;
}
if(StringUtils.isEqual("1",linkType)){
//内链
// ProcessUtils.goToH5Page(new ContentBean(linkUrl));
}else if(StringUtils.isEqual("2",linkType)){
//外链
// ProcessUtils.jumpBrowser(mContext,linkUrl);
}
}
}
... ...
package com.wd.common.api;
import com.wd.capability.network.bean.TokenBean;
import com.wd.capability.network.response.BaseResponse;
import io.reactivex.Observable;
import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Header;
import retrofit2.http.POST;
/**
* 描述:接口定义
*
* @author : lvjinhui
* @since: 2022/12/15
*/
public interface IRefreshToken {
@POST("api/rmrb-user-center/auth/zh/c/refreshToken")
Call<BaseResponse<TokenBean>> getJwtToken(@Header("RMRB-X-TOKEN")String token, @Body RequestBody body);
@POST("api/rmrb-user-center/auth/zh/c/refreshToken")
Observable<BaseResponse<TokenBean>> getJwtTokenForJS(@Header("RMRB-X-TOKEN")String token, @Body RequestBody body);
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2022. All rights reserved.
*/
package com.wd.common.api;
import com.wd.capability.network.response.BaseResponse;
import com.wd.foundation.bean.comment.DisplayWorkInfoBean;
import com.wd.foundation.bean.custom.comp.CompBean;
import com.wd.foundation.bean.custom.comp.GroupBean;
import com.wd.foundation.bean.custom.comp.PageBean;
import com.wd.foundation.bean.live.RoomDataBean;
import com.wd.foundation.bean.paper.PaperBean;
import com.wd.foundation.bean.paper.PaperNumInforListBean;
import com.wd.foundation.bean.response.AreaTreeselectBean;
import com.wd.foundation.bean.response.BottomNavBean;
import com.wd.foundation.bean.response.ContentPageListBean;
import com.wd.foundation.bean.response.FollowBean;
import com.wd.foundation.bean.response.FollowListIndexBean;
import com.wd.foundation.bean.response.FollowWorksBean;
import com.wd.foundation.bean.response.LiveStatusBean;
import com.wd.foundation.bean.response.MasterFollowsStatusBean;
import com.wd.foundation.bean.response.PageTopNavBean;
import com.wd.foundation.bean.response.PersonalInfoBean;
import com.wd.foundation.bean.response.VideoItemBean;
import java.util.List;
import java.util.Map;
import io.reactivex.Observable;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
/**
* 请求的接口
*
* @author shishuagnxi
*/
public interface RequestApi {
/**
* 底部导航栏列表接口,底部导航栏
*/
@GET("api/rmrb-bff-display-zh/display/zh/c/bottomNavGroup")
Observable<BaseResponse<BottomNavBean>> getBottomNavGroup();
/**
* 根据底部导航栏id获取导航栏信息,头部频道
*/
@GET("api/rmrb-bff-display-zh/display/zh/c/bottomNavGroup/detail")
Observable<BaseResponse<PageTopNavBean>> getTopNavDetail(@QueryMap Map<String, Object> map);
/**
* 根据底部导航栏id获取导航栏信息V1.0--除默认启动时间线频道第一页情况外使用
*/
@GET("api/rmrb-bff-display-zh/display/zh/c/pageInfo")
Observable<BaseResponse<PageBean>> getPageData(@QueryMap Map<String, Object> map);
/**
* 根据底部导航栏id获取导航栏信息V1.0---热点频道第一页数据使用该接口,pageInfo合并了compInfo数据
*/
@GET("api/rmrb-bff-display-zh/display/zh/c/pageInfo/v2")
Observable<BaseResponse<PageBean>> getPageDataV2(@QueryMap Map<String, Object> map);
/**
* 根据楼层Id获取组件节目信息V1.0,【推荐频道】
*/
@GET("api/rmrb-bff-display-zh/display/zh/c/rec/compInfo")
Observable<BaseResponse<GroupBean>> getRecGroupData(@QueryMap Map<String, Object> map);
/**
* 根据楼层Id获取组件节目信息V1.0
*/
@GET("api/rmrb-bff-display-zh/display/zh/c/compInfo")
Observable<BaseResponse<GroupBean>> getGroupData(@QueryMap Map<String, Object> map);
/**
* 一级沉浸式视频推荐
* 4.2 视频分页列表
*/
@GET("prod-api/content/content/list")
Observable<BaseResponse<List<VideoItemBean>>> getImmersiveRecommend(@QueryMap Map<String, Object> map);
/**
* 一级二级 批量查询视频详情
* ids number []
* 点播播放详情批量查询
*/
@POST("prod-api/content/content/detail")
Observable<BaseResponse<List<VideoItemBean>>> getBatchShortPlayDetail(@Body RequestBody body);
/**
* 一级二级 查询单个视频详情
*/
@GET("prod-api/content/content/{id}")
Observable<BaseResponse<VideoItemBean>> getShortPlayDetail(@Query("Id") String Id);
/**
* 二级 推荐数据列表
*/
@GET("prod-api/content/content/current/list")
Observable<BaseResponse<List<VideoItemBean>>> getRecommendList(@QueryMap Map<String, Object> map);
/**
* 获取指定日期电子报版面信息
*
* @return
*/
@GET("api/rmrb-bff-display-zh/display/zh/c/paperApi/paperTime")
Observable<BaseResponse<List<PaperNumInforListBean>>> paperTime(@QueryMap Map<String, Object> map);
/**
* 获取电子报版面数据
*
* @return
*/
@GET("api/rmrb-bff-display-zh/display/zh/c/paperApi/paperList")
Observable<BaseResponse<PaperBean>> paperList(@QueryMap Map<String, Object> map);
/**
* 获取电子报版面数据-查询最近一期电子报的首个版面信息
*
* @return
*/
@GET("api/rmrb-bff-display-zh/display/zh/c/paperApi/firstPaper")
Observable<BaseResponse<PaperBean>> firstPaperList(@QueryMap Map<String, Object> map);
/**
* 一键读报
*
* @return
*/
@GET("api/rmrb-bff-display-zh/content/zh/c/newsPaper/read")
Observable<BaseResponse<ContentPageListBean>> oneKeyRead(@QueryMap Map<String, Object> map);
/**
* 获取已发布默认词
*/
@GET("api/rmrb-search-api/zh/c/hints")
Observable<BaseResponse<List<String>>> getSearchHints();
/**
* 兴趣标签卡选择标签
* @param body
* @return
*/
@POST("api/rmrb-user-center/user/zh/c/tag/updateUserTagWord")
Observable<BaseResponse<Object>> updateUserTagWord(@Body RequestBody body);
/**
* 直播内容回顾、预约组件-更多(预约列表)
*
* @return
*/
@GET("api/rmrb-bff-display-zh/display/zh/c/channel/live/reviewList")
Observable<BaseResponse<ContentPageListBean>> queryLiveChannelReviewList(@QueryMap Map<String, Object> map);
/**
* 直播月度排行列表
*
* @return
*/
@GET("api/rmrb-bff-display-zh/display/zh/c/channel/live/browseList")
Observable<BaseResponse<ContentPageListBean>> queryLiveChannelBrowseList(@QueryMap Map<String, Object> map);
/**
* 直播频道直播列表
*
* @return
*/
@GET("api/rmrb-bff-display-zh/display/zh/c/channel/live/list")
Observable<BaseResponse<ContentPageListBean>> queryLiveChannelList(@QueryMap Map<String, Object> map);
/**
* 批查直播状态
*
* @param liveIds
* @return
*/
@GET("api/rmrb-bff-content/b/zh/content/c/liveRoom/batch/liveStatus")
Observable<BaseResponse<List<LiveStatusBean>>> getLiveStatus(@Query("liveIds") String liveIds);
/**
* 获取行政区
*/
@Headers({"urlname:https://restapi.amap.com/"})
@GET("v3/config/district")
Observable<ResponseBody> getDistrictData(@QueryMap Map<String, Object> map);
/**
* 中文端的
*/
@GET("api/rmrb-content-center/c/service/sys-area/treeselect")
Observable<BaseResponse<List<AreaTreeselectBean>>> getAreaReveal(@Query("md5") String md5);
/**
* 获取二级地理信息
* @return
*/
@GET("api/rmrb-content-center/zh/c/sys-area/treeList")
Observable<BaseResponse<List<AreaTreeselectBean>>> getTreeList();
/**
* (关注/取消关注)
*/
@POST("api/rmrb-interact/interact/zh/c/attention/operation")
Observable<BaseResponse<Object>> postFocusUser(@Body RequestBody body);
/**
* 一键关注接口
*/
@POST("api/rmrb-interact/interact/zh/c/attention/batch")
Observable<BaseResponse<Object>> batchAttention(@Body RequestBody body);
/**
* 批量查询创作者的关注状态
*
* @param map
* @return
*/
@POST("api/rmrb-interact/interact/zh/c/batchAttention/status")
Observable<BaseResponse<List<MasterFollowsStatusBean>>> getBatchAttentionStatus(@Body RequestBody map);
/**
* 我的关注列表查询
* @param map
*/
@GET("api/rmrb-interact/interact/zh/c/attention/list")
Observable<BaseResponse<FollowListIndexBean>> getAttentionList(@QueryMap Map<String, Object> map);
/**
* 客态查看别人的关注列表
* @param map
* @return
*/
@GET("api/rmrb-interact/interact/zh/c/userAttention/list")
Observable<BaseResponse<FollowListIndexBean>> getUserAttentionList(@QueryMap Map<String, Object> map);
/**
* 人民号关注页面 --人民号号主推荐
*
* @return
*/
@POST("api/rmrb-bff-display-zh/recommend/zh/c/rmh")
Observable<BaseResponse<List<FollowBean>>> recommendMaterList(@Body RequestBody map);
/**
* 我关注的创作者发布的内容列表查询
*
* @return
*/
@POST("api/rmrb-bff-display-zh/content/zh/c/attention/contentList")
Observable<BaseResponse<FollowWorksBean>> contentList(@Body RequestBody map);
/**
* 批量查询当前内容——用户点赞、收藏状态
*/
@POST("api/rmrb-interact/interact/zh/c/batchLikeAndCollect/status")
Observable<BaseResponse<List<DisplayWorkInfoBean>>> batchLikeAndCollectStatus(@Body RequestBody body);
/**
* C端批量查询直播信息
*/
@GET("api/live-center-message/zh/a/live/room/number/batch/all")
Observable<BaseResponse<List<RoomDataBean>>> getRoomBatchData(@QueryMap Map<String, Object> map);
/**
* 批量查询创作者信息
*/
@POST("api/rmrb-contact/contact/zh/c/master/detailList")
Observable<BaseResponse<List<PersonalInfoBean>>> getMasterInfoListData(@Body() RequestBody body);
/**
* 本地问政卡刷新接口
*/
@GET("api/rmrb-bff-display-zh/display/zh/c/compInfo/localAsk")
Observable<BaseResponse<CompBean>> localAsk(@QueryMap Map<String, Object> map);
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2022. All rights reserved.
*/
package com.wd.common.base;
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.TypedArray;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.Observer;
import com.wd.base.log.Logger;
import com.wd.capability.network.constant.NetConstant;
import com.wd.capability.router.data.ActionBean;
import com.wd.capability.router.data.RouterParameter;
import com.wd.capability.network.constant.EventConstants;
import com.wd.common.dialog.DialogUtils;
import com.wd.common.dialog.FlowTooBigDialog;
import com.wd.common.permissions.IPmsCallBack;
import com.wd.common.permissions.PermissionsUtils;
import com.wd.common.utils.NotificationUtils;
import com.wd.common.utils.ProcessUtils;
import com.wd.common.utils.ToolsUtil;
import com.wd.common.widget.CustomTitleBar;
import com.wd.common.widget.DefaultView;
import com.wd.fastcoding.base.R;
import com.wd.foundation.bean.livedate.NetStateMessage;
import com.wd.foundation.wdkit.mvvm.base.BaseMvvmActivity;
import com.wd.foundation.wdkit.statusbar.StatusBarCompat;
import com.wd.foundation.wdkit.statusbar.StatusBarStyleEnum;
import com.wd.foundation.wdkit.utils.SpUtils;
import com.wd.foundation.wdkitcore.livedata.LiveDataBus;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* Activity的基类<BR>
*
* @author zhangbo
* @version [V1.0.0, 2020/10/24]
* @since V1.0.0
*/
public abstract class BaseActivity extends BaseMvvmActivity implements CustomTitleBar.TitleBarClickListener, NotificationUtils.NotificationListener, StatusBarCompat.NavigationBarInterface {
private NotificationUtils notificationUtils;
protected static final int SEL_TYPE_PIC = 0;
protected static final int SEL_TYPE_VIDEO = 1;
protected static final int SEL_TYPE_ALL = 2;
/**
* 记录开启页面时间
*/
private long startTime;
/**
* 浏览时长
*/
public long duration;
/**
* 是否第一次加载
*/
protected boolean isFirstLoad = true;
/**
* tag
*/
private static final String TAG = "BaseActivity";
/**
* 导航栏控件
*/
protected CustomTitleBar titleBar;
/**
* 导航栏标题内容
*/
protected String titleContent;
/**
* 拍照保存路径
*/
private String mPhotoPath;
private Dialog mLoadingDialog;
private boolean mIsShowTitleBar = true;
private boolean mNetStateObserver;
private Object actionBeanObject;
/**
* 缺省页
*/
private DefaultView baseDefaultView;
/**
* 重试按钮点击监听
*/
private DefaultView.RetryClickListener retryClickListener;
private FlowTooBigDialog flowTooBigDialog;
public int statusHeight;
/*
Cannot add the same observer with different lifecycles异常
* 占位、规避 当liveData多次调用observe时, 如果Observer使用lambda, 并且lamba中没有引用非静态变量或方法时, 可能就会出现crash! (为什么是可能, 可以看 后续)
* */
public int forLiveDataBus;
/**
* 是否显示音频播放浮窗
*/
private boolean canShowMusicPlay;
public Activity mBaseActivity;
/**
* 夜间模式是否需要保存原有状态
*/
private boolean isNightKeep = false;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
try {
parseExtrasKeyData();
} catch (Exception e) {
Logger.t(TAG).e(e.getMessage());
}
statusHeight = StatusBarCompat.getStatusBarHeight(this);
super.onCreate(savedInstanceState);
mBaseActivity = this;
if (savedInstanceState != null) {
// 重新启动App -> 杀进程
ProcessUtils.startWelcomeActivity();
android.os.Process.killProcess(android.os.Process.myPid());
return;
}
if (getTag() != null) {
Logger.t(TAG).d(this.getClass().getName() + "//");
}
isNightKeep = setNightKeep();
initStatusBar();
setTopMargin(statusHeight);
initDataBus();
canShowMusicPlay = canShowMusicPlay();
notificationUtils = new NotificationUtils(this, this);
}
private void initDataBus() {
// 接口是否流量超标
LiveDataBus.getInstance().with(EventConstants.FLOW_TOO_LARGE, Boolean.class).observe(this, isok -> {
Log.e("!!!!", "isok " + isok);
if (isok && NetConstant.isFlowTooLarge) {
NetConstant.isFlowTooLarge = false;
if (flowTooBigDialog == null) {
flowTooBigDialog = new FlowTooBigDialog(this, new FlowTooBigDialog.OnCloseClickListener() {
@Override
public void back() {
/*if (isTaskRoot()) {
flowTooBigDialog.dismiss();
} else {
finish();
}*/
flowTooBigDialog.dismiss();
}
});
}
flowTooBigDialog.setIsflowtoobig(true);
if (!flowTooBigDialog.isShowing()) {
flowTooBigDialog.show();
}
} else {
if (flowTooBigDialog == null) {
return;
}
flowTooBigDialog.setIsflowtoobig(false);
}
});
// /**
// * 全局监听
// * 1.夜间模式切换
// */
// LiveDataBus.getInstance().with(EventConstants.EVENT_GLOBALLISTENING, Integer.class).observe(this, eventType -> {
// forLiveDataBus = 1;
// switch (eventType) {
// case 1:
// //夜间模式切换,需要重新创建页面
// recreate();
// break;
// default:
// break;
// }
// });
}
@Override
protected void onStop() {
super.onStop();
}
/**
* 解析额外key 数据
*/
private void parseExtrasKeyData() {
if (getIntent() == null || getIntent().getExtras() == null || getTag() == null) {
return;
}
actionBeanObject = getIntent().getExtras().getSerializable(RouterParameter.ACTION_KEY);
if (actionBeanObject == null) {
Logger.t(getTag()).w("extras no data");
return;
}
if (!(actionBeanObject instanceof ActionBean)) {
Logger.t(getTag()).w("action paramType error");
return;
}
}
/**
* 得到额外对象
*
* @return Object
*/
public Object getExtrasSerializableObject() {
return actionBeanObject;
}
@Override
protected void onDestroy() {
//浏览时长
isFirstLoad = true;
long endTime = System.currentTimeMillis();
duration = (int) (endTime - startTime)/1000 ;
releaseDialog();
if (mLoadingDialog != null) {
mLoadingDialog.cancel();
mLoadingDialog = null;
}
super.onDestroy();
// remove activity
// try {
// UMShareAPI.get(this).release();
// } catch (Exception e) {
// e.printStackTrace();
// }
notificationUtils.unregisterReceiver();
}
/**
* 释放拥堵弹框
*/
private void releaseDialog() {
if (flowTooBigDialog != null) {
flowTooBigDialog.cancel();
flowTooBigDialog = null;
}
}
private void initStatusBar() {
StatusBarStyleEnum statusBarStyle = getStatusBarStyle();
if (statusBarStyle == null || statusBarStyle == StatusBarStyleEnum.NONE) {
return;
}
setStatusBarStyle(statusBarStyle);
}
/**
* 获取状态栏类型
*
* @return 状态栏类型
*/
protected StatusBarStyleEnum getStatusBarStyle() {
return SpUtils.isNightMode()&& !isNightKeep ? StatusBarStyleEnum.NORMAL_161827_LIGHT_ENUM : StatusBarStyleEnum.NORMAL_WHITE_DARK_ENUM;
}
public void setStatusBarStyle(@NonNull StatusBarStyleEnum statusBarStyle) {
ToolsUtil.setStatusBarStyle(statusBarStyle, this);
}
/**
* 底部导航栏背景
* @return 颜色值
*/
public int getNavigationBarBgColor(){
return ContextCompat.getColor(getBaseContext(),isNightKeep ?
R.color.res_color_common_C8_keep : R.color.res_color_common_C8);
}
/**
* 切换状态栏背景
*
* @param labelIsBlack 状态文字是否黑色,即light还是dark
* @param color 状态栏背景颜色
*/
protected final void changeStatusBarStyle(boolean labelIsBlack, String color) {
// 修改状态栏背景色,非全屏
int state = labelIsBlack ? View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR : View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
StatusBarCompat.setStatusBar(this, state, color);
}
/**
* 拍照得到的 图片
*
* @return mPhotoPath
*/
public String getPhotoPath() {
return mPhotoPath;
}
@Override
protected void onResume() {
super.onResume();
if (mIsShowTitleBar) {
initTitleBar();
}
obserNetState();
if (isFirstLoad) {
startTime = System.currentTimeMillis();
isFirstLoad = false;
}
// //短视频 竖屏直播直播 音频
// if (getClass().getSimpleName().contains("LiveDetailActivityVertical") ||
// getClass().getSimpleName().contains("ShortVideoActivity")) {
// sendHiddenAudio();
// return;
// }
// if (canShowMusicPlay && FloatWindow.get() != null && !FloatWindow.get().getColseed()) {
// FloatWindow.get().show();
// } else if (FloatWindow.get() != null) {
//// PlayerManagerUtils.pauseAudio();
// FloatWindow.get().hide();
// FloatWindow.get().setAudioFloatingIsShow(false);
// }
}
/**
* 隐藏音频悬浮窗方法
*/
public void sendHiddenAudio() {
LiveDataBus.getInstance().with(EventConstants.FLOW_AUDIO_FREQUENCY, Integer.class).postValue(1);
}
/**
* 子类控制是否设置titlebar
*
* @param isShowTitleBar
*/
protected void setShowTitleBar(boolean isShowTitleBar) {
mIsShowTitleBar = isShowTitleBar;
}
/**
* 初始化titlebar
*/
public void initTitleBar() {
if (titleBar == null) {
View view = findViewById(R.id.title_bar);
if (view != null) {
titleBar = (CustomTitleBar) view;
titleBar.setTitleBarClickListener(this);
if (!TextUtils.isEmpty(titleContent)) {
titleBar.setTitle(titleContent);
}
}
}
}
/**
* 创建dialog 对象
*
* @param allowCancel
*/
private void createLoadingDialog(boolean allowCancel, String interactCode) {
mLoadingDialog = DialogUtils.createRequestDialog(this, allowCancel, interactCode);
}
/**
* loading
*/
public void startLoading() {
startLoading(true);
}
public void startLoading(boolean allowCancel) {
startLoading(allowCancel, "refreshing_common_loading.json");
}
protected void startLoading(boolean allowCancel, String interactCode) {
if (isDestroyed() || isFinishing()) {
return;
}
if (mLoadingDialog == null) {
createLoadingDialog(allowCancel, interactCode);
}
if (mLoadingDialog != null && !mLoadingDialog.isShowing()) {
mLoadingDialog.show();
}
}
/**
* loading
*/
public void stopLoading() {
if (isDestroyed() || isFinishing()) {
return;
}
if (mLoadingDialog != null && mLoadingDialog.isShowing()) {
mLoadingDialog.dismiss();
}
}
/**
* 导航栏栏点击左侧按钮
*/
@Override
public void onLeftClick() {
finish();
}
/**
* 导航栏栏点击右侧按钮
*/
@Override
public void onRightClick() {
}
/**
* 展示缺省页
*
* @param defaultView
* @param type
* @return
*/
protected View showDefaultView(DefaultView defaultView, int type) {
if (defaultView != null) {
baseDefaultView = defaultView;
} else {
baseDefaultView = new DefaultView(this, null, 0);
}
retryClickListener = new DefaultView.RetryClickListener() {
@Override
public void onRetryClick() {
retryBtnClickListener();
}
};
baseDefaultView.setRetryBtnClickListener(retryClickListener);
baseDefaultView.show(type);
return baseDefaultView;
}
/**
* 关闭缺省页面
*/
protected void hideDefaultView() {
if (baseDefaultView != null) {
baseDefaultView.hide();
}
}
/**
* 回调提供
*/
public void retryBtnClickListener() {
}
/**
* 子类设置网络是否监听方法
*
* @param isNetObserver
*/
protected void setNetStateObserver(boolean isNetObserver) {
mNetStateObserver = isNetObserver;
obserNetState();
}
/**
* 网络监听方法
*/
private void obserNetState() {
if (mNetStateObserver) {
LiveDataBus.getInstance()
.with(EventConstants.NETWORK_STATE_CHANGE, NetStateMessage.class)
.observe(this, new Observer<NetStateMessage>() {
@Override
public void onChanged(@Nullable NetStateMessage mEventMessage) {
Logger.t(TAG).d("Network status" + mEventMessage.type);
netStateData(mEventMessage);
}
});
}
}
/**
* 子类可以实现这个方法获取网络状态
*
* @param msg
*/
protected void netStateData(NetStateMessage msg) {
if (msg == null) {
return;
}
if (msg.type.equals(NetConstant.NET_WIFI_TYPE)) {
Logger.d("net is wifi type");
} else if (msg.type.equals(NetConstant.NET_CELL_TYPE)) {
Logger.d("net is cell type");
} else if (msg.type.equals(NetConstant.NET_ERROR_TYPE)) {
Logger.d("net is error type");
}
}
/**
* 夜间模式保持原样
*/
public boolean setNightKeep(){
return false;
}
/**
* 设置沉浸式头部的间距
*
* @param statusHeight
*/
public void setTopMargin(int statusHeight) {
}
/**
* 进入到改页面是否显示音频播放浮窗
*
* @return
*/
public boolean canShowMusicPlay() {
return true;
}
public void setTitleContent(String titleContent) {
this.titleContent = titleContent;
}
/**
* 拍照
*
* @param requestCode 请求码
*/
protected void openCamera(final int requestCode) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PermissionsUtils.getCameraAndSdPermission(this, new IPmsCallBack() {
@Override
public void granted() {
goCamera(requestCode);
}
@Override
public void notGranted() {
// ToastUtils.showShort(getResources().getString(R.string.permission_refuse));
}
});
} else {
goCamera(requestCode);
}
}
/**
* 拍照,在onResult 取 mPhotoPath
*
* @param requestCode 请求码
*/
protected void goCamera(int requestCode) {
mPhotoPath = ToolsUtil.openCamera(this, requestCode);
}
/**
* 选择相册
*
* @param maxNum 选择张数
* @param requestCode 请求码
* @param mItemList 存储相册数据
* @param type 0 图片,1 视频,2 图片和视频
*/
// protected void openAlbum(final int maxNum, final int type, final List<Item> mItemList, final int requestCode) {
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// PermissionsUtils.getSDPermission(this, new IPmsCallBack() {
// @Override
// public void granted() {
// selectPics(maxNum, type, mItemList, requestCode);
// }
//
// @Override
// public void notGranted() {
// // ToastUtils.showShort(getResources().getString(R.string.permission_refuse));
// }
// });
// } else {
// selectPics(maxNum, type, mItemList, requestCode);
// }
// }
/**
* 选择相册,在onResult
*
* @param maxNum 选取最大个数
* @param type 文件类型
* @param mItemList 存储相册数据
* @param requestCode 请求码
*/
// protected void selectPics(int maxNum, int type, List<Item> mItemList, int requestCode) {
//
// ToolsUtil.setMaxNum(maxNum);
// if (type == SEL_TYPE_PIC) {
// ToolsUtil.selectPhotos(this, mItemList, requestCode,-1);
// return;
// }
// if (type == SEL_TYPE_VIDEO) {
// ToolsUtil.selectVideos(this, mItemList, requestCode,-1,-1);
// return;
// }
// if (type == SEL_TYPE_ALL) {
// ToolsUtil.selectPicsAndVideo(this, mItemList, requestCode,-1,-1,-1);
// }
// }
/**
* 友盟分享使用,不可以删除
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable @org.jetbrains.annotations.Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// try {
// UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
// } catch (Exception e) {
// e.printStackTrace();
// }
}
// @Override
// protected void attachBaseContext(Context newBase) {
// super.attachBaseContext(FoldingScreenUtils.attachBaseContext(newBase));
// }
// @Override
// public void onConfigurationChanged(@NonNull Configuration newConfig) {
// FoldingScreenUtils.onConfigurationChanged(this, newConfig);
// super.onConfigurationChanged(newConfig);
// }
public void sendNotification(String message) {
notificationUtils.sendNotification(message);
}
@Override
public void onNotificationReceived(String message) {
// 处理接收到的通知消息
Log.d("Notification", "Received message: " + message);
}
/**
* 判断当前activity是否销毁
* @return
*/
public boolean activityIsDestroy() {
if(mBaseActivity == null || mBaseActivity.isFinishing() || mBaseActivity.isDestroyed())
{
return true;
}
return false;
}
/**
* hook反射方向检查
**/
public void fixOrientation(Activity activity) {
try {
Class activityClass = Activity.class;
Field mActivityInfoField = activityClass.getDeclaredField("mActivityInfo");
mActivityInfoField.setAccessible(true);
ActivityInfo activityInfo = (ActivityInfo) mActivityInfoField.get(activity);
// 设置屏幕不固定
activityInfo.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* hook反射检查是否透明色或者悬浮
**/
public boolean isTranslucentOrFloating() {
boolean isTranslucentOrFloating = false;
try {
int[] styleableRes = (int[]) Class.forName("com.android.internal.R$styleable").getField("Window").get(null);
final TypedArray typedArray = obtainStyledAttributes(styleableRes);
Method method = ActivityInfo.class.getMethod("isTranslucentOrFloating", TypedArray.class);
method.setAccessible(true);
isTranslucentOrFloating = (boolean) method.invoke(null, typedArray);
method.setAccessible(false);
} catch (Exception e) {
e.printStackTrace();
}
return isTranslucentOrFloating;
}
}
... ...
package com.wd.common.base;
import android.app.Activity;
import android.app.Application;
import com.wd.common.listener.UserActivityLifecycleCallbacks;
import java.util.List;
public class BaseApplication extends Application {
private final UserActivityLifecycleCallbacks mLifecycleCallbacks = new UserActivityLifecycleCallbacks();
public static BaseApplication instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
// 注册Activity生命周期监听
registerActivityLifecycleCallbacks(mLifecycleCallbacks);
}
/**
* 获取一个Application对象
*/
public static synchronized BaseApplication getInstance() {
return instance;
}
public UserActivityLifecycleCallbacks getLifecycleCallbacks() {
return mLifecycleCallbacks;
}
/**
* finish所有Activity
*/
public void finishAllActivity() {
UserActivityLifecycleCallbacks lifecycleCallbacks = getLifecycleCallbacks();
if (lifecycleCallbacks == null) {
return;
}
List<Activity> activities = lifecycleCallbacks.getActivityList();
if (activities == null || activities.isEmpty()) {
return;
}
for (Activity activity : activities) {
activity.finish();
}
}
}
... ...
package com.wd.common.base;
/**
*
*
* @author liyubing
*/
public abstract class BaseAutoLazyFragment extends BaseLazyFragment{
/**
* 自动刷新
*/
public abstract void clickTabAutoRefresh();
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2022. All rights reserved.
*/
package com.wd.common.base
import android.app.Activity
import android.app.AlertDialog
import android.app.Dialog
import android.content.Context
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.LinearLayout
import com.wd.foundation.wdkit.animator.AnimatorUtil
import com.wd.fastcoding.base.R
/**
* BaseDialog
*
* @author liyubing
* @version [V1.0.0, 2022/6/13]
* @since V1.0.0
*/
class BaseDialog {
private var dialog: AlertDialog? = null
private var mLayoutView: View? = null
private var mContext: Context? = null
private var width = 0.0
private var height = 0.4
private var isCancelable = true
private var dialogHeight = ViewGroup.LayoutParams.WRAP_CONTENT
private var onSureClickListener: OnSureClickListener? = null
private val onCancelClickListener: OnCancelClickListener? = null
private var onDismissListener: OnDismissListener? = null
/**
* 任意控件点击事件接口
*/
interface OnClickListener {
fun onClick(view: View?, dialog: Dialog?)
}
fun setDismissListener(onDismissListener: OnDismissListener): BaseDialog {
this.onDismissListener = onDismissListener
return this
}
fun setDialogHeight(dialogHeight: Int): BaseDialog {
this.dialogHeight = dialogHeight
return this
}
fun isCancelable(isCancelable: Boolean): BaseDialog {
this.isCancelable = isCancelable
return this
}
interface OnAdapterChangeListener {
fun onClick(position: Int, o: Any?, dialog: Dialog?)
}
/**
* 任意控件点击事件
*/
fun setOnClickListener(
view: View,
onClickListener: OnClickListener?
): BaseDialog? {
view.setOnClickListener {
onClickListener?.onClick(view, dialog)
}
return mDialog
}
/**
* 弹窗消失接口
*/
interface OnDismissListener {
fun onDismiss()
}
/**
* 确定控件点击事件接口
*/
interface OnSureClickListener {
fun onClick(dialog: Dialog?)
}
/**
* 取消控件点击事件接口
*/
interface OnCancelClickListener {
fun onClick(dialog: Dialog?)
}
/**
* 取消控件点击事件
*/
fun setOnCancelClickListener(view: View): BaseDialog? {
view.setOnClickListener { dialog!!.dismiss() }
return mDialog
}
/**
* 取消控件点击事件
*/
fun setOnCancelClickListener(
view: View,
onCancelClickListener: OnCancelClickListener?
): BaseDialog? {
view.setOnClickListener { onCancelClickListener?.onClick(dialog) }
return mDialog
}
/**
* 确定控件点击事件
*/
fun setOnSureClickListener(
view: View, onSureClickListener: OnSureClickListener?
): BaseDialog? {
view.setOnClickListener {
onSureClickListener?.onClick(dialog)
}
return mDialog
}
fun setWindow(width: Double, height: Double): BaseDialog {
this.width = width
this.height = height
return this
}
fun setLayoutView(
layoutView: View?
): BaseDialog? {
mLayoutView = layoutView
this.mContext = layoutView?.context
return mDialog
}
/**
* 弹窗位于中间
*
* @return
*/
fun showCenter(): BaseDialog? {
mContext?.apply {
if (mLayoutView?.parent != null) {
(mLayoutView?.parent as ViewGroup).removeAllViews()
}
dialog = AlertDialog.Builder(this, R.style.custom_dialog2).create()
dialog?.setCancelable(isCancelable)
dialog?.show()
dialog?.setContentView(mLayoutView!!, ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dialogHeight))
val dialogWindow = dialog?.window
dialogWindow?.setGravity(Gravity.CENTER)
val lp = dialogWindow?.attributes
val d = mContext?.resources?.displayMetrics // 获取屏幕宽、高用
if (width == 0.0) {
lp?.width = LinearLayout.LayoutParams.WRAP_CONTENT
} else {
lp?.width = (d?.widthPixels?.times(width))?.toInt()
}
if (height == 0.0) {
lp?.height = LinearLayout.LayoutParams.WRAP_CONTENT
} else {
lp?.height = (d?.heightPixels?.times(height))?.toInt()
}
dialog?.setOnDismissListener {
onDismissListener?.onDismiss()
dialog?.dismiss() }
dialog?.setOnCancelListener { dialog?.dismiss() }
dialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
dialogWindow?.attributes = lp
}
return mDialog
}
/**
* 弹窗位于底部
*
* @return
*/
fun showBottom(): BaseDialog? {
dialog = AlertDialog.Builder(mContext!!, R.style.custom_dialog2).create()
dialog?.setCancelable(isCancelable)
dialog?.show()
dialog?.setContentView(
mLayoutView!!,
ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dialogHeight)
)
val dialogWindow = dialog?.window
dialogWindow?.setGravity(Gravity.BOTTOM)
val lp = dialogWindow?.attributes
lp?.width = WindowManager.LayoutParams.MATCH_PARENT
lp?.y = 0
dialogWindow?.attributes = lp
dialog?.setOnDismissListener {
AnimatorUtil.startVerticalDown(mLayoutView, dialog)
}
dialog?.setOnCancelListener { AnimatorUtil.startVerticalDown(mLayoutView, dialog) }
AnimatorUtil.startVerticalUp(mLayoutView)
dialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
dialog?.setOnCancelListener { onDismissListener?.onDismiss()}
return mDialog
}
fun dismiss(): BaseDialog? {
if (mDialog != null && dialog != null && dialog?.isShowing == true) {
if (mContext is Activity) {
if (!(mContext as Activity).isDestroyed && !(mContext as Activity).isFinishing) {
dialog?.dismiss()
}
}
}
return mDialog
}
fun getDialog():AlertDialog?{
return dialog
}
companion object {
private var mDialog: BaseDialog? = null
val instance: BaseDialog?
get() {
mDialog = BaseDialog()
return mDialog
}
}
}
\ No newline at end of file
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2022. All rights reserved.
*/
package com.wd.common.base;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProviders;
import com.wd.base.log.Logger;
import com.wd.common.dialog.DialogUtils;
import com.wd.common.utils.ToolsUtil;
import com.wd.common.widget.DefaultView;
import com.wd.fastcoding.base.R;
import com.wd.foundation.wdkit.statusbar.StatusBarStyleEnum;
import java.util.List;
/**
* fragment基类<BR>
*
* @author zhangbo
* @version [V1.0.0, 2021/12/8]
* @since V1.0.0
*/
public abstract class BaseFragment extends Fragment {
private boolean isUserVisible = true;
private boolean isViewCreated = false;
private Dialog mLoadingDialog;
protected Activity activity;
/**
* true java布局,false xml布局
*/
private boolean isjava;
private Activity mActivity;
FrameLayout layout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
this.perCreate();
View rootView;
if (isjava) {
rootView = getJavaLayout();
} else {
rootView = inflater.inflate(getLayout(), container, false);
}
mActivity = getActivity();
initView(rootView);
return rootView;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
isViewCreated = true;
}
/**
* 获取指定类型的VM实例<BR>
* 获取Activity对象的vm
*
* @param viewModelClazz VM的类实例
* @param <T> VM类型
* @return VM对象
*/
protected <T extends ViewModel> T getViewModel(Class<T> viewModelClazz) {
if (null != getActivity()) {
return ViewModelProviders.of(getActivity()).get(viewModelClazz);
} else {
return ViewModelProviders.of(this).get(viewModelClazz);
}
}
/**
* 获取指定类型的VM实例<BR>
* 获取fragment自己的vm
*
* @param viewModelClazz VM的类实例
* @param <T> VM类型
* @return VM对象
*/
protected <T extends ViewModel> T getViewModelThis(Class<T> viewModelClazz) {
return ViewModelProviders.of(this).get(viewModelClazz);
}
@Override
public void onDestroy() {
super.onDestroy();
// 在fragment destroy的时候重置isUserVisible
isUserVisible = true;
}
/**
* 获取日志tag
*
* @return 日志tag
*/
protected abstract String getLogTag();
/**
* 获取当前Fragment布局
*
* @return 布局文件
*/
protected abstract int getLayout();
/**
* 初始化View<BR>
* 不要有耗时操作,否则页面加载慢
*
* @param rootView 布局根视图
*/
protected abstract void initView(View rootView);
/**
* onKeyDown回调<BR>
* 需要Activity主动触发
*
* @param keyCode 按键类型
* @param event 按键事件
* @return 是否消费事件
*/
public boolean onKeyDown(int keyCode, KeyEvent event) {
return false;
}
/**
* onKeyUp 回调<BR>
* 需要Activity主动触发
*
* @param keyCode 按键类型
* @param event 按键事件
* @return 是否消费事件
*/
public boolean onKeyUp(int keyCode, KeyEvent event) {
return false;
}
// 标记onResume是否被刚刚调用
private boolean mResume = false;
/**
* 用于判断fragment真实展现,不要用其提供的isVisible()方法
*
* @return true 可见 false不可见
*/
public boolean isRealVisible() {
return getUserVisibleHint() && mResume;
}
@Override
public void onResume() {
super.onResume();
mResume = true;
}
@Override
public void onPause() {
super.onPause();
mResume = false;
}
@Override
public void onStop() {
super.onStop();
mResume = false;
}
/**
* 判断是否对用户可见
*/
public boolean isUserVisible() {
return /* isVisible() */ isAdded() && getUserVisibleHint() && isUserVisible && parentUserVisible(this);
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (!isViewCreated) {
isUserVisible = isVisibleToUser;
return;
}
if (isVisibleToUser) {
userVisible(false);
} else {
userInvisible(false);
}
Log.d("BaseFragment", this.getClass().getName());
}
/**
* 判断父Fragment是否可见
*/
private static boolean parentUserVisible(Fragment fragment) {
Fragment f = fragment.getParentFragment();
if (f instanceof BaseFragment) {
return ((BaseFragment) f).isUserVisible();
}
while (f != null) {
if (!f.isVisible() || !f.getUserVisibleHint()) {
return false;
}
f = f.getParentFragment();
}
return true;
}
void userVisible(boolean fromActivity) {
// 父Fragment不可见则不做处理
if (isUserVisible || (fromActivity && (!getUserVisibleHint() || !parentUserVisible(this)))) {
return;
}
isUserVisible = true;
FragmentManager fragmentManager;
try {
fragmentManager = getChildFragmentManager();
} catch (Exception e) {
onUserVisible(fromActivity);
return;
}
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null || fragments.isEmpty()) {
onUserVisible(fromActivity);
return;
}
for (Fragment f : fragments) {
/*
* if (!f.isVisible()) {
* continue;
* }
*/
if (!(f instanceof BaseFragment)) {
if (f.getUserVisibleHint() || (fromActivity && parentUserVisible(f))) {
f.setUserVisibleHint(true);
}
continue;
}
BaseFragment lazy = (BaseFragment) f;
// 忽略子fragment中有对用户不可见的fragment
if (!lazy.getUserVisibleHint()) {
continue;
}
lazy.userVisible(fromActivity);
}
onUserVisible(fromActivity);
}
void userInvisible(boolean fromActivity) {
// 已经不可见则无需再调用
if (!isUserVisible) {
return;
}
isUserVisible = false;
FragmentManager fragmentManager;
try {
fragmentManager = getChildFragmentManager();
} catch (Exception e) {
onUserInvisible(getUserVisibleHint(), fromActivity);
return;
}
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null || fragments.isEmpty()) {
onUserInvisible(getUserVisibleHint(), fromActivity);
return;
}
for (Fragment f : fragments) {
/*
* if (!f.isVisible()) {
* continue;
* }
*/
if (!(f instanceof BaseFragment)) {
f.setUserVisibleHint(false);
continue;
}
BaseFragment lazy = (BaseFragment) f;
// 忽略子fragment中有对用户不可见的fragment
if (!lazy.getUserVisibleHint()) {
continue;
}
lazy.userInvisible(fromActivity);
}
onUserInvisible(getUserVisibleHint(), fromActivity);
}
/**
* 进入用户可见壮状态
*
* @param callFromActivity 是否是从activity层调用
*/
protected void onUserVisible(boolean callFromActivity) {
if (getLogTag() == null) {
Logger.d("onUserVisible");
} else {
Logger.t(getLogTag()).d("onUserVisible");
}
}
/**
* 进入用户不可见状态, app进入后台,或者新的activity被启动时
*
* @param userVisibleHint 表示在进入不可见状态时,是否是对用户可见状态,一般情况下在ViewPager里才起作用
* @param callFromActivity 是否是从activity层调用
*/
protected void onUserInvisible(boolean userVisibleHint, boolean callFromActivity) {
if (getLogTag() == null) {
Logger.d("onUserInvisible");
} else {
Logger.t(getLogTag()).d("onUserInvisible");
}
}
/**
* loading 按返回键loading默认消失
*/
public void startLoading() {
startLoading(true);
}
/**
* loading
* @param allowCancel 按返回键loading是否消失
*/
protected void startLoading(boolean allowCancel) {
if (mActivity == null || mActivity.isFinishing() || mActivity.isDestroyed()) {
return;
}
if (mLoadingDialog == null) {
createLoadingDialog(allowCancel);
}
if (mLoadingDialog!=null&&!mLoadingDialog.isShowing()) {
mLoadingDialog.show();
}
}
protected void stopLoading() {
if (mActivity == null || mActivity.isFinishing() || mActivity.isDestroyed()) {
return;
}
if (mLoadingDialog != null && mLoadingDialog.isShowing()) {
mLoadingDialog.dismiss();
}
}
private void createLoadingDialog(boolean allowCancel) {
mLoadingDialog = DialogUtils.createRequestDialog(mActivity, allowCancel);
}
/**
* 增加空布局
*/
protected View addEmptyView(int emptyType) {
return addEmptyView(emptyType,null);
}
/**
* 增加空布局
*
* @return
*/
protected View addEmptyView(int type, DefaultView.RetryClickListener listener) {
return addEmptyViewWithWeight(type,null,listener);
}
/**
* 增加空布局
*
* @return
*/
protected View addEmptyViewWithWeight(int type,Integer[] weight, DefaultView.RetryClickListener listener) {
if(getContext() == null){
return null;
}
View emptyView = LayoutInflater.from(getContext()).inflate(R.layout.empty_view_layout, null);
DefaultView mDefaultView = emptyView.findViewById(R.id.default_view);
if (listener != null) {
mDefaultView.setRetryBtnClickListener(listener);
}
if(weight == null || weight.length != 2){
mDefaultView.show(type);
}else{
mDefaultView.showWithWeight(type,weight[0],weight[1]);
}
return emptyView;
}
@SuppressWarnings({"deprecation"})
@Override
public void onAttach(@NonNull Activity activity) {
super.onAttach(activity);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
this.activity = activity;
}
}
@TargetApi(23)
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
if (context instanceof Activity) {
this.activity = (Activity) context;
}
}
public void setStatusBarStyle(@NonNull StatusBarStyleEnum statusBarStyle) {
ToolsUtil.setStatusBarStyle(statusBarStyle, getActivity());
}
protected void perCreate() {
}
protected View getJavaLayout() {
return null;
}
/**
* 设置java布局标识
*/
public void setIsjava(boolean isjava) {
this.isjava = isjava;
}
public void onUserLeaveHint() {
}
}
... ...
package com.wd.common.base;
import android.util.Log;
import com.wd.foundation.wdkit.statusbar.StatusBarStyleEnum;
import com.wd.foundation.wdkitcore.tools.StringUtils;
/**
* 我的页面<BR>
* @description :取消预加载的Fragment基类
* @author ouyang
* @date 2022/7/4
*/
public abstract class BaseLazyFragment extends BaseFragment {
// 是否第一次加载
protected boolean isFirstLoad = true;
public String mPageId;
// 记录当前页面的原头信息的objectType,目前只用在专题中
public int objectType = 0;
/**
* 国殇标记(true:开启了国殇)
*/
public boolean contryGrayFlag = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
Log.d("BaseLazyFragment", this.getClass().getName());
}
@Override
public void onDestroyView() {
super.onDestroyView();
isFirstLoad = true;
}
@Override
public void onResume() {
super.onResume();
if (isFirstLoad) {
lazyLoadData();
isFirstLoad = false;
}
}
/**
* viewModel 进入页面加载数据
*/
protected abstract void lazyLoadData();
/**
* 修改手机顶部状态,只支持白色和黑色
* @param isWhite
*/
public void changePhoneStatusBarWhiteOrBlack(boolean isWhite){
if(isWhite){
setStatusBarStyle(StatusBarStyleEnum.FULLSCREEN_LIGHT_ENUM);
}else {
setStatusBarStyle(StatusBarStyleEnum.FULLSCREEN_DARK_ENUM);
}
}
protected int convertLikeStyle(String likeStyle) {
// 1 心型 2拇指(弃用) 3蜡烛(新增)
if (StringUtils.isBlank(likeStyle)) {
return 1;
}
if ("candle".equals(likeStyle)) {
return 3;
} else {
return 1;
}
}
public String getmPageId() {
return mPageId;
}
}
... ...
/*
* Copyright (c) People Technologies Co., Ltd. 2019-2022. All rights reserved.
*/
package com.wd.common.decoration;
import android.graphics.Rect;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public class Decoration extends RecyclerView.ItemDecoration {
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent,
@NonNull RecyclerView.State state) {
// 设定边距为0px
// outRect.set(0, 0, 0, 0);
super.getItemOffsets(outRect, view, parent, state);
}
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2022. All rights reserved.
*/
package com.wd.common.dialog;
import android.app.Dialog;
import android.content.Context;
import android.view.Window;
import android.view.WindowManager;
import com.airbnb.lottie.LottieAnimationView;
import com.wd.common.progress.PageLoadingView;
import com.wd.fastcoding.base.R;
/**
* @author yzm
* @date 2022/6/27
* @time 9:34.
*/
public class DialogUtils {
/**
* 构造方法
*/
public static Dialog createRequestDialog(final Context context) {
return createRequestDialog(context, true);
}
/**
* 创建请求弹窗
*/
public static Dialog createRequestDialog(final Context context, boolean allowCancel) {
return createRequestDialog(context, allowCancel, "refreshing_common_loading.json");
}
/**
* 创建请求弹窗
*/
public static Dialog createRequestDialog(final Context context, boolean allowCancel, String interactCode) {
final Dialog dialog = new Dialog(context, R.style.CustomDialog);
dialog.setContentView(R.layout.pdialog_layout);
Window window = dialog.getWindow();
if (window != null) {
WindowManager.LayoutParams lp = window.getAttributes();
int width = context.getResources().getDisplayMetrics().widthPixels;
final double scaleFlag = 0.5;
lp.width = (int) (scaleFlag * width);
}
dialog.setCanceledOnTouchOutside(allowCancel);
dialog.setCancelable(allowCancel);
PageLoadingView loadingView = dialog.findViewById(R.id.channelSmallLoading);
loadingView.setInteractCode(interactCode);
loadingView.showLoading();
return dialog;
}
/**
* 一键登录的loading
*/
// public static Dialog createOneKeyAuthLoading(final Context context, boolean allowCancel) {
//
// final Dialog dialog = new Dialog(context, R.style.CustomDialog);
// dialog.setContentView(R.layout.one_key_auth_login_loading);
// Window window = dialog.getWindow();
// WindowManager.LayoutParams lp = window.getAttributes();
// int width = context.getResources().getDisplayMetrics().widthPixels;
// int height = context.getResources().getDisplayMetrics().heightPixels;
// lp.width = width;
// lp.height = height;
// dialog.setCanceledOnTouchOutside(false);
// dialog.setCancelable(allowCancel);
//
// LottieAnimationView loadingView = dialog.findViewById(R.id.one_key_loading);
// loadingView.setAnimation("login_loading.json");
// loadingView.playAnimation();
//
// return dialog;
// }
public interface DialogOneButtonClickListener {
/**
* 确定
*/
void okButtonClick();
}
}
... ...
package com.wd.common.dialog;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Handler;
import android.os.Looper;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import com.wd.foundation.wdkit.constant.Constants;
import com.wd.common.imageglide.ImageUtils;
import com.wd.common.viewclick.BaseClickListener;
import com.wd.fastcoding.base.R;
import com.wd.foundation.wdkit.animator.MyAnimationUtils;
import com.wd.foundation.wdkit.utils.UiUtils;
/**
* @author baozhaoxin
* @version [V1.0.0, 2022/8/17]
* @description 彩蛋弹窗
* @since V1.0.0
*/
public class EasterEggsDialog {
/**
* 上下文环境
*/
private Context context;
/**
* dialog
*/
private Dialog dialog;
private Display display;
/**
* 弹窗布局
*/
private RelativeLayout dialogLaout;
/**
* 弹窗图片
*/
private ImageView img;
/**
* 弹窗关闭按钮
*/
private ImageView closeImg;
/**
* 监听
*/
private DialogClickListener clickListener;
public View view;
public EasterEggsDialog(Context context) {
this.context = context;
display = UiUtils.getDisplay(context);
}
public Dialog getDialog() {
return dialog;
}
/**
* 创建布局
* @return
*/
public EasterEggsDialog builder() {
// 获取Dialog布局
view = LayoutInflater.from(context).inflate(R.layout.dialog_easter_eggs, null);
dialogLaout = view.findViewById(R.id.dialog_layout);
img = view.findViewById(R.id.img);
closeImg = view.findViewById(R.id.img_close);
// 定义Dialog布局和参数
dialog = new Dialog(context, R.style.AlertDialogStyle);
dialog.setContentView(view);
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
lp.dimAmount = 0.5f;
// lp.y = 250;
dialog.getWindow().setAttributes(lp);
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
// 调整dialog背景大小
dialogLaout.setLayoutParams(
new FrameLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
//点击空白区域,更新状态
Constants.isShowingEasterEggs = false;
}
});
Animation animation = MyAnimationUtils.loadAnimation(context, R.anim.scale_easter_eggs_dialog);
view.setAnimation(animation);
animation.start();
img.setOnClickListener(new BaseClickListener() {
@Override
protected void onNoDoubleClick(View v) {
if(clickListener!=null){
clickListener.onJump();
}
dialog.dismiss();
}
});
closeImg.setOnClickListener(view1 -> {
if(clickListener!=null){
clickListener.onClose();
}
dialog.dismiss();
});
return this;
}
/**
* 设置监听
* @param clickListener
*/
public EasterEggsDialog setClickListener(DialogClickListener clickListener){
this.clickListener = clickListener;
return this;
}
/**
* 设置彩蛋素材地址
* @param materialUrl
* @return
*/
public EasterEggsDialog setMaterialUrl(String materialUrl){
if(img!=null){
ImageUtils.getInstance().loadImage(img,materialUrl);
}
return this;
}
/**
* 自动关闭时长: 0代表不自动关闭,其他为对应时长(s)
* @param durations
* @return
*/
public EasterEggsDialog setDurations(String durations){
try {
int duration = Integer.parseInt(durations);
if(duration>0){
long mDuration = duration*1000;
//自动关闭
new Handler(Looper.myLooper()).postDelayed(() -> {
if(dialog!=null){
Constants.isShowingEasterEggs = false;
dialog.dismiss();
}
},mDuration);
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
return this;
}
public boolean isShowing() {
if (dialog!=null){
return dialog.isShowing();
}
return false;
}
/**
* 回调监听
*/
public interface DialogClickListener {
void onJump();
void onClose();
}
/**
* 显示
*/
public EasterEggsDialog show() {
if(context != null){
if(context instanceof Activity){
Activity activity = (Activity) context;
if(!activity.isDestroyed() && !activity.isFinishing()){
if(dialog!=null){
dialog.show();
}
}
}else{
if(dialog!=null){
dialog.show();
}
}
}
return this;
}
/**
* 关闭
*/
public EasterEggsDialog close() {
Constants.isShowingEasterEggs = false;
if(context != null){
if(context instanceof Activity){
Activity activity = (Activity) context;
if(!activity.isDestroyed() && !activity.isFinishing()){
if(dialog!=null){
dialog.dismiss();
}
}
}else{
if(dialog!=null){
dialog.dismiss();
}
}
}
return this;
}
}
... ...
package com.wd.common.dialog;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.KeyEvent;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.wd.fastcoding.base.R;
/**
* created by wxl and 2022/8/2
*/
public class FlowTooBigDialog extends Dialog {
private final OnCloseClickListener mOnCloseClickListener;
private boolean isflowtoobig = true;
private Runnable runnable;
private Context context;
public boolean isIsflowtoobig() {
return isflowtoobig;
}
public void setIsflowtoobig(boolean isflowtoobig) {
this.isflowtoobig = isflowtoobig;
}
public FlowTooBigDialog(@NonNull Context context, OnCloseClickListener onCloseClickListener) {
super(context, R.style.AlertDialogStyle);
this.context = context;
mOnCloseClickListener = onCloseClickListener;
}
int secnum = -100;
TextView titlt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_flowbig_layout);
titlt = findViewById(R.id.titlt);
runnable = new Runnable() {
@Override
public void run() {
if (secnum != -100) {
if (secnum < 0) {
secnum = -100;
dismiss();
mOnCloseClickListener.back();
return;
}
// Log.e("!!!!", "secnum " + secnum);
titlt.setText(secnum-- + "");
handler.postDelayed(this, 1100);
}
}
};
setCancelable(false);
}
private Handler handler = new Handler(Looper.getMainLooper());
@Override
public void show() {
if(getContext() != null){
if(getContext() instanceof Activity){
Activity activity = (Activity) getContext();
if(!activity.isDestroyed() && !activity.isFinishing()){
super.show();
if (secnum == -100) {
secnum = 10;
handler.post(runnable);
}
}
}else{
super.show();
if (secnum == -100) {
secnum = 10;
handler.post(runnable);
}
}
}
}
@Override
public void dismiss() {
try{
if(context != null && isShowing()){
if(context instanceof Activity){
Activity activity = (Activity) context;
if(!activity.isDestroyed() && !activity.isFinishing()){
super.dismiss();
}
}else{
super.dismiss();
}
}
}catch (Exception e){
}
secnum = -100;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
return true;
}
return super.onKeyDown(keyCode, event);
}
public interface OnCloseClickListener {
void back();
}
}
... ...
package com.wd.common.dialog;
import android.content.Context;
import com.wd.base.log.Logger;
import com.wd.foundation.wdkitcore.tools.HostUtil;
import com.wd.common.utils.ProcessUtils;
import com.wd.foundation.bean.custom.content.ContentBean;
import com.wd.foundation.bean.pop.PopUpsBean;
import com.wd.foundation.wdkit.utils.SpUtils;
import com.wd.foundation.wdkit.utils.TimeUtil;
import java.util.ArrayList;
import java.util.List;
/**
* 彩蛋工具类
* @author baozhaoxin
* @version [V1.0.0, 2022/8/20]
*/
public class PopUpsUtils {
private static String TAG = "PopUpsUtils";
/**
*
* @param hasPopUp 是否有彩蛋
* @param originalList 原始数据集合
* @return
*/
public static PopUpsBean handlerPopUps(boolean hasPopUp, List<PopUpsBean> originalList, String type){
if(!hasPopUp){
//没有彩蛋
return null;
}
if(originalList==null||originalList.size()==0){
//彩蛋数据为空
return null;
}
List<PopUpsBean> resultlList = new ArrayList<>();
//按时间和exposureOnce过滤数据
handlerByDataAndExposureOnce(resultlList,originalList,type);
if(resultlList!=null&&resultlList.size()>0){
//返回符合条件的第一条数据
return resultlList.get(0);
}
return null;
}
/**
*按时间和exposureOnce过滤数据
* @param resultlList
* @param originalList
*/
private static void handlerByDataAndExposureOnce(List<PopUpsBean> resultlList,List<PopUpsBean> originalList,String type){
long currentTimeStamp = HostUtil.serverTime;
for (PopUpsBean bean : originalList) {
PopUpsBean popUpsBean = SpUtils.getPopUpById(bean.getId());
if(popUpsBean != null && (
popUpsBean.getAlreadyDailyExposureTimes() == popUpsBean.getDailyExposureTimes() ||
popUpsBean.getAlreadyDailyExposureTimes() > popUpsBean.getDailyExposureTimes())){
//当日看到N次彩蛋后,当日不会再看到彩蛋
continue;
}
try {
long startTimeStamp = TimeUtil.time2timestamp(bean.getStartTime());
long endTimeStamp = TimeUtil.time2timestamp(bean.getEndTime());
if (currentTimeStamp >= startTimeStamp
&& currentTimeStamp <= endTimeStamp) {
resultlList.add(bean);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 显示彩蛋
*/
public static EasterEggsDialog showEasterEggsDialog(Context context,PopUpsBean mPopUpsBean,String type,
EasterEggsDialog.DialogClickListener mListener) {
if (mPopUpsBean != null) {
EasterEggsDialog easterEggsDialog = new EasterEggsDialog(context).builder()
.setMaterialUrl(mPopUpsBean.getMaterialUrl())
.setDurations(mPopUpsBean.getDurations())
.setClickListener(mListener)
.show();
Logger.t(TAG).d("easterEggsResult=" + mPopUpsBean.toString());
SpUtils.savePopUpToCache(mPopUpsBean);
return easterEggsDialog;
}
return null;
}
/**
* 彩蛋点击跳转
*
* @param mPopUpsBean
*/
public static void easterEggsDialogJump(PopUpsBean mPopUpsBean) {
if(mPopUpsBean==null){
return;
}
ContentBean contentBean = new ContentBean();
contentBean.setPageId(mPopUpsBean.getPageId());
contentBean.setLinkUrl(mPopUpsBean.getLinkUrl());
contentBean.setObjectId(mPopUpsBean.getObjectId());
contentBean.setObjectType(mPopUpsBean.getObjectType());
contentBean.setObjectLevel(mPopUpsBean.getObjectLevel());
contentBean.setBottomNavId(mPopUpsBean.getBottomNavId());
contentBean.setRelId(mPopUpsBean.getRelId());
//专题模板 --->专题样式 1:常规, 2:作者, 3:时间线
// contentBean.setTopicTemplate(mPopUpsBean.getTopicTemplate());
ProcessUtils.processPage(contentBean);
}
}
... ...
/*
* Copyright (c) Wondertek Technologies Co., Ltd. 2019-2022. All rights reserved.
*/
package com.wd.common.dialog;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.text.TextUtils;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
import com.wd.fastcoding.base.R;
import com.wd.foundation.wdkit.utils.UiUtils;
import com.wd.foundation.wdkitcore.tools.ResUtils;
/**
* @author baozhaoxin
* @date 2022/8/4
*/
public class TipsDialog {
private Context context;
private Dialog dialog;
/**
* 布局
*/
private LinearLayout lLayout;
/**
* 标题
*/
private TextView titleTv;
/**
* 内容
*/
private TextView contentTv;
/**
* 左边按钮
*/
private TextView disagreeTv;
/**
* 中间分隔线
*/
private View centerLine;
/**
* 右边按钮
*/
private TextView agreeTv;
private boolean showLeftBtn = false;
private boolean showRightBtn = false;
private Display display;
public TipsDialog(Context context) {
this.context = context;
display = UiUtils.getDisplay(context);
}
public TipsDialog builder() {
// 获取Dialog布局
View view = LayoutInflater.from(context).inflate(R.layout.dialog_tips, null);
lLayout = view.findViewById(R.id.lLayout_bg);
titleTv = view.findViewById(R.id.tv_title);
contentTv = view.findViewById(R.id.tv_content);
disagreeTv = view.findViewById(R.id.tv_disagree);
agreeTv = view.findViewById(R.id.tv_agree);
centerLine = view.findViewById(R.id.line_center);
disagreeTv.setVisibility(View.GONE);
centerLine.setVisibility(View.GONE);
agreeTv.setVisibility(View.GONE);
// 定义Dialog布局和参数
dialog = new Dialog(context, R.style.AlertDialogStyle);
dialog.setContentView(view);
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
lp.dimAmount = 0.6f;
// lp.y = 250;
dialog.getWindow().setAttributes(lp);
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
// 调整dialog背景大小
lLayout.setLayoutParams(
new FrameLayout.LayoutParams((int) (display.getWidth() * 0.85), LayoutParams.WRAP_CONTENT));
return this;
}
public TipsDialog setTitle(String title) {
titleTv.setText(TextUtils.isEmpty(title)? ResUtils.getString(R.string.warm_prompt):title);
return this;
}
public TipsDialog setMsg(String msg) {
contentTv.setText(msg);
return this;
}
public TipsDialog setCancelable(boolean cancel) {
dialog.setCancelable(cancel);
return this;
}
public TipsDialog setLeftButton(String text, final OnClickListener listener) {
showLeftBtn = true;
disagreeTv.setText(TextUtils.isEmpty(text)?"取消":text);
disagreeTv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
listener.onClick(v);
dialog.dismiss();
}
});
return this;
}
public TipsDialog setRightButton(String text, final OnClickListener listener) {
showRightBtn = true;
agreeTv.setText(TextUtils.isEmpty(text)?"确定":text);
agreeTv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
listener.onClick(v);
dialog.dismiss();
}
});
return this;
}
private void setLayout() {
titleTv.setText(ResUtils.getString(R.string.warm_prompt));
if (!showLeftBtn && !showRightBtn) {
disagreeTv.setVisibility(View.GONE);
centerLine.setVisibility(View.GONE);
agreeTv.setText("确定");
agreeTv.setVisibility(View.VISIBLE);
agreeTv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
if (showLeftBtn && showRightBtn) {
disagreeTv.setVisibility(View.VISIBLE);
agreeTv.setVisibility(View.VISIBLE);
centerLine.setVisibility(View.VISIBLE);
}
if (showLeftBtn && !showRightBtn) {
disagreeTv.setVisibility(View.VISIBLE);
}
if (!showLeftBtn && showRightBtn) {
agreeTv.setVisibility(View.VISIBLE);
}
}
public void show() {
if(context != null && context instanceof Activity){
Activity activity = (Activity) context;
if(activity.isDestroyed() || activity.isFinishing()){
return;
}
}
setLayout();
dialog.show();
}
}
... ...
package com.wd.common.imageglide;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
import com.bumptech.glide.load.resource.bitmap.TransformationUtils;
import java.security.MessageDigest;
/**
* @author yzm
* @date 2022/7/9
* @time 16:53.
*/
public class GlideRoundTransform extends BitmapTransformation {
private static float radius = 20f;
public GlideRoundTransform(Context context) {
this(context, 4);
}
public GlideRoundTransform(Context context, int dp) {
// super(context);
radius = Resources.getSystem().getDisplayMetrics().density * dp;
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
Bitmap bitmap = TransformationUtils.centerCrop(pool, toTransform, outWidth, outHeight);
return roundCrop(pool, bitmap);
}
private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {
if (source == null)
return null;
Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rectF, radius, radius, paint);
return result;
}
public String getId() {
return getClass().getName() + Math.round(radius);
}
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) {
}
}
... ...