Compare commits
135 Commits
main
...
develop_re
| Author | SHA1 | Date |
|---|---|---|
|
|
ae45b72717 | |
|
|
9066b775a8 | |
|
|
6cd007e6d4 | |
|
|
b9afc0fa14 | |
|
|
f8e8657159 | |
|
|
de9f32ae5b | |
|
|
f8face95c6 | |
|
|
f5ceeffaa8 | |
|
|
4a0a37e715 | |
|
|
968c5354a1 | |
|
|
b09e9718a0 | |
|
|
c0cd9cce33 | |
|
|
da01786fd0 | |
|
|
5e86192b93 | |
|
|
3dfeaf54bf | |
|
|
1a3b70076a | |
|
|
2ebaf58f56 | |
|
|
c9d281abcd | |
|
|
32e4d6a6e7 | |
|
|
cea438caa8 | |
|
|
c669384d3c | |
|
|
c2b41a5309 | |
|
|
a237f7f5ac | |
|
|
2c791929ee | |
|
|
80812b5a2c | |
|
|
97344d2604 | |
|
|
595dfa7a9c | |
|
|
8c48316daa | |
|
|
1a1edbb763 | |
|
|
b1dde3ef6c | |
|
|
6322e04a36 | |
|
|
04c3223e5a | |
|
|
edc968f004 | |
|
|
542420b17a | |
|
|
a20e0053c1 | |
|
|
549817ef6e | |
|
|
6925c42372 | |
|
|
33e7503c70 | |
|
|
3b51532a34 | |
|
|
ff2eab0da9 | |
|
|
0d31395d7a | |
|
|
06fc43a454 | |
|
|
a0ee013152 | |
|
|
66e47c4328 | |
|
|
68f1119b4a | |
|
|
a95b8b84e9 | |
|
|
2dc819f916 | |
|
|
ce0d5084ba | |
|
|
1988f2448c | |
|
|
0f06e04a4e | |
|
|
3f10238136 | |
|
|
b7ca0babe5 | |
|
|
47020ca736 | |
|
|
b143f6a67d | |
|
|
f934dd66ae | |
|
|
435faca163 | |
|
|
6dd6502c5a | |
|
|
09d74032a9 | |
|
|
fedae8b98f | |
|
|
fb1c6011e0 | |
|
|
f4b10782f0 | |
|
|
b8d848e0bf | |
|
|
2e2f37c586 | |
|
|
dc65bd0562 | |
|
|
6831cfa898 | |
|
|
9bf2e8fef0 | |
|
|
4feda5f879 | |
|
|
4c4500b895 | |
|
|
81ab5823ec | |
|
|
294100b146 | |
|
|
2b8b0fb38d | |
|
|
9e2b880a32 | |
|
|
57ae7ff4ff | |
|
|
95742607a0 | |
|
|
f2cbc14727 | |
|
|
47e4d3dba5 | |
|
|
abe2f0ab90 | |
|
|
3b0abf5235 | |
|
|
9189b845ef | |
|
|
929a95ed9c | |
|
|
0991ab3993 | |
|
|
4ff522f3cd | |
|
|
a6c56d6539 | |
|
|
d7be7c30cb | |
|
|
66bcd4eb51 | |
|
|
114f7befbc | |
|
|
0bf9922be7 | |
|
|
e6c0220019 | |
|
|
ff0ee2d612 | |
|
|
82ff8c5c51 | |
|
|
77d93b0211 | |
|
|
3c081c230a | |
|
|
e93d76f316 | |
|
|
483fa7e930 | |
|
|
ca1f3662b0 | |
|
|
460270212d | |
|
|
ef8d084744 | |
|
|
797d1c01a9 | |
|
|
554eaf31a3 | |
|
|
9d8fc70c10 | |
|
|
16efb504e3 | |
|
|
62db69b1d4 | |
|
|
93543545c5 | |
|
|
32d201030d | |
|
|
6f650df200 | |
|
|
0e034f340d | |
|
|
b07c1cf4ab | |
|
|
0b0805d6bc | |
|
|
da56a8cb42 | |
|
|
97f9a39e95 | |
|
|
a063466f15 | |
|
|
dc7ff87e33 | |
|
|
63d636ff1a | |
|
|
1542db851e | |
|
|
f4aebf8e9c | |
|
|
6ea2af01fe | |
|
|
738b0b3ae9 | |
|
|
5fdf3a4ad9 | |
|
|
e00bf1da76 | |
|
|
f5162cb3a8 | |
|
|
df87261b62 | |
|
|
58b33b9399 | |
|
|
8b37a63a4a | |
|
|
cfe4acbb78 | |
|
|
a8ab37a17b | |
|
|
86214129b6 | |
|
|
fc7fd9d578 | |
|
|
b099f4cd99 | |
|
|
9efe53bf0d | |
|
|
cb1e475a83 | |
|
|
de9f003d26 | |
|
|
df332187d6 | |
|
|
88c2d8cf34 | |
|
|
3eb186063f | |
|
|
5a15d7d997 |
|
|
@ -8,11 +8,11 @@ plugins {
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "com.gamedog.vididin"
|
namespace = "com.vididin.real.money.game"
|
||||||
compileSdk libs.versions.compileSdk.get().toInteger()
|
compileSdk libs.versions.compileSdk.get().toInteger()
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "com.gamedog.vididin"
|
applicationId "com.vididin.real.money.game"
|
||||||
minSdk libs.versions.minSdk.get().toInteger()
|
minSdk libs.versions.minSdk.get().toInteger()
|
||||||
targetSdk libs.versions.targetSdk.get().toInteger()
|
targetSdk libs.versions.targetSdk.get().toInteger()
|
||||||
versionCode libs.versions.versionCode.get().toInteger()
|
versionCode libs.versions.versionCode.get().toInteger()
|
||||||
|
|
|
||||||
|
|
@ -18,4 +18,49 @@
|
||||||
|
|
||||||
# If you keep the line number information, uncomment this to
|
# If you keep the line number information, uncomment this to
|
||||||
# hide the original source file name.
|
# hide the original source file name.
|
||||||
#-renamesourcefileattribute SourceFile
|
#-renamesourcefileattribute SourceFile
|
||||||
|
|
||||||
|
# 保持 Android 四大组件等系统类
|
||||||
|
-keep public class * extends android.app.Activity
|
||||||
|
-keep public class * extends android.app.Service
|
||||||
|
-keep public class * extends android.content.BroadcastReceiver
|
||||||
|
-keep public class * extends android.content.ContentProvider
|
||||||
|
-keep public class * extends android.app.Application
|
||||||
|
|
||||||
|
# 保持 Native 方法不被混淆
|
||||||
|
-keepclasseswithmembernames class * {
|
||||||
|
native <methods>;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 保持 Parcelable 序列化类不被混淆
|
||||||
|
-keep class * implements android.os.Parcelable {
|
||||||
|
public static final android.os.Parcelable$Creator *;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 保持 Serializable 序列化的类成员不被混淆
|
||||||
|
-keepclassmembers class * implements java.io.Serializable {
|
||||||
|
static final long serialVersionUID;
|
||||||
|
private static final java.io.ObjectStreamField[] serialPersistentFields;
|
||||||
|
private void writeObject(java.io.ObjectOutputStream);
|
||||||
|
private void readObject(java.io.ObjectInputStream);
|
||||||
|
java.lang.Object writeReplace();
|
||||||
|
java.lang.Object readResolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
# 保持自定义 View 的构造方法不被混淆(用于 XML 布局)
|
||||||
|
-keep public class * extends android.view.View {
|
||||||
|
public <init>(android.content.Context);
|
||||||
|
public <init>(android.content.Context, android.util.AttributeSet);
|
||||||
|
public <init>(android.content.Context, android.util.AttributeSet, int);
|
||||||
|
public void set*(...);
|
||||||
|
}
|
||||||
|
|
||||||
|
# 保持枚举类不被混淆
|
||||||
|
-keepclassmembers enum * {
|
||||||
|
public static **[] values();
|
||||||
|
public static ** valueOf(java.lang.String);
|
||||||
|
}
|
||||||
|
|
||||||
|
# 保持由 JSON 转换的 Bean 类(或者你的数据模型类)不被混淆
|
||||||
|
-keep class com.gamedog.vididin.beans.** { *; }
|
||||||
|
-keep class com.gamedog.vididin.router.** { *; }
|
||||||
|
|
@ -2,10 +2,21 @@
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
|
||||||
|
<uses-feature
|
||||||
|
android:name="android.hardware.camera"
|
||||||
|
android:required="false" />
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".VidiDinApp"
|
android:name="com.gamedog.vididin.VidiDinApp"
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
|
|
@ -15,26 +26,29 @@
|
||||||
android:networkSecurityConfig="@xml/network_security_config"
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
android:theme="@style/Theme.Architectureandroid">
|
android:theme="@style/Theme.Architectureandroid">
|
||||||
<activity
|
<activity
|
||||||
android:name=".main.MainActivity"
|
android:name="com.gamedog.vididin.main.MainActivity"
|
||||||
android:exported="true">
|
android:exported="true"
|
||||||
|
android:launchMode="singleTask">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
<activity android:name=".login.LoginActivity" android:exported="false" />
|
<activity android:name="com.gamedog.vididin.login.LoginActivity" android:exported="false" />
|
||||||
<activity android:name=".features.benefit.BenefitActivity" android:exported="false" />
|
<activity android:name="com.gamedog.vididin.features.benefit.BenefitActivity" android:exported="false" />
|
||||||
<activity android:name=".features.zero.ZeroBuyActivity" android:exported="false" />
|
<activity android:name="com.gamedog.vididin.features.zero.ZeroBuyActivity" android:exported="false" />
|
||||||
<activity android:name=".features.winrecords.WinRecordsActivity" android:exported="false" />
|
<activity android:name="com.gamedog.vididin.features.winrecords.WinRecordsActivity" android:exported="false" />
|
||||||
<activity android:name=".features.withdraw.WithDrawActivity" android:exported="false" />
|
<activity android:name="com.gamedog.vididin.features.withdraw.WithDrawActivity" android:exported="false" />
|
||||||
<activity android:name=".features.splash.SplashActivity" android:exported="false" />
|
<activity android:name="com.gamedog.vididin.features.withdraw.WithDrawSubActivity" android:exported="false" />
|
||||||
<activity android:name=".features.version.VersionActivity" android:exported="false" />
|
<activity android:name="com.gamedog.vididin.features.splash.SplashActivity" android:exported="false" />
|
||||||
<activity android:name=".features.feedback.FeedbackActivity" android:exported="false" />
|
<activity android:name="com.gamedog.vididin.features.version.VersionActivity" android:exported="false" />
|
||||||
<activity android:name=".features.withdrawrecord.WithdrawRecordActivity" android:exported="false" />
|
<activity android:name="com.gamedog.vididin.features.feedback.FeedbackActivity" android:exported="false" />
|
||||||
<activity android:name=".features.privacy.PrivacyActivity" android:exported="false" />
|
<activity android:name="com.gamedog.vididin.features.withdrawrecord.WithdrawRecordActivity" android:exported="false" />
|
||||||
|
<activity android:name="com.gamedog.vididin.features.privacy.PrivacyActivity" android:exported="false" />
|
||||||
|
<activity android:name="com.gamedog.vididin.features.watchad.WatchAdActivity" android:exported="false" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -46,6 +60,19 @@
|
||||||
android:name="com.gamedog.vididin.router.RouterInitializer"
|
android:name="com.gamedog.vididin.router.RouterInitializer"
|
||||||
android:value="androidx.startup" />
|
android:value="androidx.startup" />
|
||||||
</provider>
|
</provider>
|
||||||
|
|
||||||
|
|
||||||
|
<receiver
|
||||||
|
android:name="com.gamedog.vididin.manager.DateChangeReceiver"
|
||||||
|
android:enabled="true"
|
||||||
|
android:exported="true">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.DATE_CHANGED" />
|
||||||
|
</intent-filter>
|
||||||
|
</receiver>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|
@ -4,7 +4,10 @@
|
||||||
"module_name": "任务中心",
|
"module_name": "任务中心",
|
||||||
"page_path": "底部第二个页签",
|
"page_path": "底部第二个页签",
|
||||||
"layout_style": "上下滑动长页面",
|
"layout_style": "上下滑动长页面",
|
||||||
"currency_display": ["金币账户", "巴西雷亚尔现金账户"]
|
"currency_display": [
|
||||||
|
"金币账户",
|
||||||
|
"巴西雷亚尔现金账户"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"task_categories": [
|
"task_categories": [
|
||||||
{
|
{
|
||||||
|
|
@ -50,13 +53,34 @@
|
||||||
"target_action": "用户每日完成签到操作(支持广告补签)",
|
"target_action": "用户每日完成签到操作(支持广告补签)",
|
||||||
"reward_type": "金币",
|
"reward_type": "金币",
|
||||||
"reward_details": [
|
"reward_details": [
|
||||||
{"day": 1, "value": 100},
|
{
|
||||||
{"day": 2, "value": 300},
|
"day": 1,
|
||||||
{"day": 3, "value": 300},
|
"value": 100
|
||||||
{"day": 4, "value": 500},
|
},
|
||||||
{"day": 5, "value": 300},
|
{
|
||||||
{"day": 6, "value": 300},
|
"day": 2,
|
||||||
{"day": 7, "value": 800}
|
"value": 300
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"day": 3,
|
||||||
|
"value": 300
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"day": 4,
|
||||||
|
"value": 500
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"day": 5,
|
||||||
|
"value": 300
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"day": 6,
|
||||||
|
"value": 300
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"day": 7,
|
||||||
|
"value": 800
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"support_makeup": true,
|
"support_makeup": true,
|
||||||
"makeup_method": "观看15-30秒激励视频",
|
"makeup_method": "观看15-30秒激励视频",
|
||||||
|
|
@ -78,13 +102,34 @@
|
||||||
"target_action": "用户当日完成签到操作",
|
"target_action": "用户当日完成签到操作",
|
||||||
"reward_type": "金币",
|
"reward_type": "金币",
|
||||||
"reward_details": [
|
"reward_details": [
|
||||||
{"day": 1, "value": 100},
|
{
|
||||||
{"day": 2, "value": 300},
|
"day": 1,
|
||||||
{"day": 3, "value": 300},
|
"value": 100
|
||||||
{"day": 4, "value": 500},
|
},
|
||||||
{"day": 5, "value": 300},
|
{
|
||||||
{"day": 6, "value": 300},
|
"day": 2,
|
||||||
{"day": 7, "value": 500}
|
"value": 300
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"day": 3,
|
||||||
|
"value": 300
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"day": 4,
|
||||||
|
"value": 500
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"day": 5,
|
||||||
|
"value": 300
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"day": 6,
|
||||||
|
"value": 300
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"day": 7,
|
||||||
|
"value": 500
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"double_reward_method": "观看15-30秒激励视频",
|
"double_reward_method": "观看15-30秒激励视频",
|
||||||
"support_makeup": true,
|
"support_makeup": true,
|
||||||
|
|
@ -99,9 +144,18 @@
|
||||||
"target_action": "用户累计观看短视频",
|
"target_action": "用户累计观看短视频",
|
||||||
"reward_type": "金币",
|
"reward_type": "金币",
|
||||||
"reward_details": [
|
"reward_details": [
|
||||||
{"target_count": 10, "value": 100},
|
{
|
||||||
{"target_count": 20, "value": 150},
|
"target_count": 10,
|
||||||
{"target_count": 30, "value": 200}
|
"value": 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target_count": 20,
|
||||||
|
"value": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target_count": 30,
|
||||||
|
"value": 200
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"reward_stackable": true,
|
"reward_stackable": true,
|
||||||
"is_one_time": false,
|
"is_one_time": false,
|
||||||
|
|
@ -114,9 +168,18 @@
|
||||||
"target_action": "用户累计观看激励视频",
|
"target_action": "用户累计观看激励视频",
|
||||||
"reward_type": "金币",
|
"reward_type": "金币",
|
||||||
"reward_details": [
|
"reward_details": [
|
||||||
{"target_count": 1, "value": 100},
|
{
|
||||||
{"target_count": 5, "value": 150},
|
"target_count": 1,
|
||||||
{"target_count": 10, "value": 200}
|
"value": 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target_count": 5,
|
||||||
|
"value": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target_count": 10,
|
||||||
|
"value": 200
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"daily_limit": 10,
|
"daily_limit": 10,
|
||||||
"reward_stackable": true,
|
"reward_stackable": true,
|
||||||
|
|
@ -125,6 +188,104 @@
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"box_task": {
|
||||||
|
"category_id": "bonuses_task",
|
||||||
|
"category_name": "福利宝箱(Prémios únicos)",
|
||||||
|
"valid_period": "每个宝箱持续3天,完成对应任务即可领取现金奖励。",
|
||||||
|
"display_priority": 3,
|
||||||
|
"chests": [
|
||||||
|
{
|
||||||
|
"chest_id": "1",
|
||||||
|
"chest_name": "福利宝箱1",
|
||||||
|
"chest_desc": "完成福利宝箱1的全部任务后,获得R$0.1现金奖励",
|
||||||
|
"duration_days": 3,
|
||||||
|
"reward_type": "货币",
|
||||||
|
"reward_value": 0.1,
|
||||||
|
"is_one_time": true,
|
||||||
|
"status": "active",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"task_id": "chest1_task1",
|
||||||
|
"task_name": "观看1个广告",
|
||||||
|
"required_count": 1,
|
||||||
|
"task_type": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"task_id": "chest1_task2",
|
||||||
|
"task_name": "观看3个视频",
|
||||||
|
"required_count": 3,
|
||||||
|
"task_type": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"task_id": "chest1_task3",
|
||||||
|
"task_name": "完成1次签到",
|
||||||
|
"required_count": 1,
|
||||||
|
"task_type": 3
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"chest_id": "2",
|
||||||
|
"chest_name": "福利宝箱2",
|
||||||
|
"chest_desc": "完成福利宝箱2的全部任务后,获得R$1现金奖励",
|
||||||
|
"duration_days": 3,
|
||||||
|
"reward_type": "货币",
|
||||||
|
"reward_value": 1,
|
||||||
|
"is_one_time": true,
|
||||||
|
"status": "locked",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"task_id": "chest2_task1",
|
||||||
|
"task_name": "观看15个广告",
|
||||||
|
"required_count": 15,
|
||||||
|
"task_type": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"task_id": "chest2_task2",
|
||||||
|
"task_name": "观看30个视频",
|
||||||
|
"required_count": 30,
|
||||||
|
"task_type": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"task_id": "chest2_task3",
|
||||||
|
"task_name": "参与1次0元购",
|
||||||
|
"required_count": 1,
|
||||||
|
"task_type": 4
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"chest_id": "3",
|
||||||
|
"chest_name": "福利宝箱3",
|
||||||
|
"chest_desc": "完成福利宝箱3的全部任务后,获得R$2现金奖励",
|
||||||
|
"duration_days": 3,
|
||||||
|
"reward_type": "货币",
|
||||||
|
"reward_value": 2,
|
||||||
|
"is_one_time": true,
|
||||||
|
"status": "locked",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"task_id": "chest3_task1",
|
||||||
|
"task_name": "观看30个广告",
|
||||||
|
"required_count": 30,
|
||||||
|
"task_type": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"task_id": "chest3_task2",
|
||||||
|
"task_name": "观看50个视频",
|
||||||
|
"required_count": 50,
|
||||||
|
"task_type": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"task_id": "chest3_task3",
|
||||||
|
"task_name": "参与10次0元购",
|
||||||
|
"required_count": 10,
|
||||||
|
"task_type": 4
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,130 @@
|
||||||
|
{
|
||||||
|
"task_module_config": {
|
||||||
|
"basic_info": {
|
||||||
|
"module_name": "任务中心",
|
||||||
|
"page_path": "底部第二个页签",
|
||||||
|
"layout_style": "上下滑动长页面",
|
||||||
|
"currency_display": ["金币账户", "巴西雷亚尔现金账户"]
|
||||||
|
},
|
||||||
|
"task_categories": [
|
||||||
|
{
|
||||||
|
"category_id": "newbie_task",
|
||||||
|
"category_name": "新手任务(Missão Para Iniciantes)",
|
||||||
|
"valid_period": "注册后7天内",
|
||||||
|
"display_priority": 1,
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"task_id": "newbie_first_withdraw",
|
||||||
|
"task_name": "完成第一次提现",
|
||||||
|
"task_desc": "完成首次提现操作(0.1 BRL门槛),即可获得100金币奖励",
|
||||||
|
"target_action": "用户完成首次提现流程(含绑定Pix账户、观看广告)",
|
||||||
|
"reward_type": "金币",
|
||||||
|
"reward_value": 100,
|
||||||
|
"is_one_time": true,
|
||||||
|
"status": "active"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"task_id": "newbie_push_notify",
|
||||||
|
"task_name": "开启消息推送",
|
||||||
|
"task_desc": "启用APP消息推送权限,实时获取任务更新与奖励通知",
|
||||||
|
"target_action": "用户授权APP系统推送通知",
|
||||||
|
"reward_type": "金币",
|
||||||
|
"reward_value": 300,
|
||||||
|
"is_one_time": true,
|
||||||
|
"status": "active"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"task_id": "newbie_join_discord",
|
||||||
|
"task_name": "加入Discord社区",
|
||||||
|
"task_desc": "通过APP内链接加入官方Discord社区,获取专属活动与客服支持",
|
||||||
|
"target_action": "用户通过指定链接成功加入Discord社区",
|
||||||
|
"reward_type": "金币",
|
||||||
|
"reward_value": 200,
|
||||||
|
"is_one_time": true,
|
||||||
|
"status": "active"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"task_id": "newbie_7day_checkin",
|
||||||
|
"task_name": "7日连续签到",
|
||||||
|
"task_desc": "连续7天完成签到,奖励逐级递增,第7天最高可得800金币",
|
||||||
|
"target_action": "用户每日完成签到操作(支持广告补签)",
|
||||||
|
"reward_type": "金币",
|
||||||
|
"reward_details": [
|
||||||
|
{"day": 1, "value": 100},
|
||||||
|
{"day": 2, "value": 300},
|
||||||
|
{"day": 3, "value": 300},
|
||||||
|
{"day": 4, "value": 500},
|
||||||
|
{"day": 5, "value": 300},
|
||||||
|
{"day": 6, "value": 300},
|
||||||
|
{"day": 7, "value": 800}
|
||||||
|
],
|
||||||
|
"support_makeup": true,
|
||||||
|
"makeup_method": "观看15-30秒激励视频",
|
||||||
|
"is_one_time": true,
|
||||||
|
"status": "active"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category_id": "daily_task",
|
||||||
|
"category_name": "日常任务(Missão Diária)",
|
||||||
|
"valid_period": "每日凌晨00:00重置",
|
||||||
|
"display_priority": 2,
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"task_id": "daily_checkin",
|
||||||
|
"task_name": "每日签到",
|
||||||
|
"task_desc": "每日签到可获金币,7天为一周期,奖励循环递增(支持双倍广告奖励)",
|
||||||
|
"target_action": "用户当日完成签到操作",
|
||||||
|
"reward_type": "金币",
|
||||||
|
"reward_details": [
|
||||||
|
{"day": 1, "value": 100},
|
||||||
|
{"day": 2, "value": 300},
|
||||||
|
{"day": 3, "value": 300},
|
||||||
|
{"day": 4, "value": 500},
|
||||||
|
{"day": 5, "value": 300},
|
||||||
|
{"day": 6, "value": 300},
|
||||||
|
{"day": 7, "value": 500}
|
||||||
|
],
|
||||||
|
"double_reward_method": "观看15-30秒激励视频",
|
||||||
|
"support_makeup": true,
|
||||||
|
"makeup_method": "观看15-30秒激励视频",
|
||||||
|
"is_one_time": false,
|
||||||
|
"status": "active"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"task_id": "daily_video_ladder",
|
||||||
|
"task_name": "阶梯观看视频",
|
||||||
|
"task_desc": "累计观看指定数量短视频,分3档领取奖励(与基础观看收益叠加)",
|
||||||
|
"target_action": "用户累计观看短视频",
|
||||||
|
"reward_type": "金币",
|
||||||
|
"reward_details": [
|
||||||
|
{"target_count": 10, "value": 100},
|
||||||
|
{"target_count": 20, "value": 150},
|
||||||
|
{"target_count": 30, "value": 200}
|
||||||
|
],
|
||||||
|
"reward_stackable": true,
|
||||||
|
"is_one_time": false,
|
||||||
|
"status": "active"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"task_id": "daily_ad_ladder",
|
||||||
|
"task_name": "阶梯观看激励视频",
|
||||||
|
"task_desc": "累计观看指定数量激励视频,分3档领取奖励(每日上限10次)",
|
||||||
|
"target_action": "用户累计观看激励视频",
|
||||||
|
"reward_type": "金币",
|
||||||
|
"reward_details": [
|
||||||
|
{"target_count": 1, "value": 100},
|
||||||
|
{"target_count": 5, "value": 150},
|
||||||
|
{"target_count": 10, "value": 200}
|
||||||
|
],
|
||||||
|
"daily_limit": 10,
|
||||||
|
"reward_stackable": true,
|
||||||
|
"is_one_time": false,
|
||||||
|
"status": "active"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
package com.gamedog.vididin
|
|
||||||
|
|
||||||
object VidiConst {
|
|
||||||
/**
|
|
||||||
* 描述:网络常量
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
const val URL_YOUTUBE_API = "https://www.googleapis.com"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 描述:其他常量
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
const val YOUTUBE_API_KEY = "AIzaSyBm9k2lS_j7Fdd43NEPkcfikJRotup5DMY"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
package com.gamedog.vididin
|
||||||
|
|
||||||
|
object VidiConst {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Varous type for watching Ad
|
||||||
|
*/
|
||||||
|
const val WATCH_AD_FOR_WITHDRAW_SMALL = 1
|
||||||
|
const val WATCH_AD_FOR_WITHDRAW_BIG = 2
|
||||||
|
const val WATCH_AD_FOR_BOX_TASK = 3
|
||||||
|
const val WATCH_AD_FOR_ZERO_EARN_DIAMOND = 4
|
||||||
|
const val WATCH_AD_FOR_DAILY_WATCH_AD = 5
|
||||||
|
const val WATCH_AD_FOR_DAILY_EARN_GOLD = 6
|
||||||
|
const val WATCH_AD_FOR_CONVERT_GOLD_2_CASH = 7
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Withdraw related const
|
||||||
|
*/
|
||||||
|
const val WITHDRAW_MD5KEY = "eonline~#*^%$@!~0702"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const val URL_DISCORD: String = "https://www.baidu.com"
|
||||||
|
const val URL_GAME: String = "https://www.baidu.com"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 描述:网络常量
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
const val URL_YOUTUBE_API_OLD = "https://www.googleapis.com"
|
||||||
|
|
||||||
|
const val URL_YOUTUBE_API = "https://vd.rsappinc.com"
|
||||||
|
|
||||||
|
const val URL_ZERO_BUY: String = "https://jt.3idiotstudio.com"
|
||||||
|
|
||||||
|
const val URL_WITHDRAW: String = "https://jpec.3idiotstudio.com"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 描述:其他常量
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
const val YOUTUBE_API_KEY = "AIzaSyBm9k2lS_j7Fdd43NEPkcfikJRotup5DMY"
|
||||||
|
|
||||||
|
const val GOLD_IN_CONFIG: String = "金币"
|
||||||
|
|
||||||
|
const val PER_CASH_COST_GOLD_NUM = 1000
|
||||||
|
const val WATCH_AD_REWARD_GOLD = 200
|
||||||
|
|
||||||
|
const val ZEROBUY_SECRET: String = "1f04c57a"
|
||||||
|
const val ZEROBUY_APPID: String = "com.vididin.real.money.game"
|
||||||
|
|
||||||
|
const val DIAMOND_NUM_FOR_ONE_AD = 5
|
||||||
|
const val WITHDRAW_SMALL_NUM = 0.1F
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -5,5 +5,41 @@ object VididinEvents {
|
||||||
const val Event_Account_Gold_Changed = 601
|
const val Event_Account_Gold_Changed = 601
|
||||||
const val Event_Account_Cash_Changed = 602
|
const val Event_Account_Cash_Changed = 602
|
||||||
const val Event_Account_Bank_Info_Changed = 603
|
const val Event_Account_Bank_Info_Changed = 603
|
||||||
|
const val Event_Account_Diamond_Changed = 604
|
||||||
|
|
||||||
|
|
||||||
|
const val Event_HOME_WATCH_Time_TICK = 700
|
||||||
|
const val Event_Finish_One_Video = 701
|
||||||
|
const val EVENT_FINISHED_ONE_AD = 702
|
||||||
|
const val Event_Finish_One_Sign = 703
|
||||||
|
const val Event_Finish_One_Zerobuy = 704
|
||||||
|
|
||||||
|
const val EVENT_DAILY_WATCHED_VIDEO_NUM_CHANGED = 705
|
||||||
|
const val EVENT_DAILY_WATCHED_AD_NUM_CHANGED = 706
|
||||||
|
|
||||||
|
const val EVENT_BOX_TASK_STATE_CHANGED = 707
|
||||||
|
const val EVENT_NEWBIE_NOTIFY_TASK_CHANGED = 708
|
||||||
|
const val EVENT_NEWBIE_FIRST_WITHDRAW_TASK_CHANGED = 709
|
||||||
|
const val EVENT_NEWBIE_DISCORD_TASK_CHANGED = 710
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const val EVENT_AD_WATCHED_FOR_CONVERT_GOLD_2_CASH = 800
|
||||||
|
const val EVENT_AD_WATCHED_FOR_EARN_GOLD = 801
|
||||||
|
const val EVENT_AD_WATCHED_FOR_DAILY_WATCH_AD = 802
|
||||||
|
const val Event_AD_TASK_TYPE_Withdraw = 803
|
||||||
|
const val Event_AD_TASK_TYPE_Complement = 804
|
||||||
|
const val EVENT_AD_WATCHED_FOR_BOX_TASK = 805
|
||||||
|
const val EVENT_AD_WATCHED_FOR_ZEROBUY_EARN_DIAMOND = 806
|
||||||
|
const val EVENT_AD_WATCHED_FOR_WITHDRAW_SMALL = 807
|
||||||
|
const val EVENT_AD_WATCHED_FOR_WITHDRAW_BIG = 808
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// UI jump related
|
||||||
|
const val EVENT_JUMP_2_FIRST_WITHDRAW = 900
|
||||||
|
const val EVENT_JUMP_2_VIDEO = 901
|
||||||
|
const val EVENT_JUMP_2_SIGN= 902
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -10,18 +10,18 @@ import androidx.viewpager2.widget.ViewPager2
|
||||||
import com.ama.core.architecture.appBase.adapter.AppNavigatorAdapter
|
import com.ama.core.architecture.appBase.adapter.AppNavigatorAdapter
|
||||||
import com.ama.core.common.util.asSafe
|
import com.ama.core.common.util.asSafe
|
||||||
import com.ama.core.common.util.getDataFromThemeAttr
|
import com.ama.core.common.util.getDataFromThemeAttr
|
||||||
import com.gamedog.vididin.R
|
|
||||||
import com.gamedog.vididin.beans.MainTabsItem
|
import com.gamedog.vididin.beans.MainTabsItem
|
||||||
import com.gamedog.vididin.main.interfaces.OnTabClickAgainListener
|
import com.gamedog.vididin.main.interfaces.OnTabClickAgainListener
|
||||||
import com.gamedog.vididin.main.interfaces.OnTabClickRefreshFinishListener
|
import com.gamedog.vididin.main.interfaces.OnTabClickRefreshFinishListener
|
||||||
import com.gamedog.vididin.main.interfaces.OnTabClickRefreshListener
|
import com.gamedog.vididin.main.interfaces.OnTabClickRefreshListener
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
import net.lucode.hackware.magicindicator.MagicIndicator
|
import net.lucode.hackware.magicindicator.MagicIndicator
|
||||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator
|
import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator
|
||||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator
|
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator
|
||||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerTitleView
|
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerTitleView
|
||||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.CommonPagerTitleView
|
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.CommonPagerTitleView
|
||||||
import kotlin.ranges.until
|
import kotlin.ranges.until
|
||||||
import com.gamedog.vididin.databinding.ItemActivityMainTabBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.ItemActivityMainTabBinding as ViewBinding
|
||||||
import com.google.android.material.R as materialR
|
import com.google.android.material.R as materialR
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -103,10 +103,10 @@ class MainTabsAdapter(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun ViewBinding.onTabClickAgainHandle(index: Int) {
|
private fun ViewBinding.onTabClickAgainHandle(index: Int) {
|
||||||
val currentFragment = mainFragmentStateAdapter.getFragmentByIndex(index)
|
val currentFragment = mainFragmentStateAdapter.getFragmentByIndex(index)
|
||||||
if (currentFragment is OnTabClickRefreshListener) {
|
if (currentFragment is OnTabClickRefreshListener) {
|
||||||
// 刷新 - 展示Loading
|
|
||||||
currentFragment.onTabClickRefresh(object : OnTabClickRefreshFinishListener {
|
currentFragment.onTabClickRefresh(object : OnTabClickRefreshFinishListener {
|
||||||
override fun onTabClickRefreshFinish() {
|
override fun onTabClickRefreshFinish() {
|
||||||
setTabStyle(1)
|
setTabStyle(1)
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ interface YoutubeApi {
|
||||||
): ResYoutubePlayList
|
): ResYoutubePlayList
|
||||||
|
|
||||||
@GET("/youtube/v3/videos")
|
@GET("/youtube/v3/videos")
|
||||||
suspend fun getVideoList(
|
suspend fun getVideoList_old(
|
||||||
@Query("part") part: String= URLEncoder.encode("snippet", "UTF-8"),
|
@Query("part") part: String= URLEncoder.encode("snippet", "UTF-8"),
|
||||||
@Query("key") key: String= VidiConst.YOUTUBE_API_KEY,
|
@Query("key") key: String= VidiConst.YOUTUBE_API_KEY,
|
||||||
@Query("videoDuration") videoDuration: String= "short",
|
@Query("videoDuration") videoDuration: String= "short",
|
||||||
|
|
@ -56,10 +56,9 @@ interface YoutubeApi {
|
||||||
): ResYoutubePlayList
|
): ResYoutubePlayList
|
||||||
|
|
||||||
|
|
||||||
/*
|
@GET("/videos")
|
||||||
https://www.googleapis.com/youtube/v3/videos?part=id&chart=mostPopular®ionCode=BR&maxResults=10&key=AIzaSyBm9k2lS_j7Fdd43NEPkcfikJRotup5DMY
|
suspend fun getVideoList(
|
||||||
https://www.googleapis.com/youtube/v3/videos?part=snippet,statistics&chart=mostPopular®ionCode=BR&maxResults=10&key=AIzaSyBm9k2lS_j7Fdd43NEPkcfikJRotup5DMY
|
@Query("video") video: String? = URLEncoder.encode("", "UTF-8"),
|
||||||
*/
|
): ResYoutubePlayList
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -2,13 +2,19 @@ package com.gamedog.vididin.beans
|
||||||
|
|
||||||
|
|
||||||
data class Account(
|
data class Account(
|
||||||
|
var userId: Int = 0,
|
||||||
val accountId: String,
|
val accountId: String,
|
||||||
val deviceUUId: String,
|
val deviceUUId: String,
|
||||||
val token: String="",
|
val token: String="",
|
||||||
val createdAt: Long,
|
val createdAt: Long,
|
||||||
|
@Volatile
|
||||||
var goldCount: Long = 0L,
|
var goldCount: Long = 0L,
|
||||||
|
@Volatile
|
||||||
var cashCount: Float = 0F,
|
var cashCount: Float = 0F,
|
||||||
|
@Volatile
|
||||||
|
var diamondCount: Int = 0,
|
||||||
var bankInfo: BankInfo? = null,
|
var bankInfo: BankInfo? = null,
|
||||||
|
val zeroBuyServerSecret: String = "",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
package com.gamedog.vididin.beans
|
||||||
|
|
||||||
|
data class RecordCash(
|
||||||
|
val id: Long,
|
||||||
|
val dateTime: String,
|
||||||
|
val status: TransactionStatus,
|
||||||
|
val statusText: String,
|
||||||
|
val description: String,
|
||||||
|
val amount: String,
|
||||||
|
val amountColor: Int
|
||||||
|
)
|
||||||
|
|
||||||
|
enum class TransactionStatus {
|
||||||
|
SUCCESS, FAILED, PROCESSING, REDEEM
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
package com.gamedog.vididin.beans
|
||||||
|
|
||||||
|
data class RecordGold(
|
||||||
|
val id: Long,
|
||||||
|
val dateTime: String,
|
||||||
|
val status: TransactionStatus,
|
||||||
|
val statusText: String,
|
||||||
|
val description: String,
|
||||||
|
val amount: String,
|
||||||
|
val amountColor: Int
|
||||||
|
)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
package com.gamedog.vididin.beans
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
data class WatchAdNotifyBean<T>(
|
||||||
|
var earnMoneyNum: Float = 0F,
|
||||||
|
var extraData: T,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
@ -5,92 +5,20 @@ import com.ama.core.model.BaseFragmentStateDiffItem
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
data class ResYoutubeChannel(
|
|
||||||
val id: String,
|
|
||||||
val name: String,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class ResYoutubePlayList (
|
data class ResYoutubePlayList (
|
||||||
val kind: String,
|
val videos: List<YoutubeVideo>,
|
||||||
val etag: String, // TODO - this is Etag type
|
|
||||||
val nextPageToken: String,
|
|
||||||
val prevPageToken: String,
|
|
||||||
val pageInfo: PageInfo,
|
|
||||||
val items: List<YoutubeVideo>,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@Serializable
|
|
||||||
data class PageInfo(
|
|
||||||
val totalResults: Int,
|
|
||||||
val resultsPerPage: Int,
|
|
||||||
)
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class YoutubeVideo(
|
data class YoutubeVideo(
|
||||||
val kind: String,
|
|
||||||
val etag: String,
|
|
||||||
val id: String,
|
val id: String,
|
||||||
val snippet: Snippet,
|
val channel_title: String,
|
||||||
val status: Status,
|
val description: String,
|
||||||
|
|
||||||
val contentDetails: ContentDetails,
|
|
||||||
val player: Player,
|
|
||||||
val localizations: Localizations,
|
|
||||||
) : BaseFragmentStateDiffItem {
|
) : BaseFragmentStateDiffItem {
|
||||||
override fun getPrimaryKey() = id
|
override fun getPrimaryKey() = id
|
||||||
override fun getItemId() = id.hashCode().toLong()
|
override fun getItemId() = id.hashCode().toLong()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
data class ContentDetails(
|
|
||||||
val itemCount: Int,
|
|
||||||
)
|
|
||||||
@Serializable
|
|
||||||
data class Player(
|
|
||||||
val embedHtml: String,
|
|
||||||
)
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
data class Localizations(
|
|
||||||
val title: String,
|
|
||||||
val description: String,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
data class Snippet(
|
|
||||||
val publishedAt: String,
|
|
||||||
val channelId: String,
|
|
||||||
val title: String,
|
|
||||||
val description: String,
|
|
||||||
//val thumbnails: Thumbnail,
|
|
||||||
val channelTitle: String,
|
|
||||||
val defaultLanguage: String,
|
|
||||||
val localized: Localized,
|
|
||||||
)
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
data class Localized(
|
|
||||||
val title: String,
|
|
||||||
val description: String,
|
|
||||||
)
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
data class Thumbnail(
|
|
||||||
val standard: String,
|
|
||||||
)
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
data class Status(
|
|
||||||
val privacyStatus: String,
|
|
||||||
val podcastStatus: Int,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,98 @@
|
||||||
|
package com.gamedog.vididin.beans
|
||||||
|
|
||||||
|
|
||||||
|
import com.ama.core.model.BaseFragmentStateDiffItem
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class ResYoutubeChannel(
|
||||||
|
val id: String,
|
||||||
|
val name: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class ResYoutubePlayList (
|
||||||
|
val kind: String,
|
||||||
|
val etag: String, // TODO - this is Etag type
|
||||||
|
val nextPageToken: String,
|
||||||
|
val prevPageToken: String,
|
||||||
|
val pageInfo: PageInfo,
|
||||||
|
val items: List<YoutubeVideo>,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class PageInfo(
|
||||||
|
val totalResults: Int,
|
||||||
|
val resultsPerPage: Int,
|
||||||
|
)
|
||||||
|
@Serializable
|
||||||
|
data class YoutubeVideo(
|
||||||
|
val kind: String,
|
||||||
|
val etag: String,
|
||||||
|
val id: String,
|
||||||
|
val snippet: Snippet,
|
||||||
|
val status: Status,
|
||||||
|
|
||||||
|
val contentDetails: ContentDetails,
|
||||||
|
val player: Player,
|
||||||
|
val localizations: Localizations,
|
||||||
|
) : BaseFragmentStateDiffItem {
|
||||||
|
override fun getPrimaryKey() = id
|
||||||
|
override fun getItemId() = id.hashCode().toLong()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class ContentDetails(
|
||||||
|
val itemCount: Int,
|
||||||
|
)
|
||||||
|
@Serializable
|
||||||
|
data class Player(
|
||||||
|
val embedHtml: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class Localizations(
|
||||||
|
val title: String,
|
||||||
|
val description: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class Snippet(
|
||||||
|
val publishedAt: String,
|
||||||
|
val channelId: String,
|
||||||
|
val title: String,
|
||||||
|
val description: String,
|
||||||
|
//val thumbnails: Thumbnail,
|
||||||
|
val channelTitle: String,
|
||||||
|
val defaultLanguage: String,
|
||||||
|
val localized: Localized,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class Localized(
|
||||||
|
val title: String,
|
||||||
|
val description: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class Thumbnail(
|
||||||
|
val standard: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class Status(
|
||||||
|
val privacyStatus: String,
|
||||||
|
val podcastStatus: Int,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
package com.gamedog.vididin.beans
|
||||||
|
|
||||||
|
|
||||||
|
data class ZeroBuyResp (
|
||||||
|
val Code: Int,
|
||||||
|
val Message: String,
|
||||||
|
|
||||||
|
val UserId: Int,
|
||||||
|
val CurrentPurchases: String,
|
||||||
|
val FinishedPurchases: String,
|
||||||
|
var mCurrentList: List<ZeroBuyItem>?,
|
||||||
|
var mFinishedList: List<ZeroBuyItem>?,
|
||||||
|
val Content: String,
|
||||||
|
var contentObj: ZeroBuyItem?
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
data class ZeroBuyItem (
|
||||||
|
val id:Int = 0,
|
||||||
|
val title: String? = null,
|
||||||
|
val start_time:Long = 0,
|
||||||
|
val end_time:Long = 0,
|
||||||
|
val target_num:Int = 0,
|
||||||
|
val cost:Int = 0,
|
||||||
|
val price: String? = null,
|
||||||
|
val image:Int = 0,
|
||||||
|
val current_users: List<Int>? = null,
|
||||||
|
val winners: List<Int>? = null,
|
||||||
|
val redeem_code: String? = null,
|
||||||
|
val completed: Boolean = false,
|
||||||
|
|
||||||
|
// Not from server
|
||||||
|
var mCountDownTimeStr: String = ""
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.gamedog.vididin.beans.req
|
||||||
|
|
||||||
|
import com.gamedog.vididin.beans.resp.PbReportDataAdjust
|
||||||
|
import com.gamedog.vididin.beans.resp.PbReportDataShuShu
|
||||||
|
|
||||||
|
|
||||||
|
open class PayInitReq (
|
||||||
|
var platform: String? = null,
|
||||||
|
var deviceid: String? = null,
|
||||||
|
var version: String? = null,
|
||||||
|
var ip: String? = null,
|
||||||
|
var ts: String? = null,
|
||||||
|
var sign: String? = null,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class PayoutReq(
|
||||||
|
var account: String? = null,
|
||||||
|
var item_id: Int = 0,
|
||||||
|
var amount: String? = null,
|
||||||
|
var additional_remark: String? = null,
|
||||||
|
var uuid: String? = null,
|
||||||
|
var account_type: String? = null,
|
||||||
|
var document_type: String? = null,
|
||||||
|
var document_id: String? = null,
|
||||||
|
var name: String? = null,
|
||||||
|
var clientName: String? = null,
|
||||||
|
var dataAdjust: PbReportDataAdjust = PbReportDataAdjust(),
|
||||||
|
var dataShuShu: PbReportDataShuShu = PbReportDataShuShu(),
|
||||||
|
) : PayInitReq()
|
||||||
|
|
||||||
|
data class PayoutCheckReq(var record_no: String = "") : PayInitReq()
|
||||||
|
|
@ -0,0 +1,100 @@
|
||||||
|
package com.gamedog.vididin.beans.resp
|
||||||
|
|
||||||
|
|
||||||
|
data class WithDrawRespData (
|
||||||
|
var items: MutableList<InitIem?>? = null,
|
||||||
|
var UUID: String? = null,
|
||||||
|
var IP: String? = null,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
open class BaseReply (
|
||||||
|
var code: Int = 0,
|
||||||
|
var msg: String? = null
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
data class PayInit(var data: PayInitReply? = null) : BaseReply() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
open class PayInitReply (
|
||||||
|
var uuid: String? = null,
|
||||||
|
var items: List<InitIem?>? = null,
|
||||||
|
var days: Int = 0,
|
||||||
|
var error: Int = 0,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class InitIem (
|
||||||
|
var id: Int = 0,
|
||||||
|
var amount: Float = 0f,
|
||||||
|
var status: Int = 0,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
data class PbReportDataAdjust(
|
||||||
|
var gps_adid: String? = null, // 用户的gaid
|
||||||
|
var android_id: String? = null, // 原始安卓 ID
|
||||||
|
var adid: String? = null, // 与设备关联的 Adjust 标识符
|
||||||
|
var user_agent: String? = null, // 设备的User-Agent。必须进行 URL 编码。
|
||||||
|
var price: String? = null, // 客户端上报的价格 客户端上报的价格,例如0.05
|
||||||
|
var currency: String? = null, // 货币单位 客户端上报的货币,例如
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
data class PbReportDataShuShu(
|
||||||
|
var gps_gaid: String? = null, // 用户的gaid
|
||||||
|
var android_id: String? = null ,// 原始安卓 ID
|
||||||
|
var adid: String? = null, // 与设备关联的 Adjust 标识符
|
||||||
|
var user_agent: String? = null, // 设备的User-Agent。必须进行 URL 编码
|
||||||
|
var price: String? = null, // 客户端上报的价格 客户端上报的价格,例如0.05
|
||||||
|
var currency: String? = null, // 货币单位 客户端上报的货币,例如USD
|
||||||
|
var payment_method: String? = null, // 收款方式 暂时只有一种:pix
|
||||||
|
var payment_type: String? = null, // 账户形式 cpf/cnpj/evp/email/phone
|
||||||
|
var payment_number: String? = null, // 账户号码 收款账号号码
|
||||||
|
var iap_name: String? = null, // 商品名称 游戏侧自定义的提现项目名称,例如:0.1br/50br/100br
|
||||||
|
var gamecoin_number: String? = null, // 提现消耗的虚拟货币数 提现消耗的虚拟货币数量,例如:1500
|
||||||
|
var gamecoin_type: String? = null, // 提现消耗的虚拟货币类型 金币或钞票,例如:coin/money
|
||||||
|
var ss_account_id: String? = null, // 数数账号ID 用户的登录ID(如果需要接入数数请务必传此值)
|
||||||
|
var ss_distinct_id: String? = null, // 数数访客ID 用户在未登录状态下的ID(如果需要接入数数请务必传此值)
|
||||||
|
var ss_super_properties: String? = null, // 数数的公共属性和预制属性 json字符串
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
data class PayoutData(
|
||||||
|
var data: PayoutReply? = null
|
||||||
|
) : BaseReply()
|
||||||
|
|
||||||
|
data class PayoutReply (
|
||||||
|
var id: String? = null,
|
||||||
|
var record_no: String = "",
|
||||||
|
var error: Int = 0,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
data class PayoutCheckData(var data: PayoutCheck? = null) : BaseReply()
|
||||||
|
|
||||||
|
data class PayoutCheck(
|
||||||
|
var status: Int = 0, // 提现状态 1:提现中,2:提现成功,3:提现失败
|
||||||
|
var error: Int = 0, // 错误码,0成功,1失败,2签名验证失败,3客户端版本过低,4 ts长度错误
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
data class WithdrawRecord (
|
||||||
|
var id: String = "",
|
||||||
|
var recordNo: String = "",
|
||||||
|
var cashNum: Float = 0F,
|
||||||
|
var operateMs: Long = 0L,
|
||||||
|
var state: Int = 1, // 提现状态 1:提现中,2:提现成功,3:提现失败
|
||||||
|
var failReason: Int = 0, // TODO - define various fail reasons
|
||||||
|
)
|
||||||
|
|
@ -5,19 +5,23 @@ import com.gamedog.vididin.features.benefit.DefaultBenefitRouter
|
||||||
import com.gamedog.vididin.features.winrecords.DefaultWinRecordRouter
|
import com.gamedog.vididin.features.winrecords.DefaultWinRecordRouter
|
||||||
import com.gamedog.vididin.features.winrecords.WinRecordRouter
|
import com.gamedog.vididin.features.winrecords.WinRecordRouter
|
||||||
import com.gamedog.vididin.features.withdraw.DefaultWithdrawRouter
|
import com.gamedog.vididin.features.withdraw.DefaultWithdrawRouter
|
||||||
|
import com.gamedog.vididin.features.withdraw.DefaultWithdrawSubRouter
|
||||||
import com.gamedog.vididin.features.withdraw.WithdrawRouter
|
import com.gamedog.vididin.features.withdraw.WithdrawRouter
|
||||||
|
import com.gamedog.vididin.features.withdraw.WithdrawSubRouter
|
||||||
import com.gamedog.vididin.features.zero.DefaultZeroBuyRouter
|
import com.gamedog.vididin.features.zero.DefaultZeroBuyRouter
|
||||||
import com.gamedog.vididin.features.zero.ZeroBuyRouter
|
import com.gamedog.vididin.features.zero.ZeroBuyRouter
|
||||||
import com.gamedog.vididin.router.DefaultFeedbackRouter
|
import com.gamedog.vididin.router.DefaultFeedbackRouter
|
||||||
import com.gamedog.vididin.router.DefaultPrivacyRouter
|
import com.gamedog.vididin.router.DefaultPrivacyRouter
|
||||||
import com.gamedog.vididin.router.DefaultSplashRouter
|
import com.gamedog.vididin.router.DefaultSplashRouter
|
||||||
import com.gamedog.vididin.router.DefaultVersionRouter
|
import com.gamedog.vididin.router.DefaultVersionRouter
|
||||||
|
import com.gamedog.vididin.router.DefaultWatchAdRouter
|
||||||
import com.gamedog.vididin.router.DefaultWithdrawRecordRouter
|
import com.gamedog.vididin.router.DefaultWithdrawRecordRouter
|
||||||
import com.gamedog.vididin.router.IRouterFeedback
|
import com.gamedog.vididin.router.IRouterFeedback
|
||||||
import com.gamedog.vididin.router.IRouterPrivacy
|
import com.gamedog.vididin.router.IRouterPrivacy
|
||||||
import com.gamedog.vididin.router.IRouterSplash
|
import com.gamedog.vididin.router.IRouterSplash
|
||||||
import com.gamedog.vididin.router.IRouterVersion
|
import com.gamedog.vididin.router.IRouterVersion
|
||||||
import com.gamedog.vididin.router.IRouterWithdrawRecord
|
import com.gamedog.vididin.router.IRouterWithdrawRecord
|
||||||
|
import com.gamedog.vididin.router.IRouterWatchAd
|
||||||
import dagger.Module
|
import dagger.Module
|
||||||
import dagger.Provides
|
import dagger.Provides
|
||||||
import dagger.hilt.InstallIn
|
import dagger.hilt.InstallIn
|
||||||
|
|
@ -51,6 +55,15 @@ object WithdrawModule {
|
||||||
fun provideRouter(): WithdrawRouter = DefaultWithdrawRouter()
|
fun provideRouter(): WithdrawRouter = DefaultWithdrawRouter()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Module
|
||||||
|
@InstallIn(SingletonComponent::class)
|
||||||
|
object WithdrawSubModule {
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
fun provideRouter(): WithdrawSubRouter = DefaultWithdrawSubRouter()
|
||||||
|
}
|
||||||
|
|
||||||
@Module
|
@Module
|
||||||
@InstallIn(SingletonComponent::class)
|
@InstallIn(SingletonComponent::class)
|
||||||
object WinRecordModule {
|
object WinRecordModule {
|
||||||
|
|
@ -98,4 +111,12 @@ object VersionModule {
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
fun provideRouter(): IRouterVersion = DefaultVersionRouter()
|
fun provideRouter(): IRouterVersion = DefaultVersionRouter()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Module
|
||||||
|
@InstallIn(SingletonComponent::class)
|
||||||
|
object WatchAd {
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
fun provideRouter(): IRouterWatchAd = DefaultWatchAdRouter()
|
||||||
}
|
}
|
||||||
|
|
@ -2,6 +2,8 @@ package com.gamedog.vididin.core.network.di
|
||||||
|
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import com.ama.core.architecture.util.DeviceUtil
|
||||||
|
import com.gamedog.vididin.request.RequestUtil
|
||||||
import okhttp3.Headers
|
import okhttp3.Headers
|
||||||
import okhttp3.Interceptor
|
import okhttp3.Interceptor
|
||||||
import okhttp3.MediaType.Companion.toMediaType
|
import okhttp3.MediaType.Companion.toMediaType
|
||||||
|
|
@ -24,26 +26,23 @@ class GlobalInterceptor : Interceptor {
|
||||||
val emptyBody = "{}".toRequestBody("application/json;charset=utf-8".toMediaType())
|
val emptyBody = "{}".toRequestBody("application/json;charset=utf-8".toMediaType())
|
||||||
val requestBody = if (bodyStr.isNotBlank()) request.body else emptyBody
|
val requestBody = if (bodyStr.isNotBlank()) request.body else emptyBody
|
||||||
|
|
||||||
|
val timeSec = RequestUtil.getTimestampSec()
|
||||||
|
|
||||||
val headersBuilder = Headers.Builder()
|
val requestBuilder = chain.request().newBuilder()
|
||||||
/*
|
.addHeader("User-Agent", "Android")
|
||||||
.add("authorazation", "Bearer xxxxx")
|
.addHeader("Accept-Language", Locale.getDefault().toLanguageTag())
|
||||||
.add("AUTH_DID", AppUtils.getAndroidID())
|
.addHeader("Content-Type", "application/json")
|
||||||
.add("platform", AppConstant.APP_CLIENT)
|
.addHeader("Accept", "application/json")
|
||||||
.add("Authorization", "Bearer xxx")
|
.addHeader("Accept-Charset", "utf-8")
|
||||||
.add("versionNum", "100")
|
// server real defined
|
||||||
*/
|
.addHeader("ApplicationId", RequestUtil.Request_APPId)
|
||||||
.add("User-Agent", "Android")
|
.addHeader("Timestamp", timeSec.toString())
|
||||||
.add("Accept-Language", Locale.getDefault().toLanguageTag())
|
.addHeader("Sign", RequestUtil.getRequestSign(timeSec))
|
||||||
.add("Content-Type", "application/json")
|
.addHeader("DeviceId", DeviceUtil.generateDeviceId())
|
||||||
.add("Accept", "application/json")
|
.addHeader("authorazation", "Bearer xxxxx")
|
||||||
.add("Accept-Charset", "utf-8")
|
|
||||||
|
|
||||||
|
request = requestBuilder.build()
|
||||||
|
|
||||||
val headers = headersBuilder.build()
|
|
||||||
request = chain.request().newBuilder()
|
|
||||||
.headers(headers)
|
|
||||||
.build()
|
|
||||||
val response = chain.proceed(request)
|
val response = chain.proceed(request)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,98 @@
|
||||||
|
package com.gamedog.vididin.core.network.di
|
||||||
|
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import com.ama.core.architecture.util.DeviceUtil
|
||||||
|
import com.gamedog.vididin.request.RequestUtil
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.Interceptor
|
||||||
|
import okhttp3.MediaType.Companion.toMediaType
|
||||||
|
import okhttp3.Request
|
||||||
|
import okhttp3.RequestBody
|
||||||
|
import okhttp3.RequestBody.Companion.toRequestBody
|
||||||
|
import okhttp3.Response
|
||||||
|
import okhttp3.ResponseBody
|
||||||
|
import okhttp3.ResponseBody.Companion.asResponseBody
|
||||||
|
import okio.Buffer
|
||||||
|
import java.io.IOException
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
|
||||||
|
class GlobalInterceptor2 : Interceptor {
|
||||||
|
|
||||||
|
override fun intercept(chain: Interceptor.Chain): Response {
|
||||||
|
var request = chain.request()
|
||||||
|
val bodyStr = readBody(chain.request().body)
|
||||||
|
val emptyBody = "{}".toRequestBody("application/json;charset=utf-8".toMediaType())
|
||||||
|
val requestBody = if (bodyStr.isNotBlank()) request.body else emptyBody
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
val requestBuilder = chain.request().newBuilder()
|
||||||
|
.addHeader("User-Agent", "Android")
|
||||||
|
.addHeader("Accept-Language", Locale.getDefault().toLanguageTag())
|
||||||
|
.addHeader("Content-Type", "application/json")
|
||||||
|
.addHeader("Accept", "application/json")
|
||||||
|
.addHeader("Accept-Charset", "utf-8")
|
||||||
|
// server real defined
|
||||||
|
.addHeader("ApplicationId", RequestUtil.Request_ZeroBuy_APPId)
|
||||||
|
.addHeader("DeviceId", DeviceUtil.generateDeviceId())
|
||||||
|
.addHeader("authorazation", "Bearer xxxxx")
|
||||||
|
|
||||||
|
request = requestBuilder.build()
|
||||||
|
|
||||||
|
val response = chain.proceed(request)
|
||||||
|
|
||||||
|
|
||||||
|
if (true) {
|
||||||
|
try {
|
||||||
|
val contentStr = clone(response.body)?.string()
|
||||||
|
Log.d("RetroLog" ,
|
||||||
|
"""
|
||||||
|
———————————————— 请求 Start ——————————————————————————————
|
||||||
|
${request.url}
|
||||||
|
******** 请求头 ${request.method} ********:
|
||||||
|
${getRequestHeadersString(request)}
|
||||||
|
******** 请求体(当post等时) ********:
|
||||||
|
${readBody(requestBody)}
|
||||||
|
******** 请求响应 ********:
|
||||||
|
$contentStr
|
||||||
|
———————————————— 请求 End ———————————————————————————————
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.d("RetroLog" , "GlobalInterceptor request.exception : ${e.localizedMessage}}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return response
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun getRequestHeadersString(request: Request): String {
|
||||||
|
val headers = request.headers
|
||||||
|
val headerCount = headers.size
|
||||||
|
|
||||||
|
val sb = StringBuilder()
|
||||||
|
for (i in 0 until headerCount) {
|
||||||
|
val key = headers.name(i)
|
||||||
|
val value = headers.value(i)
|
||||||
|
sb.append("$key=$value\n")
|
||||||
|
}
|
||||||
|
return sb.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun readBody(body: RequestBody?): String {
|
||||||
|
val buffer = Buffer()
|
||||||
|
body?.writeTo(buffer)
|
||||||
|
return buffer.readUtf8()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Throws(IOException::class)
|
||||||
|
private fun clone(body: ResponseBody?): ResponseBody? {
|
||||||
|
val source = body?.source()
|
||||||
|
if (source?.request(Long.MAX_VALUE) == true) throw IOException("body too long!")
|
||||||
|
val bufferedCopy = source?.buffer?.clone()
|
||||||
|
return bufferedCopy?.asResponseBody(body.contentType(), body.contentLength())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -45,7 +45,6 @@ internal object NetworkModule {
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
fun providesRetrofit(
|
fun providesRetrofit(
|
||||||
networkJson: Json,
|
|
||||||
okhttpCallFactory: dagger.Lazy<Call.Factory>,
|
okhttpCallFactory: dagger.Lazy<Call.Factory>,
|
||||||
): Retrofit {
|
): Retrofit {
|
||||||
return Retrofit.Builder()
|
return Retrofit.Builder()
|
||||||
|
|
|
||||||
|
|
@ -7,12 +7,14 @@ import com.gamedog.vididin.core.router.interfaces.TaskRouter
|
||||||
import com.gamedog.vididin.features.benefit.BenefitRouter
|
import com.gamedog.vididin.features.benefit.BenefitRouter
|
||||||
import com.gamedog.vididin.features.winrecords.WinRecordRouter
|
import com.gamedog.vididin.features.winrecords.WinRecordRouter
|
||||||
import com.gamedog.vididin.features.withdraw.WithdrawRouter
|
import com.gamedog.vididin.features.withdraw.WithdrawRouter
|
||||||
|
import com.gamedog.vididin.features.withdraw.WithdrawSubRouter
|
||||||
import com.gamedog.vididin.features.zero.ZeroBuyRouter
|
import com.gamedog.vididin.features.zero.ZeroBuyRouter
|
||||||
import com.gamedog.vididin.router.IRouterFeedback
|
import com.gamedog.vididin.router.IRouterFeedback
|
||||||
import com.gamedog.vididin.router.IRouterPrivacy
|
import com.gamedog.vididin.router.IRouterPrivacy
|
||||||
import com.gamedog.vididin.router.IRouterSplash
|
import com.gamedog.vididin.router.IRouterSplash
|
||||||
import com.gamedog.vididin.router.IRouterVersion
|
import com.gamedog.vididin.router.IRouterVersion
|
||||||
import com.gamedog.vididin.router.IRouterWithdrawRecord
|
import com.gamedog.vididin.router.IRouterWithdrawRecord
|
||||||
|
import com.gamedog.vididin.router.IRouterWatchAd
|
||||||
import dagger.hilt.EntryPoint
|
import dagger.hilt.EntryPoint
|
||||||
import dagger.hilt.InstallIn
|
import dagger.hilt.InstallIn
|
||||||
import dagger.hilt.components.SingletonComponent
|
import dagger.hilt.components.SingletonComponent
|
||||||
|
|
@ -30,6 +32,7 @@ interface RouterEntryPoint {
|
||||||
fun benefitRouter(): BenefitRouter
|
fun benefitRouter(): BenefitRouter
|
||||||
fun zeroBuyRouter(): ZeroBuyRouter
|
fun zeroBuyRouter(): ZeroBuyRouter
|
||||||
fun withdrawRouter(): WithdrawRouter
|
fun withdrawRouter(): WithdrawRouter
|
||||||
|
fun withdrawSubRouter(): WithdrawSubRouter
|
||||||
fun winRecordBuyRouter(): WinRecordRouter
|
fun winRecordBuyRouter(): WinRecordRouter
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -38,6 +41,7 @@ interface RouterEntryPoint {
|
||||||
fun feedbackRouter(): IRouterFeedback
|
fun feedbackRouter(): IRouterFeedback
|
||||||
fun splashRouter(): IRouterSplash
|
fun splashRouter(): IRouterSplash
|
||||||
fun withdrawRecordRouter(): IRouterWithdrawRecord
|
fun withdrawRecordRouter(): IRouterWithdrawRecord
|
||||||
|
fun watchAdRouter(): IRouterWatchAd
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,35 @@ package com.gamedog.vididin.features.benefit
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.LinearLayout
|
||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
import com.ama.core.architecture.appBase.AppViewsActivity
|
import com.ama.core.architecture.appBase.AppViewsActivity
|
||||||
|
import com.ama.core.architecture.ext.toast
|
||||||
|
import com.ama.core.architecture.util.AndroidUtil
|
||||||
|
import com.ama.core.architecture.util.ResUtil
|
||||||
|
import com.ama.core.architecture.util.eventbus.NotifyMan
|
||||||
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
|
import com.gamedog.vididin.VidiConst
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
|
import com.gamedog.vididin.VididinEvents
|
||||||
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
|
import com.gamedog.vididin.features.benefit.widget.BenefitTaskItemView
|
||||||
|
import com.gamedog.vididin.main.fragments.task.DailySignDialog
|
||||||
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
||||||
|
import com.gamedog.vididin.manager.TaskManager
|
||||||
|
import com.gamedog.vididin.manager.TaskManager.Companion.BOX_SUB_TASK_TYPE_AD
|
||||||
|
import com.gamedog.vididin.manager.TaskManager.Companion.BOX_SUB_TASK_TYPE_VIDEO
|
||||||
|
import com.gamedog.vididin.manager.TaskManager.Companion.BOX_SUB_TASK_TYPE_SIGN
|
||||||
|
import com.gamedog.vididin.manager.TaskManager.Companion.BOX_SUB_TASK_TYPE_ZERO_BUY
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import kotlin.getValue
|
import kotlin.getValue
|
||||||
import com.gamedog.vididin.databinding.ActivityBenefitBinding as ViewBinding
|
import com.gamedog.vididin.manager.taskbeans.BaseTaskState.Companion.STATE_FINISH
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.BaseTaskState.Companion.STATE_CLAIMED
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.BaseTaskState.Companion.STATE_EXPIRED
|
||||||
|
import com.gamedog.vididin.router.Router
|
||||||
|
import com.vididin.real.money.game.databinding.ActivityBenefitBinding as ViewBinding
|
||||||
import com.gamedog.vididin.main.MainUiState as UiState
|
import com.gamedog.vididin.main.MainUiState as UiState
|
||||||
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
||||||
|
|
||||||
|
|
@ -16,6 +39,8 @@ import com.gamedog.vididin.main.MainViewModel as ViewModel
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class BenefitActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabStyleListener {
|
class BenefitActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabStyleListener {
|
||||||
|
|
||||||
|
private val mSubTaskViewList = mutableListOf<BenefitTaskItemView>()
|
||||||
|
|
||||||
|
|
||||||
override val mViewModel: ViewModel by viewModels()
|
override val mViewModel: ViewModel by viewModels()
|
||||||
override fun inflateViewBinding(inflater: LayoutInflater) = ViewBinding.inflate(inflater)
|
override fun inflateViewBinding(inflater: LayoutInflater) = ViewBinding.inflate(inflater)
|
||||||
|
|
@ -26,21 +51,20 @@ class BenefitActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnT
|
||||||
|
|
||||||
|
|
||||||
override fun ViewBinding.initViews() {
|
override fun ViewBinding.initViews() {
|
||||||
|
titlebar.setTitleText(R.string.benefit)
|
||||||
taskItem1.setActionFun {
|
initViewsByTaskState()
|
||||||
gotoWatchVideo()
|
|
||||||
}
|
|
||||||
taskItem2.setActionFun {
|
|
||||||
gotoWatchVideo()
|
|
||||||
}
|
|
||||||
taskItem3.setActionFun {
|
|
||||||
gotoWatchVideo()
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.initListeners() {
|
|
||||||
|
|
||||||
|
|
||||||
|
override fun ViewBinding.initListeners() {
|
||||||
|
registerEvents({ data->
|
||||||
|
when (data?.mEventType) {
|
||||||
|
VididinEvents.EVENT_BOX_TASK_STATE_CHANGED -> {
|
||||||
|
updateUI()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, VididinEvents.EVENT_BOX_TASK_STATE_CHANGED)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.initObservers() {
|
override fun ViewBinding.initObservers() {
|
||||||
|
|
@ -56,10 +80,185 @@ class BenefitActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun gotoWatchVideo() {
|
private fun initViewsByTaskState() {
|
||||||
//TODO("Not yet implemented")
|
initAddSubTaskViews()
|
||||||
|
updateSubTasksUI()
|
||||||
|
updateTopBoxesUI()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun updateUI() {
|
||||||
|
updateSubTasksUI()
|
||||||
|
updateTopBoxesUI()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initAddSubTaskViews() {
|
||||||
|
val taskStateHelper = TaskManager.instance().boxTaskStatus()
|
||||||
|
var subTaskIndex = taskStateHelper.getCurrentBoxIndex()
|
||||||
|
if (subTaskIndex >= 0) {
|
||||||
|
val currentBoxState = taskStateHelper.getStatusBean().tasks[subTaskIndex]
|
||||||
|
currentBoxState.tasks.forEachIndexed { index, subTask ->
|
||||||
|
val separateLine = View(this@BenefitActivity)
|
||||||
|
separateLine.setBackgroundResource(R.color.gray_f2)
|
||||||
|
binding.llSubTaskContainer.addView(separateLine, ViewGroup.LayoutParams.MATCH_PARENT, ResUtil.getPixelSize(R.dimen.dp1))
|
||||||
|
|
||||||
|
val subTaskView = BenefitTaskItemView(this@BenefitActivity)
|
||||||
|
subTaskView.setActionFun { handleActionButClicked(subTask.task_type) }
|
||||||
|
val subViewParam = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
|
||||||
|
subViewParam.topMargin = ResUtil.getPixelSize(R.dimen.dp10)
|
||||||
|
subViewParam.bottomMargin = ResUtil.getPixelSize(R.dimen.dp10)
|
||||||
|
binding.llSubTaskContainer.addView(subTaskView, subViewParam)
|
||||||
|
|
||||||
|
mSubTaskViewList.add(subTaskView)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleActionButClicked(taskType: Int) {
|
||||||
|
when (taskType) {
|
||||||
|
BOX_SUB_TASK_TYPE_AD -> {
|
||||||
|
Router.WatchAd.startActivity(this@BenefitActivity, VidiConst.WATCH_AD_FOR_BOX_TASK)
|
||||||
|
}
|
||||||
|
|
||||||
|
BOX_SUB_TASK_TYPE_SIGN -> {
|
||||||
|
DailySignDialog(this@BenefitActivity).show()
|
||||||
|
}
|
||||||
|
|
||||||
|
BOX_SUB_TASK_TYPE_VIDEO -> {
|
||||||
|
finish()
|
||||||
|
NotifyMan.instance().sendEvent(VididinEvents.EVENT_JUMP_2_VIDEO, null)
|
||||||
|
}
|
||||||
|
|
||||||
|
BOX_SUB_TASK_TYPE_ZERO_BUY -> {
|
||||||
|
Router.ZeroBuy.startActivity(this@BenefitActivity)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateSubTasksUI() {
|
||||||
|
val taskStateHelper = TaskManager.instance().boxTaskStatus()
|
||||||
|
val currentBoxIndex = taskStateHelper.getCurrentBoxIndex()
|
||||||
|
val subTaskStateList = taskStateHelper.getStatusBean().tasks[currentBoxIndex].tasks
|
||||||
|
|
||||||
|
if (subTaskStateList.size == mSubTaskViewList.size) {
|
||||||
|
mSubTaskViewList.forEachIndexed { index, view ->
|
||||||
|
view.updateUIByState(subTaskStateList[index], currentBoxIndex,index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateTopBoxesUI() {
|
||||||
|
val taskStateHelper = TaskManager.instance().boxTaskStatus()
|
||||||
|
val boxStateList = taskStateHelper.getStatusBean().tasks
|
||||||
|
|
||||||
|
with (binding) {
|
||||||
|
boxStateList.forEachIndexed { index, curBoxState ->
|
||||||
|
val stateEnum = taskStateHelper.getBoxStateEnum(index)
|
||||||
|
if (index == 0) {
|
||||||
|
ivSubtask1.setImageResource(getIconResByState(stateEnum))
|
||||||
|
tvSubtask1State.setText(getStrResByState(stateEnum))
|
||||||
|
tvSubtask1State.setTextColor(getStrColorByState(stateEnum))
|
||||||
|
|
||||||
|
with (tvSubtask1Reward) {
|
||||||
|
compoundDrawablePadding = if (stateEnum == STATE_FINISH || stateEnum == STATE_CLAIMED) 0 else ResUtil.getPixelSize(R.dimen.dp3)
|
||||||
|
val tvRewardIcon = getRewardTvDrawableRes(stateEnum)
|
||||||
|
setCompoundDrawables(ResUtil.getDrawable(tvRewardIcon), null, null, null)
|
||||||
|
val needShowNum = R.mipmap.icon_check_mark != tvRewardIcon
|
||||||
|
setText(if (needShowNum) { ResUtil.getString(R.string.cash) + " " + curBoxState.reward_value} else "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index == 1) {
|
||||||
|
ivSubtask2.setImageResource(getIconResByState(stateEnum))
|
||||||
|
tvSubtask2State.setText(getStrResByState(stateEnum))
|
||||||
|
tvSubtask2State.setTextColor(getStrColorByState(stateEnum))
|
||||||
|
|
||||||
|
with (tvSubtask2Reward) {
|
||||||
|
compoundDrawablePadding = if (stateEnum == STATE_FINISH || stateEnum == STATE_CLAIMED) 0 else ResUtil.getPixelSize(R.dimen.dp3)
|
||||||
|
val tvRewardIcon = getRewardTvDrawableRes(stateEnum)
|
||||||
|
setCompoundDrawables(ResUtil.getDrawable(tvRewardIcon), null, null, null)
|
||||||
|
val needShowNum = R.mipmap.icon_check_mark != tvRewardIcon
|
||||||
|
setText(if (needShowNum) { ResUtil.getString(R.string.cash) + " " + curBoxState.reward_value} else "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index == 2) {
|
||||||
|
ivSubtask3.setImageResource(getIconResByState(stateEnum))
|
||||||
|
tvSubtask3State.setText(getStrResByState(stateEnum))
|
||||||
|
tvSubtask3State.setTextColor(getStrColorByState(stateEnum))
|
||||||
|
|
||||||
|
with (tvSubtask3Reward) {
|
||||||
|
compoundDrawablePadding = if (stateEnum == STATE_FINISH || stateEnum == STATE_CLAIMED) 0 else ResUtil.getPixelSize(R.dimen.dp3)
|
||||||
|
val tvRewardIcon = getRewardTvDrawableRes(stateEnum)
|
||||||
|
setCompoundDrawables(ResUtil.getDrawable(tvRewardIcon), null, null, null)
|
||||||
|
val needShowNum = R.mipmap.icon_check_mark != tvRewardIcon
|
||||||
|
setText(if (needShowNum) { ResUtil.getString(R.string.cash) + " " + curBoxState.reward_value} else "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val couldClaimCashNum = taskStateHelper.getCouldClaimCashNum()
|
||||||
|
with (tvResgatar) {
|
||||||
|
if (couldClaimCashNum > 0) {
|
||||||
|
setBackgroundResource(R.mipmap.icon_but_bg_green)
|
||||||
|
isClickable = true
|
||||||
|
} else {
|
||||||
|
setBackgroundResource(R.mipmap.but_bg_grady)
|
||||||
|
isClickable = false
|
||||||
|
}
|
||||||
|
|
||||||
|
setOnClickListener {
|
||||||
|
if (taskStateHelper.executeClaimCash()) {
|
||||||
|
AndroidUtil.showToast(String.format(ResUtil.getString(R.string.has_claim_box_cash_hint), couldClaimCashNum))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 总进度条, 奖励金额
|
||||||
|
val totalProgress = taskStateHelper.getCurrentBoxTotalProgress()
|
||||||
|
progressTasks.setProgress(totalProgress)
|
||||||
|
tvProgressNum.text = "($totalProgress%)"
|
||||||
|
tvHintRewardNum.text = buildString {
|
||||||
|
append(ResUtil.getString(R.string.cash))
|
||||||
|
append(" ")
|
||||||
|
append(taskStateHelper.getStatusBean().tasks[taskStateHelper.getCurrentBoxIndex()].reward_value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getIconResByState(state: Int): Int {
|
||||||
|
when (state) {
|
||||||
|
STATE_EXPIRED -> return R.mipmap.benefit_item_expired
|
||||||
|
STATE_FINISH, STATE_CLAIMED -> return R.mipmap.benefit_item_finished
|
||||||
|
else -> return R.mipmap.benefit_item_ongoing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getStrResByState(state: Int): Int {
|
||||||
|
when (state) {
|
||||||
|
STATE_EXPIRED -> return R.string.expired
|
||||||
|
STATE_FINISH, STATE_CLAIMED -> return R.string.finished
|
||||||
|
else -> return R.string.ongoing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getStrColorByState(state: Int): Int {
|
||||||
|
when (state) {
|
||||||
|
STATE_EXPIRED -> return R.color.gray_60
|
||||||
|
STATE_FINISH, STATE_CLAIMED -> return R.color.green_39
|
||||||
|
else -> return R.color.red_5c
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getRewardTvDrawableRes(state: Int): Int {
|
||||||
|
when (state) {
|
||||||
|
STATE_EXPIRED -> return R.mipmap.icon_cash_s_disable
|
||||||
|
STATE_FINISH, STATE_CLAIMED -> return R.mipmap.icon_check_mark
|
||||||
|
else -> return R.mipmap.icon_cash_s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,10 @@ import android.util.AttributeSet
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
import com.gamedog.vididin.databinding.BenefitTaskItemViewBinding
|
import com.vididin.real.money.game.R
|
||||||
|
import com.vididin.real.money.game.databinding.BenefitTaskItemViewBinding
|
||||||
|
import com.gamedog.vididin.manager.TaskManager
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.TaskStateBoxSub
|
||||||
|
|
||||||
|
|
||||||
class BenefitTaskItemView @JvmOverloads constructor(
|
class BenefitTaskItemView @JvmOverloads constructor(
|
||||||
|
|
@ -40,11 +43,29 @@ class BenefitTaskItemView @JvmOverloads constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun setProgressInfo(progress: String) {
|
fun updateUIByState(subTaskState: TaskStateBoxSub, boxIndex: Int, subTaskIndex: Int) {
|
||||||
mBinding.tvProgressInfo.text = progress
|
with (mBinding) {
|
||||||
|
val finishNum = if (subTaskState.finishedNum > subTaskState.required_count) subTaskState.required_count else subTaskState.finishedNum
|
||||||
|
val progressNum: Int = finishNum * 100 / subTaskState.required_count
|
||||||
|
|
||||||
|
//ivItemIcon.setImageResource(R.mipmap.icon_cash_s)
|
||||||
|
tvItemTitle.setText(TaskManager.instance().boxTaskStatus().getSubTaskHintStrRes(boxIndex, subTaskIndex))
|
||||||
|
progressBar.setProgress(progressNum)
|
||||||
|
tvProgressInfo.text = "($finishNum/${subTaskState.required_count})"
|
||||||
|
|
||||||
|
with (tvAction) {
|
||||||
|
if (progressNum < 100) {
|
||||||
|
isClickable = true
|
||||||
|
setBackgroundResource( R.drawable.bg_benefit_item_action_bg)
|
||||||
|
setText(R.string.go_and_do)
|
||||||
|
} else {
|
||||||
|
isClickable = false
|
||||||
|
setBackgroundResource( R.drawable.bg_sub_task_disable)
|
||||||
|
setText(R.string.finished)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -8,11 +8,11 @@ import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import androidx.core.view.updatePadding
|
import androidx.core.view.updatePadding
|
||||||
import com.ama.core.architecture.appBase.AppViewsActivity
|
import com.ama.core.architecture.appBase.AppViewsActivity
|
||||||
import com.gamedog.vididin.R
|
import com.vididin.real.money.game.R
|
||||||
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import kotlin.getValue
|
import kotlin.getValue
|
||||||
import com.gamedog.vididin.databinding.ActivityFeedbackBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.ActivityFeedbackBinding as ViewBinding
|
||||||
import com.gamedog.vididin.main.MainUiState as UiState
|
import com.gamedog.vididin.main.MainUiState as UiState
|
||||||
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,11 +8,11 @@ import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import androidx.core.view.updatePadding
|
import androidx.core.view.updatePadding
|
||||||
import com.ama.core.architecture.appBase.AppViewsActivity
|
import com.ama.core.architecture.appBase.AppViewsActivity
|
||||||
import com.gamedog.vididin.R
|
import com.vididin.real.money.game.R
|
||||||
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import kotlin.getValue
|
import kotlin.getValue
|
||||||
import com.gamedog.vididin.databinding.ActivityPrivacyBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.ActivityPrivacyBinding as ViewBinding
|
||||||
import com.gamedog.vididin.main.MainUiState as UiState
|
import com.gamedog.vididin.main.MainUiState as UiState
|
||||||
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
||||||
|
|
||||||
|
|
@ -28,17 +28,14 @@ class PrivacyActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnT
|
||||||
with(binding) {
|
with(binding) {
|
||||||
titlebar.setBackIconColor(R.color.black)
|
titlebar.setBackIconColor(R.color.black)
|
||||||
titlebar.setTitleText(R.string.privacy, R.color.black)
|
titlebar.setTitleText(R.string.privacy, R.color.black)
|
||||||
|
|
||||||
|
webView.loadUrl("https://www.baidu.com")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.initWindowInsets() {
|
override fun ViewBinding.initWindowInsets() {
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(contentRoot) { v, insets ->
|
setImmerseRootView(contentRoot)
|
||||||
val systemBars =
|
|
||||||
insets.getInsets(WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout())
|
|
||||||
v.updatePadding(top = systemBars.top)
|
|
||||||
insets
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.initListeners() {
|
override fun ViewBinding.initListeners() {
|
||||||
|
|
|
||||||
|
|
@ -8,11 +8,10 @@ import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import androidx.core.view.updatePadding
|
import androidx.core.view.updatePadding
|
||||||
import com.ama.core.architecture.appBase.AppViewsActivity
|
import com.ama.core.architecture.appBase.AppViewsActivity
|
||||||
import com.gamedog.vididin.R
|
|
||||||
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import kotlin.getValue
|
import kotlin.getValue
|
||||||
import com.gamedog.vididin.databinding.ActivitySplashBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.ActivitySplashBinding as ViewBinding
|
||||||
import com.gamedog.vididin.main.MainUiState as UiState
|
import com.gamedog.vididin.main.MainUiState as UiState
|
||||||
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,15 +4,13 @@ import android.app.Activity
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
import androidx.core.view.ViewCompat
|
|
||||||
import androidx.core.view.WindowInsetsCompat
|
|
||||||
import androidx.core.view.updatePadding
|
|
||||||
import com.ama.core.architecture.appBase.AppViewsActivity
|
import com.ama.core.architecture.appBase.AppViewsActivity
|
||||||
import com.gamedog.vididin.R
|
import com.ama.core.architecture.util.AndroidUtil
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import kotlin.getValue
|
import kotlin.getValue
|
||||||
import com.gamedog.vididin.databinding.ActivityVersionBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.ActivityVersionBinding as ViewBinding
|
||||||
import com.gamedog.vididin.main.MainUiState as UiState
|
import com.gamedog.vididin.main.MainUiState as UiState
|
||||||
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
||||||
|
|
||||||
|
|
@ -28,17 +26,15 @@ class VersionActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnT
|
||||||
with(binding) {
|
with(binding) {
|
||||||
titlebar.setBackIconColor(R.color.black)
|
titlebar.setBackIconColor(R.color.black)
|
||||||
titlebar.setTitleText(R.string.version, R.color.black)
|
titlebar.setTitleText(R.string.version, R.color.black)
|
||||||
|
|
||||||
|
|
||||||
|
tvVersion.text = AndroidUtil.getAppVersionInfo()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.initWindowInsets() {
|
override fun ViewBinding.initWindowInsets() {
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(contentRoot) { v, insets ->
|
setImmerseRootView(contentRoot)
|
||||||
val systemBars =
|
|
||||||
insets.getInsets(WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout())
|
|
||||||
v.updatePadding(top = systemBars.top)
|
|
||||||
insets
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.initListeners() {
|
override fun ViewBinding.initListeners() {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,174 @@
|
||||||
|
package com.gamedog.vididin.features.watchad
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.Intent
|
||||||
|
import android.os.CountDownTimer
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import androidx.activity.addCallback
|
||||||
|
import androidx.activity.viewModels
|
||||||
|
import androidx.core.view.ViewCompat
|
||||||
|
import androidx.core.view.WindowInsetsCompat
|
||||||
|
import androidx.core.view.updatePadding
|
||||||
|
import com.ama.core.architecture.appBase.AppViewsActivity
|
||||||
|
import com.ama.core.architecture.util.AndroidUtil
|
||||||
|
import com.ama.core.architecture.util.eventbus.NotifyMan
|
||||||
|
import com.gamedog.vididin.VidiConst
|
||||||
|
import com.gamedog.vididin.VididinEvents
|
||||||
|
import com.gamedog.vididin.beans.WatchAdNotifyBean
|
||||||
|
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
||||||
|
import com.gamedog.vididin.manager.WithdrawItemBean
|
||||||
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import kotlin.getValue
|
||||||
|
import com.vididin.real.money.game.databinding.ActivityWatchAdBinding as ViewBinding
|
||||||
|
import com.gamedog.vididin.main.MainUiState as UiState
|
||||||
|
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
||||||
|
|
||||||
|
|
||||||
|
@AndroidEntryPoint
|
||||||
|
class WatchAdActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabStyleListener {
|
||||||
|
|
||||||
|
override val mViewModel: ViewModel by viewModels()
|
||||||
|
override fun inflateViewBinding(inflater: LayoutInflater) = ViewBinding.inflate(inflater)
|
||||||
|
|
||||||
|
|
||||||
|
private lateinit var mCountDownTimer: CountDownTimer
|
||||||
|
private var mWatchType: Int = 0
|
||||||
|
private var mExtraJsonStr: String? = null
|
||||||
|
|
||||||
|
override fun ViewBinding.initViews() {
|
||||||
|
with(binding) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun ViewBinding.initWindowInsets() {
|
||||||
|
ViewCompat.setOnApplyWindowInsetsListener(contentRoot) { v, insets ->
|
||||||
|
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout())
|
||||||
|
v.updatePadding(top = systemBars.top)
|
||||||
|
insets
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun ViewBinding.initListeners() {
|
||||||
|
onBackPressedDispatcher.addCallback(this@WatchAdActivity) {
|
||||||
|
AndroidUtil.showToast("Can't exit while watching video")
|
||||||
|
}
|
||||||
|
|
||||||
|
stateCounter()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun notifyAdWatchFinish() {
|
||||||
|
var notifyEventType = 0
|
||||||
|
var notifyData: NotifyMan.NotifyData<Any> = NotifyMan.NotifyData()
|
||||||
|
var earnMoneyNum = 0.1F
|
||||||
|
var shouldNotifyOneAdWatched = true
|
||||||
|
|
||||||
|
|
||||||
|
when (mWatchType) {
|
||||||
|
VidiConst.WATCH_AD_FOR_WITHDRAW_SMALL -> {
|
||||||
|
shouldNotifyOneAdWatched = true
|
||||||
|
notifyEventType = VididinEvents.EVENT_AD_WATCHED_FOR_WITHDRAW_SMALL
|
||||||
|
|
||||||
|
val extraData = mExtraJsonStr?.let {
|
||||||
|
AndroidUtil.json2Object<Float>(mExtraJsonStr!!)
|
||||||
|
}
|
||||||
|
notifyData.mData = WatchAdNotifyBean(earnMoneyNum, extraData)
|
||||||
|
}
|
||||||
|
|
||||||
|
VidiConst.WATCH_AD_FOR_WITHDRAW_BIG -> {
|
||||||
|
shouldNotifyOneAdWatched = true
|
||||||
|
notifyEventType = VididinEvents.EVENT_AD_WATCHED_FOR_WITHDRAW_BIG
|
||||||
|
|
||||||
|
val extraData = mExtraJsonStr?.let {
|
||||||
|
AndroidUtil.json2Object<WithdrawItemBean>(mExtraJsonStr!!)
|
||||||
|
}
|
||||||
|
notifyData.mData = WatchAdNotifyBean(earnMoneyNum, extraData)
|
||||||
|
}
|
||||||
|
|
||||||
|
VidiConst.WATCH_AD_FOR_BOX_TASK -> {
|
||||||
|
shouldNotifyOneAdWatched = true
|
||||||
|
notifyEventType = VididinEvents.EVENT_AD_WATCHED_FOR_BOX_TASK
|
||||||
|
}
|
||||||
|
|
||||||
|
VidiConst.WATCH_AD_FOR_ZERO_EARN_DIAMOND -> {
|
||||||
|
shouldNotifyOneAdWatched = false
|
||||||
|
notifyEventType = VididinEvents.EVENT_AD_WATCHED_FOR_ZEROBUY_EARN_DIAMOND
|
||||||
|
}
|
||||||
|
|
||||||
|
VidiConst.WATCH_AD_FOR_DAILY_WATCH_AD -> {
|
||||||
|
shouldNotifyOneAdWatched = true
|
||||||
|
notifyEventType = VididinEvents.EVENT_AD_WATCHED_FOR_DAILY_WATCH_AD
|
||||||
|
}
|
||||||
|
|
||||||
|
VidiConst.WATCH_AD_FOR_DAILY_EARN_GOLD -> {
|
||||||
|
shouldNotifyOneAdWatched = false
|
||||||
|
notifyEventType = VididinEvents.EVENT_AD_WATCHED_FOR_EARN_GOLD
|
||||||
|
}
|
||||||
|
|
||||||
|
VidiConst.WATCH_AD_FOR_CONVERT_GOLD_2_CASH -> {
|
||||||
|
shouldNotifyOneAdWatched = true
|
||||||
|
notifyEventType = VididinEvents.EVENT_AD_WATCHED_FOR_CONVERT_GOLD_2_CASH
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NotifyMan.instance().sendEvent(notifyEventType, notifyData)
|
||||||
|
if (shouldNotifyOneAdWatched) {
|
||||||
|
NotifyMan.instance().sendEvent(VididinEvents.EVENT_FINISHED_ONE_AD, NotifyMan.NotifyData(1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun stateCounter() {
|
||||||
|
mCountDownTimer = object : CountDownTimer(3000, 1000) {
|
||||||
|
override fun onTick(millisUntilFinished: Long) {
|
||||||
|
val secondsRemaining = millisUntilFinished / 1000
|
||||||
|
binding.tvAdCounter.text = "${secondsRemaining}"
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onFinish() {
|
||||||
|
notifyAdWatchFinish()
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mCountDownTimer.start()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun readIntent(intent: Intent) {
|
||||||
|
super.readIntent(intent)
|
||||||
|
mWatchType = intent.getIntExtra(KEY_TASK_TYPE, 0)
|
||||||
|
mExtraJsonStr = intent.getStringExtra(KEY_TASK_DATA)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
super.onDestroy()
|
||||||
|
mCountDownTimer.cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun ViewBinding.initObservers() {
|
||||||
|
//TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun ViewBinding.onUiStateCollect(uiState: UiState) {
|
||||||
|
//TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onTabIsDarkFont(isDarkFont: Boolean) {
|
||||||
|
//TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val KEY_TASK_TYPE = "KEY_TASK_TYPE"
|
||||||
|
private val KEY_TASK_DATA = "KEY_TASK_DATA"
|
||||||
|
|
||||||
|
internal fun startActivity(activity: Activity, taskType: Int, taskDataJson: String?) {
|
||||||
|
val intent = Intent(activity.applicationContext, WatchAdActivity::class.java)
|
||||||
|
intent.putExtra(KEY_TASK_TYPE, taskType)
|
||||||
|
intent.putExtra(KEY_TASK_DATA, taskDataJson)
|
||||||
|
activity.startActivity(intent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -4,59 +4,95 @@ import android.app.Activity
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.lifecycle.Lifecycle
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.core.view.updatePadding
|
import androidx.lifecycle.repeatOnLifecycle
|
||||||
import com.ama.core.architecture.appBase.AppViewsActivity
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import com.gamedog.vididin.R
|
import com.ama.core.architecture.appBase.AppViewsEmptyViewModelActivity
|
||||||
|
import com.ama.core.architecture.util.CommonItemDecoration
|
||||||
|
import com.gamedog.vididin.beans.ZeroBuyResp
|
||||||
|
import com.gamedog.vididin.features.zero.ZeroBuyViewModel
|
||||||
|
import com.gamedog.vididin.features.zero.ZeroRecordAdapter
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
||||||
|
import com.gamedog.vididin.netbase.Result
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
import kotlin.getValue
|
import kotlin.getValue
|
||||||
import com.gamedog.vididin.databinding.ActivityWinRecordBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.ActivityWinRecordBinding as ViewBinding
|
||||||
import com.gamedog.vididin.main.MainUiState as UiState
|
|
||||||
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
|
||||||
|
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class WinRecordsActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabStyleListener {
|
class WinRecordsActivity : AppViewsEmptyViewModelActivity<ViewBinding>(), OnTabStyleListener {
|
||||||
|
|
||||||
|
private val viewModel: ZeroBuyViewModel by viewModels()
|
||||||
|
private lateinit var mAdapter: ZeroRecordAdapter
|
||||||
|
|
||||||
|
|
||||||
override val mViewModel: ViewModel by viewModels()
|
|
||||||
override fun inflateViewBinding(inflater: LayoutInflater) = ViewBinding.inflate(inflater)
|
override fun inflateViewBinding(inflater: LayoutInflater) = ViewBinding.inflate(inflater)
|
||||||
|
|
||||||
override fun ViewBinding.initViews() {
|
override fun ViewBinding.initViews() {
|
||||||
|
|
||||||
with(binding) {
|
with(binding) {
|
||||||
titlebar.setBackIconColor(R.color.black)
|
titlebar.setBackIconColor(R.color.black)
|
||||||
titlebar.setTitleText(R.string.lottery_record, R.color.black)
|
titlebar.setTitleText(R.string.lottery_record, R.color.black)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
with(recyclerView) {
|
||||||
|
mAdapter = ZeroRecordAdapter()
|
||||||
|
adapter = mAdapter
|
||||||
|
layoutManager = LinearLayoutManager(this@WinRecordsActivity, LinearLayoutManager.VERTICAL, false)
|
||||||
|
addItemDecoration(
|
||||||
|
CommonItemDecoration.create(horizontalSpace = 0, verticalSpace = 30)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.initWindowInsets() {
|
override fun ViewBinding.initWindowInsets() {
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(contentRoot) { v, insets ->
|
setImmerseRootView(contentRoot)
|
||||||
|
/*ViewCompat.setOnApplyWindowInsetsListener(contentRoot) { v, insets ->
|
||||||
val systemBars =
|
val systemBars =
|
||||||
insets.getInsets(WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout())
|
insets.getInsets(WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout())
|
||||||
v.updatePadding(top = systemBars.top)
|
v.updatePadding(top = systemBars.top)
|
||||||
insets
|
insets
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.initListeners() {
|
override fun ViewBinding.initListeners() {
|
||||||
//TODO("Not yet implemented")
|
//TODO("Not yet implemented")
|
||||||
|
requestData()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.initObservers() {
|
override fun ViewBinding.initObservers() {
|
||||||
//TODO("Not yet implemented")
|
//TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.onUiStateCollect(uiState: UiState) {
|
|
||||||
//TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onTabIsDarkFont(isDarkFont: Boolean) {
|
override fun onTabIsDarkFont(isDarkFont: Boolean) {
|
||||||
//TODO("Not yet implemented")
|
//TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun requestData() {
|
||||||
|
lifecycleScope.launch {
|
||||||
|
repeatOnLifecycle(Lifecycle.State.STARTED) {
|
||||||
|
viewModel.ZeroBuyListData.collect { result ->
|
||||||
|
when (result) {
|
||||||
|
is com.gamedog.vididin.netbase.Result.Loading -> { }
|
||||||
|
is com.gamedog.vididin.netbase.Result.Success -> updateUIs(result.data)
|
||||||
|
is Result.Error -> { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
viewModel.requestZeroBuyInfo()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateUIs(data: ZeroBuyResp) {
|
||||||
|
mAdapter.submitList(data.mCurrentList)
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
internal fun startActivity(activity: Activity) {
|
internal fun startActivity(activity: Activity) {
|
||||||
|
|
|
||||||
|
|
@ -48,4 +48,12 @@ object BankUtil {
|
||||||
val remainder = sum % 11
|
val remainder = sum % 11
|
||||||
return if (remainder < 2) 0 else 11 - remainder
|
return if (remainder < 2) 0 else 11 - remainder
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun executeWithDraw() {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
package com.gamedog.vididin.features.withdraw
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
|
||||||
|
class DefaultWithdrawSubRouter: WithdrawSubRouter {
|
||||||
|
override fun startActivity(activity: Activity, withdrawType: Int) {
|
||||||
|
WithDrawSubActivity.Companion.startActivity(activity, withdrawType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,38 +4,53 @@ import android.app.Activity
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
import com.ama.core.architecture.appBase.AppViewsActivity
|
import androidx.lifecycle.Lifecycle
|
||||||
|
import androidx.lifecycle.lifecycleScope
|
||||||
|
import androidx.lifecycle.repeatOnLifecycle
|
||||||
|
import com.ama.core.architecture.appBase.AppViewsEmptyViewModelActivity
|
||||||
|
import com.ama.core.architecture.util.SpUtil
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
import com.gamedog.vididin.R
|
import com.gamedog.vididin.VidiConst
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
import com.gamedog.vididin.VididinEvents
|
import com.gamedog.vididin.VididinEvents
|
||||||
import com.gamedog.vididin.beans.Account
|
import com.gamedog.vididin.beans.WatchAdNotifyBean
|
||||||
|
import com.gamedog.vididin.beans.resp.PayoutCheck
|
||||||
|
import com.gamedog.vididin.beans.resp.PayoutReply
|
||||||
|
import com.gamedog.vididin.beans.resp.WithdrawRecord
|
||||||
import com.gamedog.vididin.core.login.login.AccountManager
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
|
import com.gamedog.vididin.features.withdraw.dialogs.WithdrawBindBankDialog
|
||||||
|
import com.gamedog.vididin.features.withdraw.dialogs.WithdrawFailDialog
|
||||||
|
import com.gamedog.vididin.features.withdraw.dialogs.WithdrawInfoConfirmDialog
|
||||||
|
import com.gamedog.vididin.features.withdraw.dialogs.WithdrawSuccessDialog
|
||||||
import com.gamedog.vididin.features.withdraw.widget.WithDrawItemView
|
import com.gamedog.vididin.features.withdraw.widget.WithDrawItemView
|
||||||
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
import com.gamedog.vididin.netbase.Result
|
||||||
import com.gamedog.vididin.router.Router
|
import com.gamedog.vididin.router.Router
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
import kotlin.getValue
|
import kotlin.getValue
|
||||||
import com.gamedog.vididin.databinding.ActivityWithdrawBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.ActivityWithdrawBinding as ViewBinding
|
||||||
import com.gamedog.vididin.main.MainUiState as UiState
|
|
||||||
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
|
||||||
|
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class WithDrawActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabStyleListener {
|
class WithDrawActivity : AppViewsEmptyViewModelActivity<ViewBinding>() {
|
||||||
|
|
||||||
override val mViewModel: ViewModel by viewModels()
|
|
||||||
override fun inflateViewBinding(inflater: LayoutInflater) = ViewBinding.inflate(inflater)
|
|
||||||
|
|
||||||
|
private val viewModel: WithdrawViewModel by viewModels()
|
||||||
private val mItemViewList: MutableList<WithDrawItemView> = mutableListOf()
|
private val mItemViewList: MutableList<WithDrawItemView> = mutableListOf()
|
||||||
private var mCurSelectedIndex: Int = 0
|
private val mRecordList: MutableList<WithdrawRecord> by lazy {
|
||||||
|
SpUtil.instance().getList<WithdrawRecord>(SpUtil.KEY_WITHDRAW_HISTORY_LIST).toMutableList()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
override fun inflateViewBinding(inflater: LayoutInflater) = ViewBinding.inflate(inflater)
|
||||||
|
|
||||||
override fun ViewBinding.initWindowInsets() {
|
override fun ViewBinding.initWindowInsets() {
|
||||||
setImmerseRootView(contentRoot)
|
setImmerseRootView(contentRoot)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.initViews() {
|
override fun ViewBinding.initViews() {
|
||||||
|
titlebar.setTitleText(R.string.sacar)
|
||||||
|
|
||||||
mItemViewList.add(withdraw01)
|
mItemViewList.add(withdraw01)
|
||||||
mItemViewList.add(withdraw10)
|
mItemViewList.add(withdraw10)
|
||||||
mItemViewList.add(withdraw20)
|
mItemViewList.add(withdraw20)
|
||||||
|
|
@ -45,51 +60,42 @@ class WithDrawActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), On
|
||||||
|
|
||||||
withdraw01.setNumAndAction(0, 0.1F,
|
withdraw01.setNumAndAction(0, 0.1F,
|
||||||
{ itemIndex->
|
{ itemIndex->
|
||||||
updateUIItemSelectStates(itemIndex)
|
handleGotoWithdraw(itemIndex)
|
||||||
})
|
})
|
||||||
|
|
||||||
withdraw10.setNumAndAction(1, 10F,
|
withdraw10.setNumAndAction(1, 10F,
|
||||||
{ itemIndex->
|
{ itemIndex->
|
||||||
updateUIItemSelectStates(itemIndex)
|
handleGotoWithdraw(itemIndex)
|
||||||
})
|
})
|
||||||
|
|
||||||
withdraw20.setNumAndAction(2, 20F,
|
withdraw20.setNumAndAction(2, 20F,
|
||||||
{ itemIndex->
|
{ itemIndex->
|
||||||
updateUIItemSelectStates(itemIndex)
|
handleGotoWithdraw(itemIndex)
|
||||||
})
|
})
|
||||||
|
|
||||||
withdraw50.setNumAndAction(3, 50F,
|
withdraw50.setNumAndAction(3, 50F,
|
||||||
{ itemIndex->
|
{ itemIndex->
|
||||||
updateUIItemSelectStates(itemIndex)
|
handleGotoWithdraw(itemIndex)
|
||||||
})
|
})
|
||||||
|
|
||||||
withdraw100.setNumAndAction(4, 100F,
|
withdraw100.setNumAndAction(4, 100F,
|
||||||
{ itemIndex->
|
{ itemIndex->
|
||||||
updateUIItemSelectStates(itemIndex)
|
handleGotoWithdraw(itemIndex)
|
||||||
})
|
})
|
||||||
|
|
||||||
withdraw300.setNumAndAction(5, 300F,
|
withdraw300.setNumAndAction(5, 300F,
|
||||||
{ itemIndex->
|
{ itemIndex->
|
||||||
updateUIItemSelectStates(itemIndex)
|
handleGotoWithdraw(itemIndex)
|
||||||
})
|
})
|
||||||
|
|
||||||
withdrawPix2.setIconAndText(R.mipmap.pix2, R.string.pix2, {
|
withdrawPix2.setIconAndText(R.mipmap.pix2_big, R.string.pix2, {
|
||||||
|
WithdrawBindBankDialog(this@WithDrawActivity).setWithDrawCashNum(0F).show()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
withdrawPix2.setSelectedState(true)
|
withdrawPix2.setSelectedState(true)
|
||||||
updateUIItemSelectStates(0)
|
|
||||||
|
|
||||||
setOnClickBatch(tvSacar, withdrawRecord) {
|
setOnClickBatch(withdrawRecord) {
|
||||||
when(this) {
|
when(this) {
|
||||||
tvSacar -> {
|
|
||||||
val hasBindBank = AccountManager.hasValidBankInfo()
|
|
||||||
if (!hasBindBank) {
|
|
||||||
WithdrawBindBankDialog(this@WithDrawActivity).show()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
withdrawRecord -> {
|
withdrawRecord -> {
|
||||||
Router.WithdrawRecord.startActivity(this@WithDrawActivity)
|
Router.WithdrawRecord.startActivity(this@WithDrawActivity)
|
||||||
}
|
}
|
||||||
|
|
@ -99,10 +105,18 @@ class WithDrawActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), On
|
||||||
updateUICashTotal()
|
updateUICashTotal()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateUIItemSelectStates(itemIndex: Int) {
|
|
||||||
mCurSelectedIndex = itemIndex
|
private fun handleGotoWithdraw(itemIndex: Int) {
|
||||||
mItemViewList.forEachIndexed { index, view ->
|
if (mItemViewList.get(itemIndex).getCashNum() > 1F) {
|
||||||
view.setSelectedState(index == mCurSelectedIndex)
|
gotoWithdrawSubActivity(itemIndex)
|
||||||
|
} else {
|
||||||
|
val hasBindBank = AccountManager.hasValidBankInfo()
|
||||||
|
val cashNum = mItemViewList.get(itemIndex).getCashNum()
|
||||||
|
if (!hasBindBank) {
|
||||||
|
WithdrawBindBankDialog(this@WithDrawActivity).setWithDrawCashNum(cashNum).show()
|
||||||
|
} else {
|
||||||
|
WithdrawInfoConfirmDialog(this@WithDrawActivity).setWithDrawCashNum(cashNum).show()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -112,24 +126,261 @@ class WithDrawActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), On
|
||||||
|
|
||||||
override fun ViewBinding.initListeners() {
|
override fun ViewBinding.initListeners() {
|
||||||
registerEvents({ data->
|
registerEvents({ data->
|
||||||
updateUICashTotal()
|
when (data?.mEventType) {
|
||||||
}, VididinEvents.Event_Account_Cash_Changed)
|
VididinEvents.Event_Account_Cash_Changed -> {
|
||||||
|
updateUICashTotal()
|
||||||
|
}
|
||||||
|
|
||||||
|
VididinEvents.EVENT_AD_WATCHED_FOR_WITHDRAW_SMALL -> {
|
||||||
|
val notifyData: WatchAdNotifyBean<Float> = data.mData as WatchAdNotifyBean<Float>
|
||||||
|
requestInit(notifyData.extraData)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}, VididinEvents.Event_Account_Cash_Changed, VididinEvents.EVENT_AD_WATCHED_FOR_WITHDRAW_SMALL)
|
||||||
|
|
||||||
|
|
||||||
|
checkTransactionState()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun ViewBinding.initObservers() {
|
override fun ViewBinding.initObservers() {
|
||||||
//TODO("Not yet implemented")
|
//TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.onUiStateCollect(uiState: UiState) {
|
|
||||||
//TODO("Not yet implemented")
|
private fun requestInit(withdrawNum: Float) {
|
||||||
|
lifecycleScope.launch {
|
||||||
|
repeatOnLifecycle(Lifecycle.State.STARTED) {
|
||||||
|
viewModel.InitData.collect { result ->
|
||||||
|
when (result) {
|
||||||
|
is Result.Loading -> {
|
||||||
|
|
||||||
|
}
|
||||||
|
is Result.Success -> {
|
||||||
|
val reqInitBean = result.data.data
|
||||||
|
|
||||||
|
reqInitBean?.let {
|
||||||
|
var errorHintRes = 0
|
||||||
|
|
||||||
|
if (it.error == 0 && !it.uuid.isNullOrEmpty() && !it.items.isNullOrEmpty()) {
|
||||||
|
val itemId = if (withdrawNum <= VidiConst.WITHDRAW_SMALL_NUM) 0 else 1
|
||||||
|
val withDrawItem = it.items?.get(itemId)!!
|
||||||
|
if (withDrawItem.status == INIT_ACTIVE) {
|
||||||
|
requestPayout(it.uuid!!, withDrawItem.id, withdrawNum)
|
||||||
|
} else {
|
||||||
|
errorHintRes = R.string.withdraw_fail_reach_day_limit
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// 0成功,1失败,2签名验证失败,3客户端版本过低,4 ts长度错误
|
||||||
|
when (it.error) {
|
||||||
|
3-> errorHintRes = R.string.withdraw_fail_version_toolow
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (errorHintRes > 0) {
|
||||||
|
showFailDialog(errorHintRes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
is Result.Error -> {
|
||||||
|
showFailDialog(R.string.withdraw_fail_unkown_error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
viewModel.withdrawInit()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onTabIsDarkFont(isDarkFont: Boolean) {
|
private fun requestPayout(initUUID: String, payItemId: Int, payCashNum: Float) {
|
||||||
//TODO("Not yet implemented")
|
val currentTimeMs = System.currentTimeMillis()
|
||||||
|
|
||||||
|
lifecycleScope.launch {
|
||||||
|
repeatOnLifecycle(Lifecycle.State.STARTED) {
|
||||||
|
viewModel.PayoutResult.collect { result ->
|
||||||
|
when (result) {
|
||||||
|
is Result.Loading -> {
|
||||||
|
}
|
||||||
|
is Result.Success -> {
|
||||||
|
var errHintRes = 0
|
||||||
|
|
||||||
|
when (result.data?.data?.error) {
|
||||||
|
/* 错误码,
|
||||||
|
0成功,1失败,2签名验证失败,3客户端版本过低,4uuid错误,5所在地国家或地区不在提现限制内,6提现金额不符对应的产品id,7提现产品id不对,8达到提现金额限制,9提现次数超过限制,10今日没有提现机会,11提现账号达到次数限制,12身份审核条件不满足,不能提现,13巴西提现参数 document_type 错误,
|
||||||
|
14巴西提现参数 document_id 错误,15 巴西提现参数 AccountType 错误,16 巴西提现参数 Name 错误,17巴西提现参数 Account 和 DocumentId 不同,18巴西提现参数account_type为CPF时 对应的 account 错误,19巴西提现参数account_type为CNPJ时 对应的 account 错误,20巴西提现参数 account_type 错误,
|
||||||
|
21巴西提现参数 document_type 错误,22巴西提现参数account_type为CPF时 对应的 document_id 错误,23巴西提现参数account_type为CNPJ时 对应的 document_id 错误,24 ts长度错误,25 没提0.1就提现其它的
|
||||||
|
*/
|
||||||
|
0 -> {
|
||||||
|
saveNewRecord(result.data.data!!, payCashNum, currentTimeMs)
|
||||||
|
}
|
||||||
|
5-> {
|
||||||
|
errHintRes = R.string.withdraw_fail_region_restricit
|
||||||
|
}
|
||||||
|
8-> {
|
||||||
|
errHintRes = R.string.withdraw_fail_amount_limit
|
||||||
|
}
|
||||||
|
9-> {
|
||||||
|
errHintRes = R.string.withdraw_fail_amount_limit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (errHintRes > 0) {
|
||||||
|
showFailDialog(errHintRes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is Result.Error -> {
|
||||||
|
showFailDialog(R.string.withdraw_fail_unkown_error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
viewModel.withdrawPayout(initUUID, payItemId, payCashNum)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun requestCheck(recordNo: String, cashNum: Float) {
|
||||||
|
lifecycleScope.launch {
|
||||||
|
repeatOnLifecycle(Lifecycle.State.STARTED) {
|
||||||
|
viewModel.CheckResult.collect { result ->
|
||||||
|
when (result) {
|
||||||
|
is Result.Loading -> {
|
||||||
|
|
||||||
|
}
|
||||||
|
is Result.Success -> {
|
||||||
|
val checkResult = result.data?.data
|
||||||
|
var errHintRes = 0
|
||||||
|
|
||||||
|
when (checkResult?.error) {
|
||||||
|
0 -> {
|
||||||
|
when (checkResult.status) {
|
||||||
|
// 提现状态 1:提现中,2:提现成功,3:提现失败
|
||||||
|
1 -> {
|
||||||
|
|
||||||
|
}
|
||||||
|
2 -> {
|
||||||
|
showSuccessDialog(cashNum)
|
||||||
|
updateRecord(recordNo, checkResult)
|
||||||
|
}
|
||||||
|
3 -> {
|
||||||
|
errHintRes = R.string.withdraw_normal_fail
|
||||||
|
updateRecord(recordNo, checkResult)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
1 -> {
|
||||||
|
errHintRes = R.string.withdraw_normal_fail
|
||||||
|
}
|
||||||
|
|
||||||
|
2 -> {
|
||||||
|
errHintRes = R.string.withdraw_fail_version_toolow
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (errHintRes > 0) {
|
||||||
|
showFailDialog(errHintRes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is Result.Error -> {
|
||||||
|
showFailDialog(R.string.withdraw_fail_unkown_error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
viewModel.withdrawCheck(recordNo)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showSuccessDialog(cashNum: Float) {
|
||||||
|
WithdrawSuccessDialog(this@WithDrawActivity, cashNum).show()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showFailDialog(errorHintRes: Int) {
|
||||||
|
WithdrawFailDialog(this@WithDrawActivity, errorHintRes).show()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun gotoWithdrawSubActivity(selectedIndex: Int) {
|
||||||
|
Router.WithdrawSub.startActivity(this, selectedIndex - 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------ new added -------------------------//
|
||||||
|
// WithdrawRecord
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
|
private fun saveNewRecord(payoutReply: PayoutReply, payCashNum: Float, timeMs: Long) {
|
||||||
|
val newRecord = WithdrawRecord().apply {
|
||||||
|
id = payoutReply.id!!
|
||||||
|
recordNo = payoutReply.record_no
|
||||||
|
cashNum = payCashNum
|
||||||
|
operateMs = timeMs
|
||||||
|
state = 1
|
||||||
|
failReason = 0
|
||||||
|
}
|
||||||
|
mRecordList.add(newRecord)
|
||||||
|
|
||||||
|
SpUtil.instance().putList(SpUtil.KEY_WITHDRAW_HISTORY_LIST, mRecordList)
|
||||||
|
|
||||||
|
checkTransactionState()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
|
private fun updateRecord(recordNo: String, payCheck: PayoutCheck) {
|
||||||
|
var needSaveSp = false
|
||||||
|
mRecordList.forEachIndexed { index, record ->
|
||||||
|
if (record.recordNo == recordNo) {
|
||||||
|
if (record.state != payCheck.status) {
|
||||||
|
needSaveSp =true
|
||||||
|
record.state = payCheck.status
|
||||||
|
}
|
||||||
|
return@forEachIndexed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needSaveSp) {
|
||||||
|
SpUtil.instance().putList(SpUtil.KEY_WITHDRAW_HISTORY_LIST, mRecordList)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
|
private fun checkTransactionState() {
|
||||||
|
var unCheckCount = 0
|
||||||
|
mRecordList.forEach { record ->
|
||||||
|
if (record.state == FINAL_STATE_ONGING) {
|
||||||
|
unCheckCount++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unCheckCount > 0) {
|
||||||
|
mRecordList.forEachIndexed { index, record ->
|
||||||
|
if (record.state == FINAL_STATE_ONGING) {
|
||||||
|
requestCheck(record.recordNo, record.cashNum)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
binding.root.postDelayed(object : Runnable {
|
||||||
|
override fun run() {
|
||||||
|
checkTransactionState()
|
||||||
|
}
|
||||||
|
}, CHECK_DURATION)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
const val INIT_ACTIVE = 1
|
||||||
|
const val FINAL_STATE_ONGING = 1
|
||||||
|
const val CHECK_DURATION = 10*1000L
|
||||||
|
|
||||||
internal fun startActivity(activity: Activity) {
|
internal fun startActivity(activity: Activity) {
|
||||||
activity.startActivity(Intent(activity.applicationContext, WithDrawActivity::class.java))
|
activity.startActivity(Intent(activity.applicationContext, WithDrawActivity::class.java))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,94 @@
|
||||||
|
package com.gamedog.vididin.features.withdraw
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.Intent
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
|
import com.ama.core.architecture.appBase.AppViewsEmptyViewModelActivity
|
||||||
|
import com.ama.core.architecture.util.AndroidUtil
|
||||||
|
import com.ama.core.architecture.util.CommonItemDecoration
|
||||||
|
import com.ama.core.architecture.util.eventbus.NotifyMan
|
||||||
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
|
import com.gamedog.vididin.VidiConst
|
||||||
|
import com.gamedog.vididin.manager.WithdrawItemBean
|
||||||
|
import com.gamedog.vididin.manager.WithdrawManager
|
||||||
|
import com.gamedog.vididin.router.Router
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import com.vididin.real.money.game.databinding.ActivityWithdrawSubBinding as ViewBinding
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@AndroidEntryPoint
|
||||||
|
class WithDrawSubActivity : AppViewsEmptyViewModelActivity<ViewBinding>() {
|
||||||
|
private var mSelectedSubIndex: Int = 0
|
||||||
|
private lateinit var mCurItem: WithdrawItemBean
|
||||||
|
private var mType: Int = 0
|
||||||
|
private val mAdapter: WithdrawSubAdapter by lazy { WithdrawSubAdapter() }
|
||||||
|
|
||||||
|
|
||||||
|
override fun inflateViewBinding(inflater: LayoutInflater) = ViewBinding.inflate(inflater)
|
||||||
|
|
||||||
|
override fun ViewBinding.initWindowInsets() {
|
||||||
|
setImmerseRootView(contentRoot)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun ViewBinding.initViews() {
|
||||||
|
mType = intent.getIntExtra(EXTRA_TYPE, 0)
|
||||||
|
|
||||||
|
recyclerView.layoutManager = LinearLayoutManager(this@WithDrawSubActivity, LinearLayoutManager.HORIZONTAL, false)
|
||||||
|
recyclerView.adapter = mAdapter
|
||||||
|
recyclerView.addItemDecoration(CommonItemDecoration.create(18, 0, false))
|
||||||
|
|
||||||
|
|
||||||
|
setOnClickBatch(flAction) {
|
||||||
|
when(this) {
|
||||||
|
flAction -> {
|
||||||
|
gotoWatchAd()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun gotoWatchAd() {
|
||||||
|
val extraData = NotifyMan.NotifyData<WithdrawItemBean>(mCurItem)
|
||||||
|
Router.WatchAd.startActivity(this, VidiConst.WATCH_AD_FOR_WITHDRAW_BIG, AndroidUtil.object2Json(extraData))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun ViewBinding.initListeners() {
|
||||||
|
mCurItem = WithdrawManager.instance().getItem(mType)
|
||||||
|
mAdapter.submitList(mCurItem.subItemList)
|
||||||
|
|
||||||
|
mCurItem.subItemList.forEach {
|
||||||
|
if (it.isSelected) {
|
||||||
|
mSelectedSubIndex = it.index
|
||||||
|
return@forEach
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updateUI()
|
||||||
|
|
||||||
|
recyclerView.scrollToPosition(mSelectedSubIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateUI() {
|
||||||
|
with(binding) {
|
||||||
|
progressBar.enableTouch(false)
|
||||||
|
progressBar.setBarColor(forColor = R.color.green_ce)
|
||||||
|
progressBar.setProgress(mCurItem.subItemList[mSelectedSubIndex].currentProgress)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun ViewBinding.initObservers() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val EXTRA_TYPE = "EXTRA_TYPE"
|
||||||
|
internal fun startActivity(activity: Activity, withdrawType: Int) {
|
||||||
|
activity.startActivity(Intent(activity.applicationContext,
|
||||||
|
WithDrawSubActivity::class.java).apply { putExtra(EXTRA_TYPE, withdrawType) })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
||||||
package com.gamedog.vididin.features.withdraw
|
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
|
||||||
import com.ama.core.architecture.widget.BindingDialog
|
|
||||||
import com.gamedog.vididin.databinding.DialogWithdrawBindingBankFinishBinding as ViewBinding
|
|
||||||
import com.gamedog.vididin.router.Router
|
|
||||||
|
|
||||||
|
|
||||||
class WithdrawBindBankFinishDialog(context: Context) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
|
||||||
|
|
||||||
init {
|
|
||||||
build()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private fun build() {
|
|
||||||
with()
|
|
||||||
setCenter()
|
|
||||||
setMaskValue(0.8f)
|
|
||||||
setCanCancel(false)
|
|
||||||
|
|
||||||
mBinding.run {
|
|
||||||
setOnClickBatch(tvConfirm, ivClose) {
|
|
||||||
when (this) {
|
|
||||||
tvConfirm, ivClose -> {
|
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun gotoWatchVideo() {
|
|
||||||
ownerActivity?.let { Router.Withdraw.startActivity(it) }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
||||||
package com.gamedog.vididin.features.withdraw
|
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
|
||||||
import com.ama.core.architecture.widget.BindingDialog
|
|
||||||
import com.gamedog.vididin.databinding.DialogWithdrawFailBinding as ViewBinding
|
|
||||||
import com.gamedog.vididin.router.Router
|
|
||||||
|
|
||||||
|
|
||||||
class WithdrawFailDialog(context: Context) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
|
||||||
|
|
||||||
init {
|
|
||||||
build()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private fun build() {
|
|
||||||
with()
|
|
||||||
setCenter()
|
|
||||||
setMaskValue(0.8f)
|
|
||||||
setCanCancel(false)
|
|
||||||
|
|
||||||
mBinding.run {
|
|
||||||
setOnClickBatch(tvConfirm, ivClose) {
|
|
||||||
when (this) {
|
|
||||||
tvConfirm, ivClose -> {
|
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun gotoWatchVideo() {
|
|
||||||
ownerActivity?.let { Router.Withdraw.startActivity(it) }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
package com.gamedog.vididin.features.withdraw
|
||||||
|
|
||||||
|
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.core.view.isVisible
|
||||||
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
|
import androidx.recyclerview.widget.ListAdapter
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.ama.core.architecture.util.ResUtil
|
||||||
|
import com.gamedog.vididin.manager.WithdrawSubItem
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
|
import com.vididin.real.money.game.databinding.LayoutItemWithdrawSubBinding as ViewBinding
|
||||||
|
|
||||||
|
class WithdrawSubAdapter() : ListAdapter<WithdrawSubItem, WithdrawSubAdapter.ViewHolder>(DiffCallback()) {
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||||
|
val binding = ViewBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||||
|
return ViewHolder(binding)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
|
holder.bind(getItem(position))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inner class ViewHolder(private val binding: ViewBinding) : RecyclerView.ViewHolder(binding.root) {
|
||||||
|
fun bind(item: WithdrawSubItem) {
|
||||||
|
with(binding) {
|
||||||
|
tvTitle.text = buildString {
|
||||||
|
append(ResUtil.getString(R.string.cash))
|
||||||
|
append(item.cashNum)
|
||||||
|
}
|
||||||
|
tvDay.text = buildString {
|
||||||
|
append(ResUtil.getString(R.string.day))
|
||||||
|
append(" ")
|
||||||
|
append(item.index + 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.isSelected) {
|
||||||
|
root.setBackgroundResource(R.drawable.bg_withdraw_sub_selected)
|
||||||
|
root.alpha = 1F
|
||||||
|
ivLefttopChecked.isVisible = true
|
||||||
|
} else {
|
||||||
|
root.setBackgroundResource(R.drawable.bg_withdraw_sub_unselected)
|
||||||
|
root.alpha = 0.7F
|
||||||
|
ivLefttopChecked.isVisible = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DiffCallback : DiffUtil.ItemCallback<WithdrawSubItem>() {
|
||||||
|
override fun areItemsTheSame(oldItem: WithdrawSubItem, newItem: WithdrawSubItem): Boolean {
|
||||||
|
return oldItem.index == newItem.index
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun areContentsTheSame(oldItem: WithdrawSubItem, newItem: WithdrawSubItem): Boolean {
|
||||||
|
return newItem == oldItem
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
package com.gamedog.vididin.features.withdraw
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
|
||||||
|
interface WithdrawSubRouter {
|
||||||
|
fun startActivity(activity: Activity, withdrawType: Int)
|
||||||
|
}
|
||||||
|
|
@ -1,42 +0,0 @@
|
||||||
package com.gamedog.vididin.features.withdraw
|
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
|
||||||
import com.ama.core.architecture.widget.BindingDialog
|
|
||||||
import com.gamedog.vididin.databinding.DialogWithdrawSuccessBinding as ViewBinding
|
|
||||||
import com.gamedog.vididin.router.Router
|
|
||||||
|
|
||||||
|
|
||||||
class WithdrawSuccessDialog(context: Context) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
|
||||||
|
|
||||||
init {
|
|
||||||
build()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private fun build() {
|
|
||||||
with()
|
|
||||||
setCenter()
|
|
||||||
setMaskValue(0.8f)
|
|
||||||
setCanCancel(false)
|
|
||||||
|
|
||||||
mBinding.run {
|
|
||||||
setOnClickBatch(tvConfirm, ivClose) {
|
|
||||||
when (this) {
|
|
||||||
tvConfirm, ivClose -> {
|
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun gotoWatchVideo() {
|
|
||||||
ownerActivity?.let { Router.Withdraw.startActivity(it) }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,123 @@
|
||||||
|
package com.gamedog.vididin.features.withdraw
|
||||||
|
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
|
import com.ama.core.architecture.util.AndroidUtil
|
||||||
|
import com.ama.core.architecture.util.DeviceUtil
|
||||||
|
import com.ama.core.architecture.util.MD5Util
|
||||||
|
import com.ama.core.architecture.util.NetUtil
|
||||||
|
import com.gamedog.vididin.VidiConst
|
||||||
|
import com.gamedog.vididin.beans.req.PayInitReq
|
||||||
|
import com.gamedog.vididin.beans.req.PayoutCheckReq
|
||||||
|
import com.gamedog.vididin.beans.req.PayoutReq
|
||||||
|
import com.gamedog.vididin.beans.resp.PayInit
|
||||||
|
import com.gamedog.vididin.beans.resp.PayoutCheckData
|
||||||
|
import com.gamedog.vididin.beans.resp.PayoutData
|
||||||
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
|
import com.gamedog.vididin.netbase.NetworkUtil
|
||||||
|
import com.gamedog.vididin.netbase.Result
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
|
class WithdrawViewModel : ViewModel() {
|
||||||
|
private val _InitData = MutableStateFlow<Result<PayInit>>(Result.Loading)
|
||||||
|
val InitData: StateFlow<Result<PayInit>> = _InitData.asStateFlow()
|
||||||
|
|
||||||
|
private val _PayoutResult = MutableStateFlow<Result<PayoutData?>>(Result.Loading)
|
||||||
|
val PayoutResult: StateFlow<Result<PayoutData?>> = _PayoutResult.asStateFlow()
|
||||||
|
|
||||||
|
private val _CheckResult = MutableStateFlow<Result<PayoutCheckData?>>(Result.Loading)
|
||||||
|
val CheckResult: StateFlow<Result<PayoutCheckData?>> = _CheckResult.asStateFlow()
|
||||||
|
|
||||||
|
|
||||||
|
fun withdrawInit() {
|
||||||
|
viewModelScope.launch {
|
||||||
|
val requestParam = PayInitReq().applyInitFields()
|
||||||
|
|
||||||
|
_InitData.value = Result.Loading
|
||||||
|
_InitData.value = NetworkUtil.callApi {
|
||||||
|
NetworkUtil.apiservice().withdrawInit(requestParam)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun withdrawPayout(initUUID: String, payItemId: Int, payCashNum: Float) {
|
||||||
|
viewModelScope.launch {
|
||||||
|
val requestParam = PayoutReq().applyInitFields().apply {
|
||||||
|
val bankAccount = "11032341882" //AccountManager.getAccount()?.bankInfo?.bankAccount
|
||||||
|
val accountType = "CPF"
|
||||||
|
|
||||||
|
account = bankAccount
|
||||||
|
item_id = payItemId
|
||||||
|
amount = payCashNum.toString()
|
||||||
|
additional_remark = "communnyboneycashmoneyrewardfastrealgame"
|
||||||
|
uuid = initUUID
|
||||||
|
account_type = accountType
|
||||||
|
document_type = accountType
|
||||||
|
document_id = bankAccount
|
||||||
|
name = "CapyBucks"
|
||||||
|
clientName = "com.jaguar.pace.earn.cash.free.game" //AndroidUtil.getPackageId()
|
||||||
|
|
||||||
|
|
||||||
|
dataAdjust.gps_adid = "gaid"
|
||||||
|
dataAdjust.android_id = "androidid"
|
||||||
|
dataAdjust.adid = "adid"
|
||||||
|
dataAdjust.user_agent = "GetUerAgent"
|
||||||
|
dataAdjust.price = amount
|
||||||
|
dataAdjust.currency = "USD"
|
||||||
|
|
||||||
|
dataShuShu.gps_gaid = "gaid"
|
||||||
|
dataShuShu.android_id = "androidid"
|
||||||
|
dataShuShu.adid = "adid"
|
||||||
|
dataShuShu.user_agent = "GetUerAgent"
|
||||||
|
dataShuShu.price = amount
|
||||||
|
dataShuShu.currency = "USD"
|
||||||
|
dataShuShu.payment_method = "Pix"
|
||||||
|
dataShuShu.payment_type = accountType
|
||||||
|
dataShuShu.payment_number = account
|
||||||
|
dataShuShu.iap_name = "100br"
|
||||||
|
dataShuShu.gamecoin_number = "100"
|
||||||
|
dataShuShu.gamecoin_type = "gold"
|
||||||
|
dataShuShu.ss_account_id = "GetSSAccountId"
|
||||||
|
dataShuShu.ss_distinct_id = "GetSSDistinctId"
|
||||||
|
dataShuShu.ss_super_properties = "GetSSSuper Properties"
|
||||||
|
}
|
||||||
|
|
||||||
|
_PayoutResult.value = Result.Loading
|
||||||
|
_PayoutResult.value = NetworkUtil.callApi {
|
||||||
|
NetworkUtil.apiservice().withdrawPayout(requestParam)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun withdrawCheck(recordNo: String) {
|
||||||
|
viewModelScope.launch {
|
||||||
|
val requestParam = PayoutCheckReq().applyInitFields().apply {
|
||||||
|
record_no = recordNo
|
||||||
|
}
|
||||||
|
|
||||||
|
_CheckResult.value = Result.Loading
|
||||||
|
_CheckResult.value = NetworkUtil.callApi {
|
||||||
|
NetworkUtil.apiservice().withdrawCheck(requestParam)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun <T : PayInitReq> T.applyInitFields(): T {
|
||||||
|
apply {
|
||||||
|
platform = "Android"
|
||||||
|
deviceid = DeviceUtil.generateDeviceId()
|
||||||
|
version = AndroidUtil.getAppVersionInfo()
|
||||||
|
ip = NetUtil.getLocalIpAddress()
|
||||||
|
ts = (System.currentTimeMillis()/1000).toString()
|
||||||
|
val signOrigin = "${VidiConst.WITHDRAW_MD5KEY}platform=${platform}deviceid=${deviceid}version=${version}ip=${ip}ts=$ts"
|
||||||
|
sign = MD5Util.md5ForWithDraw(signOrigin)
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,20 +1,23 @@
|
||||||
package com.gamedog.vididin.features.withdraw
|
package com.gamedog.vididin.features.withdraw.dialogs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context
|
import android.app.Activity
|
||||||
import android.text.Editable
|
import android.text.Editable
|
||||||
import android.text.TextWatcher
|
import android.text.TextWatcher
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
|
import com.ama.core.architecture.util.ResUtil
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
import com.ama.core.architecture.widget.BindingDialog
|
import com.ama.core.architecture.widget.BindingDialog
|
||||||
import com.gamedog.vididin.R
|
import com.vididin.real.money.game.R
|
||||||
import com.gamedog.vididin.core.login.login.AccountManager
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
import com.gamedog.vididin.databinding.DialogWithdrawBindingBankBinding as ViewBinding
|
import com.gamedog.vididin.features.withdraw.BankUtil
|
||||||
import com.gamedog.vididin.router.Router
|
import com.vididin.real.money.game.databinding.DialogWithdrawBindingBankBinding as ViewBinding
|
||||||
|
|
||||||
|
|
||||||
class WithdrawBindBankDialog(context: Context) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
class WithdrawBindBankDialog(activity: Activity) : BindingDialog<ViewBinding>(activity, ViewBinding::inflate) {
|
||||||
|
|
||||||
|
private var mWithdrawCashNum: Float = 0F
|
||||||
|
|
||||||
init {
|
init {
|
||||||
build()
|
build()
|
||||||
|
|
@ -36,6 +39,11 @@ class WithdrawBindBankDialog(context: Context) : BindingDialog<ViewBinding>(cont
|
||||||
|
|
||||||
tvConfirm -> {
|
tvConfirm -> {
|
||||||
saveBankAccount(mBinding.tvCpfEdit.text.toString().trim())
|
saveBankAccount(mBinding.tvCpfEdit.text.toString().trim())
|
||||||
|
if (mWithdrawCashNum > 0F) {
|
||||||
|
WithdrawInfoConfirmDialog(mActivity).setWithDrawCashNum(mWithdrawCashNum).show()
|
||||||
|
}
|
||||||
|
|
||||||
|
dismiss()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -76,8 +84,7 @@ class WithdrawBindBankDialog(context: Context) : BindingDialog<ViewBinding>(cont
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkBankAccountValidation(bankAccount: String) {
|
private fun checkBankAccountValidation(bankAccount: String) {
|
||||||
// TODO - forTesting- contain "B"
|
if (BankUtil.isValidCpf(bankAccount) || (bankAccount.trim().length == 11)) {
|
||||||
if (BankUtil.isValidCpf(bankAccount) || bankAccount.contains("B")) {
|
|
||||||
mBinding.ivState.isVisible = true
|
mBinding.ivState.isVisible = true
|
||||||
mBinding.ivState.setImageResource(R.mipmap.icon_success)
|
mBinding.ivState.setImageResource(R.mipmap.icon_success)
|
||||||
mBinding.tvConfirm.alpha = 1F
|
mBinding.tvConfirm.alpha = 1F
|
||||||
|
|
@ -90,14 +97,21 @@ class WithdrawBindBankDialog(context: Context) : BindingDialog<ViewBinding>(cont
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun gotoWatchVideo() {
|
|
||||||
ownerActivity?.let { Router.Withdraw.startActivity(it) }
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDetachedFromWindow() {
|
override fun onDetachedFromWindow() {
|
||||||
super.onDetachedFromWindow()
|
super.onDetachedFromWindow()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun setWithDrawCashNum(withdrawNum: Float): WithdrawBindBankDialog {
|
||||||
|
mWithdrawCashNum = withdrawNum
|
||||||
|
|
||||||
|
if (mWithdrawCashNum == 0F) {
|
||||||
|
mBinding.tvConfirm.text = ResUtil.getString(R.string.confirm)
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.gamedog.vididin.features.withdraw.dialogs
|
||||||
|
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
|
import com.ama.core.architecture.widget.BindingDialog
|
||||||
|
import com.vididin.real.money.game.databinding.DialogWithdrawFailBinding as ViewBinding
|
||||||
|
import com.gamedog.vididin.router.Router
|
||||||
|
|
||||||
|
|
||||||
|
class WithdrawFailDialog(context: Activity, private val errorHintRes: Int) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
||||||
|
|
||||||
|
init {
|
||||||
|
build()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun build() {
|
||||||
|
with()
|
||||||
|
setCenter()
|
||||||
|
setMaskValue(0.8f)
|
||||||
|
setCanCancel(false)
|
||||||
|
|
||||||
|
mBinding.run {
|
||||||
|
setOnClickBatch(tvActionFeedback, tvActionConfirm, ivClose) {
|
||||||
|
when (this) {
|
||||||
|
ivClose -> {
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
|
||||||
|
tvActionFeedback -> {
|
||||||
|
gotoFeedback()
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
|
||||||
|
tvActionConfirm -> {
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tvReason.setText(errorHintRes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun gotoFeedback() {
|
||||||
|
Router.Feedback.startActivity(mActivity)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,71 @@
|
||||||
|
package com.gamedog.vididin.features.withdraw.dialogs
|
||||||
|
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import com.ama.core.architecture.util.AndroidUtil
|
||||||
|
import com.ama.core.architecture.util.ResUtil
|
||||||
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
|
import com.ama.core.architecture.widget.BindingDialog
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
|
import com.vididin.real.money.game.databinding.DialogWithdrawInfoConfirmBinding as ViewBinding
|
||||||
|
|
||||||
|
|
||||||
|
class WithdrawInfoConfirmDialog(context: Activity, ) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
||||||
|
|
||||||
|
private var mWithdrawCashNum: Float = 0F
|
||||||
|
|
||||||
|
init {
|
||||||
|
build()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun build() {
|
||||||
|
with()
|
||||||
|
setCenter()
|
||||||
|
setMaskValue(0.8f)
|
||||||
|
setCanCancel(false)
|
||||||
|
|
||||||
|
mBinding.run {
|
||||||
|
setOnClickBatch(tvActionAlter, tvActionApply, ivClose) {
|
||||||
|
when (this) {
|
||||||
|
ivClose -> {
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
|
||||||
|
tvActionAlter -> {
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
|
||||||
|
tvActionApply -> {
|
||||||
|
AccountManager.getAccount()?.cashCount?.let {
|
||||||
|
if (it < mWithdrawCashNum) {
|
||||||
|
AndroidUtil.showToast(R.string.not_enough_cash)
|
||||||
|
} else {
|
||||||
|
WithdrawWatchAdDialog(mActivity, mWithdrawCashNum).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun setWithDrawCashNum(withdrawNum: Float): WithdrawInfoConfirmDialog {
|
||||||
|
mWithdrawCashNum = withdrawNum
|
||||||
|
|
||||||
|
mBinding.tvCashNum.text = buildString {
|
||||||
|
append(ResUtil.getString(R.string.cash))
|
||||||
|
append(" ")
|
||||||
|
append(mWithdrawCashNum)
|
||||||
|
}
|
||||||
|
mBinding.tvCpfAccount.text = AccountManager.getBankInfo()?.bankAccount
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
package com.gamedog.vididin.features.withdraw.dialogs
|
||||||
|
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
|
import com.ama.core.architecture.widget.BindingDialog
|
||||||
|
import com.vididin.real.money.game.databinding.DialogWithdrawSuccessBinding as ViewBinding
|
||||||
|
|
||||||
|
|
||||||
|
class WithdrawSuccessDialog(context: Activity, private val mCashNum: Float) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
||||||
|
|
||||||
|
init {
|
||||||
|
build()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun build() {
|
||||||
|
with()
|
||||||
|
setCenter()
|
||||||
|
setMaskValue(0.8f)
|
||||||
|
setCanCancel(false)
|
||||||
|
|
||||||
|
mBinding.run {
|
||||||
|
setOnClickBatch(flAction, ivClose) {
|
||||||
|
when (this) {
|
||||||
|
ivClose -> {
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
flAction -> {
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tvCashNum.text = mCashNum.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
package com.gamedog.vididin.features.withdraw.dialogs
|
||||||
|
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import com.ama.core.architecture.util.AndroidUtil
|
||||||
|
import com.ama.core.architecture.util.eventbus.NotifyMan
|
||||||
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
|
import com.ama.core.architecture.widget.BindingDialog
|
||||||
|
import com.gamedog.vididin.VidiConst
|
||||||
|
import com.gamedog.vididin.router.Router
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
|
import com.vididin.real.money.game.databinding.DialogWithdrawWatchAdBinding as ViewBinding
|
||||||
|
|
||||||
|
|
||||||
|
class WithdrawWatchAdDialog(context: Activity, private var mWithdrawCashNum: Float) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
||||||
|
|
||||||
|
|
||||||
|
init {
|
||||||
|
build()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun build() {
|
||||||
|
with()
|
||||||
|
setCenter()
|
||||||
|
setMaskValue(0.8f)
|
||||||
|
setCanCancel(false)
|
||||||
|
|
||||||
|
mBinding.run {
|
||||||
|
progressBar.setBarColor(R.color.blue_ba, R.color.blue_ff)
|
||||||
|
tvCashNum.text = mWithdrawCashNum.toString()
|
||||||
|
|
||||||
|
setOnClickBatch(flAction, ivClose) {
|
||||||
|
when (this) {
|
||||||
|
ivClose -> {
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
|
||||||
|
flAction -> {
|
||||||
|
gotoWatchVideo()
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun gotoWatchVideo() {
|
||||||
|
Router.WatchAd.startActivity(mActivity, VidiConst.WATCH_AD_FOR_WITHDRAW_SMALL, AndroidUtil.object2Json(mWithdrawCashNum))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.gamedog.vididin.features.withdraw.widget
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import com.ama.core.architecture.util.ResUtil
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
|
import com.vididin.real.money.game.databinding.WithdrawItemBankViewBinding as ViewBinding
|
||||||
|
|
||||||
|
|
||||||
|
class WithDrawItemBankView @JvmOverloads constructor(
|
||||||
|
context: Context,
|
||||||
|
attrs: AttributeSet? = null,
|
||||||
|
defStyleAttr: Int = 0
|
||||||
|
) : LinearLayout(context, attrs, defStyleAttr) {
|
||||||
|
private var mItemIndex: Int = 0
|
||||||
|
private var mIsSelected = false
|
||||||
|
private var mBinding: ViewBinding
|
||||||
|
|
||||||
|
|
||||||
|
init {
|
||||||
|
mBinding = ViewBinding.inflate(LayoutInflater.from(context), this, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For withdraw number in top area
|
||||||
|
*/
|
||||||
|
fun setAction(itemIndex: Int, clickAction: (Int)->Unit) {
|
||||||
|
mItemIndex = itemIndex
|
||||||
|
mBinding.root.setOnClickListener {
|
||||||
|
clickAction.invoke(mItemIndex)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For bank item in bottom area
|
||||||
|
*/
|
||||||
|
fun setIconAndText(iconRes: Int, textRes: Int, clickAction: ()->Unit) {
|
||||||
|
mBinding.tvWithdrawNum.text = ResUtil.getString(textRes)
|
||||||
|
mBinding.ivItemIcon.setImageResource(iconRes)
|
||||||
|
mBinding.root.setOnClickListener {
|
||||||
|
clickAction.invoke()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setSelectedState(isSelected: Boolean) {
|
||||||
|
mIsSelected = isSelected
|
||||||
|
mBinding.root.setBackgroundResource(if (mIsSelected) R.drawable.withdraw_item_bg_selected else R.drawable.withdraw_item_bg_unselected)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -4,9 +4,7 @@ import android.content.Context
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import com.ama.core.architecture.util.ResUtil
|
import com.vididin.real.money.game.databinding.WithdrawItemViewBinding as ViewBinding
|
||||||
import com.gamedog.vididin.R
|
|
||||||
import com.gamedog.vididin.databinding.WithdrawItemViewBinding as ViewBinding
|
|
||||||
|
|
||||||
|
|
||||||
class WithDrawItemView @JvmOverloads constructor(
|
class WithDrawItemView @JvmOverloads constructor(
|
||||||
|
|
@ -15,7 +13,6 @@ class WithDrawItemView @JvmOverloads constructor(
|
||||||
defStyleAttr: Int = 0
|
defStyleAttr: Int = 0
|
||||||
) : LinearLayout(context, attrs, defStyleAttr) {
|
) : LinearLayout(context, attrs, defStyleAttr) {
|
||||||
private var mItemIndex: Int = 0
|
private var mItemIndex: Int = 0
|
||||||
private var mIsSelected = false
|
|
||||||
private var mCashNum: Float = 0F
|
private var mCashNum: Float = 0F
|
||||||
private var mBinding: ViewBinding
|
private var mBinding: ViewBinding
|
||||||
|
|
||||||
|
|
@ -32,26 +29,14 @@ class WithDrawItemView @JvmOverloads constructor(
|
||||||
mItemIndex = itemIndex
|
mItemIndex = itemIndex
|
||||||
mCashNum = cashNum
|
mCashNum = cashNum
|
||||||
mBinding.tvWithdrawNum.text = cashNum.toString()
|
mBinding.tvWithdrawNum.text = cashNum.toString()
|
||||||
mBinding.root.setOnClickListener {
|
mBinding.tvSacar.setOnClickListener {
|
||||||
clickAction.invoke(mItemIndex)
|
clickAction.invoke(mItemIndex)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
fun getCashNum(): Float {
|
||||||
* For bank item in bottom area
|
return mCashNum
|
||||||
*/
|
|
||||||
fun setIconAndText(iconRes: Int, textRes: Int, clickAction: ()->Unit) {
|
|
||||||
mBinding.tvWithdrawNum.text = ResUtil.getString(textRes)
|
|
||||||
mBinding.ivItemIcon.setImageResource(iconRes)
|
|
||||||
mBinding.root.setOnClickListener {
|
|
||||||
clickAction.invoke()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setSelectedState(isSelected: Boolean) {
|
|
||||||
mIsSelected = isSelected
|
|
||||||
mBinding.root.setBackgroundResource(if (mIsSelected) R.drawable.withdraw_item_bg_selected else R.drawable.withdraw_item_bg_unselected)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
package com.gamedog.vididin.features.withdrawrecord
|
||||||
|
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
|
import androidx.recyclerview.widget.ListAdapter
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.gamedog.vididin.beans.RecordCash
|
||||||
|
import com.vididin.real.money.game.databinding.FragmentWithdrawRecordCashItemBinding as ViewBinding
|
||||||
|
|
||||||
|
class RecordCashRvAdapter : ListAdapter<RecordCash, RecordCashRvAdapter.ViewHolder>(DiffCallback()) {
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||||
|
val binding = ViewBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||||
|
return ViewHolder(binding)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
|
holder.bind(getItem(position))
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class ViewHolder(private val binding: ViewBinding) : RecyclerView.ViewHolder(binding.root) {
|
||||||
|
fun bind(transaction: RecordCash) {
|
||||||
|
binding.tvDate.text = transaction.dateTime
|
||||||
|
binding.tvTitle.text = transaction.statusText
|
||||||
|
binding.tvDescription.text = transaction.description
|
||||||
|
binding.tvAmount.text = transaction.amount
|
||||||
|
binding.tvAmount.setTextColor(ContextCompat.getColor(binding.root.context, transaction.amountColor))
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DiffCallback : DiffUtil.ItemCallback<RecordCash>() {
|
||||||
|
override fun areItemsTheSame(oldItem: RecordCash, newItem: RecordCash): Boolean {
|
||||||
|
return oldItem.id == newItem.id
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun areContentsTheSame(oldItem: RecordCash, newItem: RecordCash): Boolean {
|
||||||
|
return oldItem == newItem
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.gamedog.vididin.features.withdrawrecord
|
||||||
|
|
||||||
|
|
||||||
|
import com.ama.core.architecture.appBase.vm.AppViewModel
|
||||||
|
import com.gamedog.vididin.beans.RecordCash
|
||||||
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
import kotlinx.coroutines.flow.flowOf
|
||||||
|
import javax.inject.Inject
|
||||||
|
import com.gamedog.vididin.features.withdrawrecord.RecordCashUiState as UiState
|
||||||
|
|
||||||
|
|
||||||
|
@HiltViewModel
|
||||||
|
class RecordCashViewModel @Inject constructor() : AppViewModel<UiState>() {
|
||||||
|
override val uiStateInitialValue: UiState = UiState()
|
||||||
|
override val uiStateFlow: Flow<UiState> = flowOf()
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
data class RecordCashUiState(
|
||||||
|
val mRecordList: MutableList<RecordCash> = mutableListOf()
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
package com.gamedog.vididin.features.withdrawrecord
|
||||||
|
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
|
import androidx.recyclerview.widget.ListAdapter
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.gamedog.vididin.beans.RecordGold
|
||||||
|
import com.vididin.real.money.game.databinding.FragmentWithdrawRecordGoldItemBinding as ViewBinding
|
||||||
|
|
||||||
|
class RecordGoldRvAdapter : ListAdapter<RecordGold, RecordGoldRvAdapter.ViewHolder>(DiffCallback()) {
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||||
|
val binding = ViewBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||||
|
return ViewHolder(binding)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
|
holder.bind(getItem(position))
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class ViewHolder(private val binding: ViewBinding) : RecyclerView.ViewHolder(binding.root) {
|
||||||
|
fun bind(transaction: RecordGold) {
|
||||||
|
binding.tvDate.text = transaction.dateTime
|
||||||
|
binding.tvTitle.text = transaction.statusText
|
||||||
|
binding.tvDescription.text = transaction.description
|
||||||
|
binding.tvAmount.text = transaction.amount
|
||||||
|
binding.tvAmount.setTextColor(ContextCompat.getColor(binding.root.context, transaction.amountColor))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DiffCallback : DiffUtil.ItemCallback<RecordGold>() {
|
||||||
|
override fun areItemsTheSame(oldItem: RecordGold, newItem: RecordGold): Boolean {
|
||||||
|
return oldItem.id == newItem.id
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun areContentsTheSame(oldItem: RecordGold, newItem: RecordGold): Boolean {
|
||||||
|
return oldItem == newItem
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.gamedog.vididin.features.withdrawrecord
|
||||||
|
|
||||||
|
|
||||||
|
import com.ama.core.architecture.appBase.vm.AppViewModel
|
||||||
|
import com.gamedog.vididin.beans.RecordGold
|
||||||
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
import kotlinx.coroutines.flow.flowOf
|
||||||
|
import javax.inject.Inject
|
||||||
|
import com.gamedog.vididin.features.withdrawrecord.RecordGoldUiState as UiState
|
||||||
|
|
||||||
|
|
||||||
|
@HiltViewModel
|
||||||
|
class RecordGoldViewModel @Inject constructor() : AppViewModel<UiState>() {
|
||||||
|
override val uiStateInitialValue: UiState = UiState()
|
||||||
|
override val uiStateFlow: Flow<UiState> = flowOf()
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
data class RecordGoldUiState(
|
||||||
|
val mRecordList: MutableList<RecordGold> = mutableListOf()
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
package com.gamedog.vididin.features.withdrawrecord
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.fragment.app.FragmentActivity
|
||||||
|
import androidx.viewpager2.adapter.FragmentStateAdapter
|
||||||
|
import com.gamedog.vididin.features.withdrawrecord.fragments.CashRecordFragment
|
||||||
|
import com.gamedog.vididin.features.withdrawrecord.fragments.GoldRecordFragment
|
||||||
|
|
||||||
|
class ViewPagerAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) {
|
||||||
|
|
||||||
|
override fun getItemCount(): Int = 2
|
||||||
|
|
||||||
|
override fun createFragment(position: Int): Fragment {
|
||||||
|
return when (position) {
|
||||||
|
0 -> CashRecordFragment()
|
||||||
|
1 -> GoldRecordFragment()
|
||||||
|
else -> throw IllegalArgumentException("Invalid position: $position")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,11 +8,15 @@ import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import androidx.core.view.updatePadding
|
import androidx.core.view.updatePadding
|
||||||
import com.ama.core.architecture.appBase.AppViewsActivity
|
import com.ama.core.architecture.appBase.AppViewsActivity
|
||||||
import com.gamedog.vididin.R
|
import com.ama.core.architecture.util.ResUtil
|
||||||
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
||||||
|
import com.google.android.material.tabs.TabLayout
|
||||||
|
import com.google.android.material.tabs.TabLayoutMediator
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import kotlin.getValue
|
import kotlin.getValue
|
||||||
import com.gamedog.vididin.databinding.ActivityWithdrawRecordBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.ActivityWithdrawRecordBinding as ViewBinding
|
||||||
import com.gamedog.vididin.main.MainUiState as UiState
|
import com.gamedog.vididin.main.MainUiState as UiState
|
||||||
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
||||||
|
|
||||||
|
|
@ -26,8 +30,15 @@ class WithdrawRecordActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>
|
||||||
override fun ViewBinding.initViews() {
|
override fun ViewBinding.initViews() {
|
||||||
|
|
||||||
with(binding) {
|
with(binding) {
|
||||||
titlebar.setBackIconColor(R.color.black)
|
setupViewPager()
|
||||||
titlebar.setTitleText(R.string.title_cash_record, R.color.black)
|
|
||||||
|
setOnClickBatch(ivBack) {
|
||||||
|
when (this) {
|
||||||
|
ivBack -> {
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -58,10 +69,45 @@ class WithdrawRecordActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun setupViewPager() {
|
||||||
|
val adapter = ViewPagerAdapter(this)
|
||||||
|
binding.viewPager.adapter = adapter
|
||||||
|
|
||||||
|
with (binding.tabLayout) {
|
||||||
|
addOnTabSelectedListener(object: TabLayout.OnTabSelectedListener {
|
||||||
|
override fun onTabSelected(tab: TabLayout.Tab?) {
|
||||||
|
setTabTextColors(ResUtil.getColor(R.color.black),
|
||||||
|
ResUtil.getColor(if (selectedTabPosition == 0) R.color.green_39 else R.color.yellow_0b))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onTabUnselected(tab: TabLayout.Tab?) {
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onTabReselected(tab: TabLayout.Tab?) {
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position ->
|
||||||
|
tab.text = when (position) {
|
||||||
|
0 -> ResUtil.getString(R.string.record_cash_title)
|
||||||
|
1 -> ResUtil.getString(R.string.record_gold_title)
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
}.attach()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
internal fun startActivity(activity: Activity) {
|
internal fun startActivity(activity: Activity) {
|
||||||
activity.startActivity(Intent(activity.applicationContext, WithdrawRecordActivity::class.java))
|
activity.startActivity(Intent(activity.applicationContext, WithdrawRecordActivity::class.java))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,118 @@
|
||||||
|
package com.gamedog.vididin.features.withdrawrecord.fragments
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.fragment.app.viewModels
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
|
import com.ama.core.architecture.appBase.AppViewsFragment
|
||||||
|
import com.ama.core.architecture.appBase.OnFragmentBackgroundListener
|
||||||
|
import com.ama.core.architecture.util.setStatusBarDarkFont
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
|
import com.gamedog.vididin.beans.RecordCash
|
||||||
|
import com.gamedog.vididin.beans.TransactionStatus
|
||||||
|
import com.gamedog.vididin.features.withdrawrecord.RecordCashRvAdapter
|
||||||
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import kotlin.getValue
|
||||||
|
import com.vididin.real.money.game.databinding.FragmentWithdrawRecordCashBinding as ViewBinding
|
||||||
|
import com.gamedog.vididin.features.withdrawrecord.RecordCashUiState as UiState
|
||||||
|
import com.gamedog.vididin.features.withdrawrecord.RecordCashViewModel as ViewModel
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@AndroidEntryPoint
|
||||||
|
class CashRecordFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(),
|
||||||
|
OnFragmentBackgroundListener {
|
||||||
|
private lateinit var mAdapter: RecordCashRvAdapter
|
||||||
|
override val mViewModel: ViewModel by viewModels()
|
||||||
|
override var isBackgroundBright: Boolean = true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private var isStatusBarDarkFont = false
|
||||||
|
|
||||||
|
override fun inflateViewBinding(
|
||||||
|
inflater: LayoutInflater,
|
||||||
|
container: ViewGroup?,
|
||||||
|
) = ViewBinding.inflate(inflater, container, false)
|
||||||
|
|
||||||
|
override fun ViewBinding.initWindowInsets() {
|
||||||
|
binding?.root?.let { setImmerseRootView(it) }
|
||||||
|
isStatusBarDarkFont = true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun ViewBinding.initViews() {
|
||||||
|
setupRecyclerView()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun ViewBinding.initListeners() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun ViewBinding.initObservers() {
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun ViewBinding.onUiStateCollect(uiState: UiState) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
setStatusBarDarkFont(isDarkFont = isStatusBarDarkFont)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun setupRecyclerView() {
|
||||||
|
mAdapter = RecordCashRvAdapter()
|
||||||
|
binding?.recyclerView?.adapter = mAdapter
|
||||||
|
binding?.recyclerView?.layoutManager = LinearLayoutManager(requireContext())
|
||||||
|
|
||||||
|
// 模拟数据
|
||||||
|
val transactions = listOf(
|
||||||
|
RecordCash(
|
||||||
|
id = 1,
|
||||||
|
dateTime = "2025/10/31 17:30",
|
||||||
|
status = TransactionStatus.SUCCESS,
|
||||||
|
statusText = "Sucesso",
|
||||||
|
description = "Você solicitou o saque com sucesso!",
|
||||||
|
amount = "-R$ 0,1",
|
||||||
|
amountColor = R.color.red_11
|
||||||
|
),
|
||||||
|
RecordCash(
|
||||||
|
id = 2,
|
||||||
|
dateTime = "2025/10/31 17:30",
|
||||||
|
status = TransactionStatus.FAILED,
|
||||||
|
statusText = "Falhou",
|
||||||
|
description = "Você solicitou o saque com sucesso!",
|
||||||
|
amount = "-R$ 0,0",
|
||||||
|
amountColor = R.color.red_11
|
||||||
|
),
|
||||||
|
RecordCash(
|
||||||
|
id = 3,
|
||||||
|
dateTime = "2025/10/31 17:30",
|
||||||
|
status = TransactionStatus.PROCESSING,
|
||||||
|
statusText = "Em processamento...",
|
||||||
|
description = "Você solicitou o saque com sucesso!",
|
||||||
|
amount = "-R$ 10,0",
|
||||||
|
amountColor = R.color.red_11
|
||||||
|
),
|
||||||
|
RecordCash(
|
||||||
|
id = 4,
|
||||||
|
dateTime = "2025/10/31 17:30",
|
||||||
|
status = TransactionStatus.REDEEM,
|
||||||
|
statusText = "Resgatar",
|
||||||
|
description = "Você resgatou 4980 moedas",
|
||||||
|
amount = "+R$ 10,0",
|
||||||
|
amountColor = R.color.green_39
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
mAdapter.submitList(transactions)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
internal fun newInstance() = CashRecordFragment()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,119 @@
|
||||||
|
package com.gamedog.vididin.features.withdrawrecord.fragments
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.fragment.app.viewModels
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
|
import com.ama.core.architecture.appBase.AppViewsFragment
|
||||||
|
import com.ama.core.architecture.appBase.OnFragmentBackgroundListener
|
||||||
|
import com.ama.core.architecture.util.setStatusBarDarkFont
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
|
import com.gamedog.vididin.beans.RecordGold
|
||||||
|
import com.gamedog.vididin.beans.TransactionStatus
|
||||||
|
import com.gamedog.vididin.features.withdrawrecord.RecordCashRvAdapter
|
||||||
|
import com.gamedog.vididin.features.withdrawrecord.RecordGoldRvAdapter
|
||||||
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import kotlin.getValue
|
||||||
|
import com.vididin.real.money.game.databinding.FragmentWithdrawRecordGoldBinding as ViewBinding
|
||||||
|
import com.gamedog.vididin.features.withdrawrecord.RecordGoldUiState as UiState
|
||||||
|
import com.gamedog.vididin.features.withdrawrecord.RecordGoldViewModel as ViewModel
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@AndroidEntryPoint
|
||||||
|
class GoldRecordFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(),
|
||||||
|
OnFragmentBackgroundListener {
|
||||||
|
private lateinit var mAdapter: RecordGoldRvAdapter
|
||||||
|
override val mViewModel: ViewModel by viewModels()
|
||||||
|
override var isBackgroundBright: Boolean = true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private var isStatusBarDarkFont = false
|
||||||
|
|
||||||
|
override fun inflateViewBinding(
|
||||||
|
inflater: LayoutInflater,
|
||||||
|
container: ViewGroup?,
|
||||||
|
) = ViewBinding.inflate(inflater, container, false)
|
||||||
|
|
||||||
|
override fun ViewBinding.initWindowInsets() {
|
||||||
|
binding?.root?.let { setImmerseRootView(it) }
|
||||||
|
isStatusBarDarkFont = true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun ViewBinding.initViews() {
|
||||||
|
setupRecyclerView()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun ViewBinding.initListeners() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun ViewBinding.initObservers() {
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun ViewBinding.onUiStateCollect(uiState: UiState) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
setStatusBarDarkFont(isDarkFont = isStatusBarDarkFont)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun setupRecyclerView() {
|
||||||
|
mAdapter = RecordGoldRvAdapter()
|
||||||
|
binding?.recyclerView?.adapter = mAdapter
|
||||||
|
binding?.recyclerView?.layoutManager = LinearLayoutManager(requireContext())
|
||||||
|
|
||||||
|
// 模拟数据
|
||||||
|
val transactions = listOf(
|
||||||
|
RecordGold(
|
||||||
|
id = 1,
|
||||||
|
dateTime = "2025/10/31 17:30",
|
||||||
|
status = TransactionStatus.SUCCESS,
|
||||||
|
statusText = "Sucesso",
|
||||||
|
description = "Você solicitou o saque com sucesso!",
|
||||||
|
amount = "-R$ 0,1",
|
||||||
|
amountColor = R.color.red_11
|
||||||
|
),
|
||||||
|
RecordGold(
|
||||||
|
id = 2,
|
||||||
|
dateTime = "2025/10/31 17:30",
|
||||||
|
status = TransactionStatus.FAILED,
|
||||||
|
statusText = "Falhou",
|
||||||
|
description = "Você solicitou o saque com sucesso!",
|
||||||
|
amount = "-R$ 0,0",
|
||||||
|
amountColor = R.color.red_11
|
||||||
|
),
|
||||||
|
RecordGold(
|
||||||
|
id = 3,
|
||||||
|
dateTime = "2025/10/31 17:30",
|
||||||
|
status = TransactionStatus.PROCESSING,
|
||||||
|
statusText = "Em processamento...",
|
||||||
|
description = "Você solicitou o saque com sucesso!",
|
||||||
|
amount = "-R$ 10,0",
|
||||||
|
amountColor = R.color.red_11
|
||||||
|
),
|
||||||
|
RecordGold(
|
||||||
|
id = 4,
|
||||||
|
dateTime = "2025/10/31 17:30",
|
||||||
|
status = TransactionStatus.REDEEM,
|
||||||
|
statusText = "Resgatar",
|
||||||
|
description = "Você resgatou 4980 moedas",
|
||||||
|
amount = "+R$ 10,0",
|
||||||
|
amountColor = R.color.green_39
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
mAdapter.submitList(transactions)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
internal fun newInstance() = CashRecordFragment()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,86 +4,209 @@ import android.app.Activity
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.lifecycle.Lifecycle
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.core.view.updatePadding
|
import androidx.lifecycle.repeatOnLifecycle
|
||||||
import com.ama.core.architecture.appBase.AppViewsActivity
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
|
import com.ama.core.architecture.appBase.AppViewsEmptyViewModelActivity
|
||||||
|
import com.ama.core.architecture.util.AndroidUtil
|
||||||
|
import com.ama.core.architecture.util.CommonItemDecoration
|
||||||
|
import com.ama.core.architecture.util.SpUtil
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
import com.gamedog.vididin.R
|
import com.gamedog.vididin.VidiConst
|
||||||
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
import com.gamedog.vididin.VididinEvents
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
|
import com.gamedog.vididin.beans.ZeroBuyItem
|
||||||
|
import com.gamedog.vididin.beans.ZeroBuyResp
|
||||||
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
|
import com.gamedog.vididin.features.zero.dialogs.ZeroBuyNotWinDialog
|
||||||
|
import com.gamedog.vididin.features.zero.dialogs.ZeroBuyRulesDialog
|
||||||
|
import com.gamedog.vididin.features.zero.dialogs.ZeroBuyWinDialog
|
||||||
import com.gamedog.vididin.router.Router
|
import com.gamedog.vididin.router.Router
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import kotlin.getValue
|
import kotlinx.coroutines.launch
|
||||||
import com.gamedog.vididin.databinding.ActivityZerobuyBinding as ViewBinding
|
import com.gamedog.vididin.netbase.Result
|
||||||
import com.gamedog.vididin.main.MainUiState as UiState
|
import kotlin.collections.contains
|
||||||
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
import com.vididin.real.money.game.databinding.ActivityZerobuyBinding as ViewBinding
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class ZeroBuyActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabStyleListener {
|
class ZeroBuyActivity : AppViewsEmptyViewModelActivity<ViewBinding>() {
|
||||||
|
private val viewModel: ZeroBuyViewModel by viewModels()
|
||||||
|
private lateinit var mAdapter: ZeroItemAdapter
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
override val mViewModel: ViewModel by viewModels()
|
|
||||||
override fun inflateViewBinding(inflater: LayoutInflater) = ViewBinding.inflate(inflater)
|
override fun inflateViewBinding(inflater: LayoutInflater) = ViewBinding.inflate(inflater)
|
||||||
|
|
||||||
override fun ViewBinding.initViews() {
|
override fun ViewBinding.initViews() {
|
||||||
binding.run {
|
binding.run {
|
||||||
setOnClickBatch(tvZeroGoldNum, tvZeroLotteryList) {
|
setOnClickBatch(tvZeroGoldNum, tvZeroLotteryList, llDiamondAd) {
|
||||||
when (this) {
|
when (this) {
|
||||||
tvZeroGoldNum -> {
|
tvZeroGoldNum -> {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tvZeroLotteryList -> {
|
tvZeroLotteryList -> {
|
||||||
gotoLotteryRecords()
|
gotoLotteryRecords()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
llDiamondAd -> {
|
||||||
|
gotoEarnDiamond()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateUIDiamondNum()
|
||||||
|
|
||||||
titlebar.setTitleText(R.string.zero_buy)
|
titlebar.setTitleText(R.string.zero_buy)
|
||||||
titlebar.addRightIcon(R.mipmap.icon_question_mark, {
|
titlebar.addRightIcon(R.mipmap.icon_question_mark, {
|
||||||
showHintInfo()
|
showHintInfo()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
with(recyclerView) {
|
||||||
|
mAdapter = ZeroItemAdapter({ itemId->
|
||||||
|
requestParticipateActivity(itemId)
|
||||||
|
})
|
||||||
|
adapter = mAdapter
|
||||||
|
layoutManager = GridLayoutManager(this@ZeroBuyActivity, 2)
|
||||||
|
addItemDecoration(
|
||||||
|
CommonItemDecoration.create(horizontalSpace = 45, verticalSpace = 45)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ZeroBuyRulesDialog(this@ZeroBuyActivity).show()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
override fun ViewBinding.initWindowInsets() {
|
override fun ViewBinding.initWindowInsets() {
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(contentRoot) { v, insets ->
|
setImmerseRootView(contentRoot)
|
||||||
val systemBars =
|
|
||||||
insets.getInsets(WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout())
|
|
||||||
v.updatePadding(top = systemBars.top)
|
|
||||||
insets
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showHintInfo() {
|
private fun showHintInfo() {
|
||||||
//TODO("Not yet implemented")
|
ZeroBuyRulesDialog(this@ZeroBuyActivity).show()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.initListeners() {
|
override fun ViewBinding.initListeners() {
|
||||||
//TODO("Not yet implemented")
|
registerEvents({ data->
|
||||||
|
when (data?.mEventType) {
|
||||||
|
VididinEvents.Event_Account_Diamond_Changed -> {
|
||||||
|
updateUIDiamondNum()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, VididinEvents.Event_Account_Diamond_Changed)
|
||||||
|
|
||||||
|
requestData()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateUIDiamondNum() {
|
||||||
|
binding.tvZeroGoldNum.text = AccountManager.getAccount()?.diamondCount.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.initObservers() {
|
override fun ViewBinding.initObservers() {
|
||||||
//TODO("Not yet implemented")
|
//TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.onUiStateCollect(uiState: UiState) {
|
|
||||||
//TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onTabIsDarkFont(isDarkFont: Boolean) {
|
|
||||||
//TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private fun gotoLotteryRecords() {
|
private fun gotoLotteryRecords() {
|
||||||
Router.WinRecord.startActivity(this)
|
Router.WinRecord.startActivity(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun gotoEarnDiamond() {
|
||||||
|
Router.WatchAd.startActivity(this, VidiConst.WATCH_AD_FOR_ZERO_EARN_DIAMOND)
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------- start -----------------------------
|
||||||
|
|
||||||
|
|
||||||
|
private fun requestData() {
|
||||||
|
lifecycleScope.launch {
|
||||||
|
repeatOnLifecycle(Lifecycle.State.STARTED) {
|
||||||
|
viewModel.ZeroBuyListData.collect { result ->
|
||||||
|
when (result) {
|
||||||
|
is Result.Loading -> { showLoading(true) }
|
||||||
|
is Result.Success -> {
|
||||||
|
hideLoading()
|
||||||
|
updateUIs(result.data)
|
||||||
|
}
|
||||||
|
is Result.Error -> {
|
||||||
|
hideLoading()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
viewModel.requestZeroBuyInfo()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun requestParticipateActivity(itemId: Int) {
|
||||||
|
val joinedItemIds: List<Int> = SpUtil.instance().getList<Int>(SpUtil.KEY_ZEROBUY_JOINED_ACTIVITY_IDS)
|
||||||
|
if (!joinedItemIds.contains(AccountManager.getAccount()?.userId)) {
|
||||||
|
lifecycleScope.launch {
|
||||||
|
repeatOnLifecycle(Lifecycle.State.STARTED) {
|
||||||
|
viewModel.ZeroBuyJoinResult.collect { result ->
|
||||||
|
when (result) {
|
||||||
|
is Result.Loading -> { }
|
||||||
|
is Result.Success -> updateItemUI(result.data)
|
||||||
|
is Result.Error -> { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
viewModel.requestJoinZeroBuy(itemId)
|
||||||
|
} else {
|
||||||
|
AndroidUtil.showToast(R.string.has_joined_zerobuy)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun updateUIs(data: ZeroBuyResp) {
|
||||||
|
showCompletePurchasesInfo(data.mFinishedList)
|
||||||
|
mAdapter.submitList(data.mCurrentList)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showCompletePurchasesInfo(finishedList: List<ZeroBuyItem>?) {
|
||||||
|
finishedList?.let {
|
||||||
|
val userId = AccountManager.getAccount()?.userId
|
||||||
|
val joinedIdList = SpUtil.instance().getList<Int>(SpUtil.KEY_ZEROBUY_JOINED_ACTIVITY_IDS)
|
||||||
|
val hasNotifiedIdList: MutableList<Int> = SpUtil.instance().getList<Int>(SpUtil.KEY_ZEROBUY_HAS_NOTIFY_IDS) as MutableList<Int>
|
||||||
|
it.forEach { item->
|
||||||
|
if (joinedIdList.contains(item.id) && !hasNotifiedIdList.contains(item.id)) {
|
||||||
|
hasNotifiedIdList.add(item.id)
|
||||||
|
|
||||||
|
item.winners?.let {
|
||||||
|
if (it.contains(userId)) {
|
||||||
|
ZeroBuyWinDialog(this@ZeroBuyActivity, item).show()
|
||||||
|
} else {
|
||||||
|
ZeroBuyNotWinDialog(this@ZeroBuyActivity, item).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SpUtil.instance().putList(SpUtil.KEY_ZEROBUY_HAS_NOTIFY_IDS, hasNotifiedIdList)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateItemUI(joinedItem: ZeroBuyItem?) {
|
||||||
|
val currentList = mAdapter.currentList.toMutableList()
|
||||||
|
val indexToUpdate = currentList.indexOfFirst { it.id == joinedItem?.id }
|
||||||
|
if (indexToUpdate != -1) {
|
||||||
|
currentList.removeAt(indexToUpdate)
|
||||||
|
currentList.add(indexToUpdate, joinedItem)
|
||||||
|
mAdapter.submitList(currentList)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------- end -----------------------------
|
||||||
companion object {
|
companion object {
|
||||||
internal fun startActivity(activity: Activity) {
|
internal fun startActivity(activity: Activity) {
|
||||||
activity.startActivity(Intent(activity.applicationContext, ZeroBuyActivity::class.java))
|
activity.startActivity(Intent(activity.applicationContext, ZeroBuyActivity::class.java))
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,131 @@
|
||||||
|
package com.gamedog.vididin.features.zero
|
||||||
|
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
|
import com.ama.core.architecture.util.AndroidUtil
|
||||||
|
import com.ama.core.architecture.util.DeviceUtil
|
||||||
|
import com.ama.core.architecture.util.SpUtil
|
||||||
|
import com.gamedog.vididin.VidiConst
|
||||||
|
import com.gamedog.vididin.beans.ZeroBuyItem
|
||||||
|
import com.gamedog.vididin.beans.ZeroBuyResp
|
||||||
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
|
import com.gamedog.vididin.netbase.NetworkUtil
|
||||||
|
import com.gamedog.vididin.netbase.Result
|
||||||
|
import com.gamedog.vididin.request.RequestUtil
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
|
class ZeroBuyViewModel : ViewModel() {
|
||||||
|
private val _ZeroBuyListData = MutableStateFlow<Result<ZeroBuyResp>>(Result.Loading)
|
||||||
|
val ZeroBuyListData: StateFlow<Result<ZeroBuyResp>> = _ZeroBuyListData.asStateFlow()
|
||||||
|
|
||||||
|
private val _ZeroBuyJoinResult = MutableStateFlow<Result<ZeroBuyItem?>>(Result.Loading)
|
||||||
|
val ZeroBuyJoinResult: StateFlow<Result<ZeroBuyItem?>> = _ZeroBuyJoinResult.asStateFlow()
|
||||||
|
|
||||||
|
|
||||||
|
fun requestJoinZeroBuy(itemId: Int) {
|
||||||
|
viewModelScope.launch {
|
||||||
|
_ZeroBuyJoinResult.value = Result.Loading
|
||||||
|
|
||||||
|
val operationVal = 10
|
||||||
|
val curTimeSec = System.currentTimeMillis()/1000
|
||||||
|
val signStr = RequestUtil.getZeroBuyRequestSign(curTimeSec, operationVal)
|
||||||
|
val requestHeaders = mapOf("Operation" to operationVal.toString(), "Timestamp" to curTimeSec.toString(), "Sign" to signStr)
|
||||||
|
val requestParams: MutableMap<String, String> = mutableMapOf("AppId" to VidiConst.ZEROBUY_APPID, "DeviceId" to DeviceUtil.generateDeviceId())
|
||||||
|
val userId = AccountManager.getAccount()?.userId?: 0
|
||||||
|
if (userId > 0) {
|
||||||
|
requestParams.put("UserId", userId.toString())
|
||||||
|
}
|
||||||
|
val joinZeroBuyItemIds = SpUtil.instance().getList<Int>(SpUtil.KEY_ZEROBUY_JOINED_ACTIVITY_IDS)
|
||||||
|
/*if (joinZeroBuyItemIds.isNotEmpty()) {
|
||||||
|
requestParams.put("JoinedPurchaseIds", AndroidUtil.object2Json(joinZeroBuyItemIds))
|
||||||
|
}*/
|
||||||
|
requestParams.put("ActivityId", itemId.toString())
|
||||||
|
|
||||||
|
|
||||||
|
val result = NetworkUtil.post("${VidiConst.URL_ZERO_BUY}/anynameisok", requestHeaders, requestParams, joinZeroBuyItemIds)
|
||||||
|
when (result) {
|
||||||
|
is Result.Success -> {
|
||||||
|
val respObj = AndroidUtil.json2Object<ZeroBuyResp>(result.data.string())?.apply {
|
||||||
|
mCurrentList = AndroidUtil.json2Object<List<ZeroBuyItem>>(CurrentPurchases)
|
||||||
|
mFinishedList = AndroidUtil.json2Object<List<ZeroBuyItem>>(FinishedPurchases)
|
||||||
|
contentObj = AndroidUtil.json2Object<ZeroBuyItem>(Content)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
respObj?.contentObj?.let {
|
||||||
|
val itemId = respObj?.contentObj?.id
|
||||||
|
if ((respObj.Code == 0 || respObj.Code == 10003) && itemId != null && itemId > 0) {
|
||||||
|
val mutableJoinedIdList = if(joinZeroBuyItemIds == null) mutableListOf<Int>() else joinZeroBuyItemIds.toMutableList()
|
||||||
|
mutableJoinedIdList.add(itemId)
|
||||||
|
SpUtil.instance().putList(SpUtil.KEY_ZEROBUY_JOINED_ACTIVITY_IDS, mutableJoinedIdList)
|
||||||
|
|
||||||
|
_ZeroBuyJoinResult.value = Result.Success(respObj?.contentObj)
|
||||||
|
return@launch
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_ZeroBuyJoinResult.value = Result.Error(Throwable("empty response"))
|
||||||
|
}
|
||||||
|
is Result.Error -> {
|
||||||
|
_ZeroBuyJoinResult.value = Result.Error(result.exception, result.message)
|
||||||
|
}
|
||||||
|
else -> { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun requestZeroBuyInfo() {
|
||||||
|
viewModelScope.launch {
|
||||||
|
_ZeroBuyListData.value = Result.Loading
|
||||||
|
|
||||||
|
val operationVal = 0
|
||||||
|
val curTimeSec = System.currentTimeMillis()/1000
|
||||||
|
val signStr = RequestUtil.getZeroBuyRequestSign(curTimeSec, operationVal)
|
||||||
|
val requestHeaders = mapOf("Operation" to operationVal.toString(), "Timestamp" to curTimeSec.toString(), "Sign" to signStr)
|
||||||
|
val requestParams: MutableMap<String, String> = mutableMapOf("AppId" to VidiConst.ZEROBUY_APPID, "DeviceId" to DeviceUtil.generateDeviceId())
|
||||||
|
val userId = AccountManager.getAccount()?.userId?: 0
|
||||||
|
if (userId > 0) {
|
||||||
|
requestParams.put("UserId", userId.toString())
|
||||||
|
}
|
||||||
|
val joinZeroBuyItemIds = SpUtil.instance().getList<Int>(SpUtil.KEY_ZEROBUY_JOINED_ACTIVITY_IDS)
|
||||||
|
/*if (joinZeroBuyItemIds.isNotEmpty()) {
|
||||||
|
requestParams.put("JoinedPurchaseIds", AndroidUtil.object2Json(joinZeroBuyItemIds))
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
val result = NetworkUtil.post("${VidiConst.URL_ZERO_BUY}/anynameisok", requestHeaders, requestParams, joinZeroBuyItemIds)
|
||||||
|
when (result) {
|
||||||
|
is Result.Success -> {
|
||||||
|
val respObj = AndroidUtil.json2Object<ZeroBuyResp>(result.data.string())?.apply {
|
||||||
|
mCurrentList = AndroidUtil.json2Object<List<ZeroBuyItem>>(CurrentPurchases)
|
||||||
|
mFinishedList = AndroidUtil.json2Object<List<ZeroBuyItem>>(FinishedPurchases)
|
||||||
|
}
|
||||||
|
|
||||||
|
respObj?.UserId?.let {
|
||||||
|
if (userId <= 0) {
|
||||||
|
AccountManager.saveUserIdInfo(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO - when to record joined activity Ids
|
||||||
|
/*respObj?.Join?.let {
|
||||||
|
if (userId <= 0) {
|
||||||
|
AccountManager.saveUserIdInfo(it)
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
_ZeroBuyListData.value = Result.Success(respObj!!)
|
||||||
|
}
|
||||||
|
is Result.Error -> {
|
||||||
|
_ZeroBuyListData.value = Result.Error(result.exception, result.message)
|
||||||
|
}
|
||||||
|
else -> { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,42 +0,0 @@
|
||||||
package com.gamedog.vididin.features.zero
|
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
|
||||||
import com.ama.core.architecture.widget.BindingDialog
|
|
||||||
import com.gamedog.vididin.databinding.DialogZeroBuyWinBinding as ViewBinding
|
|
||||||
import com.gamedog.vididin.router.Router
|
|
||||||
|
|
||||||
|
|
||||||
class ZeroBuyWinDialog(context: Context) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
|
||||||
|
|
||||||
init {
|
|
||||||
build()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private fun build() {
|
|
||||||
with()
|
|
||||||
setCenter()
|
|
||||||
setMaskValue(0.8f)
|
|
||||||
setCanCancel(false)
|
|
||||||
|
|
||||||
mBinding.run {
|
|
||||||
setOnClickBatch(tvConfirm, ivClose) {
|
|
||||||
when (this) {
|
|
||||||
tvConfirm, ivClose -> {
|
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun gotoWatchVideo() {
|
|
||||||
ownerActivity?.let { Router.Withdraw.startActivity(it) }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,107 @@
|
||||||
|
package com.gamedog.vididin.features.zero
|
||||||
|
|
||||||
|
|
||||||
|
import android.os.CountDownTimer
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.core.view.isVisible
|
||||||
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
|
import androidx.recyclerview.widget.ListAdapter
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.ama.core.architecture.util.SpUtil
|
||||||
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
|
import com.gamedog.vididin.beans.ZeroBuyItem
|
||||||
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
|
import com.vididin.real.money.game.databinding.LayoutItemZerobuyBinding as ViewBinding
|
||||||
|
|
||||||
|
class ZeroItemAdapter(private val joinCallback: (itemId: Int)->Unit) : ListAdapter<ZeroBuyItem, ZeroItemAdapter.ViewHolder>(DiffCallback()) {
|
||||||
|
|
||||||
|
private val mBgResList = listOf<Int>(R.mipmap.zero_bg_item_sub1, R.mipmap.zero_bg_item_sub2, R.mipmap.zero_bg_item_sub3, R.mipmap.zero_bg_item_sub4)
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||||
|
val binding = ViewBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||||
|
return ViewHolder(binding)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
|
holder.bind(getItem(position))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getJoinedIdList(): List<Int> {
|
||||||
|
return SpUtil.instance().getList<Int>(SpUtil.KEY_ZEROBUY_JOINED_ACTIVITY_IDS)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun startCountDownTimer(targetTimeMs: Long) {
|
||||||
|
val countDownDuration = targetTimeMs - System.currentTimeMillis()
|
||||||
|
|
||||||
|
val mCountDownTimer = object : CountDownTimer(countDownDuration, 1000) {
|
||||||
|
override fun onTick(millisUntilFinished: Long) {
|
||||||
|
val joinedIds = getJoinedIdList()
|
||||||
|
|
||||||
|
currentList.forEach { item->
|
||||||
|
if (joinedIds.contains(item.id) && !item.completed) {
|
||||||
|
var remainSec = (item.end_time - System.currentTimeMillis()) / 1000
|
||||||
|
//item.mCountDownTimeStr =
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*long totalSeconds = millisUntilFinished / 1000;
|
||||||
|
long minutes = totalSeconds / 60;
|
||||||
|
long seconds = totalSeconds % 60;
|
||||||
|
String timeText = String . format ("%02d:%02d", minutes, seconds);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onFinish() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mCountDownTimer.start()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun submitList(list: List<ZeroBuyItem?>?) {
|
||||||
|
val sortedList = list?.sortedByDescending { it?.start_time }
|
||||||
|
super.submitList(sortedList)
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class ViewHolder(private val binding: ViewBinding) : RecyclerView.ViewHolder(binding.root) {
|
||||||
|
fun bind(item: ZeroBuyItem) {
|
||||||
|
binding.tvTitle.text = item.title
|
||||||
|
binding.tvJoinedNum.text = item.current_users?.size.toString()
|
||||||
|
binding.tvPeopleTotal.text = "/${item.target_num}"
|
||||||
|
binding.tvJoinGoldNum.text = item.cost.toString()
|
||||||
|
binding.ivBgType.setImageResource(mBgResList[item.image])
|
||||||
|
binding.tvRewardCashNum.text = item.price
|
||||||
|
|
||||||
|
with(binding) {
|
||||||
|
setOnClickBatch(flBottomBut) {
|
||||||
|
when (this) {
|
||||||
|
flBottomBut-> {
|
||||||
|
joinCallback(item.id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// judge state
|
||||||
|
val joinedIds = getJoinedIdList()
|
||||||
|
val hasJoined = joinedIds.contains(item.id)
|
||||||
|
val hasCompleted = item.completed
|
||||||
|
flBottomBut.isVisible = !hasJoined
|
||||||
|
tvParticipateAlready.isVisible = hasJoined
|
||||||
|
//tvRemainTime.isVisible = hasJoined && !hasCompleted
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DiffCallback : DiffUtil.ItemCallback<ZeroBuyItem>() {
|
||||||
|
override fun areItemsTheSame(oldItem: ZeroBuyItem, newItem: ZeroBuyItem): Boolean {
|
||||||
|
return oldItem.id == newItem.id
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun areContentsTheSame(oldItem: ZeroBuyItem, newItem: ZeroBuyItem): Boolean {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
package com.gamedog.vididin.features.zero
|
||||||
|
|
||||||
|
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.core.view.isVisible
|
||||||
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
|
import androidx.recyclerview.widget.ListAdapter
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.ama.core.architecture.util.ResUtil
|
||||||
|
import com.gamedog.vididin.beans.ZeroBuyItem
|
||||||
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import com.vididin.real.money.game.databinding.ZeroRecordWinBinding as ViewBinding
|
||||||
|
|
||||||
|
class ZeroRecordAdapter() : ListAdapter<ZeroBuyItem, ZeroRecordAdapter.ViewHolder>(DiffCallback()) {
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||||
|
val binding = ViewBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||||
|
return ViewHolder(binding)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
|
holder.bind(getItem(position))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun submitList(list: List<ZeroBuyItem?>?) {
|
||||||
|
val sortedList = list?.sortedByDescending { it?.start_time }
|
||||||
|
super.submitList(sortedList)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isWinItem(item: ZeroBuyItem): Boolean {
|
||||||
|
val winerIds = item.winners
|
||||||
|
return winerIds?.contains(AccountManager.getAccount()?.userId) ?: false
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class ViewHolder(private val binding: ViewBinding) : RecyclerView.ViewHolder(binding.root) {
|
||||||
|
fun bind(item: ZeroBuyItem) {
|
||||||
|
val isWinItem = isWinItem(item)
|
||||||
|
|
||||||
|
with(binding) {
|
||||||
|
tvDateWin.text = SimpleDateFormat("yyyy/MM/dd").format(item.start_time * 1000)
|
||||||
|
rlBg.setBackgroundResource(if (isWinItem) R.drawable.bg_records_win else R.drawable.bg_records_lost)
|
||||||
|
ivLeftWin.setImageResource(if (isWinItem) R.mipmap.record_win else R.mipmap.record_lost)
|
||||||
|
tvTitleWin.text = ResUtil.getString(if (isWinItem) R.string.record_win_item_title else R.string.record_lost_item_title)
|
||||||
|
tvDescWin.text = item.title
|
||||||
|
llRightWin.isVisible = isWinItem
|
||||||
|
llRightLost.isVisible = !isWinItem
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DiffCallback : DiffUtil.ItemCallback<ZeroBuyItem>() {
|
||||||
|
override fun areItemsTheSame(oldItem: ZeroBuyItem, newItem: ZeroBuyItem): Boolean {
|
||||||
|
return oldItem.id == newItem.id
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun areContentsTheSame(oldItem: ZeroBuyItem, newItem: ZeroBuyItem): Boolean {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
package com.gamedog.vididin.features.zero
|
package com.gamedog.vididin.features.zero.dialogs
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context
|
import android.app.Activity
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
import com.ama.core.architecture.widget.BindingDialog
|
import com.ama.core.architecture.widget.BindingDialog
|
||||||
import com.gamedog.vididin.databinding.DialogZeroBuyRuleBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.DialogZeroBuyFailBinding as ViewBinding
|
||||||
import com.gamedog.vididin.router.Router
|
import com.gamedog.vididin.router.Router
|
||||||
|
|
||||||
|
|
||||||
class ZeroBuyRulesDialog(context: Context) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
class ZeroBuyFailDialog(context: Activity) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
build()
|
build()
|
||||||
|
|
@ -33,7 +33,7 @@ class ZeroBuyRulesDialog(context: Context) : BindingDialog<ViewBinding>(context,
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun gotoWatchVideo() {
|
private fun gotoWatchVideo() {
|
||||||
ownerActivity?.let { Router.Withdraw.startActivity(it) }
|
Router.Withdraw.startActivity(mActivity)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,14 +1,15 @@
|
||||||
package com.gamedog.vididin.features.zero
|
package com.gamedog.vididin.features.zero.dialogs
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context
|
import android.app.Activity
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
import com.ama.core.architecture.widget.BindingDialog
|
import com.ama.core.architecture.widget.BindingDialog
|
||||||
import com.gamedog.vididin.databinding.DialogZeroBuyFailBinding as ViewBinding
|
import com.gamedog.vididin.beans.ZeroBuyItem
|
||||||
|
import com.vididin.real.money.game.databinding.DialogZeroBuyNotWinBinding as ViewBinding
|
||||||
import com.gamedog.vididin.router.Router
|
import com.gamedog.vididin.router.Router
|
||||||
|
|
||||||
|
|
||||||
class ZeroBuyFailDialog(context: Context) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
class ZeroBuyNotWinDialog(context: Activity, private val item: ZeroBuyItem) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
build()
|
build()
|
||||||
|
|
@ -22,18 +23,20 @@ class ZeroBuyFailDialog(context: Context) : BindingDialog<ViewBinding>(context,
|
||||||
setCanCancel(false)
|
setCanCancel(false)
|
||||||
|
|
||||||
mBinding.run {
|
mBinding.run {
|
||||||
setOnClickBatch(tvConfirm, ivClose) {
|
setOnClickBatch(ivClose) {
|
||||||
when (this) {
|
when (this) {
|
||||||
tvConfirm, ivClose -> {
|
ivClose -> {
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tvTitle.text = item.title
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun gotoWatchVideo() {
|
private fun gotoWatchVideo() {
|
||||||
ownerActivity?.let { Router.Withdraw.startActivity(it) }
|
Router.Withdraw.startActivity(mActivity)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
package com.gamedog.vididin.features.zero
|
package com.gamedog.vididin.features.zero.dialogs
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context
|
import android.app.Activity
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
import com.ama.core.architecture.widget.BindingDialog
|
import com.ama.core.architecture.widget.BindingDialog
|
||||||
import com.gamedog.vididin.databinding.DialogZeroBuyNotWinBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.DialogZeroBuyRuleBinding as ViewBinding
|
||||||
import com.gamedog.vididin.router.Router
|
import com.gamedog.vididin.router.Router
|
||||||
|
|
||||||
|
|
||||||
class ZeroBuyNotWinDialog(context: Context) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
class ZeroBuyRulesDialog(context: Activity) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
build()
|
build()
|
||||||
|
|
@ -33,7 +33,7 @@ class ZeroBuyNotWinDialog(context: Context) : BindingDialog<ViewBinding>(context
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun gotoWatchVideo() {
|
private fun gotoWatchVideo() {
|
||||||
ownerActivity?.let { Router.Withdraw.startActivity(it) }
|
Router.Withdraw.startActivity(mActivity)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
package com.gamedog.vididin.features.zero.dialogs
|
||||||
|
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
|
import com.ama.core.architecture.widget.BindingDialog
|
||||||
|
import com.gamedog.vididin.beans.ZeroBuyItem
|
||||||
|
import com.vididin.real.money.game.databinding.DialogZeroBuyWinBinding as ViewBinding
|
||||||
|
import com.gamedog.vididin.router.Router
|
||||||
|
|
||||||
|
|
||||||
|
class ZeroBuyWinDialog(context: Activity, private val item: ZeroBuyItem) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
||||||
|
|
||||||
|
init {
|
||||||
|
build()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun build() {
|
||||||
|
with()
|
||||||
|
setCenter()
|
||||||
|
setMaskValue(0.8f)
|
||||||
|
setCanCancel(false)
|
||||||
|
|
||||||
|
mBinding.run {
|
||||||
|
setOnClickBatch(ivClose) {
|
||||||
|
when (this) {
|
||||||
|
ivClose -> {
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tvTitle.text = item.title
|
||||||
|
tvPurchaseId.text = item.redeem_code
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -1,16 +1,34 @@
|
||||||
package com.gamedog.vididin.core.login.login
|
package com.gamedog.vididin.core.login.login
|
||||||
|
|
||||||
|
import com.ama.core.architecture.util.AndroidUtil
|
||||||
import com.ama.core.architecture.util.DateUtil
|
import com.ama.core.architecture.util.DateUtil
|
||||||
import com.ama.core.architecture.util.DeviceUtil
|
import com.ama.core.architecture.util.DeviceUtil
|
||||||
import com.ama.core.architecture.util.SpUtil
|
import com.ama.core.architecture.util.SpUtil
|
||||||
import com.ama.core.architecture.util.eventbus.NotifyMan
|
import com.ama.core.architecture.util.eventbus.NotifyMan
|
||||||
|
import com.gamedog.vididin.VidiConst
|
||||||
import com.gamedog.vididin.VididinEvents
|
import com.gamedog.vididin.VididinEvents
|
||||||
import com.gamedog.vididin.beans.Account
|
import com.gamedog.vididin.beans.Account
|
||||||
import com.gamedog.vididin.beans.BankInfo
|
import com.gamedog.vididin.beans.BankInfo
|
||||||
|
import kotlinx.coroutines.sync.Mutex
|
||||||
|
|
||||||
|
|
||||||
object AccountManager {
|
object AccountManager {
|
||||||
|
|
||||||
|
private val mutex = Mutex()
|
||||||
|
|
||||||
|
init {
|
||||||
|
NotifyMan.instance().register(object: NotifyMan.ICallback(true) {
|
||||||
|
override fun onEvent(data: NotifyMan.NotifyData<*>?) {
|
||||||
|
when (data?.mEventType) {
|
||||||
|
VididinEvents.EVENT_AD_WATCHED_FOR_ZEROBUY_EARN_DIAMOND -> {
|
||||||
|
addDiamond(VidiConst.DIAMOND_NUM_FOR_ONE_AD)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}, VididinEvents.EVENT_AD_WATCHED_FOR_ZEROBUY_EARN_DIAMOND)
|
||||||
|
}
|
||||||
|
|
||||||
private val mAccount: Account? by lazy {
|
private val mAccount: Account? by lazy {
|
||||||
var account = SpUtil.instance().getObject<Account>(SpUtil.KEY_ACCOUNT)
|
var account = SpUtil.instance().getObject<Account>(SpUtil.KEY_ACCOUNT)
|
||||||
if (account == null) {
|
if (account == null) {
|
||||||
|
|
@ -39,12 +57,21 @@ object AccountManager {
|
||||||
return mAccount?.cashCount ?: 0F
|
return mAccount?.cashCount ?: 0F
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
fun addGold(newGold: Int) {
|
fun addGold(newGold: Int) {
|
||||||
mAccount?.goldCount += newGold
|
mAccount?.goldCount += newGold
|
||||||
saveAccountInfo()
|
saveAccountInfo()
|
||||||
NotifyMan.instance().sendEvent(VididinEvents.Event_Account_Gold_Changed, null)
|
NotifyMan.instance().sendEvent(VididinEvents.Event_Account_Gold_Changed, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
|
private fun addDiamond(diamondNum: Int) {
|
||||||
|
mAccount?.diamondCount += diamondNum
|
||||||
|
saveAccountInfo()
|
||||||
|
NotifyMan.instance().sendEvent(VididinEvents.Event_Account_Diamond_Changed, null)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
fun addCash(newCash: Float) {
|
fun addCash(newCash: Float) {
|
||||||
mAccount?.cashCount += newCash
|
mAccount?.cashCount += newCash
|
||||||
saveAccountInfo()
|
saveAccountInfo()
|
||||||
|
|
@ -71,5 +98,38 @@ object AccountManager {
|
||||||
VididinEvents.Event_Account_Bank_Info_Changed, NotifyMan.NotifyData(bankAccount))
|
VididinEvents.Event_Account_Bank_Info_Changed, NotifyMan.NotifyData(bankAccount))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
|
fun convertGold2Cash(): Boolean {
|
||||||
|
try {
|
||||||
|
val couldCovertCashTotal = mAccount?.goldCount?.div(VidiConst.PER_CASH_COST_GOLD_NUM) ?: 0L
|
||||||
|
if (couldCovertCashTotal > 0) {
|
||||||
|
val costGoldNum = couldCovertCashTotal * VidiConst.PER_CASH_COST_GOLD_NUM
|
||||||
|
mAccount?.goldCount?.let {
|
||||||
|
if (it > costGoldNum) {
|
||||||
|
addGold(-1 * costGoldNum.toInt())
|
||||||
|
addCash(couldCovertCashTotal.toFloat())
|
||||||
|
AndroidUtil.showToast("Has convert $costGoldNum gold to $couldCovertCashTotal cash.")
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
AndroidUtil.showToast("You don't have enough gold.")
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
fun saveUserIdInfo(userId: Int) {
|
||||||
|
mAccount?.let {
|
||||||
|
it.userId = userId
|
||||||
|
saveAccountInfo()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import android.view.LayoutInflater
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import com.ama.core.architecture.appBase.AppViewsEmptyViewModelActivity
|
import com.ama.core.architecture.appBase.AppViewsEmptyViewModelActivity
|
||||||
import com.gamedog.vididin.databinding.VididinappFeatureLoginActivityLoginBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.VididinappFeatureLoginActivityLoginBinding as ViewBinding
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import kotlin.jvm.java
|
import kotlin.jvm.java
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,15 @@
|
||||||
package com.gamedog.vididin.main
|
package com.gamedog.vididin.main
|
||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
import com.ama.core.architecture.util.eventbus.NotifyMan
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
import com.ama.core.architecture.widget.BindingDialog
|
import com.ama.core.architecture.widget.BindingDialog
|
||||||
import com.gamedog.vididin.databinding.DialogBeginnerGiftBinding
|
import com.gamedog.vididin.VididinEvents
|
||||||
|
import com.vididin.real.money.game.databinding.DialogBeginnerGiftBinding
|
||||||
import com.gamedog.vididin.router.Router
|
import com.gamedog.vididin.router.Router
|
||||||
|
|
||||||
|
|
||||||
class BeginnerGiftDialog(context: Context) : BindingDialog<DialogBeginnerGiftBinding>(context, DialogBeginnerGiftBinding::inflate) {
|
class BeginnerGiftDialog(activity: Activity) : BindingDialog<DialogBeginnerGiftBinding>(activity, DialogBeginnerGiftBinding::inflate) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
build()
|
build()
|
||||||
|
|
@ -25,7 +26,10 @@ class BeginnerGiftDialog(context: Context) : BindingDialog<DialogBeginnerGiftBin
|
||||||
setOnClickBatch(tvAction) {
|
setOnClickBatch(tvAction) {
|
||||||
when (this) {
|
when (this) {
|
||||||
tvAction -> {
|
tvAction -> {
|
||||||
gotoWatchVideo()
|
/*if (mActivity is MainActivity) {
|
||||||
|
(mActivity as MainActivity).switchTab(1)
|
||||||
|
}
|
||||||
|
NotifyMan.instance().sendEvent(VididinEvents.EVENT_JUMP_2_FIRST_WITHDRAW, null)*/
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -34,7 +38,7 @@ class BeginnerGiftDialog(context: Context) : BindingDialog<DialogBeginnerGiftBin
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun gotoWatchVideo() {
|
private fun gotoWatchVideo() {
|
||||||
ownerActivity?.let { Router.Withdraw.startActivity(it) }
|
Router.Withdraw.startActivity(mActivity)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
package com.gamedog.vididin.main
|
package com.gamedog.vididin.main
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.IntentFilter
|
||||||
import com.ama.core.common.util.asSafe
|
import com.ama.core.common.util.asSafe
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
|
|
@ -17,13 +20,17 @@ import com.ama.core.architecture.ext.toast
|
||||||
import com.ama.core.architecture.util.bindViewPager2
|
import com.ama.core.architecture.util.bindViewPager2
|
||||||
import com.ama.core.architecture.util.setCommonNavigator
|
import com.ama.core.architecture.util.setCommonNavigator
|
||||||
import com.ama.core.architecture.util.setDataOrAdapter
|
import com.ama.core.architecture.util.setDataOrAdapter
|
||||||
import com.gamedog.vididin.R
|
import com.vididin.real.money.game.R
|
||||||
|
import com.gamedog.vididin.VidiConst
|
||||||
|
import com.gamedog.vididin.VididinEvents
|
||||||
import com.gamedog.vididin.adapter.MainTabsAdapter
|
import com.gamedog.vididin.adapter.MainTabsAdapter
|
||||||
import com.gamedog.vididin.adapter.MainViewPagerAdapter
|
import com.gamedog.vididin.adapter.MainViewPagerAdapter
|
||||||
|
import com.gamedog.vididin.main.fragments.task.DailySignSuccessDialog
|
||||||
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
||||||
|
import com.gamedog.vididin.manager.DateChangeReceiver
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import kotlin.getValue
|
import kotlin.getValue
|
||||||
import com.gamedog.vididin.databinding.ActivityMainBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.ActivityMainBinding as ViewBinding
|
||||||
import com.gamedog.vididin.main.MainUiState as UiState
|
import com.gamedog.vididin.main.MainUiState as UiState
|
||||||
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
import com.gamedog.vididin.main.MainViewModel as ViewModel
|
||||||
|
|
||||||
|
|
@ -36,6 +43,8 @@ class MainActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabS
|
||||||
override val mViewModel: ViewModel by viewModels()
|
override val mViewModel: ViewModel by viewModels()
|
||||||
private lateinit var navigatorAdapter: MainTabsAdapter
|
private lateinit var navigatorAdapter: MainTabsAdapter
|
||||||
private val fragmentStateAdapter by lazy { MainViewPagerAdapter(this) }
|
private val fragmentStateAdapter by lazy { MainViewPagerAdapter(this) }
|
||||||
|
private lateinit var mDateChangeReceiver: DateChangeReceiver
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
override fun inflateViewBinding(inflater: LayoutInflater) = ViewBinding.inflate(inflater)
|
override fun inflateViewBinding(inflater: LayoutInflater) = ViewBinding.inflate(inflater)
|
||||||
|
|
@ -54,6 +63,7 @@ class MainActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun ViewBinding.initViews() {
|
override fun ViewBinding.initViews() {
|
||||||
content.foreground.alpha = 0
|
content.foreground.alpha = 0
|
||||||
navigatorAdapter = MainTabsAdapter(
|
navigatorAdapter = MainTabsAdapter(
|
||||||
|
|
@ -71,6 +81,10 @@ class MainActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabS
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.initListeners() {
|
override fun ViewBinding.initListeners() {
|
||||||
|
mDateChangeReceiver = DateChangeReceiver()
|
||||||
|
val filter = IntentFilter(Intent.ACTION_DATE_CHANGED)
|
||||||
|
registerReceiver(mDateChangeReceiver, filter)
|
||||||
|
|
||||||
onBackPressedDispatcher.addCallback(this@MainActivity) {
|
onBackPressedDispatcher.addCallback(this@MainActivity) {
|
||||||
if (mViewModel.canBack) {
|
if (mViewModel.canBack) {
|
||||||
finish()
|
finish()
|
||||||
|
|
@ -97,6 +111,19 @@ class MainActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabS
|
||||||
onTabIsDarkFont(isBackgroundBright)
|
onTabIsDarkFont(isBackgroundBright)
|
||||||
}
|
}
|
||||||
}, false)
|
}, false)
|
||||||
|
|
||||||
|
registerEvents( { data->
|
||||||
|
when (data?.mEventType) {
|
||||||
|
VididinEvents.EVENT_AD_WATCHED_FOR_EARN_GOLD-> {
|
||||||
|
DailySignSuccessDialog(this@MainActivity).initData(VidiConst.WATCH_AD_REWARD_GOLD.toInt(), false).show()
|
||||||
|
}
|
||||||
|
|
||||||
|
VididinEvents.EVENT_JUMP_2_VIDEO-> {
|
||||||
|
switchTab(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}, VididinEvents.EVENT_AD_WATCHED_FOR_EARN_GOLD, VididinEvents.EVENT_JUMP_2_VIDEO)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.initObservers() {
|
override fun ViewBinding.initObservers() {
|
||||||
|
|
@ -114,7 +141,20 @@ class MainActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabS
|
||||||
super.onResume()
|
super.onResume()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
super.onDestroy()
|
||||||
|
unregisterReceiver(mDateChangeReceiver)
|
||||||
|
}
|
||||||
|
|
||||||
override fun onTabIsDarkFont(isDarkFont: Boolean) {
|
override fun onTabIsDarkFont(isDarkFont: Boolean) {
|
||||||
navigatorAdapter.setIsDarkFont(isDarkFont)
|
navigatorAdapter.setIsDarkFont(isDarkFont)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun switchTab(itemIndex: Int) {
|
||||||
|
binding.viewPager2.setCurrentItem(itemIndex, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -4,7 +4,7 @@ package com.gamedog.vididin.main
|
||||||
import android.util.TimeUtils
|
import android.util.TimeUtils
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.ama.core.architecture.appBase.vm.AppViewModel
|
import com.ama.core.architecture.appBase.vm.AppViewModel
|
||||||
import com.gamedog.vididin.R
|
import com.vididin.real.money.game.R
|
||||||
import com.gamedog.vididin.beans.MainTabsItem
|
import com.gamedog.vididin.beans.MainTabsItem
|
||||||
import com.gamedog.vididin.repository.MainRepository
|
import com.gamedog.vididin.repository.MainRepository
|
||||||
import com.gamedog.vididin.repository.MainTabType
|
import com.gamedog.vididin.repository.MainTabType
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,15 @@
|
||||||
package com.gamedog.vididin.main
|
package com.gamedog.vididin.main
|
||||||
|
|
||||||
import android.content.Context
|
import android.app.Activity
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
import com.ama.core.architecture.widget.BindingDialog
|
import com.ama.core.architecture.widget.BindingDialog
|
||||||
import com.gamedog.vididin.databinding.DialogWatchVideoBinding
|
import com.vididin.real.money.game.databinding.DialogWatchVideoBinding
|
||||||
import com.gamedog.vididin.main.fragments.task.RewardDetail
|
import com.gamedog.vididin.router.Router
|
||||||
|
|
||||||
|
|
||||||
class WatchVideoDialog(context: Context) : BindingDialog<DialogWatchVideoBinding>(context, DialogWatchVideoBinding::inflate) {
|
class WatchAdDialog(context: Activity, private val mWatchAdType: Int, private val mGoldNum: Int? = 0,
|
||||||
private lateinit var mDataList: List<RewardDetail>
|
private val mTaskDataJson: String? = "")
|
||||||
|
: BindingDialog<DialogWatchVideoBinding>(context, DialogWatchVideoBinding::inflate) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
build()
|
build()
|
||||||
|
|
@ -29,15 +30,17 @@ class WatchVideoDialog(context: Context) : BindingDialog<DialogWatchVideoBinding
|
||||||
}
|
}
|
||||||
flAction -> {
|
flAction -> {
|
||||||
gotoWatchVideo()
|
gotoWatchVideo()
|
||||||
dismiss()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tvGoldNum.text = "+$mGoldNum"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun gotoWatchVideo() {
|
private fun gotoWatchVideo() {
|
||||||
|
Router.WatchAd.startActivity(mActivity, mWatchAdType, mTaskDataJson)
|
||||||
|
dismiss()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -15,14 +15,19 @@ import com.ama.core.architecture.appBase.AppViewsFragment
|
||||||
import com.ama.core.architecture.appBase.OnFragmentBackgroundListener
|
import com.ama.core.architecture.appBase.OnFragmentBackgroundListener
|
||||||
import com.ama.core.architecture.util.setStatusBarDarkFont
|
import com.ama.core.architecture.util.setStatusBarDarkFont
|
||||||
import com.ama.core.common.util.asSafe
|
import com.ama.core.common.util.asSafe
|
||||||
|
import com.gamedog.vididin.VididinEvents
|
||||||
|
import com.gamedog.vididin.beans.YoutubeVideo
|
||||||
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
import com.gamedog.vididin.main.fragments.home.HomeFragmentStateAdapter
|
import com.gamedog.vididin.main.fragments.home.HomeFragmentStateAdapter
|
||||||
import com.gamedog.vididin.main.fragments.home.fragment.HomeItemFragment
|
import com.gamedog.vididin.main.fragments.home.fragment.HomeItemFragment
|
||||||
import com.gamedog.vididin.main.interfaces.OnSwitchTabListener
|
import com.gamedog.vididin.main.interfaces.OnSwitchTabListener
|
||||||
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
||||||
|
import com.gamedog.vididin.youtubestatistic.RewardConst
|
||||||
|
import com.gamedog.vididin.youtubestatistic.RewardConst.Companion.Check_Interval_MS
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlin.getValue
|
import kotlin.getValue
|
||||||
import com.gamedog.vididin.databinding.VididinappFeatureHomeFragmentHomeBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.VididinappFeatureHomeFragmentHomeBinding as ViewBinding
|
||||||
import com.gamedog.vididin.main.fragments.home.YoutubeViewModel as ViewModel
|
import com.gamedog.vididin.main.fragments.home.YoutubeViewModel as ViewModel
|
||||||
import com.gamedog.vididin.main.fragments.home.YoutubeUiState as UiState
|
import com.gamedog.vididin.main.fragments.home.YoutubeUiState as UiState
|
||||||
|
|
||||||
|
|
@ -31,6 +36,7 @@ import com.gamedog.vididin.main.fragments.home.YoutubeUiState as UiState
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class HomeFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnSwitchTabListener, OnFragmentBackgroundListener {
|
class HomeFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnSwitchTabListener, OnFragmentBackgroundListener {
|
||||||
|
|
||||||
|
private var mTotalMs: Long = 0L
|
||||||
override val mViewModel: ViewModel by viewModels()
|
override val mViewModel: ViewModel by viewModels()
|
||||||
override var isBackgroundBright: Boolean = true
|
override var isBackgroundBright: Boolean = true
|
||||||
|
|
||||||
|
|
@ -54,15 +60,35 @@ class HomeFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnSwit
|
||||||
viewPager2.setPageTransformer { _, _ -> }
|
viewPager2.setPageTransformer { _, _ -> }
|
||||||
viewPager2.offscreenPageLimit = 1
|
viewPager2.offscreenPageLimit = 1
|
||||||
viewPager2.adapter = mViewPagerAdapter
|
viewPager2.adapter = mViewPagerAdapter
|
||||||
|
|
||||||
|
registerEvents({
|
||||||
|
handleWatchTimeTick()
|
||||||
|
}, VididinEvents.Event_HOME_WATCH_Time_TICK,)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleWatchTimeTick() {
|
||||||
|
mTotalMs += Check_Interval_MS
|
||||||
|
|
||||||
|
if (mTotalMs < RewardConst.HOME_WATCH_DURATION) {
|
||||||
|
binding?.dragIconView?.setProgress(mTotalMs * 100/RewardConst.HOME_WATCH_DURATION)
|
||||||
|
} else {
|
||||||
|
mTotalMs = 0L
|
||||||
|
binding?.dragIconView?.setProgress(mTotalMs * 100/ RewardConst.HOME_WATCH_DURATION)
|
||||||
|
AccountManager.addGold(RewardConst.HOME_WATCH_REWARD_NUM)
|
||||||
|
binding?.dragIconView?.showRewardGoldAnim()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.initListeners() {
|
override fun ViewBinding.initListeners() {
|
||||||
viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
|
viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
|
||||||
override fun onPageSelected(position: Int) {
|
override fun onPageSelected(position: Int) {
|
||||||
super.onPageSelected(position)
|
super.onPageSelected(position)
|
||||||
setHomeTabStyle(mViewPagerAdapter.getFragmentByIndex(position))
|
val fragment = mViewPagerAdapter.getFragmentByIndex(position)
|
||||||
val curFragment: HomeItemFragment = mViewPagerAdapter.getFragmentByIndex(position) as HomeItemFragment
|
if (fragment != null) {
|
||||||
curFragment.loadVideo()
|
setHomeTabStyle(fragment)
|
||||||
|
val curFragment: HomeItemFragment = fragment as HomeItemFragment
|
||||||
|
curFragment.loadVideo()
|
||||||
|
}
|
||||||
|
|
||||||
// load more
|
// load more
|
||||||
if (mViewPagerAdapter.itemCount > 0 && position == mViewPagerAdapter.itemCount - 2) {
|
if (mViewPagerAdapter.itemCount > 0 && position == mViewPagerAdapter.itemCount - 2) {
|
||||||
|
|
@ -91,8 +117,21 @@ class HomeFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnSwit
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ViewBinding.onUiStateCollect(uiState: UiState) {
|
override fun ViewBinding.onUiStateCollect(uiState: UiState) {
|
||||||
|
/*val videoList = mutableListOf<YoutubeVideo>()
|
||||||
|
if (uiState.playLists == null) {
|
||||||
|
videoList.add(YoutubeVideo("TegalxCm1LA", "111", "bbbbb"))
|
||||||
|
videoList.add(YoutubeVideo("KA54UCs3E_4", "222", "bbbbb"))
|
||||||
|
videoList.add(YoutubeVideo("_bAxHM7O_9k", "333", "bbbbb"))
|
||||||
|
videoList.add(YoutubeVideo("6vAYPVTGs90", "444", "bbbbb"))
|
||||||
|
videoList.add(YoutubeVideo("bLAfi6cWcoI", "555", "bbbbb"))
|
||||||
|
videoList.add(YoutubeVideo("WX1MvqCzQ2k", "666", "bbbbb"))
|
||||||
|
videoList.add(YoutubeVideo("nkRPma2F4s4", "777", "bbbbb"))
|
||||||
|
videoList.add(YoutubeVideo("ssosMzYpQgc", "888", "bbbbb"))
|
||||||
|
videoList.add(YoutubeVideo("1sXHOCQcbwc", "999", "bbbbb"))
|
||||||
|
mViewPagerAdapter.submitList(videoList)
|
||||||
|
return
|
||||||
|
}*/
|
||||||
mViewPagerAdapter.submitList(uiState.playLists)
|
mViewPagerAdapter.submitList(uiState.playLists)
|
||||||
//viewPager2.setDataOrAdapter(uiState.playLists, 1) { mViewPagerAdapter }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ import com.ama.core.common.util.dp
|
||||||
import com.gamedog.vididin.router.Router
|
import com.gamedog.vididin.router.Router
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import kotlin.getValue
|
import kotlin.getValue
|
||||||
import com.gamedog.vididin.databinding.VididinappFeatureMineFragmentMineBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.VididinappFeatureMineFragmentMineBinding as ViewBinding
|
||||||
import com.gamedog.vididin.main.fragments.mine.MineUiState as UiState
|
import com.gamedog.vididin.main.fragments.mine.MineUiState as UiState
|
||||||
import com.gamedog.vididin.main.fragments.mine.MineViewModel as ViewModel
|
import com.gamedog.vididin.main.fragments.mine.MineViewModel as ViewModel
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
package com.gamedog.vididin.main.fragments
|
package com.gamedog.vididin.main.fragments
|
||||||
|
|
||||||
|
import android.Manifest
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import android.widget.LinearLayout
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import androidx.core.view.updatePadding
|
import androidx.core.view.updatePadding
|
||||||
|
|
@ -9,23 +12,32 @@ import androidx.fragment.app.viewModels
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import com.ama.core.architecture.appBase.AppViewsFragment
|
import com.ama.core.architecture.appBase.AppViewsFragment
|
||||||
import com.ama.core.architecture.appBase.OnFragmentBackgroundListener
|
import com.ama.core.architecture.appBase.OnFragmentBackgroundListener
|
||||||
|
import com.ama.core.architecture.util.AndroidUtil
|
||||||
import com.ama.core.architecture.util.ResUtil
|
import com.ama.core.architecture.util.ResUtil
|
||||||
import com.ama.core.architecture.util.eventbus.NotifyMan
|
import com.ama.core.architecture.util.eventbus.NotifyMan
|
||||||
|
import com.ama.core.architecture.util.permission.PermissionUtil
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
import com.ama.core.architecture.util.setStatusBarDarkFont
|
import com.ama.core.architecture.util.setStatusBarDarkFont
|
||||||
import com.gamedog.vididin.R
|
import com.vididin.real.money.game.R
|
||||||
|
import com.gamedog.vididin.VidiConst
|
||||||
import com.gamedog.vididin.VididinEvents
|
import com.gamedog.vididin.VididinEvents
|
||||||
import com.gamedog.vididin.core.login.login.AccountManager
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
import com.gamedog.vididin.main.WatchVideoDialog
|
import com.gamedog.vididin.main.MainActivity
|
||||||
|
import com.gamedog.vididin.main.WatchAdDialog
|
||||||
import com.gamedog.vididin.main.fragments.task.DailySignDialog
|
import com.gamedog.vididin.main.fragments.task.DailySignDialog
|
||||||
|
import com.gamedog.vididin.main.fragments.task.DailySignSuccessDialog
|
||||||
import com.gamedog.vididin.main.fragments.task.TaskBean
|
import com.gamedog.vididin.main.fragments.task.TaskBean
|
||||||
|
import com.gamedog.vididin.main.fragments.task.widget.DailyTaskItemView
|
||||||
import com.gamedog.vididin.main.interfaces.OnTabClickAgainListener
|
import com.gamedog.vididin.main.interfaces.OnTabClickAgainListener
|
||||||
import com.gamedog.vididin.manager.TaskManager
|
import com.gamedog.vididin.manager.TaskManager
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.BaseTaskState.Companion.STATE_FINISH
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.BaseTaskState.Companion.STATE_ONGOING
|
||||||
import com.gamedog.vididin.router.Router
|
import com.gamedog.vididin.router.Router
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import kotlinx.coroutines.Runnable
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlin.getValue
|
import kotlin.getValue
|
||||||
import com.gamedog.vididin.databinding.VididinappFeatureMessageFragmentMessageBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.VididinappFeatureMessageFragmentMessageBinding as ViewBinding
|
||||||
import com.gamedog.vididin.main.fragments.home.YoutubeViewModel as ViewModel
|
import com.gamedog.vididin.main.fragments.home.YoutubeViewModel as ViewModel
|
||||||
import com.gamedog.vididin.main.fragments.home.YoutubeUiState as UiState
|
import com.gamedog.vididin.main.fragments.home.YoutubeUiState as UiState
|
||||||
|
|
||||||
|
|
@ -34,10 +46,14 @@ import com.gamedog.vididin.main.fragments.home.YoutubeUiState as UiState
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class TasksFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnTabClickAgainListener, OnFragmentBackgroundListener {
|
class TasksFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnTabClickAgainListener, OnFragmentBackgroundListener {
|
||||||
|
|
||||||
|
|
||||||
private var mTaskConfig: TaskBean? = null
|
private var mTaskConfig: TaskBean? = null
|
||||||
override val mViewModel: ViewModel by viewModels()
|
override val mViewModel: ViewModel by viewModels()
|
||||||
override var isBackgroundBright: Boolean = true
|
override var isBackgroundBright: Boolean = true
|
||||||
|
|
||||||
|
private val mDailyWatchVideoViewList = mutableListOf<DailyTaskItemView>()
|
||||||
|
private val mDailyWatchAdViewList = mutableListOf<DailyTaskItemView>()
|
||||||
|
|
||||||
|
|
||||||
override fun inflateViewBinding(
|
override fun inflateViewBinding(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
|
|
@ -56,30 +72,31 @@ class TasksFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnTab
|
||||||
|
|
||||||
override fun ViewBinding.initViews() {
|
override fun ViewBinding.initViews() {
|
||||||
with(binding) {
|
with(binding) {
|
||||||
setOnClickBatch(ivGotoDailySign, llTaskBenefit, llTaskWatchVideo, llTaskGame, llTaskZerobuy, tvWatchVideo, tvWithdraw) {
|
setOnClickBatch(ivGotoDailySign, llTaskBenefit, llTaskWatchAd, llTaskGame,
|
||||||
|
llTaskZerobuy, tvWatchVideoForConvertGoldToCash, tvWithdraw) {
|
||||||
when(this) {
|
when(this) {
|
||||||
ivGotoDailySign->{
|
ivGotoDailySign->{
|
||||||
DailySignDialog(context).show()
|
DailySignDialog(requireActivity()).show()
|
||||||
}
|
}
|
||||||
|
|
||||||
llTaskBenefit->{
|
llTaskBenefit->{
|
||||||
Router.Benefit.startActivity(requireActivity())
|
Router.Benefit.startActivity(requireActivity())
|
||||||
}
|
}
|
||||||
|
|
||||||
llTaskWatchVideo->{
|
llTaskWatchAd->{
|
||||||
WatchVideoDialog(requireContext()).show()
|
WatchAdDialog(requireActivity(), VidiConst.WATCH_AD_FOR_DAILY_EARN_GOLD, 200).show()
|
||||||
}
|
}
|
||||||
|
|
||||||
llTaskGame->{
|
llTaskGame->{
|
||||||
|
AndroidUtil.openUrl(VidiConst.URL_GAME)
|
||||||
}
|
}
|
||||||
|
|
||||||
llTaskZerobuy->{
|
llTaskZerobuy->{
|
||||||
Router.ZeroBuy.startActivity(requireActivity())
|
Router.ZeroBuy.startActivity(requireActivity())
|
||||||
}
|
}
|
||||||
|
|
||||||
tvWatchVideo->{
|
tvWatchVideoForConvertGoldToCash->{
|
||||||
WatchVideoDialog(requireContext()).show()
|
WatchAdDialog(requireActivity(), VidiConst.WATCH_AD_FOR_CONVERT_GOLD_2_CASH, null).show()
|
||||||
}
|
}
|
||||||
|
|
||||||
tvWithdraw->{
|
tvWithdraw->{
|
||||||
|
|
@ -90,51 +107,30 @@ class TasksFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnTab
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
beginnerTaskWithdraw.initUI(R.mipmap.icon_cash_s, R.string.beginner_withdraw_title, R.string.beginner_withdraw_desc,R.string.resgatar)
|
with(beginnerTaskWithdraw) {
|
||||||
beginnerTaskWithdraw.setRewardIcon(R.mipmap.icon_cash_s)
|
initUI(R.mipmap.icon_cash_s, R.string.beginner_withdraw_title, R.string.resgatar)
|
||||||
beginnerTaskWithdraw.setRewardTextStyle(21, R.color.green_39)
|
//setRewardTextStyle(21, R.color.green_39)
|
||||||
beginnerTaskWithdraw.setActionFun {
|
updateNewBieFirstWithdrawUI()
|
||||||
gotoWithDraw()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
beginnerTaskDiscord.initUI(R.mipmap.icon_dicord, R.string.beginner_discord_title, R.string.beginner_discord_desc,R.string.resgatar)
|
|
||||||
beginnerTaskDiscord.setActionFun {
|
with(beginnerTaskDiscord) {
|
||||||
gotoDiscord()
|
initUI(R.mipmap.icon_dicord, R.string.beginner_discord_title,R.string.resgatar)
|
||||||
|
updateNewBieDiscordUI()
|
||||||
}
|
}
|
||||||
|
|
||||||
beginnerTaskEnableNotify.initUI(R.mipmap.icon_notify, R.string.beginner_notify_title, R.string.beginner_notify_desc,R.string.Resgatado)
|
with(beginnerTaskEnableNotify) {
|
||||||
beginnerTaskEnableNotify.setActionFun {
|
initUI(R.mipmap.icon_notify, R.string.beginner_notify_title,R.string.Resgatado)
|
||||||
gotoNotification()
|
updateNewBieNotifyUI()
|
||||||
}
|
}
|
||||||
|
|
||||||
dailyTaskWatch1.initUI(R.mipmap.icon_video_task, R.string.daily_video_task_title, 1, R.string.resgatar)
|
|
||||||
dailyTaskWatch1.setActionFun {
|
|
||||||
gotoWithVideo()
|
|
||||||
}
|
|
||||||
|
|
||||||
dailyTaskWatch5.initUI(R.mipmap.icon_video_task, R.string.daily_video_task_title, 5, R.string.go_and_do)
|
|
||||||
dailyTaskWatch5.setActionFun {
|
|
||||||
gotoWithVideo()
|
|
||||||
}
|
|
||||||
|
|
||||||
dailyTaskWatch10.initUI(R.mipmap.icon_video_task, R.string.daily_video_task_title, 10, R.string.go_and_do)
|
|
||||||
dailyTaskWatch10.setActionFun {
|
|
||||||
gotoWithVideo()
|
|
||||||
}
|
|
||||||
|
|
||||||
dailyTaskWatch20.initUI(R.mipmap.icon_video_task, R.string.daily_video_task_title, 20, R.string.go_and_do)
|
|
||||||
dailyTaskWatch20.setActionFun {
|
|
||||||
gotoWithVideo()
|
|
||||||
}
|
|
||||||
|
|
||||||
dailyTaskWatch30.initUI(R.mipmap.icon_video_task, R.string.daily_video_task_title, 30, R.string.go_and_do)
|
|
||||||
dailyTaskWatch30.setActionFun {
|
|
||||||
gotoWithVideo()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
addDailySubTasks()
|
||||||
|
|
||||||
updateUIGoldTotal()
|
updateUIGoldTotal()
|
||||||
updateUICashTotal()
|
updateUICashTotal()
|
||||||
|
updateDailyWatchVideoUI()
|
||||||
|
updateDailyWatchAdUI()
|
||||||
}
|
}
|
||||||
|
|
||||||
lifecycleScope.launch {
|
lifecycleScope.launch {
|
||||||
|
|
@ -142,6 +138,60 @@ class TasksFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnTab
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun addDailySubTasks() {
|
||||||
|
//1. 阶梯广告
|
||||||
|
val dailyWatchAdTask = TaskManager.instance().getDailyAdTask()
|
||||||
|
if (dailyWatchAdTask != null && dailyWatchAdTask.status == "active"
|
||||||
|
&& dailyWatchAdTask.reward_details.isNotEmpty()) {
|
||||||
|
|
||||||
|
dailyWatchAdTask.reward_details.forEachIndexed { index, detail ->
|
||||||
|
val watchTaskItemView = DailyTaskItemView(requireActivity())
|
||||||
|
watchTaskItemView.setActionFun {
|
||||||
|
handleDailyAdButClicked(index)
|
||||||
|
}
|
||||||
|
mDailyWatchAdViewList.add(watchTaskItemView)
|
||||||
|
|
||||||
|
binding?.dailyTasksContainer!!.run {
|
||||||
|
watchTaskItemView.initUI(R.mipmap.icon_ad, R.string.daily_ad_task_title,
|
||||||
|
detail.target_count, detail.value)
|
||||||
|
|
||||||
|
addView(watchTaskItemView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)
|
||||||
|
if (true) {
|
||||||
|
val separateLine = View(requireActivity())
|
||||||
|
separateLine.setBackgroundResource(R.color.gray_f2)
|
||||||
|
addView(separateLine, LinearLayout.LayoutParams.MATCH_PARENT, ResUtil.getPixelSize(R.dimen.dp1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//2. 阶梯视频
|
||||||
|
val dailyWatchVideoTask = TaskManager.instance().getDailyVideoTask()
|
||||||
|
if (dailyWatchVideoTask != null && dailyWatchVideoTask.status == "active"
|
||||||
|
&& dailyWatchVideoTask.reward_details.isNotEmpty()) {
|
||||||
|
|
||||||
|
dailyWatchVideoTask.reward_details.forEachIndexed {index, detail ->
|
||||||
|
val watchTaskItemView = DailyTaskItemView(requireActivity())
|
||||||
|
watchTaskItemView.setActionFun {
|
||||||
|
handleDailyVideoButClicked(index)
|
||||||
|
}
|
||||||
|
mDailyWatchVideoViewList.add(watchTaskItemView)
|
||||||
|
|
||||||
|
binding?.dailyTasksContainer!!.run {
|
||||||
|
watchTaskItemView.initUI(R.mipmap.icon_video_task, R.string.daily_video_task_title,
|
||||||
|
detail.target_count, detail.value)
|
||||||
|
|
||||||
|
addView(watchTaskItemView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)
|
||||||
|
if (index != dailyWatchVideoTask.reward_details.size - 1) {
|
||||||
|
val separateLine = View(requireActivity())
|
||||||
|
separateLine.setBackgroundResource(R.color.gray_f2)
|
||||||
|
addView(separateLine, LinearLayout.LayoutParams.MATCH_PARENT, ResUtil.getPixelSize(R.dimen.dp1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun updateUICashTotal() {
|
private fun updateUICashTotal() {
|
||||||
binding?.tvCashTotal?.text = buildString {
|
binding?.tvCashTotal?.text = buildString {
|
||||||
append(ResUtil.getString(R.string.cash))
|
append(ResUtil.getString(R.string.cash))
|
||||||
|
|
@ -150,6 +200,22 @@ class TasksFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnTab
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun updateDailyWatchVideoUI() {
|
||||||
|
val statusBean = TaskManager.instance().dailyWatchVideoStatus().getStatusBean()
|
||||||
|
val subTaskStatusList = statusBean.getSubTaskRewardState()
|
||||||
|
mDailyWatchVideoViewList.forEachIndexed { index, view ->
|
||||||
|
view.updateProgress(statusBean.getTodayWatchedCount(), subTaskStatusList[index].state)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateDailyWatchAdUI() {
|
||||||
|
val statusBean = TaskManager.instance().dailyWatchAdStatus().getStatusBean()
|
||||||
|
val subTaskStatusList = statusBean.getSubTaskRewardState()
|
||||||
|
mDailyWatchAdViewList.forEachIndexed { index, view ->
|
||||||
|
view.updateProgress(statusBean.getTodayWatchedCount(), subTaskStatusList[index].state)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun updateUIGoldTotal() {
|
private fun updateUIGoldTotal() {
|
||||||
binding?.tvGoldTotal?.text = AccountManager.getGold().toString()
|
binding?.tvGoldTotal?.text = AccountManager.getGold().toString()
|
||||||
}
|
}
|
||||||
|
|
@ -168,12 +234,49 @@ class TasksFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnTab
|
||||||
VididinEvents.Event_Account_Cash_Changed -> {
|
VididinEvents.Event_Account_Cash_Changed -> {
|
||||||
updateUICashTotal()
|
updateUICashTotal()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VididinEvents.EVENT_DAILY_WATCHED_VIDEO_NUM_CHANGED -> {
|
||||||
|
updateDailyWatchVideoUI()
|
||||||
|
}
|
||||||
|
|
||||||
|
VididinEvents.EVENT_DAILY_WATCHED_AD_NUM_CHANGED -> {
|
||||||
|
updateDailyWatchAdUI()
|
||||||
|
}
|
||||||
|
|
||||||
|
VididinEvents.EVENT_JUMP_2_FIRST_WITHDRAW -> {
|
||||||
|
binding?.newbieContainer?.postDelayed(object : Runnable {
|
||||||
|
override fun run() {
|
||||||
|
scroll2FirstWithdraw()
|
||||||
|
}
|
||||||
|
},1000)
|
||||||
|
}
|
||||||
|
|
||||||
|
VididinEvents.EVENT_NEWBIE_DISCORD_TASK_CHANGED -> {
|
||||||
|
updateNewBieDiscordUI()
|
||||||
|
}
|
||||||
|
|
||||||
|
VididinEvents.EVENT_NEWBIE_NOTIFY_TASK_CHANGED -> {
|
||||||
|
updateNewBieNotifyUI()
|
||||||
|
}
|
||||||
|
|
||||||
|
VididinEvents.EVENT_NEWBIE_FIRST_WITHDRAW_TASK_CHANGED -> {
|
||||||
|
updateNewBieFirstWithdrawUI()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}, VididinEvents.Event_Sign_State_Changed, VididinEvents.Event_Account_Cash_Changed, VididinEvents.Event_Account_Gold_Changed)
|
}, VididinEvents.Event_Sign_State_Changed, VididinEvents.Event_Account_Cash_Changed,
|
||||||
|
VididinEvents.Event_Account_Gold_Changed, VididinEvents.EVENT_DAILY_WATCHED_VIDEO_NUM_CHANGED,
|
||||||
|
VididinEvents.EVENT_DAILY_WATCHED_AD_NUM_CHANGED, VididinEvents.EVENT_JUMP_2_FIRST_WITHDRAW,
|
||||||
|
VididinEvents.EVENT_NEWBIE_DISCORD_TASK_CHANGED, VididinEvents.EVENT_NEWBIE_NOTIFY_TASK_CHANGED,
|
||||||
|
VididinEvents.EVENT_NEWBIE_FIRST_WITHDRAW_TASK_CHANGED,)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun scroll2FirstWithdraw() {
|
||||||
|
binding?.newbieContainer?.let { binding?.scrollView?.scroll2ChildView(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateDailySignButUI() {
|
private fun updateDailySignButUI() {
|
||||||
val hasFinishAllSignWork = TaskManager.instance().isDailySignAllOperationDone()
|
val hasFinishAllSignWork = TaskManager.instance().dailySignStatus().isDailySignAllOperationDone()
|
||||||
|
|
||||||
binding?.ivGotoDailySign?.apply {
|
binding?.ivGotoDailySign?.apply {
|
||||||
setText(
|
setText(
|
||||||
|
|
@ -187,6 +290,58 @@ class TasksFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnTab
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun updateNewBieFirstWithdrawUI() {
|
||||||
|
with(binding?.beginnerTaskWithdraw!!) {
|
||||||
|
setActionFun {
|
||||||
|
gotoWithDraw()
|
||||||
|
}
|
||||||
|
val stateBean = TaskManager.instance().newbieFirstWithdrawStatus().getStatusBean()
|
||||||
|
setTaskStateInfo(
|
||||||
|
stateBean.rewardGoldNum.toString(),
|
||||||
|
if (stateBean.hasClaimReward) R.string.finished else R.string.go_and_do,
|
||||||
|
ResUtil.getString(R.string.beginner_withdraw_desc),
|
||||||
|
stateBean.hasClaimReward
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateNewBieDiscordUI() {
|
||||||
|
with(binding?.beginnerTaskDiscord!!) {
|
||||||
|
setActionFun {
|
||||||
|
gotoDiscord()
|
||||||
|
}
|
||||||
|
val stateBean = TaskManager.instance().newbieJoinDiscordStatus().getStatusBean()
|
||||||
|
setTaskStateInfo(
|
||||||
|
stateBean.rewardGoldNum.toString(),
|
||||||
|
if (stateBean.hasClaimReward) R.string.finished else R.string.go_and_do,
|
||||||
|
String.format(ResUtil.getString(R.string.beginner_discord_desc), stateBean.rewardGoldNum),
|
||||||
|
stateBean.hasClaimReward
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateNewBieNotifyUI() {
|
||||||
|
with(binding?.beginnerTaskEnableNotify!!) {
|
||||||
|
val isNotifyEnable = AndroidUtil.isNotificationEnabled()
|
||||||
|
val stateBean = TaskManager.instance().newbieEnableNotifyStatus().getStatusBean()
|
||||||
|
setActionFun {
|
||||||
|
if (!isNotifyEnable) {
|
||||||
|
gotoNotification()
|
||||||
|
} else {
|
||||||
|
if (TaskManager.instance().newbieEnableNotifyStatus().claimReward()) {
|
||||||
|
DailySignSuccessDialog(requireActivity()).initData(stateBean.rewardGoldNum, false).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val actionButRes = if (stateBean.hasClaimReward) R.string.Resgatado else (if (isNotifyEnable) R.string.resgatar else R.string.go_and_do)
|
||||||
|
setTaskStateInfo(stateBean.rewardGoldNum.toString(), actionButRes,
|
||||||
|
String.format(ResUtil.getString(R.string.beginner_notify_desc), stateBean.rewardGoldNum), stateBean.hasClaimReward)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
override fun ViewBinding.initObservers() {
|
override fun ViewBinding.initObservers() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -211,15 +366,59 @@ class TasksFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnTab
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun gotoDiscord() {
|
private fun gotoDiscord() {
|
||||||
//TODO("Not yet implemented")
|
AndroidUtil.openUrl(VidiConst.URL_DISCORD)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun gotoNotification() {
|
private fun gotoNotification() {
|
||||||
//TODO("Not yet implemented")
|
PermissionUtil.checkPermission(Manifest.permission.POST_NOTIFICATIONS, object : PermissionUtil.ICallback() {
|
||||||
|
override fun onAllGranted() {
|
||||||
|
AndroidUtil.openAppNotifySettings()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPartialGranted() {
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onAllRejected() {
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun gotoWithVideo() {
|
|
||||||
//TODO("Not yet implemented")
|
private fun handleDailyVideoButClicked(itemIndex: Int) {
|
||||||
|
val subTaskList = TaskManager.instance().dailyWatchVideoStatus().getStatusBean().getSubTaskRewardState()
|
||||||
|
if (itemIndex >= 0 && itemIndex < subTaskList.size) {
|
||||||
|
val subTaskState = subTaskList[itemIndex]
|
||||||
|
when (subTaskState.state) {
|
||||||
|
STATE_ONGOING -> {
|
||||||
|
val activity = requireActivity()
|
||||||
|
if (activity is MainActivity) {
|
||||||
|
activity.switchTab(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
STATE_FINISH -> {
|
||||||
|
if (TaskManager.instance().dailyWatchVideoStatus().claimSubTaskReward(itemIndex)) {
|
||||||
|
DailySignSuccessDialog(requireActivity()).initData(subTaskState.mRewardNum, false).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleDailyAdButClicked(itemIndex: Int) {
|
||||||
|
val subTaskList = TaskManager.instance().dailyWatchAdStatus().getStatusBean().getSubTaskRewardState()
|
||||||
|
if (itemIndex >= 0 && itemIndex < subTaskList.size) {
|
||||||
|
val subTaskState = subTaskList[itemIndex]
|
||||||
|
when (subTaskState.state) {
|
||||||
|
STATE_ONGOING -> {
|
||||||
|
WatchAdDialog(requireActivity(), VidiConst.WATCH_AD_FOR_DAILY_WATCH_AD, null).show()
|
||||||
|
}
|
||||||
|
STATE_FINISH -> {
|
||||||
|
if (TaskManager.instance().dailyWatchAdStatus().claimSubTaskReward(itemIndex)) {
|
||||||
|
DailySignSuccessDialog(requireActivity()).initData(subTaskState.mRewardNum, false).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,6 @@ class DefaultYoutubeDatasource @Inject constructor(retrofit: Retrofit) : Youtube
|
||||||
override suspend fun getChannels(
|
override suspend fun getChannels(
|
||||||
) = shopApi.getChannelList()
|
) = shopApi.getChannelList()
|
||||||
|
|
||||||
override suspend fun getVideoList(pageToken: String?) = shopApi.getVideoList(pageToken = pageToken)
|
override suspend fun getVideoList(lastVideoId: String?) = shopApi.getVideoList(video = lastVideoId)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -20,7 +20,7 @@ class DefaultYoutubeRepository @Inject constructor(
|
||||||
page: Int,
|
page: Int,
|
||||||
size: Int
|
size: Int
|
||||||
): ResYoutubePlayList {
|
): ResYoutubePlayList {
|
||||||
return network.getVideoList(mRespPlayList?.nextPageToken)
|
return network.getVideoList(mRespPlayList?.videos?.last()?.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun getChannelList(
|
override suspend fun getChannelList(
|
||||||
|
|
@ -35,7 +35,7 @@ class DefaultYoutubeRepository @Inject constructor(
|
||||||
pageSize: Int
|
pageSize: Int
|
||||||
): List<YoutubeVideo>? {
|
): List<YoutubeVideo>? {
|
||||||
mRespPlayList = getVideoList(key, pageSize)
|
mRespPlayList = getVideoList(key, pageSize)
|
||||||
return mRespPlayList?.items
|
return mRespPlayList?.videos
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
package com.gamedog.vididin.main.fragments.home.fragment
|
package com.gamedog.vididin.main.fragments.home.fragment
|
||||||
|
|
||||||
|
|
||||||
|
import android.graphics.Bitmap
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.view.Gravity
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
|
@ -9,31 +11,39 @@ import android.view.animation.AlphaAnimation
|
||||||
import android.view.animation.Animation
|
import android.view.animation.Animation
|
||||||
import android.view.animation.AnimationSet
|
import android.view.animation.AnimationSet
|
||||||
import android.view.animation.ScaleAnimation
|
import android.view.animation.ScaleAnimation
|
||||||
|
import android.widget.FrameLayout
|
||||||
import androidx.annotation.NonNull
|
import androidx.annotation.NonNull
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import com.ama.core.architecture.appBase.AppViewsEmptyViewModelFragment
|
import com.ama.core.architecture.appBase.AppViewsEmptyViewModelFragment
|
||||||
|
import com.ama.core.architecture.util.AndroidUtil
|
||||||
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
import com.ama.core.common.widget.PopMenuIconView
|
import com.ama.core.common.widget.PopMenuIconView
|
||||||
import com.gamedog.vididin.R
|
import com.vididin.real.money.game.R
|
||||||
|
import com.gamedog.vididin.VidiConst
|
||||||
|
import com.gamedog.vididin.VididinEvents
|
||||||
import com.gamedog.vididin.beans.YoutubeVideo
|
import com.gamedog.vididin.beans.YoutubeVideo
|
||||||
import com.gamedog.vididin.main.WatchVideoDialog
|
import com.gamedog.vididin.main.WatchAdDialog
|
||||||
import com.gamedog.vididin.router.Router
|
import com.gamedog.vididin.router.Router
|
||||||
import com.gamedog.vididin.widget.MyPlayerControlView
|
import com.gamedog.vididin.widget.MyPlayerControlView
|
||||||
|
import com.gamedog.vididin.youtubestatistic.TickerTimer
|
||||||
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.PlayerConstants
|
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.PlayerConstants
|
||||||
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.YouTubePlayer
|
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.YouTubePlayer
|
||||||
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.AbstractYouTubePlayerListener
|
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.AbstractYouTubePlayerListener
|
||||||
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.utils.loadOrCueVideo
|
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.utils.loadOrCueVideo
|
||||||
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.views.YouTubePlayerView
|
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.views.YouTubePlayerView
|
||||||
import com.gamedog.vididin.databinding.VididinappFeatureHomeItemLayoutBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.VididinappFeatureHomeItemLayoutBinding as ViewBinding
|
||||||
|
|
||||||
|
|
||||||
class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
|
class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
|
||||||
|
private var mMaskBitmap: Bitmap? = null
|
||||||
private var mPlayerView: YouTubePlayerView? = null
|
private var mPlayerView: YouTubePlayerView? = null
|
||||||
private var mIsStared = false
|
|
||||||
private var mPlayer: YouTubePlayer? = null
|
private var mPlayer: YouTubePlayer? = null
|
||||||
private var mVideoData: YoutubeVideo? = null
|
private var mVideoData: YoutubeVideo? = null
|
||||||
private var mIsPlaying: Boolean = false
|
private var mIsPlaying: Boolean = false
|
||||||
|
private var mIsIntroExpand: Boolean = false
|
||||||
private var mCurPlayedSecond: Float = 0F
|
private var mCurPlayedSecond: Float = 0F
|
||||||
private var mTotalDuration: Float = -1F
|
private var mTotalDuration: Float = 0F
|
||||||
|
private val mTickerTimer = TickerTimer()
|
||||||
|
|
||||||
|
|
||||||
override fun inflateViewBinding(
|
override fun inflateViewBinding(
|
||||||
|
|
@ -43,16 +53,14 @@ class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
|
||||||
|
|
||||||
|
|
||||||
override fun ViewBinding.initViews() {
|
override fun ViewBinding.initViews() {
|
||||||
maskView.setOnClickListener {
|
|
||||||
if (mIsPlaying) mPlayer?.pause() else mPlayer?.play()
|
|
||||||
}
|
|
||||||
|
|
||||||
playIcon.setOnClickListener {
|
playIcon.setOnClickListener {
|
||||||
if (mIsPlaying) mPlayer?.pause() else mPlayer?.play()
|
if (mIsPlaying) mPlayer?.pause() else mPlayer?.play()
|
||||||
}
|
}
|
||||||
|
|
||||||
tvVideoFrom.text = mVideoData?.snippet?.localized?.title
|
tvVideoFrom.text = mVideoData?.channel_title
|
||||||
tvVideoIntro.text = mVideoData?.snippet?.localized?.description
|
tvVideoIntro.text = mVideoData?.description
|
||||||
|
ivIntroExpand.isVisible = tvVideoIntro.lineCount > 2
|
||||||
|
|
||||||
|
|
||||||
popMenu.setMenuList(
|
popMenu.setMenuList(
|
||||||
mutableListOf(
|
mutableListOf(
|
||||||
|
|
@ -60,23 +68,35 @@ class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
|
||||||
Router.Benefit.startActivity(requireActivity())
|
Router.Benefit.startActivity(requireActivity())
|
||||||
},
|
},
|
||||||
PopMenuIconView.MenuItem(R.mipmap.home_menu_2) {
|
PopMenuIconView.MenuItem(R.mipmap.home_menu_2) {
|
||||||
WatchVideoDialog(requireContext()).show()
|
WatchAdDialog(requireActivity(), VidiConst.WATCH_AD_FOR_DAILY_EARN_GOLD, null).show()
|
||||||
},
|
},
|
||||||
PopMenuIconView.MenuItem(R.mipmap.home_menu_3) {
|
PopMenuIconView.MenuItem(R.mipmap.home_menu_3) {
|
||||||
|
AndroidUtil.openUrl(VidiConst.URL_GAME)
|
||||||
},
|
},
|
||||||
PopMenuIconView.MenuItem(R.mipmap.home_menu_4) {
|
PopMenuIconView.MenuItem(R.mipmap.home_menu_4) {
|
||||||
Router.Benefit.startActivity(requireActivity())
|
Router.ZeroBuy.startActivity(requireActivity())
|
||||||
}
|
}
|
||||||
))
|
))
|
||||||
|
|
||||||
|
setOnClickBatch(ivIntroExpand, clickMaskView) {
|
||||||
|
when (this) {
|
||||||
|
clickMaskView -> {
|
||||||
|
if (mIsPlaying) mPlayer?.pause() else mPlayer?.play()
|
||||||
|
}
|
||||||
|
|
||||||
|
ivIntroExpand -> {
|
||||||
|
mIsIntroExpand = !mIsIntroExpand
|
||||||
|
tvVideoIntro.maxLines = if (mIsIntroExpand) 8 else 2
|
||||||
|
ivIntroExpand.setImageResource(if (mIsIntroExpand) R.mipmap.arrow_down else R.mipmap.arrow_up)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun ViewBinding.initListeners() {
|
override fun ViewBinding.initListeners() {
|
||||||
ivStar.setOnClickListener {
|
|
||||||
mIsStared = !mIsStared
|
|
||||||
ivStar.setImageResource(if (mIsStared) R.mipmap.home_star else R.mipmap.home_star_undo)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -84,13 +104,35 @@ class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
super.onDestroy()
|
||||||
|
mMaskBitmap?.recycle()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun playVideo() {
|
||||||
|
if (mPlayer != null && mVideoData != null && !mVideoData?.id.isNullOrEmpty()) {
|
||||||
|
mPlayer?.loadOrCueVideo(
|
||||||
|
lifecycle,
|
||||||
|
mVideoData!!.id,
|
||||||
|
0f
|
||||||
|
)
|
||||||
|
|
||||||
|
/*mPlayerView?.isVisible?.let {
|
||||||
|
if (!it) {
|
||||||
|
mPlayer?.pause()
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fun loadVideo() {
|
fun loadVideo() {
|
||||||
if (null == mPlayerView) {
|
if (null == mPlayerView) {
|
||||||
mPlayerView = YouTubePlayerView(requireContext())
|
mPlayerView = YouTubePlayerView(requireContext())
|
||||||
binding!!.playerContainer.addView(mPlayerView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
|
val layoutParam = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
|
||||||
|
layoutParam.gravity = Gravity.CENTER
|
||||||
|
binding!!.playerContainer.addView(mPlayerView, layoutParam)
|
||||||
lifecycle.addObserver(mPlayerView!!)
|
lifecycle.addObserver(mPlayerView!!)
|
||||||
mPlayerView?.enableAutomaticInitialization = true
|
mPlayerView?.enableAutomaticInitialization = true
|
||||||
}
|
}
|
||||||
|
|
@ -104,17 +146,7 @@ class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
|
||||||
val playerUiController = MyPlayerControlView(playerView, youTubePlayer)
|
val playerUiController = MyPlayerControlView(playerView, youTubePlayer)
|
||||||
playerView.setCustomPlayerUi(playerUiController.rootView)
|
playerView.setCustomPlayerUi(playerUiController.rootView)
|
||||||
|
|
||||||
if (mVideoData != null && !mVideoData?.id.isNullOrEmpty()) {
|
playVideo()
|
||||||
youTubePlayer.loadOrCueVideo(
|
|
||||||
lifecycle,
|
|
||||||
mVideoData!!.id,
|
|
||||||
0f
|
|
||||||
)
|
|
||||||
|
|
||||||
if (!playerView.isVisible) {
|
|
||||||
youTubePlayer.pause()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCurrentSecond(youTubePlayer: YouTubePlayer, second: Float) {
|
override fun onCurrentSecond(youTubePlayer: YouTubePlayer, second: Float) {
|
||||||
|
|
@ -126,6 +158,7 @@ class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
|
||||||
override fun onVideoDuration(youTubePlayer: YouTubePlayer, duration: Float) {
|
override fun onVideoDuration(youTubePlayer: YouTubePlayer, duration: Float) {
|
||||||
super.onVideoDuration(youTubePlayer, duration)
|
super.onVideoDuration(youTubePlayer, duration)
|
||||||
mTotalDuration = duration
|
mTotalDuration = duration
|
||||||
|
mTickerTimer.setVideoInfo(mVideoData!!.id, (1000L * mTotalDuration).toLong())
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStateChange(
|
override fun onStateChange(
|
||||||
|
|
@ -147,9 +180,11 @@ class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
|
||||||
}
|
}
|
||||||
PlayerConstants.PlayerState.ENDED -> {
|
PlayerConstants.PlayerState.ENDED -> {
|
||||||
togglePlayingState(false)
|
togglePlayingState(false)
|
||||||
|
playVideo()
|
||||||
}
|
}
|
||||||
PlayerConstants.PlayerState.BUFFERING -> {
|
PlayerConstants.PlayerState.BUFFERING -> {
|
||||||
togglePlayingState(false)
|
binding?.circlePb?.isVisible = true
|
||||||
|
//showLoading(true)
|
||||||
}
|
}
|
||||||
PlayerConstants.PlayerState.VIDEO_CUED -> {
|
PlayerConstants.PlayerState.VIDEO_CUED -> {
|
||||||
togglePlayingState(false)
|
togglePlayingState(false)
|
||||||
|
|
@ -159,14 +194,38 @@ class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun generateThumbAndSet() {
|
||||||
|
// capturePlayerView And Show as thumb
|
||||||
|
mPlayerView?.let {
|
||||||
|
mMaskBitmap?.recycle()
|
||||||
|
|
||||||
|
mMaskBitmap = AndroidUtil.getThumbOfView(it)
|
||||||
|
mMaskBitmap?.let {
|
||||||
|
binding?.ivMask?.setImageBitmap(mMaskBitmap)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun togglePlayingState(isPlaying: Boolean) {
|
private fun togglePlayingState(isPlaying: Boolean) {
|
||||||
if (mIsPlaying != isPlaying) {
|
if (mIsPlaying != isPlaying) {
|
||||||
mIsPlaying = isPlaying
|
mIsPlaying = isPlaying
|
||||||
|
if (!mIsPlaying) {
|
||||||
|
generateThumbAndSet()
|
||||||
|
} else {
|
||||||
|
binding?.circlePb?.isVisible = false
|
||||||
|
}
|
||||||
|
|
||||||
|
binding?.ivMask?.isVisible = !mIsPlaying
|
||||||
|
binding?.playerContainer?.isVisible = mIsPlaying
|
||||||
|
|
||||||
if (mIsPlaying) {
|
if (mIsPlaying) {
|
||||||
hidePlayIconAnim()
|
hidePlayIconAnim()
|
||||||
} else {
|
} else {
|
||||||
showPlayIconAnim()
|
showPlayIconAnim()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mIsPlaying) mTickerTimer.start() else mTickerTimer.pause()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,15 @@
|
||||||
package com.gamedog.vididin.main.fragments.task
|
package com.gamedog.vididin.main.fragments.task
|
||||||
|
|
||||||
import android.content.Context
|
import android.app.Activity
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
import com.ama.core.architecture.widget.BindingDialog
|
import com.ama.core.architecture.widget.BindingDialog
|
||||||
import com.gamedog.vididin.databinding.DialogDailySignBinding
|
import com.vididin.real.money.game.databinding.DialogDailySignBinding
|
||||||
import com.gamedog.vididin.manager.TaskManager
|
import com.gamedog.vididin.manager.TaskManager
|
||||||
import com.gamedog.vididin.widget.DailySignItemView
|
import com.gamedog.vididin.widget.DailySignItemView
|
||||||
|
|
||||||
|
|
||||||
class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(context, DialogDailySignBinding::inflate) {
|
class DailySignDialog(context: Activity) : BindingDialog<DialogDailySignBinding>(context, DialogDailySignBinding::inflate) {
|
||||||
private var mCurDayIndex: Int = 0
|
private var mCurDayIndex: Int = 0
|
||||||
private var mConfigList: List<RewardDetail>? = emptyList()
|
private var mConfigList: List<RewardDetail>? = emptyList()
|
||||||
private var mSignItemViewList: MutableList<DailySignItemView> = mutableListOf()
|
private var mSignItemViewList: MutableList<DailySignItemView> = mutableListOf()
|
||||||
|
|
@ -56,16 +56,16 @@ class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun clickedNormalSign() {
|
private fun clickedNormalSign() {
|
||||||
if (TaskManager.instance().executeDailySign(mCurDayIndex, false, false)) {
|
if (TaskManager.instance().dailySignStatus().executeDailySign(mCurDayIndex, false, false)) {
|
||||||
DailySignSuccessDialog(context).initData(mConfigList?.get(mCurDayIndex)?.value, true).show()
|
DailySignSuccessDialog(mActivity).initData(mConfigList?.get(mCurDayIndex)?.value, true).show()
|
||||||
updateUI(mCurDayIndex)
|
updateUI(mCurDayIndex)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun clickedAdSingleBut() {
|
private fun clickedAdSingleBut() {
|
||||||
startAdTask("signalAd", {
|
startAdTask("signalAd", {
|
||||||
if (TaskManager.instance().executeDailySign(mCurDayIndex, false, true)) {
|
if (TaskManager.instance().dailySignStatus().executeDailySign(mCurDayIndex, false, true)) {
|
||||||
DailySignSuccessDialog(context).initData(mConfigList?.get(mCurDayIndex)?.value, false).show()
|
DailySignSuccessDialog(mActivity).initData(mConfigList?.get(mCurDayIndex)?.value, false).show()
|
||||||
updateUI(mCurDayIndex)
|
updateUI(mCurDayIndex)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
@ -73,8 +73,8 @@ class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(
|
||||||
|
|
||||||
private fun clickedAdDoubleBut() {
|
private fun clickedAdDoubleBut() {
|
||||||
startAdTask("doubleAd", {
|
startAdTask("doubleAd", {
|
||||||
if (TaskManager.instance().executeDailySign(mCurDayIndex, true, true)) {
|
if (TaskManager.instance().dailySignStatus().executeDailySign(mCurDayIndex, true, true)) {
|
||||||
DailySignSuccessDialog(context).initData((mConfigList?.get(mCurDayIndex)?.value)?.times(
|
DailySignSuccessDialog(mActivity).initData((mConfigList?.get(mCurDayIndex)?.value)?.times(
|
||||||
2
|
2
|
||||||
), false).show()
|
), false).show()
|
||||||
updateUI(mCurDayIndex)
|
updateUI(mCurDayIndex)
|
||||||
|
|
@ -83,11 +83,11 @@ class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun clickedComplementSign() {
|
private fun clickedComplementSign() {
|
||||||
val firstForgotSignDayIndex = TaskManager.instance().getForgotSignFirstDayIndex()
|
val firstForgotSignDayIndex = TaskManager.instance().dailySignStatus().getForgotSignFirstDayIndex()
|
||||||
if (firstForgotSignDayIndex > 0) {
|
if (firstForgotSignDayIndex > 0) {
|
||||||
startAdTask("complementAd", {
|
startAdTask("complementAd", {
|
||||||
if (TaskManager.instance().executeDailySign(firstForgotSignDayIndex, false, false)){
|
if (TaskManager.instance().dailySignStatus().executeDailySign(firstForgotSignDayIndex, false, false)){
|
||||||
DailySignSuccessDialog(context).initData(mConfigList?.get(firstForgotSignDayIndex)?.value, false).show()
|
DailySignSuccessDialog(mActivity).initData(mConfigList?.get(firstForgotSignDayIndex)?.value, false).show()
|
||||||
updateUI(firstForgotSignDayIndex)
|
updateUI(firstForgotSignDayIndex)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
@ -120,14 +120,14 @@ class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(
|
||||||
mConfigList?.let {
|
mConfigList?.let {
|
||||||
mSignItemViewList.forEachIndexed { index, itemView->
|
mSignItemViewList.forEachIndexed { index, itemView->
|
||||||
itemView.setData(mConfigList!![index],
|
itemView.setData(mConfigList!![index],
|
||||||
TaskManager.instance().getDailySignStateBean(index))
|
TaskManager.instance().dailySignStatus().getDailySignStateBean(index))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initSignState() {
|
private fun initSignState() {
|
||||||
mCurDayIndex = TaskManager.instance().getCurDayIndexOfDailyCheckIn()
|
mCurDayIndex = TaskManager.instance().dailySignStatus().getCurDayIndexOfDailyCheckIn()
|
||||||
mSignItemViewList[mCurDayIndex].setSelectState(true)
|
mSignItemViewList[mCurDayIndex].setSelectState(true)
|
||||||
updateUI(mCurDayIndex)
|
updateUI(mCurDayIndex)
|
||||||
}
|
}
|
||||||
|
|
@ -140,7 +140,7 @@ class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(
|
||||||
|
|
||||||
|
|
||||||
mBinding.tvSignedTotal.text = buildString {
|
mBinding.tvSignedTotal.text = buildString {
|
||||||
append(TaskManager.instance().getSignDaysTotal())
|
append(TaskManager.instance().dailySignStatus().getSignDaysTotal())
|
||||||
append("/7")
|
append("/7")
|
||||||
}
|
}
|
||||||
mSignItemViewList[signedDayIndex].updateUI()
|
mSignItemViewList[signedDayIndex].updateUI()
|
||||||
|
|
@ -162,7 +162,7 @@ class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(
|
||||||
mConfigList?.get(mCurDayIndex)?.value
|
mConfigList?.get(mCurDayIndex)?.value
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
val forgotSignDays = TaskManager.instance().getForgotSignDays()
|
val forgotSignDays = TaskManager.instance().dailySignStatus().getForgotSignDays()
|
||||||
if (forgotSignDays > 0) {
|
if (forgotSignDays > 0) {
|
||||||
mBinding.actionNormalTwoButs.isVisible = false
|
mBinding.actionNormalTwoButs.isVisible = false
|
||||||
mBinding.actionWatchAd.isVisible = false
|
mBinding.actionWatchAd.isVisible = false
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
package com.gamedog.vididin.main.fragments.task
|
package com.gamedog.vididin.main.fragments.task
|
||||||
|
|
||||||
import android.content.Context
|
import android.app.Activity
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
import com.ama.core.architecture.widget.BindingDialog
|
import com.ama.core.architecture.widget.BindingDialog
|
||||||
import com.gamedog.vididin.databinding.DialogDailySignSuccessBinding as ViewBinding
|
import com.vididin.real.money.game.databinding.DialogDailySignSuccessBinding as ViewBinding
|
||||||
|
|
||||||
|
|
||||||
class DailySignSuccessDialog(context: Context) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
|
class DailySignSuccessDialog(activity: Activity) : BindingDialog<ViewBinding>(activity, ViewBinding::inflate) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
build()
|
build()
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,8 @@ data class TaskBean(
|
||||||
|
|
||||||
data class TaskModuleConfig(
|
data class TaskModuleConfig(
|
||||||
val basic_info: BasicInfo,
|
val basic_info: BasicInfo,
|
||||||
val task_categories: List<TaskCategory>
|
val task_categories: List<TaskCategory>,
|
||||||
|
val box_task: BoxTaskRoot
|
||||||
) {
|
) {
|
||||||
fun getTaskCategoryById(categoryId: String): TaskCategory? {
|
fun getTaskCategoryById(categoryId: String): TaskCategory? {
|
||||||
return task_categories.find { it.category_id == categoryId }
|
return task_categories.find { it.category_id == categoryId }
|
||||||
|
|
@ -53,4 +54,33 @@ data class RewardDetail(
|
||||||
val day: Int,
|
val day: Int,
|
||||||
val target_count: Int,
|
val target_count: Int,
|
||||||
val value: Int
|
val value: Int
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------- 宝箱任务配置 -----------------------------
|
||||||
|
data class BoxSubTask(
|
||||||
|
val task_id: String,
|
||||||
|
val task_name: String,
|
||||||
|
val required_count: Int,
|
||||||
|
val task_type: Int,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class BoxTask(
|
||||||
|
val chest_id: String,
|
||||||
|
val chest_name: String,
|
||||||
|
val duration_days: Int,
|
||||||
|
val reward_type: String,
|
||||||
|
val reward_value: Float,
|
||||||
|
val is_one_time: Boolean,
|
||||||
|
val status: String,
|
||||||
|
val tasks: List<BoxSubTask>,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class BoxTaskRoot(
|
||||||
|
val category_id: String,
|
||||||
|
val category_name: String,
|
||||||
|
val valid_period: String,
|
||||||
|
val display_priority: String,
|
||||||
|
val chests: List<BoxTask>,
|
||||||
)
|
)
|
||||||
|
|
@ -6,7 +6,7 @@ import android.util.AttributeSet
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import com.ama.core.common.util.dp
|
import com.ama.core.common.util.dp
|
||||||
import com.ama.core.common.util.sp
|
import com.ama.core.common.util.sp
|
||||||
import com.gamedog.vididin.R
|
import com.vididin.real.money.game.R
|
||||||
import android.graphics.*
|
import android.graphics.*
|
||||||
import com.ama.core.architecture.BaseApp
|
import com.ama.core.architecture.BaseApp
|
||||||
import com.ama.core.architecture.util.ResUtil
|
import com.ama.core.architecture.util.ResUtil
|
||||||
|
|
@ -114,7 +114,7 @@ class WeekStatusView @JvmOverloads constructor(
|
||||||
override fun onDraw(canvas: Canvas) {
|
override fun onDraw(canvas: Canvas) {
|
||||||
super.onDraw(canvas)
|
super.onDraw(canvas)
|
||||||
|
|
||||||
val dayStateList = TaskManager.instance().getDayStateList()
|
val dayStateList = TaskManager.instance().dailySignStatus().getDayStateList()
|
||||||
if (dayStateList.isEmpty()) return
|
if (dayStateList.isEmpty()) return
|
||||||
|
|
||||||
val totalWidth = measuredWidth.toFloat()
|
val totalWidth = measuredWidth.toFloat()
|
||||||
|
|
@ -140,7 +140,7 @@ class WeekStatusView @JvmOverloads constructor(
|
||||||
|
|
||||||
// reward text
|
// reward text
|
||||||
textPaint.textSize = rewardTextSize
|
textPaint.textSize = rewardTextSize
|
||||||
val rewardNum = TaskManager.instance().getRewardNumOfDailySign(index)
|
val rewardNum = TaskManager.instance().dailySignStatus().getRewardNumOfDailySign(index)
|
||||||
textPaint.color = if (dayStatus.hasSigned) rewardTextSignedColor else rewardTextColor
|
textPaint.color = if (dayStatus.hasSigned) rewardTextSignedColor else rewardTextColor
|
||||||
canvas.drawText(rewardNum.toString(), centerX, vertiMagin + dayTextSize + componentGap + 2*circleRadius + componentGap, textPaint)
|
canvas.drawText(rewardNum.toString(), centerX, vertiMagin + dayTextSize + componentGap + 2*circleRadius + componentGap, textPaint)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,10 @@ import android.util.AttributeSet
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
import com.gamedog.vididin.databinding.BeginnerTaskItemViewBinding
|
import com.vididin.real.money.game.R
|
||||||
|
import com.gamedog.vididin.VidiConst
|
||||||
|
import com.vididin.real.money.game.databinding.BeginnerTaskItemViewBinding
|
||||||
|
import com.gamedog.vididin.main.fragments.task.Task
|
||||||
|
|
||||||
|
|
||||||
class BeginnerTaskItemView @JvmOverloads constructor(
|
class BeginnerTaskItemView @JvmOverloads constructor(
|
||||||
|
|
@ -31,20 +34,17 @@ class BeginnerTaskItemView @JvmOverloads constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun initUI(titleIconRes: Int, titleRes: Int, desRes: Int, actionRes: Int) {
|
fun initUI(titleIconRes: Int, titleRes: Int, actionRes: Int) {
|
||||||
mBinding.ivItemIcon.setImageResource(titleIconRes)
|
mBinding.ivItemIcon.setImageResource(titleIconRes)
|
||||||
mBinding.tvItemTitle.setText(titleRes)
|
mBinding.tvItemTitle.setText(titleRes)
|
||||||
mBinding.tvAction.setText(actionRes)
|
mBinding.tvAction.setText(actionRes)
|
||||||
mBinding.tvItemDescrible.setText(desRes)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun setRewardNum(rewardNum: String) {
|
fun setRewardInfo(taskReward: Task) {
|
||||||
mBinding.tvRewardNum.text = rewardNum
|
val isRewardGold = VidiConst.GOLD_IN_CONFIG == taskReward.reward_type;
|
||||||
}
|
mBinding.ivRewardIcon.setImageResource(if (isRewardGold) R.mipmap.icon_glod_small else R.mipmap.icon_cash_s)
|
||||||
|
mBinding.tvRewardNum.text = taskReward.reward_value.toString()
|
||||||
fun setRewardIcon(iconRes: Int) {
|
|
||||||
mBinding.ivRewardIcon.setImageResource(iconRes)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -57,5 +57,20 @@ class BeginnerTaskItemView @JvmOverloads constructor(
|
||||||
mBinding.tvRewardNum.setTextColor(color)
|
mBinding.tvRewardNum.setTextColor(color)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun setTaskStateInfo(
|
||||||
|
rewardNum: String,
|
||||||
|
textRes: Int,
|
||||||
|
describleStr: String,
|
||||||
|
hasClaimReward: Boolean
|
||||||
|
) {
|
||||||
|
mBinding.tvRewardNum.text = rewardNum
|
||||||
|
mBinding.tvAction.setText(textRes)
|
||||||
|
mBinding.tvItemDescrible.text = describleStr
|
||||||
|
mBinding.tvAction.isClickable = !hasClaimReward
|
||||||
|
if (hasClaimReward) {
|
||||||
|
mBinding.tvAction.setBackgroundResource(R.drawable.bg_sub_task_disable)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -6,7 +6,11 @@ import android.view.LayoutInflater
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import com.ama.core.architecture.util.ResUtil
|
import com.ama.core.architecture.util.ResUtil
|
||||||
import com.ama.core.architecture.util.setOnClickBatch
|
import com.ama.core.architecture.util.setOnClickBatch
|
||||||
import com.gamedog.vididin.databinding.DailyTaskItemViewBinding
|
import com.vididin.real.money.game.R
|
||||||
|
import com.vididin.real.money.game.databinding.DailyTaskItemViewBinding
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.BaseTaskState.Companion.STATE_CLAIMED
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.BaseTaskState.Companion.STATE_FINISH
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.BaseTaskState.Companion.STATE_ONGOING
|
||||||
|
|
||||||
|
|
||||||
class DailyTaskItemView @JvmOverloads constructor(
|
class DailyTaskItemView @JvmOverloads constructor(
|
||||||
|
|
@ -14,8 +18,10 @@ class DailyTaskItemView @JvmOverloads constructor(
|
||||||
attrs: AttributeSet? = null,
|
attrs: AttributeSet? = null,
|
||||||
defStyleAttr: Int = 0
|
defStyleAttr: Int = 0
|
||||||
) : LinearLayout(context, attrs, defStyleAttr) {
|
) : LinearLayout(context, attrs, defStyleAttr) {
|
||||||
|
private var mRewardNum: Int = 0
|
||||||
|
private var mNeedWatchTotal: Int = 0
|
||||||
private lateinit var mAction: () -> Unit
|
private lateinit var mAction: () -> Unit
|
||||||
private lateinit var mBinding: DailyTaskItemViewBinding
|
private var mBinding: DailyTaskItemViewBinding
|
||||||
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
|
@ -33,20 +39,49 @@ class DailyTaskItemView @JvmOverloads constructor(
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fun initUI(titleIconRes: Int, titleRes: Int, videosNum: Int, actionRes: Int) {
|
fun initUI(titleIconRes: Int, titleRes: Int, videosNum: Int, goldReward: Int) {
|
||||||
|
mRewardNum = goldReward
|
||||||
|
mNeedWatchTotal = videosNum
|
||||||
|
|
||||||
mBinding.ivItemIcon.setImageResource(titleIconRes)
|
mBinding.ivItemIcon.setImageResource(titleIconRes)
|
||||||
mBinding.tvItemTitle.text = String.format(ResUtil.getString(titleRes), videosNum)
|
mBinding.tvItemTitle.text = String.format(ResUtil.getString(titleRes), videosNum)
|
||||||
mBinding.tvAction.setText(actionRes)
|
mBinding.tvRewardNum.text = "+$goldReward"
|
||||||
|
mBinding.tvItemProgress.text = "(0/$videosNum)"
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setProgressText(progress: Int, progressText: String) {
|
fun updateProgress(watchedCount: Int, subTaskState: Int) {
|
||||||
mBinding.tvItemProgress.text = progressText
|
doUpdateProgress(watchedCount)
|
||||||
mBinding.itemProgress.setProgress(progress)
|
|
||||||
|
with(mBinding.tvAction) {
|
||||||
|
when(subTaskState) {
|
||||||
|
STATE_ONGOING -> {
|
||||||
|
setText(R.string.go_and_do)
|
||||||
|
setBackgroundResource(R.drawable.bg_sub_task_normal)
|
||||||
|
isClickable = true
|
||||||
|
alpha = 1F
|
||||||
|
}
|
||||||
|
|
||||||
|
STATE_FINISH -> {
|
||||||
|
setText(R.string.resgatar)
|
||||||
|
setBackgroundResource(R.drawable.bg_sub_task_normal)
|
||||||
|
isClickable = true
|
||||||
|
alpha = 1F
|
||||||
|
}
|
||||||
|
|
||||||
|
STATE_CLAIMED -> {
|
||||||
|
setText(R.string.Resgatado)
|
||||||
|
setBackgroundResource(R.drawable.bg_sub_task_disable)
|
||||||
|
isClickable = false
|
||||||
|
alpha = 0.4F
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setRewardInfo(rewardIconRes: Int, rewardNum: Int) {
|
private fun doUpdateProgress(finishNum: Int) {
|
||||||
mBinding.tvRewardNum.text = "" + rewardNum
|
val properShowNumForCurSubTask = if (finishNum > mNeedWatchTotal) mNeedWatchTotal else finishNum
|
||||||
mBinding.ivRewardIcon.setImageResource(rewardIconRes)
|
mBinding.tvItemProgress.text = "($properShowNumForCurSubTask/$mNeedWatchTotal)"
|
||||||
|
mBinding.itemProgress.setProgress(100*properShowNumForCurSubTask/mNeedWatchTotal)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setActionFun(action: ()->Unit) {
|
fun setActionFun(action: ()->Unit) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
package com.gamedog.vididin.manager
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
|
||||||
|
class DateChangeReceiver : BroadcastReceiver() {
|
||||||
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
|
if (intent.action == Intent.ACTION_DATE_CHANGED) {
|
||||||
|
TaskManager.instance().onDateChanged()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,13 +1,21 @@
|
||||||
package com.gamedog.vididin.manager
|
package com.gamedog.vididin.manager
|
||||||
|
|
||||||
import com.ama.core.architecture.util.DateUtil
|
|
||||||
import com.ama.core.architecture.util.FileUtil
|
import com.ama.core.architecture.util.FileUtil
|
||||||
import com.ama.core.architecture.util.SpUtil
|
|
||||||
import com.ama.core.architecture.util.eventbus.NotifyMan
|
import com.ama.core.architecture.util.eventbus.NotifyMan
|
||||||
|
import com.gamedog.vididin.VidiConst
|
||||||
import com.gamedog.vididin.VididinEvents
|
import com.gamedog.vididin.VididinEvents
|
||||||
import com.gamedog.vididin.core.login.login.AccountManager
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
|
import com.gamedog.vididin.main.fragments.task.BoxTaskRoot
|
||||||
import com.gamedog.vididin.main.fragments.task.Task
|
import com.gamedog.vididin.main.fragments.task.Task
|
||||||
import com.gamedog.vididin.main.fragments.task.TaskBean
|
import com.gamedog.vididin.main.fragments.task.TaskBean
|
||||||
|
import com.gamedog.vididin.manager.helpers.BoxTaskHelper
|
||||||
|
import com.gamedog.vididin.manager.helpers.DailySignTaskHelper
|
||||||
|
import com.gamedog.vididin.manager.helpers.DailyWatchAdTaskHelper
|
||||||
|
import com.gamedog.vididin.manager.helpers.DailyWatchVideoTaskHelper
|
||||||
|
import com.gamedog.vididin.manager.helpers.NewbieEnableNotifyHelper
|
||||||
|
import com.gamedog.vididin.manager.helpers.NewbieFirstWithdrawHelper
|
||||||
|
import com.gamedog.vididin.manager.helpers.NewbieJoinDiscordHelper
|
||||||
import com.google.gson.GsonBuilder
|
import com.google.gson.GsonBuilder
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.sync.withLock
|
import kotlinx.coroutines.sync.withLock
|
||||||
|
|
@ -31,6 +39,24 @@ class TaskManager private constructor() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 宝箱子任务类型对应
|
||||||
|
const val BOX_SUB_TASK_TYPE_AD = 1
|
||||||
|
const val BOX_SUB_TASK_TYPE_VIDEO = 2
|
||||||
|
const val BOX_SUB_TASK_TYPE_SIGN = 3
|
||||||
|
const val BOX_SUB_TASK_TYPE_ZERO_BUY = 4
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Volatile
|
@Volatile
|
||||||
private var instance: TaskManager? = null
|
private var instance: TaskManager? = null
|
||||||
|
|
||||||
|
|
@ -44,26 +70,52 @@ class TaskManager private constructor() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private var mCurDayIndexDailySign: Int = 0
|
|
||||||
private val mutex = Mutex()
|
|
||||||
|
|
||||||
@Volatile
|
@Volatile
|
||||||
private var initialized = false
|
private var initialized = false
|
||||||
private var mTaskConfig: TaskBean? = null
|
private val mutex = Mutex()
|
||||||
private var mDailySignData: DailySignBean = DailySignBean()
|
|
||||||
private val mGson = GsonBuilder().create()
|
private val mGson = GsonBuilder().create()
|
||||||
|
private var mTaskConfig: TaskBean? = null
|
||||||
|
|
||||||
|
|
||||||
|
private val mDailySignTaskHelper by lazy { DailySignTaskHelper() }
|
||||||
|
private val mDailyWatchVideoTaskHelper by lazy { DailyWatchVideoTaskHelper() }
|
||||||
|
private val mDailyWatchAdTaskHelper by lazy { DailyWatchAdTaskHelper() }
|
||||||
|
private val mBoxHelper by lazy { BoxTaskHelper() }
|
||||||
|
private val mNewbieJoinDiscordHelper by lazy { NewbieJoinDiscordHelper() }
|
||||||
|
private val mNewbieEnableNotifyHelper by lazy { NewbieEnableNotifyHelper() }
|
||||||
|
private val mNewbieFirstWithdrawHelper by lazy { NewbieFirstWithdrawHelper() }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
loadTaskConfigAsync()
|
loadTaskConfigAsync()
|
||||||
|
registerEvents()
|
||||||
|
|
||||||
// TODO - remove test code
|
// TODO - remove test code
|
||||||
if (true) {
|
if (false) {
|
||||||
generateTestDailySignTestBean()
|
mDailySignTaskHelper.generateTestDailySignTestBean()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun registerEvents() {
|
||||||
|
NotifyMan.instance().register(object : NotifyMan.ICallback(true) {
|
||||||
|
override fun onEvent(data: NotifyMan.NotifyData<*>?) {
|
||||||
|
when (data?.mEventType) {
|
||||||
|
VididinEvents.EVENT_AD_WATCHED_FOR_CONVERT_GOLD_2_CASH -> {
|
||||||
|
AccountManager.convertGold2Cash()
|
||||||
|
}
|
||||||
|
|
||||||
|
VididinEvents.EVENT_AD_WATCHED_FOR_EARN_GOLD -> {
|
||||||
|
AccountManager.addGold(VidiConst.WATCH_AD_REWARD_GOLD)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, VididinEvents.EVENT_AD_WATCHED_FOR_CONVERT_GOLD_2_CASH, VididinEvents.EVENT_AD_WATCHED_FOR_EARN_GOLD)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
suspend fun getTaskConfig(): TaskBean? = mutex.withLock {
|
suspend fun getTaskConfig(): TaskBean? = mutex.withLock {
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
|
|
@ -77,9 +129,7 @@ class TaskManager private constructor() {
|
||||||
mutex.withLock {
|
mutex.withLock {
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
loadTaskConfigFromAsset()
|
loadTaskConfigFromAsset()
|
||||||
loadTaskStatesFromSp()
|
initHelpers()
|
||||||
|
|
||||||
initCalculate()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -93,20 +143,54 @@ class TaskManager private constructor() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private suspend fun initHelpers() {
|
||||||
private suspend fun loadTaskStatesFromSp() {
|
mDailySignTaskHelper.setConfigDatas(getDailyCheckInTask()!!)
|
||||||
return withContext(Dispatchers.IO) {
|
mDailyWatchVideoTaskHelper.setConfigDatas(getDailyVideoTask()!!)
|
||||||
val taskStateBeanInSp = SpUtil.instance().getObject<DailySignBean>(SpUtil.KEY_TASK_BEAN)
|
mDailyWatchAdTaskHelper.setConfigDatas(getDailyAdTask()!!)
|
||||||
if (taskStateBeanInSp == null) {
|
mNewbieJoinDiscordHelper.setConfigDatas(getNewbieJoinDiscordTask()!!)
|
||||||
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData)
|
mNewbieEnableNotifyHelper.setConfigDatas(getNewbieEnableNotifyTask()!!)
|
||||||
} else {
|
mNewbieFirstWithdrawHelper.setConfigDatas(getNewbieFirstWithdrawTask()!!)
|
||||||
mDailySignData = taskStateBeanInSp
|
mBoxHelper.setConfigDatas(getBoxTaskConfig()!!)
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initCalculate() {
|
fun onDateChanged() {
|
||||||
|
mDailySignTaskHelper.onDateChanged()
|
||||||
|
mDailyWatchVideoTaskHelper.onDateChanged()
|
||||||
|
mDailyWatchAdTaskHelper.onDateChanged()
|
||||||
|
mBoxHelper.onDateChanged()
|
||||||
|
mNewbieJoinDiscordHelper.onDateChanged()
|
||||||
|
mNewbieEnableNotifyHelper.onDateChanged()
|
||||||
|
mNewbieFirstWithdrawHelper.onDateChanged()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------- Tasks Getter ------------------------------
|
||||||
|
fun dailySignStatus(): DailySignTaskHelper {
|
||||||
|
return mDailySignTaskHelper
|
||||||
|
}
|
||||||
|
|
||||||
|
fun dailyWatchVideoStatus(): DailyWatchVideoTaskHelper {
|
||||||
|
return mDailyWatchVideoTaskHelper
|
||||||
|
}
|
||||||
|
|
||||||
|
fun dailyWatchAdStatus(): DailyWatchAdTaskHelper {
|
||||||
|
return mDailyWatchAdTaskHelper
|
||||||
|
}
|
||||||
|
|
||||||
|
fun boxTaskStatus(): BoxTaskHelper {
|
||||||
|
return mBoxHelper
|
||||||
|
}
|
||||||
|
|
||||||
|
fun newbieJoinDiscordStatus(): NewbieJoinDiscordHelper {
|
||||||
|
return mNewbieJoinDiscordHelper
|
||||||
|
}
|
||||||
|
|
||||||
|
fun newbieEnableNotifyStatus(): NewbieEnableNotifyHelper {
|
||||||
|
return mNewbieEnableNotifyHelper
|
||||||
|
}
|
||||||
|
|
||||||
|
fun newbieFirstWithdrawStatus(): NewbieFirstWithdrawHelper {
|
||||||
|
return mNewbieFirstWithdrawHelper
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -144,126 +228,17 @@ class TaskManager private constructor() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 宝箱任务
|
||||||
|
fun getBoxTaskConfig(): BoxTaskRoot? {
|
||||||
//----------------------------- 每日签到 -----------------------------//
|
return mTaskConfig?.task_module_config?.box_task
|
||||||
|
|
||||||
fun getHomeWatchDurationRewardNum(): Int {
|
|
||||||
return 28; // TODO - mTaskConfigBean.xxxx
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun getCurDayIndexOfDailyCheckIn() : Int {
|
|
||||||
var dayIndexOfPeriod = 0
|
|
||||||
|
|
||||||
val periodStartMs = mDailySignData.startMs
|
|
||||||
if (periodStartMs > 0) {
|
|
||||||
dayIndexOfPeriod = DateUtil.getPassedDayNum(periodStartMs, DateUtil.getCurTimeMs())
|
|
||||||
if (dayIndexOfPeriod > 6) {
|
|
||||||
mDailySignData.startMs = DateUtil.getCurTimeMs()
|
|
||||||
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
mDailySignData.startMs = DateUtil.getCurTimeMs()
|
|
||||||
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData)
|
|
||||||
}
|
|
||||||
|
|
||||||
mCurDayIndexDailySign = dayIndexOfPeriod
|
|
||||||
return dayIndexOfPeriod
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getDailySignStateBean(dayIndex: Int): DailySignDayInfoBean {
|
|
||||||
return mDailySignData.signStateList[dayIndex]
|
|
||||||
}
|
|
||||||
|
|
||||||
fun executeDailySign(dayIndex: Int, isDoubleReward: Boolean, isByAd: Boolean) : Boolean {
|
|
||||||
val daySignState = mDailySignData.signStateList[dayIndex]
|
|
||||||
|
|
||||||
if (!daySignState.hasSigned || (dayIndex == mCurDayIndexDailySign && !daySignState.hasWatchedAd)) {
|
|
||||||
val dayReward = getDailyCheckInTask()?.reward_details?.get(dayIndex)?.value ?: 0
|
|
||||||
val finalReward = if (isDoubleReward) 2*dayReward else dayReward
|
|
||||||
daySignState.hasRewardedNum += finalReward
|
|
||||||
daySignState.hasSigned = true
|
|
||||||
daySignState.hasWatchedAd = isByAd
|
|
||||||
saveDailySignInfo()
|
|
||||||
AccountManager.addGold(finalReward)
|
|
||||||
notifySignStateChanged(Pair(dayIndex, daySignState))
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun notifySignStateChanged(dataPair: Pair<Int, DailySignDayInfoBean>) {
|
|
||||||
NotifyMan.instance().sendEvent(VididinEvents.Event_Sign_State_Changed, NotifyMan.NotifyData(dataPair))
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun saveDailySignInfo() {
|
|
||||||
SpUtil.instance().putObject(SpUtil.KEY_DAILY_SIGN, mDailySignData)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun generateTestDailySignTestBean() {
|
|
||||||
mDailySignData = DailySignBean().apply {
|
|
||||||
startMs = DateUtil.getCurTimeMs() - 4 * DateUtil.MS_NUM_ONE_DAY
|
|
||||||
signStateList.clear()
|
|
||||||
signStateList.add(DailySignDayInfoBean(hasSigned = true, hasWatchedAd = true))
|
|
||||||
signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false))
|
|
||||||
signStateList.add(DailySignDayInfoBean(hasSigned = true, hasWatchedAd = false))
|
|
||||||
signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false))
|
|
||||||
signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false))
|
|
||||||
signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false))
|
|
||||||
signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false))
|
|
||||||
}
|
|
||||||
|
|
||||||
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData)
|
|
||||||
AccountManager.saveBankAccount(null)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getForgotSignDays(): Int {
|
|
||||||
var forgotSignDays = 0
|
|
||||||
val curDayIndex = getCurDayIndexOfDailyCheckIn()
|
|
||||||
mDailySignData.signStateList.forEachIndexed { index, item->
|
|
||||||
if (!item.hasSigned && index < curDayIndex) {
|
|
||||||
forgotSignDays++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return forgotSignDays
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getSignDaysTotal(): Int {
|
|
||||||
var signDays = 0
|
|
||||||
mDailySignData.signStateList.forEachIndexed { index, item->
|
|
||||||
if (item.hasSigned) {
|
|
||||||
signDays++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return signDays
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getForgotSignFirstDayIndex(): Int {
|
|
||||||
val curDayIndex = getCurDayIndexOfDailyCheckIn()
|
|
||||||
mDailySignData.signStateList.forEachIndexed { index, item->
|
|
||||||
if (!item.hasSigned && index < curDayIndex) {
|
|
||||||
return index
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
fun getDayStateList(): List<DailySignDayInfoBean> {
|
|
||||||
return mDailySignData.signStateList
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getRewardNumOfDailySign(dayIndex: Int) : Int {
|
|
||||||
return getDailyCheckInTask()?.reward_details?.get(dayIndex)?.value ?: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
fun isDailySignAllOperationDone(): Boolean {
|
|
||||||
val curDayState = getDailySignStateBean(mCurDayIndexDailySign)
|
|
||||||
return curDayState.hasSigned && curDayState.hasWatchedAd && getForgotSignFirstDayIndex() <= 0
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
package com.gamedog.vididin.manager
|
||||||
|
|
||||||
|
import com.ama.core.architecture.util.AndroidUtil
|
||||||
|
import com.ama.core.architecture.util.SpUtil
|
||||||
|
|
||||||
|
|
||||||
|
class WithdrawManager private constructor() {
|
||||||
|
|
||||||
|
|
||||||
|
private val mItemList: MutableList<WithdrawItemBean> by lazy {
|
||||||
|
val itemList = SpUtil.instance().getList<WithdrawItemBean>(SpUtil.KEY_WITHDRAW_ITEM_LIST).toMutableList()
|
||||||
|
if (itemList.isEmpty()) {
|
||||||
|
itemList.addAll(generateItemList())
|
||||||
|
save2Infos(itemList)
|
||||||
|
}
|
||||||
|
itemList
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val EACH_SUB_ITEM_CASH_NUM: Float = 1F
|
||||||
|
|
||||||
|
@Volatile
|
||||||
|
private var instance: WithdrawManager? = null
|
||||||
|
fun instance(): WithdrawManager {
|
||||||
|
return instance ?: synchronized(this) {
|
||||||
|
instance ?: WithdrawManager().also {
|
||||||
|
instance = it
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun generateItemList(): MutableList<WithdrawItemBean> {
|
||||||
|
val itemList = mutableListOf<WithdrawItemBean>()
|
||||||
|
itemList.add(WithdrawItemBean(0, 10F, AndroidUtil.randomInt(50, 70), generateSubItemList(10F)))
|
||||||
|
itemList.add(WithdrawItemBean(1, 20F, AndroidUtil.randomInt(50, 70), generateSubItemList(20F)))
|
||||||
|
itemList.add(WithdrawItemBean(2, 50F, AndroidUtil.randomInt(50, 70), generateSubItemList(50F)))
|
||||||
|
itemList.add(WithdrawItemBean(3, 100F, AndroidUtil.randomInt(50, 70), generateSubItemList(100F)))
|
||||||
|
itemList.add(WithdrawItemBean(4, 300F, AndroidUtil.randomInt(50, 70), generateSubItemList(300F)))
|
||||||
|
return itemList
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun generateSubItemList(totalCashInItem: Float): List<WithdrawSubItem> {
|
||||||
|
val subItemList = mutableListOf<WithdrawSubItem>()
|
||||||
|
val subItemCount: Int = (totalCashInItem/EACH_SUB_ITEM_CASH_NUM).toInt()
|
||||||
|
|
||||||
|
for (i in 0..subItemCount-1) {
|
||||||
|
subItemList.add(WithdrawSubItem(i, EACH_SUB_ITEM_CASH_NUM, i==0, AndroidUtil.randomInt(50, 70)))
|
||||||
|
}
|
||||||
|
return subItemList
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun save2Infos(itemList: MutableList<WithdrawItemBean>) {
|
||||||
|
SpUtil.instance().putList(SpUtil.KEY_WITHDRAW_ITEM_LIST, itemList)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getItemList(): List<WithdrawItemBean> {
|
||||||
|
return mItemList
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getItem(itemIndex: Int): WithdrawItemBean {
|
||||||
|
return mItemList[itemIndex]
|
||||||
|
}
|
||||||
|
|
||||||
|
fun updateProgress(itemIndex: Int, updatedItem: WithdrawItemBean) {
|
||||||
|
// TODO -
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
data class WithdrawItemBean(
|
||||||
|
val index: Int,
|
||||||
|
val totalCashNum: Float,
|
||||||
|
var totalProgress: Int = 0,
|
||||||
|
val subItemList: List<WithdrawSubItem> = emptyList()
|
||||||
|
)
|
||||||
|
|
||||||
|
data class WithdrawSubItem(
|
||||||
|
val index: Int,
|
||||||
|
val cashNum: Float,
|
||||||
|
var isSelected: Boolean = false,
|
||||||
|
val currentProgress: Int = 0,
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,69 @@
|
||||||
|
package com.gamedog.vididin.manager.helpers
|
||||||
|
|
||||||
|
import com.ama.core.architecture.util.DateUtil
|
||||||
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
|
import com.gamedog.vididin.main.fragments.task.Task
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.BaseDailyTaskState
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.BaseTaskState.Companion.STATE_CLAIMED
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.BaseTaskState.Companion.STATE_FINISH
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.BaseTaskState.Companion.STATE_ONGOING
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.TaskStateWatchVideo
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.TaskStateWatchAd
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
abstract class BaseDailyTaskHelper<T : BaseDailyTaskState> : BaseTaskHelper<T, Task>() {
|
||||||
|
|
||||||
|
abstract protected fun notifyEvents()
|
||||||
|
abstract protected fun generateTodayTask()
|
||||||
|
|
||||||
|
fun claimSubTaskReward(subTaskIndex: Int) : Boolean {
|
||||||
|
if (subTaskIndex >= 0 && subTaskIndex < mStateBean.getSubTaskRewardState().size) {
|
||||||
|
try {
|
||||||
|
val subTask = mStateBean.getSubTaskRewardState()[subTaskIndex]
|
||||||
|
if (subTask.state == STATE_FINISH) {
|
||||||
|
AccountManager.addGold(subTask.mRewardNum)
|
||||||
|
subTask.state = STATE_CLAIMED
|
||||||
|
saveState2Sp()
|
||||||
|
notifyEvents()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDateChanged() {
|
||||||
|
super.onDateChanged()
|
||||||
|
generateTodayTask()
|
||||||
|
notifyEvents()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected fun calculateNewState() {
|
||||||
|
val todayWatchedCount = mStateBean.getTodayWatchedCount()
|
||||||
|
|
||||||
|
mStateBean.getSubTaskRewardState().forEachIndexed { index, subTaskState ->
|
||||||
|
val targetCount = subTaskState.mTargetAdCount
|
||||||
|
when(subTaskState.state) {
|
||||||
|
STATE_ONGOING -> {
|
||||||
|
if (todayWatchedCount >= targetCount) {
|
||||||
|
subTaskState.state = STATE_FINISH
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected fun isTodayStatusBean(stateBean: TaskStateWatchAd): Boolean {
|
||||||
|
return DateUtil.isToday(stateBean.todayMs)
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun isTodayStatusBean(stateBean: TaskStateWatchVideo): Boolean {
|
||||||
|
return DateUtil.isToday(stateBean.todayMs)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.gamedog.vididin.manager.helpers
|
||||||
|
|
||||||
|
import com.ama.core.architecture.util.SpUtil
|
||||||
|
import com.ama.core.architecture.util.eventbus.NotifyMan
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
|
abstract class BaseTaskHelper<T: Any, C: Any> {
|
||||||
|
abstract val mSpKey: String
|
||||||
|
protected lateinit var mStateBean: T
|
||||||
|
protected lateinit var mTaskConfig: C
|
||||||
|
private var mEventCallback: NotifyMan.ICallback? = null
|
||||||
|
|
||||||
|
abstract fun loadTaskFromSp()
|
||||||
|
|
||||||
|
suspend fun setConfigDatas(taskConfig: C) {
|
||||||
|
mTaskConfig = taskConfig
|
||||||
|
|
||||||
|
return withContext(Dispatchers.IO) {
|
||||||
|
loadTaskFromSp()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun onDateChanged() {
|
||||||
|
// TODO - sub class override this methods if daily task
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected fun registerEvents(onEvents: ((NotifyMan.NotifyData<*>?)->Unit), vararg eventTypes: Int) {
|
||||||
|
if (mEventCallback == null) {
|
||||||
|
mEventCallback = object : NotifyMan.ICallback(true) {
|
||||||
|
override fun onEvent(data: NotifyMan.NotifyData<*>?) {
|
||||||
|
onEvents.invoke(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NotifyMan.instance().register(mEventCallback, *eventTypes)
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun saveState2Sp() {
|
||||||
|
SpUtil.instance().putObject(mSpKey, mStateBean)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getStatusBean() : T {
|
||||||
|
return mStateBean
|
||||||
|
}
|
||||||
|
|
||||||
|
fun release() {
|
||||||
|
NotifyMan.instance().unregister(mEventCallback)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,287 @@
|
||||||
|
package com.gamedog.vididin.manager.helpers
|
||||||
|
|
||||||
|
import com.ama.core.architecture.util.DateUtil
|
||||||
|
import com.ama.core.architecture.util.SpUtil
|
||||||
|
import com.ama.core.architecture.util.eventbus.NotifyMan
|
||||||
|
import com.vididin.real.money.game.R
|
||||||
|
import com.gamedog.vididin.VididinEvents
|
||||||
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
|
import com.gamedog.vididin.main.fragments.task.BoxTaskRoot
|
||||||
|
import com.gamedog.vididin.manager.TaskManager.Companion.BOX_SUB_TASK_TYPE_ZERO_BUY
|
||||||
|
import com.gamedog.vididin.manager.TaskManager.Companion.BOX_SUB_TASK_TYPE_SIGN
|
||||||
|
import com.gamedog.vididin.manager.TaskManager.Companion.BOX_SUB_TASK_TYPE_AD
|
||||||
|
import com.gamedog.vididin.manager.TaskManager.Companion.BOX_SUB_TASK_TYPE_VIDEO
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.TaskStateBox
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.TaskStateBoxRoot
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.TaskStateBoxSub
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.BaseTaskState.Companion.STATE_FINISH
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.BaseTaskState.Companion.STATE_ONGOING
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.BaseTaskState.Companion.STATE_CLAIMED
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.BaseTaskState.Companion.STATE_EXPIRED
|
||||||
|
|
||||||
|
|
||||||
|
class BoxTaskHelper: BaseTaskHelper<TaskStateBoxRoot, BoxTaskRoot>() {
|
||||||
|
|
||||||
|
override val mSpKey = SpUtil.KEY_TASK_BOX
|
||||||
|
|
||||||
|
init {
|
||||||
|
registerEvents( { eventData->
|
||||||
|
when (eventData?.mEventType) {
|
||||||
|
VididinEvents.EVENT_FINISHED_ONE_AD -> {
|
||||||
|
handleEvents(BOX_SUB_TASK_TYPE_AD)
|
||||||
|
}
|
||||||
|
|
||||||
|
VididinEvents.Event_Finish_One_Video -> {
|
||||||
|
handleEvents(BOX_SUB_TASK_TYPE_VIDEO)
|
||||||
|
}
|
||||||
|
|
||||||
|
VididinEvents.Event_Finish_One_Sign -> {
|
||||||
|
handleEvents(BOX_SUB_TASK_TYPE_SIGN)
|
||||||
|
}
|
||||||
|
|
||||||
|
VididinEvents.Event_Finish_One_Zerobuy -> {
|
||||||
|
handleEvents(BOX_SUB_TASK_TYPE_ZERO_BUY)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}, VididinEvents.EVENT_FINISHED_ONE_AD, VididinEvents.Event_Finish_One_Video,
|
||||||
|
VididinEvents.Event_Finish_One_Sign, VididinEvents.Event_Finish_One_Zerobuy)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun loadTaskFromSp() {
|
||||||
|
val taskStateBeanInSp = SpUtil.instance().getObject<TaskStateBoxRoot>(mSpKey)
|
||||||
|
if (taskStateBeanInSp == null || isBoxRootTaskExpired(taskStateBeanInSp)) {
|
||||||
|
mStateBean = generateStateBeanFromConfig()
|
||||||
|
saveState2Sp()
|
||||||
|
} else {
|
||||||
|
mStateBean = taskStateBeanInSp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun generateStateBeanFromConfig(): TaskStateBoxRoot {
|
||||||
|
val boxStateList = mutableListOf<TaskStateBox>()
|
||||||
|
mTaskConfig.chests.forEachIndexed { index, task ->
|
||||||
|
val boxSubTaskStateList = mutableListOf<TaskStateBoxSub>()
|
||||||
|
task.tasks.forEachIndexed { index, task ->
|
||||||
|
boxSubTaskStateList.add(TaskStateBoxSub(task.task_id,
|
||||||
|
task.task_name, task.required_count, task.task_type))
|
||||||
|
}
|
||||||
|
|
||||||
|
boxStateList.add(TaskStateBox(task.chest_id, task.chest_name, task.duration_days,
|
||||||
|
task.reward_type, task.reward_value, task.is_one_time, task.status, boxSubTaskStateList))
|
||||||
|
}
|
||||||
|
|
||||||
|
return TaskStateBoxRoot(DateUtil.getTodayStartTimeMs(), boxStateList)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
|
private fun handleEvents(taskType: Int) {
|
||||||
|
val currentBoxIndex = getCurrentBoxIndex()
|
||||||
|
if (!isBoxAllFinished(currentBoxIndex)) {
|
||||||
|
getCurrentBoxState()?.tasks?.forEachIndexed { index, subTask->
|
||||||
|
if (taskType == subTask.task_type
|
||||||
|
&& !isBoxSubTaskFinished(currentBoxIndex, index)) {
|
||||||
|
subTask.finishedNum++
|
||||||
|
saveState2Sp()
|
||||||
|
|
||||||
|
notifyEvent()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun notifyEvent() {
|
||||||
|
NotifyMan.instance().sendEvent(VididinEvents.EVENT_BOX_TASK_STATE_CHANGED, null)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun isBoxRootTaskExpired(taskStateBoxRoot: TaskStateBoxRoot): Boolean {
|
||||||
|
var totalDurationDays = 0
|
||||||
|
taskStateBoxRoot.tasks.forEach {
|
||||||
|
totalDurationDays += it.duration_days
|
||||||
|
}
|
||||||
|
return DateUtil.isPeriodExpired(taskStateBoxRoot.startMs, totalDurationDays)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isBoxTaskExpired(boxIndex: Int): Boolean {
|
||||||
|
if (boxIndex >= 0 && boxIndex < mStateBean.tasks.size) {
|
||||||
|
val curBoxState = mStateBean.tasks[boxIndex]
|
||||||
|
return DateUtil.isPeriodExpired(mStateBean.startMs, curBoxState.duration_days)
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isBoxAllTasksFinish(boxIndex: Int) : Boolean {
|
||||||
|
if (boxIndex >= 0 && boxIndex < mStateBean.tasks.size) {
|
||||||
|
val curBoxState = mStateBean.tasks[boxIndex]
|
||||||
|
|
||||||
|
curBoxState.tasks.forEach {
|
||||||
|
if (it.required_count > it.finishedNum) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getCurrentBoxIndex(): Int {
|
||||||
|
val boxRootStartMs = mStateBean.startMs
|
||||||
|
|
||||||
|
mStateBean.tasks.forEachIndexed { index, box ->
|
||||||
|
if (!DateUtil.isPeriodExpired(boxRootStartMs, box.duration_days)) {
|
||||||
|
return index
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getCurrentBoxState(): TaskStateBox? {
|
||||||
|
val currentBoxIndex = getCurrentBoxIndex()
|
||||||
|
|
||||||
|
if (currentBoxIndex >= 0 && currentBoxIndex < mStateBean.tasks.size) {
|
||||||
|
return mStateBean.tasks[currentBoxIndex]
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
fun isBoxAllFinished(boxIndex: Int) : Boolean {
|
||||||
|
val stateEnum = getBoxStateEnum(boxIndex)
|
||||||
|
return stateEnum == STATE_FINISH || stateEnum == STATE_CLAIMED
|
||||||
|
}
|
||||||
|
|
||||||
|
fun isBoxSubTaskFinished(boxIndex: Int, subTaskIndex: Int) : Boolean {
|
||||||
|
val subTaskState = mStateBean.tasks[boxIndex].tasks[subTaskIndex]
|
||||||
|
return subTaskState.finishedNum >= subTaskState.required_count
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getBoxStateEnum(boxIndex: Int): Int {
|
||||||
|
if (boxIndex >= 0 && boxIndex < mStateBean.tasks.size) {
|
||||||
|
val curBoxState = mStateBean.tasks[boxIndex]
|
||||||
|
|
||||||
|
if (curBoxState.hasClaimedReward) {
|
||||||
|
return STATE_CLAIMED
|
||||||
|
} else {
|
||||||
|
if (isBoxAllTasksFinish(boxIndex)) {
|
||||||
|
return STATE_FINISH
|
||||||
|
} else {
|
||||||
|
if (isBoxTaskExpired(boxIndex)) {
|
||||||
|
return STATE_EXPIRED
|
||||||
|
} else {
|
||||||
|
return STATE_ONGOING
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getCouldClaimCashNum(): Float {
|
||||||
|
var waitClaimCashNum = 0F
|
||||||
|
mStateBean.tasks.forEachIndexed { index, box ->
|
||||||
|
if (getBoxStateEnum(index) == STATE_FINISH) {
|
||||||
|
waitClaimCashNum += box.reward_value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return waitClaimCashNum
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getSubTaskHintStrRes(boxIndex: Int, subTaskIndex: Int): Int {
|
||||||
|
when (boxIndex) {
|
||||||
|
0-> {
|
||||||
|
when (subTaskIndex) {
|
||||||
|
0-> {
|
||||||
|
return R.string.box_subtask_hint_1_1
|
||||||
|
}
|
||||||
|
|
||||||
|
1-> {
|
||||||
|
return R.string.box_subtask_hint_1_2
|
||||||
|
}
|
||||||
|
|
||||||
|
2-> {
|
||||||
|
return R.string.box_subtask_hint_1_3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
1-> {
|
||||||
|
when (subTaskIndex) {
|
||||||
|
0-> {
|
||||||
|
return R.string.box_subtask_hint_2_1
|
||||||
|
}
|
||||||
|
|
||||||
|
1-> {
|
||||||
|
return R.string.box_subtask_hint_2_2
|
||||||
|
}
|
||||||
|
|
||||||
|
2-> {
|
||||||
|
return R.string.box_subtask_hint_2_3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
2-> {
|
||||||
|
when (subTaskIndex) {
|
||||||
|
0-> {
|
||||||
|
return R.string.box_subtask_hint_3_1
|
||||||
|
}
|
||||||
|
|
||||||
|
1-> {
|
||||||
|
return R.string.box_subtask_hint_3_2
|
||||||
|
}
|
||||||
|
|
||||||
|
2-> {
|
||||||
|
return R.string.box_subtask_hint_3_3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getCurrentBoxTotalProgress(): Int {
|
||||||
|
val currentBoxIndex = getCurrentBoxIndex()
|
||||||
|
val boxList = mStateBean.tasks
|
||||||
|
if (currentBoxIndex >= 0 && currentBoxIndex < boxList.size) {
|
||||||
|
var totalFinished = 0
|
||||||
|
var totalRequired = 0
|
||||||
|
val currentBox = boxList[currentBoxIndex]
|
||||||
|
|
||||||
|
currentBox.tasks.forEach {
|
||||||
|
totalFinished += it.finishedNum
|
||||||
|
totalRequired += it.required_count
|
||||||
|
}
|
||||||
|
|
||||||
|
if (totalRequired > 0) {
|
||||||
|
val totalProgress = (100 * totalFinished) / totalRequired
|
||||||
|
return if (totalProgress > 100) 100 else totalProgress
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fun executeClaimCash(): Boolean {
|
||||||
|
try {
|
||||||
|
val couldClaimCashNum = getCouldClaimCashNum()
|
||||||
|
if (couldClaimCashNum > 0F) {
|
||||||
|
AccountManager.addCash(couldClaimCashNum)
|
||||||
|
mStateBean.tasks.forEachIndexed { index, box ->
|
||||||
|
if (getBoxStateEnum(index) == STATE_FINISH) {
|
||||||
|
box.hasClaimedReward = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
saveState2Sp()
|
||||||
|
notifyEvent()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,135 @@
|
||||||
|
package com.gamedog.vididin.manager.helpers
|
||||||
|
|
||||||
|
import com.ama.core.architecture.util.DateUtil
|
||||||
|
import com.ama.core.architecture.util.SpUtil
|
||||||
|
import com.ama.core.architecture.util.eventbus.NotifyMan
|
||||||
|
import com.gamedog.vididin.VididinEvents
|
||||||
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
|
import com.gamedog.vididin.main.fragments.task.Task
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.TaskDailySignBean
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.DailySignDayInfoBean
|
||||||
|
|
||||||
|
|
||||||
|
class DailySignTaskHelper : BaseTaskHelper<TaskDailySignBean, Task>() {
|
||||||
|
private var mCurDayIndexDailySign: Int = 0
|
||||||
|
override val mSpKey = SpUtil.KEY_TASK_BEAN
|
||||||
|
|
||||||
|
|
||||||
|
override fun loadTaskFromSp() {
|
||||||
|
val taskStateBeanInSp = SpUtil.instance().getObject<TaskDailySignBean>(mSpKey)
|
||||||
|
if (taskStateBeanInSp == null) {
|
||||||
|
mStateBean = TaskDailySignBean()
|
||||||
|
saveState2Sp()
|
||||||
|
} else {
|
||||||
|
mStateBean = taskStateBeanInSp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getCurDayIndexOfDailyCheckIn() : Int {
|
||||||
|
var dayIndexOfPeriod = 0
|
||||||
|
|
||||||
|
val periodStartMs = mStateBean.startDurationMs
|
||||||
|
if (periodStartMs > 0) {
|
||||||
|
dayIndexOfPeriod = DateUtil.getPassedDayNum(periodStartMs, DateUtil.getCurTimeMs())
|
||||||
|
if (dayIndexOfPeriod > 6) {
|
||||||
|
mStateBean?.startDurationMs = DateUtil.getCurTimeMs()
|
||||||
|
saveState2Sp()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mStateBean?.startDurationMs = DateUtil.getCurTimeMs()
|
||||||
|
saveState2Sp()
|
||||||
|
}
|
||||||
|
|
||||||
|
mCurDayIndexDailySign = dayIndexOfPeriod
|
||||||
|
return dayIndexOfPeriod
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getDailySignStateBean(dayIndex: Int): DailySignDayInfoBean {
|
||||||
|
return mStateBean.signStateList[dayIndex]
|
||||||
|
}
|
||||||
|
|
||||||
|
fun executeDailySign(dayIndex: Int, isDoubleReward: Boolean, isByAd: Boolean) : Boolean {
|
||||||
|
val daySignState = mStateBean.signStateList[dayIndex]
|
||||||
|
|
||||||
|
if (!daySignState.hasSigned || (dayIndex == mCurDayIndexDailySign && !daySignState.hasWatchedAd)) {
|
||||||
|
val dayReward = getRewardNumOfDailySign(dayIndex)
|
||||||
|
val finalReward = if (isDoubleReward) 2*dayReward else dayReward
|
||||||
|
daySignState.hasRewardedNum += finalReward
|
||||||
|
daySignState.hasSigned = true
|
||||||
|
daySignState.hasWatchedAd = isByAd
|
||||||
|
saveState2Sp()
|
||||||
|
AccountManager.addGold(finalReward)
|
||||||
|
notifySignStateChanged(Pair(dayIndex, daySignState))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun notifySignStateChanged(dataPair: Pair<Int, DailySignDayInfoBean>) {
|
||||||
|
NotifyMan.instance().sendEvent(VididinEvents.Event_Sign_State_Changed, NotifyMan.NotifyData(dataPair))
|
||||||
|
NotifyMan.instance().sendEvent(VididinEvents.Event_Finish_One_Sign, null)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun generateTestDailySignTestBean() {
|
||||||
|
mStateBean = TaskDailySignBean().apply {
|
||||||
|
startDurationMs = DateUtil.getCurTimeMs() - 4 * DateUtil.MS_NUM_ONE_DAY
|
||||||
|
signStateList.clear()
|
||||||
|
signStateList.add(DailySignDayInfoBean(hasSigned = true, hasWatchedAd = true))
|
||||||
|
signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false))
|
||||||
|
signStateList.add(DailySignDayInfoBean(hasSigned = true, hasWatchedAd = false))
|
||||||
|
signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false))
|
||||||
|
signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false))
|
||||||
|
signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false))
|
||||||
|
signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false))
|
||||||
|
}
|
||||||
|
|
||||||
|
saveState2Sp()
|
||||||
|
AccountManager.saveBankAccount(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getForgotSignDays(): Int {
|
||||||
|
var forgotSignDays = 0
|
||||||
|
val curDayIndex = getCurDayIndexOfDailyCheckIn()
|
||||||
|
mStateBean.signStateList.forEachIndexed { index, item->
|
||||||
|
if (!item.hasSigned && index < curDayIndex) {
|
||||||
|
forgotSignDays++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return forgotSignDays
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getSignDaysTotal(): Int {
|
||||||
|
var signDays = 0
|
||||||
|
mStateBean.signStateList.forEachIndexed { index, item->
|
||||||
|
if (item.hasSigned) {
|
||||||
|
signDays++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return signDays
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getForgotSignFirstDayIndex(): Int {
|
||||||
|
val curDayIndex = getCurDayIndexOfDailyCheckIn()
|
||||||
|
mStateBean.signStateList.forEachIndexed { index, item->
|
||||||
|
if (!item.hasSigned && index < curDayIndex) {
|
||||||
|
return index
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun getDayStateList(): List<DailySignDayInfoBean> {
|
||||||
|
return mStateBean.signStateList
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getRewardNumOfDailySign(dayIndex: Int) : Int {
|
||||||
|
return mTaskConfig.reward_details[dayIndex].value
|
||||||
|
}
|
||||||
|
|
||||||
|
fun isDailySignAllOperationDone(): Boolean {
|
||||||
|
val curDayState = getDailySignStateBean(mCurDayIndexDailySign)
|
||||||
|
return curDayState.hasSigned && curDayState.hasWatchedAd && getForgotSignFirstDayIndex() <= 0
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
package com.gamedog.vididin.manager.helpers
|
||||||
|
|
||||||
|
import com.ama.core.architecture.util.DateUtil
|
||||||
|
import com.ama.core.architecture.util.SpUtil
|
||||||
|
import com.ama.core.architecture.util.eventbus.NotifyMan
|
||||||
|
import com.gamedog.vididin.VididinEvents
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.TaskStateWatchAd
|
||||||
|
|
||||||
|
|
||||||
|
class DailyWatchAdTaskHelper : BaseDailyTaskHelper<TaskStateWatchAd>() {
|
||||||
|
|
||||||
|
override val mSpKey = SpUtil.KEY_DAILY_WATCH_AD_FOR_GOLD
|
||||||
|
|
||||||
|
|
||||||
|
init {
|
||||||
|
registerEvents( { eventData->
|
||||||
|
val watchedAdNum: Int = eventData?.mData as Int
|
||||||
|
handleOneAdWatched(watchedAdNum)
|
||||||
|
}, VididinEvents.EVENT_FINISHED_ONE_AD)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun loadTaskFromSp() {
|
||||||
|
val spStateBean = SpUtil.instance().getObject<TaskStateWatchAd>(mSpKey)
|
||||||
|
if (spStateBean == null || !isTodayStatusBean(spStateBean)) {
|
||||||
|
generateTodayTask()
|
||||||
|
} else {
|
||||||
|
mStateBean = spStateBean
|
||||||
|
notifyEvents()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun generateTodayTask() {
|
||||||
|
mStateBean = TaskStateWatchAd(DateUtil.getCurTimeMs())
|
||||||
|
mStateBean.initSubTaskRewardList(mTaskConfig.reward_details)
|
||||||
|
saveState2Sp()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun notifyEvents() {
|
||||||
|
NotifyMan.instance().sendEvent(VididinEvents.EVENT_DAILY_WATCHED_AD_NUM_CHANGED, null)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleOneAdWatched(newAdWatchedNum: Int) {
|
||||||
|
mStateBean.run {
|
||||||
|
if (!isAllTaskFinish()) {
|
||||||
|
addWatchedCount(newAdWatchedNum)
|
||||||
|
calculateNewState()
|
||||||
|
saveState2Sp()
|
||||||
|
notifyEvents()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
package com.gamedog.vididin.manager.helpers
|
||||||
|
|
||||||
|
|
||||||
|
import com.ama.core.architecture.util.DateUtil
|
||||||
|
import com.ama.core.architecture.util.SpUtil
|
||||||
|
import com.ama.core.architecture.util.eventbus.NotifyMan
|
||||||
|
import com.gamedog.vididin.VididinEvents
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.TaskStateWatchAd
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.TaskStateWatchVideo
|
||||||
|
|
||||||
|
|
||||||
|
class DailyWatchVideoTaskHelper : BaseDailyTaskHelper<TaskStateWatchVideo>() {
|
||||||
|
|
||||||
|
override val mSpKey = SpUtil.KEY_DAILY_WATCH_VIDEO
|
||||||
|
|
||||||
|
|
||||||
|
init {
|
||||||
|
registerEvents( { eventData->
|
||||||
|
val dataPair: Pair<String, Long> = eventData?.mData as Pair<String, Long>
|
||||||
|
handleOneVideoWatched(dataPair)
|
||||||
|
}, VididinEvents.Event_Finish_One_Video)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun loadTaskFromSp() {
|
||||||
|
val spStateBean = SpUtil.instance().getObject<TaskStateWatchVideo>(mSpKey)
|
||||||
|
if (spStateBean == null || !isTodayStatusBean(spStateBean)) {
|
||||||
|
generateTodayTask()
|
||||||
|
} else {
|
||||||
|
mStateBean = spStateBean
|
||||||
|
notifyEvents()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun generateTodayTask() {
|
||||||
|
mStateBean = TaskStateWatchVideo(DateUtil.getCurTimeMs())
|
||||||
|
mStateBean.initSubTaskRewardList(mTaskConfig.reward_details)
|
||||||
|
saveState2Sp()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun notifyEvents() {
|
||||||
|
NotifyMan.instance().sendEvent(VididinEvents.EVENT_DAILY_WATCHED_VIDEO_NUM_CHANGED, null)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun handleOneVideoWatched(dataPair: Pair<String, Long>) {
|
||||||
|
mStateBean.run {
|
||||||
|
if (!isAllTaskFinish()) {
|
||||||
|
if (addWatchedVideoInfo(dataPair)) {
|
||||||
|
calculateNewState()
|
||||||
|
saveState2Sp()
|
||||||
|
notifyEvents()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
package com.gamedog.vididin.manager.helpers
|
||||||
|
|
||||||
|
|
||||||
|
import com.ama.core.architecture.util.SpUtil
|
||||||
|
import com.ama.core.architecture.util.eventbus.NotifyMan
|
||||||
|
import com.gamedog.vididin.VididinEvents
|
||||||
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
|
import com.gamedog.vididin.main.fragments.task.Task
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.TaskStateNewBieEnableNotify
|
||||||
|
|
||||||
|
class NewbieEnableNotifyHelper: BaseTaskHelper<TaskStateNewBieEnableNotify, Task>() {
|
||||||
|
|
||||||
|
override val mSpKey = SpUtil.KEY_NEWBIE_ENABLE_NOTIFY
|
||||||
|
|
||||||
|
|
||||||
|
override fun loadTaskFromSp() {
|
||||||
|
val taskStateBeanInSp = SpUtil.instance().getObject<TaskStateNewBieEnableNotify>(mSpKey)
|
||||||
|
if (taskStateBeanInSp == null) {
|
||||||
|
mStateBean = generateStateBeanFromConfig()
|
||||||
|
saveState2Sp()
|
||||||
|
} else {
|
||||||
|
mStateBean = taskStateBeanInSp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun generateStateBeanFromConfig(): TaskStateNewBieEnableNotify {
|
||||||
|
return TaskStateNewBieEnableNotify(mTaskConfig.reward_value)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun claimReward() : Boolean {
|
||||||
|
if (!mStateBean.hasClaimReward) {
|
||||||
|
AccountManager.addGold(mStateBean.rewardGoldNum)
|
||||||
|
mStateBean.hasClaimReward = true
|
||||||
|
saveState2Sp()
|
||||||
|
notifyStateChangeEvent()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun notifyStateChangeEvent() {
|
||||||
|
NotifyMan.instance().sendEvent(VididinEvents.EVENT_NEWBIE_NOTIFY_TASK_CHANGED, null)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
package com.gamedog.vididin.manager.helpers
|
||||||
|
|
||||||
|
import com.ama.core.architecture.util.SpUtil
|
||||||
|
import com.ama.core.architecture.util.eventbus.NotifyMan
|
||||||
|
import com.gamedog.vididin.VididinEvents
|
||||||
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
|
import com.gamedog.vididin.main.fragments.task.Task
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.TaskStateNewBieFirstWithDraw
|
||||||
|
|
||||||
|
class NewbieFirstWithdrawHelper: BaseTaskHelper<TaskStateNewBieFirstWithDraw, Task>() {
|
||||||
|
|
||||||
|
override val mSpKey = SpUtil.KEY_NEWBIE_FIRST_WITHDRAW
|
||||||
|
|
||||||
|
override fun loadTaskFromSp() {
|
||||||
|
val taskStateBeanInSp = SpUtil.instance().getObject<TaskStateNewBieFirstWithDraw>(mSpKey)
|
||||||
|
if (taskStateBeanInSp == null) {
|
||||||
|
mStateBean = generateStateBeanFromConfig()
|
||||||
|
saveState2Sp()
|
||||||
|
} else {
|
||||||
|
mStateBean = taskStateBeanInSp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun generateStateBeanFromConfig(): TaskStateNewBieFirstWithDraw {
|
||||||
|
return TaskStateNewBieFirstWithDraw(mTaskConfig.reward_value)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun claimReward(): Boolean {
|
||||||
|
if (!mStateBean.hasClaimReward) {
|
||||||
|
AccountManager.addGold(mStateBean.rewardGoldNum)
|
||||||
|
mStateBean.hasClaimReward = true
|
||||||
|
saveState2Sp()
|
||||||
|
notifyStateChangeEvent()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun notifyStateChangeEvent() {
|
||||||
|
NotifyMan.instance().sendEvent(VididinEvents.EVENT_NEWBIE_FIRST_WITHDRAW_TASK_CHANGED, null)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
package com.gamedog.vididin.manager.helpers
|
||||||
|
|
||||||
|
import com.ama.core.architecture.util.SpUtil
|
||||||
|
import com.ama.core.architecture.util.eventbus.NotifyMan
|
||||||
|
import com.gamedog.vididin.VididinEvents
|
||||||
|
import com.gamedog.vididin.core.login.login.AccountManager
|
||||||
|
import com.gamedog.vididin.main.fragments.task.Task
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.TaskStateNewBieJoinDiscord
|
||||||
|
|
||||||
|
class NewbieJoinDiscordHelper: BaseTaskHelper<TaskStateNewBieJoinDiscord, Task>() {
|
||||||
|
|
||||||
|
override val mSpKey = SpUtil.KEY_NEWBIE_JOIN_DISCORD
|
||||||
|
|
||||||
|
override fun loadTaskFromSp() {
|
||||||
|
val taskStateBeanInSp = SpUtil.instance().getObject<TaskStateNewBieJoinDiscord>(mSpKey)
|
||||||
|
if (taskStateBeanInSp == null) {
|
||||||
|
mStateBean = generateStateBeanFromConfig()
|
||||||
|
saveState2Sp()
|
||||||
|
} else {
|
||||||
|
mStateBean = taskStateBeanInSp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun generateStateBeanFromConfig(): TaskStateNewBieJoinDiscord {
|
||||||
|
return TaskStateNewBieJoinDiscord(mTaskConfig.reward_value)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun claimReward() : Boolean {
|
||||||
|
if (!mStateBean.hasClaimReward) {
|
||||||
|
AccountManager.addGold(mStateBean.rewardGoldNum)
|
||||||
|
mStateBean.hasClaimReward = true
|
||||||
|
saveState2Sp()
|
||||||
|
notifyStateChangeEvent()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun notifyStateChangeEvent() {
|
||||||
|
NotifyMan.instance().sendEvent(VididinEvents.EVENT_NEWBIE_DISCORD_TASK_CHANGED, null)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
package com.gamedog.vididin.manager.taskbeans
|
||||||
|
|
||||||
|
import com.gamedog.vididin.main.fragments.task.RewardDetail
|
||||||
|
import com.gamedog.vididin.manager.taskbeans.BaseTaskState.Companion.STATE_ONGOING
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
import kotlin.collections.forEach
|
||||||
|
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
abstract class BaseDailyTaskState : BaseTaskState() {
|
||||||
|
protected val mSubTaskRewardState: MutableList<SubDailyTaskBean> = mutableListOf()
|
||||||
|
|
||||||
|
abstract fun getTodayWatchedCount(): Int
|
||||||
|
abstract fun addWatchedCount(newWatchedNum: Int)
|
||||||
|
abstract fun addWatchedVideoInfo(dataPair: Pair<String, Long>): Boolean
|
||||||
|
|
||||||
|
|
||||||
|
fun getSubTaskRewardState(): List<SubDailyTaskBean> {
|
||||||
|
return mSubTaskRewardState
|
||||||
|
}
|
||||||
|
|
||||||
|
fun isAllTaskFinish(): Boolean {
|
||||||
|
return mSubTaskRewardState.all { it.state >= STATE_CLAIMED }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun initSubTaskRewardList(subTasks: List<RewardDetail>) {
|
||||||
|
mSubTaskRewardState.clear()
|
||||||
|
|
||||||
|
subTasks.forEach {
|
||||||
|
mSubTaskRewardState.add(SubDailyTaskBean(it.value, it.target_count, STATE_ONGOING))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class SubDailyTaskBean(
|
||||||
|
val mRewardNum: Int,
|
||||||
|
val mTargetAdCount: Int,
|
||||||
|
var state: Int = STATE_ONGOING,)
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.gamedog.vididin.manager.taskbeans
|
||||||
|
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
abstract class BaseTaskState {
|
||||||
|
companion object {
|
||||||
|
const val STATE_ONGOING = 0
|
||||||
|
const val STATE_FINISH = 1
|
||||||
|
const val STATE_CLAIMED = 2
|
||||||
|
const val STATE_EXPIRED = 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,22 +1,12 @@
|
||||||
package com.gamedog.vididin.manager
|
package com.gamedog.vididin.manager.taskbeans
|
||||||
|
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
|
|
||||||
|
|
||||||
|
data class TaskDailySignBean(
|
||||||
|
var startDurationMs: Long = 0,
|
||||||
data class DailySignBean(
|
|
||||||
var startMs: Long = 0,
|
|
||||||
val signStateList: MutableList<DailySignDayInfoBean> = mutableListOf()
|
val signStateList: MutableList<DailySignDayInfoBean> = mutableListOf()
|
||||||
|
): BaseTaskState() {
|
||||||
): Serializable {
|
|
||||||
companion object{
|
|
||||||
const val SIGN_STATE_ENABLE = 1
|
|
||||||
const val SIGN_STATE_DISABLE = 2
|
|
||||||
const val SIGN_STATE_DONE = 3
|
|
||||||
const val SIGN_STATE_FORGOT = 4
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
signStateList.add(DailySignDayInfoBean())
|
signStateList.add(DailySignDayInfoBean())
|
||||||
signStateList.add(DailySignDayInfoBean())
|
signStateList.add(DailySignDayInfoBean())
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
package com.gamedog.vididin.manager.taskbeans
|
||||||
|
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
data class TaskStateBoxRoot(
|
||||||
|
val startMs: Long = 0,
|
||||||
|
val tasks: List<TaskStateBox>
|
||||||
|
): Serializable
|
||||||
|
|
||||||
|
data class TaskStateBox(
|
||||||
|
val chest_id: String,
|
||||||
|
val chest_name: String,
|
||||||
|
val duration_days: Int,
|
||||||
|
val reward_type: String,
|
||||||
|
val reward_value: Float,
|
||||||
|
val is_one_time: Boolean,
|
||||||
|
val status: String,
|
||||||
|
val tasks: List<TaskStateBoxSub>,
|
||||||
|
|
||||||
|
// new added
|
||||||
|
var hasClaimedReward: Boolean = false,
|
||||||
|
): Serializable
|
||||||
|
|
||||||
|
data class TaskStateBoxSub(
|
||||||
|
val task_id: String,
|
||||||
|
val task_name: String,
|
||||||
|
val required_count: Int,
|
||||||
|
val task_type: Int, // This added by self for decide which task should be execute, detail see: #TaskManager.companion
|
||||||
|
|
||||||
|
// new added
|
||||||
|
var finishedNum: Int = 0,
|
||||||
|
): Serializable
|
||||||
|
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue