Compare commits

..

4 Commits

Author SHA1 Message Date
hch
9dba41c22f 修复支付问题 2023-11-30 16:15:23 +08:00
hch
7c44f09803 修复支付问题 2023-11-29 18:26:59 +08:00
hch
0b89ac21e8 lib_google
lib_huawei
2023-11-28 18:28:47 +08:00
hch
238181deca lib_google
lib_huawei
2023-11-27 17:12:27 +08:00
132 changed files with 2268 additions and 3874 deletions

View File

@@ -34,14 +34,14 @@ public class ShareBuilder {
"/index.php?g=Appapi&m=home&a=share&uid=%s&user_id=%s&isGoogle=%s",
anchorId,
shareUid,
CommonAppConfig.IS_GOOGLE_PLAY ? "1" : "0"
) ;
CommonAppConfig.IS_GOOGLE_PLAY
);
}
public static String createInviteLink(String shareUid) {
return String.format("https://www.pdlive.com/public/app/download/index.html?user_id=%s&isGoogle=%s",
shareUid,
CommonAppConfig.IS_GOOGLE_PLAY ? "1" : "0"
CommonAppConfig.IS_GOOGLE_PLAY
);
}

View File

@@ -152,7 +152,7 @@ public class InvitePopDialog extends AbsDialogPopupWindow {
}
public InvitePopDialog setUrl(String data) {
this.url = data + "&isGoogle=" + (CommonAppConfig.IS_GOOGLE_PLAY ? "1" : "0");
this.url = data + "&isGoogle=" + CommonAppConfig.IS_GOOGLE_PLAY;
return this;
}
}

View File

@@ -26,21 +26,21 @@
"SG_back":"connect-ws-dra.hispace.dbankcloud.com"
},
"client":{
"cp_id":"30086000612391734",
"product_id":"99536292102564216",
"client_id":"964994320723627840",
"client_secret":"6D5FE29D85B967D3A66BDCD473641E4C7B5524F7F4935CA0EF4A842730C3402D",
"project_id":"99536292102564216",
"app_id":"106936673",
"api_key":"DAEDADYGta/0O4ZSdrnug52NgC67/w/RIyTq9A8LyAY0+mp6g6XeJDbxugpluFPLAhaqjaMs5c0PLnRx14UzWbPPADgi1EqihbWLoA==",
"cp_id":"30852000032486141",
"product_id":"388421841221767494",
"client_id":"1283893262452580800",
"client_secret":"17BC070420691D35650C694230D6348075CB549F7BBA94EDD49FA9E61A9E5434",
"project_id":"388421841221767494",
"app_id":"109612651",
"api_key":"DAEDAAlBbTFuTuyQWQsyYBZLuyjALH9Y9BNFkVZl1GhI0tRaa6HF1LgzXWy2MZiSFrmpbn1aAvcvzP6aKZtR6MVikS8V4SbBlYUPfQ==",
"package_name":"com.pdlive.shayu"
},
"oauth_client":{
"client_id":"106936673",
"client_id":"109612651",
"client_type":1
},
"app_info":{
"app_id":"106936673",
"app_id":"109612651",
"package_name":"com.pdlive.shayu"
},
"service":{
@@ -53,6 +53,10 @@
"resource_id":"p1",
"channel_id":""
},
"edukit":{
"edu_url":"edukit.cloud.huawei.com.cn",
"dh_url":"edukit.cloud.huawei.com.cn"
},
"search":{
"url":"https://search-drcn.cloud.huawei.com"
},
@@ -77,15 +81,15 @@
{
"package_name":"com.pdlive.shayu",
"client":{
"app_id":"106936673"
"app_id":"109612651"
},
"app_info":{
"package_name":"com.pdlive.shayu",
"app_id":"106936673"
"app_id":"109612651"
},
"oauth_client":{
"client_type":1,
"client_id":"106936673"
"client_id":"109612651"
}
}
]

View File

@@ -130,39 +130,36 @@ android {
}
variant.mergeAssetsProvider.configure {
doLast {
delete(fileTree(dir: outputDir, includes: [
'model/ai_bgseg_green.bundle',
'model/ai_face_processor.bundle',
//'model/ai_face_processor_lite.bundle',
'model/ai_hairseg.bundle',
'model/ai_hand_processor.bundle',
'model/ai_human_processor.bundle',
'model/ai_human_processor_gpu.bundle',
'model/ai_human_processor_mb_fast.bundle',
'graphics/body_slim.bundle',
'graphics/controller_cpp.bundle',
//'graphics/face_beautification.bundle',
'graphics/face_makeup.bundle',
'graphics/fuzzytoonfilter.bundle',
'graphics/fxaa.bundle',
'graphics/tongue.bundle',
//旧美颜
'model-all.zip',
'filterData.zip',
'KSYResource/*',
'Resources/*',
'Asset/*',
'image_effect_shaders/*',
'internal/*'
//美颜基础组件
delete(fileTree(dir: outputDir, includes: ['model/ai_bgseg_green.bundle',
'model/ai_face_processor.bundle',
//'model/ai_face_processor_lite.bundle',
'model/ai_hairseg.bundle',
'model/ai_hand_processor.bundle',
'model/ai_human_processor.bundle',
'model/ai_human_processor_gpu.bundle',
'model/ai_human_processor_mb_fast.bundle',
'graphics/body_slim.bundle',
'graphics/controller_cpp.bundle',
//'graphics/face_beautification.bundle',
'graphics/face_makeup.bundle',
'graphics/fuzzytoonfilter.bundle',
'graphics/fxaa.bundle',
'graphics/tongue.bundle',
//旧美颜
'model-all.zip',
'filterData.zip',
'KSYResource/*',
'Resources/*',
'Asset/*',
'image_effect_shaders/*',
'internal/*'
//美颜基础组件
]))
println "isPluginModel = " + rootProject.ext.manifestPlaceholders.isPluginModel
if (rootProject.ext.manifestPlaceholders.isPluginModel) {
delete(fileTree(dir: outputDir, includes: [
'model/ai_face_processor_lite.bundle',
'graphics/face_beautification.bundle'
]))
delete(fileTree(dir: outputDir, includes: ['model/ai_face_processor_lite.bundle',
'graphics/face_beautification.bundle']))
} else {
println "不删除bundle"
}
@@ -170,8 +167,10 @@ android {
}
variant.outputs.all {
def isGoogle = "link"
if (rootProject.ext.manifestPlaceholders.isGooglePlay) {
if (rootProject.ext.manifestPlaceholders.isGooglePlay == 1) {
isGoogle = "Google"
} else if (rootProject.ext.manifestPlaceholders.isGooglePlay == 2) {
isGoogle = "Huawei"
}
def isPlugin = "all"
if (rootProject.ext.manifestPlaceholders.isPluginModel) {
@@ -231,7 +230,6 @@ android {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
buildTypes {
release {
@@ -266,8 +264,8 @@ dependencies {
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
implementation platform('com.google.firebase:firebase-bom:30.5.0')
implementation 'com.google.firebase:firebase-crashlytics'
//implementation platform('com.google.firebase:firebase-bom:30.5.0')
//implementation 'com.google.firebase:firebase-crashlytics'
//直播
api project(':main')

View File

@@ -277,3 +277,18 @@ rx.internal.util.atomic.LinkedQueueNode* consumerNode;
-keep class tech.sud.mgp.hello.common.event.model.** {*;}
-keep class com.yunbao.common.sud.** {*;}
-ignorewarnings
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keep class com.huawei.hianalytics.**{*;}
-keep class com.huawei.updatesdk.**{*;}
-keep class com.huawei.hms.**{*;}
-keep class com.shayu.lib_google.**{*;}
-keep class com.shayu.lib_huawei.**{*;}

View File

@@ -194,12 +194,13 @@
<action android:name="com.huawei.push.action.MESSAGING_EVENT" />
</intent-filter>
</service>
<!-- <meta-data-->
<!-- android:name="com.huawei.hms.client.appid"-->
<!-- android:value="106936673"/>-->
<!-- <meta-data-->
<!-- android:name="com.huawei.hms.client.cpid"-->
<!-- android:value="30086000612391734"/>-->
<meta-data
android:name="com.huawei.hms.client.appid"
android:value="109612651" />
<meta-data
android:name="com.huawei.hms.client.cpid"
android:value="30852000032486141" />
</application>
</manifest>

View File

@@ -6,7 +6,6 @@ import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.net.http.HttpResponseCache;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -24,9 +23,6 @@ import com.alibaba.fastjson.JSONObject;
import com.blankj.utilcode.util.Utils;
import com.facebook.appevents.AppEventsLogger;
import com.fm.openinstall.OpenInstall;
import com.google.firebase.FirebaseApp;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.google.firebase.crashlytics.FirebaseCrashlytics;
import com.shayu.phonelive.utils.LogUtils;
import com.tencent.imsdk.v2.V2TIMGroupMemberInfo;
import com.tencent.imsdk.v2.V2TIMManager;
@@ -46,9 +42,9 @@ import com.yunbao.common.manager.imrongcloud.MessageIMManager;
import com.yunbao.common.manager.imrongcloud.RecommendLiveRoom;
import com.yunbao.common.manager.imrongcloud.RongcloudIMManager;
import com.yunbao.common.utils.AppManager;
import com.yunbao.common.utils.GoogleUtils;
import com.yunbao.common.utils.L;
import com.yunbao.common.utils.SpUtil;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.live.socket.SocketReceiveBean;
import com.yunbao.live.socket.SocketRyClient;
import com.yunbao.live.utils.LiveImDeletUtil;
@@ -62,7 +58,6 @@ import java.io.File;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import io.rong.imkit.config.RongConfigCenter;
@@ -145,7 +140,6 @@ public class AppContext extends CommonAppContext {
sInstance = this;
L.setDeBug(BuildConfig.DEBUG);
AppEventsLogger.activateApp(this);
FirebaseAnalytics.getInstance(this);
File httpCacheDir = new File(getCacheDir(), "https");
try {
@@ -160,7 +154,6 @@ public class AppContext extends CommonAppContext {
}
ARouter.init(this);
//初始化 邀请码库
if (isMainProcess()) {
OpenInstall.init(this);
@@ -170,8 +163,7 @@ public class AppContext extends CommonAppContext {
//友盟正式初始化
UMConfigure.init(getApplicationContext(), "64e40ee55488fe7b3afa2c96", "PDLive", UMConfigure.DEVICE_TYPE_PHONE,
"64e40ee55488fe7b3afa2c96");
UMConfigure.init(getApplicationContext(), "64e40ee55488fe7b3afa2c96", "PDLive", UMConfigure.DEVICE_TYPE_PHONE, "64e40ee55488fe7b3afa2c96");
//集成umeng-crash-vx.x.x.aar则需要关闭原有统计SDK异常捕获功能
MobclickAgent.setCatchUncaughtExceptions(false);
@@ -212,9 +204,7 @@ public class AppContext extends CommonAppContext {
if (content.getContent().contains("_method_")) {
msg.obj = content.getContent();
//观众页面
if (SocketRyClient.mSocketHandler != null
&& (TextUtils.equals("__system__", message.getTargetId())
|| ("g" + PortraitLiveManager.liveID).contains(message.getTargetId()))) {
if (SocketRyClient.mSocketHandler != null && (TextUtils.equals("__system__", message.getTargetId()) || ("g" + PortraitLiveManager.liveID).contains(message.getTargetId()))) {
SocketRyClient.mSocketHandler.sendMessage(msg);
} else if (content.getContent().contains("LivePK_anchorStartLiveNotify")) {//开播通知
SocketReceiveBean received = JSON.parseObject(content.getContent(), SocketReceiveBean.class);
@@ -313,40 +303,37 @@ public class AppContext extends CommonAppContext {
* 注册全局异常捕获有需要时可以在onCreate调用
*/
private void registerError() {
NeverCrashUtils.getInstance()
.setDebugMode(BuildConfig.DEBUG)
.setMainCrashHandler((t, e) -> {
Log.e("ApplicationError", "主线程异常");//此处log只是展示当debug为true时主类内部log会打印异常信息
e.printStackTrace();
AppManager.runDebugCode(() -> {
//闪退后finish所有Activity并且杀死进程
for (WeakReference<Activity> activity : activities) {
if (activity != null && activity.get() != null) {
activity.get().finish();
}
}
Process.killProcess(Process.myPid());
System.exit(0);
setFirebaseCrashData();
new Handler(Looper.getMainLooper()).postDelayed(() -> {
throw new RuntimeException(e);
}, 100);
});
NeverCrashUtils.getInstance().setDebugMode(BuildConfig.DEBUG).setMainCrashHandler((t, e) -> {
Log.e("ApplicationError", "主线程异常");//此处log只是展示当debug为true时主类内部log会打印异常信息
e.printStackTrace();
AppManager.runDebugCode(() -> {
//闪退后finish所有Activity并且杀死进程
for (WeakReference<Activity> activity : activities) {
if (activity != null && activity.get() != null) {
activity.get().finish();
}
}
Process.killProcess(Process.myPid());
System.exit(0);
setFirebaseCrashData();
new Handler(Looper.getMainLooper()).postDelayed(() -> {
throw new RuntimeException(e);
}, 100);
});
})
.setUncaughtCrashHandler((t, e) -> {
Log.e("ApplicationError", "子线程异常");//此处log只是展示当debug为true时主类内部log会打印异常信息
e.printStackTrace();
})
.register(this);
}).setUncaughtCrashHandler((t, e) -> {
Log.e("ApplicationError", "子线程异常");//此处log只是展示当debug为true时主类内部log会打印异常信息
e.printStackTrace();
}).register(this);
}
public void registerFirebaseCrash() {
if (!CommonAppConfig.IS_UPLOAD_ERROR_LOG) {
return;
}
FirebaseAnalytics.getInstance(this);
FirebaseApp.initializeApp(this);
if (CommonAppConfig.IS_GOOGLE_PLAY == 1) {
GoogleUtils.newInstance(this).initializeApp(this);
}
}
@@ -355,21 +342,5 @@ public class AppContext extends CommonAppContext {
return;
}
String uid = CommonAppConfig.getInstance().getUid();
FirebaseCrashlytics.getInstance().setUserId(CommonAppConfig.getInstance().getUid());
if (uid != null && !uid.isEmpty()) {
FirebaseCrashlytics.getInstance().setCustomKey("uid", uid);
} else {
FirebaseCrashlytics.getInstance().setCustomKey("uid", "uid is null");
}
FirebaseCrashlytics.getInstance().setCustomKey("userData", SpUtil.getInstance().getStringValue(SpUtil.USER_INFO));
FirebaseCrashlytics.getInstance().setCustomKey("isGoogle", CommonAppConfig.IS_GOOGLE_PLAY);
FirebaseCrashlytics.getInstance().setCustomKey("PhoneName", Build.BRAND);
FirebaseCrashlytics.getInstance().setCustomKey("Phone", Build.MODEL);
FirebaseCrashlytics.getInstance().setCustomKey("CPU", Arrays.toString(Build.SUPPORTED_ABIS));
FirebaseCrashlytics.getInstance().setCustomKey("RunTime", (System.currentTimeMillis() - CrashSaveBean.getInstance().getStartTime()));
FirebaseCrashlytics.getInstance().setCustomKey("enterRoom", CrashSaveBean.getInstance().getEnterRoom());
FirebaseCrashlytics.getInstance().setCustomKey("slidingRoom", CrashSaveBean.getInstance().getSlidingRoom());
FirebaseCrashlytics.getInstance().setCustomKey("playSvga", CrashSaveBean.getInstance().getPlaySvga());
FirebaseCrashlytics.getInstance().setCustomKey("ActivitySize", CrashSaveBean.getInstance().getActivitySize());
}
}

View File

@@ -8,7 +8,6 @@ import android.os.Looper;
import android.util.Log;
import android.widget.Toast;
import com.google.firebase.crashlytics.FirebaseCrashlytics;
import com.yunbao.common.BuildConfig;
import com.yunbao.common.bean.CrashSaveBean;
import com.yunbao.common.utils.AppManager;
@@ -108,7 +107,6 @@ public class NeverCrashUtils {
}
e.printStackTrace();
AppContext.setFirebaseCrashData();
FirebaseCrashlytics.getInstance().recordException(e);
AppManager.runDebugCode(() -> Toast.makeText(application, "发生闪退:" + e.getMessage(), Toast.LENGTH_SHORT).show());
FileUtil.saveStringToFile(new File(application.getDir("files", Context.MODE_PRIVATE).getAbsolutePath()), throwableToString(e), "error.log");
getMainCrashHandler().mainException(Looper.getMainLooper().getThread(), e);

View File

@@ -1,3 +1,4 @@
/*
package com.shayu.phonelive.utils;
import android.app.Notification;
@@ -108,3 +109,4 @@ public class MyNotificationService extends FirebaseMessagingService {
// }
}
*/

View File

@@ -12,6 +12,7 @@ buildscript {
maven { url 'https://maven.fabric.io/public' }
maven { url 'http://maven.faceunity.com/repository/maven-public/' }//美颜库
maven { url 'https://repo1.maven.org/maven2/' }//埋点
maven {url 'https://developer.huawei.com/repo/'}
google()
mavenCentral()
}
@@ -24,6 +25,7 @@ buildscript {
classpath 'com.google.gms:google-services:4.3.3'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2'
classpath "com.alibaba:arouter-register:1.0.2"
classpath 'com.huawei.agconnect:agcp:1.5.2.300'
}

View File

@@ -146,7 +146,11 @@ dependencies {
//谷歌支付
//谷歌内购
api 'com.android.billingclient:billing:5.0.0'
//api 'com.android.billingclient:billing:5.0.0'
//api 'com.google.firebase:firebase-messaging:23.0.6'
//api 'com.google.firebase:firebase-analytics:21.1.0'
api 'com.squareup.picasso:picasso:2.5.2'
api "com.immomo.cosmos.mediax:beautyutils:2.2.1_01071700"
api files('libs/liteavsdk.jar')
@@ -180,8 +184,7 @@ dependencies {
api 'com.jakewharton.rxbinding3:rxbinding:3.1.0'
//loading样式库
api 'com.wang.avi:library:2.1.3'
api 'com.google.firebase:firebase-messaging:23.0.6'
api 'com.google.firebase:firebase-analytics:21.1.0'
// api 'com.huawei.hms:push:4.0.2.300'
implementation 'com.github.tajchert:WaitingDots:0.6.1'
//悬浮窗
@@ -206,4 +209,11 @@ dependencies {
// 多语言语音识别扩展库(可选)
api 'tech.sud.mgp:SudASR:1.3.3.1158'
//华为支付插件包
//api project(':lib_huawei')
//google插件包
api project(':lib_google')
}

View File

@@ -34,7 +34,7 @@ public class CommonAppConfig {
//域名
public static final String HOST = getMetaDataString("SERVER_HOST");
//是否使用谷歌支付
public static final boolean IS_GOOGLE_PLAY = getMetaDataBoolean("IS_GOOGLE_PLAY");
public static final int IS_GOOGLE_PLAY = getMetaDataInt("IS_GOOGLE_PLAY");
//是否开启上报错误日志功能
public static final boolean IS_UPLOAD_ERROR_LOG = getMetaDataBoolean("IS_UPLOAD_ERROR_LOG");
//是否为插件包模式
@@ -470,6 +470,18 @@ public class CommonAppConfig {
}
private static int getMetaDataInt(String key) {
int res = 0;
try {
ApplicationInfo appInfo = CommonAppContext.sInstance.getPackageManager().getApplicationInfo(CommonAppContext.sInstance.getPackageName(), PackageManager.GET_META_DATA);
res = appInfo.metaData.getInt(key);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return res;
}
/**
* 个人中心功能列表
*/

View File

@@ -55,9 +55,11 @@ public class CommonAppContext extends MultiDexApplication {
// RongPushClient.setPushConfig(config); //将推送相关配置设置到 SDK
//设置新加坡融云服务器 有时候国内收不到推送是因为这个
RongIMClient.setServerInfo("navsg01.cn.ronghub.com", null);
//谷歌推送
PushConfig gconfig = new PushConfig.Builder().enableFCM(true).build();
RongPushClient.setPushConfig(gconfig);
if (CommonAppConfig.IS_GOOGLE_PLAY == 1) {
//谷歌推送
PushConfig gconfig = new PushConfig.Builder().enableFCM(true).build();
RongPushClient.setPushConfig(gconfig);
}
//初始化友盟统计
// UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE, null);
FacebookSdk.sdkInitialize(getApplicationContext());

View File

@@ -1,24 +0,0 @@
package com.yunbao.common.bean;
public class CoolConfig extends BaseModel {
private int rate;
private String ticketCount="0" ;
public String getTicketCount() {
return ticketCount;
}
public CoolConfig setTicketCount(String ticketCount) {
this.ticketCount = ticketCount;
return this;
}
public int getRate() {
return rate;
}
public CoolConfig setRate(int rate) {
this.rate = rate;
return this;
}
}

View File

@@ -39,28 +39,6 @@ public class EnterRoomNewModel extends BaseModel {
private String sudGameRoomName;
@SerializedName("sud_gameDate")
private SudGameDateModel sudGameDateModel;
@SerializedName("quick_gift_remaining_quantity")
private int quickGiftRemainingQuantity;//剩余的小PD礼物数量
@SerializedName("if_viewing_duration_complete")
private int ifViewingDurationComplete;//通过观看时间获取小PD礼物的次数
public int getQuickGiftRemainingQuantity() {
return quickGiftRemainingQuantity;
}
public EnterRoomNewModel setQuickGiftRemainingQuantity(int quickGiftRemainingQuantity) {
this.quickGiftRemainingQuantity = quickGiftRemainingQuantity;
return this;
}
public int getIfViewingDurationComplete() {
return ifViewingDurationComplete;
}
public EnterRoomNewModel setIfViewingDurationComplete(int ifViewingDurationComplete) {
this.ifViewingDurationComplete = ifViewingDurationComplete;
return this;
}
public SudGameDateModel getSudGameDateModel() {
return sudGameDateModel;

View File

@@ -204,7 +204,7 @@ public class IMLoginModel extends BaseModel {
@SerializedName("votes")
private String votes;
@SerializedName("yuanbao")
private String yuanbao;
private long yuanbao;
@SerializedName("list")
private List<List<ListModel>> list;
@SerializedName("slide")
@@ -825,11 +825,11 @@ public class IMLoginModel extends BaseModel {
return this;
}
public String getYuanbao() {
public long getYuanbao() {
return yuanbao;
}
public IMLoginModel setYuanbao(String yuanbao) {
public IMLoginModel setYuanbao(long yuanbao) {
this.yuanbao = yuanbao;
return this;
}

View File

@@ -1,14 +0,0 @@
package com.yunbao.common.bean;
public class NativeCallbackModel extends BaseModel{
private String uid ;
public String getUid() {
return uid;
}
public NativeCallbackModel setUid(String uid) {
this.uid = uid;
return this;
}
}

View File

@@ -17,17 +17,14 @@ public class OpenAdModel extends BaseModel {
public static final int MODEL_SQUARE = 1;//正方形
public static final int MODEL_RECTANGLE = 2;//长方形
public static final int MODEL_BOTTOM = 3;//底部
public static final int SHOW_DEF = 1;//1. 杀死程序后弹出;
public static final int SHOW_DIY = 2;//2. 自定义时间自上次弹出弹窗后00:00小时范围00:01小时-48:00小时后再弹出到时间后也需满足触发条件再弹出
public static final int SHOW_ONE = 3;//3. 仅弹出一次;
@SerializedName("id")
private int id;
@SerializedName("popup_location")
private int type = TYPE_HOME;
@SerializedName("activity_url")
private String url;//点击跳转url
private String url;
@SerializedName("image_url")
private String imageUrl;//图片url
private String imageUrl;
@SerializedName("display_time")
private int showTime; //持续展示时间
@SerializedName("delay_show_time")
@@ -40,48 +37,11 @@ public class OpenAdModel extends BaseModel {
private String endTime;//活动结束时间
@SerializedName("popup_permission")
private int permission;
@SerializedName("popup_frequency")
private int showModel = SHOW_DEF;//显示模式1杀死程序后弹出 2指定时间内本机时间 31. 仅弹出一次
@SerializedName("popup_frequency_time")
private String section = "0";// SHOW_DEF = 2
public OpenAdModel() {
}
public static OpenAdModel createTestData() {
OpenAdModel model = new OpenAdModel();
model.id=3;
model.type=1;
model.url = "/h5/GuildTournament/20230821/rank.html";
model.imageUrl = "https://ceshi.yaoulive.com/data/upload/20230913/1694589490.png";
model.showTime = 10;
model.delayShowTime = 0;
model.model = MODEL_SQUARE;
model.startTime = "2019-01-01 00:00:00";
model.endTime = "2029-01-01 00:00:00";
model.permission = 4;
model.showModel = SHOW_DIY;
model.section = "5";
return model;
}
public int getShowModel() {
return showModel;
}
public void setShowModel(int showModel) {
this.showModel = showModel;
}
public String getSection() {
return section;
}
public void setSection(String section) {
this.section = section;
}
public int getType() {
return type;
}

View File

@@ -1,39 +0,0 @@
package com.yunbao.common.bean;
import com.google.gson.annotations.SerializedName;
public class QuickGiftSendGiftModel extends BaseModel {
@SerializedName("quick_gift_remaining_quantity")
private int quickGiftRemainingQuantity;//剩余的小PD礼物数量
@SerializedName("if_viewing_duration_complete")
private int ifViewingDurationComplete;//通过观看时间获取小PD礼物的次数
@SerializedName("if_hidden_egg")
private int ifHiddenEgg = 1;//1.未解锁 2.已解锁过奖励 3.当前请求解锁了奖励
public int getIfHiddenEgg() {
return ifHiddenEgg;
}
public QuickGiftSendGiftModel setIfHiddenEgg(int ifHiddenEgg) {
this.ifHiddenEgg = ifHiddenEgg;
return this;
}
public int getQuickGiftRemainingQuantity() {
return quickGiftRemainingQuantity;
}
public QuickGiftSendGiftModel setQuickGiftRemainingQuantity(int quickGiftRemainingQuantity) {
this.quickGiftRemainingQuantity = quickGiftRemainingQuantity;
return this;
}
public int getIfViewingDurationComplete() {
return ifViewingDurationComplete;
}
public QuickGiftSendGiftModel setIfViewingDurationComplete(int ifViewingDurationComplete) {
this.ifViewingDurationComplete = ifViewingDurationComplete;
return this;
}
}

View File

@@ -1,101 +0,0 @@
package com.yunbao.common.dialog;
import android.content.Context;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.lxj.xpopup.core.CenterPopupView;
import com.yunbao.common.R;
import com.yunbao.common.bean.CoolConfig;
import com.yunbao.common.http.base.HttpCallback;
import com.yunbao.common.http.live.LiveNetManager;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.common.views.weight.ViewClicksAntiShake;
import java.math.BigDecimal;
public class CinemaTicketPopupWindow extends CenterPopupView {
private CoolConfig mCoolConfig;
private TextView cinemaTicket, ticketsPlusMinus, quantityNeed;
private int ticket = 1;
private CinemaTicketPopupWindowCallBack mCinemaTicketPopupWindowCallBack;
public CinemaTicketPopupWindow(@NonNull Context context, CoolConfig coolConfig, CinemaTicketPopupWindowCallBack cinemaTicketPopupWindowCallBack) {
super(context);
mCoolConfig = coolConfig;
mCinemaTicketPopupWindowCallBack = cinemaTicketPopupWindowCallBack;
}
@Override
protected int getImplLayoutId() {
return R.layout.cinema_ticket_popup;
}
// 执行初始化操作比如findView设置点击或者任何你弹窗内的业务逻辑
@Override
protected void onCreate() {
super.onCreate();
cinemaTicket = findViewById(R.id.cinema_ticket);
ticketsPlusMinus = findViewById(R.id.tickets_plus_minus);
quantityNeed = findViewById(R.id.quantity_need);
cinemaTicket.setText(new BigDecimal(ticket).add(new BigDecimal(mCoolConfig.getTicketCount())).toString());
ticketsPlusMinus.setText(String.valueOf(ticket));
quantityNeed.setText(new BigDecimal(ticket).multiply(new BigDecimal(mCoolConfig.getRate())).toString());
ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.cinema_ticket_close), new ViewClicksAntiShake.ViewClicksCallBack() {
@Override
public void onViewClicks() {
dialog.dismiss();
}
});
findViewById(R.id.sub).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (ticket > 1) {
ticket = ticket - 1;
cinemaTicket.setText(new BigDecimal(ticket).add(new BigDecimal(mCoolConfig.getTicketCount())).toString());
ticketsPlusMinus.setText(String.valueOf(ticket));
quantityNeed.setText(new BigDecimal(ticket).multiply(new BigDecimal(mCoolConfig.getRate())).toString());
}
}
});
findViewById(R.id.add).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
ticket = ticket + 1;
cinemaTicket.setText(new BigDecimal(ticket).add(new BigDecimal(mCoolConfig.getTicketCount())).toString());
ticketsPlusMinus.setText(String.valueOf(ticket));
quantityNeed.setText(new BigDecimal(ticket).multiply(new BigDecimal(mCoolConfig.getRate())).toString());
}
});
ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.cinema_ticket_exchange), new ViewClicksAntiShake.ViewClicksCallBack() {
@Override
public void onViewClicks() {
LiveNetManager.get(getContext())
.buyTicket(String.valueOf(ticket), new HttpCallback<String>() {
@Override
public void onSuccess(String data) {
if (mCinemaTicketPopupWindowCallBack != null) {
mCinemaTicketPopupWindowCallBack.onCallBack(data);
}
dialog.dismiss();
}
@Override
public void onError(String error) {
ToastUtil.show(error);
}
});
}
});
}
public interface CinemaTicketPopupWindowCallBack {
void onCallBack(String data);
}
}

View File

@@ -1,7 +1,6 @@
package com.yunbao.common.event;
import com.yunbao.common.bean.BaseModel;
import com.yunbao.common.bean.CoolConfig;
import com.yunbao.common.bean.VideoBean;
import java.util.ArrayList;
@@ -24,16 +23,6 @@ public class JavascriptInterfaceEvent extends BaseModel {
private String data;
private String name;
private String image;
private CoolConfig coolConfig;
public CoolConfig getCoolConfig() {
return coolConfig;
}
public JavascriptInterfaceEvent setCoolConfig(CoolConfig coolConfig) {
this.coolConfig = coolConfig;
return this;
}
public String getName() {
return name;

View File

@@ -1,67 +0,0 @@
package com.yunbao.common.event;
import com.yunbao.common.bean.BaseModel;
public class QuickGiftingEvent extends BaseModel {
private int index;
private String svgaName;
private boolean show =false;
private boolean reminder = false;
private String giftRemainingQuantity;
private String hotNum;
public String getHotNum() {
return hotNum;
}
public QuickGiftingEvent setHotNum(String hotNum) {
this.hotNum = hotNum;
return this;
}
public String getGiftRemainingQuantity() {
return giftRemainingQuantity;
}
public QuickGiftingEvent setGiftRemainingQuantity(String giftRemainingQuantity) {
this.giftRemainingQuantity = giftRemainingQuantity;
return this;
}
public boolean isReminder() {
return reminder;
}
public QuickGiftingEvent setReminder(boolean reminder) {
this.reminder = reminder;
return this;
}
public boolean isShow() {
return show;
}
public QuickGiftingEvent setShow(boolean show) {
this.show = show;
return this;
}
public int getIndex() {
return index;
}
public QuickGiftingEvent setIndex(int index) {
this.index = index;
return this;
}
public String getSvgaName() {
return svgaName;
}
public QuickGiftingEvent setSvgaName(String svgaName) {
this.svgaName = svgaName;
return this;
}
}

View File

@@ -1,15 +0,0 @@
package com.yunbao.common.event;
import com.yunbao.common.bean.BaseModel;
public class SlideEvent extends BaseModel {
private boolean isSlide;
public boolean isSlide() {
return isSlide;
}
public SlideEvent setSlide(boolean slide) {
isSlide = slide;
return this;
}
}

View File

@@ -46,6 +46,13 @@ public class LoadingDialog extends AbsDialogFragment {
hint.setText(showText);
}
public void setHintText(String text) {
if (hint != null) {
hint.setText(text);
}
}
@Override
public void onDestroy() {
super.onDestroy();
@@ -56,7 +63,7 @@ public class LoadingDialog extends AbsDialogFragment {
protected void setWindowAttributes(Window window) {
window.setWindowAnimations(R.style.bottomToTopAnim);
WindowManager.LayoutParams params = window.getAttributes();
params.width = DeviceUtils.getScreenWidth(getActivity())/2;
params.width = DeviceUtils.getScreenWidth(getActivity()) / 2;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.gravity = Gravity.CENTER;
window.setAttributes(params);

View File

@@ -173,106 +173,97 @@ public class CommonHttpUtil {
}
Log.i("来了", lang);
//或者仅仅使用 locale = Locale.getDefault(); 不需要考虑接口 deprecated(弃用)问题
HttpClient.getInstance().get("Home.getConfig", CommonHttpConsts.GET_CONFIG)
.params("langue", lang)
.params("version", "" + VersionUtil.getVersion())
.params("from", "android")
.params("appType", "1")
.execute(new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
if (code == 0 && info.length > 0) {
try {
JSONObject obj = JSON.parseObject(info[0]);
ConfigBean bean = JSON.toJavaObject(obj, ConfigBean.class);
CommonAppConfig.getInstance().setConfig(bean);
CommonAppConfig.getInstance().setLevel(obj.getString("level"));
CommonAppConfig.getInstance().setAnchorLevel(obj.getString("levelanchor"));
CommonAppConfig.getInstance().alert_time = obj.getInteger("alert_time");
CommonAppConfig.getInstance().alert_end_time = obj.getInteger("alert_end_time");
//解析粉丝徽章
CommonAppConfig.getInstance().setAnchorFansMedal(obj.getString("levelfans"));
SpUtil.getInstance().setStringValue(SpUtil.CONFIG, info[0]);
if (commonCallback != null) {
commonCallback.callback(bean);
}
if (obj.containsKey("is_chat")) {
IMLoginManager.get(context).initChat(String.valueOf(obj.getInteger("is_chat")));
}
if (obj.containsKey("levelfans")) {
JSONArray levelArray = obj.getJSONArray("levelfans");
new NewLevelManager(context).upDataFansLevel(levelArray.toJSONString());
}
if (obj.containsKey("level_new")) {//缓存等级数据
JSONArray levelArray = obj.getJSONArray("level_new");
new NewLevelManager(context).UpDataLevel(levelArray.toJSONString());
}
if (obj.containsKey("levelanchor_new")) {//缓存等级数据
JSONArray levelArray = obj.getJSONArray("levelanchor_new");
new NewLevelManager(context).UpAnchorDataLevel(levelArray.toJSONString());
}
if (obj.containsKey("liveclass")) {//缓存直播间分类
JSONArray levelArray = obj.getJSONArray("liveclass");
new LiveClassManager(context).UpDataLiveClass(levelArray.toJSONString());
}
if (obj.containsKey("apk_ver")) {
APKManager.get().setApkVer(obj.getString("apk_ver"));
}
if (obj.containsKey("apk_url")) {
APKManager.get().setAPKUrl(obj.getString("apk_url"));
}
if (obj.containsKey("apk_des")) {
APKManager.get().setAPKDes(obj.getString("apk_des"));
}
if (obj.containsKey("google_isup")) {
APKManager.get().setAPKGoogleIsUp(obj.getInteger("google_isup"));
}
if (obj.containsKey("isup")) {
APKManager.get().setAPKIsUp(obj.getInteger("isup"));
}
if (obj.containsKey("clarity")) {
IMLoginManager.get(context).setClarity(obj.getString("clarity"));
}
if (obj.containsKey("defaultBubbleUrl")) {
IMLoginManager.get(context).setDefaultBubbleUrl(obj.getString("defaultBubbleUrl"));
}
if (obj.containsKey("gift_quantity")) {
JSONArray giftQuantity = obj.getJSONArray("gift_quantity");
new GiftQuantityManager(context).UpGiftQuantity(giftQuantity.toJSONString());
}
} catch (Exception e) {
e.printStackTrace();
String error = "info[0]:" + info[0] + "\n\n\n" + "Exception:" + e.getClass() + "---message--->" + e.getMessage();
ErrorActivity.forward("GetConfig接口返回数据异常", error);
}
} else if (code == 1000) {
new DialogUitl
.Builder(context)
.setContent(msg)
.setCancelable(false)
.setClickCallback3(new DialogUitl.SimpleCallback3() {
@Override
public void onConfirmClick(Dialog dialog) {
AppManager.getInstance().AppExit();
}
@Override
public void onCancel() {
AppManager.getInstance().AppExit();
}
}).build().show();
} else {
ToastUtil.show(context.getString(R.string.net_error) + "code:" + code + " msg:" + msg);
}
}
@Override
public void onError() {
HttpClient.getInstance().get("Home.getConfig", CommonHttpConsts.GET_CONFIG).params("langue", lang).params("version", "" + VersionUtil.getVersion()).params("from", "android").params("appType", "1").execute(new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
if (code == 0 && info.length > 0) {
try {
JSONObject obj = JSON.parseObject(info[0]);
ConfigBean bean = JSON.toJavaObject(obj, ConfigBean.class);
CommonAppConfig.getInstance().setConfig(bean);
CommonAppConfig.getInstance().setLevel(obj.getString("level"));
CommonAppConfig.getInstance().setAnchorLevel(obj.getString("levelanchor"));
CommonAppConfig.getInstance().alert_time = obj.getInteger("alert_time");
CommonAppConfig.getInstance().alert_end_time = obj.getInteger("alert_end_time");
//解析粉丝徽章
CommonAppConfig.getInstance().setAnchorFansMedal(obj.getString("levelfans"));
SpUtil.getInstance().setStringValue(SpUtil.CONFIG, info[0]);
if (commonCallback != null) {
commonCallback.callback(null);
commonCallback.callback(bean);
}
if (obj.containsKey("is_chat")) {
IMLoginManager.get(context).initChat(String.valueOf(obj.getInteger("is_chat")));
}
if (obj.containsKey("levelfans")) {
JSONArray levelArray = obj.getJSONArray("levelfans");
new NewLevelManager(context).upDataFansLevel(levelArray.toJSONString());
}
if (obj.containsKey("level_new")) {//缓存等级数据
JSONArray levelArray = obj.getJSONArray("level_new");
new NewLevelManager(context).UpDataLevel(levelArray.toJSONString());
}
if (obj.containsKey("levelanchor_new")) {//缓存等级数据
JSONArray levelArray = obj.getJSONArray("levelanchor_new");
new NewLevelManager(context).UpAnchorDataLevel(levelArray.toJSONString());
}
if (obj.containsKey("liveclass")) {//缓存直播间分类
JSONArray levelArray = obj.getJSONArray("liveclass");
new LiveClassManager(context).UpDataLiveClass(levelArray.toJSONString());
}
if (obj.containsKey("apk_ver")) {
APKManager.get().setApkVer(obj.getString("apk_ver"));
}
if (obj.containsKey("apk_url")) {
APKManager.get().setAPKUrl(obj.getString("apk_url"));
}
if (obj.containsKey("apk_des")) {
APKManager.get().setAPKDes(obj.getString("apk_des"));
}
if (obj.containsKey("google_isup")) {
APKManager.get().setAPKGoogleIsUp(obj.getInteger("google_isup"));
}
if (obj.containsKey("isup")) {
APKManager.get().setAPKIsUp(obj.getInteger("isup"));
}
if (obj.containsKey("clarity")) {
IMLoginManager.get(context).setClarity(obj.getString("clarity"));
}
if (obj.containsKey("defaultBubbleUrl")) {
IMLoginManager.get(context).setDefaultBubbleUrl(obj.getString("defaultBubbleUrl"));
}
if (obj.containsKey("gift_quantity")) {
JSONArray giftQuantity = obj.getJSONArray("gift_quantity");
new GiftQuantityManager(context).UpGiftQuantity(giftQuantity.toJSONString());
}
} catch (Exception e) {
e.printStackTrace();
String error = "info[0]:" + info[0] + "\n\n\n" + "Exception:" + e.getClass() + "---message--->" + e.getMessage();
ErrorActivity.forward("GetConfig接口返回数据异常", error);
}
});
} else if (code == 1000) {
new DialogUitl.Builder(context).setContent(msg).setCancelable(false).setClickCallback3(new DialogUitl.SimpleCallback3() {
@Override
public void onConfirmClick(Dialog dialog) {
AppManager.getInstance().AppExit();
}
@Override
public void onCancel() {
AppManager.getInstance().AppExit();
}
}).build().show();
} else {
ToastUtil.show(context.getString(R.string.net_error) + "code:" + code + " msg:" + msg);
}
}
@Override
public void onError() {
if (commonCallback != null) {
commonCallback.callback(null);
}
}
});
}
@@ -280,20 +271,18 @@ public class CommonHttpUtil {
* QQ登录的时候 获取unionID 与PC端互通的时候用
*/
public static void getQQLoginUnionID(String accessToken, final CommonCallback<String> commonCallback) {
OkGo.<String>get("https://graph.qq.com/oauth2.0/me?access_token=" + accessToken + "&unionid=1")
.tag(CommonHttpConsts.GET_QQ_LOGIN_UNION_ID)
.execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
if (commonCallback != null) {
String data = response.body();
data = data.substring(data.indexOf("{"), data.lastIndexOf("}") + 1);
L.e("getQQLoginUnionID------>" + data);
JSONObject obj = JSON.parseObject(data);
commonCallback.callback(obj.getString("unionid"));
}
}
});
OkGo.<String>get("https://graph.qq.com/oauth2.0/me?access_token=" + accessToken + "&unionid=1").tag(CommonHttpConsts.GET_QQ_LOGIN_UNION_ID).execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
if (commonCallback != null) {
String data = response.body();
data = data.substring(data.indexOf("{"), data.lastIndexOf("}") + 1);
L.e("getQQLoginUnionID------>" + data);
JSONObject obj = JSON.parseObject(data);
commonCallback.callback(obj.getString("unionid"));
}
}
});
}
@@ -312,13 +301,11 @@ public class CommonHttpUtil {
ToastUtil.show(WordUtil.getString(R.string.cannot_follow_self));
return;
}
HttpClient.getInstance().get("User.setAttents", tag)
.params("touid", touid)
.execute(new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
if (code == 0 && info.length > 0 || code == 1001) {
int isAttention = JSON.parseObject(info[0]).getIntValue("isattent");//1是 关注 0是未关注
HttpClient.getInstance().get("User.setAttents", tag).params("touid", touid).execute(new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
if (code == 0 && info.length > 0 || code == 1001) {
int isAttention = JSON.parseObject(info[0]).getIntValue("isattent");//1是 关注 0是未关注
/* if (code == 1001) {
if (WordUtil.isNewZh()) {
ToastUtil.show("粉絲團等級已清零,待領取獎勵已自動領取至【個性裝扮】");
@@ -326,13 +313,13 @@ public class CommonHttpUtil {
ToastUtil.show("The level of the fan club has been cleared, and the rewards to be claimed have been automatically received to [Personalized Dressing]");
}
}*/
EventBus.getDefault().post(new FollowEvent(touid, isAttention));
if (callback != null) {
callback.callback(isAttention);
}
}
EventBus.getDefault().post(new FollowEvent(touid, isAttention));
if (callback != null) {
callback.callback(isAttention);
}
});
}
}
});
}
/**
@@ -340,15 +327,14 @@ public class CommonHttpUtil {
*/
public static void getBalance(HttpCallback callback) {
String isGoogle;
if (CommonAppConfig.IS_GOOGLE_PLAY) {
if (CommonAppConfig.IS_GOOGLE_PLAY == 1) {
isGoogle = "1";
} else if (CommonAppConfig.IS_GOOGLE_PLAY == 2) {
isGoogle = "2";
} else {
isGoogle = "-1";
}
HttpClient.getInstance().get("User.getBalance", CommonHttpConsts.GET_BALANCE)
.params("type", 0)
.params("isGooglePay", isGoogle)
.execute(callback);
HttpClient.getInstance().get("User.getBalance", CommonHttpConsts.GET_BALANCE).params("type", 0).params("isGooglePay", isGoogle).execute(callback);
}
/**
@@ -357,8 +343,7 @@ public class CommonHttpUtil {
* @param callback
*/
public static void getAliOrder(String parmas, HttpCallback callback) {
HttpClient.getInstance().get(parmas, CommonHttpConsts.GET_ALI_ORDER)
.execute(callback);
HttpClient.getInstance().get(parmas, CommonHttpConsts.GET_ALI_ORDER).execute(callback);
}
/**
@@ -367,8 +352,7 @@ public class CommonHttpUtil {
* @param callback
*/
public static void getWxOrder(String parmas, HttpCallback callback) {
HttpClient.getInstance().get(parmas, CommonHttpConsts.GET_WX_ORDER)
.execute(callback);
HttpClient.getInstance().get(parmas, CommonHttpConsts.GET_WX_ORDER).execute(callback);
}
@@ -379,8 +363,7 @@ public class CommonHttpUtil {
*/
public static void getCashierOrder(String parmas, HttpCallback callback) {
HttpClient.getInstance().get(parmas, CommonHttpConsts.GET_CASHIER_ORDER)
.execute(callback);
HttpClient.getInstance().get(parmas, CommonHttpConsts.GET_CASHIER_ORDER).execute(callback);
}
@@ -392,8 +375,7 @@ public class CommonHttpUtil {
public static void getWxH5Order(String parmas, HttpCallback callback) {
HttpClient.getInstance().get(parmas, CommonHttpConsts.GET_WX_H5ORDER)
.execute(callback);
HttpClient.getInstance().get(parmas, CommonHttpConsts.GET_WX_H5ORDER).execute(callback);
}
@@ -401,8 +383,7 @@ public class CommonHttpUtil {
* 检查token是否失效
*/
public static void checkTokenInvalid() {
HttpClient.getInstance().get("User.ifToken", CommonHttpConsts.CHECK_TOKEN_INVALID)
.execute(NO_CALLBACK);
HttpClient.getInstance().get("User.ifToken", CommonHttpConsts.CHECK_TOKEN_INVALID).execute(NO_CALLBACK);
}
@@ -410,32 +391,15 @@ public class CommonHttpUtil {
* 谷歌支付成功后,通知自己服务器
*/
public static void notifyMeGoogle(String purchaseToken, String productId, String orderno, HttpCallback callback) {
HttpClient.getInstance().get(CommonHttpConsts.NOTIFY_GOOGLE, CommonHttpConsts.NOTIFY_GOOGLE)
.params("purchaseToken", purchaseToken)
.params("productId", productId)
.params("orderno", orderno)
.params("package_name", "com.pdlive.shayu")
.execute(callback);
HttpClient.getInstance().get(CommonHttpConsts.NOTIFY_GOOGLE, CommonHttpConsts.NOTIFY_GOOGLE).params("purchaseToken", purchaseToken).params("productId", productId).params("orderno", orderno).params("package_name", "com.pdlive.shayu").execute(callback);
}
public static void notifyGoogle(String purchaseToken, String orderNo, String tradeNo, String allData, String gps_adid, HttpCallback callback) {
HttpClient.getInstance().get(CommonHttpConsts.NOTIFY_GOOGLE, CommonHttpConsts.NOTIFY_GOOGLE)
.params("purchaseToken", purchaseToken)
.params("orderno", orderNo)
.params("trade_no", tradeNo)
.params("allData", allData)
.params("gps_adid", gps_adid)
.params("package_name", "com.pdlive.shayu")
.execute(callback);
HttpClient.getInstance().get(CommonHttpConsts.NOTIFY_GOOGLE, CommonHttpConsts.NOTIFY_GOOGLE).params("purchaseToken", purchaseToken).params("orderno", orderNo).params("trade_no", tradeNo).params("allData", allData).params("gps_adid", gps_adid).params("package_name", "com.pdlive.shayu").execute(callback);
}
public static void Google_sec_pay(String purchaseToken, String orderNo, String tradeNo, HttpCallback callback) {
HttpClient.getInstance().get("Charge.Google_sec_pay", "Charge.Google_sec_pay")
.params("purchaseToken", purchaseToken)
.params("orderno", orderNo)
.params("trade_no", tradeNo)
.params("package_name", "com.pdlive.shayu")
.execute(callback);
HttpClient.getInstance().get("Charge.Google_sec_pay", "Charge.Google_sec_pay").params("purchaseToken", purchaseToken).params("orderno", orderNo).params("trade_no", tradeNo).params("package_name", "com.pdlive.shayu").execute(callback);
}
//不做任何操作的HttpCallback
@@ -452,20 +416,9 @@ public class CommonHttpUtil {
public static void setCommunityReport(String community_type, String comment_id, String dynamic_id, String content, File file1, File file2, File file3, String report_type, HttpCallback callback) {
PostRequest<JsonBean> request;
if ("2".equals(community_type)) {
request = HttpClient.getInstance().post(CommonHttpConsts.COMMUNITY_SETREPORT, CommonHttpConsts.COMMUNITY_SETREPORT)
.isMultipart(true)
.params("dynamic_id", dynamic_id)
.params("report_type", report_type)
.params("content", content)
.params("community_type", community_type)
.params("comment_id", comment_id);
request = HttpClient.getInstance().post(CommonHttpConsts.COMMUNITY_SETREPORT, CommonHttpConsts.COMMUNITY_SETREPORT).isMultipart(true).params("dynamic_id", dynamic_id).params("report_type", report_type).params("content", content).params("community_type", community_type).params("comment_id", comment_id);
} else {
request = HttpClient.getInstance().post(CommonHttpConsts.COMMUNITY_SETREPORT, CommonHttpConsts.COMMUNITY_SETREPORT)
.isMultipart(true)
.params("dynamic_id", dynamic_id)
.params("report_type", report_type)
.params("content", content)
.params("community_type", community_type);
request = HttpClient.getInstance().post(CommonHttpConsts.COMMUNITY_SETREPORT, CommonHttpConsts.COMMUNITY_SETREPORT).isMultipart(true).params("dynamic_id", dynamic_id).params("report_type", report_type).params("content", content).params("community_type", community_type);
}
if (file1 != null) {
request.params("file1", file1);
@@ -483,9 +436,7 @@ public class CommonHttpUtil {
* 用户个人主页信息
*/
public static void getUserBaseinfo(String touid, HttpCallback callback) {
HttpClient.getInstance().get("User.getUserBaseinfo", CommonHttpConsts.GET_USER_BASEINFO)
.params("touid", touid)
.execute(callback);
HttpClient.getInstance().get("User.getUserBaseinfo", CommonHttpConsts.GET_USER_BASEINFO).params("touid", touid).execute(callback);
}
//
// //埋点唯一性

View File

@@ -9,7 +9,6 @@ import com.yunbao.common.bean.BlindBoxInfoModel;
import com.yunbao.common.bean.CheckLiveModel;
import com.yunbao.common.bean.CheckRemainingBalance;
import com.yunbao.common.bean.ContributeModel;
import com.yunbao.common.bean.CoolConfig;
import com.yunbao.common.bean.CreateSudRoomModel;
import com.yunbao.common.bean.CustomSidebarInfoModel;
import com.yunbao.common.bean.DiscountsModel;
@@ -47,7 +46,6 @@ import com.yunbao.common.bean.OpenAdModel;
import com.yunbao.common.bean.PkRankBean;
import com.yunbao.common.bean.PrankGiftBean;
import com.yunbao.common.bean.PrankHttpTurntableBean;
import com.yunbao.common.bean.QuickGiftSendGiftModel;
import com.yunbao.common.bean.RandomPkUserBean;
import com.yunbao.common.bean.RankPkInfoBean;
import com.yunbao.common.bean.RedPacketDetailsBean;
@@ -1063,32 +1061,9 @@ public interface PDLiveApi {
@GET("/api/public/?service=Sudgameserver.deductMoney")
Observable<ResponseModel<Object>> deductMoney(
@Query("room_id") String roomId
);
@GET("/api/public/?service=Sudgameserver.checkCurrency")
Observable<ResponseModel<CheckCurrencyModel>> checkCurrency(
);
@GET("/api/public/?service=Quickgift.sendGift")
Observable<ResponseModel<QuickGiftSendGiftModel>> quickGiftSendGift(
@Query("quick_gift_number") String quickGiftNumber,
@Query("liveuid") String liveUid,
@Query("stream") String stream
);
@GET("/api/public/?service=Quickgift.viewingDurationGetGift")
Observable<ResponseModel<QuickGiftSendGiftModel>> viewingDurationGetGift(
@Query("liveuid") String liveUid
);
@GET("/api/public/?service=cool.config")
Observable<ResponseModel<CoolConfig>> getCoolConfig();
@FormUrlEncoded
@POST("/api/public/?service=cool.buy_ticket")
Observable<ResponseModel<Object>> buyTicket(
@Field("quantity") String quantity
);
}

View File

@@ -11,7 +11,6 @@ import com.yunbao.common.bean.BaseModel;
import com.yunbao.common.bean.BlindBoxInfoModel;
import com.yunbao.common.bean.CheckLiveModel;
import com.yunbao.common.bean.CheckRemainingBalance;
import com.yunbao.common.bean.CoolConfig;
import com.yunbao.common.bean.CreateSudRoomModel;
import com.yunbao.common.bean.CustomSidebarInfoModel;
import com.yunbao.common.bean.DiscountsModel;
@@ -45,7 +44,6 @@ import com.yunbao.common.bean.OpenAdModel;
import com.yunbao.common.bean.PkRankBean;
import com.yunbao.common.bean.PrankGiftBean;
import com.yunbao.common.bean.PrankHttpTurntableBean;
import com.yunbao.common.bean.QuickGiftSendGiftModel;
import com.yunbao.common.bean.RandomPkUserBean;
import com.yunbao.common.bean.RankPkInfoBean;
import com.yunbao.common.bean.RedPacketDetailsBean;
@@ -2319,21 +2317,21 @@ public class LiveNetManager {
}
public void deductMoney(String roomId) {
// API.get().pdLiveApi(mContext)
// .deductMoney(roomId)
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .subscribe(new Consumer<ResponseModel<Object>>() {
// @Override
// public void accept(ResponseModel<Object> objectResponseModel) throws Exception {
//
// }
// }, new Consumer<Throwable>() {
// @Override
// public void accept(Throwable throwable) throws Exception {
//
// }
// }).isDisposed();
API.get().pdLiveApi(mContext)
.deductMoney(roomId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResponseModel<Object>>() {
@Override
public void accept(ResponseModel<Object> objectResponseModel) throws Exception {
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
}
}).isDisposed();
}
public void checkCurrency(HttpCallback<CheckCurrencyModel> callback) {
@@ -2386,102 +2384,6 @@ public class LiveNetManager {
}).isDisposed();
}
public void viewingDurationGetGift(String liveUid, HttpCallback<QuickGiftSendGiftModel> callback) {
API.get().pdLiveApi(mContext)
.viewingDurationGetGift(liveUid)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResponseModel<QuickGiftSendGiftModel>>() {
@Override
public void accept(ResponseModel<QuickGiftSendGiftModel> quickGiftSendGiftModelResponseModel) throws Exception {
if (callback != null) {
callback.onSuccess(quickGiftSendGiftModelResponseModel.getData().getInfo());
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
if (callback != null) {
callback.onError(mContext.getString(R.string.net_error));
}
}
}).isDisposed();
}
public void getCoolConfig(HttpCallback<CoolConfig> callback) {
API.get().pdLiveApi(mContext)
.getCoolConfig()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResponseModel<CoolConfig>>() {
@Override
public void accept(ResponseModel<CoolConfig> coolConfigResponseModel) throws Exception {
if (callback != null) {
callback.onSuccess(coolConfigResponseModel.getData().getInfo());
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
if (callback != null) {
callback.onError(mContext.getString(R.string.net_error));
}
}
}).isDisposed();
}
public void buyTicket(String quantity, HttpCallback<String> callback) {
API.get().pdLiveApi(mContext)
.buyTicket(quantity)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResponseModel<Object>>() {
@Override
public void accept(ResponseModel<Object> objectResponseModel) throws Exception {
if (callback != null) {
if (objectResponseModel.getData().getCode() == 200) {
callback.onSuccess("1");
} else if (objectResponseModel.getData().getCode() == 500) {
callback.onSuccess("2");
} else {
callback.onError(objectResponseModel.getData().getMsg());
}
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
if (callback != null) {
callback.onError(mContext.getString(R.string.net_error));
}
}
}).isDisposed();
}
public void quickGiftSendGift(String quickGiftNumber, String liveUid, String stream, HttpCallback<QuickGiftSendGiftModel> callback) {
API.get().pdLiveApi(mContext)
.quickGiftSendGift(quickGiftNumber, liveUid, stream)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResponseModel<QuickGiftSendGiftModel>>() {
@Override
public void accept(ResponseModel<QuickGiftSendGiftModel> quickGiftSendGiftModelResponseModel) throws Exception {
if (callback != null) {
callback.onSuccess(quickGiftSendGiftModelResponseModel.getData().getInfo());
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
if (callback != null) {
callback.onError(mContext.getString(R.string.net_error));
}
}
}).isDisposed();
}
public void getRoomList(String sudGameId, String threshold, String roomHolderType, String liveUid, String currencyType, int page, HttpCallback<List<SudRoomListModel>> callback) {
API.get().pdLiveApi(mContext)
.getRoomList(sudGameId, threshold, roomHolderType, liveUid, currencyType, page)

View File

@@ -60,13 +60,6 @@ public class IMLoginManager extends BaseCacheManager {
public boolean getRedPoint() {
return !TextUtils.isEmpty(getString("RedPoint")) && !TextUtils.equals(getString("RedPoint"), "1");
}
public void setQuickGiftIfFirst() {
put("quick_gift_if_first", "1");
}
public boolean getQuickGiftIfFirst() {
return TextUtils.isEmpty(getString("quick_gift_if_first")) || !TextUtils.equals(getString("quick_gift_if_first"), "1");
}
public void setSudGameMin() {
put("SudGameMin", "0");

View File

@@ -11,8 +11,6 @@ import com.yunbao.common.dialog.OpenAdBottomDialogPopup;
import com.yunbao.common.dialog.OpenAdCenterDialogPopup;
import com.yunbao.common.http.base.HttpCallback;
import com.yunbao.common.http.live.LiveNetManager;
import com.yunbao.common.utils.SpUtil;
import com.yunbao.common.utils.StringUtil;
import com.yunbao.common.utils.ToastUtil;
import java.util.ArrayList;
@@ -95,18 +93,6 @@ public class OpenAdManager {
if (type == OpenAdModel.TYPE_LIVE && !model.userIsPermission(isGuard)) {
continue;
}
if (model.getShowModel() == OpenAdModel.SHOW_ONE) {
if (SpUtil.getInstance().getBooleanValue("open_ad_popup_" + model.getId())) {
continue;
}
SpUtil.getInstance().setBooleanValue("open_ad_popup_" + model.getId(), true);
}
if (model.getShowModel() == OpenAdModel.SHOW_DIY) {
String value = SpUtil.getStringValue("open_ad_popup_time_" + model.getId());
if (!StringUtil.isEmpty(value) && System.currentTimeMillis() < Long.parseLong(value)) {
continue;
}
}
if (runnableMap.containsKey(model.getId())) {
AdRunnable runnable = runnableMap.get(model.getId());
if (runnable != null) {
@@ -180,10 +166,6 @@ public class OpenAdManager {
return;
}
showMap.put(model.getId(), true);
if (model.getShowModel() == OpenAdModel.SHOW_DIY) {
String nextTime= String.valueOf(System.currentTimeMillis() + (Long.parseLong(model.getSection()) * 60 * 1000));
SpUtil.setStringValue("open_ad_popup_time_" + model.getId(), nextTime);
}
if (model.getModel() == OpenAdModel.MODEL_BOTTOM) {
new OpenAdBottomDialogPopup(CommonAppContext.getTopActivity(), model).setListener((bean, position) -> {
}).showDialog();

View File

@@ -4,12 +4,8 @@ import android.app.Activity;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.NonNull;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.android.billingclient.api.Purchase;
import com.android.billingclient.api.SkuDetails;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.Constants;
import com.yunbao.common.R;
@@ -19,16 +15,12 @@ import com.yunbao.common.event.CoinChangeEvent;
import com.yunbao.common.http.CommonHttpUtil;
import com.yunbao.common.http.HttpCallback;
import com.yunbao.common.pay.wx.WxPayBuilder;
import com.yunbao.common.utils.GoogleBillingUtil;
import com.yunbao.common.utils.OnGoogleBillingListener;
import com.yunbao.common.utils.StringUtil;
import com.yunbao.common.utils.ToastUtil;
import org.greenrobot.eventbus.EventBus;
import java.lang.ref.WeakReference;
import java.util.List;
import java.util.Locale;
/**
* Created by cxf on 2019/4/22.
@@ -48,7 +40,7 @@ public class PayPresenter {
private PayCallback mPayCallback;
private GoogleBillingUtil googleBillingUtil;
//private GoogleBillingUtil googleBillingUtil;
private String TAG = "PayPresenter";
private String[] arrPro = {"1"};
private String mOrderid;
@@ -174,12 +166,12 @@ public class PayPresenter {
}
private void initGooglePay() {
GoogleBillingUtil.isDebug(true);
/*GoogleBillingUtil.isDebug(true);
GoogleBillingUtil.setSkus(arrPro, null);
GoogleBillingUtil.setIsAutoAcknowledgePurchase(true);//设置自动确认购买
googleBillingUtil = GoogleBillingUtil.getInstance()
.addOnGoogleBillingListener(mActivity, mOnMyGoogleBillingListener)
.build(mActivity);
.build(mActivity);*/
}
private void paypalPay(String orderParams) {
@@ -370,125 +362,10 @@ public class PayPresenter {
}
private OnGoogleBillingListener mOnMyGoogleBillingListener = new OnGoogleBillingListener() {
@Override
public void onSetupSuccess(boolean isSelf) {
super.onSetupSuccess(isSelf);
Log.d(TAG, "内购服务初始化完成");
checkSubs();
}
@Override
public void onQuerySuccess(@NonNull String skuType, @NonNull List<SkuDetails> list, boolean isSelf) {
// if(!isSelf) return;
// StringBuffer tempBuffer =new StringBuffer();
// tempBuffer.append("查询商品信息成功,数量=" + list.size() + "\n");
// Log.d(TAG,tempBuffer.toString());
// if (list.size()<=0){
// ToastUtil.show("商品金额过大,无法支付");
// return;
// }
// for(int i=0;i<list.size();i++){
// String details = String.format(Locale.getDefault(),"%s , %s",
// list.get(i).getSku(),list.get(i).getPrice()
// );
// tempBuffer.append(details);
// if(i!=list.size()-1){
// tempBuffer.append("\n");
// }
// }
// googleBillingUtil.purchaseInApp(mActivity,"zs640");
googleBillingUtil.purchaseInApp(mActivity, googleBillingUtil.getInAppSkuByPosition(0));
// Log.d(TAG,tempBuffer.toString());
}
@Override
public boolean onPurchaseSuccess(@NonNull Purchase purchase, boolean isSelf) {
StringBuffer tempBuffer = new StringBuffer();
if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
tempBuffer.append("购买成功:");
//通知自己服务器
if (mOrderid == null || purchase.getOrderId() == null) {
return false;
}
String allData = "";
allData = "OrderId=" + purchase.getOrderId() +
",PackageName=" + purchase.getPackageName() +
",Sku=" + "purchase.getSku()" +
",PurchaseTime=" + purchase.getPurchaseTime() +
",PurchaseToken=" + purchase.getPurchaseToken() +
",DeveloperPayload=" + purchase.getDeveloperPayload() +
",OriginalJson=" + purchase.getOriginalJson() +
",PurchaseState=" + purchase.getPurchaseState() +
",Signature=" + purchase.getSignature();
// CommonHttpUtil.notifyGoogle("1",mOrderid,purchase.getOrderId(),allData, new HttpCallback() {
// @Override
// public void onSuccess(int code, String msg, String[] info) {
// if(code==0){
// try {
// ToastUtil.show("购买成功!");
// }catch (Exception e){
// e.printStackTrace();
// }
// }else {
// ToastUtil.show("购买失败,请联系客服");
// }
// }
// });
} else {
tempBuffer.append("暂未支付:");
}
String details = String.format(Locale.getDefault(), "%s \n", " purchase.getSku()");
tempBuffer.append(details);
Log.d(TAG, tempBuffer.toString());
return true;//自动消耗(只有当isSelf为true,并且支付状态为PURCHASED时该值才会生效)
}
@Override
public boolean onRecheck(@NonNull String skuType, @NonNull Purchase purchase, boolean isSelf) {
StringBuffer tempBuffer = new StringBuffer();
tempBuffer.append("检测到未处理的订单($skuType):${purchase.sku}()");
Log.d(TAG, tempBuffer.toString());
return true;
}
@Override
public void onBillingServiceDisconnected() {
super.onBillingServiceDisconnected();
}
@Override
public void onConsumeSuccess(@NonNull String purchaseToken, boolean isSelf) {
Log.d(TAG, "消耗商品成功:$purchaseToken");
}
@Override
public void onAcknowledgePurchaseSuccess(boolean isSelf) {
Log.d(TAG, "确认购买商品成功");
}
@Override
public void onFail(@NonNull GoogleBillingUtil.GoogleBillingListenerTag tag, int responseCode, boolean isSelf) {
Log.d(TAG, "操作失败:tag=${" + tag.name() + "responseCode=" + responseCode);
}
@Override
public void onError(@NonNull GoogleBillingUtil.GoogleBillingListenerTag tag, boolean isSelf) {
Log.d(TAG, "发生错误:tag=" + tag.name());
}
};
//private OnGoogleBillingListener mOnMyGoogleBillingListener = null;
private void checkSubs() {
int size = googleBillingUtil.getPurchasesSizeSubs(mActivity);
/*int size = googleBillingUtil.getPurchasesSizeSubs(mActivity);
switch (size) {
case 0:
//不具备有效订阅
@@ -502,18 +379,18 @@ public class PayPresenter {
//具有有效订阅
Log.d(TAG, "有效订阅数:$size(具备有效订阅)");
break;
}
}*/
}
public void release() {
mActivity = null;
mPayCallback = null;
if (googleBillingUtil != null) {
/*if (googleBillingUtil != null) {
googleBillingUtil.onDestroy(mActivity);
//退出程序的时候可以调用(实验性)
GoogleBillingUtil.endConnection();
}
}*/
}

View File

@@ -0,0 +1,62 @@
package com.yunbao.common.pay.hw;
import android.app.Activity;
import android.content.Intent;
import org.json.JSONObject;
/**
* 华为支付
*/
public class HwBuilder {
private Activity mActivity;
public HwBuilder(Activity activity) {
mActivity = activity;
}
/**
* 支付
*/
public void pay(String changeid) {
try {
Class<?> clz = mActivity.getClassLoader().loadClass("com.shayu.lib_huawei.utils.HuaWeiPayManage");
Object invite = clz.getConstructor(Activity.class).newInstance(mActivity);
invite.getClass().getMethod("pay", String.class).invoke(invite, changeid);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 消耗所有商品
*/
public void consume() {
try {
Class<?> clz = mActivity.getClassLoader().loadClass("com.shayu.lib_huawei.utils.HuaWeiPayManage");
Object invite = clz.getConstructor(Activity.class).newInstance(mActivity);
invite.getClass().getMethod("consume").invoke(invite);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 获取支付结果
*
* @return
*/
public JSONObject getPayResult(Intent intent) {
JSONObject object;
try {
Class<?> clz = mActivity.getClassLoader().loadClass("com.shayu.lib_huawei.utils.HuaWeiPayManage");
Object invite = clz.getConstructor(Activity.class).newInstance(mActivity);
object = (JSONObject) invite.getClass().getMethod("getPayResult", Intent.class).invoke(invite, intent);
} catch (Exception e) {
throw new RuntimeException(e);
}
return object;
}
}

View File

@@ -1,926 +0,0 @@
package com.yunbao.common.utils;
import android.app.Activity;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.billingclient.api.AcknowledgePurchaseParams;
import com.android.billingclient.api.AcknowledgePurchaseResponseListener;
import com.android.billingclient.api.BillingClient;
import com.android.billingclient.api.BillingClientStateListener;
import com.android.billingclient.api.BillingFlowParams;
import com.android.billingclient.api.BillingResult;
import com.android.billingclient.api.ConsumeParams;
import com.android.billingclient.api.ConsumeResponseListener;
import com.android.billingclient.api.Purchase;
import com.android.billingclient.api.PurchaseHistoryResponseListener;
import com.android.billingclient.api.PurchasesUpdatedListener;
import com.android.billingclient.api.SkuDetails;
import com.android.billingclient.api.SkuDetailsParams;
import com.android.billingclient.api.SkuDetailsResponseListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 作者:天镜baobao
* 时间:2019/1/5 15:16
* 说明:允许使用但请遵循Apache License 2.0
* 使用:
* Copyright 2019 天镜baobao
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
@SuppressWarnings({"WeakerAccess", "unused", "UnusedReturnValue"})
public class GoogleBillingUtil {
private static final String TAG = "GoogleBillingUtil";
private static boolean IS_DEBUG = false;
private static String[] inAppSKUS = new String[]{};//内购ID,必填,注意!如果用不着的请去掉多余的""
private static String[] subsSKUS = new String[]{};//订阅ID,必填,注意!如果用不着的请去掉多余的""
public static final String BILLING_TYPE_INAPP = BillingClient.SkuType.INAPP;//内购
public static final String BILLING_TYPE_SUBS = BillingClient.SkuType.SUBS;//订阅
private static BillingClient mBillingClient;
private static BillingClient.Builder builder ;
private static List<OnGoogleBillingListener> onGoogleBillingListenerList = new ArrayList<>();
private static Map<String,OnGoogleBillingListener> onGoogleBillingListenerMap = new HashMap<>();
private MyPurchasesUpdatedListener purchasesUpdatedListener = new MyPurchasesUpdatedListener();
private static boolean isAutoAcknowledgePurchase = true;
private static final GoogleBillingUtil mGoogleBillingUtil = new GoogleBillingUtil() ;
private GoogleBillingUtil()
{
}
//region===================================初始化google应用内购买服务=================================
/**
* 设置skus
* @param inAppSKUS 内购id
* @param subsSKUS 订阅id
*/
public static void setSkus(@Nullable String[] inAppSKUS, @Nullable String[] subsSKUS){
if(inAppSKUS!=null){
GoogleBillingUtil.inAppSKUS = Arrays.copyOf(inAppSKUS,inAppSKUS.length);
}
if(subsSKUS!=null){
GoogleBillingUtil.subsSKUS = Arrays.copyOf(subsSKUS,subsSKUS.length);
}
}
private static <T> void copyToArray(T[] base,T[] target){
System.arraycopy(base, 0, target, 0, base.length);
}
public static GoogleBillingUtil getInstance()
{
return mGoogleBillingUtil;
}
/**
* 开始建立内购连接
* @param activity activity
*/
public GoogleBillingUtil build(Activity activity)
{
purchasesUpdatedListener.tag = getTag(activity);
if(mBillingClient==null)
{
synchronized (mGoogleBillingUtil)
{
if(mBillingClient==null)
{
builder = BillingClient.newBuilder(activity);
mBillingClient = builder.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
}
else
{
builder.setListener(purchasesUpdatedListener);
}
}
}
else
{
builder.setListener(purchasesUpdatedListener);
}
synchronized (mGoogleBillingUtil)
{
if(mGoogleBillingUtil.startConnection(activity))
{
mGoogleBillingUtil.queryInventoryInApp(getTag(activity));
mGoogleBillingUtil.queryInventorySubs(getTag(activity));
mGoogleBillingUtil.queryPurchasesInApp(getTag(activity));
}
}
return mGoogleBillingUtil;
}
public boolean startConnection(Activity activity){
return startConnection(getTag(activity));
}
private boolean startConnection(String tag)
{
if(mBillingClient==null)
{
log("初始化失败:mBillingClient==null");
return false;
}
if(!mBillingClient.isReady())
{
mBillingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
for(OnGoogleBillingListener listener:onGoogleBillingListenerList){
listener.onSetupSuccess(listener.tag.equals(tag));
}
queryInventoryInApp(tag);
queryInventorySubs(tag);
queryPurchasesInApp(tag);
}
else
{
log("初始化失败:onSetupFail:code="+billingResult.getResponseCode());
for(OnGoogleBillingListener listener:onGoogleBillingListenerList){
listener.onFail(GoogleBillingListenerTag.SETUP,billingResult.getResponseCode(), listener.tag.equals(tag));
}
}
}
@Override
public void onBillingServiceDisconnected() {
for(OnGoogleBillingListener listener:onGoogleBillingListenerList){
listener.onBillingServiceDisconnected();
}
log("初始化失败:onBillingServiceDisconnected");
}
});
return false;
}
else
{
return true;
}
}
//endregion
//region===================================查询商品=================================
/**
* 查询内购商品信息
*/
public void queryInventoryInApp(Activity activity)
{
queryInventoryInApp(getTag(activity));
}
private void queryInventoryInApp(String tag)
{
queryInventory(tag, BillingClient.SkuType.INAPP);
}
/**
* 查询订阅商品信息
*/
public void queryInventorySubs(Activity activity)
{
queryInventory(getTag(activity), BillingClient.SkuType.SUBS);
}
public void queryInventorySubs(String tag)
{
queryInventory(tag, BillingClient.SkuType.SUBS);
}
private void queryInventory(String tag,final String skuType) {
Runnable runnable=new Runnable() {
@Override
public void run() {
if (mBillingClient == null)
{
for(OnGoogleBillingListener listener:onGoogleBillingListenerList){
listener.onError(GoogleBillingListenerTag.QUERY, listener.tag.equals(tag));
}
return ;
}
ArrayList<String> skuList = new ArrayList<>();
if(skuType.equals(BillingClient.SkuType.INAPP))
{
Collections.addAll(skuList, inAppSKUS);
}
else if(skuType.equals(BillingClient.SkuType.SUBS))
{
Collections.addAll(skuList, subsSKUS);
}
if(!skuList.isEmpty()){
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(skuType);
mBillingClient.querySkuDetailsAsync(params.build(),new MySkuDetailsResponseListener(skuType,tag));
}
}
};
executeServiceRequest(tag,runnable);
}
//endregion
//region===================================购买商品=================================
/**
* 发起内购
* @param skuId 内购商品id
*/
public void purchaseInApp(Activity activity, String skuId)
{
purchase(activity,skuId, BillingClient.SkuType.INAPP);
}
/**
* 发起订阅
* @param skuId 订阅商品id
*/
public void purchaseSubs(Activity activity,String skuId)
{
purchase(activity,skuId, BillingClient.SkuType.SUBS);
}
private void purchase(Activity activity,final String skuId,final String skuType)
{
String tag = getTag(activity);
if(mBillingClient==null)
{
for(OnGoogleBillingListener listener:onGoogleBillingListenerList){
listener.onError(GoogleBillingListenerTag.PURCHASE, listener.tag.equals(tag));
}
return ;
}
if(startConnection(tag))
{
purchasesUpdatedListener.tag = tag;
builder.setListener(purchasesUpdatedListener);
List<String> skuList = new ArrayList<>();
skuList.add(skuId);
SkuDetailsParams skuDetailsParams = SkuDetailsParams.newBuilder()
.setSkusList(skuList)
.setType(skuType)
.build();
mBillingClient.querySkuDetailsAsync(skuDetailsParams, new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
}
});
mBillingClient.querySkuDetailsAsync(skuDetailsParams, new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
if(skuDetailsList!=null&&!skuDetailsList.isEmpty()){
BillingFlowParams flowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetailsList.get(0))
.build();
mBillingClient.launchBillingFlow(activity,flowParams);
}
}
});
}
else
{
for(OnGoogleBillingListener listener:onGoogleBillingListenerList){
listener.onError(GoogleBillingListenerTag.PURCHASE,listener.tag.equals(tag));
}
}
}
//endregion
//region===================================消耗商品=================================
/**
* 消耗商品
* @param purchaseToken {@link Purchase#getPurchaseToken()}
*/
public void consumeAsync(Activity activity,String purchaseToken)
{
consumeAsync(getTag(activity),purchaseToken,null);
}
public void consumeAsync(Activity activity,String purchaseToken,@Nullable String developerPayload)
{
consumeAsync(getTag(activity),purchaseToken,developerPayload);
}
/**
* 消耗商品
* @param purchaseToken {@link Purchase#getPurchaseToken()}
*/
private void consumeAsync(String tag,String purchaseToken){
consumeAsync(tag,purchaseToken,null);
}
private void consumeAsync(String tag,String purchaseToken,@Nullable String developerPayload)
{
if(mBillingClient==null)
{
return ;
}
ConsumeParams consumeParams = ConsumeParams.newBuilder()
.setPurchaseToken(purchaseToken)
.build();
mBillingClient.consumeAsync(consumeParams,new MyConsumeResponseListener(tag));
}
/**
* 消耗内购商品-通过sku数组
* @param sku sku
*/
public void consumeAsyncInApp(Activity activity,@NonNull String... sku)
{
if(mBillingClient==null) {
return ;
}
List<String> skuList = Arrays.asList(sku);
consumeAsyncInApp(activity,skuList,null);
}
/**
* 消耗内购商品-通过sku数组
* @param skuList sku数组
*/
public void consumeAsyncInApp(Activity activity,@NonNull List<String> skuList,@Nullable List<String> developerPayloadList)
{
if(mBillingClient==null) {
return ;
}
List<Purchase> purchaseList = queryPurchasesInApp(activity);
if(purchaseList!=null){
for(Purchase purchase : purchaseList){
int index = skuList.indexOf("purchase.getSku()");
if(index!=-1){
if(developerPayloadList!=null&&index<developerPayloadList.size()){
consumeAsync(activity,purchase.getPurchaseToken(),developerPayloadList.get(index));
}else{
consumeAsync(activity,purchase.getPurchaseToken(),null);
}
}
}
}
}
//endregion
//region===================================确认购买=================================
/**
* 确认购买
* @param activity activity
* @param purchaseToken token
*/
public void acknowledgePurchase(Activity activity,String purchaseToken){
acknowledgePurchase(activity,purchaseToken,null);
}
public void acknowledgePurchase(Activity activity,String purchaseToken,@Nullable String developerPayload){
acknowledgePurchase(getTag(activity),purchaseToken,developerPayload);
}
private void acknowledgePurchase(String tag,String purchaseToken){
acknowledgePurchase(tag,purchaseToken,null);
}
private void acknowledgePurchase(String tag,String purchaseToken,@Nullable String developerPayload){
if(mBillingClient==null)
{
return ;
}
AcknowledgePurchaseParams params = AcknowledgePurchaseParams.newBuilder()
.setPurchaseToken(purchaseToken)
.build();
mBillingClient.acknowledgePurchase(params,new MyAcknowledgePurchaseResponseListener(tag));
}
//endregion
//region===================================本地订单查询=================================
/**
* 获取已经内购的商品
* @return 商品列表
*/
public List<Purchase> queryPurchasesInApp(Activity activity)
{
return queryPurchases(getTag(activity), BillingClient.SkuType.INAPP);
}
private List<Purchase> queryPurchasesInApp(String tag)
{
return queryPurchases(tag, BillingClient.SkuType.INAPP);
}
/**
* 获取已经订阅的商品
* @return 商品列表
*/
public List<Purchase> queryPurchasesSubs(Activity activity)
{
return queryPurchases(getTag(activity), BillingClient.SkuType.SUBS);
}
private List<Purchase> queryPurchases(String tag, String skuType)
{
// if(mBillingClient==null)
// {
// return null;
// }
// if(!mBillingClient.isReady())
// {
// startConnection(tag);
// }
// else
// {
// Purchase.PurchasesResult purchasesResult = mBillingClient.queryPurchases(skuType);
// if(purchasesResult!=null)
// {
// if(purchasesResult.getResponseCode()== BillingClient.BillingResponseCode.OK)
// {
// List<Purchase> purchaseList = purchasesResult.getPurchasesList();
// if(purchaseList!=null&&!purchaseList.isEmpty())
// {
// for(Purchase purchase:purchaseList)
// {
// for(OnGoogleBillingListener listener : onGoogleBillingListenerList) {
// boolean isSelf = listener.tag.equals(tag);//是否是当前页面
// boolean isSuccess = listener.onRecheck(skuType, purchase, isSelf);//是否消耗或者确认
// if(isSelf){
// if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
// if(skuType.equals(BillingClient.SkuType.INAPP)) {
// if(isSuccess){
// consumeAsync(tag,purchase.getPurchaseToken());
// }else if(isAutoAcknowledgePurchase){
// if(!purchase.isAcknowledged()){
// acknowledgePurchase(tag,purchase.getPurchaseToken());
// }
// }
// }else if(skuType.equals(BillingClient.SkuType.SUBS)){
// if(isAutoAcknowledgePurchase){
// if(!purchase.isAcknowledged()){
// acknowledgePurchase(tag,purchase.getPurchaseToken());
// }
// }
// }
// }else{
// log("未支付的订单:"+"purchase.getSku()");
// }
// }
// }
// }
// }
// return purchaseList;
// }
// }
// }
return null;
}
//endregion
//region===================================在线订单查询=================================
/**
* 异步联网查询所有的内购历史-无论是过期的、取消、等等的订单
* @param listener 监听器
* @return 返回false的时候说明网络出错
*/
public boolean queryPurchaseHistoryAsyncInApp(PurchaseHistoryResponseListener listener){
if(isReady()) {
mBillingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.INAPP,listener);
return true;
}
return false;
}
/**
* 异步联网查询所有的订阅历史-无论是过期的、取消、等等的订单
* @param listener 监听器
* @return 返回false的时候说明网络出错
*/
public boolean queryPurchaseHistoryAsyncSubs(PurchaseHistoryResponseListener listener){
if(isReady()) {
mBillingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.SUBS,listener);
return true;
}else{
return false;
}
}
//endregion
//region===================================工具集合=================================
/**
* 获取有效订阅的数量
* @return -1查询失败0没有有效订阅>0具有有效的订阅
*/
public int getPurchasesSizeSubs(Activity activity)
{
List<Purchase> list = queryPurchasesSubs(activity);
if(list!=null)
{
return list.size();
}
return -1;
}
/**
* 通过sku获取订阅商品序号
* @param sku sku
* @return 序号
*/
public int getSubsPositionBySku(String sku)
{
return getPositionBySku(sku, BillingClient.SkuType.SUBS);
}
/**
* 通过sku获取内购商品序号
* @param sku sku
* @return 成功返回需要 失败返回-1
*/
public int getInAppPositionBySku(String sku)
{
return getPositionBySku(sku, BillingClient.SkuType.INAPP);
}
private int getPositionBySku(String sku,String skuType)
{
if(skuType.equals(BillingClient.SkuType.INAPP))
{
int i = 0;
for(String s:inAppSKUS)
{
if(s.equals(sku))
{
return i;
}
i++;
}
}
else if(skuType.equals(BillingClient.SkuType.SUBS))
{
int i = 0;
for(String s:subsSKUS)
{
if(s.equals(sku))
{
return i;
}
i++;
}
}
return -1;
}
/**
* 通过序号获取订阅sku
* @param position 序号
* @return sku
*/
public String getSubsSkuByPosition(int position)
{
if(position>=0&&position<subsSKUS.length)
{
return subsSKUS[position];
}
else {
return null;
}
}
/**
* 通过序号获取内购sku
* @param position 序号
* @return sku
*/
public String getInAppSkuByPosition(int position)
{
if(position>=0&&position<inAppSKUS.length)
{
return inAppSKUS[position];
}
else
{
return null;
}
}
/**
* 通过sku获取商品类型(订阅获取内购)
* @param sku sku
* @return inapp内购subs订阅
*/
public String getSkuType(String sku)
{
if(Arrays.asList(inAppSKUS).contains(sku))
{
return BillingClient.SkuType.INAPP;
}
else if(Arrays.asList(subsSKUS).contains(sku))
{
return BillingClient.SkuType.SUBS;
}
return null;
}
private String getTag(Activity activity){
if (activity==null){return "";}
return activity.getLocalClassName();
}
//endregion
//region===================================其他方法=================================
private void executeServiceRequest(String tag,final Runnable runnable) {
if(startConnection(tag))
{
runnable.run();
}
}
/**
* google内购服务是否已经准备好
* @return boolean
*/
public static boolean isReady() {
return mBillingClient!=null&&mBillingClient.isReady();
}
/**
* 设置是否自动确认购买
* @param isAutoAcknowledgePurchase boolean
*/
public static void setIsAutoAcknowledgePurchase(boolean isAutoAcknowledgePurchase){
GoogleBillingUtil.isAutoAcknowledgePurchase = isAutoAcknowledgePurchase;
}
/**
* 断开连接google服务
* 注意一般情况不建议调用该方法让google保留连接是最好的选择。
*/
public static void endConnection()
{
//注意一般情况不建议调用该方法让google保留连接是最好的选择。
if(mBillingClient!=null)
{
if(mBillingClient.isReady())
{
mBillingClient.endConnection();
mBillingClient = null;
}
}
}
//endregion
public GoogleBillingUtil addOnGoogleBillingListener(Activity activity,OnGoogleBillingListener onGoogleBillingListener){
String tag = getTag(activity);
onGoogleBillingListener.tag = tag;
onGoogleBillingListenerMap.put(getTag(activity),onGoogleBillingListener);
for(int i=onGoogleBillingListenerList.size()-1;i>=0;i--){
OnGoogleBillingListener listener = onGoogleBillingListenerList.get(i);
if(listener.tag.equals(tag)){
onGoogleBillingListenerList.remove(listener);
}
}
onGoogleBillingListenerList.add(onGoogleBillingListener);
return this;
}
public void removeOnGoogleBillingListener(OnGoogleBillingListener onGoogleBillingListener){
onGoogleBillingListenerList.remove(onGoogleBillingListener);
}
public void removeOnGoogleBillingListener(Activity activity){
String tag = getTag(activity);
for(int i=onGoogleBillingListenerList.size()-1;i>=0;i--){
OnGoogleBillingListener listener = onGoogleBillingListenerList.get(i);
if(listener.tag.equals(tag)){
removeOnGoogleBillingListener(listener);
onGoogleBillingListenerMap.remove(tag);
}
}
}
/**
* 清除内购监听器,防止内存泄漏-在Activity-onDestroy里面调用。
* 需要确保onDestroy和build方法在同一个线程。
*/
public void onDestroy(Activity activity){
if(builder!=null) {
builder.setListener(null);
}
if (activity != null)
removeOnGoogleBillingListener(activity);
}
/**
* Google购买商品回调接口(订阅和内购都走这个接口)
*/
private class MyPurchasesUpdatedListener implements PurchasesUpdatedListener
{
public String tag ;
@Override
public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> list) {
if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.OK&&list!=null)
{
for(Purchase purchase:list) {
for(OnGoogleBillingListener listener:onGoogleBillingListenerList){
boolean isSelf = listener.tag.equals(tag);//是否是当前页面
boolean isSuccess = listener.onPurchaseSuccess(purchase,isSelf);//是否自动消耗
if(isSelf&&purchase.getPurchaseState()== Purchase.PurchaseState.PURCHASED){
//是当前页面,并且商品状态为支付成功,才会进行消耗与确认的操作
String skuType = getSkuType("purchase.getSku()");
if(BillingClient.SkuType.INAPP.equals(skuType)){
if(isSuccess){
//进行消耗
consumeAsync(tag,purchase.getPurchaseToken());
}else if(isAutoAcknowledgePurchase){
//进行确认购买
if(!purchase.isAcknowledged()){
acknowledgePurchase(tag,purchase.getPurchaseToken());
}
}
}else if(BillingClient.SkuType.SUBS.equals(skuType)){
//进行确认购买
if(isAutoAcknowledgePurchase){
if(!purchase.isAcknowledged()){
acknowledgePurchase(tag,purchase.getPurchaseToken());
}
}
}
}else if(purchase.getPurchaseState()== Purchase.PurchaseState.PENDING){
log("待处理的订单:"+"purchase.getSku()");
}
}
}
}
else
{
if(IS_DEBUG){
log("购买失败,responseCode:"+billingResult.getResponseCode()+",msg:"+billingResult.getDebugMessage());
}
for(OnGoogleBillingListener listener:onGoogleBillingListenerList){
listener.onFail(GoogleBillingListenerTag.PURCHASE,billingResult.getResponseCode(),listener.tag.equals(tag));
}
}
}
}
/**
* Google查询商品信息回调接口
*/
private class MySkuDetailsResponseListener implements SkuDetailsResponseListener
{
private String skuType ;
private String tag;
public MySkuDetailsResponseListener(String skuType,String tag) {
this.skuType = skuType;
this.tag = tag;
}
@Override
public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> list) {
if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.OK&&list!=null)
{
for(OnGoogleBillingListener listener:onGoogleBillingListenerList){
listener.onQuerySuccess(skuType,list,listener.tag.equals(tag));
}
}
else
{
for(OnGoogleBillingListener listener:onGoogleBillingListenerList){
listener.onFail(GoogleBillingListenerTag.QUERY,billingResult.getResponseCode(),listener.tag.equals(tag));
}
if(IS_DEBUG){
log("查询失败,responseCode:"+billingResult.getResponseCode()+",msg:"+billingResult.getDebugMessage());
}
}
}
}
/**
* Googlg消耗商品回调
*/
private class MyConsumeResponseListener implements ConsumeResponseListener
{
private String tag ;
public MyConsumeResponseListener(String tag) {
this.tag = tag;
}
@Override
public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
for(OnGoogleBillingListener listener:onGoogleBillingListenerList){
listener.onConsumeSuccess(purchaseToken,listener.tag.equals(tag));
}
}else{
for(OnGoogleBillingListener listener:onGoogleBillingListenerList){
listener.onFail(GoogleBillingListenerTag.COMSUME,billingResult.getResponseCode(),listener.tag.equals(tag));
}
if(IS_DEBUG){
log("消耗失败,responseCode:"+billingResult.getResponseCode()+",msg:"+billingResult.getDebugMessage());
}
}
}
}
/**
* Googlg消耗商品回调
*/
private class MyAcknowledgePurchaseResponseListener implements AcknowledgePurchaseResponseListener {
private String tag ;
public MyAcknowledgePurchaseResponseListener(String tag) {
this.tag = tag;
}
@Override
public void onAcknowledgePurchaseResponse(BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
for(OnGoogleBillingListener listener:onGoogleBillingListenerList){
listener.onAcknowledgePurchaseSuccess(listener.tag.equals(tag));
}
}else{
for(OnGoogleBillingListener listener:onGoogleBillingListenerList){
listener.onFail(GoogleBillingListenerTag.AcKnowledgePurchase,billingResult.getResponseCode(),listener.tag.equals(tag));
}
if(IS_DEBUG){
log("确认购买失败,responseCode:"+billingResult.getResponseCode()+",msg:"+billingResult.getDebugMessage());
}
}
}
}
public enum GoogleBillingListenerTag{
QUERY("query"),
PURCHASE("purchase"),
SETUP("setup"),
COMSUME("comsume"),
AcKnowledgePurchase("AcKnowledgePurchase"),
;
public String tag ;
GoogleBillingListenerTag(String tag){
this.tag = tag;
}
}
private static void log(String msg)
{
if(IS_DEBUG)
{
Log.e(TAG,msg);
}
}
public static void isDebug(boolean isDebug){
GoogleBillingUtil.IS_DEBUG = isDebug;
}
}

View File

@@ -1,185 +0,0 @@
package com.yunbao.common.utils;
import android.app.Activity;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.billingclient.api.BillingClient;
import com.android.billingclient.api.BillingClientStateListener;
import com.android.billingclient.api.BillingFlowParams;
import com.android.billingclient.api.BillingResult;
import com.android.billingclient.api.ConsumeParams;
import com.android.billingclient.api.ConsumeResponseListener;
import com.android.billingclient.api.Purchase;
import com.android.billingclient.api.PurchasesResponseListener;
import com.android.billingclient.api.PurchasesUpdatedListener;
import com.android.billingclient.api.QueryPurchasesParams;
import com.android.billingclient.api.SkuDetails;
import com.android.billingclient.api.SkuDetailsParams;
import com.android.billingclient.api.SkuDetailsResponseListener;
import java.util.ArrayList;
import java.util.List;
/**
* 新写Google内付工具类做简单的封装
* 支付流程初始化Google支付服务-->查询商品-->购买-->支付成功回调-->消耗商品
*/
public class GoogleBillingUtilNew {
private BillingClient billingClient;
private Activity mContext;
private String TAG = "GoogleBillingUtilNew";
private static GoogleBillingUtilNew googleBillingUtilNew;
public static GoogleBillingUtilNew getInstance() {
if (googleBillingUtilNew == null) {
googleBillingUtilNew = new GoogleBillingUtilNew();
}
return googleBillingUtilNew;
}
public void initGooglePay(Activity mContext) {
this.mContext = mContext;
billingClient = BillingClient.newBuilder(mContext)
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
//请求连接到GooglePay
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
int code = billingResult.getResponseCode();
if (code != BillingClient.BillingResponseCode.OK) {
String msg = billingResult.getDebugMessage();
Log.e(TAG, "连接到GooglePay失败 code = " + code + " msg = " + msg);
return;
}
Log.e(TAG, "连接到GooglePay成功");
}
//连接失败
@Override
public void onBillingServiceDisconnected() {
Log.e(TAG, "连接到GooglePay失败请重试");
}
});
}
//查询商品
public void checkSku(String id) {
List<String> skuList = new ArrayList<>();
skuList.add(id);
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder()
.setSkusList(skuList)
.setType(BillingClient.SkuType.INAPP);
billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(@NonNull BillingResult billingResult, @Nullable List<SkuDetails> list) {
int code = billingResult.getResponseCode();
if (code != BillingClient.BillingResponseCode.OK || list == null || list.isEmpty()) {
String msg = billingResult.getDebugMessage();
Log.e(TAG, "查询商品失败 code = " + code + " msg = " + msg);
return;
}
Log.e(TAG, "查询商品成功");
buyIt(list.get(0));
}
});
}
//购买
private void buyIt(SkuDetails skuDetails) {
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetails)
.build();
BillingResult billingResult = billingClient.launchBillingFlow(mContext, billingFlowParams);
int code = billingResult.getResponseCode();
if (code != BillingClient.BillingResponseCode.OK) {
String msg = billingResult.getDebugMessage();
Log.e(TAG, "购买商品失败 code = " + code + " msg = " + msg);
return;
}
Log.e(TAG, "购买商品" + skuDetails.toString());
}
private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
@Override
public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> list) {
int code = billingResult.getResponseCode();
String msg = billingResult.getDebugMessage();
Log.e(TAG, "onPurchasesUpdatedcode = " + code + " msg = " + msg);
if (list != null) {
for (Purchase purchase : list) {
Log.e(TAG, "onPurchasesUpdated" + purchase.toString());
}
}
if (code == BillingClient.BillingResponseCode.OK && list != null) {
consume(list);
Log.e(TAG, "支付成功");
if (billingListener != null) {
billingListener.onPaySuccess(list);
}
} else if (code == BillingClient.BillingResponseCode.USER_CANCELED) {
Log.e(TAG, "支付取消");
if (billingListener != null) {
billingListener.onPayFailed(code, msg);
}
} else {
if (billingListener != null) {
billingListener.onPayFailed(code, msg);
}
Log.e(TAG, "支付失败code = " + code + " msg = " + msg);
}
}
};
//消耗商品
public void consume(List<Purchase> list) {
if (list == null || list.isEmpty() || billingClient == null) {
return;
}
for (Purchase purchase : list) {
billingClient.consumeAsync(ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build(), new ConsumeResponseListener() {
@Override
public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {
Log.e(TAG, "onConsumeResponse code = " + billingResult.getResponseCode() + " , msg = " + billingResult.getDebugMessage() + " , purchaseToken = " + purchaseToken);
}
});
}
}
/**
* 查询商品订单
*/
public void queryPurchasesAsync(PurchasesResponseListener responseListener) {
if (billingClient == null) return;
//内购商品交易查询
//内购商品交易查询
QueryPurchasesParams inAppPurchasesQurey = QueryPurchasesParams.newBuilder()
.setProductType(BillingClient.ProductType.INAPP)
.build();
billingClient.queryPurchasesAsync(inAppPurchasesQurey, responseListener);
}
/**
* 定义接口返回支付结果
*/
public interface GoogleBillingListener {
void onPaySuccess(List<Purchase> list);
void onPayFailed(int code, String msg);
}
private GoogleBillingListener billingListener;
public GoogleBillingUtilNew setBillingListener(GoogleBillingListener billingListener) {
this.billingListener = billingListener;
return this;
}
}

View File

@@ -0,0 +1,7 @@
package com.yunbao.common.utils;
public class GoogleCallBack {
public void processResponse() {
L.e("___GoogleCallBack___processResponse");
}
}

View File

@@ -0,0 +1,256 @@
package com.yunbao.common.utils;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import com.alibaba.fastjson.JSON;
import org.json.JSONObject;
import java.lang.reflect.InvocationTargetException;
import java.util.Timer;
import java.util.TimerTask;
/**
* 谷歌工具类
*/
public class GoogleUtils {
Activity mActivity;
Context mContext;
Object googlePay;
public static GoogleUtils googleUtils;
public GoogleUtils(Activity activity) {
this.mActivity = activity;
}
public GoogleUtils(Context mContext) {
this.mContext = mContext;
}
public static GoogleUtils newInstance(Context mContext) {
if (googleUtils == null) {
googleUtils = new GoogleUtils(mContext);
}
return googleUtils;
}
public static GoogleUtils newInstance(Activity mContext) {
if (googleUtils == null) {
googleUtils = new GoogleUtils(mContext);
}
return googleUtils;
}
/**
* 获取登录Intnet
*
* @return
*/
public Intent getIntent() {
Intent intent;
try {
Class<?> clz = mActivity.getClassLoader().loadClass("com.shayu.lib_google.utils.GoogleManage");
Object invite = clz.getConstructor(Activity.class).newInstance(mActivity);
intent = (Intent) invite.getClass().getMethod("googleLogin").invoke(invite);
} catch (Exception e) {
throw new RuntimeException(e);
}
return intent;
}
/**
* 获取支付结果
*
* @return
*/
public JSONObject getLoginResult(Intent intent) {
JSONObject object;
try {
Class<?> clz = mActivity.getClassLoader().loadClass("com.shayu.lib_google.utils.GoogleManage");
Object invite = clz.getConstructor(Activity.class).newInstance(mActivity);
object = (JSONObject) invite.getClass().getMethod("getLoginResult", Intent.class).invoke(invite, intent);
} catch (Exception e) {
throw new RuntimeException(e);
}
return object;
}
/**
* 初始化谷歌支付
*/
public void initGooglePay() {
try {
Class<?> clz = mActivity.getClassLoader().loadClass("com.shayu.lib_google.utils.GoogleBillingManage");
googlePay = clz.getConstructor(Activity.class).newInstance(mActivity);
googlePay.getClass().getMethod("initGooglePay").invoke(googlePay);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public String getAdid() {
String adId;
try {
Class<?> clz = mActivity.getClassLoader().loadClass("com.shayu.lib_google.utils.GoogleBillingManage");
Object invite = clz.getConstructor(Activity.class).newInstance(mActivity);
adId = (String) invite.getClass().getMethod("getAdid").invoke(googlePay);
} catch (Exception e) {
throw new RuntimeException(e);
}
return adId;
}
/**
* 购买
*/
public void purchase(String skuId) {
try {
googlePay.getClass().getMethod("checkSku", String.class).invoke(googlePay, skuId);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Timer timer;
public void setBillingListener(GoogleBillingListener billingListener) {
if (timer != null) {
timer.cancel();
timer = null;
}
try {
googlePay.getClass().getMethod("initResultCode").invoke(googlePay);
} catch (Exception e) {
throw new RuntimeException(e);
}
timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
try {
JSONObject resultCode = (JSONObject) googlePay.getClass().getMethod("getPayResult").invoke(googlePay);
int code = resultCode.getInt("resultCode");
String token = resultCode.getString("resultToken");
String orderId = resultCode.getString("resultOrderId");
if (code == 0) {
timer.cancel();
billingListener.onPaySuccess(token, orderId);
} else if (code == 1) {
timer.cancel();
billingListener.onPayFailed("支付取消");
} else if (code == 2) {
timer.cancel();
billingListener.onPayFailed("支付失败");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
};
timer.schedule(task, 1000, 1000);
}
public void initializeApp(Context context) {
try {
Class<?> clz = context.getClassLoader().loadClass("com.shayu.lib_google.utils.FirebaseManage");
Object invite = clz.getConstructor(Context.class).newInstance(context);
invite.getClass().getMethod("initializeApp").invoke(invite);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void setFirebaseTokenListener(Activity activity, FirebaseTokenListener firebaseTokenListener) {
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
try {
Class<?> clz = activity.getClassLoader().loadClass("com.shayu.lib_google.utils.FirebaseManage");
googlePay = clz.getConstructor(Activity.class).newInstance(activity);
String token = (String) googlePay.getClass().getMethod("getToken").invoke(googlePay);
if (!StringUtil.isEmpty(token)) {
firebaseTokenListener.onResultToken(token);
timer.cancel();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
};
timer.schedule(task, 1000, 1000);
}
public void initFireToken(Activity activity) {
try {
Class<?> clz = activity.getClassLoader().loadClass("com.shayu.lib_google.utils.FirebaseManage");
googlePay = clz.getConstructor(Activity.class).newInstance(activity);
googlePay.getClass().getMethod("initToken").invoke(googlePay);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void queryPurchasesAsync() {
try {
Class<?> clz = mActivity.getClassLoader().loadClass("com.shayu.lib_google.utils.GoogleBillingManage");
googlePay = clz.getConstructor(Activity.class).newInstance(mActivity);
googlePay.getClass().getMethod("consumeAll").invoke(googlePay);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void setQueryPurchaseListener(Activity activity, QueryPurchasesListener queryPurchasesListener) {
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
try {
JSONObject object = (JSONObject) googlePay.getClass().getMethod("getQuerySize").invoke(googlePay);
L.e("setQueryPurchaseListenersetQueryPurchaseListener__" + object.getInt("querySize"));
if (object.getInt("querySize") != -1) {
queryPurchasesListener.onResult(object);
timer.cancel();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
};
timer.schedule(task, 1000, 1000);
}
/**
* 定义接口返回支付结果
*/
public interface GoogleBillingListener {
void onPaySuccess(String token, String orderId);
void onPayFailed(String msg);
}
public interface FirebaseTokenListener {
void onResultToken(String token);
}
public interface QueryPurchasesListener {
void onResult(JSONObject obj);
}
}

View File

@@ -1,54 +0,0 @@
package com.yunbao.common.utils;
import android.app.Activity;
import android.util.Log;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import com.momo.mcamera.util.JsonUtil;
import com.yunbao.common.bean.CoolConfig;
import com.yunbao.common.event.JavascriptInterfaceEvent;
public class JavascriptInterfacePlayLetUtils {
private Activity mContext;
private WebView mWebView;
private static JavascriptInterfacePlayLetUtils sInstance;
public static JavascriptInterfacePlayLetUtils getInstance() {
synchronized (JavascriptInterfacePlayLetUtils.class) {
sInstance = new JavascriptInterfacePlayLetUtils();
return sInstance;
}
}
public JavascriptInterfacePlayLetUtils setmContext(Activity mContext, WebView mWebView) {
this.mContext = mContext;
this.mWebView = mWebView;
// webView.evaluateJavascript("javascript:nativeCallback('" + params + "')", new ValueCallback<String>() {
// @Override
// public void onReceiveValue(String value) {
// }
// });
return this;
}
@JavascriptInterface
public void postEvent(String name, String data) {
Log.e("TAG", "postEvent name==" + name);
Log.e("TAG", "postEvent data==" + data);
}
@JavascriptInterface
public void postWeakBalance(String data) {
CoolConfig coolConfig = new JsonUtil().fromJson(data, CoolConfig.class);
Log.e("TAG", "postWeakBalance data==" + data);
Bus.get().post(new JavascriptInterfaceEvent()
.setCoolConfig(coolConfig)
.setMethod("postWeakBalance"));
}
}

View File

@@ -2,13 +2,11 @@ package com.yunbao.common.utils;
import static com.yunbao.common.CommonAppConfig.isGetNewWrap;
import static com.yunbao.common.utils.RouteUtil.PATH_COIN;
import static com.yunbao.common.utils.RouteUtil.PATH_REWARD;
import android.app.Activity;
import android.app.Dialog;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.JavascriptInterface;
@@ -27,7 +25,6 @@ import com.yunbao.common.bean.VideoBean;
import com.yunbao.common.bean.VideoListBean;
import com.yunbao.common.event.JavascriptInterfaceEvent;
import com.yunbao.common.event.LiveRoomChangeEvent;
import com.yunbao.common.event.QuickGiftingEvent;
import com.yunbao.common.http.HttpCallback;
import com.yunbao.common.http.HttpClient;
import com.yunbao.common.http.LiveHttpUtil;
@@ -127,10 +124,10 @@ public class JavascriptInterfaceUtils {
url = CommonAppConfig.HOST + url;
if (url.contains("?")) {
url += "&uid=" + CommonAppConfig.getInstance().getUid() + "&token="
+ CommonAppConfig.getInstance().getToken() + "&isZh=" + (WordUtil.isNewZh() ? "1" : 0);
+ CommonAppConfig.getInstance().getToken()+ "&isZh=" + (WordUtil.isNewZh() ? "1" : 0);
} else {
url += "?uid=" + CommonAppConfig.getInstance().getUid() + "&token="
+ CommonAppConfig.getInstance().getToken() + "&isZh=" + (WordUtil.isNewZh() ? "1" : 0);
+ CommonAppConfig.getInstance().getToken()+ "&isZh=" + (WordUtil.isNewZh() ? "1" : 0);
}
if (LiveZhuangBana) {
RouteUtil.forwardLiveZhuangBanActivity(url, false);
@@ -150,10 +147,10 @@ public class JavascriptInterfaceUtils {
url = CommonAppConfig.HOST + url;
if (url.contains("?")) {
url += "&uid=" + CommonAppConfig.getInstance().getUid() + "&token="
+ CommonAppConfig.getInstance().getToken() + "&isZh=" + (WordUtil.isNewZh() ? "1" : 0);
+ CommonAppConfig.getInstance().getToken()+ "&isZh=" + (WordUtil.isNewZh() ? "1" : 0);
} else {
url += "?uid=" + CommonAppConfig.getInstance().getUid() + "&token="
+ CommonAppConfig.getInstance().getToken() + "&isZh=" + (WordUtil.isNewZh() ? "1" : 0);
+ CommonAppConfig.getInstance().getToken()+ "&isZh=" + (WordUtil.isNewZh() ? "1" : 0);
}
if (LiveZhuangBana) {
RouteUtil.forwardLiveZhuangBanActivity(url, title);
@@ -262,12 +259,11 @@ public class JavascriptInterfaceUtils {
/**
* 跳转直播并打开礼物栏选中礼物
*
* @param liveId 直播间id
* @param giftId 礼物id
*/
@JavascriptInterface
public void androidMethodLookToLiveGift(String liveId, String giftId) {
public void androidMethodLookToLiveGift(String liveId,String giftId){
LiveHttpUtil.getLiveInfo(liveId, new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
@@ -304,7 +300,6 @@ public class JavascriptInterfaceUtils {
}
});
}
@JavascriptInterface
public void androidMethodLookToLive(String liveId) {
Bus.get().post(new JavascriptInterfaceEvent()
@@ -603,18 +598,6 @@ public class JavascriptInterfaceUtils {
.setMethod("clickLogOffAccount"));
}
@JavascriptInterface
public void androidClickToTaskPage() {
ARouter.getInstance().build(PATH_REWARD).withString("url",
CommonAppConfig.HOST + "/index.php?g=Appapi&m=task&a=index" + "&uid=" + CommonAppConfig.getInstance().getUid()
+ "&token=" + CommonAppConfig.getInstance().getToken() + "&tabIndex=1"+ "&isZh=" + (WordUtil.isNewZh() ? "1" : "0")).navigation();
}
@JavascriptInterface
public void androidQuickGiftRemainingQuantity(int giftRemainingQuantity) {
Bus.get().post(new QuickGiftingEvent().setGiftRemainingQuantity(String.valueOf(giftRemainingQuantity)));
}
@JavascriptInterface
public void androidFansGroupBuy(String id) {
Bus.get().post(new JavascriptInterfaceEvent()
@@ -661,9 +644,8 @@ public class JavascriptInterfaceUtils {
Bus.get().post(new JavascriptInterfaceEvent()
.setMethod("androidCancelAnchorAttention"));
}
@JavascriptInterface
public void androidLnsufficientBalanceClick(String msg) {
public void androidLnsufficientBalanceClick(String msg){
DialogUitl.showSimpleDialog(mContext, msg, new DialogUitl.SimpleCallback2() {
@Override
public void onCancelClick() {
@@ -677,5 +659,4 @@ public class JavascriptInterfaceUtils {
}
});
}
}

View File

@@ -99,50 +99,41 @@ public class LogUtil {
} else {
time = System.currentTimeMillis() + "";
}
PostRequest<String> request = OkGo.<String>post("https://newht.yaoulive.com/index.php/api/error_log/report")
.params("log", err)
.params("uid", CommonAppConfig.getInstance().getUid())
.params("time", time)
.params("isGoogle", CommonAppConfig.IS_GOOGLE_PLAY)
.params("appVersion", CommonAppConfig.getInstance().getVersion())
.tag("errorLog")
.converter(new StringCallback() {
String TAG = "异常上传";
PostRequest<String> request = OkGo.<String>post("https://newht.yaoulive.com/index.php/api/error_log/report").params("log", err).params("uid", CommonAppConfig.getInstance().getUid()).params("time", time).params("isGoogle", CommonAppConfig.IS_GOOGLE_PLAY).params("appVersion", CommonAppConfig.getInstance().getVersion()).tag("errorLog").converter(new StringCallback() {
String TAG = "异常上传";
@Override
public void onSuccess(Response<String> response) {
Log.i(TAG, "onSuccess: " + response.message());
file.delete();
}
});
UploadTask<String> task = OkUpload.request("errorLog", request)
.save()
.register(new UploadListener<String>("errorLog") {
@Override
public void onSuccess(Response<String> response) {
Log.i(TAG, "onSuccess: " + response.message());
file.delete();
}
});
UploadTask<String> task = OkUpload.request("errorLog", request).save().register(new UploadListener<String>("errorLog") {
@Override
public void onStart(Progress progress) {
@Override
public void onStart(Progress progress) {
}
}
@Override
public void onProgress(Progress progress) {
@Override
public void onProgress(Progress progress) {
}
}
@Override
public void onError(Progress progress) {
}
@Override
public void onError(Progress progress) {
}
@Override
public void onFinish(String s, Progress progress) {
file.delete();
}
@Override
public void onFinish(String s, Progress progress) {
file.delete();
}
@Override
public void onRemove(Progress progress) {
@Override
public void onRemove(Progress progress) {
}
});
}
});
task.start();
}
}
@@ -160,12 +151,12 @@ public class LogUtil {
public static void shareFile(Context context) {
try {
IMLoginModel bean = IMLoginManager.get(context).getUserInfo();
boolean isAnchor=false;
if(bean!=null){
isAnchor=bean.anchorUserType();
boolean isAnchor = false;
if (bean != null) {
isAnchor = bean.anchorUserType();
}
//有debug文件或主播才允许
if (!new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "pdlive.debug").exists()&&!isAnchor) {
if (!new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "pdlive.debug").exists() && !isAnchor) {
return;
}
} catch (Exception e) {
@@ -225,7 +216,7 @@ public class LogUtil {
share.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(Intent.createChooser(share, "分享文件"));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !CommonAppConfig.IS_GOOGLE_PLAY) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && CommonAppConfig.IS_GOOGLE_PLAY == 0) {
if (!Environment.isExternalStorageManager()) {
Intent intent = new Intent(ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
context.startActivity(intent);
@@ -244,17 +235,14 @@ public class LogUtil {
}
}
private static String TAG="Upload";
private static String TAG = "Upload";
private static void uploadLog(File log) {
JSONObject body = new JSONObject();
MultipartBody requestBody = new MultipartBody.Builder()
.addFormDataPart("uid", CommonAppConfig.getInstance().getUid())
.addFormDataPart("time", new SimpleDateFormat("yyyy-DD-mm HH:mm:ss", Locale.getDefault()).format(new Date()))
.addFormDataPart("isGoogle", CommonAppConfig.IS_GOOGLE_PLAY+"")
.addFormDataPart("appVersion", CommonAppConfig.getInstance().getVersion())
.addFormDataPart("file","file", RequestBody.create(MediaType.parse("application/octet-stream"),log)) //上报日志文件
MultipartBody requestBody = new MultipartBody.Builder().addFormDataPart("uid", CommonAppConfig.getInstance().getUid()).addFormDataPart("time", new SimpleDateFormat("yyyy-DD-mm HH:mm:ss", Locale.getDefault()).format(new Date())).addFormDataPart("isGoogle", CommonAppConfig.IS_GOOGLE_PLAY + "").addFormDataPart("appVersion", CommonAppConfig.getInstance().getVersion()).addFormDataPart("file", "file", RequestBody.create(MediaType.parse("application/octet-stream"), log)) //上报日志文件
.build();
body.put("uid", CommonAppConfig.getInstance().getUid());
@@ -262,28 +250,23 @@ public class LogUtil {
body.put("isGoogle", CommonAppConfig.IS_GOOGLE_PLAY);
body.put("appVersion", CommonAppConfig.getInstance().getVersion());
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(3, TimeUnit.SECONDS)
.build();
Request request = new Request.Builder()
.url("https://newht.yaoulive.com/index.php/api/error_log/report") //无法接受文件
.post(requestBody)
.build();
client.newCall(request)
.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Log.e(TAG, "error",e );
}
OkHttpClient client = new OkHttpClient.Builder().connectTimeout(3, TimeUnit.SECONDS).build();
Request request = new Request.Builder().url("https://newht.yaoulive.com/index.php/api/error_log/report") //无法接受文件
.post(requestBody).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Log.e(TAG, "error", e);
}
@Override
public void onResponse(Call call, okhttp3.Response response) throws IOException {
String body = response.body().string();
Log.i(TAG, "onResponse: "+body);
}
@Override
public void onResponse(Call call, okhttp3.Response response) throws IOException {
String body = response.body().string();
Log.i(TAG, "onResponse: " + body);
}
});
});
}

View File

@@ -1,106 +0,0 @@
package com.yunbao.common.utils;
import androidx.annotation.NonNull;
import com.android.billingclient.api.Purchase;
import com.android.billingclient.api.SkuDetails;
import java.util.List;
/**
* 作者:天镜baobao
* 时间:2019/6/2 13:51
* 说明:允许使用但请遵循Apache License 2.0
* 使用:
* Copyright 2019 天镜baobao
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
public class OnGoogleBillingListener {
@SuppressWarnings("WeakerAccess")
public String tag = null;
/**
* 查询成功
* @param skuType 内购或者订阅
* @param list 商品列表
* @param isSelf 是否是当前页面的结果
*/
public void onQuerySuccess(@NonNull String skuType, @NonNull List<SkuDetails> list, boolean isSelf){}
/**
* 购买成功
* @param purchase 商品
* @param isSelf 是否是当前页面的结果
*
// * @return 是否消耗只有当isSelf为true,并且支付状态为{@link com.android.billingclient.api.Purchase.PurchaseState.PURCHASED}时,该值才会生效。
*/
public boolean onPurchaseSuccess(@NonNull Purchase purchase, boolean isSelf){return true;}
/**
* 初始化成功
* @param isSelf 是否是当前页面的结果
*/
public void onSetupSuccess(boolean isSelf){}
/**
* 每次启动重新检查订单,返回有效的订单
*
* @param skuType 内购或者订阅
* @param purchase 商品
* @param isSelf 是否是当前页面的结果
*
* @return 是否自动消耗只有当isSelf为true,并且支付状态为{@link com.android.billingclient.api.Purchase.PurchaseState.PURCHASED}时,该值才会生效。
*/
public boolean onRecheck(@NonNull String skuType, @NonNull Purchase purchase, boolean isSelf) {
return false;
}
/**
* 链接断开
*/
@SuppressWarnings("WeakerAccess")
public void onBillingServiceDisconnected(){ }
/**
* 消耗成功
* @param purchaseToken token
* @param isSelf 是否是当前页面的结果
*/
public void onConsumeSuccess(@NonNull String purchaseToken,boolean isSelf){}
/**
* 确认购买成功
* @param isSelf 是否是当前页面的结果
*/
public void onAcknowledgePurchaseSuccess(boolean isSelf){}
/**
* 失败回调
* @param tag {@link GoogleBillingUtil.GoogleBillingListenerTag}
* @param responseCode 返回码{https://developer.android.com/google/play/billing/billing_reference}
* @param isSelf 是否是当前页面的结果
*/
public void onFail(@NonNull GoogleBillingUtil.GoogleBillingListenerTag tag, int responseCode, boolean isSelf){}
/**
* google组件初始化失败等等。
* @param tag {@link GoogleBillingUtil.GoogleBillingListenerTag}
* @param isSelf 是否是当前页面的结果
*/
public void onError(@NonNull GoogleBillingUtil.GoogleBillingListenerTag tag, boolean isSelf){}
}

View File

@@ -40,11 +40,61 @@ public class VersionUtil {
}
//是否是谷歌版本
public void showDialog(Activity context, ConfigBean configBean, String downloadUrl) {
//不是谷歌
if (CommonAppConfig.IS_GOOGLE_PLAY == false) {
//华为版本
if (CommonAppConfig.IS_GOOGLE_PLAY == 2) {
//todo
//谷歌版本
} else if (CommonAppConfig.IS_GOOGLE_PLAY == 1) {
//谷歌强制更新
if (configBean.getGoogle_isup().equals("1")) {
DialogUitl.Builder builder = new DialogUitl.Builder(context);
builder.setTitle(context.getString(R.string.version_update))
.setContent(configBean.getUpdateDes())
.setConfirmString(context.getString(R.string.version_immediate_use))
.setCancelString(context.getString(R.string.version_not_update))
.setCancelable(false)
.setClickCallback(new DialogUitl.SimpleCallback2() {
public void onCancelClick() {
context.finish();
}
@Override
public void onConfirmClick(Dialog dialog, String content) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu"));
context.startActivity(i);
context.finish();
}
})
.build()
.show();
//谷歌不强制
} else {
DialogUitl.Builder builder = new DialogUitl.Builder(context);
builder.setTitle(context.getString(R.string.version_update))
.setContent(configBean.getUpdateDes())
.setConfirmString(context.getString(R.string.version_immediate_use))
.setCancelString(context.getString(R.string.version_not_update))
.setCancelable(false)
.setClickCallback(new DialogUitl.SimpleCallback2() {
public void onCancelClick() {
}
@Override
public void onConfirmClick(Dialog dialog, String content) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu"));
context.startActivity(i);
context.finish();
}
})
.build()
.show();
}
} else {
//不强更
if (configBean.getForceUpdate() != 1) {
DialogUitl.Builder builder = new DialogUitl.Builder(context);
@@ -103,55 +153,6 @@ public class VersionUtil {
.build()
.show();
}
//谷歌版本
} else if (CommonAppConfig.IS_GOOGLE_PLAY == true) {
//谷歌强制更新
if (configBean.getGoogle_isup().equals("1")) {
DialogUitl.Builder builder = new DialogUitl.Builder(context);
builder.setTitle(context.getString(R.string.version_update))
.setContent(configBean.getUpdateDes())
.setConfirmString(context.getString(R.string.version_immediate_use))
.setCancelString(context.getString(R.string.version_not_update))
.setCancelable(false)
.setClickCallback(new DialogUitl.SimpleCallback2() {
public void onCancelClick() {
context.finish();
}
@Override
public void onConfirmClick(Dialog dialog, String content) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu"));
context.startActivity(i);
context.finish();
}
})
.build()
.show();
//谷歌不强制
} else {
DialogUitl.Builder builder = new DialogUitl.Builder(context);
builder.setTitle(context.getString(R.string.version_update))
.setContent(configBean.getUpdateDes())
.setConfirmString(context.getString(R.string.version_immediate_use))
.setCancelString(context.getString(R.string.version_not_update))
.setCancelable(false)
.setClickCallback(new DialogUitl.SimpleCallback2() {
public void onCancelClick() {
}
@Override
public void onConfirmClick(Dialog dialog, String content) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu"));
context.startActivity(i);
context.finish();
}
})
.build()
.show();
}
}
}

View File

@@ -14,6 +14,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.content.FileProvider;
import com.alibaba.android.arouter.utils.TextUtils;
import com.lxj.xpopup.core.CenterPopupView;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.R;
@@ -69,10 +70,10 @@ public class APKUpdateCustomPopup extends CenterPopupView {
private void initView() {
if (!mInside) {
if (!CommonAppConfig.IS_GOOGLE_PLAY && APKManager.get().getAPKGoogleIsUp() == 1) {
if (CommonAppConfig.IS_GOOGLE_PLAY == 0 && APKManager.get().getAPKGoogleIsUp() == 1) {
findViewById(R.id.dialog_close).setVisibility(GONE);
}
if (!CommonAppConfig.IS_GOOGLE_PLAY && APKManager.get().getAPKGoogleIsUp() == 1) {
if (CommonAppConfig.IS_GOOGLE_PLAY == 0 && APKManager.get().getAPKGoogleIsUp() == 1) {
findViewById(R.id.dialog_close).setVisibility(GONE);
}
}
@@ -84,27 +85,37 @@ public class APKUpdateCustomPopup extends CenterPopupView {
updateLine.setVisibility(GONE);
updateText.setText(APKManager.get().getAPKDes());
ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.dialog_close), new ViewClicksAntiShake.ViewClicksCallBack() {
@Override
public void onViewClicks() {
if (mInside){
dismiss();
}else {
if (CommonAppConfig.IS_GOOGLE_PLAY && APKManager.get().getAPKGoogleIsUp() != 1) {
dismiss();
}
if (!CommonAppConfig.IS_GOOGLE_PLAY && APKManager.get().getApkIsUp() != 1) {
dismiss();
}
}
@Override
public void onViewClicks() {
if (mInside) {
dismiss();
} else {
if (CommonAppConfig.IS_GOOGLE_PLAY == 1 && APKManager.get().getAPKGoogleIsUp() != 1) {
dismiss();
}
if (CommonAppConfig.IS_GOOGLE_PLAY == 2 && APKManager.get().getAPKGoogleIsUp() != 1) {
dismiss();
}
if (CommonAppConfig.IS_GOOGLE_PLAY == 0 && APKManager.get().getApkIsUp() != 1) {
dismiss();
}
}
);
}
});
ViewClicksAntiShake.clicksAntiShake(versionImmediateUse, new ViewClicksAntiShake.ViewClicksCallBack() {
@Override
public void onViewClicks() {
//不是谷歌
if (!CommonAppConfig.IS_GOOGLE_PLAY) {
if (CommonAppConfig.IS_GOOGLE_PLAY == 1) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu"));
mContext.startActivity(i);
mContext.finish();
} else if (CommonAppConfig.IS_GOOGLE_PLAY == 2) {
//华为
//todo
launchAppDetail(mContext, "com.pdlive.shayu", "com.pdlive.shayu");
} else {
versionImmediateUse.setVisibility(GONE);
updateLine.setVisibility(VISIBLE);
downloadAPK(mContext, APKManager.get().getAPKUrl(), new APKDownloadUtil.OnUpdateListener() {
@@ -113,24 +124,35 @@ public class APKUpdateCustomPopup extends CenterPopupView {
ToastUtil.show(error);
}
});
} else {
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.pdlive.shayu"));
mContext.startActivity(i);
mContext.finish();
}
}
});
}
public static void launchAppDetail(Context mContext, String appPkg, String marketPkg) {
try {
if (TextUtils.isEmpty(appPkg)) {
return;
}
Uri uri = Uri.parse("market://details?id=" + appPkg);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
if (!TextUtils.isEmpty(marketPkg)) {
intent.setPackage(marketPkg);
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
public void downloadAPK(Activity context, String url, APKDownloadUtil.OnUpdateListener listener) {
Request request = new Request.Builder().url(url)
.addHeader("Accept-Encoding", "identity").build();
Request request = new Request.Builder().url(url).addHeader("Accept-Encoding", "identity").build();
File downloadFile = new File(context.getCacheDir(), "update_app.apk");
try {
if (!downloadFile.exists()
&& !downloadFile.createNewFile()) {
if (!downloadFile.exists() && !downloadFile.createNewFile()) {
return;
}
} catch (IOException e) {
@@ -153,8 +175,7 @@ public class APKUpdateCustomPopup extends CenterPopupView {
Looper.prepare();
byte[] buf = new byte[2048];
int len;
try (InputStream inputStream = response.body().byteStream();
FileOutputStream outputStream = new FileOutputStream(downloadFile)) {
try (InputStream inputStream = response.body().byteStream(); FileOutputStream outputStream = new FileOutputStream(downloadFile)) {
long total = response.body().contentLength();
long sum = 0;
while ((len = inputStream.read(buf)) != -1) {

View File

@@ -1,73 +0,0 @@
package com.yunbao.common.views.weight;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
public class CircleProgress2 extends View {
private Paint mPaint;
private RectF mRectF;
private int mCurrent = 10, mMax = 100;
//圆弧(也可以说是圆环)的宽度
private float mArcWidth =7;
//控件的宽度
private float mWidth;
public CircleProgress2(Context context) {
this(context, null);
}
public CircleProgress2(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CircleProgress2(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mRectF = new RectF();
}
public void setCurrent(int mCurrent) {
this.mCurrent = mCurrent;
invalidate();
}
public void setMax(int mMax) {
this.mMax = mMax;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//getMeasuredWidth获取的是view的原始大小也就是xml中配置或者代码中设置的大小
//getWidth获取的是view最终显示的大小这个大小不一定等于原始大小
mWidth = getMeasuredWidth();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setStyle(Paint.Style.STROKE);
//设置圆弧的宽度(圆环的宽度)
mPaint.setStrokeWidth(mArcWidth);
mPaint.setColor(Color.TRANSPARENT);
//大圆的半径
float bigCircleRadius = mWidth / 2;
//小圆的半径
float smallCircleRadius = bigCircleRadius;
//绘制小圆
canvas.drawCircle(bigCircleRadius, bigCircleRadius, smallCircleRadius, mPaint);
mPaint.setColor(Color.parseColor("#FEC51B"));
mRectF.set(mArcWidth, mArcWidth, mWidth - mArcWidth, mWidth - mArcWidth);
//绘制圆弧
canvas.drawArc(mRectF, -90, mCurrent * 360 / mMax, false, mPaint);
setBackgroundColor(Color.TRANSPARENT);
}
}

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#9946433F" />
<corners android:radius="200dp" />
</shape>

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<corners android:bottomLeftRadius="0dp" android:bottomRightRadius="16dp" android:topLeftRadius="16dp" android:topRightRadius="0dp" />
<gradient android:angle="360" android:endColor="#F6F5FF" android:startColor="#D3E3FF" />
</shape>
</item>
</selector>

View File

@@ -1,171 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="475dp"
android:layout_marginStart="21dp"
android:layout_marginEnd="21dp"
android:background="@mipmap/background_cinema_ticket"
android:orientation="vertical">
<ImageView
android:id="@+id/cinema_ticket_close"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="end"
android:layout_margin="12dp"
android:src="@mipmap/icon_cinema_ticket_close" />
<ImageView
android:layout_width="222dp"
android:layout_height="25dp"
android:layout_gravity="center"
android:src="@mipmap/icon_cinema_ticket_title" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="15dp">
<TextView
android:id="@+id/cinema_ticket"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textColor="#DFEAFF"
android:textSize="15sp" />
<ImageView
android:layout_width="23dp"
android:layout_height="19dp"
android:layout_marginStart="5dp"
android:src="@mipmap/icon_cinema_ticket" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="35dp"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/conversion_quantity"
android:textColor="#FFFFFF"
android:textSize="14sp" />
<LinearLayout
android:layout_width="90dp"
android:layout_height="25dp"
android:background="@mipmap/backgroud_tickets_plus_minus">
<View
android:id="@+id/sub"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<TextView
android:id="@+id/tickets_plus_minus"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:gravity="center"
android:singleLine="true"
android:text="0"
android:textColor="#000000"
android:textSize="12dp" />
<View
android:id="@+id/add"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="13dp"
android:gravity="center">
<TextView
android:id="@+id/quantity_need"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/conversion_quantity_need"
android:textColor="#DFEAFF"
android:textSize="12sp" />
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginStart="3dp"
android:src="@mipmap/icon_collectibles2" />
</LinearLayout>
<ImageButton
android:id="@+id/cinema_ticket_exchange"
android:layout_width="140dp"
android:layout_height="55dp"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:background="@mipmap/backgroundn_cinema_ticket_exchange" />
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="7dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="7dp"
android:layout_marginBottom="23dp"
android:background="@drawable/background_cinema_ticket_hint">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingStart="3dp"
android:paddingTop="10dp"
android:paddingBottom="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/conversion_quantity_need_of_use"
android:textColor="#000000"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="11dp"
android:text="@string/conversion_quantity_need_of_use1"
android:textColor="#000000"
android:textSize="13sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/conversion_quantity_need_of_use2"
android:textColor="#000000"
android:textSize="13sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/conversion_quantity_need_of_use3"
android:textColor="#000000"
android:textSize="13sp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</LinearLayout>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 984 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

View File

@@ -1386,12 +1386,5 @@ Limited ride And limited avatar frame</string>
<string name="room_sill0_100">0-100 coins</string>
<string name="room_sill100_500">100-500 coins</string>
<string name="room_sill500_m">Above 500 coins</string>
<string name="combo">combo X</string>
<string name="conversion_quantity">Exchange quantity:</string>
<string name="conversion_quantity_need">Need %s</string>
<string name="conversion_quantity_need_of_use">Exchange&amp;Usage Rules:</string>
<string name="conversion_quantity_need_of_use1">·One star coin can be exchanged for one ticket. You can customize the exchange quantity according to your needs. Once the ticket is exchanged, it cannot be revoked. Please confirm in advance;</string>
<string name="conversion_quantity_need_of_use2">·One ticket can be used to watch one episode of a short drama. After successful redemption, you can return to the viewing page and use the ticket to continue watching the movie;</string>
<string name="conversion_quantity_need_of_use3">·Ticket prohibit illegal activities such as offline trading and acquisitions, and PDLIVE will crack down severely on various profit-making trading activities.</string>
</resources>

View File

@@ -1383,11 +1383,4 @@
<string name="room_sill0_100">0-100星幣</string>
<string name="room_sill100_500">100-500星幣</string>
<string name="room_sill500_m">500以上星幣</string>
<string name="combo">連擊×</string>
<string name="conversion_quantity">兌換數量:</string>
<string name="conversion_quantity_need">需要 %s</string>
<string name="conversion_quantity_need_of_use">兌換&amp;使用規則:</string>
<string name="conversion_quantity_need_of_use1">·1星幣兌換1張觀影券您可以根據需求自定義兌換數量觀影券一經兌換不可撤銷請提前確認</string>
<string name="conversion_quantity_need_of_use2">·1張觀影券可觀看一集短劇兌換成功後即可返回觀影頁面使用觀影券繼續觀看影片</string>
<string name="conversion_quantity_need_of_use3">·觀影券禁止線下交易、收購等不正當行為PDLIVE將對各類以盈利為目的的交易行為進行嚴厲 打擊。</string>
</resources>

View File

@@ -1382,11 +1382,4 @@
<string name="room_sill0_100">0-100星幣</string>
<string name="room_sill100_500">100-500星幣</string>
<string name="room_sill500_m">500以上星幣</string>
<string name="combo">連擊×</string>
<string name="conversion_quantity">兌換數量:</string>
<string name="conversion_quantity_need">需要 %s</string>
<string name="conversion_quantity_need_of_use">兌換&amp;使用規則:</string>
<string name="conversion_quantity_need_of_use1">·1星幣兌換1張觀影券您可以根據需求自定義兌換數量觀影券一經兌換不可撤銷請提前確認</string>
<string name="conversion_quantity_need_of_use2">·1張觀影券可觀看一集短劇兌換成功後即可返回觀影頁面使用觀影券繼續觀看影片</string>
<string name="conversion_quantity_need_of_use3">·觀影券禁止線下交易、收購等不正當行為PDLIVE將對各類以盈利為目的的交易行為進行嚴厲 打擊。</string>
</resources>

View File

@@ -1382,12 +1382,5 @@
<string name="room_sill0_100">0-100星幣</string>
<string name="room_sill100_500">100-500星幣</string>
<string name="room_sill500_m">500以上星幣</string>
<string name="combo">連擊×</string>
<string name="conversion_quantity">兌換數量:</string>
<string name="conversion_quantity_need">需要 %s</string>
<string name="conversion_quantity_need_of_use">兌換&amp;使用規則:</string>
<string name="conversion_quantity_need_of_use1">·1星幣兌換1張觀影券您可以根據需求自定義兌換數量觀影券一經兌換不可撤銷請提前確認</string>
<string name="conversion_quantity_need_of_use2">·1張觀影券可觀看一集短劇兌換成功後即可返回觀影頁面使用觀影券繼續觀看影片</string>
<string name="conversion_quantity_need_of_use3">·觀影券禁止線下交易、收購等不正當行為PDLIVE將對各類以盈利為目的的交易行為進行嚴厲打擊。</string>
</resources>

View File

@@ -1389,11 +1389,4 @@ Limited ride And limited avatar frame</string>
<string name="room_sill0_100">0-100 coins</string>
<string name="room_sill100_500">100-500 coins</string>
<string name="room_sill500_m">Above 500 coins</string>
<string name="combo">combo X</string>
<string name="conversion_quantity">Exchange quantity:</string>
<string name="conversion_quantity_need">Need %s</string>
<string name="conversion_quantity_need_of_use">Exchange&amp;Usage Rules:</string>
<string name="conversion_quantity_need_of_use1">·One star coin can be exchanged for one ticket. You can customize the exchange quantity according to your needs. Once the ticket is exchanged, it cannot be revoked. Please confirm in advance;</string>
<string name="conversion_quantity_need_of_use2">·One ticket can be used to watch one episode of a short drama. After successful redemption, you can return to the viewing page and use the ticket to continue watching the movie;</string>
<string name="conversion_quantity_need_of_use3">·Ticket prohibit illegal activities such as offline trading and acquisitions, and PDLIVE will crack down severely on various profit-making trading activities.</string>
</resources>

View File

@@ -5,27 +5,25 @@ ext {
minSdkVersion : 21,
targetSdkVersion : 33,
versionCode : 458,
versionName : "6.6.3"
versionName : "6.6.2"
]
manifestPlaceholders = [
//正式、
serverHost : "https://napi.yaoulive.com",
// 测试
// serverHost : " https://ceshi.yaoulive.com",
//serverHost : " https://ceshi.yaoulive.com",
//百度语音识别
baiduAppId : "23774720",
baiduAppKey : "zgCgFhUKEOV7I3ZXDFpTfnR B",
baiduAppKey : "zgCgFhUKEOV7I3ZXDFpTfnRB",
baiduAppSecretKey: "nEVSgmuGpU0pjPr6VleEGGAl0hzGW52S",
// true表示谷歌支付 false
isGooglePlay : false,
// true表示谷歌支付 false 0 链接包 1 谷歌包 2华为包
isGooglePlay : 1,
//是否上报异常日志
isUploadLog : true,
//是否打包成插件包模式
isPluginModel : true,
isPluginModel : false,
]
}

View File

@@ -16,11 +16,13 @@ org.gradle.daemon=true
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.configureondemand=true
android.useAndroidX=true
android.enableJetifier=true
systemProp.http.proxyHost=127.0.0.1
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=10809
systemProp.http.proxyPort=10809
systemProp.https.proxyPort=55219
systemProp.http.proxyPort=55219
#android.enableR8.fullMode=true

View File

@@ -25,10 +25,10 @@ android {
}
defaultConfig {
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
minSdkVersion minSdkVersion
targetSdkVersion targetSdkVersion
versionCode versionCode
versionName versionName
manifestPlaceholders = rootProject.ext.manifestPlaceholders
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -22,4 +22,4 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
#-renamesourcefileattribute SourceFiles

1
lib_google/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/build

38
lib_google/build.gradle Normal file
View File

@@ -0,0 +1,38 @@
apply plugin: 'com.android.library'
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
minSdkVersion minSdkVersion
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
versionCode versionCode
versionName versionName
targetSdkVersion targetSdkVersion
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation rootProject.ext.dependencies["appcompat-androidx"]
//谷歌内购
api 'com.android.billingclient:billing:5.0.0'
//谷歌登录
api 'com.google.android.gms:play-services-auth:15.0.0'
api 'com.google.android.gms:play-services-ads-identifier:15.0.1'
api 'com.google.firebase:firebase-messaging:23.0.6'
api 'cn.rongcloud.sdk:sight:5.2.5.4'
}

View File

30
lib_google/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,30 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
-ignorewarnings
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keep class com.huawei.hianalytics.**{*;}
-keep class com.huawei.updatesdk.**{*;}
-keep class com.huawei.hms.**{*;}

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.shayu.lib_google">
</manifest>

View File

@@ -0,0 +1,56 @@
package com.shayu.lib_google.utils;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import androidx.annotation.NonNull;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.FirebaseApp;
import com.google.firebase.messaging.FirebaseMessaging;
import io.rong.push.PushManager;
import io.rong.push.PushType;
public class FirebaseManage {
private Activity mActivity;
private Context mContext;
public FirebaseManage(Activity activity) {
this.mActivity = activity;
}
public FirebaseManage(Context mContext) {
this.mContext = mContext;
}
String token = "";
public String getToken() {
return token;
}
public void initToken() {
FirebaseMessaging.getInstance().getToken().addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete(@NonNull Task<String> task) {
if (!task.isSuccessful()) {
Log.w("TAG", "Fetching FCM registration token failed", task.getException());
return;
}
// Get new FCM registration token
token = task.getResult();
// Log and toast
Log.d("TAG", token);
PushManager.getInstance().onReceiveToken(mActivity, PushType.GOOGLE_FCM, token);
}
});
}
public void initializeApp() {
FirebaseApp.initializeApp(mContext);
}
}

View File

@@ -0,0 +1,281 @@
package com.shayu.lib_google.utils;
import android.app.Activity;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.billingclient.api.BillingClient;
import com.android.billingclient.api.BillingClientStateListener;
import com.android.billingclient.api.BillingFlowParams;
import com.android.billingclient.api.BillingResult;
import com.android.billingclient.api.ConsumeParams;
import com.android.billingclient.api.ConsumeResponseListener;
import com.android.billingclient.api.Purchase;
import com.android.billingclient.api.PurchasesResponseListener;
import com.android.billingclient.api.PurchasesUpdatedListener;
import com.android.billingclient.api.QueryPurchasesParams;
import com.android.billingclient.api.SkuDetails;
import com.android.billingclient.api.SkuDetailsParams;
import com.android.billingclient.api.SkuDetailsResponseListener;
import com.google.android.gms.ads.identifier.AdvertisingIdClient;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.common.GooglePlayServicesRepairableException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 新写Google内付工具类做简单的封装
* 支付流程初始化Google支付服务-->查询商品-->购买-->支付成功回调-->消耗商品
*/
public class GoogleBillingManage implements PurchasesUpdatedListener {
private BillingClient billingClient;
private Activity mContext;
private String TAG = "GoogleBillingManage";
public GoogleBillingManage(Activity activity) {
this.mContext = activity;
}
public void initGooglePay() {
billingClient = BillingClient.newBuilder(mContext).setListener(this).enablePendingPurchases().build();
//请求连接到GooglePay
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
int code = billingResult.getResponseCode();
if (code != BillingClient.BillingResponseCode.OK) {
String msg = billingResult.getDebugMessage();
Log.e(TAG, "连接到GooglePay失败 code = " + code + " msg = " + msg);
return;
}
Log.e(TAG, "连接到GooglePay成功");
}
//连接失败
@Override
public void onBillingServiceDisconnected() {
Log.e(TAG, "连接到GooglePay失败请重试");
}
});
}
//查询商品
public void checkSku(String id) {
List<String> skuList = new ArrayList<>();
skuList.add(id);
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder().setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(@NonNull BillingResult billingResult, @Nullable List<SkuDetails> list) {
int code = billingResult.getResponseCode();
if (code != BillingClient.BillingResponseCode.OK || list == null || list.isEmpty()) {
String msg = billingResult.getDebugMessage();
Log.e(TAG, "查询商品失败 code = " + code + " msg = " + msg);
return;
}
Log.e(TAG, "查询商品成功");
buyIt(list.get(0));
}
});
}
//购买
private void buyIt(SkuDetails skuDetails) {
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder().setSkuDetails(skuDetails).build();
BillingResult billingResult = billingClient.launchBillingFlow(mContext, billingFlowParams);
int code = billingResult.getResponseCode();
if (code != BillingClient.BillingResponseCode.OK) {
String msg = billingResult.getDebugMessage();
Log.e(TAG, "购买商品失败 code = " + code + " msg = " + msg);
return;
}
Log.e(TAG, "购买商品" + skuDetails.toString());
}
//消耗商品
public void consume(List<Purchase> list) {
if (list == null || list.isEmpty() || billingClient == null) {
return;
}
for (Purchase purchase : list) {
billingClient.consumeAsync(ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build(), new ConsumeResponseListener() {
@Override
public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {
Log.e(TAG, "onConsumeResponse code = " + billingResult.getResponseCode() + " , msg = " + billingResult.getDebugMessage() + " , purchaseToken = " + purchaseToken);
}
});
}
}
int querySize = -1;
JSONArray tokenList = new JSONArray();
JSONArray orderList = new JSONArray();
String tradeNo = "";
public JSONObject getQuerySize() {
JSONObject object = new JSONObject();
try {
object.put("querySize", querySize);
object.put("tokenList", tokenList);
object.put("orderList", orderList);
object.put("tradeNo", tradeNo);
} catch (JSONException e) {
throw new RuntimeException(e);
}
return object;
}
/**
* 消耗所有商品
*/
public void consumeAll() {
queryPurchasesAsync(new PurchasesResponseListener() {
@Override
public void onQueryPurchasesResponse(@NonNull BillingResult billingResult, @NonNull List<Purchase> list) {
Log.e("TAG", "消耗所有商品消耗所有商品消耗所有商品消耗所有商品消耗所有商品消耗所有商品" + list.size());
querySize = list.size();
if (querySize > 0) {
tradeNo = list.get(0).getProducts().get(0);
for (Purchase purchase : list) {
tokenList.put(purchase.getPurchaseToken());
orderList.put(purchase.getOrderId());
}
consume(list);
}
}
});
}
/**
* 查询商品订单
*/
public void queryPurchasesAsync(PurchasesResponseListener responseListener) {
//内购商品交易查询
if (billingClient == null) {
billingClient = BillingClient.newBuilder(mContext).setListener(this).enablePendingPurchases().build();
//请求连接到GooglePay
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
int code = billingResult.getResponseCode();
if (code != BillingClient.BillingResponseCode.OK) {
String msg = billingResult.getDebugMessage();
Log.e(TAG, "连接到GooglePay失败 code = " + code + " msg = " + msg);
return;
}
Log.e(TAG, "连接到GooglePay成功");
QueryPurchasesParams inAppPurchasesQurey = QueryPurchasesParams.newBuilder().setProductType(BillingClient.ProductType.INAPP).build();
billingClient.queryPurchasesAsync(inAppPurchasesQurey, responseListener);
}
//连接失败
@Override
public void onBillingServiceDisconnected() {
Log.e(TAG, "连接到GooglePay失败请重试");
}
});
}
}
public String getAdid() {
try {
return AdvertisingIdClient.getAdvertisingIdInfo(mContext).getId();
} catch (IOException e) {
throw new RuntimeException(e);
} catch (GooglePlayServicesNotAvailableException e) {
throw new RuntimeException(e);
} catch (GooglePlayServicesRepairableException e) {
throw new RuntimeException(e);
}
}
int resultCode = -1;
String resultToken = "";
String resultOrderId = "";
public void initResultCode() {
resultCode = -1;
}
public JSONObject getPayResult() {
JSONObject object = new JSONObject();
try {
object.put("resultCode", resultCode);
object.put("resultToken", resultToken);
object.put("resultOrderId", resultOrderId);
} catch (JSONException e) {
throw new RuntimeException(e);
}
return object;
}
@Override
public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> list) {
int code = billingResult.getResponseCode();
String msg = billingResult.getDebugMessage();
Log.e(TAG, "onPurchasesUpdatedcode = " + code + " msg = " + msg);
if (list != null) {
for (Purchase purchase : list) {
Log.e(TAG, "onPurchasesUpdated" + purchase.toString());
}
if (list.get(0) != null) {
resultToken = list.get(0).getPurchaseToken();
resultOrderId = list.get(0).getOrderId();
}
}
if (code == BillingClient.BillingResponseCode.OK && list != null) {
consume(list);
resultCode = 0;
Log.e(TAG, "支付成功");
if (billingListener != null) {
billingListener.onPaySuccess(list);
}
} else if (code == BillingClient.BillingResponseCode.USER_CANCELED) {
Log.e(TAG, "支付取消");
resultCode = 1;
if (billingListener != null) {
billingListener.onPayFailed(code, msg);
}
} else {
resultCode = 2;
if (billingListener != null) {
billingListener.onPayFailed(code, msg);
}
Log.e(TAG, "支付失败code = " + code + " msg = " + msg);
}
}
/**
* 定义接口返回支付结果
*/
public interface GoogleBillingListener {
void onPaySuccess(List<Purchase> list);
void onPayFailed(int code, String msg);
}
private GoogleBillingListener billingListener;
public GoogleBillingManage setBillingListener(GoogleBillingListener billingListener) {
this.billingListener = billingListener;
return this;
}
}

View File

@@ -0,0 +1,59 @@
package com.shayu.lib_google.utils;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.tasks.Task;
import org.json.JSONObject;
public class GoogleManage {
Activity mActivity;
public GoogleManage(Activity mContext) {
this.mActivity = mContext;
}
/**
* 谷歌登录
*
* @return
*/
public Intent googleLogin() {
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestEmail().build();
GoogleSignInClient mGoogleSignInClient = GoogleSignIn.getClient(mActivity, gso);
return mGoogleSignInClient.getSignInIntent();
}
/**
* 获取登录回调
*
* @return
*/
public JSONObject getLoginResult(Intent data) {
JSONObject object = new JSONObject();
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
GoogleSignInAccount account = task.getResult(ApiException.class);
//account里可以直接获取到IDname和头像
String idToken = account.getIdToken();
account.getFamilyName();
account.getGivenName();
object.put("displayName", account.getDisplayName());
object.put("openId", account.getId());
} catch (Exception e) {
Log.i("Log", "ApiException = " + e);
}
return object;
}
}

View File

@@ -0,0 +1,17 @@
package com.shayu.lib_huawei;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}

1
lib_huawei/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/build

32
lib_huawei/build.gradle Normal file
View File

@@ -0,0 +1,32 @@
apply plugin: 'com.android.library'
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
minSdkVersion minSdkVersion
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
versionCode versionCode
versionName versionName
targetSdkVersion targetSdkVersion
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation rootProject.ext.dependencies["appcompat-androidx"]
api 'com.huawei.hms:iap:4.0.4.301'
}

View File

21
lib_huawei/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@@ -0,0 +1,26 @@
package com.shayu.lib_huawei;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.shayu.lib_huawei.test", appContext.getPackageName());
}
}

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.shayu.lib_huawei">
</manifest>

View File

@@ -0,0 +1,168 @@
package com.shayu.lib_huawei.utils;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentSender;
import android.os.Build;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import com.huawei.hmf.tasks.OnCanceledListener;
import com.huawei.hmf.tasks.OnFailureListener;
import com.huawei.hmf.tasks.OnSuccessListener;
import com.huawei.hmf.tasks.Task;
import com.huawei.hms.iap.Iap;
import com.huawei.hms.iap.IapApiException;
import com.huawei.hms.iap.IapClient;
import com.huawei.hms.iap.entity.ConsumeOwnedPurchaseReq;
import com.huawei.hms.iap.entity.ConsumeOwnedPurchaseResult;
import com.huawei.hms.iap.entity.InAppPurchaseData;
import com.huawei.hms.iap.entity.OwnedPurchasesReq;
import com.huawei.hms.iap.entity.OwnedPurchasesResult;
import com.huawei.hms.iap.entity.PurchaseIntentReq;
import com.huawei.hms.iap.entity.PurchaseIntentResult;
import com.huawei.hms.iap.entity.PurchaseResultInfo;
import com.huawei.hms.support.api.client.Status;
import org.json.JSONException;
import org.json.JSONObject;
public class HuaWeiPayManage {
IapClient mClient;
Activity mContext;
public HuaWeiPayManage(Activity mContext) {
this.mContext = mContext;
mClient = Iap.getIapClient(mContext);
}
@RequiresApi(api = Build.VERSION_CODES.DONUT)
public void pay(String changeid) {
Task<PurchaseIntentResult> task = mClient.createPurchaseIntent(createPurchaseIntentReq(0, changeid, "35ee54225cc803bb233d9ec2aa8ae65618f131de77c2a37761dda822f4debeee"));
task.addOnSuccessListener(new OnSuccessListener<PurchaseIntentResult>() {
@Override
public void onSuccess(PurchaseIntentResult result) {
result.getReturnCode();
if (result == null) {
Log.e("TAG", "result is null");
return;
}
Status status = result.getStatus();
if (status == null) {
Log.e("TAG", "status is null");
return;
}
if (status.hasResolution()) {
try {
status.startResolutionForResult(mContext, 6666);
} catch (IntentSender.SendIntentException exp) {
Log.e("TAG", exp.getMessage());
}
} else {
Log.e("TAG", "intent is null");
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
if (e.getMessage() != null) {
if (!e.getMessage().contains("60004")) {
Toast.makeText(mContext, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
}).addOnCanceledListener(new OnCanceledListener() {
@Override
public void onCanceled() {
Toast.makeText(mContext, "", Toast.LENGTH_SHORT).show();
}
});
}
private PurchaseIntentReq createPurchaseIntentReq(int type, String productId, String token) {
PurchaseIntentReq req = new PurchaseIntentReq();
req.setProductId(productId);
req.setPriceType(type);
req.setDeveloperPayload(token);
return req;
}
public JSONObject getPayResult(Intent data) {
JSONObject object = new JSONObject();
PurchaseResultInfo purchaseResultInfo = Iap.getIapClient(mContext).parsePurchaseResultInfoFromIntent(data);
try {
object.put("code", purchaseResultInfo.getReturnCode());
object.put("inAppPurchaseData", purchaseResultInfo.getInAppPurchaseData());
object.put("inAppPurchaseDataSignature", purchaseResultInfo.getInAppDataSignature());
} catch (JSONException e) {
throw new RuntimeException(e);
}
return object;
}
/**
* 消耗所有商品
*/
public void consume() {
OwnedPurchasesReq ownedPurchasesReq = new OwnedPurchasesReq();
// priceType: 0消耗型商品; 1非消耗型商品; 2订阅型商品
ownedPurchasesReq.setPriceType(0);
// 获取调用接口的Activity对象
// 调用obtainOwnedPurchases接口获取所有已购但未发货的消耗型商品的购买信息
Task<OwnedPurchasesResult> task = Iap.getIapClient(mContext).obtainOwnedPurchases(ownedPurchasesReq);
task.addOnSuccessListener(new OnSuccessListener<OwnedPurchasesResult>() {
@Override
public void onSuccess(OwnedPurchasesResult result) {
// 获取接口请求成功的结果
Log.e("TAG", "获取接口请求成功的结果");
if (result != null && result.getInAppPurchaseDataList() != null) {
for (int i = 0; i < result.getInAppPurchaseDataList().size(); i++) {
String inAppPurchaseData = result.getInAppPurchaseDataList().get(i);
Log.e("TAG", "未消耗订单:" + i + "___" + inAppPurchaseData);
ConsumeOwnedPurchaseReq req = new ConsumeOwnedPurchaseReq();
String purchaseToken = "";
try {
InAppPurchaseData inAppPurchaseDataBean = new InAppPurchaseData(inAppPurchaseData);
purchaseToken = inAppPurchaseDataBean.getPurchaseToken();
} catch (JSONException e) {
}
req.setPurchaseToken(purchaseToken);
Task<ConsumeOwnedPurchaseResult> task = mClient.consumeOwnedPurchase(req);
task.addOnSuccessListener(new OnSuccessListener<ConsumeOwnedPurchaseResult>() {
@Override
public void onSuccess(ConsumeOwnedPurchaseResult consumeOwnedPurchaseResult) {
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
if (e instanceof IapApiException) {
IapApiException apiException = (IapApiException) e;
Status status = apiException.getStatus();
int returnCode = apiException.getStatusCode();
}
}
});
}
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
if (e instanceof IapApiException) {
IapApiException apiException = (IapApiException) e;
Status status = apiException.getStatus();
int returnCode = apiException.getStatusCode();
} else {
// 其他外部错误
}
}
});
}
}

View File

@@ -0,0 +1,17 @@
package com.shayu.lib_huawei;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}

View File

@@ -4,8 +4,11 @@
package="com.yunbao.live">
<!--com.kugou.fanxing.allinone.watch.liveroominone.media.FALiveRoomInOneActivity"-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
android:allowBackup="true"

Some files were not shown because too many files have changed in this diff Show More