diff --git a/Android_Mireo/app/build.gradle b/Android_Mireo/app/build.gradle index 9049d95..89c2cd3 100644 --- a/Android_Mireo/app/build.gradle +++ b/Android_Mireo/app/build.gradle @@ -1,15 +1,15 @@ apply plugin: 'com.android.application' -apply plugin: 'android-aspectjx' apply plugin: 'kotlin-kapt' +apply plugin: 'com.google.gms.google-services' +apply plugin: 'com.google.firebase.crashlytics' +apply plugin: 'com.google.firebase.firebase-perf' apply from: '../common.gradle' android { - defaultConfig { - applicationId 'com.localee.mireo.app' - resConfigs 'zh' + applicationId 'com.localee.mireo.shortapp' resConfigs 'xxhdpi' proguardFiles 'proguard-sdk.pro', 'proguard-app.pro' buildConfigField('boolean', 'LOG_ENABLE', '' + LOG_ENABLE + '') @@ -35,7 +35,7 @@ android { debug { - applicationIdSuffix '.debug' +// applicationIdSuffix '.debug' debuggable true jniDebuggable true zipAlignEnabled false @@ -77,9 +77,7 @@ android { exclude 'META-INF/*******' } - aspectjx { - include android.defaultConfig.applicationId - } + applicationVariants.all { variant -> variant.outputs.all { output -> @@ -90,13 +88,18 @@ android { outputFileName += '.apk' } } + + sourceSets { + main { + res.srcDirs( + 'src/main/res', + 'src/main/res-sw', + ) + } + } } dependencies { - implementation project(':library:base') - implementation project(':library:widget') - - implementation 'com.github.getActivity:XXPermissions:12.3' implementation 'com.github.getActivity:TitleBar:9.2' @@ -108,26 +111,16 @@ dependencies { implementation 'com.google.code.gson:gson:2.8.8' implementation 'com.github.getActivity:GsonFactory:5.2' - implementation 'com.github.getActivity:ShapeView:9.0' - - implementation 'org.aspectj:aspectjrt:1.9.6' + implementation 'com.github.getActivity:ShapeView:9.6' implementation 'com.github.bumptech.glide:glide:4.12.0' kapt 'com.github.bumptech.glide:compiler:4.12.0' implementation 'com.gyf.immersionbar:immersionbar:3.0.0' - implementation 'com.github.Baseflow:PhotoView:2.3.0' - - implementation 'com.airbnb.android:lottie:4.1.0' - implementation 'com.scwang.smart:refresh-layout-kernel:2.0.3' implementation 'com.scwang.smart:refresh-header-material:2.0.3' - implementation 'com.jakewharton.timber:timber:4.7.1' - - implementation 'me.relex:circleindicator:2.1.6' - implementation 'com.tencent:mmkv-static:1.2.10' // banner @@ -135,8 +128,8 @@ dependencies { implementation "io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.4" - implementation "com.afollestad.material-dialogs:core:3.1.1" - implementation "com.afollestad.material-dialogs:lifecycle:3.1.1" + implementation "com.afollestad.material-dialogs:core:3.3.0" + implementation "com.afollestad.material-dialogs:lifecycle:3.3.0" implementation "androidx.media3:media3-ui:1.4.0" implementation "androidx.media3:media3-exoplayer:1.4.0" @@ -148,5 +141,20 @@ dependencies { implementation("com.blankj:utilcodex:1.31.1") implementation("com.github.li-xiaojun:XPopup:2.10.0") + implementation("com.facebook.android:facebook-android-sdk:17.0.2") + + implementation("com.adjust.sdk:adjust-android:5.2.0") + implementation("com.adjust.sdk:adjust-android-webbridge:5.2.0") + implementation("com.android.installreferrer:installreferrer:2.2") + + implementation("com.android.billingclient:billing:7.0.0") + + implementation(platform("com.google.firebase:firebase-bom:32.3.1")) + implementation("com.google.firebase:firebase-messaging-ktx:24.0.0") + implementation("androidx.work:work-runtime-ktx:2.9.1") + implementation("com.google.firebase:firebase-analytics-ktx") + implementation("com.google.firebase:firebase-crashlytics") + implementation("com.google.firebase:firebase-perf") + implementation("com.github.centerzx:ShapeBlurView:1.0.5") } \ No newline at end of file diff --git a/Android_Mireo/app/google-services.json b/Android_Mireo/app/google-services.json new file mode 100644 index 0000000..76733e9 --- /dev/null +++ b/Android_Mireo/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "905575925094", + "project_id": "mireotv", + "storage_bucket": "mireotv.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:905575925094:android:01c39ac6692cb6bda974a7", + "android_client_info": { + "package_name": "com.localee.mireo.shortapp" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyBAC_RDCSdtba_yMQ0oXjKTstaMe6WzHmc" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/Android_Mireo/app/proguard-app.pro b/Android_Mireo/app/proguard-app.pro index 692091e..67f4112 100644 --- a/Android_Mireo/app/proguard-app.pro +++ b/Android_Mireo/app/proguard-app.pro @@ -1,5 +1,175 @@ #-ignorewarning +-keep public class * extends androidx.appcompat.app.AppCompatActivity +-keep public class * extends androidx.fragment.app.Fragment +-keep public class * extends android.app.Application +-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.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class * extends android.view.View +-keep class android.support.** {*;} +-keep interface android.support.** {*;} +-keep public class * extends android.support.v4.** +-keep public class * extends android.support.v7.** +-keep public class * extends android.support.annotation.** +-dontwarn android.support.** +-keep class androidx.** {*;} +-keep public class * extends androidx.** +-keep interface androidx.** {*;} +-keep class com.google.android.material.** {*;} +-dontwarn androidx.** +-dontwarn com.google.android.material.** +-dontnote com.google.android.material.** + + +-keepclasseswithmembernames class * { + native ; +} + +-keep public class * extends android.view.View{ + *** get*(); + void set*(***); + public (android.content.Context); + public (android.content.Context,android.util.AttributeSet); + public (android.content.Context,android.util.AttributeSet,int); +} +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} + +-keep public class * implements java.io.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(); +} + +-keep class **.R$* {*;} + +-keepclassmembers class * { + void *(**On*Event); + void *(**On*Listener); +} + +-keepclassmembers class * extends android.webkit.WebViewClient { + public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap); + public boolean *(android.webkit.WebView, java.lang.String); +} +-keepclassmembers class * extends android.webkit.WebViewClient { + public void *(android.webkit.WebView, java.lang.String); + } + +-keepclassmembers class * { + public (org.json.JSONObject); +} + +-keepattributes Signature + +-keepattributes InnerClasses + +-assumenosideeffects class android.util.Log { + public static *** v(...); + public static *** d(...); + public static *** i(...); + public static *** w(...); + public static *** e(...); +} + +-dontwarn kotlin.** +-keep class kotlin.** { *; } +-keep interface kotlin.** { *; } +-keepclassmembers class kotlin.Metadata { + public ; +} +-keepclasseswithmembers @kotlin.Metadata class * { *; } +-keepclassmembers class **.WhenMappings { + ; +} +-assumenosideeffects class kotlin.jvm.internal.Intrinsics { + static void checkParameterIsNotNull(java.lang.Object, java.lang.String); +} + +-keep class kotlinx.** { *; } +-keep interface kotlinx.** { *; } +-dontwarn kotlinx.** +-keep class org.jetbrains.** { *; } +-keep interface org.jetbrains.** { *; } +-dontwarn org.jetbrains.** + + +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep class * extends com.bumptech.glide.module.AppGlideModule { + (...); +} +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} +-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder { + *** rewind(); +} + +-dontwarn org.bouncycastle.jsse.BCSSLParameters +-dontwarn org.bouncycastle.jsse.BCSSLSocket +-dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider +-dontwarn org.conscrypt.Conscrypt$Version +-dontwarn org.conscrypt.Conscrypt +-dontwarn org.conscrypt.ConscryptHostnameVerifier +-dontwarn org.openjsse.javax.net.ssl.SSLParameters +-dontwarn org.openjsse.javax.net.ssl.SSLSocket +-dontwarn org.openjsse.net.ssl.OpenJSSE + +# ViewBinding +-keepclassmembers class * implements androidx.viewbinding.ViewBinding { + public static * inflate(android.view.LayoutInflater); +} + +-dontwarn javax.annotation.** +-dontwarn javax.inject.** + +-dontwarn okhttp3.logging.** +-keep class okhttp3.internal.**{*;} +-dontwarn okio.** + +-dontwarn retrofit2.** +-keep class retrofit2.** { *; } +-keepattributes Signature +-keepattributes Exceptions + +-keep class com.google.gson.stream.** { *; } +-keepattributes EnclosingMethod + +-keepattributes *Annotation* +-keepclassmembers class * { + @org.greenrobot.eventbus.Subscribe ; +} +-keep enum org.greenrobot.eventbus.ThreadMode { *; } + +-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { + (java.lang.Throwable); +} + +-if class androidx.credentials.CredentialManager +-keep class androidx.credentials.playservices.** { + *; +} + + -libraryjars libs/lib-decoder-ffmpeg-release.aar -keep class com.localee.mireo.app.http.api.** { @@ -15,11 +185,6 @@ ; } --keepclassmembernames class ** { - @com.localee.mireo.app.aop.Log ; -} - - -keep public class * extends android.view.View{ *** get*(); void set*(***); @@ -33,4 +198,65 @@ } -keepclassmembers class * { public void *(android.view.View); +} + +-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* +-optimizationpasses 5 +-allowaccessmodification +-dontpreverify +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-verbose + +# 不要删除无用代码 +-dontshrink + +# 不混淆泛型 +-keepattributes Signature + +# 不混淆注解类 +-keepattributes *Annotation* + +# 不混淆本地方法 +-keepclasseswithmembernames class * { + native ; +} + +# 不混淆 Activity 在 XML 布局所设置的 onClick 属性值 +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +# 不混淆枚举类 +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +# 不混淆 Parcelable 子类 +-keepclassmembers class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator CREATOR; +} + +# 不混淆 Serializable 子类 +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + !static !transient ; + !private ; + !private ; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} + +# 不混淆 R 文件中的字段 +-keepclassmembers class **.R$* { + public static ; +} + +# 不混淆 WebView 设置的 JS 接口的方法名 +-keepclassmembers class * { + @android.webkit.JavascriptInterface ; } \ No newline at end of file diff --git a/Android_Mireo/app/proguard-sdk.pro b/Android_Mireo/app/proguard-sdk.pro index af74931..d3aa0cb 100644 --- a/Android_Mireo/app/proguard-sdk.pro +++ b/Android_Mireo/app/proguard-sdk.pro @@ -14,17 +14,10 @@ # for DexGuard only #-keepresourcexmlelements manifest/application/meta-data@value=GlideModule -# Bugly --dontwarn com.tencent.bugly.** --keep public class com.tencent.bugly.**{*;} - # AOP -adaptclassstrings -keepattributes InnerClasses, EnclosingMethod, Signature, *Annotation* --keepnames @org.aspectj.lang.annotation.Aspect class * { - public ; -} # OkHttp3 -keepattributes Signature @@ -42,4 +35,184 @@ -keep class com.hjq.permissions.** {*;} -keep class com.hjq.bar.** {*;} -keep class com.hjq.toast.** {*;} --keep class com.hjq.shape.** {*;} \ No newline at end of file +-keep class com.hjq.shape.** {*;} + +-keep class com.adjust.sdk.** { *; } +-keep class com.google.android.gms.common.ConnectionResult { + int SUCCESS; +} +-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient { + com.google.android.gms.ads.identifier.AdvertisingIdClient$Info getAdvertisingIdInfo(android.content.Context); +} +-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info { + java.lang.String getId(); + boolean isLimitAdTrackingEnabled(); +} + +-keep public class com.android.installreferrer.** { *; } + +-keep class com.wang.avi.** { *; } +-keep class com.wang.avi.indicators.** { *; } + +-keep class com.bytedance.sdk.** { *; } + +-keep public class com.google.android.gms.** { public protected *; } + +-keepattributes SourceFile,LineNumberTable # Keep file names and line numbers. +-keep public class * extends java.lang.Exception # Optional: Keep custom exceptions. + + +-keep class android.support.v8.renderscript.** { *; } +-keep class androidx.renderscript.** { *; } + + +-keepattributes Signature +-keepattributes *Annotation* +-keep class com.mbridge.** {*; } +-keep interface com.mbridge.** {*; } +-dontwarn com.mbridge.** +-keepclassmembers class **.R$* { public static final int mbridge*; } + +-keep public class com.mbridge.* extends androidx.** { *; } +-keep public class androidx.viewpager.widget.PagerAdapter{*;} +-keep public class androidx.viewpager.widget.ViewPager.OnPageChangeListener{*;} +-keep interface androidx.annotation.IntDef{*;} +-keep interface androidx.annotation.Nullable{*;} +-keep interface androidx.annotation.CheckResult{*;} +-keep interface androidx.annotation.NonNull{*;} +-keep public class androidx.fragment.app.Fragment{*;} +-keep public class androidx.core.content.FileProvider{*;} +-keep public class androidx.core.app.NotificationCompat{*;} +-keep public class androidx.appcompat.widget.AppCompatImageView {*;} +-keep public class androidx.recyclerview.*{*;} +-keep class com.mbridge.msdk.foundation.tools.FastKV{*;} +-keep class com.mbridge.msdk.foundation.tools.FastKV$Builder{*;} + + +-keepclassmembers class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} +#noinspection ShrinkerUnresolvedReference +#unity +-keep class com.google.android.gms.ads.** {public *;} +-keep class com.google.android.gms.appset.** { *; } +-keep class com.google.android.gms.tasks.** { *; } +#adapters +-keep class com.ironsource.adapters.** { *; } +#sdk +-dontwarn com.ironsource.** +-dontwarn com.ironsource.adapters.** +-keepclassmembers class com.ironsource.** { public *; } +-keep public class com.ironsource.** +-keep class com.ironsource.adapters.** { *; +} +#omid +-dontwarn com.iab.omid.** +-keep class com.iab.omid.** {*;} +#javascript +-keepattributes JavascriptInterface +-keepclassmembers class * { @android.webkit.JavascriptInterface ; } +#For AmazonAps integration +-keep class com.amazon.device.ads.DtbThreadService { + static *; +} +-keep public interface com.amazon.device.ads** {*; } +#For AppLovin integration +-keepclassmembers class com.applovin.sdk.AppLovinSdk { + static *; +} +-keep public interface com.applovin.sdk** {*; } +-keep public interface com.applovin.adview** {*; } +-keep public interface com.applovin.mediation** {*; } +-keep public interface com.applovin.communicator** {*; } +#For Bytedance integration +-keep public interface com.bytedance.sdk.openadsdk** {*; } +#For Facebook integration +-keepclassmembers class com.facebook.ads.internal.AdSdkVersion { + static *; +} +-keepclassmembers class com.facebook.ads.internal.settings.AdSdkVersion { + static *; + } +-keepclassmembers class com.facebook.ads.BuildConfig { + static *; + } +-keep public interface com.facebook.ads** {*; } +#For Fairbid +-keep public interface com.fyber.fairbid.ads.interstitial** {*; } +-keep public interface com.fyber.fairbid.ads.rewarded** {*; } +-keep class com.fyber.offerwall.* +#For Fivead +-keep public interface com.five_corp.ad** {*; } +#For Fyber(Inneractive) integration +-keep public interface com.fyber.inneractive.sdk.external** {*; } +-keep public interface com.fyber.inneractive.sdk.activities** {*; } +-keep public interface com.fyber.inneractive.sdk.ui** {*; } +#For HyprMX integration +-keepclassmembers class com.hyprmx.android.sdk.utility.HyprMXProperties { + static *; +} +-keepclassmembers class com.hyprmx.android.BuildConfig { + static *; +} +-keep public interface com.hyprmx.android.sdk.activity** {*; } +-keep public interface com.hyprmx.android.sdk.graphics** {*; } +# For Inmobi integration +-keep class com.inmobi.* +-keep public interface com.inmobi.ads.listeners** {*; } +-keep public interface com.inmobi.ads.InMobiInterstitial** {*; } +-keep public interface com.inmobi.ads.InMobiBanner** {*; } +# For ironSource integration +-keep public interface com.ironsource.mediationsdk.sdk** {*; } +-keep public interface com.ironsource.mediationsdk.impressionData.ImpressionDataListener {*; } +#For Maio integration +-keep public interface jp.maio.sdk.android.MaioAdsListenerInterface {*; } +# For Mintergral integration +-keep public interface com.mbridge.msdk.out** {*; } +-keep public interface com.mbridge.msdk.videocommon.listener** {*; } +-keep public interface com.mbridge.msdk.interstitialvideo.out** {*; } +-keep public interface com.mintegral.msdk.out** {*; } +-keep public interface com.mintegral.msdk.videocommon.listener** {*; } +-keep public interface com.mintegral.msdk.interstitialvideo.out** {*; } +#For MyTarget integration +-keep class com.my.target.** {*;} +#For Ogury integration +-keep public interface io.presage.interstitial** {*; } +-keep public interface io.presage.interstitial.PresageInterstitialCallback {*; } +#For Pubnative integration +-keep public interface net.pubnative.lite.sdk.interstitial.HyBidInterstitialAd** {*; } +-keep public interface net.pubnative.lite.sdk.rewarded.HyBidRewardedAd** {*; } +-keep public interface net.pubnative.lite.sdk.views.HyBidAdView** {*; } +#For Smaato integration +-keep public interface com.smaato.sdk.interstitial** {*; } +-keep public interface com.smaato.sdk.video.vast** {*; } +-keep public interface com.smaato.sdk.banner.widget** {*; } +-keep public interface com.smaato.sdk.core.util** {*; } +# For Tapjoy integration +-keep public interface com.tapjoy.** {*; } +# For Tencent integration +-keep public interface com.qq.e.ads.interstitial2** {*; } +-keep public interface com.qq.e.ads.interstitial3** {*; } +-keep public interface com.qq.e.ads.rewardvideo** {*; } +-keep public interface com.qq.e.ads.rewardvideo2** {*; } +-keep public interface com.qq.e.ads.banner2** {*; } +-keep public interface com.qq.e.comm.adevent** {*; } +#For Verizon integration +-keepclassmembers class com.verizon.ads.edition.BuildConfig { + static *; +} +-keep public interface com.verizon.ads.interstitialplacement** {*; } +-keep public interface com.verizon.ads.inlineplacement** {*; } +-keep public interface com.verizon.ads.vastcontroller** {*; } +-keep public interface com.verizon.ads.webcontroller** {*; } +#For Vungle integration +-keep public interface com.vungle.warren.PlayAdCallback {*; } +-keep public interface com.vungle.warren.ui.contract** {*; } +-keep public interface com.vungle.warren.ui.view** {*; } +#For AndroidX +-keep class androidx.localbroadcastmanager.content.LocalBroadcastManager { *;} +-keep class androidx.recyclerview.widget.RecyclerView { *;} +-keep class androidx.recyclerview.widget.RecyclerView$OnScrollListener { *;} +#For Android +-keep class * extends android.app.Activity + diff --git a/Android_Mireo/app/src/main/AndroidManifest.xml b/Android_Mireo/app/src/main/AndroidManifest.xml index cb255ab..79c14e6 100644 --- a/Android_Mireo/app/src/main/AndroidManifest.xml +++ b/Android_Mireo/app/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ + xmlns:tools="http://schemas.android.com/tools"> @@ -14,15 +13,10 @@ - - - - - - + + tools:replace="android:allowBackup,android:supportsRtl"> + + + android:theme="@style/Theme.Splash"> @@ -66,45 +62,109 @@ + + + + + + + + + + android:name="com.localee.mireo.app.ui.activity.VideoPlayActivity" + android:launchMode="singleTask" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/action/StatusAction.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/action/StatusAction.kt index 4933ec8..a958467 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/action/StatusAction.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/action/StatusAction.kt @@ -7,7 +7,9 @@ import androidx.annotation.DrawableRes import androidx.annotation.RawRes import androidx.annotation.StringRes import androidx.core.content.ContextCompat -import com.localee.mireo.app.R +import com.hjq.toast.ToastUtils +import com.localee.mireo.app.app.AppApplication +import com.localee.mireo.shortapp.R import com.localee.mireo.app.widget.StatusLayout import com.localee.mireo.app.widget.StatusLayout.OnRetryListener @@ -39,27 +41,37 @@ interface StatusAction { fun showEmpty() { -// showLayout(R.drawable.status_empty_ic, R.string.status_layout_no_data, null) + showLayout(R.mipmap.status_nothing, R.string.status_layout_no_data, null) } fun showError(listener: OnRetryListener?) { getStatusLayout()?.let { - val manager: ConnectivityManager? = ContextCompat.getSystemService(it.context, ConnectivityManager::class.java) + val manager: ConnectivityManager? = + ContextCompat.getSystemService(it.context, ConnectivityManager::class.java) if (manager != null) { val info: NetworkInfo? = manager.activeNetworkInfo if (info == null || !info.isConnected) { -// showLayout(R.drawable.status_network_ic, R.string.status_layout_error_network, listener) + ToastUtils.show(AppApplication.instance.getString(R.string.network_abnormality)) + showLayout(R.mipmap.ic_network, R.string.status_layout_error_network, listener) return } } -// showLayout(R.drawable.status_error_ic, R.string.status_layout_error_request, listener) + showLayout(R.mipmap.status_nothing, R.string.status_layout_no_data, null) } } - fun showLayout(@DrawableRes drawableId: Int, @StringRes stringId: Int, listener: OnRetryListener?) { + fun showLayout( + @DrawableRes drawableId: Int, + @StringRes stringId: Int, + listener: OnRetryListener? + ) { getStatusLayout()?.let { - showLayout(ContextCompat.getDrawable(it.context, drawableId), it.context.getString(stringId), listener) + showLayout( + ContextCompat.getDrawable(it.context, drawableId), + it.context.getString(stringId), + listener + ) } } diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/CheckNet.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/CheckNet.kt deleted file mode 100644 index 1a69774..0000000 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/CheckNet.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.localee.mireo.app.aop - -@kotlin.annotation.Retention(AnnotationRetention.RUNTIME) -@Target(AnnotationTarget.FUNCTION, - AnnotationTarget.PROPERTY_GETTER, - AnnotationTarget.PROPERTY_SETTER) -annotation class CheckNet \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/CheckNetAspect.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/CheckNetAspect.kt deleted file mode 100644 index 6ba2961..0000000 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/CheckNetAspect.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.localee.mireo.app.aop - -import android.app.* -import android.net.ConnectivityManager -import android.net.NetworkInfo -import androidx.core.content.ContextCompat -import com.localee.mireo.app.R -import com.localee.mireo.app.manager.ActivityManager -import com.hjq.toast.ToastUtils -import org.aspectj.lang.ProceedingJoinPoint -import org.aspectj.lang.annotation.Around -import org.aspectj.lang.annotation.Aspect -import org.aspectj.lang.annotation.Pointcut - -@Suppress("unused") -@Aspect -class CheckNetAspect { - - @Pointcut("execution(@com.localee.mireo.app.aop.CheckNet * *(..))") - fun method() {} - - @Around("method() && @annotation(checkNet)") - @Throws(Throwable::class) - fun aroundJoinPoint(joinPoint: ProceedingJoinPoint, checkNet: CheckNet) { - val application: Application = ActivityManager.getInstance().getApplication() - val manager: ConnectivityManager? = ContextCompat.getSystemService(application, ConnectivityManager::class.java) - if (manager != null) { - val info: NetworkInfo? = manager.activeNetworkInfo - if (info == null || !info.isConnected) { - ToastUtils.show(R.string.common_network_hint) - return - } - } - joinPoint.proceed() - } -} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/Log.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/Log.kt deleted file mode 100644 index 9bb1a46..0000000 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/Log.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.localee.mireo.app.aop - -@kotlin.annotation.Retention(AnnotationRetention.RUNTIME) -@Target(AnnotationTarget.FUNCTION, - AnnotationTarget.PROPERTY_GETTER, - AnnotationTarget.PROPERTY_SETTER, - AnnotationTarget.CONSTRUCTOR) -annotation class Log constructor(val value: String = "AppLog") \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/LogAspect.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/LogAspect.kt deleted file mode 100644 index 8420d5f..0000000 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/LogAspect.kt +++ /dev/null @@ -1,96 +0,0 @@ -package com.localee.mireo.app.aop - -import android.os.Looper -import android.os.Trace -import org.aspectj.lang.ProceedingJoinPoint -import org.aspectj.lang.Signature -import org.aspectj.lang.annotation.Around -import org.aspectj.lang.annotation.Aspect -import org.aspectj.lang.annotation.Pointcut -import org.aspectj.lang.reflect.CodeSignature -import org.aspectj.lang.reflect.MethodSignature -import timber.log.Timber -import java.util.concurrent.TimeUnit - -@Suppress("unused") -@Aspect -class LogAspect { - - @Pointcut("execution(@com.localee.mireo.app.aop.Log *.new(..))") - fun constructor() {} - - @Pointcut("execution(@com.localee.mireo.app.aop.Log * *(..))") - fun method() {} - - @Around("(method() || constructor()) && @annotation(log)") - @Throws(Throwable::class) - fun aroundJoinPoint(joinPoint: ProceedingJoinPoint, log: Log): Any? { - enterMethod(joinPoint, log) - val startNanos: Long = System.nanoTime() - val result: Any? = joinPoint.proceed() - val stopNanos: Long = System.nanoTime() - exitMethod(joinPoint, log, result, TimeUnit.NANOSECONDS.toMillis(stopNanos - startNanos)) - return result - } - - private fun enterMethod(joinPoint: ProceedingJoinPoint, log: Log) { - val codeSignature: CodeSignature = joinPoint.signature as CodeSignature - - val className: String = codeSignature.declaringType.name - val methodName: String = codeSignature.name - val parameterNames: Array = codeSignature.parameterNames - val parameterValues: Array = joinPoint.args - - val builder: StringBuilder = - getMethodLogInfo(className, methodName, parameterNames, parameterValues) - log(log.value, builder.toString()) - val section: String = builder.substring(2) - Trace.beginSection(section) - } - - private fun getMethodLogInfo(className: String, methodName: String, parameterNames: Array, parameterValues: Array): StringBuilder { - val builder: StringBuilder = StringBuilder("\u21E2 ") - builder.append(className) - .append(".") - .append(methodName) - .append('(') - for (i in parameterValues.indices) { - if (i > 0) { - builder.append(", ") - } - builder.append(parameterNames[i]).append('=') - builder.append(parameterValues[i].toString()) - } - builder.append(')') - if (Looper.myLooper() != Looper.getMainLooper()) { - builder.append(" [Thread:\"").append(Thread.currentThread().name).append("\"]") - } - return builder - } - - private fun exitMethod(joinPoint: ProceedingJoinPoint, log: Log, result: Any?, lengthMillis: Long) { - Trace.endSection() - val signature: Signature = joinPoint.signature - val className: String? = signature.declaringType.name - val methodName: String? = signature.name - val builder: StringBuilder = StringBuilder("\u21E0 ") - .append(className) - .append(".") - .append(methodName) - .append(" [") - .append(lengthMillis) - .append("ms]") - - // 判断方法是否有返回值 - if (signature is MethodSignature && signature.returnType != Void.TYPE) { - builder.append(" = ") - builder.append(result.toString()) - } - log(log.value, builder.toString()) - } - - private fun log(tag: String?, msg: String?) { - Timber.tag(tag) - Timber.d(msg) - } -} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/Permissions.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/Permissions.kt deleted file mode 100644 index d4641ae..0000000 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/Permissions.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.localee.mireo.app.aop - -@kotlin.annotation.Retention(AnnotationRetention.RUNTIME) -@Target(AnnotationTarget.FUNCTION, - AnnotationTarget.PROPERTY_GETTER, - AnnotationTarget.PROPERTY_SETTER) -annotation class Permissions constructor( - vararg val value: String -) \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/PermissionsAspect.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/PermissionsAspect.kt deleted file mode 100644 index 171804f..0000000 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/PermissionsAspect.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.localee.mireo.app.aop - -import android.app.Activity -import com.hjq.permissions.XXPermissions -import com.localee.mireo.app.manager.ActivityManager -import com.localee.mireo.app.other.PermissionCallback -import org.aspectj.lang.ProceedingJoinPoint -import org.aspectj.lang.annotation.Around -import org.aspectj.lang.annotation.Aspect -import org.aspectj.lang.annotation.Pointcut -import timber.log.Timber - -@Suppress("unused") -@Aspect -class PermissionsAspect { - @Pointcut("execution(@com.localee.mireo.app.aop.Permissions * *(..))") - fun method() { - } - - @Around("method() && @annotation(permissions)") - fun aroundJoinPoint(joinPoint: ProceedingJoinPoint, permissions: Permissions) { - var activity: Activity? = null - - val parameterValues: Array = joinPoint.args - for (arg: Any? in parameterValues) { - if (arg !is Activity) { - continue - } - activity = arg - break - } - if ((activity == null) || activity.isFinishing || activity.isDestroyed) { - activity = ActivityManager.getInstance().getTopActivity() - } - if ((activity == null) || activity.isFinishing || activity.isDestroyed) { - Timber.e("The activity has been destroyed and permission requests cannot be made") - return - } - requestPermissions(joinPoint, activity, permissions.value) - } - - private fun requestPermissions( - joinPoint: ProceedingJoinPoint, - activity: Activity, - permissions: Array - ) { - XXPermissions.with(activity) - .permission(*permissions) - .request(object : PermissionCallback() { - override fun onGranted(permissions: MutableList?, all: Boolean) { - if (all) { - try { - // 获得权限,执行原方法 - joinPoint.proceed() - } catch (e: Throwable) { -// CrashReport.postCatchedException(e) - } - } - } - }) - } -} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/SingleClick.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/SingleClick.kt deleted file mode 100644 index f776414..0000000 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/SingleClick.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.localee.mireo.app.aop - -@kotlin.annotation.Retention(AnnotationRetention.RUNTIME) -@Target(AnnotationTarget.FUNCTION, - AnnotationTarget.PROPERTY_GETTER, - AnnotationTarget.PROPERTY_SETTER) -annotation class SingleClick constructor( - val value: Long = 1000 -) \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/SingleClickAspect.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/SingleClickAspect.kt deleted file mode 100644 index 0077ff1..0000000 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/SingleClickAspect.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.localee.mireo.app.aop - -import org.aspectj.lang.ProceedingJoinPoint -import org.aspectj.lang.annotation.Around -import org.aspectj.lang.annotation.Aspect -import org.aspectj.lang.annotation.Pointcut -import org.aspectj.lang.reflect.CodeSignature -import timber.log.Timber - -@Suppress("unused") -@Aspect -class SingleClickAspect { - - private var lastTime: Long = 0 - - private var lastTag: String? = null - - @Pointcut("execution(@com.localee.mireo.app.aop.SingleClick * *(..))") - fun method() {} - - @Around("method() && @annotation(singleClick)") - @Throws(Throwable::class) - fun aroundJoinPoint(joinPoint: ProceedingJoinPoint, singleClick: SingleClick) { - val codeSignature: CodeSignature = joinPoint.signature as CodeSignature - val className: String = codeSignature.declaringType.name - val methodName: String = codeSignature.name - val builder: StringBuilder = StringBuilder("$className.$methodName") - builder.append("(") - val parameterValues: Array = joinPoint.args - for (i in parameterValues.indices) { - val arg: Any? = parameterValues[i] - if (i == 0) { - builder.append(arg) - } else { - builder.append(", ") - .append(arg) - } - } - builder.append(")") - val tag: String = builder.toString() - val currentTimeMillis: Long = System.currentTimeMillis() - if (currentTimeMillis - lastTime < singleClick.value && (tag == lastTag)) { - Timber.tag("SingleClick") - Timber.i("Within %s milliseconds, there was a rapid click:%s", singleClick.value, tag) - return - } - lastTime = currentTimeMillis - lastTag = tag - joinPoint.proceed() - } -} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppActivity.kt index 4af8b67..ffacd4c 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppActivity.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppActivity.kt @@ -6,9 +6,9 @@ import android.view.View import androidx.annotation.StringRes import com.gyf.immersionbar.ImmersionBar import com.hjq.bar.TitleBar -import com.hjq.base.BaseActivity -import com.hjq.base.BaseDialog -import com.localee.mireo.app.R +import com.localee.mireo.app.base.BaseActivity +import com.localee.mireo.app.base.BaseDialog +import com.localee.mireo.shortapp.R import com.localee.mireo.app.action.TitleBarAction import com.localee.mireo.app.action.ToastAction import com.localee.mireo.app.http.model.HttpData diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppAdapter.kt index e7ed0e2..479fc22 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppAdapter.kt @@ -4,7 +4,7 @@ import android.content.Context import android.view.View import androidx.annotation.IntRange import androidx.annotation.LayoutRes -import com.hjq.base.BaseAdapter +import com.localee.mireo.app.base.BaseAdapter import java.util.* abstract class AppAdapter constructor(context: Context) : diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppApplication.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppApplication.kt index e3d9656..b017434 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppApplication.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppApplication.kt @@ -6,9 +6,22 @@ import android.content.Context import android.net.ConnectivityManager import android.net.Network import android.os.Build +import android.os.Bundle +import android.util.Log import androidx.core.content.ContextCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner +import com.adjust.sdk.Adjust +import com.adjust.sdk.AdjustConfig +import com.adjust.sdk.LogLevel +import com.adjust.sdk.OnEventTrackingFailedListener +import com.adjust.sdk.OnEventTrackingSucceededListener +import com.facebook.FacebookSdk +import com.facebook.FacebookSdk.fullyInitialize +import com.facebook.FacebookSdk.setAutoInitEnabled +import com.facebook.LoggingBehavior +import com.facebook.appevents.AppEventsLogger +import com.facebook.applinks.AppLinkData import com.google.gson.reflect.TypeToken import com.google.gson.stream.JsonToken import com.hjq.bar.TitleBar @@ -19,49 +32,143 @@ import com.hjq.http.model.HttpHeaders import com.hjq.http.model.HttpParams import com.hjq.http.request.HttpRequest import com.hjq.toast.ToastUtils -import com.localee.mireo.app.R -import com.localee.mireo.app.aop.Log import com.localee.mireo.app.http.exception.HttpBodyInterceptor import com.localee.mireo.app.http.model.RequestHandler import com.localee.mireo.app.http.model.RequestServer import com.localee.mireo.app.manager.ActivityManager import com.localee.mireo.app.other.AppConfig +import com.localee.mireo.app.other.AppConfig.getPackageName import com.localee.mireo.app.other.CrashHandler -import com.localee.mireo.app.other.DebugLoggerTree import com.localee.mireo.app.other.MaterialHeader +import com.localee.mireo.app.other.MsConstants import com.localee.mireo.app.other.SmartBallPulseFooter import com.localee.mireo.app.other.TitleBarStyle import com.localee.mireo.app.other.ToastStyle import com.localee.mireo.app.utils.MsMMKVUtils import com.localee.mireo.app.utils.MsSystemUtlis +import com.localee.mireo.shortapp.R +import com.lxj.xpopup.XPopup import com.scwang.smart.refresh.layout.SmartRefreshLayout import com.scwang.smart.refresh.layout.api.RefreshLayout import com.tencent.mmkv.MMKV +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch import okhttp3.OkHttpClient -import timber.log.Timber +import org.greenrobot.eventbus.EventBus class AppApplication : Application() { + private val LOG_TAG: String = "AppApplication" - @Log("启动耗时") override fun onCreate() { super.onCreate() instance = this; + // Initialize Adjust SDK + initAdjust() + // Register lifecycle callbacks + registerActivityLifecycleCallbacks(AdjustLifecycleCallbacks()) + initSdk(this) + GlobalScope.launch(Dispatchers.Main) { + // Initialize Facebook SDK + initFacebookSdk() + } } - override fun onLowMemory() { - super.onLowMemory() + private fun initFacebookSdk() { + + setAutoInitEnabled(true) + fullyInitialize() + if (AppConfig.isDebug()) { + FacebookSdk.setIsDebugEnabled(true) + FacebookSdk.addLoggingBehavior(LoggingBehavior.APP_EVENTS) + } + AppEventsLogger.activateApp(this) + AppLinkData.fetchDeferredAppLinkData( + this + ) { + // Process app link data + if (null != it) { + MsMMKVUtils.getMMKV() + .putString(MsConstants.Constants_DDL_Url, it.targetUri.toString()) + Log.d( + "initFacebookSdk", + "fetchDeferredAppLinkData callback called!====${it.targetUri}" + ) + } + Log.d("initFacebookSdk", "fetchDeferredAppLinkData callback called!") + } } - override fun onTrimMemory(level: Int) { - super.onTrimMemory(level) + private fun initAdjust() { + val appToken = "rs3mgqcl1wjk" + val environment = AdjustConfig.ENVIRONMENT_PRODUCTION + val config = AdjustConfig(instance, appToken, environment) + config.setLogLevel(LogLevel.VERBOSE) + config.onEventTrackingSucceededListener = + OnEventTrackingSucceededListener { adjustEventSuccess -> + Log.d(LOG_TAG, "Event recorded at " + adjustEventSuccess.timestamp) + } + config.onEventTrackingFailedListener = + OnEventTrackingFailedListener { adjustEventFailure -> + Log.v( + LOG_TAG, + "Event recording failed. Response: " + adjustEventFailure.message + ) + } + config.setOnDeferredDeeplinkResponseListener { deeplink -> + Log.d(LOG_TAG, "Deferred deep link callback called!") + Log.d(LOG_TAG, "Deep link URL: $deeplink") + MsMMKVUtils.getMMKV() + .putString(MsConstants.Constants_DDL_Url, deeplink.toString()) + true + } + Adjust.initSdk(config) } + inner class AdjustLifecycleCallbacks : ActivityLifecycleCallbacks { + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {} + override fun onActivityStarted(activity: Activity) { + countActivity++ + if (countActivity == 1 && isAppInBackground) { + isAppInBackground = false + Log.d("Lifecycle", "onActivityStarted") + EventBus.getDefault().post(MsConstants.CONSTANTS_enterTheApp) + } + } + + override fun onActivityResumed(activity: Activity) { + Adjust.onResume() + } + + override fun onActivityPaused(activity: Activity) { + Adjust.onPause() + } + + override fun onActivityStopped(activity: Activity) { + countActivity-- + if (countActivity <= 0 && !isAppInBackground) { + isAppInBackground = true + Log.d("Lifecycle", "onActivityStopped") + EventBus.getDefault().post(MsConstants.CONSTANTS_leaveApp) +// EventBus.getDefault().post(ExampleAppConstants.Constants_interrupt_ad) + } + } + + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} + override fun onActivityDestroyed(activity: Activity) {} + } + + companion object { lateinit var instance: Application; var isCurrentPage: Boolean = true + var isAppInBackground = true + var countActivity = 0 fun initSdk(application: Application) { + + TitleBar.setDefaultStyle(TitleBarStyle()) SmartRefreshLayout.setDefaultRefreshHeaderCreator { context: Context, layout: RefreshLayout -> @@ -89,6 +196,7 @@ class AppApplication : Application() { CrashHandler.register(application) ActivityManager.getInstance().init(application) + XPopup.setPrimaryColor(ContextCompat.getColor(instance, R.color.mireo_color_2b292a)) MMKV.initialize(application) @@ -122,11 +230,21 @@ class AppApplication : Application() { ) headers.put("system-type", "android") headers.put( - "app_version", + "app-version", MsSystemUtlis.getVerNameInfo(instance) ) -// headers.put("security","true") - + headers.put( + "app-name", + getPackageName() + ) + headers.put( + "model", + Build.MODEL + ) + headers.put( + "brand", + Build.BRAND + ) } }) @@ -136,10 +254,6 @@ class AppApplication : Application() { GsonFactory.setJsonCallback { typeToken: TypeToken<*>, fieldName: String?, jsonToken: JsonToken -> } - if (AppConfig.isLogEnable()) { - Timber.plant(DebugLoggerTree()) - } - val connectivityManager: ConnectivityManager? = ContextCompat.getSystemService(application, ConnectivityManager::class.java) if (connectivityManager != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppFragment.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppFragment.kt index 697234b..c829afd 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppFragment.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppFragment.kt @@ -1,11 +1,12 @@ package com.localee.mireo.app.app -import com.hjq.base.BaseFragment +import com.localee.mireo.app.base.BaseFragment import com.localee.mireo.app.action.ToastAction import com.localee.mireo.app.http.model.HttpData import com.hjq.http.config.IRequestApi import com.hjq.http.listener.OnHttpListener import com.hjq.toast.ToastUtils +import com.localee.mireo.app.other.MsConstants abstract class AppFragment : BaseFragment(), ToastAction, OnHttpListener { @@ -37,7 +38,9 @@ abstract class AppFragment : BaseFragment(), } override fun onHttpFail(throwable: Throwable) { - ToastUtils.show(throwable.message) + if (!MsConstants.IsFirst){ + ToastUtils.show(throwable.message) + } } override fun onHttpEnd(api: IRequestApi) { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/TitleBarFragment.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/TitleBarFragment.kt index c246f54..010d15f 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/TitleBarFragment.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/TitleBarFragment.kt @@ -4,7 +4,7 @@ import android.os.Bundle import android.view.* import com.gyf.immersionbar.ImmersionBar import com.hjq.bar.TitleBar -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R import com.localee.mireo.app.action.TitleBarAction diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/BaseActivity.kt similarity index 87% rename from Android_Mireo/library/base/src/main/java/com/hjq/base/BaseActivity.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/base/BaseActivity.kt index 653b7d7..f8a789a 100644 --- a/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseActivity.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/BaseActivity.kt @@ -1,4 +1,4 @@ -package com.hjq.base +package com.localee.mireo.app.base import android.app.Activity import android.content.Context @@ -11,8 +11,12 @@ import android.view.Window import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.lifecycle.Lifecycle -import com.hjq.base.action.* -import java.util.* +import com.localee.mireo.app.base.action.ActivityAction +import com.localee.mireo.app.base.action.BundleAction +import com.localee.mireo.app.base.action.ClickAction +import com.localee.mireo.app.base.action.HandlerAction +import com.localee.mireo.app.base.action.KeyboardAction +import java.util.Random import kotlin.math.pow abstract class BaseActivity : AppCompatActivity(), ActivityAction, @@ -86,7 +90,7 @@ abstract class BaseActivity : AppCompatActivity(), ActivityAction, return super.startActivity(intent) } - override fun dispatchKeyEvent(event: KeyEvent?): Boolean { + override fun dispatchKeyEvent(event: KeyEvent): Boolean { val fragments: MutableList = supportFragmentManager.fragments for (fragment: Fragment? in fragments) { if (fragment !is BaseFragment<*> || fragment.lifecycle.currentState != Lifecycle.State.RESUMED) { @@ -117,7 +121,11 @@ abstract class BaseActivity : AppCompatActivity(), ActivityAction, } @Suppress("deprecation") - open fun startActivityForResult(intent: Intent, options: Bundle?, callback: OnActivityCallback?) { + open fun startActivityForResult( + intent: Intent, + options: Bundle?, + callback: OnActivityCallback? + ) { val requestCode: Int = Random().nextInt(2.0.pow(16.0).toInt()) activityCallbacks.put(requestCode, callback) startActivityForResult(intent, requestCode, options) diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/BaseAdapter.kt similarity index 98% rename from Android_Mireo/library/base/src/main/java/com/hjq/base/BaseAdapter.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/base/BaseAdapter.kt index 95c6591..a26719f 100644 --- a/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/BaseAdapter.kt @@ -1,4 +1,4 @@ -package com.hjq.base +package com.localee.mireo.app.base import android.content.Context import android.util.SparseArray @@ -9,7 +9,7 @@ import androidx.annotation.IdRes import androidx.annotation.LayoutRes import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.hjq.base.action.ResourcesAction +import com.localee.mireo.app.base.action.ResourcesAction @Suppress("LeakingThis") abstract class BaseAdapter.BaseViewHolder>(private val context: Context) : diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseDialog.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/BaseDialog.kt similarity index 97% rename from Android_Mireo/library/base/src/main/java/com/hjq/base/BaseDialog.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/base/BaseDialog.kt index fc8a40b..29a4d9d 100644 --- a/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseDialog.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/BaseDialog.kt @@ -1,4 +1,4 @@ -package com.hjq.base +package com.localee.mireo.app.base import android.app.Activity import android.app.Application.ActivityLifecycleCallbacks @@ -29,15 +29,14 @@ import androidx.annotation.StringRes import androidx.annotation.StyleRes import androidx.appcompat.app.AppCompatDialog import androidx.core.content.ContextCompat -import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.LifecycleRegistry -import com.hjq.base.action.ActivityAction -import com.hjq.base.action.AnimAction -import com.hjq.base.action.ClickAction -import com.hjq.base.action.HandlerAction -import com.hjq.base.action.KeyboardAction -import com.hjq.base.action.ResourcesAction +import com.localee.mireo.app.base.action.ActivityAction +import com.localee.mireo.app.base.action.AnimAction +import com.localee.mireo.app.base.action.ClickAction +import com.localee.mireo.app.base.action.HandlerAction +import com.localee.mireo.app.base.action.KeyboardAction +import com.localee.mireo.app.base.action.ResourcesAction +import com.localee.mireo.shortapp.R import java.lang.ref.SoftReference @Suppress("LeakingThis") @@ -49,8 +48,10 @@ open class BaseDialog constructor( HandlerAction, ClickAction, AnimAction, KeyboardAction, DialogInterface.OnShowListener, DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { + private val listeners: ListenersWrapper = ListenersWrapper(this) - override val lifecycle: LifecycleRegistry = LifecycleRegistry(this) +// override val lifecycle: LifecycleRegistry = LifecycleRegistry(this) + private var showListeners: MutableList? = null private var cancelListeners: MutableList? = null private var dismissListeners: MutableList? = null @@ -117,6 +118,7 @@ open class BaseDialog constructor( window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) } } + open fun setBackgroundDimAmount(@FloatRange(from = 0.0, to = 1.0) dimAmount: Float) { window?.setDimAmount(dimAmount) } @@ -226,7 +228,7 @@ open class BaseDialog constructor( * [DialogInterface.OnShowListener] */ override fun onShow(dialog: DialogInterface?) { - lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_RESUME) +// lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_RESUME) showListeners?.let { for (i in it.indices) { it[i]?.onShow(this) @@ -249,7 +251,7 @@ open class BaseDialog constructor( * [DialogInterface.OnDismissListener] */ override fun onDismiss(dialog: DialogInterface?) { - lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY) +// lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY) dismissListeners?.let { for (i in it.indices) { it[i]?.onDismiss(this) @@ -259,17 +261,17 @@ open class BaseDialog constructor( override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_CREATE) +// lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_CREATE) } override fun onStart() { super.onStart() - lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START) +// lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START) } override fun onStop() { super.onStop() - lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP) +// lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP) } @Suppress("UNCHECKED_CAST") diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseFragment.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/BaseFragment.kt similarity index 92% rename from Android_Mireo/library/base/src/main/java/com/hjq/base/BaseFragment.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/base/BaseFragment.kt index 46c9c1d..f6c0d0f 100644 --- a/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseFragment.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/BaseFragment.kt @@ -1,4 +1,4 @@ -package com.hjq.base +package com.localee.mireo.app.base import android.app.Activity import android.app.Application @@ -12,11 +12,11 @@ import android.view.ViewGroup import androidx.annotation.IdRes import androidx.fragment.app.Fragment import androidx.lifecycle.Lifecycle -import com.hjq.base.BaseActivity.OnActivityCallback -import com.hjq.base.action.BundleAction -import com.hjq.base.action.ClickAction -import com.hjq.base.action.HandlerAction -import com.hjq.base.action.KeyboardAction +import com.localee.mireo.app.base.BaseActivity.OnActivityCallback +import com.localee.mireo.app.base.action.BundleAction +import com.localee.mireo.app.base.action.ClickAction +import com.localee.mireo.app.base.action.HandlerAction +import com.localee.mireo.app.base.action.KeyboardAction abstract class BaseFragment : Fragment(), HandlerAction, ClickAction, BundleAction, KeyboardAction { diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/FragmentPagerAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/FragmentPagerAdapter.kt similarity index 98% rename from Android_Mireo/library/base/src/main/java/com/hjq/base/FragmentPagerAdapter.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/base/FragmentPagerAdapter.kt index 9d64bfc..c290e12 100644 --- a/Android_Mireo/library/base/src/main/java/com/hjq/base/FragmentPagerAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/FragmentPagerAdapter.kt @@ -1,4 +1,4 @@ -package com.hjq.base +package com.localee.mireo.app.base import android.view.ViewGroup import androidx.fragment.app.Fragment diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/ActivityAction.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/ActivityAction.kt similarity index 95% rename from Android_Mireo/library/base/src/main/java/com/hjq/base/action/ActivityAction.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/ActivityAction.kt index db8ed88..166a4d5 100644 --- a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/ActivityAction.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/ActivityAction.kt @@ -1,4 +1,4 @@ -package com.hjq.base.action +package com.localee.mireo.app.base.action import android.app.Activity import android.content.Context diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/AnimAction.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/AnimAction.kt similarity index 86% rename from Android_Mireo/library/base/src/main/java/com/hjq/base/action/AnimAction.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/AnimAction.kt index 5710167..f408b8a 100644 --- a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/AnimAction.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/AnimAction.kt @@ -1,6 +1,7 @@ -package com.hjq.base.action +package com.localee.mireo.app.base.action + +import com.localee.mireo.shortapp.R -import com.hjq.base.R interface AnimAction { diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/BundleAction.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/BundleAction.kt similarity index 98% rename from Android_Mireo/library/base/src/main/java/com/hjq/base/action/BundleAction.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/BundleAction.kt index 1bd63ce..ded571a 100644 --- a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/BundleAction.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/BundleAction.kt @@ -1,4 +1,4 @@ -package com.hjq.base.action +package com.localee.mireo.app.base.action import android.os.Bundle import android.os.Parcelable diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/ClickAction.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/ClickAction.kt similarity index 94% rename from Android_Mireo/library/base/src/main/java/com/hjq/base/action/ClickAction.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/ClickAction.kt index 4b759ad..5d0a1c1 100644 --- a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/ClickAction.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/ClickAction.kt @@ -1,4 +1,4 @@ -package com.hjq.base.action +package com.localee.mireo.app.base.action import android.view.View import androidx.annotation.IdRes diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/HandlerAction.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/HandlerAction.kt similarity index 95% rename from Android_Mireo/library/base/src/main/java/com/hjq/base/action/HandlerAction.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/HandlerAction.kt index eeb417f..06ed98b 100644 --- a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/HandlerAction.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/HandlerAction.kt @@ -1,4 +1,4 @@ -package com.hjq.base.action +package com.localee.mireo.app.base.action import android.os.Handler import android.os.Looper diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/KeyboardAction.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/KeyboardAction.kt similarity index 96% rename from Android_Mireo/library/base/src/main/java/com/hjq/base/action/KeyboardAction.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/KeyboardAction.kt index 30757be..64c1148 100644 --- a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/KeyboardAction.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/KeyboardAction.kt @@ -1,4 +1,4 @@ -package com.hjq.base.action +package com.localee.mireo.app.base.action import android.content.Context import android.view.View diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/ResourcesAction.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/ResourcesAction.kt similarity index 96% rename from Android_Mireo/library/base/src/main/java/com/hjq/base/action/ResourcesAction.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/ResourcesAction.kt index a83e700..e961217 100644 --- a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/ResourcesAction.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/base/action/ResourcesAction.kt @@ -1,4 +1,4 @@ -package com.hjq.base.action +package com.localee.mireo.app.base.action import android.content.Context import android.content.res.Resources diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/ActionPushApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/ActionPushApi.kt new file mode 100644 index 0000000..6d4ca98 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/ActionPushApi.kt @@ -0,0 +1,14 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class ActionPushApi : IRequestApi { + + override fun getApi(): String { + return "action/push" + } + + var action: String? = null + + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/ActiveAfterWatchingVideoApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/ActiveAfterWatchingVideoApi.kt new file mode 100644 index 0000000..70ae817 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/ActiveAfterWatchingVideoApi.kt @@ -0,0 +1,11 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class ActiveAfterWatchingVideoApi : IRequestApi { + + override fun getApi(): String { + return "activeAfterWatchingVideo" + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/CreateOrderApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/CreateOrderApi.kt new file mode 100644 index 0000000..52cafa3 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/CreateOrderApi.kt @@ -0,0 +1,15 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class CreateOrderApi : IRequestApi { + + override fun getApi(): String { + return "createOrder" + } + + data class Bean( + val order_code: String + ) + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/CustomerBuyRecordsApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/CustomerBuyRecordsApi.kt new file mode 100644 index 0000000..4300060 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/CustomerBuyRecordsApi.kt @@ -0,0 +1,40 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class CustomerBuyRecordsApi : IRequestApi { + + override fun getApi(): String { + return "getCustomerBuyRecords" + } + + var current_page: Int? = null + + var page_size: Int? = null + + class Bean ( + val list: List, + val pagination: Pagination + ) { + + data class Data( + val short_play_id: Int, + val coins: String, + var short_play_video_id: Int, + val coin_type: Int, + val created_at: String, + val episode: Int, + val image_url: String, + var name: String, + ) + + data class Pagination( + val current_page: Int, + val page_size: Int, + val page_total: Int, + val total_size: Int + ) + + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/CustomerOrderApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/CustomerOrderApi.kt new file mode 100644 index 0000000..0f09665 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/CustomerOrderApi.kt @@ -0,0 +1,37 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + + +class CustomerOrderApi : IRequestApi { + + override fun getApi(): String { + return "getCustomerOrder" + } + + var buy_type: String? = null + + var current_page: Int? = null + + var page_size: Int? = null + + class Bean ( + val list: List, + val pagination: Pagination + ) { + + data class Data( + val created_at: String, + var type: String, + var value: String + ) + + data class Pagination( + val current_page: Int, + val page_size: Int, + val page_total: Int, + val total_size: Int + ) + + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DetailsRecommandApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DetailsRecommandApi.kt new file mode 100644 index 0000000..f288496 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DetailsRecommandApi.kt @@ -0,0 +1,38 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi +import java.io.Serializable + +class DetailsRecommandApi : IRequestApi { + + override fun getApi(): String { + return "getDetailsRecommand" + } + + data class Bean( + val brief: String, + val description: String, + val list: List, + val tag: String, + val title: String + ) { + + data class Item( + val all_coins: Int, + val buy_type: Int, + val collect_total: Int, + val description: String, + val episode_total: Int, + val horizontally_img: String, + val video_url: String, + val id: Int, + val image_url: String, + val name: String, + val process: Int, + val short_id: Int, + val short_play_id: Int?, + val tag_type: String, + val watch_total: Int + ) + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DoBuyVideoApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DoBuyVideoApi.kt new file mode 100644 index 0000000..df1b33f --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DoBuyVideoApi.kt @@ -0,0 +1,22 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + + +class DoBuyVideoApi : IRequestApi { + + override fun getApi(): String { + return "buy_video" + } + + var short_play_id: Int? = null + + var video_id: Int? = null + + data class Bean( + val status: String, + val coin_left_total: Int, + val send_coin_left_total: Int + ) + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DoLoginApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DoLoginApi.kt new file mode 100644 index 0000000..426c1a5 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DoLoginApi.kt @@ -0,0 +1,24 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi +import com.localee.mireo.app.http.bean.LoginBean + +class DoLoginApi : IRequestApi { + + override fun getApi(): String { + return "customer/login" + } + + /** 登录密码 */ + private var loginBean: LoginBean? = null + + fun setLoginBean(loginBean: LoginBean?): DoLoginApi = apply { + this.loginBean = loginBean + } + + data class Bean( + val customer_id: String, + val token: String + ) + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DoLogoffApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DoLogoffApi.kt new file mode 100644 index 0000000..b8f6639 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DoLogoffApi.kt @@ -0,0 +1,16 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class DoLogoffApi : IRequestApi { + + override fun getApi(): String { + return "customer/logoff" + } + + data class Bean( + val customer_id: String, + val token: String + ) + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DoLogoutApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DoLogoutApi.kt new file mode 100644 index 0000000..cbea227 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DoLogoutApi.kt @@ -0,0 +1,16 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + + +class DoLogoutApi : IRequestApi { + + override fun getApi(): String { + return "customer/signout" + } + + data class Bean( + val customer_id: String, + val token: String + ) +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/EnterTheAppApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/EnterTheAppApi.kt new file mode 100644 index 0000000..2f298d8 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/EnterTheAppApi.kt @@ -0,0 +1,11 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class EnterTheAppApi : IRequestApi { + + override fun getApi(): String { + return "customer/enterTheApp" + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/FirebaseTokenApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/FirebaseTokenApi.kt new file mode 100644 index 0000000..df9b967 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/FirebaseTokenApi.kt @@ -0,0 +1,10 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class FirebaseTokenApi : IRequestApi { + + override fun getApi(): String { + return "customer/firebaseToken" + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/GooglePaidApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/GooglePaidApi.kt new file mode 100644 index 0000000..ecd3555 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/GooglePaidApi.kt @@ -0,0 +1,10 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class GooglePaidApi : IRequestApi { + + override fun getApi(): String { + return "googlePaid" + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeDayMaxRechargeShortPlayRankApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeDayMaxRechargeShortPlayRankApi.kt index 9e2e176..e107db3 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeDayMaxRechargeShortPlayRankApi.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeDayMaxRechargeShortPlayRankApi.kt @@ -1,7 +1,7 @@ package com.localee.mireo.app.http.api import com.hjq.http.config.IRequestApi -import java.io.Serializable +import com.localee.mireo.app.http.bean.RecommendBean class HomeDayMaxRechargeShortPlayRankApi : IRequestApi { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeModuleApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeModuleApi.kt index 2af6f08..7b6da45 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeModuleApi.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeModuleApi.kt @@ -1,6 +1,7 @@ package com.localee.mireo.app.http.api import com.hjq.http.config.IRequestApi +import com.localee.mireo.app.http.bean.RecommendBean import java.io.Serializable @@ -18,6 +19,7 @@ class HomeModuleApi : IRequestApi { var newTopThree: List? = null var highestPayment: List? = null var hottestPist: List? = null + var nineSquare: RecommandDataBean? = null } diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeVideoListApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeVideoListApi.kt index fd76e34..6f0098c 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeVideoListApi.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeVideoListApi.kt @@ -1,7 +1,7 @@ package com.localee.mireo.app.http.api import com.hjq.http.config.IRequestApi -import java.io.Serializable +import com.localee.mireo.app.http.bean.RecommendBean class HomeVideoListApi : IRequestApi { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/LanguageApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/LanguageApi.kt new file mode 100644 index 0000000..5705179 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/LanguageApi.kt @@ -0,0 +1,26 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class LanguageApi : IRequestApi { + + override fun getApi(): String { + return "languges" + } + + class Bean( + val list: List, + ) { + + data class Data( + val cn_name: String, + val show_name: String, + var id: Int, + val lang_key: String, + val description: String, + val is_default: Int + ) + + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/LeaveAppApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/LeaveAppApi.kt new file mode 100644 index 0000000..88fccc9 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/LeaveAppApi.kt @@ -0,0 +1,14 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class LeaveAppApi : IRequestApi { + + override fun getApi(): String { + return "customer/leaveApp" + } + + var action: String? = null + + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/MessageSendReportApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/MessageSendReportApi.kt new file mode 100644 index 0000000..2b8053b --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/MessageSendReportApi.kt @@ -0,0 +1,10 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class MessageSendReportApi : IRequestApi { + + override fun getApi(): String { + return "message/sendReport" + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/NoticeNumApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/NoticeNumApi.kt new file mode 100644 index 0000000..2263594 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/NoticeNumApi.kt @@ -0,0 +1,16 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + + +class NoticeNumApi : IRequestApi { + + override fun getApi(): String { + return "noticeNum" + } + + class Bean( + val feedback_notice_num: Int + ) + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/OnLineApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/OnLineApi.kt new file mode 100644 index 0000000..ec4724f --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/OnLineApi.kt @@ -0,0 +1,14 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class OnLineApi : IRequestApi { + + override fun getApi(): String { + return "customer/onLine" + } + + var action: String? = null + + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/OpenNotifyApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/OpenNotifyApi.kt new file mode 100644 index 0000000..1ab66a7 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/OpenNotifyApi.kt @@ -0,0 +1,10 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class OpenNotifyApi : IRequestApi { + + override fun getApi(): String { + return "openNotify" + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/PaySettingsApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/PaySettingsApi.kt new file mode 100644 index 0000000..c059c65 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/PaySettingsApi.kt @@ -0,0 +1,15 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class PaySettingsApi : IRequestApi { + + override fun getApi(): String { + return "paySettingsV3" + } + + var short_play_id: Int? = null + + var short_play_video_id: Int? = null + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/SendCoinListApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/SendCoinListApi.kt new file mode 100644 index 0000000..bf35ba6 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/SendCoinListApi.kt @@ -0,0 +1,39 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class SendCoinListApi : IRequestApi { + + override fun getApi(): String { + return "sendCoinList" + } + + var current_page: Int? = null + + var page_size: Int? = null + + class Bean ( + val list: List, + val pagination: Pagination + ) { + + data class Data( + val id: Int, + val created_at: String, + var type: String, + val left_coins: String, + val expired_time: String, + val is_effective: Int, + val coins: String, + var diff_datetime: String, + ) + + data class Pagination( + val current_page: Int, + val page_size: Int, + val page_total: Int, + val total_size: Int + ) + + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/TranslatesLanguageApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/TranslatesLanguageApi.kt new file mode 100644 index 0000000..bdc6141 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/TranslatesLanguageApi.kt @@ -0,0 +1,12 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class TranslatesLanguageApi : IRequestApi { + + override fun getApi(): String { + return "translates" + } + + var language_key : String? = null +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/UploadHistorySecondsApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/UploadHistorySecondsApi.kt new file mode 100644 index 0000000..c9030b5 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/UploadHistorySecondsApi.kt @@ -0,0 +1,10 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class UploadHistorySecondsApi : IRequestApi { + + override fun getApi(): String { + return "uploadHistorySeconds" + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/UserInfoRes.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/UserInfoRes.kt index 0f0a64b..558ac0d 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/UserInfoRes.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/UserInfoRes.kt @@ -19,7 +19,7 @@ class UserInfoRes ( val registered_days: Int = 0, val send_coin_left_total: Int = 0, val third_access_platform: String = "", - val vip_end_time: Int = 0, + val vip_end_time: String = "", val vip_type: String = "" ) { companion object { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/VideoDetailsApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/VideoDetailsApi.kt index 76e5fc6..9b23481 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/VideoDetailsApi.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/VideoDetailsApi.kt @@ -3,7 +3,7 @@ package com.localee.mireo.app.http.api import android.os.Parcel import android.os.Parcelable import com.hjq.http.config.IRequestApi -import java.io.Serializable +import java.util.ArrayList class VideoDetailsApi : IRequestApi { @@ -16,6 +16,9 @@ class VideoDetailsApi : IRequestApi { var video_id: Int? = null + var activity_id: Int? = null + + data class Bean( val episodeList: List, @@ -100,7 +103,8 @@ class VideoDetailsApi : IRequestApi { val name: String, val process: Int, val short_id: Int, - val watch_total: Int + val watch_total: Int, + val category: ArrayList? ): Parcelable { constructor(parcel: Parcel) : this( parcel.readInt(), @@ -114,7 +118,8 @@ class VideoDetailsApi : IRequestApi { parcel.readString().toString(), parcel.readInt(), parcel.readInt(), - parcel.readInt() + parcel.readInt(), + parcel.createStringArrayList() ) { } @@ -131,6 +136,7 @@ class VideoDetailsApi : IRequestApi { parcel.writeInt(process) parcel.writeInt(short_id) parcel.writeInt(watch_total) + parcel.writeStringList(category) } override fun describeContents(): Int { @@ -146,6 +152,7 @@ class VideoDetailsApi : IRequestApi { return arrayOfNulls(size) } } + } data class VideoInfo( diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/W2aApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/W2aApi.kt new file mode 100644 index 0000000..7629015 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/W2aApi.kt @@ -0,0 +1,12 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class W2aApi : IRequestApi { + + override fun getApi(): String { + return "w2aSelfAttribution" + } + + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/CreateOrderReqBean.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/CreateOrderReqBean.kt new file mode 100644 index 0000000..dc63ce6 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/CreateOrderReqBean.kt @@ -0,0 +1,8 @@ +package com.localee.mireo.app.http.bean + +class CreateOrderReqBean ( + val pay_setting_id: String, + val payment_channel: String, + val short_play_id: Int, + val video_id: Int +) \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HistoryBean.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/HistoryBean.kt similarity index 88% rename from Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HistoryBean.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/HistoryBean.kt index 6c53c46..7f59af5 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HistoryBean.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/HistoryBean.kt @@ -1,4 +1,4 @@ -package com.localee.mireo.app.http.api +package com.localee.mireo.app.http.bean class HistoryBean ( val list: List, @@ -15,7 +15,7 @@ class HistoryBean ( val current_episode: String, var is_collect: Boolean, var is_check: Boolean, - val categoryList: List + val category: List ) data class Pagination( diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/HomeDataHistoryBean.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/HomeDataHistoryBean.kt new file mode 100644 index 0000000..d834168 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/HomeDataHistoryBean.kt @@ -0,0 +1,8 @@ +package com.localee.mireo.app.http.bean + +class HomeDataHistoryBean ( + val video_name: String, + val video_id: Int, + val video_last: String, + val video_img: String +) diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/IncidentBean.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/IncidentBean.kt new file mode 100644 index 0000000..4a50603 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/IncidentBean.kt @@ -0,0 +1,3 @@ +package com.localee.mireo.app.http.bean + +class IncidentBean(val incident: String?, val res: String?, val time: Long) diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/JsBean.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/JsBean.kt new file mode 100644 index 0000000..2b9f699 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/JsBean.kt @@ -0,0 +1,9 @@ +package com.localee.mireo.app.http.bean + +class JsBean( + val token: String, + val time_zone: String, + val lang: String, + val type: String, + val theme: String +) diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/JsDetailsBean.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/JsDetailsBean.kt new file mode 100644 index 0000000..ce18c98 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/JsDetailsBean.kt @@ -0,0 +1,10 @@ +package com.localee.mireo.app.http.bean + +class JsDetailsBean( + val token: String, + val time_zone: String, + val lang: String, + val type: String, + val id: String, + val theme: String +) diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/JsonInfoBean.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/JsonInfoBean.kt new file mode 100644 index 0000000..ad8fa08 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/JsonInfoBean.kt @@ -0,0 +1,14 @@ +package com.localee.mireo.app.http.bean +class JsonInfoBean( + val data: Data?, + val is_complete: Boolean, + val is_show: Int, + val type: String +) { + + data class Data( + val activity_id: Int, + val short_play_id: Int? + ) +} + diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/JsonInfoUrlBean.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/JsonInfoUrlBean.kt new file mode 100644 index 0000000..c304091 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/JsonInfoUrlBean.kt @@ -0,0 +1,12 @@ +package com.localee.mireo.app.http.bean +class JsonInfoUrlBean( + val `data`: Data, + val is_complete: Int, + val is_show: Int, + val type: String +) { + + data class Data( + val link: String + ) +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/LoginBean.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/LoginBean.kt new file mode 100644 index 0000000..459c43a --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/LoginBean.kt @@ -0,0 +1,10 @@ +package com.localee.mireo.app.http.bean + +class LoginBean ( + val avator: String, + val email: String, + val family_name: String, + val giving_name: String, + val platform: String, + val third_id: String +) diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/PayBean.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/PayBean.kt new file mode 100644 index 0000000..38e9a5d --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/PayBean.kt @@ -0,0 +1,11 @@ +package com.localee.mireo.app.http.bean + +class PayBean ( + val order_code: String, + val pay_setting_id: String,//id + val pkg_name: String, + val product_id: String,//template id + val purchases_token: String, + val transaction_id: String, + val show_money: String, +) \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/PayResBean.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/PayResBean.kt new file mode 100644 index 0000000..041c342 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/PayResBean.kt @@ -0,0 +1,8 @@ +package com.localee.mireo.app.http.bean + +class PayResBean ( + val is_backhaul: Int,//1可以上传 + val money: String,//回传价格 + val order_code: String, + val status: String +) \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/PaySettingsBean.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/PaySettingsBean.kt new file mode 100644 index 0000000..c69efcd --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/PaySettingsBean.kt @@ -0,0 +1,68 @@ +package com.localee.mireo.app.http.bean + +class PaySettingsBean( + val list_coins: List, + val list_vip: List, + val list_sub_vip: List, + val list_retrieve: List +) { + + data class Coins( + val android_template_id: String, + val backhaul_price: String, + val brief: String, + val buy_type: String, + val coins: Int, + val created_at: String, + val currency: String, + var currency_goolge: String?, + val description: String, + val id: Int, + val ios_template_id: String, + val corner_marker: String, + val lang_id: Int, + val origin_price: String, + val platform: String, + val price: String, + var price_google: String?, + val send_coins: Int, + val sort: Int, + val status: String, + val title: String, + val size: String, + val translate_key: String, + val updated_at: String, + val vip_type: String + ) + + data class Vip( + val android_template_id: String, + val backhaul_price: String, + val brief: String, + val short_type: String, + val buy_type: String, + val coins: Int, + val created_at: String, + val currency: String, + var currency_goolge: String?, + val description: String, + val id: Int, + val ios_template_id: String, + val lang_id: Int, + val origin_price: String, + val platform: String, + val price: String, + var price_google: String?, + val send_coins: Int, + val send_coin_ttl: Int, + val sort: Int, + var show: Int, + val status: String, + val title: String, + val translate_key: String, + val updated_at: String, + val auto_sub: String, + var vip_type: String, + var vip_type_key: String, + ) +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/RecommendBean.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/RecommendBean.kt similarity index 93% rename from Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/RecommendBean.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/RecommendBean.kt index 4f235fa..434d6c5 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/RecommendBean.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/RecommendBean.kt @@ -1,4 +1,4 @@ -package com.localee.mireo.app.http.api +package com.localee.mireo.app.http.bean class RecommendBean( var id: Int, diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/TranslatesRes.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/TranslatesBean.kt similarity index 99% rename from Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/TranslatesRes.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/TranslatesBean.kt index 85216ff..8f4fc51 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/TranslatesRes.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/TranslatesBean.kt @@ -1,6 +1,6 @@ -package com.localee.mireo.app.ui.videoPaly +package com.localee.mireo.app.http.bean -class TranslatesRes( +class TranslatesBean( val languages: List, val last_update_time: String, val translates: Translates diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/UploadHistoryBean.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/UploadHistoryBean.kt new file mode 100644 index 0000000..cd440ab --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/bean/UploadHistoryBean.kt @@ -0,0 +1,7 @@ +package com.localee.mireo.app.http.bean + +class UploadHistoryBean ( + val play_seconds: Long?, + val short_play_id: Int, + val video_id: Int? +) \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/exception/HttpBodyInterceptor.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/exception/HttpBodyInterceptor.kt index 8aeef45..98cd33b 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/exception/HttpBodyInterceptor.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/exception/HttpBodyInterceptor.kt @@ -1,8 +1,12 @@ package com.localee.mireo.app.http.exception +import com.localee.mireo.app.other.MsConstants +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import okhttp3.Interceptor import okhttp3.Response import okhttp3.ResponseBody +import org.greenrobot.eventbus.EventBus import java.io.IOException @@ -12,7 +16,9 @@ class HttpBodyInterceptor : Interceptor { @kotlin.jvm.Throws(IOException::class) override fun intercept(chain: Interceptor.Chain): Response { val k_center = chain.proceed(chain.request()) - + if (k_center.code() != 200) { + return k_center + } return if (k_center.body() != null && k_center.body()!!.contentType() != null) { val actiity = k_center.body()!!.contentType() val circle = k_center.body()!!.string() @@ -82,4 +88,35 @@ class HttpBodyInterceptor : Interceptor { } } + private var lastPostTime: Long = 0L + private val lock = Any() + private val lock1 = Any() + + suspend fun handle401Response() = withContext(Dispatchers.Main) { + synchronized(lock1) { + val currentTime = System.currentTimeMillis() + if (currentTime - lastPostTime >= DELAY_TIME_MILLIS) { + EventBus.getDefault() + .post(MsConstants.CONSTANTS_auth_refresh) + lastPostTime = currentTime + } + } + } + + suspend fun handle402Response() = withContext(Dispatchers.Main) { + synchronized(lock) { + val currentTime = System.currentTimeMillis() + if (currentTime - lastPostTime >= DELAY_TIME_MILLIS) { + EventBus.getDefault() + .post(MsConstants.CONSTANTS_out_login) + lastPostTime = currentTime + } + } + } + + companion object { + private const val DELAY_TIME_MILLIS = 2000L // 延迟时间,单位毫秒 + } + + } \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/exception/Token402Exception.java b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/exception/Token402Exception.java new file mode 100644 index 0000000..d528051 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/exception/Token402Exception.java @@ -0,0 +1,15 @@ +package com.localee.mireo.app.http.exception; + +import com.hjq.http.exception.HttpException; + + +public final class Token402Exception extends HttpException { + + public Token402Exception(String message) { + super(message); + } + + public Token402Exception(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/HttpData.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/HttpData.kt index 2a11f49..e163c05 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/HttpData.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/HttpData.kt @@ -24,7 +24,11 @@ open class HttpData { return code == 200 } - fun isTokenFailure(): Boolean { - return code == 1001 + fun is401Failure(): Boolean { + return code == 401 + } + + fun is402Failure(): Boolean { + return code == 402 } } \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/RequestHandler.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/RequestHandler.kt index 318b0d6..04439f1 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/RequestHandler.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/RequestHandler.kt @@ -19,12 +19,20 @@ import com.hjq.http.exception.ServerException import com.hjq.http.exception.TimeoutException import com.hjq.http.request.HttpRequest import com.localee.mireo.app.http.exception.ResultException -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R +import com.localee.mireo.app.http.exception.Token402Exception import com.localee.mireo.app.http.exception.TokenException +import com.localee.mireo.app.other.MsConstants import com.tencent.mmkv.MMKV +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import okhttp3.Headers import okhttp3.Response import okhttp3.ResponseBody +import org.greenrobot.eventbus.EventBus import java.io.IOException import java.io.InputStream import java.lang.reflect.GenericArrayType @@ -41,14 +49,23 @@ class RequestHandler constructor(private val mApplication: Application) : IReque return response } - if (!response.isSuccessful) { - throw ResponseException( - String.format( - mApplication.getString(R.string.http_response_error), - response.code(), response.message() - ), response - ) + if (response.code() == 401) { + throw TokenException( + mApplication.getString(R.string.http_token_error) + ) + }else if (response.code() == 402) { + throw Token402Exception( + mApplication.getString(R.string.http_token_error) + ) + }else { + throw ResponseException( + String.format( + mApplication.getString(R.string.http_response_error), + response.code(), response.message() + ), response + ) + } } if (Headers::class.java == type) { return response.headers() @@ -113,20 +130,33 @@ class RequestHandler constructor(private val mApplication: Application) : IReque return result } - if (model.isTokenFailure()) { + if (model.is401Failure()) { throw TokenException( mApplication.getString(R.string.http_token_error) ) } + if (model.is402Failure()) { + throw Token402Exception( + mApplication.getString(R.string.http_token_error) + ) + } throw ResultException(model.getMessage(), model) } return result } + @OptIn(DelicateCoroutinesApi::class) override fun requestFail(httpRequest: HttpRequest<*>, throwable: Throwable): Throwable { if (throwable is HttpException) { if (throwable is TokenException) { + GlobalScope.launch(Dispatchers.Main) { + handle401Response() + } + }else if (throwable is Token402Exception) { + GlobalScope.launch(Dispatchers.Main) { + handle402Response() + } } return throwable } @@ -234,5 +264,34 @@ class RequestHandler constructor(private val mApplication: Application) : IReque HttpCacheManager.clearCache() } + private var lastPostTime: Long = 0L + private val lock = Any() + private val lock1 = Any() + + private suspend fun handle401Response() = withContext(Dispatchers.Main) { + synchronized(lock1) { + val currentTime = System.currentTimeMillis() + if (currentTime - lastPostTime >= DELAY_TIME_MILLIS) { + EventBus.getDefault() + .post(MsConstants.CONSTANTS_auth_refresh) + lastPostTime = currentTime + } + } + } + + private suspend fun handle402Response() = withContext(Dispatchers.Main) { + synchronized(lock) { + val currentTime = System.currentTimeMillis() + if (currentTime - lastPostTime >= DELAY_TIME_MILLIS) { + EventBus.getDefault() + .post(MsConstants.CONSTANTS_out_login) + lastPostTime = currentTime + } + } + } + + companion object { + private const val DELAY_TIME_MILLIS = 2000L // 延迟时间,单位毫秒 + } } \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/manager/ActivityManager.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/manager/ActivityManager.kt index 24c8937..fbed3a6 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/manager/ActivityManager.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/manager/ActivityManager.kt @@ -5,7 +5,6 @@ import android.app.Application import android.app.Application.ActivityLifecycleCallbacks import android.os.Bundle import androidx.collection.ArrayMap -import timber.log.Timber import java.util.* class ActivityManager private constructor() : ActivityLifecycleCallbacks { @@ -58,6 +57,7 @@ class ActivityManager private constructor() : ActivityLifecycleCallbacks { fun registerApplicationLifecycleCallback(callback: ApplicationLifecycleCallback) { lifecycleCallbacks.add(callback) } + fun unregisterApplicationLifecycleCallback(callback: ApplicationLifecycleCallback) { lifecycleCallbacks.remove(callback) } @@ -108,39 +108,32 @@ class ActivityManager private constructor() : ActivityLifecycleCallbacks { } override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { - Timber.i("%s - onCreate", activity.javaClass.simpleName) if (activitySet.size == 0) { for (callback: ApplicationLifecycleCallback? in lifecycleCallbacks) { callback?.onApplicationCreate(activity) } - Timber.i("%s - onApplicationCreate", activity.javaClass.simpleName) } activitySet[getObjectTag(activity)] = activity topActivity = activity } override fun onActivityStarted(activity: Activity) { - Timber.i("%s - onStart", activity.javaClass.simpleName) } override fun onActivityResumed(activity: Activity) { - Timber.i("%s - onResume", activity.javaClass.simpleName) if (topActivity === activity && resumedActivity == null) { for (callback: ApplicationLifecycleCallback in lifecycleCallbacks) { callback.onApplicationForeground(activity) } - Timber.i("%s - onApplicationForeground", activity.javaClass.simpleName) } topActivity = activity resumedActivity = activity } override fun onActivityPaused(activity: Activity) { - Timber.i("%s - onPause", activity.javaClass.simpleName) } override fun onActivityStopped(activity: Activity) { - Timber.i("%s - onStop", activity.javaClass.simpleName) if (resumedActivity === activity) { resumedActivity = null } @@ -148,16 +141,13 @@ class ActivityManager private constructor() : ActivityLifecycleCallbacks { for (callback: ApplicationLifecycleCallback in lifecycleCallbacks) { callback.onApplicationBackground(activity) } - Timber.i("%s - onApplicationBackground", activity.javaClass.simpleName) } } override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { - Timber.i("%s - onSaveInstanceState", activity.javaClass.simpleName) } override fun onActivityDestroyed(activity: Activity) { - Timber.i("%s - onDestroy", activity.javaClass.simpleName) activitySet.remove(getObjectTag(activity)) if (topActivity === activity) { topActivity = null @@ -166,7 +156,6 @@ class ActivityManager private constructor() : ActivityLifecycleCallbacks { for (callback: ApplicationLifecycleCallback in lifecycleCallbacks) { callback.onApplicationDestroy(activity) } - Timber.i("%s - onApplicationDestroy", activity.javaClass.simpleName) } } diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/AppConfig.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/AppConfig.kt index 276f853..facb814 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/AppConfig.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/AppConfig.kt @@ -1,6 +1,6 @@ package com.localee.mireo.app.other -import com.localee.mireo.app.BuildConfig +import com.localee.mireo.shortapp.BuildConfig object AppConfig { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/DebugLoggerTree.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/DebugLoggerTree.kt deleted file mode 100644 index b3b03a7..0000000 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/DebugLoggerTree.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.localee.mireo.app.other - -import android.os.Build -import timber.log.Timber.DebugTree - -class DebugLoggerTree : DebugTree() { - - companion object { - private const val MAX_TAG_LENGTH: Int = 23 - } - - override fun createStackElementTag(element: StackTraceElement): String { - val tag: String = "(" + element.fileName + ":" + element.lineNumber + ")" - if (tag.length <= MAX_TAG_LENGTH || Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - return tag - } - return tag.substring(0, MAX_TAG_LENGTH) - } -} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/Logger.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/Logger.kt new file mode 100644 index 0000000..0baf148 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/Logger.kt @@ -0,0 +1,21 @@ +package com.localee.mireo.app.other + +import android.util.Log + +object Logger { + private const val GLOBAL_TAG = "AppLogger" + + fun d(message: String, tag: String = GLOBAL_TAG) { + if (AppConfig.isDebug()) Log.d(tag, buildLogMessage(message)) + } + + fun e(throwable: Throwable, message: String = "", tag: String = GLOBAL_TAG) { + if (AppConfig.isDebug()) { + Log.e(tag, buildLogMessage(message), throwable) + } + } + + private fun buildLogMessage(message: String): String { + return "[${Thread.currentThread().name}] $message" + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/MaterialHeader.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/MaterialHeader.kt index bf8c1c2..cb93e31 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/MaterialHeader.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/MaterialHeader.kt @@ -11,7 +11,7 @@ import android.widget.ImageView import androidx.annotation.ColorInt import androidx.annotation.ColorRes import androidx.core.content.ContextCompat -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R import com.scwang.smart.refresh.header.material.CircleImageView import com.scwang.smart.refresh.header.material.MaterialProgressDrawable import com.scwang.smart.refresh.layout.api.RefreshHeader diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/MsConstants.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/MsConstants.kt index c81a7d8..60cd1d7 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/MsConstants.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/MsConstants.kt @@ -11,27 +11,16 @@ object MsConstants { const val Constants_user_agreement = "https://www.mireotv.com/user_policy" const val Constants_privacy_policy = "https://www.mireotv.com/private" - const val EVENT_VIDEO_CLOSE = "event_video_close" - const val EVENT_VIDEO_NEXT = "event_video_next" - const val EVENT_VIDEO_HOME_NEXT = "event_video_home_next" - const val EVENT_VIDEO_PLAY = "event_video_play" - const val EVENT_VIDEO_UPDATE = "event_video_update" - const val EVENT_SELECT_COLLECT = "event_select_collect" - const val EVENT_SELECT_HOME_COLLECT = "event_select_home_collect" - const val EVENT_CLICK_COLLECTION = "event_click_Collection" - const val EVENT_TO_LOGIN = "event_to_login" - const val EVENT_SHOW_AD = "event_show_ad" - const val EVENT_ADD_IN = "event_add_in" - const val EVENT_TO_HOME = "event_to_home" - const val EVENT_DELE_ACC = "event_dele_acc" - const val EVENT_UPDATE_MAIN = "event_update_main" - const val EVENT_UPDATE_USER = "event_update_user_info" - const val EVENT_MAIN_UPDATE_USER_INFO = "event_update_user_info" - const val CLOSE_VIDEO = "close_video" - const val EVENT_SHOW_ADS = "event_show_ads" - const val EVENT_UPDATE_COLLECTION = "event_update_Collection" + const val feedback_URL_res: String = "https://campaign.mireotv.com/pages/leave/index" + const val feedback_list_URL_res: String = "https://campaign.mireotv.com/pages/leave/list" + const val feedback_detail_URL_res: String = "https://campaign.mireotv.com/pages/leave/detail" + const val REWARD_URL_RES: String = "https://campaign.mireotv.com/" + const val CONSTANTS_lang_key = "lang-key" + const val CONSTANTS_Detail_id = "CONSTANTS_Detail_id" + var IsRegister: Boolean = true + var IsFirst: Boolean = true var ExampleIsCurrentPage: Boolean = true var Exampleplaying: Boolean = false var ExampleDetailPlaying: Boolean = false @@ -40,6 +29,7 @@ object MsConstants { var CanNotification: Boolean = false var WebRefresh: Boolean = false var isBannerScrolling: Boolean = true + var ExampleLock: Boolean = false var seek = true const val Constants_RecommendPlayerView_PLAYER_STATUS_FINISHExample = "Constants_RecommendPlayerView_PLAYER_STATUS_FINISHExample" @@ -62,4 +52,41 @@ object MsConstants { const val CONSTANTS_activity_id = "CONSTANTS_activity_id" const val CONSTANTS_stop_play = "CONSTANTS_stop_play" + const val Constants_requestPermissions_photo = "Constants_requestPermissions_photo" + const val CONSTANTS_auth_refresh = "CONSTANTS_auth_refresh" + const val CONSTANTS_refresh_translate = "CONSTANTS_refresh_translate" + const val CONSTANTS_out_login = "CONSTANTS_out_login" + const val CONSTANTS_refresh_home = "CONSTANTS_refresh_home" + const val CONSTANTS_refresh_me = "CONSTANTS_refresh_me" + const val CONSTANTS_user_refresh = "CONSTANTS_user_refresh" + const val Constants_language_set = "Constants_language_set" + const val Constants_language_refresh = "Constants_language_refresh" + const val Constants_Main_Video_info = "Constants_Main_Video_info" + const val Constants_openFeedback = "Constants_openFeedback" + const val Constants_openFeedbackDetail = "Constants_openFeedbackDetail" + const val Constants_requestPermissions_photo_detail = + "Constants_requestPermissions_photo_detail" + const val CONSTANTS_rating = "CONSTANTS_rating" + const val CONSTANTS_web_refresh = "CONSTANTS_web_refresh" + const val CONSTANTS_Episode = "CONSTANTS_Episode" + const val CONSTANTS_Login = "CONSTANTS_Login" + + const val CONSTANTS_enterTheApp = "CONSTANTS_enterTheApp" + const val CONSTANTS_onLine = "CONSTANTS_onLine" + const val CONSTANTS_leaveApp = "CONSTANTS_leaveApp" + + const val Constants_DDL_Url = "Constants_DDL_Url" + const val Constants_Main_Video_status = "Constants_Main_Video_status" + + const val CONSTANTS_examplePayReq = "CONSTANTS_examplePayReq" + const val CONSTANTS_pay_refresh = "CONSTANTS_pay_refresh" + + const val Constants_onTokenRefresh = "Constants_onTokenRefresh" + const val CONSTANTS_PREF_LAST_POPUP_TIME_Notification = + "CONSTANTS_PREF_LAST_POPUP_TIME_Notification" + const val ONE_DAY_IN_MILLIS = 24 * 60 * 60 * 1000L + const val ONE_DAY_IN_MILLIS_VIP = 60 * 60 * 1000L + const val CONSTANTS_web_notification = "CONSTANTS_web_notification" + + } \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/MyFirebaseMessagingService.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/MyFirebaseMessagingService.kt new file mode 100644 index 0000000..d2f2060 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/MyFirebaseMessagingService.kt @@ -0,0 +1,231 @@ +package com.localee.mireo.app.other + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.graphics.Bitmap +import android.graphics.drawable.Drawable +import android.media.RingtoneManager +import android.os.Build +import android.util.Log +import androidx.core.app.NotificationCompat +import androidx.work.OneTimeWorkRequest +import androidx.work.WorkManager +import androidx.work.Worker +import androidx.work.WorkerParameters +import com.bumptech.glide.Glide +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition +import com.google.firebase.messaging.FirebaseMessagingService +import com.google.firebase.messaging.RemoteMessage +import com.localee.mireo.app.ui.activity.HomeActivity +import com.localee.mireo.shortapp.R +import org.greenrobot.eventbus.EventBus + +class MyFirebaseMessagingService : FirebaseMessagingService() { + + private var notificationId: Int = 0 + + // [START receive_message] + override fun onMessageReceived(remoteMessage: RemoteMessage) { + // Not getting messages here? See why this may be: https://goo.gl/39bRNJ + Log.d(TAG, "From: ${remoteMessage.from}") + + // Check if message contains a data payload. +// if (remoteMessage.data.isNotEmpty()) { + // Check if data needs to be processed by long running job +// if (needsToBeScheduled()) { +// // For long-running tasks (10 seconds or more) use WorkManager. +// scheduleJob() +// } else { +// // Handle message within 10 seconds +// handleNow() +// } +// } + Log.d(TAG, "Message data payload: ${remoteMessage.data}") + // Check if message contains a notification payload. +// remoteMessage.notification?.let { +// Log.d(TAG, "Message Notification Body: ${it.body}") +// +// } +// if (ExampleApplication.isAppInBackground) { + sendNotification(remoteMessage.data) +// } + // Also if you intend on generating your own notifications as a result of a received FCM + // message, here is where that should be initiated. See sendNotification method below. + } + + private fun needsToBeScheduled() = true + + // [START on_new_token] + /** + * Called if the FCM registration token is updated. This may occur if the security of + * the previous token had been compromised. Note that this is called when the + * FCM registration token is initially generated so this is where you would retrieve the token. + */ + override fun onNewToken(token: String) { + Log.d(TAG, "Refreshed token: $token") + + // If you want to send messages to this application instance or + // manage this apps subscriptions on the server side, send the + // FCM registration token to your app server. + sendRegistrationToServer(token) + } + // [END on_new_token] + + private fun scheduleJob() { + // [START dispatch_job] + val work = OneTimeWorkRequest.Builder(MyWorker::class.java) + .build() + WorkManager.getInstance(this) + .beginWith(work) + .enqueue() + // [END dispatch_job] + } + + private fun handleNow() { + Log.d(TAG, "Short lived task is done.") + } + + private fun sendRegistrationToServer(token: String?) { + Log.d(TAG, "sendRegistrationTokenToServer($token)") + EventBus.getDefault() + .post(MsConstants.Constants_onTokenRefresh) + } + + private fun sendNotification( + data: MutableMap + ) { + val intent = Intent(this, HomeActivity::class.java) + var title = "" + var messageBody = "" + var poster = "" + if (data.isNotEmpty()) { + if (data.containsKey("message_title")) { + title = data["message_title"].toString() + intent.putExtra("title", title) + } + if (data.containsKey("message_body")) { + messageBody = data["message_body"].toString() + } + if (data.containsKey("message_id")) { + val message_id = data["message_id"] + intent.putExtra("message_id", message_id) + } + if (data.containsKey("path")) { + when (data["path"]) { + "detail" -> { + if (data.containsKey("short_play_id")) { + val short_play_id = data["short_play_id"] + intent.putExtra("short_play_id", short_play_id) + } + intent.putExtra("path", "detail") + } + + "promotion" -> { + intent.putExtra("path", "promotion") + } + + "orderDetail" -> { + intent.putExtra("path", "orderDetail") + } + + "feedback" -> { + intent.putExtra("path", "feedback") + } + } + } + if (data.containsKey("poster")) { + poster = data["poster"].toString() + Glide.with(this) + .asBitmap() + .load(poster) + .into(object : CustomTarget() { + override fun onResourceReady( + resource: Bitmap, + transition: Transition? + ) { + setNotification(intent, title, messageBody, resource) + } + + override fun onLoadFailed(errorDrawable: Drawable?) { + super.onLoadFailed(errorDrawable) + + } + + override fun onLoadCleared(placeholder: Drawable?) { + + } + }) + } else { + setNotification(intent, title, messageBody, null) + } + } + } + + private fun setNotification( + intent: Intent, + title: String, + messageBody: String, + resource: Bitmap? + ) { + val pendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + PendingIntent.getActivity( + this, + 0, + intent, + PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + ) + } else { + PendingIntent.getActivity( + this, + 0, + intent, + PendingIntent.FLAG_UPDATE_CURRENT + ) + } + val channelId = getString(R.string.default_notification_channel_id) + val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) + val notificationBuilder = if (resource != null) NotificationCompat.Builder(this, channelId) + .setSmallIcon(R.mipmap.ic_launcher) + .setContentTitle(title) + .setContentText(messageBody) + .setAutoCancel(true) + .setSound(defaultSoundUri) + .setLargeIcon(resource) + .setContentIntent(pendingIntent) else NotificationCompat.Builder(this, channelId) + .setSmallIcon(R.mipmap.ic_launcher) + .setContentTitle(title) + .setContentText(messageBody) + .setAutoCancel(true) + .setSound(defaultSoundUri) + .setContentIntent(pendingIntent) + + val notificationManager = + getSystemService(NOTIFICATION_SERVICE) as NotificationManager + + // Since android Oreo notification channel is needed. + val channel = NotificationChannel( + channelId, + getString(R.string.default_notification_channel_id), + NotificationManager.IMPORTANCE_DEFAULT + ) + notificationManager.createNotificationChannel(channel) + + notificationId++ + notificationManager.notify(notificationId, notificationBuilder.build()) + } + + companion object { + private const val TAG = "MyFirebaseMsgService" + } + + internal class MyWorker(appContext: Context, workerParams: WorkerParameters) : + Worker(appContext, workerParams) { + override fun doWork(): Result { + return Result.success() + } + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/PermissionCallback.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/PermissionCallback.kt deleted file mode 100644 index f3483f0..0000000 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/PermissionCallback.kt +++ /dev/null @@ -1,188 +0,0 @@ -package com.localee.mireo.app.other - -import android.app.Activity -import android.content.* -import android.os.* -import com.hjq.base.BaseDialog -import com.localee.mireo.app.manager.* -import com.localee.mireo.app.ui.dialog.MessageDialog -import com.hjq.permissions.OnPermissionCallback -import com.hjq.permissions.Permission -import com.hjq.permissions.XXPermissions -import com.hjq.toast.ToastUtils -import com.localee.mireo.app.manager.ActivityManager -import java.util.* -import com.localee.mireo.app.R - -abstract class PermissionCallback : OnPermissionCallback { - - override fun onDenied(permissions: MutableList, never: Boolean) { - if (never) { - showPermissionDialog(permissions) - return - } - if (permissions.size == 1 && (Permission.ACCESS_BACKGROUND_LOCATION == permissions[0])) { - ToastUtils.show(R.string.common_permission_fail_4) - return - } - ToastUtils.show(R.string.common_permission_fail_1) - } - - protected fun showPermissionDialog(permissions: MutableList) { - val activity: Activity? = ActivityManager.getInstance().getTopActivity() - if ((activity == null) || activity.isFinishing || activity.isDestroyed) { - return - } - MessageDialog.Builder(activity) - .setTitle(R.string.common_permission_alert) - .setMessage(getPermissionHint(activity, permissions)) - .setConfirm(R.string.common_permission_goto) - .setCancel(null) - .setCancelable(false) - .setListener(object : MessageDialog.OnListener { - - override fun onConfirm(dialog: BaseDialog?) { - XXPermissions.startPermissionActivity(activity, permissions) - } - }) - .show() - } - - protected fun getPermissionHint(context: Context, permissions: MutableList): String { - if (permissions.isEmpty()) { - return context.getString(R.string.common_permission_fail_2) - } - val hints: MutableList = ArrayList() - for (permission: String? in permissions) { - when (permission) { - Permission.READ_EXTERNAL_STORAGE, - Permission.WRITE_EXTERNAL_STORAGE, - Permission.MANAGE_EXTERNAL_STORAGE -> { - val hint: String = context.getString(R.string.common_permission_storage) - if (!hints.contains(hint)) { - hints.add(hint) - } - } - Permission.CAMERA -> { - val hint: String = context.getString(R.string.common_permission_camera) - if (!hints.contains(hint)) { - hints.add(hint) - } - } - Permission.RECORD_AUDIO -> { - val hint: String = context.getString(R.string.common_permission_microphone) - if (!hints.contains(hint)) { - hints.add(hint) - } - } - Permission.ACCESS_FINE_LOCATION, - Permission.ACCESS_COARSE_LOCATION, - Permission.ACCESS_BACKGROUND_LOCATION -> { - val hint: String = if (!permissions.contains(Permission.ACCESS_FINE_LOCATION) && - !permissions.contains(Permission.ACCESS_COARSE_LOCATION)) { - context.getString(R.string.common_permission_location_background) - } else { - context.getString(R.string.common_permission_location) - } - if (!hints.contains(hint)) { - hints.add(hint) - } - } - Permission.READ_PHONE_STATE, - Permission.CALL_PHONE, - Permission.ADD_VOICEMAIL, - Permission.USE_SIP, - Permission.READ_PHONE_NUMBERS, - Permission.ANSWER_PHONE_CALLS -> { - val hint: String = context.getString(R.string.common_permission_phone) - if (!hints.contains(hint)) { - hints.add(hint) - } - } - Permission.GET_ACCOUNTS, - Permission.READ_CONTACTS, - Permission.WRITE_CONTACTS -> { - val hint: String = context.getString(R.string.common_permission_contacts) - if (!hints.contains(hint)) { - hints.add(hint) - } - } - Permission.READ_CALENDAR, - Permission.WRITE_CALENDAR -> { - val hint: String = context.getString(R.string.common_permission_calendar) - if (!hints.contains(hint)) { - hints.add(hint) - } - } - Permission.READ_CALL_LOG, - Permission.WRITE_CALL_LOG, - Permission.PROCESS_OUTGOING_CALLS -> { - val hint: String = context.getString(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) R.string.common_permission_call_log else R.string.common_permission_phone) - if (!hints.contains(hint)) { - hints.add(hint) - } - } - Permission.BODY_SENSORS -> { - val hint: String = context.getString(R.string.common_permission_sensors) - if (!hints.contains(hint)) { - hints.add(hint) - } - } - Permission.ACTIVITY_RECOGNITION -> { - val hint: String = context.getString(R.string.common_permission_activity_recognition) - if (!hints.contains(hint)) { - hints.add(hint) - } - } - Permission.SEND_SMS, - Permission.RECEIVE_SMS, - Permission.READ_SMS, - Permission.RECEIVE_WAP_PUSH, - Permission.RECEIVE_MMS -> { - val hint: String = context.getString(R.string.common_permission_sms) - if (!hints.contains(hint)) { - hints.add(hint) - } - } - Permission.REQUEST_INSTALL_PACKAGES -> { - val hint: String = context.getString(R.string.common_permission_install) - if (!hints.contains(hint)) { - hints.add(hint) - } - } - Permission.NOTIFICATION_SERVICE -> { - val hint: String = context.getString(R.string.common_permission_notification) - if (!hints.contains(hint)) { - hints.add(hint) - } - } - Permission.SYSTEM_ALERT_WINDOW -> { - val hint: String = context.getString(R.string.common_permission_window) - if (!hints.contains(hint)) { - hints.add(hint) - } - } - Permission.WRITE_SETTINGS -> { - val hint: String = context.getString(R.string.common_permission_setting) - if (!hints.contains(hint)) { - hints.add(hint) - } - } - } - } - if (hints.isNotEmpty()) { - val builder: StringBuilder = StringBuilder() - for (text: String? in hints) { - if (builder.isEmpty()) { - builder.append(text) - } else { - builder.append("、") - .append(text) - } - } - builder.append(" ") - return context.getString(R.string.common_permission_fail_3, builder.toString()) - } - return context.getString(R.string.common_permission_fail_2) - } -} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/SmartBallPulseFooter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/SmartBallPulseFooter.kt index 9fa1174..833e475 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/SmartBallPulseFooter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/SmartBallPulseFooter.kt @@ -9,7 +9,7 @@ import android.util.AttributeSet import android.view.animation.AccelerateDecelerateInterpolator import androidx.annotation.ColorInt import androidx.core.graphics.ColorUtils -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R import com.scwang.smart.refresh.layout.api.RefreshFooter import com.scwang.smart.refresh.layout.api.RefreshLayout import com.scwang.smart.refresh.layout.constant.SpinnerStyle diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/TitleBarStyle.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/TitleBarStyle.kt index c49ed16..0a92074 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/TitleBarStyle.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/TitleBarStyle.kt @@ -7,8 +7,8 @@ import android.widget.TextView import androidx.appcompat.widget.AppCompatTextView import androidx.core.content.ContextCompat import com.hjq.bar.style.LightBarStyle -import com.localee.mireo.app.R -import com.hjq.widget.view.PressAlphaTextView +import com.localee.mireo.shortapp.R +import com.localee.mireo.app.widget.view.PressAlphaTextView class TitleBarStyle : LightBarStyle() { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/ToastStyle.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/ToastStyle.kt index 606bb4a..548905e 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/ToastStyle.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/ToastStyle.kt @@ -3,7 +3,7 @@ package com.localee.mireo.app.other import android.content.Context import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R import com.hjq.toast.style.BlackToastStyle class ToastStyle : BlackToastStyle() { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/AboutActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/AboutActivity.kt index 705ff62..f909365 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/AboutActivity.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/AboutActivity.kt @@ -3,10 +3,10 @@ package com.localee.mireo.app.ui.activity import android.content.Intent import android.net.Uri import android.view.View -import com.localee.mireo.app.R -import com.localee.mireo.app.aop.SingleClick +import com.localee.mireo.shortapp.R import com.localee.mireo.app.app.AppActivity import com.localee.mireo.app.other.MsConstants +import com.localee.mireo.app.utils.singleClick class AboutActivity : AppActivity() { @@ -23,20 +23,22 @@ class AboutActivity : AppActivity() { override fun initData() { } - @SingleClick override fun onClick(view: View) { - when (view.id) { - R.id.sb_about_web -> { - val webIntent = Intent(Intent.ACTION_VIEW, Uri.parse(MsConstants.Constants_web)) - startActivity(webIntent) - } + singleClick { + when (view.id) { + R.id.sb_about_web -> { + val webIntent = Intent(Intent.ACTION_VIEW, Uri.parse(MsConstants.Constants_web)) + startActivity(webIntent) + } - R.id.sb_about_privacy -> { - BrowserActivity.start(this, MsConstants.Constants_privacy_policy) - } + R.id.sb_about_privacy -> { + BrowserActivity.start(this, MsConstants.Constants_privacy_policy) + } + + R.id.sb_about_agreement -> { + BrowserActivity.start(this, MsConstants.Constants_user_agreement) + } - R.id.sb_about_agreement -> { - BrowserActivity.start(this, MsConstants.Constants_user_agreement) } } diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/AccountDeleteActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/AccountDeleteActivity.kt new file mode 100644 index 0000000..76c6649 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/AccountDeleteActivity.kt @@ -0,0 +1,132 @@ +package com.localee.mireo.app.ui.activity + +import android.graphics.Color +import android.widget.ImageView +import androidx.appcompat.widget.AppCompatTextView +import com.facebook.login.LoginManager +import com.hjq.http.EasyHttp +import com.hjq.http.listener.HttpCallbackProxy +import com.hjq.shape.view.ShapeTextView +import com.localee.mireo.app.app.AppActivity +import com.localee.mireo.app.http.api.CustomerRegisterApi +import com.localee.mireo.app.http.api.DoLogoffApi +import com.localee.mireo.app.http.model.HttpData +import com.localee.mireo.app.other.MsConstants +import com.localee.mireo.app.other.MsConstants.CONSTANTS_user_refresh +import com.localee.mireo.app.ui.videoPaly.ExampleUnFavoriteDialog +import com.localee.mireo.app.utils.MsMMKVUtils +import com.localee.mireo.app.utils.singleClick +import com.localee.mireo.shortapp.R +import org.greenrobot.eventbus.EventBus + +class AccountDeleteActivity : AppActivity() { + + private val ivSelect: ImageView? by lazy { findViewById(R.id.iv_select) } + private val tvEight: ShapeTextView? by lazy { findViewById(R.id.tv_eight) } + + private var isSelect = false + + override fun getLayoutId(): Int { + return R.layout.activity_account_delete + } + + override fun initView() { + ivSelect?.setOnClickListener { + singleClick { + if (isSelect) { + isSelect = false + ivSelect?.setImageResource(R.mipmap.compound_normal_ic_1) + tvEight?.setTextColor(Color.parseColor("#8B8B8B")) + tvEight?.shapeDrawableBuilder?.setSolidGradientColors( + 0xff272a30.toInt(), 0xff272a30.toInt() + ) + ?.intoBackground() + } else { + isSelect = true + ivSelect?.setImageResource(R.mipmap.checkbox_checked_ic) + tvEight?.setTextColor(getColor(R.color.white)) + tvEight?.shapeDrawableBuilder?.setSolidGradientColors( + 0XffF8726D.toInt(), 0XFFF24C92.toInt() + ) + ?.intoBackground() + } + } + } + tvEight?.setOnClickListener { + singleClick { + if (!isSelect) { + return@singleClick + } + val exampleUnFavoriteDialog = ExampleUnFavoriteDialog(this) + val tvThinkAgain = + exampleUnFavoriteDialog.findViewById(R.id.example_tv_think_again) + val tvUnfavorite = + exampleUnFavoriteDialog.findViewById(R.id.example_tv_unfavorite) + val tvTitle = + exampleUnFavoriteDialog.findViewById(R.id.example_tv_title) + val tvContent = + exampleUnFavoriteDialog.findViewById(R.id.example_tv_content) + tvThinkAgain.text = "Cancel" + tvUnfavorite.text = "Confirm" + tvTitle.text = "Tips" + tvContent.text = "Are you sure you want to cancel you account?" + tvThinkAgain.setOnClickListener { exampleUnFavoriteDialog.dismiss() } + tvUnfavorite.setOnClickListener { + doLogoff() + exampleUnFavoriteDialog.dismiss() + } + exampleUnFavoriteDialog.show() + } + } + + } + + override fun initData() { + + + } + + fun doLogoff() { + EasyHttp.post(this) + .api(DoLogoffApi()) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + toast("Logout successfully") + LoginManager.getInstance().logOut() + getCustomerRegister() + } ?: run { + toast(getString(R.string.example_service_exception_please_try_again)) + } + } + }) + } + + + private fun getCustomerRegister() { + EasyHttp.post(this).api(CustomerRegisterApi()) + .request(object : HttpCallbackProxy>(this) { + + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + MsMMKVUtils.getMMKV() + .putString(MsConstants.ACCESS_TOKEN, it.token) + EventBus.getDefault() + .post(MsConstants.CONSTANTS_leaveApp) + EventBus.getDefault() + .post(MsConstants.CONSTANTS_enterTheApp) + EventBus.getDefault().post(MsConstants.CONSTANTS_quality_refresh) + EventBus.getDefault() + .post(CONSTANTS_user_refresh) + MsConstants.WebRefresh = true + HomeActivity.start(this@AccountDeleteActivity) + finish() + } ?: run { + toast(getString(R.string.example_service_exception_please_try_again)) + } + } + }) + } + + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/BrowserActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/BrowserActivity.kt index b4900cf..386585d 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/BrowserActivity.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/BrowserActivity.kt @@ -1,17 +1,17 @@ package com.localee.mireo.app.ui.activity import android.app.Activity -import android.content.* +import android.content.Context +import android.content.Intent import android.graphics.Bitmap import android.graphics.drawable.BitmapDrawable import android.text.TextUtils -import android.view.* +import android.view.KeyEvent +import android.view.View import android.webkit.WebView import android.widget.ProgressBar -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R import com.localee.mireo.app.action.StatusAction -import com.localee.mireo.app.aop.CheckNet -import com.localee.mireo.app.aop.Log import com.localee.mireo.app.app.AppActivity import com.localee.mireo.app.widget.BrowserView import com.localee.mireo.app.widget.BrowserView.BrowserChromeClient @@ -28,8 +28,6 @@ class BrowserActivity : AppActivity(), StatusAction, OnRefreshListener { const val INTENT_KEY_IN_URL: String = "url" - @CheckNet - @Log fun start(context: Context, url: String) { if (TextUtils.isEmpty(url)) { return @@ -85,7 +83,6 @@ class BrowserActivity : AppActivity(), StatusAction, OnRefreshListener { return super.onKeyDown(keyCode, event) } - @CheckNet private fun reload() { browserView?.reload() } @@ -99,7 +96,12 @@ class BrowserActivity : AppActivity(), StatusAction, OnRefreshListener { private inner class AppBrowserViewClient : BrowserViewClient() { - override fun onReceivedError(view: WebView, errorCode: Int, description: String, failingUrl: String) { + override fun onReceivedError( + view: WebView, + errorCode: Int, + description: String, + failingUrl: String + ) { post { showError(object : OnRetryListener { override fun onRetry(layout: StatusLayout) { @@ -120,7 +122,8 @@ class BrowserActivity : AppActivity(), StatusAction, OnRefreshListener { } } - private inner class AppBrowserChromeClient constructor(view: BrowserView) : BrowserChromeClient(view) { + private inner class AppBrowserChromeClient constructor(view: BrowserView) : + BrowserChromeClient(view) { override fun onReceivedTitle(view: WebView, title: String?) { if (title == null) { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/FeedBackActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/FeedBackActivity.kt new file mode 100644 index 0000000..36a7db4 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/FeedBackActivity.kt @@ -0,0 +1,321 @@ +package com.localee.mireo.app.ui.activity + +import android.Manifest +import android.annotation.SuppressLint +import android.content.ContentResolver +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Color +import android.net.Uri +import android.os.Build +import android.util.Base64 +import android.util.Log +import android.view.View +import android.webkit.JsPromptResult +import android.webkit.JsResult +import android.webkit.WebChromeClient +import android.webkit.WebResourceError +import android.webkit.WebResourceRequest +import android.webkit.WebSettings +import android.webkit.WebView +import android.webkit.WebViewClient +import android.widget.ImageView +import android.widget.TextView +import androidx.annotation.RequiresApi +import androidx.core.app.ActivityCompat +import androidx.lifecycle.lifecycleScope +import com.blankj.utilcode.util.PermissionUtils +import com.hjq.bar.TitleBar +import com.hjq.http.EasyHttp +import com.hjq.http.listener.HttpCallbackProxy +import com.localee.mireo.shortapp.R +import com.localee.mireo.app.app.AppActivity +import com.localee.mireo.app.http.api.NoticeNumApi +import com.localee.mireo.app.http.model.HttpData +import com.localee.mireo.app.other.MsConstants +import com.localee.mireo.app.utils.JsBridge +import com.localee.mireo.app.utils.TranslatesUtils +import com.localee.mireo.app.utils.singleClick +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import java.io.ByteArrayOutputStream +import java.io.InputStream + +class FeedBackActivity : AppActivity() { + + private val title: TitleBar? by lazy { findViewById(R.id.title) } + private val ivRight: ImageView? by lazy { findViewById(R.id.iv_right) } + private val tvBackNum: TextView? by lazy { findViewById(R.id.tv_back_num) } + private val webView: WebView? by lazy { findViewById(R.id.webView) } + + override fun getLayoutId(): Int { + return R.layout.activity_feedback + } + + override fun initView() { + EventBus.getDefault().register(this) + if (TranslatesUtils.translates() != null) { + title?.setTitle(TranslatesUtils.translates()?.feedback) + } + ivRight?.setOnClickListener { + singleClick { + startActivity( + Intent( + this, + FeedBackListActivity::class.java + ) + ) + } + } + } + + override fun initData() { + setWebView() + showDialog() + loadPageUrl(MsConstants.feedback_URL_res) + } + + override fun onResume() { + super.onResume() + getNoticeNum() + } + + private fun getNoticeNum() { + EasyHttp.post(this) + .api(NoticeNumApi()) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (it.feedback_notice_num != 0) { + tvBackNum?.visibility = View.VISIBLE + tvBackNum?.text = it.feedback_notice_num.toString() + } else { + tvBackNum?.visibility = View.INVISIBLE + } + } + } + }) + } + + @SuppressLint("SetJavaScriptEnabled") + private fun setWebView() { + val webSettings: WebSettings = webView!!.settings + webSettings.javaScriptEnabled = true +// webView?.webChromeClient = WebChromeClient() + webView?.webChromeClient = object : WebChromeClient() { + override fun onJsAlert( + view: WebView, + url: String, + message: String, + result: JsResult + ): Boolean { + result.confirm() + return true + } + + override fun onJsConfirm( + view: WebView, + url: String, + message: String, + result: JsResult + ): Boolean { + + return true + } + + override fun onJsPrompt( + view: WebView, + url: String, + message: String, + defaultValue: String, + result: JsPromptResult + ): Boolean { + + return true + } + } + webView?.setBackgroundColor(Color.TRANSPARENT) + webView?.webViewClient = object : WebViewClient() { + override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { + super.onPageStarted(view, url, favicon) + + } + + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + hideDialog() + } + + override fun onReceivedError( + view: WebView?, + request: WebResourceRequest?, + error: WebResourceError? + ) { + super.onReceivedError(view, request, error) + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.network_error.toString()) + } else { + toast(getString(R.string.example_service_exception_please_try_again)) + } + hideDialog() + } + } + webSettings.domStorageEnabled = true + webSettings.loadsImagesAutomatically = true + webSettings.useWideViewPort = true + webSettings.loadWithOverviewMode = true + webSettings.builtInZoomControls = true + webSettings.displayZoomControls = false + webView?.addJavascriptInterface( + JsBridge(this), + "AndroidInterface" + ) + } + + private fun loadPageUrl(url: String) { + webView?.loadUrl(url) + } + + private val REQUEST_PICK_FILE: Int = 1002 + private val REQUEST_PERMISSIONS = 1001 + + @RequiresApi(Build.VERSION_CODES.M) + private fun requestPermissions() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + ActivityCompat.requestPermissions( + this, + arrayOf( + Manifest.permission.READ_MEDIA_IMAGES, + ), + REQUEST_PERMISSIONS + ) + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + ActivityCompat.requestPermissions( + this, + arrayOf( + Manifest.permission.READ_EXTERNAL_STORAGE, + ), + REQUEST_PERMISSIONS + ) + } else { + ActivityCompat.requestPermissions( + this, + arrayOf( + Manifest.permission.READ_EXTERNAL_STORAGE, + ), + REQUEST_PERMISSIONS + ) + } + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == REQUEST_PERMISSIONS) { + if (grantResults.all { it == PackageManager.PERMISSION_GRANTED }) { + openFilePicker() + } else { +// toast(TranslatesUtils.translates()?.open_photo_tips.toString()) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + PermissionUtils.launchAppDetailsSettings() + } + } + } + } + + private fun openFilePicker() { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "image/*" + } + startActivityForResult(intent, REQUEST_PICK_FILE) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == REQUEST_PICK_FILE && resultCode == RESULT_OK) { + data?.data?.let { uri -> + compressAndConvertImage(uri) + } + } + } + + private fun compressAndConvertImage(uri: Uri) { + lifecycleScope.launch { + val compressedImageBytes = withContext(Dispatchers.IO) { + compressImage(uri, contentResolver) + } + if (compressedImageBytes.isNotEmpty()) { + val base64String = Base64.encodeToString(compressedImageBytes, Base64.DEFAULT) + webView?.loadUrl( + "javascript:uploadConvertImage(" + "'" + base64String + "'" + ")" + ) + } + } + } + + private fun compressImage(uri: Uri, contentResolver: ContentResolver): ByteArray { + try { + val inputStream: InputStream? = contentResolver.openInputStream(uri) + val bitmap = BitmapFactory.decodeStream(inputStream) + inputStream?.close() + + val outputStream = ByteArrayOutputStream() + var quality = 100 + bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream) + + while (outputStream.toByteArray().size > 100 * 1024 && quality > 10) { + quality -= 10 + outputStream.reset() + bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream) + } + + val compressedImageBytes = outputStream.toByteArray() + Log.d( + "compressedImageBytes", + "Compressed image size: ${compressedImageBytes.size} bytes" + ) + return compressedImageBytes + } catch (e: Exception) { + e.printStackTrace() + toast( + TranslatesUtils.translates()?.picture_error ?: "Please select the correct picture~" + ) + } + return byteArrayOf() + } + + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(event: String) { + if (MsConstants.Constants_requestPermissions_photo == event) { + requestPermissions() + } + if (MsConstants.Constants_openFeedback == event) { + singleClick { + startActivity( + Intent( + this, + FeedBackListActivity::class.java + ) + ) + } + } + } + + override fun onDestroy() { + super.onDestroy() + EventBus.getDefault().unregister(this) + } + + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/FeedBackDetailsActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/FeedBackDetailsActivity.kt new file mode 100644 index 0000000..e158428 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/FeedBackDetailsActivity.kt @@ -0,0 +1,236 @@ +package com.localee.mireo.app.ui.activity + +import android.Manifest +import android.annotation.SuppressLint +import android.content.ContentResolver +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Color +import android.net.Uri +import android.os.Build +import android.util.Base64 +import android.util.Log +import android.webkit.WebChromeClient +import android.webkit.WebResourceError +import android.webkit.WebResourceRequest +import android.webkit.WebSettings +import android.webkit.WebView +import android.webkit.WebViewClient +import androidx.annotation.RequiresApi +import androidx.core.app.ActivityCompat +import androidx.lifecycle.lifecycleScope +import com.blankj.utilcode.util.PermissionUtils +import com.localee.mireo.shortapp.R +import com.localee.mireo.app.app.AppActivity +import com.localee.mireo.app.app.BaseEventBus +import com.localee.mireo.app.other.MsConstants +import com.localee.mireo.app.utils.JsBridge +import com.localee.mireo.app.utils.JsBridgeDetail +import com.localee.mireo.app.utils.MsMMKVUtils +import com.localee.mireo.app.utils.TranslatesUtils +import com.scwang.smart.refresh.layout.SmartRefreshLayout +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import java.io.ByteArrayOutputStream +import java.io.InputStream + +class FeedBackDetailsActivity : AppActivity() { + + private val webView: WebView? by lazy { findViewById(R.id.webView) } + private val rlStatusRefresh: SmartRefreshLayout? by lazy { findViewById(R.id.rl_status_refresh) } + + override fun getLayoutId(): Int { + return R.layout.activity_feedback_details + } + + override fun initView() { + EventBus.getDefault().register(this) + showDialog() + rlStatusRefresh?.setOnRefreshListener { + loadPageUrl(MsConstants.feedback_detail_URL_res) + } + } + + override fun initData() { + setWebView() + loadPageUrl(MsConstants.feedback_detail_URL_res) + } + + @SuppressLint("SetJavaScriptEnabled") + private fun setWebView() { + val webSettings: WebSettings = webView!!.settings + webSettings.javaScriptEnabled = true + webView?.webChromeClient = WebChromeClient() + webView?.setBackgroundColor(Color.TRANSPARENT) + webView?.webViewClient = object : WebViewClient() { + + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + rlStatusRefresh?.finishRefresh() + hideDialog() + } + + override fun onReceivedError( + view: WebView?, + request: WebResourceRequest?, + error: WebResourceError? + ) { + super.onReceivedError(view, request, error) + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.network_error.toString()) + } else { + toast(getString(R.string.example_service_exception_please_try_again)) + } + rlStatusRefresh?.finishRefresh() + hideDialog() + } + } + webSettings.domStorageEnabled = true + webSettings.loadsImagesAutomatically = true + webSettings.useWideViewPort = true + webSettings.loadWithOverviewMode = true + webSettings.builtInZoomControls = true + webSettings.displayZoomControls = false + webView?.addJavascriptInterface( + JsBridgeDetail(this), + "AndroidInterface" + ) + + } + + private fun loadPageUrl(url: String) { + webView?.loadUrl(url) + } + + + private val REQUEST_PICK_FILE: Int = 1003 + private val REQUEST_PERMISSIONS = 1004 + + @RequiresApi(Build.VERSION_CODES.M) + private fun requestPermissions() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + ActivityCompat.requestPermissions( + this, + arrayOf( + Manifest.permission.READ_MEDIA_IMAGES, + ), + REQUEST_PERMISSIONS + ) + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + ActivityCompat.requestPermissions( + this, + arrayOf( + Manifest.permission.READ_EXTERNAL_STORAGE, + ), + REQUEST_PERMISSIONS + ) + } else { + ActivityCompat.requestPermissions( + this, + arrayOf( + Manifest.permission.READ_EXTERNAL_STORAGE, + ), + REQUEST_PERMISSIONS + ) + } + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == REQUEST_PERMISSIONS) { + if (grantResults.all { it == PackageManager.PERMISSION_GRANTED }) { + openFilePicker() + } else { + toast(TranslatesUtils.translates()?.open_photo_tips.toString()) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + PermissionUtils.launchAppDetailsSettings() + } + } + } + } + + private fun openFilePicker() { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "image/*" + } + startActivityForResult(intent, REQUEST_PICK_FILE) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == REQUEST_PICK_FILE && resultCode == RESULT_OK) { + data?.data?.let { uri -> + compressAndConvertImage(uri) + } + } + } + + private fun compressAndConvertImage(uri: Uri) { + lifecycleScope.launch { + val compressedImageBytes = withContext(Dispatchers.IO) { + compressImage(uri, contentResolver) + } + if (compressedImageBytes.isNotEmpty()) { + val base64String = Base64.encodeToString(compressedImageBytes, Base64.DEFAULT) + webView?.loadUrl( + "javascript:uploadConvertImage(" + "'" + base64String + "'" + ")" + ) + } + } + } + + private fun compressImage(uri: Uri, contentResolver: ContentResolver): ByteArray { + try { + val inputStream: InputStream? = contentResolver.openInputStream(uri) + val bitmap = BitmapFactory.decodeStream(inputStream) + inputStream?.close() + + val outputStream = ByteArrayOutputStream() + var quality = 100 + bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream) + + while (outputStream.toByteArray().size > 100 * 1024 && quality > 10) { + quality -= 10 + outputStream.reset() + bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream) + } + + val compressedImageBytes = outputStream.toByteArray() + Log.d( + "compressedImageBytes", + "Compressed image size: ${compressedImageBytes.size} bytes" + ) + return compressedImageBytes + } catch (e: Exception) { + e.printStackTrace() + toast( + TranslatesUtils.translates()?.picture_error ?: "Please select the correct picture~" + ) + } + return byteArrayOf() + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(event: String) { + if (MsConstants.Constants_requestPermissions_photo_detail == event) { + requestPermissions() + } + } + + override fun onDestroy() { + super.onDestroy() + EventBus.getDefault().unregister(this) + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/FeedBackListActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/FeedBackListActivity.kt new file mode 100644 index 0000000..dc83f8a --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/FeedBackListActivity.kt @@ -0,0 +1,108 @@ +package com.localee.mireo.app.ui.activity + +import android.annotation.SuppressLint +import android.content.Intent +import android.graphics.Color +import android.webkit.WebChromeClient +import android.webkit.WebResourceError +import android.webkit.WebResourceRequest +import android.webkit.WebSettings +import android.webkit.WebView +import android.webkit.WebViewClient +import com.localee.mireo.shortapp.R +import com.localee.mireo.app.app.AppActivity +import com.localee.mireo.app.app.BaseEventBus +import com.localee.mireo.app.other.MsConstants +import com.localee.mireo.app.utils.JsBridge +import com.localee.mireo.app.utils.MsMMKVUtils +import com.localee.mireo.app.utils.TranslatesUtils +import com.scwang.smart.refresh.layout.SmartRefreshLayout +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode + +class FeedBackListActivity : AppActivity() { + + private val webView: WebView? by lazy { findViewById(R.id.webView) } + private val rlStatusRefresh: SmartRefreshLayout? by lazy { findViewById(R.id.rl_status_refresh) } + + override fun getLayoutId(): Int { + return R.layout.activity_feedback_list + } + + override fun initView() { + EventBus.getDefault().register(this) + showDialog() + rlStatusRefresh?.setOnRefreshListener { + loadPageUrl(MsConstants.feedback_list_URL_res) + } + } + + override fun initData() { + setWebView() + loadPageUrl(MsConstants.feedback_list_URL_res) + } + + @SuppressLint("SetJavaScriptEnabled") + private fun setWebView() { + val webSettings: WebSettings = webView!!.settings + webSettings.javaScriptEnabled = true + webView?.webChromeClient = WebChromeClient() + webView?.setBackgroundColor(Color.TRANSPARENT) + webView?.webViewClient = object : WebViewClient() { + + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + rlStatusRefresh?.finishRefresh() + hideDialog() + } + + override fun onReceivedError( + view: WebView?, request: WebResourceRequest?, error: WebResourceError? + ) { + super.onReceivedError(view, request, error) + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.network_error.toString()) + } else { + toast(getString(R.string.example_service_exception_please_try_again)) + } + rlStatusRefresh?.finishRefresh() + hideDialog() + } + } + webSettings.domStorageEnabled = true + webSettings.loadsImagesAutomatically = true + webSettings.useWideViewPort = true + webSettings.loadWithOverviewMode = true + webSettings.builtInZoomControls = true + webSettings.displayZoomControls = false + webView?.addJavascriptInterface( + JsBridge(this), "AndroidInterface" + ) + + } + + private fun loadPageUrl(url: String) { + webView?.loadUrl(url) + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(event: BaseEventBus) { + if (MsConstants.Constants_openFeedbackDetail == event.code) { + MsMMKVUtils.getMMKV() + .putString(MsConstants.CONSTANTS_Detail_id, event.data) + startActivity( + Intent( + this, FeedBackDetailsActivity::class.java + ) + ) + } + } + + override fun onDestroy() { + super.onDestroy() + EventBus.getDefault().unregister(this) + } + + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/HomeActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/HomeActivity.kt index cb01473..28d84ed 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/HomeActivity.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/HomeActivity.kt @@ -1,32 +1,95 @@ package com.localee.mireo.app.ui.activity +import android.Manifest import android.app.Activity +import android.content.ClipData +import android.content.ClipboardManager import android.content.Context import android.content.Intent +import android.content.pm.PackageManager +import android.os.Build import android.os.Bundle +import android.text.TextUtils +import android.util.Log +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels +import androidx.appcompat.widget.AppCompatImageView +import androidx.appcompat.widget.AppCompatTextView +import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView import androidx.viewpager.widget.ViewPager -import com.localee.mireo.app.utils.MsMMKVUtils +import com.blankj.utilcode.util.NetworkUtils +import com.bumptech.glide.Glide +import com.facebook.AccessToken +import com.facebook.CallbackManager +import com.facebook.CallbackManager.Factory.create +import com.facebook.FacebookCallback +import com.facebook.FacebookException +import com.facebook.GraphRequest +import com.facebook.login.LoginManager +import com.facebook.login.LoginResult +import com.google.android.gms.common.GoogleApiAvailability +import com.google.android.gms.tasks.OnCompleteListener +import com.google.firebase.messaging.FirebaseMessaging +import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.hjq.base.FragmentPagerAdapter import com.hjq.http.EasyHttp +import com.hjq.http.config.IRequestApi import com.hjq.http.listener.HttpCallbackProxy -import com.localee.mireo.app.R import com.localee.mireo.app.app.AppActivity import com.localee.mireo.app.app.AppFragment -import com.localee.mireo.app.http.api.UserInfoApi -import com.localee.mireo.app.http.api.UserInfoRes +import com.localee.mireo.app.app.BaseEventBus +import com.localee.mireo.app.base.FragmentPagerAdapter +import com.localee.mireo.app.http.api.ActionPushApi +import com.localee.mireo.app.http.api.CustomerRegisterApi +import com.localee.mireo.app.http.api.DoLoginApi +import com.localee.mireo.app.http.api.EnterTheAppApi +import com.localee.mireo.app.http.api.FirebaseTokenApi +import com.localee.mireo.app.http.api.LeaveAppApi +import com.localee.mireo.app.http.api.MessageSendReportApi +import com.localee.mireo.app.http.api.OnLineApi +import com.localee.mireo.app.http.api.OpenNotifyApi +import com.localee.mireo.app.http.api.W2aApi +import com.localee.mireo.app.http.bean.HomeDataHistoryBean +import com.localee.mireo.app.http.bean.IncidentBean +import com.localee.mireo.app.http.bean.LoginBean import com.localee.mireo.app.http.model.HttpData +import com.localee.mireo.app.other.Logger +import com.localee.mireo.app.other.MsConstants +import com.localee.mireo.app.other.MsConstants.CONSTANTS_user_refresh import com.localee.mireo.app.ui.adapter.NavigationAdapter +import com.localee.mireo.app.ui.dialog.NotificationPermissionDialog import com.localee.mireo.app.ui.fragment.ExploreFragment import com.localee.mireo.app.ui.fragment.HomeFragment import com.localee.mireo.app.ui.fragment.MessageFragment import com.localee.mireo.app.ui.fragment.MineFragment +import com.localee.mireo.app.ui.fragment.RewardFragment import com.localee.mireo.app.ui.fragment.SharedViewModel +import com.localee.mireo.app.ui.popup.CustomBottomLoginPopup +import com.localee.mireo.app.utils.DHStringUtils.getPublicRequest +import com.localee.mireo.app.utils.MsMMKVUtils +import com.localee.mireo.app.utils.NotificationUtils +import com.localee.mireo.app.utils.TranslatesUtils +import com.localee.mireo.app.utils.singleClick +import com.localee.mireo.shortapp.R +import com.lxj.xpopup.XPopup +import kotlinx.coroutines.launch +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import org.json.JSONObject +import java.util.concurrent.Executors +import java.util.concurrent.ScheduledExecutorService +import java.util.concurrent.TimeUnit -class HomeActivity : AppActivity(), NavigationAdapter.OnNavigationListener { +class HomeActivity : AppActivity(), NavigationAdapter.OnNavigationListener, + CustomBottomLoginPopup.CustomPopupOnclick { companion object { @@ -47,10 +110,29 @@ class HomeActivity : AppActivity(), NavigationAdapter.OnNavigationListener { } } + private var notificationPermissionDialog: NotificationPermissionDialog? = null + private var callbackManager: CallbackManager? = null + private var scheduler: ScheduledExecutorService? = Executors.newSingleThreadScheduledExecutor() + private val dialogHistory: ViewGroup? by lazy { findViewById(R.id.dialog_history) } + private val ivCloseHistory: ImageView? by lazy { dialogHistory?.findViewById(R.id.iv_close_history) } + private val ivVideo: ImageView? by lazy { dialogHistory?.findViewById(R.id.iv_video) } + private val tvVideoName: TextView? by lazy { dialogHistory?.findViewById(R.id.tv_video_name) } + private val tvVideoLast: TextView? by lazy { dialogHistory?.findViewById(R.id.tv_video_last) } + + + private val llMain: ConstraintLayout? by lazy { findViewById(R.id.ll_main) } private val viewPager: ViewPager? by lazy { findViewById(R.id.vp_home_pager) } private val navigationView: RecyclerView? by lazy { findViewById(R.id.rv_home_navigation) } private var navigationAdapter: NavigationAdapter? = null private var pagerAdapter: FragmentPagerAdapter>? = null + private var shortVideoId: Int = 0 + private var videoId: Int = 0 + private var needSave = false + + private var path = "" + private var short_play_id = "" + private var message_id = "" + private var title = "" private val viewModel: SharedViewModel by viewModels() @@ -59,6 +141,11 @@ class HomeActivity : AppActivity(), NavigationAdapter.OnNavigationListener { } override fun initView() { + EventBus.getDefault().register(this) + path = intent?.getStringExtra("path").toString() + short_play_id = intent?.getStringExtra("short_play_id").toString() + message_id = intent?.getStringExtra("message_id").toString() + title = intent?.getStringExtra("title").toString() navigationAdapter = NavigationAdapter(this).apply { addItem( @@ -73,6 +160,12 @@ class HomeActivity : AppActivity(), NavigationAdapter.OnNavigationListener { ContextCompat.getDrawable(this@HomeActivity, R.drawable.home_explore_selector) ) ) + addItem( + NavigationAdapter.MenuItem( + getString(R.string.home_nav_rewards), + ContextCompat.getDrawable(this@HomeActivity, R.drawable.home_rewards_selector) + ) + ) addItem( NavigationAdapter.MenuItem( getString(R.string.home_nav_my_list), @@ -88,14 +181,15 @@ class HomeActivity : AppActivity(), NavigationAdapter.OnNavigationListener { setOnNavigationListener(this@HomeActivity) navigationView?.adapter = this } + } override fun initData() { -// getCustomerUser() pagerAdapter = FragmentPagerAdapter>(this).apply { addFragment(HomeFragment.newInstance()) addFragment(ExploreFragment.newInstance()) + addFragment(RewardFragment.newInstance()) addFragment(MessageFragment.newInstance()) addFragment(MineFragment.newInstance()) viewPager?.adapter = this @@ -103,12 +197,91 @@ class HomeActivity : AppActivity(), NavigationAdapter.OnNavigationListener { onNewIntent(intent) viewModel.action.observe(this) { data -> - switchFragment(data); + switchFragment(data) } + viewModel.loginAction.observe(this) { + setLoginDialog() + } + + if (MsMMKVUtils.getMMKV() + .getString(MsConstants.ACCESS_TOKEN, "").toString() + .isNotEmpty() + ) { + enterTheApp() + val intervalMillis = 10 * 60 * 1000 + scheduler?.scheduleAtFixedRate({ + try { + lifecycleScope.launch { + onLine() + } + } catch (e: Exception) { + e.printStackTrace() + } + }, 0, intervalMillis.toLong(), TimeUnit.MILLISECONDS) + } + + + callbackManager = create() + LoginManager.getInstance().registerCallback(callbackManager, + object : FacebookCallback { + override fun onSuccess(loginResult: LoginResult) { + val enableButtons = AccessToken.getCurrentAccessToken() != null + if (enableButtons) { + val mGraphRequest = GraphRequest.newMeRequest( + loginResult.accessToken + ) { jsonObject, response -> + if (response!!.error != null) { + toast("Facebook login exception.${response.error?.exception.toString()}") + } else { + val id = jsonObject?.optString("id") + val name = jsonObject?.optString("name") + val object_pic: JSONObject? = jsonObject!!.optJSONObject("picture") + val object_data = object_pic?.optJSONObject("data") + val photo = object_data?.optString("url") + leaveApp() + doLogin( + LoginBean( + photo.toString(), + "", + name.toString(), + "", + "facebook", + id.toString() + ) + ) + } + } + val parameters = Bundle() + parameters.putString("fields", "id,name,email,picture") + mGraphRequest.parameters = parameters + mGraphRequest.executeAsync() + } + } + + override fun onCancel() { + toast("Facebook login Cancel") + } + + override fun onError(exception: FacebookException) { + toast("Facebook login exception.$exception") + } + }) + GoogleApiAvailability.getInstance().makeGooglePlayServicesAvailable(this) + .addOnCompleteListener { + if (it.isSuccessful) { + askNotificationPermission() + } + } + llMain?.postDelayed({ notificationGo() }, 700) } override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) + path = intent?.getStringExtra("path").toString() + short_play_id = intent?.getStringExtra("short_play_id").toString() + message_id = intent?.getStringExtra("message_id").toString() + title = intent?.getStringExtra("title").toString() + notificationGo() pagerAdapter?.let { switchFragment(it.getFragmentIndex(getSerializable(INTENT_KEY_IN_FRAGMENT_CLASS))) } @@ -130,10 +303,24 @@ class HomeActivity : AppActivity(), NavigationAdapter.OnNavigationListener { if (fragmentIndex == -1) { return } + viewPager?.currentItem = fragmentIndex + navigationAdapter?.setSelectedPosition(fragmentIndex) when (fragmentIndex) { - 0, 1, 2, 3 -> { - viewPager?.currentItem = fragmentIndex - navigationAdapter?.setSelectedPosition(fragmentIndex) + 0 -> { + dialogHistory?.postDelayed( + { + val string = MsMMKVUtils.getMMKV() + .getString(MsConstants.Constants_Main_Video_info, "") + if (string?.isNotEmpty() == true && NetworkUtils.isConnected()) { + val fromJson = Gson().fromJson(string, HomeDataHistoryBean::class.java) + showHistoryDialog(fromJson) + } + }, 500 + ) + } + + 1, 2, 3, 4 -> { + dialogHistory?.visibility = View.INVISIBLE } } } @@ -143,14 +330,199 @@ class HomeActivity : AppActivity(), NavigationAdapter.OnNavigationListener { */ override fun onNavigationItemSelected(position: Int): Boolean { return when (position) { - 0, 1, 2, 3 -> { + 0 -> { + dialogHistory?.postDelayed( + { + val string = MsMMKVUtils.getMMKV() + .getString(MsConstants.Constants_Main_Video_info, "") + if (string?.isNotEmpty() == true && NetworkUtils.isConnected()) { + val fromJson = Gson().fromJson(string, HomeDataHistoryBean::class.java) + showHistoryDialog(fromJson) + } + }, 500 + ) viewPager?.currentItem = position true } + + 1, 2, 3, 4 -> { + dialogHistory?.visibility = View.INVISIBLE + viewPager?.currentItem = position + true + } + else -> false } } + fun getCustomerRegister() { + EasyHttp.post(this) + .api(CustomerRegisterApi().apply { + }) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.token?.let { + MsConstants.IsFirst = false + MsMMKVUtils.saveToken(it) + EventBus.getDefault().post(MsConstants.CONSTANTS_refresh_me) + EventBus.getDefault().post(MsConstants.CONSTANTS_refresh_home) + } + } + }) + } + + fun getActionPush() { + val sMap: MutableMap = LinkedHashMap() + // StringMap = getSortMap(StringMap); + sMap.put("action", String::class.simpleName) + EasyHttp.post(this) + .api(ActionPushApi()) + .body(getPublicRequest(sMap)) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + result.getData()?.token?.let { + + + } + } + }) + } + + fun enterTheApp() { + EasyHttp.post(this) + .api(EnterTheAppApi()) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + } + }) + } + + fun onLine() { + EasyHttp.post(this) + .api(OnLineApi()) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + } + }) + } + + fun leaveApp() { + EasyHttp.post(this) + .api(LeaveAppApi()) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + } + }) + } + + fun doLogin(data: LoginBean) { + val sMap: MutableMap = LinkedHashMap() + // StringMap = getSortMap(StringMap); + sMap.put("avator", data.avator) + sMap.put("email", data.email) + sMap.put("family_name", data.family_name) + sMap.put("giving_name", data.giving_name) + sMap.put("platform", data.platform) + sMap.put("third_id", data.third_id) + EasyHttp.post(this) + .api(DoLoginApi()) + .body(getPublicRequest(sMap)) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.success.toString()) + } + Logger.d( + "CompleteRegistration", + "login_".plus(it.customer_id) + ) + MsMMKVUtils.getMMKV() + .putString(MsConstants.ACCESS_TOKEN, it.token) + EventBus.getDefault() + .post(MsConstants.CONSTANTS_enterTheApp) + EventBus.getDefault() + .post(MsConstants.CONSTANTS_onLine) + EventBus.getDefault() + .post(CONSTANTS_user_refresh) +// if (activityId.isNotEmpty()) { +// EventBus.getDefault() +// .post(CONSTANTS_web_refresh) +// } else { +// WebRefresh = true +// } + + } ?: run { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.network_error.toString()) + } else { + toast(getString(R.string.example_service_exception_please_try_again)) + } + } + + } + }) + } + + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(event: String) { + if (MsConstants.CONSTANTS_auth_refresh == event) { + getCustomerRegister() + } + if (MsConstants.CONSTANTS_out_login == event) { + getCustomerRegister() + if (TranslatesUtils.translates() != null) { + toast( + TranslatesUtils.translates()?.kick_out_login + ?: getString(R.string.your_account_is_already_logged_in_on_another_device) + ) + } + } + if (MsConstants.CONSTANTS_refresh_translate == event) { +// exampleHomeViewModel.gettranslates( +// MsMMKVUtils.getMMKV().getString(MsConstants.CONSTANTS_lang_key, "en") +// .toString() +// ) + } + if (MsConstants.Constants_language_refresh == event) { + HomeActivity.start(this) + } + if (MsConstants.CONSTANTS_Login == event) { + setLoginDialog() + } + if (MsConstants.CONSTANTS_enterTheApp == event) { + enterTheApp() + } + if (MsConstants.CONSTANTS_leaveApp == event) { + leaveApp() + } + if (MsConstants.CONSTANTS_onLine == event) { + onLine() + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(event: BaseEventBus) { + if (MsConstants.Constants_onTokenRefresh == event.code) { + firebase() + } + } override fun createStatusBarConfig(): ImmersionBar { return super.createStatusBarConfig() @@ -161,11 +533,458 @@ class HomeActivity : AppActivity(), NavigationAdapter.OnNavigationListener { moveTaskToBack(false) } - override fun onDestroy() { super.onDestroy() viewPager?.adapter = null navigationView?.adapter = null navigationAdapter?.setOnNavigationListener(null) } + + fun setLoginDialog() { + XPopup.Builder(this) + .hasShadowBg(true) + .isTouchThrough(false) + .isLightStatusBar(false) + .asCustom(CustomBottomLoginPopup(this, this)) + .show() + } + + override fun onFacebook() { + singleClick { + LoginManager.getInstance() + .logInWithReadPermissions(this, arrayListOf("public_profile")) + } + } + + override fun onGoogle() { + toast("google") + } + + override fun onTikTok() { + toast("tiktok") + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == NotificationUtils.NOTIFICATION_SETTINGS_REQUEST_CODE) { + MsConstants.CanNotification = NotificationUtils.isNotificationEnabled(this) + if (MsConstants.CanNotification) { + firebase() + openNotify() + notificationPermissionDialog?.dismiss() + } +// exampleHomeViewModel.uploadNoticeStatus( +// FbNotificationReq( +// if (MsConstants.CanNotification) "1" else "0" +// ) +// ) + } else { + callbackManager?.onActivityResult( + requestCode, + resultCode, data + ) + + } + } + + private fun adjustToDetail() { + llMain?.postDelayed({ + startActivity(Intent( + this, VideoPlayActivity::class.java + ).apply { + putExtra( + MsConstants.CONSTANTS_short_play_id, shortVideoId + ) + }) + clearClipboardContent(this) + MsMMKVUtils.getMMKV() + .putString(MsConstants.Constants_DDL_Url, "") + }, 1000) + needSave = false + } + + private fun getClipContent(): String { + val manager: ClipboardManager = getSystemService( + CLIPBOARD_SERVICE + ) as ClipboardManager + val primaryClip = manager.primaryClip + val itemCount = primaryClip?.itemCount + if (itemCount != null) { + if (manager.hasPrimaryClip() && itemCount > 0) { + val itemAt = manager.primaryClip?.getItemAt(0) + val addedText: CharSequence = itemAt?.text.toString() + val addedTextString = addedText.toString() + if (!TextUtils.isEmpty(addedTextString)) { + return addedTextString + } + } + } + return "" + } + + + override fun onResume() { + super.onResume() + this.window.decorView.post { + val clipContent = getClipContent() + if (clipContent.isNotEmpty()) { + if (clipContent.startsWith("[QJ]")) { + val urlString = clipContent.removePrefix("[QJ]").trim() + val extractVideoInfo = parseVideoAndShortPlayIds(urlString) + shortVideoId = extractVideoInfo.second?.toInt() ?: 0 + videoId = extractVideoInfo.first?.toInt() ?: 0 + if (shortVideoId != 0) { + MsMMKVUtils.getMMKV().putString( + MsConstants.CONSTANTS_short_play_id, extractVideoInfo.second + ) + needSave = true + w2aSelfAttribution(clipContent) + } + } + } + } + + llMain?.postDelayed({ + val ddl = + MsMMKVUtils.getMMKV().getString(MsConstants.Constants_DDL_Url, "") + if (ddl?.isNotEmpty() == true) { + w2aSelfAttribution(ddl) + // 定义正则表达式 + val regex = """short_play_id=(\d+).*""".toRegex() + // 匹配 URL + val matchResult = regex.find(ddl) + if (matchResult != null) { + // 获取匹配的组 + val shortPlayId = matchResult.groupValues[1] + val toInt = shortPlayId.toInt() + if (toInt != 0) { + llMain?.postDelayed({ + startActivity(Intent( + this, VideoPlayActivity::class.java + ).apply { + putExtra( + MsConstants.CONSTANTS_short_play_id, toInt + ) + }) + MsMMKVUtils.getMMKV() + .putString(MsConstants.Constants_DDL_Url, "") + }, 200) + } + } else { + MsMMKVUtils.getMMKV() + .putString(MsConstants.Constants_DDL_Url, "") + } + } + }, 1500) + + if (viewPager?.currentItem == 0) { + dialogHistory?.postDelayed( + { + val string = MsMMKVUtils.getMMKV() + .getString(MsConstants.Constants_Main_Video_info, "") + if (string?.isNotEmpty() == true && NetworkUtils.isConnected()) { + val fromJson = Gson().fromJson(string, HomeDataHistoryBean::class.java) + showHistoryDialog(fromJson) + } + }, 500 + ) + } + } + + private fun clearClipboardContent(context: Context) { + // 获取ClipboardManager的实例 + val clipboardManager = + context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + + // 创建一个空的ClipData对象 + val emptyClip = ClipData.newPlainText("", "") + + // 将空的ClipData对象设置到剪切板上,从而清除之前的内容 + clipboardManager.setPrimaryClip(emptyClip) + } + + private fun parseVideoAndShortPlayIds(clipboardContent: String): Pair { + + // 提取查询字符串 + val queryStartIndex = clipboardContent.indexOf('?') + val queryString = + if (queryStartIndex != -1) clipboardContent.substring(queryStartIndex + 1) else "" + + // 使用正则表达式匹配 video_id 和 short_play_id + val videoIdRegex = Regex("video_id=(\\d+)") + val shortPlayIdRegex = Regex("short_play_id=(\\d+)") + + // 匹配 video_id 和 short_play_id + val videoIdMatch = videoIdRegex.find(queryString)?.groupValues?.get(1) + val shortPlayIdMatch = shortPlayIdRegex.find(queryString)?.groupValues?.get(1) + + return Pair(videoIdMatch, shortPlayIdMatch) + } + + + private fun w2aSelfAttribution(data: String?) { + if (data?.contains("follow") == true) { + val regex = """facebook_id=(\d+).*""".toRegex() + // 匹配 URL + val matchResult = regex.find(data) + if (matchResult != null) { + val facebook_id = matchResult.groupValues[1] +// exampleHomeViewModel.deepFb(FbDeepReq(facebook_id)) + } + } + data?.let { w2aSelfAttributionLoad(it) } + } + + fun w2aSelfAttributionLoad(data: String?) { + val sMap: MutableMap = LinkedHashMap() + // StringMap = getSortMap(StringMap); + sMap.put("data", data) + EasyHttp.post(this) + .api(W2aApi()) + .body(getPublicRequest(sMap)) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + if (needSave) { + adjustToDetail() + } + } + }) + } + + private fun showHistoryDialog(data: HomeDataHistoryBean) { + ivCloseHistory?.setOnClickListener { + MsMMKVUtils.getMMKV() + .putBoolean(MsConstants.Constants_Main_Video_status, false) + dialogHistory?.visibility = View.INVISIBLE + } + if (MsMMKVUtils.getMMKV() + .getBoolean(MsConstants.Constants_Main_Video_status, false) + ) { + ivVideo?.let { + if (!isFinishing && !isDestroyed) { + Glide.with(this).load( + data.video_img + ).placeholder(R.mipmap.ic_loading_h).into(it) + } + } + dialogHistory?.setOnClickListener { + singleClick { + startActivity(Intent( + this, VideoPlayActivity::class.java + ).apply { + putExtra( + MsConstants.CONSTANTS_short_play_id, data.video_id + ) + }) + } + } + dialogHistory?.post { + tvVideoName?.text = data.video_name + tvVideoLast?.text = "Episode " + data.video_last + } + dialogHistory?.visibility = View.VISIBLE + } + } + + private fun firebase() { + FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task -> + if (!task.isSuccessful) { + Log.d( + "LOG_TAG", "Fetching FCM registration token failed", task.exception + ) + return@OnCompleteListener + } + // Get new FCM registration token + val token = task.result + // Log and toast + Log.d("LOG_TAG", token) + firebaseToken(token) + }) + } + + fun firebaseToken(data: String?) { + val sMap: MutableMap = LinkedHashMap() + sMap.put("fcm_token", data) + EasyHttp.post(this) + .api(FirebaseTokenApi()) + .body(getPublicRequest(sMap)) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + } + }) + } + + private fun notificationGo() { + if (message_id.isNotBlank() && !message_id.contentEquals("null")) { + if ("0" != message_id) { + messageSendReport(message_id, title) + } + } + when (path) { + "detail" -> { + if (short_play_id.isNotEmpty() && "null" != short_play_id) { + try { + val toInt = short_play_id.toInt() + llMain?.postDelayed({ + startActivity(Intent( + this, VideoPlayActivity::class.java + ).apply { + putExtra( + MsConstants.CONSTANTS_short_play_id, toInt + ) + }) + }, 700) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + "promotion" -> { + switchFragment(2) + } + + "orderDetail" -> { + llMain?.postDelayed({ + startActivity( + Intent( + this, StoreActivity::class.java + ) + ) + }, 700) + } + + "feedback" -> { + llMain?.postDelayed({ + if (message_id.isNotBlank() && message_id != "null") { + MsMMKVUtils.getMMKV() + .putString(MsConstants.CONSTANTS_Detail_id, message_id) + startActivity( + Intent( + this, FeedBackDetailsActivity::class.java + ) + ) + } else { + startActivity( + Intent( + this, FeedBackDetailsActivity::class.java + ) + ) + } + }, 700) + } + } + } + + private val requestPermissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission(), + ) { isGranted: Boolean -> + MsConstants.CanNotification = isGranted + if (isGranted) { + firebase() + openNotify() + } else { + NotificationUtils.openNotificationSettings(this) + } + notificationPermissionDialog?.dismiss() + } + + private fun askNotificationPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (ContextCompat.checkSelfPermission( + this, Manifest.permission.POST_NOTIFICATIONS + ) == PackageManager.PERMISSION_GRANTED + ) { + firebase() + openNotify() + } else { +// if (shouldShowNotification()) { + openNotification() +// } + } + } else { + if (NotificationUtils.isNotificationEnabled(this)) { + firebase() + openNotify() + } else { +// if (shouldShowNotification()) { + openNotification() +// } + } + } + } + + private fun openNotification() { + notificationPermissionDialog = NotificationPermissionDialog(this) + val example_tv_content = + notificationPermissionDialog?.findViewById(R.id.example_tv_content) + val example_tv_content_info = + notificationPermissionDialog?.findViewById(R.id.example_tv_content_info) + val example_tv_later = + notificationPermissionDialog?.findViewById(R.id.example_tv_later) + val iv_close_notification = + notificationPermissionDialog?.findViewById(R.id.iv_close_notification) + val example_open = + notificationPermissionDialog?.findViewById(R.id.example_open) + example_tv_content?.text = + TranslatesUtils.translates()?.open_notification ?: "Enable Notifications" + example_tv_content_info?.text = TranslatesUtils.translates()?.open_notification_info + ?: "Stay informed with popular recommendations and latest updates!" + example_tv_later?.text = TranslatesUtils.translates()?.open_notification_later ?: "Later" + example_open?.text = TranslatesUtils.translates()?.open_notification_open ?: "Open" + notificationPermissionDialog?.setOnDismissListener { + MsMMKVUtils.getMMKV().putLong( + MsConstants.CONSTANTS_PREF_LAST_POPUP_TIME_Notification, + System.currentTimeMillis() + ) + } + example_tv_later?.setOnClickListener { notificationPermissionDialog?.dismiss() } + iv_close_notification?.setOnClickListener { notificationPermissionDialog?.dismiss() } + example_open?.setOnClickListener { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) + } else { + notificationPermissionDialog?.dismiss() + NotificationUtils.openNotificationSettings(this) + } + } + notificationPermissionDialog?.show() + } + + fun openNotify() { + EasyHttp.post(this) + .api(OpenNotifyApi()) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + } + override fun onHttpFail(throwable: Throwable) { + } + }) + } + + fun messageSendReport(message_id: String, title: String) { + val sMap: MutableMap = LinkedHashMap() + sMap.put("message_id", message_id) + sMap.put("title", title) + EasyHttp.post(this) + .api(MessageSendReportApi()) + .body(getPublicRequest(sMap)) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + } + }) + } + } \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/LanguageSwitchActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/LanguageSwitchActivity.kt new file mode 100644 index 0000000..12b07bd --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/LanguageSwitchActivity.kt @@ -0,0 +1,214 @@ +package com.localee.mireo.app.ui.activity + +import android.graphics.Rect +import android.view.View +import android.widget.CheckBox +import android.widget.TextView +import androidx.appcompat.app.AppCompatDelegate +import androidx.core.os.LocaleListCompat +import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.hjq.bar.TitleBar +import com.hjq.http.EasyHttp +import com.hjq.http.listener.HttpCallbackProxy +import com.hjq.shape.layout.ShapeConstraintLayout +import com.localee.mireo.shortapp.R +import com.localee.mireo.app.action.StatusAction +import com.localee.mireo.app.app.AppActivity +import com.localee.mireo.app.http.api.LanguageApi +import com.localee.mireo.app.http.api.TranslatesLanguageApi +import com.localee.mireo.app.http.bean.TranslatesBean +import com.localee.mireo.app.http.model.HttpData +import com.localee.mireo.app.other.MsConstants +import com.localee.mireo.app.ui.adapter.LanguageSwitchAdapter +import com.localee.mireo.app.utils.MsMMKVUtils +import com.localee.mireo.app.utils.TranslatesUtils +import com.localee.mireo.app.utils.singleClick +import com.localee.mireo.app.widget.StatusLayout +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.greenrobot.eventbus.EventBus +import java.util.Locale + +class LanguageSwitchActivity : AppActivity(), StatusAction { + + private val title: TitleBar? by lazy { findViewById(R.id.title) } + private val hintLayout: StatusLayout? by lazy { findViewById(R.id.hl_status_hint) } + private val clSystem: ShapeConstraintLayout? by lazy { findViewById(R.id.cl_system) } + private val tvSystem: TextView? by lazy { findViewById(R.id.tv_system) } + private val tvDescription: TextView? by lazy { findViewById(R.id.tv_description) } + private val cbSystem: CheckBox? by lazy { findViewById(R.id.cb_system) } + private val recyclerView: RecyclerView? by lazy { findViewById(R.id.recyclerView) } + private val tvOk: TextView? by lazy { findViewById(R.id.tv_ok) } + + private var mAdapter: LanguageSwitchAdapter? = null + + private var langKey = "" + private var isSystem = false + + override fun getLayoutId(): Int { + return R.layout.activity_language_switch + } + + override fun initView() { + val layoutManager = GridLayoutManager(this, 2) + // 设置给 RecyclerView + recyclerView!!.layoutManager = layoutManager + mAdapter = LanguageSwitchAdapter() + recyclerView?.adapter = mAdapter + recyclerView?.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + outRect.right = 8 + outRect.left = 8 + outRect.top = 8 + outRect.bottom = 8 + } + }) + + mAdapter?.setOnItemClickListener { adapter, view, position -> + isSystem = false + updateUIForSystemLanguage(false) + val language = mAdapter?.getItem(position) as LanguageApi.Bean.Data + langKey = language.lang_key + mAdapter?.currentPosition = position + mAdapter?.notifyDataSetChanged() + + } + + clSystem?.setOnClickListener { + isSystem = true + updateUIForSystemLanguage(true) + mAdapter?.currentPosition = -1 + mAdapter?.notifyDataSetChanged() + } + + tvOk?.setOnClickListener { + singleClick { + if (isSystem) { + val locale = when (Locale.getDefault().language) { + "zh" -> when (Locale.getDefault().country) { + "HK", "TW" -> "zh_hk" + "CN" -> "zh" + else -> Locale.getDefault().language + } + + else -> Locale.getDefault().language + } + langKey = locale + getTranslatesLanguageApi(langKey) + } else { + if (langKey.isEmpty()) return@singleClick + getTranslatesLanguageApi(langKey) + } + } + } + } + + override fun initData() { + TranslatesUtils.translates()?.let { translates -> + title?.setTitle(translates.change_language) + tvDescription?.text = translates.lang_option_notice + tvSystem?.text = "${translates.system}${translates.language}" + tvOk?.text = translates.ok + } + + getLanguage() + + } + + fun getLanguage() { + EasyHttp.get(this) + .api(LanguageApi()) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (it.list.isEmpty()) { + hintLayout?.show() + } else { + hintLayout?.hide() + } + mAdapter?.submitList(it.list) + + if (MsMMKVUtils.getMMKV() + .getString(MsConstants.Constants_language_set, "") == "system" + ) { + updateUIForSystemLanguage(true) + isSystem = true + } else { + updateUIForSystemLanguage(false) + isSystem = false + val string = MsMMKVUtils.getMMKV() + .getString(MsConstants.CONSTANTS_lang_key, "en") + it.list.find { item -> item.lang_key == string }?.let { foundItem -> + mAdapter?.currentPosition = it.list.indexOf(foundItem) + } + langKey = string.toString() + mAdapter?.notifyDataSetChanged() + } + + } + } + }) + } + + fun getTranslatesLanguageApi(languageKey: String) { + EasyHttp.get(this) + .api(TranslatesLanguageApi().apply { + language_key = languageKey + }) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + MsMMKVUtils.getMMKV() + .putString(MsConstants.Constants_Main_Video_info, "") + lifecycleScope.launch { + withContext(Dispatchers.IO) { + TranslatesUtils.saveTranslates(it.translates) + } + } + MsMMKVUtils.getMMKV().putString( + MsConstants.Constants_language_set, + if (isSystem) "system" else "custom" + ) + if (langKey.isNotEmpty()) { + MsMMKVUtils.getMMKV() + .putString(MsConstants.CONSTANTS_lang_key, langKey) + EventBus.getDefault().post(MsConstants.Constants_language_refresh) + AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(langKey)) + } + finish() + } ?: run { + toast( + TranslatesUtils.translates()?.network_error?.toString() + ?: getString(R.string.example_service_exception_please_try_again) + ) + } + } + }) + } + + private fun updateUIForSystemLanguage(isSystem: Boolean) { + if (isSystem) { + cbSystem?.isChecked = true + clSystem?.shapeDrawableBuilder?.setSolidColor(0x33ff0049)?.setStrokeSize(1) + ?.intoBackground() + } else { + cbSystem?.isChecked = false + clSystem?.shapeDrawableBuilder?.setSolidColor(0xff272a30.toInt())?.setStrokeSize(0) + ?.intoBackground() + } + } + + + override fun getStatusLayout(): StatusLayout? { + return hintLayout + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/MyVipActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/MyVipActivity.kt new file mode 100644 index 0000000..77624bf --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/MyVipActivity.kt @@ -0,0 +1,462 @@ +package com.localee.mireo.app.ui.activity + +import android.view.View +import android.widget.ImageView +import android.widget.ProgressBar +import android.widget.TextView +import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.android.billingclient.api.AcknowledgePurchaseParams +import com.android.billingclient.api.BillingClient +import com.android.billingclient.api.BillingClientStateListener +import com.android.billingclient.api.BillingFlowParams +import com.android.billingclient.api.BillingResult +import com.android.billingclient.api.ProductDetails +import com.android.billingclient.api.ProductDetailsResponseListener +import com.android.billingclient.api.Purchase +import com.android.billingclient.api.PurchasesUpdatedListener +import com.android.billingclient.api.QueryProductDetailsParams +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.resource.bitmap.CircleCrop +import com.bumptech.glide.request.RequestOptions +import com.google.common.reflect.TypeToken +import com.google.gson.Gson +import com.hjq.bar.TitleBar +import com.hjq.http.EasyHttp +import com.hjq.http.config.IRequestApi +import com.hjq.http.listener.HttpCallbackProxy +import com.localee.mireo.app.app.AppActivity +import com.localee.mireo.app.http.api.CreateOrderApi +import com.localee.mireo.app.http.api.GooglePaidApi +import com.localee.mireo.app.http.api.PaySettingsApi +import com.localee.mireo.app.http.api.UserInfoApi +import com.localee.mireo.app.http.api.UserInfoRes +import com.localee.mireo.app.http.bean.CreateOrderReqBean +import com.localee.mireo.app.http.bean.PayBean +import com.localee.mireo.app.http.bean.PayResBean +import com.localee.mireo.app.http.bean.PaySettingsBean +import com.localee.mireo.app.http.model.HttpData +import com.localee.mireo.app.other.AppConfig +import com.localee.mireo.app.other.Logger +import com.localee.mireo.app.ui.adapter.MyVipBuyAdapter +import com.localee.mireo.app.utils.DHStringUtils.getPublicRequest +import com.localee.mireo.app.utils.MsMMKVUtils +import com.localee.mireo.app.utils.TranslatesUtils +import com.localee.mireo.app.utils.singleClick +import com.localee.mireo.app.utils.transToString +import com.localee.mireo.shortapp.R +import kotlinx.coroutines.launch + +class MyVipActivity : AppActivity() { + + private val title: TitleBar? by lazy { findViewById(R.id.title) } + private val tvName: TextView? by lazy { findViewById(R.id.tv_name) } + private val ivPortrait: ImageView? by lazy { findViewById(R.id.iv_portrait) } + private val tvVipExpires: TextView? by lazy { findViewById(R.id.tv_vip_expires) } + private val tvVipLeave: TextView? by lazy { findViewById(R.id.tv_vip_leave) } + private val progressVip: ProgressBar? by lazy { findViewById(R.id.progress_vip) } + private val tvNextVip: TextView? by lazy { findViewById(R.id.tv_next_vip) } + private val recyclerView: RecyclerView? by lazy { findViewById(R.id.recyclerView) } + private val tvBuy: TextView? by lazy { findViewById(R.id.tv_buy) } + private val ivVip: ImageView? by lazy { findViewById(R.id.iv_vip) } + + private var billingClient: BillingClient? = null + private var isConnect = false + private var connectNum = 0 + private var order_code = "" + private var vipData: PaySettingsBean.Vip? = null + private var payReq: PayBean? = null + + private var mAdapter: MyVipBuyAdapter? = null + + override fun getLayoutId(): Int { + return R.layout.activity_my_vip + } + + override fun initView() { + recyclerView?.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + + mAdapter = MyVipBuyAdapter() + recyclerView?.adapter = mAdapter + + mAdapter?.setOnItemClickListener { adapter, view, position -> + mAdapter?.currentPosition = position + mAdapter?.notifyDataSetChanged() + } + + setUI() + + initPay() + tvBuy?.setOnClickListener { + + if (mAdapter?.currentPosition == -1) { + toast(getString(R.string.select_a_payment_item)) + return@setOnClickListener + } + singleClick { + if (!isConnect) { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.g_pay_error.toString()) + } else { + toast(getString(R.string.google_pay_error)) + } + return@singleClick + } + showDialog() + vipData = mAdapter!!.getItem(mAdapter!!.currentPosition) as PaySettingsBean.Vip + getCreateOrder( + CreateOrderReqBean( + vipData?.id.toString(), + "google", + 0, + 0 + ) + ) + } + } + + } + + private fun setUI() { + if (MsMMKVUtils.isTourist()) { + tvName?.text = getString(R.string.example_visitor) + } else { + tvName?.text = + MsMMKVUtils.getUserInfo()?.family_name.plus(MsMMKVUtils.getUserInfo()?.giving_name) + ivPortrait?.let { + Glide.with(this).load(MsMMKVUtils.getUserInfo()?.avator).skipMemoryCache(true) + .diskCacheStrategy( + DiskCacheStrategy.NONE + ) + .apply(RequestOptions.bitmapTransform(CircleCrop())) + .placeholder(R.mipmap.iv_login_icon) + .error(R.mipmap.iv_login_icon).into(it) + } + } + if (MsMMKVUtils.isVip()) { + ivVip?.visibility = View.VISIBLE + tvVipExpires?.text = + "Vip Expires:".plus(MsMMKVUtils.getUserInfo()?.vip_end_time?.let { + transToString( + it.toLong() + ) + }) + } else { + ivVip?.visibility = View.GONE + tvVipExpires?.text = "Enjoy all dramas for free" + } + } + + override fun initData() { + getPaySettings(null, null) + } + + private fun getPaySettings(shortPlayId: Int?, videoId: Int?) { + EasyHttp.get(this) + .api(PaySettingsApi().apply { + short_play_id = shortPlayId + short_play_video_id = videoId + }) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + mAdapter?.submitList(it.list_sub_vip) + it.list_sub_vip?.let { it1 -> querySubProductDetails(it1) } + } + } + }) + } + + + private fun initPay() { + val purchasesUpdatedListener = + PurchasesUpdatedListener { billingResult, purchases -> + when (billingResult.responseCode) { + BillingClient.BillingResponseCode.OK -> { + for (purchase in purchases!!) { + if (purchase.purchaseState == Purchase.PurchaseState.PURCHASED) { + consumePurchaseSub(purchase) + } + } + } + + BillingClient.BillingResponseCode.USER_CANCELED -> { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.g_pay_cancel.toString()) + } else { + toast(getString(R.string.google_pay_canceled)) + } + Logger.d( + "", order_code + ) + hideDialog() + } + + else -> { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.g_pay_error.toString()) + } else { + toast(getString(R.string.google_pay_error)) + } + hideDialog() + } + } + } + + + billingClient = BillingClient.newBuilder(this) + .setListener(purchasesUpdatedListener) + .enablePendingPurchases() + .build() + + + val stateListener: BillingClientStateListener = object : BillingClientStateListener { + override fun onBillingSetupFinished(billingResult: BillingResult) { + if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { + isConnect = true + } + } + + override fun onBillingServiceDisconnected() { + if (connectNum < 5) { + connectNum++ + isConnect = false + billingClient?.startConnection(this) + } + } + } + billingClient?.startConnection(stateListener) + } + + private fun consumePurchaseSub( + purchase: Purchase + ) { + if (billingClient?.isReady == true) { + if (!purchase.isAcknowledged) { + val acknowledgePurchaseParams = + AcknowledgePurchaseParams.newBuilder() + .setPurchaseToken(purchase.purchaseToken) + .build() + billingClient?.acknowledgePurchase( + acknowledgePurchaseParams + ) { + val examplePayReq = PayBean( + order_code, + vipData?.id.toString(), + AppConfig.getPackageName(), + vipData?.android_template_id.toString(), + purchase.purchaseToken, + purchase.orderId.toString(), + vipData?.price.toString() + ) + if (it.responseCode == BillingClient.BillingResponseCode.OK) { + lifecycleScope.launch { + googlePaid(examplePayReq) + payReq = examplePayReq + MsMMKVUtils.saveOrder(examplePayReq) + } + } else { + MsMMKVUtils.saveOrder(examplePayReq) + lifecycleScope.launch { + toast(it.toString()) + hideDialog() + } + } + } + } + } + } + + private fun querySubProductDetails(listSubVip: List) { + val productDetailsResponseListener = + ProductDetailsResponseListener { billingResult, productDetailsList -> + if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { + val priceInfo = productDetailsList.mapNotNull { productDetails -> + productDetails.subscriptionOfferDetails?.get(0)?.pricingPhases?.pricingPhaseList?.get( + 0 + )?.let { + productDetails.productId to (it.formattedPrice to it.priceCurrencyCode) + } + }.toMap() + + // 更新VIP列表的价格和货币代码 + val updatedVipList = listSubVip.map { vip -> + priceInfo[vip.android_template_id]?.let { (price, currency) -> + vip.copy(price_google = price, currency_goolge = currency) + } ?: vip + } + + mAdapter?.recyclerView?.postDelayed({ + mAdapter?.submitList(updatedVipList) + hideDialog() + }, 500) + } else { + hideDialog() + } + } + + val productType: String = BillingClient.ProductType.SUBS + + val inAppProductInfo = listSubVip.map { + QueryProductDetailsParams.Product.newBuilder() + .setProductId(it.android_template_id) + .setProductType(productType) + .build() + } + if (inAppProductInfo.isNotEmpty()) { + val productDetailsParams = QueryProductDetailsParams.newBuilder() + .setProductList(inAppProductInfo) + .build() + billingClient?.queryProductDetailsAsync( + productDetailsParams, + productDetailsResponseListener + ) + } else { + hideDialog() + } + } + + private fun getProduct(productId: String) { + val productDetailsResponseListener = + ProductDetailsResponseListener { billingResult, productDetailsList -> + if (productDetailsList.isNotEmpty()) { + pay(productDetailsList[0]) + } else { + lifecycleScope.launch { + toast(billingResult.toString()) + hideDialog() + } + } + } + + val inAppProductInfo = ArrayList() + inAppProductInfo.add( + QueryProductDetailsParams.Product.newBuilder() + .setProductId(productId) + .setProductType(BillingClient.ProductType.SUBS) + .build() + ) + val productDetailsParams = QueryProductDetailsParams.newBuilder() + .setProductList(inAppProductInfo) + .build() + billingClient?.queryProductDetailsAsync( + productDetailsParams, + productDetailsResponseListener + ) + } + + private fun pay(productDetailInfo: ProductDetails) { + if (productDetailInfo.subscriptionOfferDetails?.isNotEmpty() == true) { + val params = ArrayList() + productDetailInfo.subscriptionOfferDetails?.get(0)?.offerToken?.let { + BillingFlowParams.ProductDetailsParams.newBuilder() + .setProductDetails(productDetailInfo) + .setOfferToken(it) + .build() + }?.let { + params.add( + it + ) + } + val billingFlowParams = BillingFlowParams.newBuilder() + .setObfuscatedProfileId(order_code) + .setObfuscatedAccountId(MsMMKVUtils.getCustomId()) + .setProductDetailsParamsList(params) + .build() + + billingClient?.launchBillingFlow(this, billingFlowParams) + } + } + + fun Any.toMapViaGson(): MutableMap { + val json = Gson().toJson(this) + return Gson().fromJson(json, object : TypeToken>() {}.type) + } + + fun getCreateOrder(data: CreateOrderReqBean) { + EasyHttp.post(this) + .api(CreateOrderApi()) + .body(getPublicRequest(data.toMapViaGson())) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + order_code = it.order_code.toString() + vipData?.android_template_id?.let { it1 -> getProduct(it1) } + + } ?: run { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.network_error.toString()) + } else { + toast(getString(R.string.example_service_exception_please_try_again)) + } + } + + } + + override fun onHttpFail(throwable: Throwable) { + super.onHttpFail(throwable) + } + }) + } + + fun googlePaid(data: PayBean) { + EasyHttp.post(this) + .api(GooglePaidApi()) + .body(getPublicRequest(data.toMapViaGson())) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.g_pay_success.toString()) + } else { + toast(getString(R.string.google_pay_success)) + } + if (null != payReq) { + MsMMKVUtils.removeOrder(payReq) + } + getCustomerUser() + + } ?: run { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.network_error.toString()) + } else { + toast(getString(R.string.example_service_exception_please_try_again)) + } + } + + } + }) + } + + + private fun getCustomerUser() { + EasyHttp.get(this) + .api(UserInfoApi()) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + MsMMKVUtils.saveUserInfo(it) + setUI() + } + } + }) + } + + override fun onDestroy() { + super.onDestroy() + payReq = null + billingClient?.endConnection() + billingClient = null + System.gc() + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/MyWalletActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/MyWalletActivity.kt new file mode 100644 index 0000000..53b0cdd --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/MyWalletActivity.kt @@ -0,0 +1,321 @@ +package com.localee.mireo.app.ui.activity + +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.resource.bitmap.CircleCrop +import com.bumptech.glide.request.RequestOptions +import com.hjq.bar.TitleBar +import com.hjq.demo.ui.dialog.MenuDialog +import com.hjq.http.EasyHttp +import com.hjq.http.listener.HttpCallbackProxy +import com.localee.mireo.app.action.StatusAction +import com.localee.mireo.app.app.AppActivity +import com.localee.mireo.app.base.BaseDialog +import com.localee.mireo.app.http.api.CustomerBuyRecordsApi +import com.localee.mireo.app.http.api.CustomerOrderApi +import com.localee.mireo.app.http.api.SendCoinListApi +import com.localee.mireo.app.http.model.HttpData +import com.localee.mireo.app.ui.adapter.CustomerBuyRecordAdapter +import com.localee.mireo.app.ui.adapter.CustomerOrderRecordAdapter +import com.localee.mireo.app.ui.adapter.SendCoinRecordAdapter +import com.localee.mireo.app.utils.DHStringUtils.getPublicRequest +import com.localee.mireo.app.utils.MsMMKVUtils +import com.localee.mireo.app.utils.singleClick +import com.localee.mireo.app.utils.transToString +import com.localee.mireo.app.widget.StatusLayout +import com.localee.mireo.app.widget.StatusLayout.OnRetryListener +import com.localee.mireo.app.widget.layout.SettingBar +import com.localee.mireo.shortapp.R +import com.scwang.smart.refresh.layout.SmartRefreshLayout +import com.scwang.smart.refresh.layout.api.RefreshLayout +import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener + +class MyWalletActivity : AppActivity(), OnRefreshLoadMoreListener, + StatusAction { + + private val title: TitleBar? by lazy { findViewById(R.id.title) } + private val tvName: TextView? by lazy { findViewById(R.id.tv_name) } + private val ivPortrait: ImageView? by lazy { findViewById(R.id.iv_portrait) } + private val tvVipExpires: TextView? by lazy { findViewById(R.id.tv_vip_expires) } + private val ivVip: ImageView? by lazy { findViewById(R.id.iv_vip) } + private val tvTopUp: TextView? by lazy { findViewById(R.id.tv_top_up) } + private val tvConinsText: TextView? by lazy { findViewById(R.id.tv_conins_text) } + private val tvConins: TextView? by lazy { findViewById(R.id.tv_conins) } + private val tvDonateText: TextView? by lazy { findViewById(R.id.tv_donate_text) } + private val tvDonate: TextView? by lazy { findViewById(R.id.tv_donate) } + private val sbDetailTitle: SettingBar? by lazy { findViewById(R.id.sb_detail_title) } + private val hintLayout: StatusLayout? by lazy { findViewById(R.id.hl_status_hint) } + private val recyclerView: RecyclerView? by lazy { findViewById(R.id.recyclerView) } + private val tvFeedback: TextView? by lazy { findViewById(R.id.tv_feedback) } + private val rlStatusRefresh: SmartRefreshLayout? by lazy { findViewById(R.id.rl_status_refresh) } + private var selectPosition = 0 + + private var mBuyRecordAdapter: CustomerBuyRecordAdapter? = null + private var mSendCoinRecordAdapter: SendCoinRecordAdapter? = null + private var mCustomerOrderRecordAdapter: CustomerOrderRecordAdapter? = null + private var pageIndex = 1 + private var pageTotal = 1 + private var pageSize = 10 + + override fun getLayoutId(): Int { + return R.layout.activity_my_wallet + } + + override fun initView() { + recyclerView?.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) + mBuyRecordAdapter = CustomerBuyRecordAdapter() + mSendCoinRecordAdapter = SendCoinRecordAdapter() + mCustomerOrderRecordAdapter = CustomerOrderRecordAdapter() + + rlStatusRefresh?.setOnRefreshLoadMoreListener(this) + rlStatusRefresh?.setEnableRefresh(false) + setUI() + + } + + private fun setUI() { + if (MsMMKVUtils.isTourist()) { + tvName?.text = getString(R.string.example_visitor) + } else { + tvName?.text = + MsMMKVUtils.getUserInfo()?.family_name.plus(MsMMKVUtils.getUserInfo()?.giving_name) + ivPortrait?.let { + Glide.with(this).load(MsMMKVUtils.getUserInfo()?.avator).skipMemoryCache(true) + .diskCacheStrategy( + DiskCacheStrategy.NONE + ) + .apply(RequestOptions.bitmapTransform(CircleCrop())) + .placeholder(R.mipmap.iv_login_icon) + .error(R.mipmap.iv_login_icon).into(it) + } + } + if (MsMMKVUtils.isVip()) { + ivVip?.visibility = View.VISIBLE + tvVipExpires?.text = + "Vip Expires:".plus(MsMMKVUtils.getUserInfo()?.vip_end_time?.let { + transToString( + it.toLong() + ) + }) + } else { + ivVip?.visibility = View.GONE + tvVipExpires?.text = "Enjoy all dramas for free" + } + tvConins?.text = + MsMMKVUtils.getUserInfo()?.coin_left_total.toString() + tvDonate?.text = + MsMMKVUtils.getUserInfo()?.send_coin_left_total.toString() + } + + override fun initData() { + sbDetailTitle?.setOnClickListener { + + val data = ArrayList() + data.add("Consumption Records") + data.add("Recharge Coins") + data.add("Purchase VIP") + data.add("Reward Coins") + MenuDialog.Builder(this) + .setList(data) + .setSelectPosition(selectPosition) + .setListener(object : MenuDialog.OnListener { + override fun onSelected(dialog: BaseDialog?, position: Int, data: String) { + if (selectPosition != position) { + pageIndex = 1 + selectPosition = position + sbDetailTitle?.setRightText(data) + loadData() + + } + } + + override fun onCancel(dialog: BaseDialog?) { + + } + }) + .show() + + } + tvTopUp?.setOnClickListener { + startActivity(StoreActivity::class.java) + } + + loadData() + + } + + fun loadData() { + when (selectPosition) { + 0 -> { + recyclerView?.adapter = mBuyRecordAdapter + rlStatusRefresh?.setEnableLoadMore(false) + setCustomerBuyRecords() + } + + 1 -> { + recyclerView?.adapter = mCustomerOrderRecordAdapter + rlStatusRefresh?.setEnableLoadMore(true) + getCustomerOrder("coins") + } + + 2 -> { + recyclerView?.adapter = mCustomerOrderRecordAdapter + rlStatusRefresh?.setEnableLoadMore(true) + getCustomerOrder("vip") + } + + 3 -> { + recyclerView?.adapter = mSendCoinRecordAdapter + rlStatusRefresh?.setEnableLoadMore(true) + setSendCoinList() + } + } + + } + + + fun setSendCoinList() { + val sMap: MutableMap = LinkedHashMap() + sMap["current_page"] = pageIndex.toString() + sMap["page_size"] = pageSize.toString() + + EasyHttp.post(this) + .api(SendCoinListApi()) + .body(getPublicRequest(sMap)) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (pageIndex == 1) { + if (it.list.isEmpty()) { + showEmpty() + } else { + showComplete() + } + mSendCoinRecordAdapter?.submitList(it.list) + it.pagination?.let { it1 -> + pageTotal = it1.page_total + } + } else { + mSendCoinRecordAdapter?.addAll(it.list) + } + } ?: run { + showEmpty() + } + } + + override fun onHttpFail(throwable: Throwable) { + super.onHttpFail(throwable) + if (pageIndex == 1) { + showError(object : OnRetryListener { + override fun onRetry(layout: StatusLayout) { + singleClick { + loadData() + } + } + }) + } + } + }) + } + + fun setCustomerBuyRecords() { + EasyHttp.get(this) + .api(CustomerBuyRecordsApi()) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (it.list.isEmpty()) { + showEmpty() + } else { + showComplete() + } + mBuyRecordAdapter?.submitList(it.list) + } ?: run { + showEmpty() + } + } + + override fun onHttpFail(throwable: Throwable) { + super.onHttpFail(throwable) + if (pageIndex == 1) { + showError(object : OnRetryListener { + override fun onRetry(layout: StatusLayout) { + singleClick { + loadData() + } + } + + }) + } + } + }) + } + + fun getCustomerOrder(buyType: String) { + EasyHttp.get(this) + .api(CustomerOrderApi().apply { + buy_type = buyType + current_page = pageIndex + page_size = pageSize + }) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (pageIndex == 1) { + if (it.list.isEmpty()) { + showEmpty() + } else { + showComplete() + } + mCustomerOrderRecordAdapter?.submitList(it.list) + it.pagination?.let { it1 -> + pageTotal = it1.page_total + } + } else { + mCustomerOrderRecordAdapter?.addAll(it.list) + } + } ?: run { + showEmpty() + } + } + + override fun onHttpFail(throwable: Throwable) { + super.onHttpFail(throwable) + if (pageIndex == 1) { + showError(object : OnRetryListener { + override fun onRetry(layout: StatusLayout) { + singleClick { + loadData() + } + } + + }) + } + } + }) + } + + override fun onRefresh(refreshLayout: RefreshLayout) { + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + if (pageIndex == pageTotal) { + rlStatusRefresh?.finishLoadMore(1000) + } else { + pageIndex++ + loadData() + } + } + + override fun getStatusLayout(): StatusLayout? { + return hintLayout + } + + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/SearchActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/SearchActivity.kt index 523b488..46da013 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/SearchActivity.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/SearchActivity.kt @@ -1,28 +1,39 @@ package com.localee.mireo.app.ui.activity import android.content.Intent +import android.graphics.Rect import android.text.Editable -import android.text.TextUtils import android.text.TextWatcher -import android.view.KeyEvent +import android.view.View import android.view.inputmethod.EditorInfo import android.widget.EditText import android.widget.ImageView +import android.widget.TextView +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.chad.library.adapter4.layoutmanager.QuickGridLayoutManager import com.hjq.http.EasyHttp import com.hjq.http.config.IRequestApi import com.hjq.http.listener.HttpCallbackProxy -import com.localee.mireo.app.R import com.localee.mireo.app.action.StatusAction import com.localee.mireo.app.app.AppActivity import com.localee.mireo.app.http.api.SearchHotApi import com.localee.mireo.app.http.api.SearchSearchApi import com.localee.mireo.app.http.model.HttpData import com.localee.mireo.app.other.MsConstants.CONSTANTS_short_play_id +import com.localee.mireo.app.ui.adapter.SearchGridAdapter import com.localee.mireo.app.ui.adapter.SearchHotAdapter import com.localee.mireo.app.ui.adapter.SearchSearchAdapter +import com.localee.mireo.app.utils.singleClick import com.localee.mireo.app.widget.StatusLayout +import com.localee.mireo.app.widget.StatusLayout.OnRetryListener +import com.localee.mireo.shortapp.R +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.filterNotNull +import kotlinx.coroutines.launch class SearchActivity : AppActivity(), StatusAction { @@ -31,9 +42,11 @@ class SearchActivity : AppActivity(), StatusAction { private val ivClose: ImageView? by lazy { findViewById(R.id.iv_close) } private val etSearch: EditText? by lazy { findViewById(R.id.et_search) } private val recycler: RecyclerView? by lazy { findViewById(R.id.recycler) } + private val tvSearchTitle: TextView? by lazy { findViewById(R.id.tv_search_title) } private var mAdapter: SearchHotAdapter? = null private var mKeyAdapter: SearchSearchAdapter? = null + private var mKeyGridAdapter: SearchGridAdapter? = null override fun getLayoutId(): Int { return R.layout.status_activity @@ -41,15 +54,25 @@ class SearchActivity : AppActivity(), StatusAction { override fun initView() { - recycler?.layoutManager = - LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) - + setGridNeed(false) mAdapter = SearchHotAdapter() mKeyAdapter = SearchSearchAdapter() + mKeyGridAdapter = SearchGridAdapter() recycler?.adapter = mAdapter + recycler?.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + outRect.right = 10 + outRect.left = 10 + } + }) -// getSearchHot() + getSearchHot() } @@ -58,33 +81,54 @@ class SearchActivity : AppActivity(), StatusAction { finish() } - etSearch?.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) { - } + etSearch?.setOnEditorActionListener { v, actionId, event -> + if (actionId == EditorInfo.IME_ACTION_SEARCH) { + // 执行搜索逻辑 + if (etSearch?.text?.trim().toString().isEmpty()) { + toast(getString(R.string.example_please_enter_keywords_for_search)) + return@setOnEditorActionListener true + } + setGridNeed(true) - override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) { - if (!TextUtils.isEmpty(charSequence.toString())) { - recycler?.adapter = mKeyAdapter - getSearchSearch(charSequence.toString()) - } else { - recycler?.adapter = mAdapter + recycler?.adapter = mKeyGridAdapter + getSearchSearch(etSearch?.text?.trim().toString()) + hideKeyboard(v) + return@setOnEditorActionListener true + } + false + } + + val textChanges = callbackFlow { + val textWatcher = object : TextWatcher { + override fun beforeTextChanged( + s: CharSequence?, start: Int, count: Int, after: Int + ) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} + + override fun afterTextChanged(s: Editable?) { + trySend(s) } } - override fun afterTextChanged(editable: Editable) { - } - }) - - - etSearch?.setOnEditorActionListener { v, actionId, event -> - if (actionId == EditorInfo.IME_ACTION_DONE || - (event != null && event.action == KeyEvent.ACTION_DOWN && - event.keyCode == KeyEvent.KEYCODE_ENTER) - ) { - hideKeyboard(v) - true - } else { - false + etSearch?.addTextChangedListener(textWatcher) + awaitClose { etSearch?.removeTextChangedListener(textWatcher) } + } + lifecycleScope.launch { + textChanges.debounce(500).filterNotNull().collect { query -> + // 在这里执行搜索操作 + if (etSearch?.text?.trim().toString().isNotEmpty()) { + tvSearchTitle?.visibility = View.GONE + setGridNeed(false) + recycler?.adapter = mKeyAdapter + getSearchSearch(query.toString()) + } else { + tvSearchTitle?.visibility = View.VISIBLE + setGridNeed(false) + recycler?.adapter = mAdapter + getSearchHot() + } } } @@ -114,10 +158,34 @@ class SearchActivity : AppActivity(), StatusAction { } }) } + mKeyGridAdapter?.setOnItemClickListener { adapter, view, position -> + val search: SearchSearchApi.Bean.Data = + adapter.items.get(position) + startActivity( + Intent( + this, + VideoPlayActivity::class.java + ).apply { + search.short_play_id.let { + putExtra(CONSTANTS_short_play_id, it) + } + }) + } } + fun setGridNeed(isGridNeed: Boolean) { + if (isGridNeed) { + recycler?.layoutManager = + QuickGridLayoutManager(this, 3) + } else { + recycler?.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) + + } + } + fun getSearchHot() { EasyHttp.get(this) .api(SearchHotApi().apply { @@ -125,10 +193,11 @@ class SearchActivity : AppActivity(), StatusAction { .request(object : HttpCallbackProxy>(this) { override fun onHttpSuccess(result: HttpData) { result.getData()?.let { + recycler?.visibility = View.VISIBLE if (it.list.isEmpty()) { - hintLayout?.show() + showEmpty() } else { - hintLayout?.hide() + showComplete() } mAdapter?.submitList(it.list) } @@ -137,7 +206,15 @@ class SearchActivity : AppActivity(), StatusAction { override fun onHttpFail(throwable: Throwable) { super.onHttpFail(throwable) - hintLayout?.show() + recycler?.visibility = View.GONE + showError(object : OnRetryListener { + override fun onRetry(layout: StatusLayout) { + singleClick { + getSearchHot() + } + } + + }) } }) } @@ -155,20 +232,34 @@ class SearchActivity : AppActivity(), StatusAction { override fun onHttpSuccess(result: HttpData) { result.getData()?.let { + recycler?.visibility = View.VISIBLE if (it.list.isEmpty()) { - hintLayout?.show() + showEmpty() } else { - hintLayout?.hide() + showComplete() } + + mKeyAdapter?.keyword = etSearch?.text.toString() mKeyAdapter?.submitList(it.list) + mKeyGridAdapter?.submitList(it.list) } } + override fun onHttpFail(throwable: Throwable) { super.onHttpFail(throwable) - hintLayout?.show() + recycler?.visibility = View.GONE + showError(object : OnRetryListener { + override fun onRetry(layout: StatusLayout) { + singleClick { + getSearchSearch(etSearch?.text.toString().trim()) + } + } + + }) } + }) } diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/SettingActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/SettingActivity.kt index 7f20143..7d80996 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/SettingActivity.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/SettingActivity.kt @@ -1,20 +1,23 @@ package com.localee.mireo.app.ui.activity +import android.content.Intent import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide -import com.hjq.widget.layout.SettingBar -import com.localee.mireo.app.R import com.localee.mireo.app.app.AppActivity import com.localee.mireo.app.manager.CacheDataManager +import com.localee.mireo.app.utils.MsMMKVUtils import com.localee.mireo.app.utils.singleClick +import com.localee.mireo.app.widget.layout.SettingBar +import com.localee.mireo.shortapp.R import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class SettingActivity : AppActivity(){ +class SettingActivity : AppActivity() { private val cleanCacheView: SettingBar? by lazy { findViewById(R.id.sb_setting_cache) } + private val sbDeleteAccount: SettingBar? by lazy { findViewById(R.id.sb_delete_account) } override fun getLayoutId(): Int { return R.layout.setting_activity @@ -37,8 +40,24 @@ class SettingActivity : AppActivity(){ } } } + + sbDeleteAccount?.setOnClickListener { + if (!MsMMKVUtils.isTourist()) { + singleClick { + startActivity( + Intent( + this, + AccountDeleteActivity::class.java + ) + ) + } + } else { + toast(getString(R.string.example_please_log_in_first)) + } + } } + override fun initData() { // 获取应用缓存大小 cleanCacheView?.setRightText(CacheDataManager.getTotalCacheSize(this)) diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/SplashActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/SplashActivity.kt index 336c6d5..8ea7432 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/SplashActivity.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/SplashActivity.kt @@ -1,12 +1,24 @@ package com.localee.mireo.app.ui.activity +import android.content.Intent +import android.util.Log +import android.widget.FrameLayout import com.gyf.immersionbar.BarHide import com.gyf.immersionbar.ImmersionBar -import com.localee.mireo.app.R +import com.hjq.http.EasyHttp +import com.hjq.http.config.IRequestApi +import com.hjq.http.listener.HttpCallbackProxy import com.localee.mireo.app.app.AppActivity +import com.localee.mireo.app.http.api.CustomerRegisterApi +import com.localee.mireo.app.http.model.HttpData +import com.localee.mireo.app.other.MsConstants +import com.localee.mireo.app.other.MsConstants.Constants_DDL_Url +import com.localee.mireo.app.utils.MsMMKVUtils +import com.localee.mireo.shortapp.R class SplashActivity : AppActivity() { + private val frameLayout: FrameLayout? by lazy { findViewById(R.id.frameLayout) } override fun getLayoutId(): Int { @@ -14,18 +26,64 @@ class SplashActivity : AppActivity() { } override fun initView() { - postDelayed(Runnable { - HomeActivity.start(this@SplashActivity) - finish() - }, 300) + val webpageURL = intent.data + Log.d("webpageURL", webpageURL.toString()) + if (null != webpageURL) { + MsMMKVUtils.getMMKV().putString(Constants_DDL_Url, webpageURL.toString()) + } + + if (MsMMKVUtils.getMMKV().getString(MsConstants.ACCESS_TOKEN, "").toString() + .isEmpty() + ) { + getCustomerRegister() + } else { + goToMain() + } } override fun initData() { + + } + + private fun getCustomerRegister() { + EasyHttp.post(this).api(CustomerRegisterApi()) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + result.getData()?.token?.let { + MsConstants.IsFirst = false + MsMMKVUtils.saveToken(it) + } + } + + override fun onHttpEnd(api: IRequestApi) { + super.onHttpEnd(api) + goToMain() + } + }) + } + + fun goToMain() { + frameLayout?.postDelayed({ + HomeActivity.start(this@SplashActivity) + finish() + }, 300) + + } override fun createStatusBarConfig(): ImmersionBar { - return super.createStatusBarConfig() - .hideBar(BarHide.FLAG_HIDE_BAR) + return super.createStatusBarConfig().hideBar(BarHide.FLAG_HIDE_BAR) } + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + val webpageURL = intent?.data + Log.d("webpageURL", webpageURL.toString()) + if (null != webpageURL) { + MsMMKVUtils.getMMKV().putString(Constants_DDL_Url, webpageURL.toString()) + } + } } \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/StoreActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/StoreActivity.kt new file mode 100644 index 0000000..4b88190 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/StoreActivity.kt @@ -0,0 +1,591 @@ +package com.localee.mireo.app.ui.activity + +import android.widget.TextView +import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.android.billingclient.api.AcknowledgePurchaseParams +import com.android.billingclient.api.BillingClient +import com.android.billingclient.api.BillingClientStateListener +import com.android.billingclient.api.BillingFlowParams +import com.android.billingclient.api.BillingResult +import com.android.billingclient.api.ConsumeParams +import com.android.billingclient.api.ConsumeResponseListener +import com.android.billingclient.api.ProductDetails +import com.android.billingclient.api.ProductDetailsResponseListener +import com.android.billingclient.api.Purchase +import com.android.billingclient.api.PurchasesUpdatedListener +import com.android.billingclient.api.QueryProductDetailsParams +import com.google.common.reflect.TypeToken +import com.google.gson.Gson +import com.hjq.bar.TitleBar +import com.hjq.http.EasyHttp +import com.hjq.http.config.IRequestApi +import com.hjq.http.listener.HttpCallbackProxy +import com.localee.mireo.app.app.AppActivity +import com.localee.mireo.app.http.api.CreateOrderApi +import com.localee.mireo.app.http.api.GooglePaidApi +import com.localee.mireo.app.http.api.PaySettingsApi +import com.localee.mireo.app.http.api.UserInfoApi +import com.localee.mireo.app.http.api.UserInfoRes +import com.localee.mireo.app.http.bean.CreateOrderReqBean +import com.localee.mireo.app.http.bean.PayBean +import com.localee.mireo.app.http.bean.PayResBean +import com.localee.mireo.app.http.bean.PaySettingsBean +import com.localee.mireo.app.http.model.HttpData +import com.localee.mireo.app.other.AppConfig +import com.localee.mireo.app.other.Logger +import com.localee.mireo.app.ui.adapter.MyCoinBuyAdapter +import com.localee.mireo.app.ui.adapter.MyVipBuyAdapter +import com.localee.mireo.app.utils.DHStringUtils.getPublicRequest +import com.localee.mireo.app.utils.MsMMKVUtils +import com.localee.mireo.app.utils.TranslatesUtils +import com.localee.mireo.app.utils.singleClick +import com.localee.mireo.shortapp.R +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch + +class StoreActivity : AppActivity() { + + private val title: TitleBar? by lazy { findViewById(R.id.title) } + private val tvCoins: TextView? by lazy { findViewById(R.id.tv_coins) } + private val recyclerCoin: RecyclerView? by lazy { findViewById(R.id.recycler_coin) } + private val recyclerView: RecyclerView? by lazy { findViewById(R.id.recyclerView) } + private val tvBuy: TextView? by lazy { findViewById(R.id.tv_buy) } + + private var mAdapter: MyVipBuyAdapter? = null + private var mCoinAdapter: MyCoinBuyAdapter? = null + private var type = 0 + + private var billingClient: BillingClient? = null + private var isConnect = false + private var connectNum = 0 + private var order_code = "" + private var vipData: PaySettingsBean.Vip? = null + private var coinsData: PaySettingsBean.Coins? = null + private var payReq: PayBean? = null + + private var isBuy = false + private var purchaseData: Purchase? = null + + override fun getLayoutId(): Int { + return R.layout.activity_store + } + + override fun initView() { + recyclerCoin?.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + recyclerView?.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + + mCoinAdapter = MyCoinBuyAdapter() + recyclerCoin?.adapter = mCoinAdapter + + mAdapter = MyVipBuyAdapter() + recyclerView?.adapter = mAdapter + + mCoinAdapter?.setOnItemClickListener { adapter, view, position -> + if (type == 1) { + mAdapter?.currentPosition = -1 + mAdapter?.notifyDataSetChanged() + } + type = 0 + mCoinAdapter?.currentPosition = position + mCoinAdapter?.notifyDataSetChanged() + } + mAdapter?.setOnItemClickListener { adapter, view, position -> + if (type == 0) { + mCoinAdapter?.currentPosition = -1 + mCoinAdapter?.notifyDataSetChanged() + } + type = 1 + mAdapter?.currentPosition = position + mAdapter?.notifyDataSetChanged() + + } + + setUI() + initPay() + } + + private fun setUI() { + tvCoins?.text = MsMMKVUtils.getAllCoin().toString() + + } + + override fun initData() { + getPaySettings(null, null) + + tvBuy?.setOnClickListener { + + if (mAdapter?.currentPosition == -1 && mCoinAdapter?.currentPosition == -1) { + toast(getString(R.string.select_a_payment_item)) + return@setOnClickListener + } + singleClick { + if (!isConnect) { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.g_pay_error.toString()) + } else { + toast(getString(R.string.google_pay_error)) + } + return@singleClick + } + showDialog() + if (type == 0) { + coinsData = mCoinAdapter!!.getItem(mCoinAdapter!!.currentPosition) as PaySettingsBean.Coins + } else { + vipData = mAdapter!!.getItem(mAdapter!!.currentPosition) as PaySettingsBean.Vip + } + getCreateOrder( + CreateOrderReqBean( + if (type == 0) coinsData?.id.toString() else vipData?.id.toString(), + "google", + 0, + 0 + ) + ) + } + } + + } + + private fun getPaySettings(shortPlayId: Int?, videoId: Int?) { + EasyHttp.get(this) + .api(PaySettingsApi().apply { + short_play_id = shortPlayId + short_play_video_id = videoId + }) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + mCoinAdapter?.submitList(it.list_coins) + mAdapter?.submitList(it.list_sub_vip) + + it.list_sub_vip?.let { it1 -> querySubProductDetails(it1) } + it.list_coins?.let { it1 -> queryInAppProductDetails(it1) } + } + } + }) + } + + + private fun initPay() { + val purchasesUpdatedListener = + PurchasesUpdatedListener { billingResult, purchases -> + when (billingResult.responseCode) { + BillingClient.BillingResponseCode.OK -> { + for (purchase in purchases!!) { + if (purchase.purchaseState == Purchase.PurchaseState.PURCHASED) { + if (type == 0) { + consumePurchase(purchase) + } else { + consumePurchaseSub(purchase) + } + } + } + } + + BillingClient.BillingResponseCode.USER_CANCELED -> { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.g_pay_cancel.toString()) + } else { + toast(getString(R.string.google_pay_canceled)) + } + Logger.d( + "", order_code + ) + hideDialog() + } + + else -> { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.g_pay_error.toString()) + } else { + toast(getString(R.string.google_pay_error)) + } + hideDialog() + } + } + } + + + billingClient = BillingClient.newBuilder(this) + .setListener(purchasesUpdatedListener) + .enablePendingPurchases() + .build() + + + val stateListener: BillingClientStateListener = object : BillingClientStateListener { + override fun onBillingSetupFinished(billingResult: BillingResult) { + if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { + isConnect = true + } + } + + override fun onBillingServiceDisconnected() { + if (connectNum < 5) { + connectNum++ + isConnect = false + billingClient?.startConnection(this) + } + } + } + billingClient?.startConnection(stateListener) + } + + private fun consumePurchaseSub( + purchase: Purchase + ) { + if (billingClient?.isReady == true) { + if (!purchase.isAcknowledged) { + val acknowledgePurchaseParams = + AcknowledgePurchaseParams.newBuilder() + .setPurchaseToken(purchase.purchaseToken) + .build() + billingClient?.acknowledgePurchase( + acknowledgePurchaseParams + ) { + val examplePayReq = PayBean( + order_code, + vipData?.id.toString(), + AppConfig.getPackageName(), + vipData?.android_template_id.toString(), + purchase.purchaseToken, + purchase.orderId.toString(), + vipData?.price.toString() + ) + if (it.responseCode == BillingClient.BillingResponseCode.OK) { + lifecycleScope.launch { + googlePaid(examplePayReq) + payReq = examplePayReq + MsMMKVUtils.saveOrder(examplePayReq) + } + } else { + MsMMKVUtils.saveOrder(examplePayReq) + lifecycleScope.launch { + toast(it.toString()) + hideDialog() + } + } + } + } + } + } + + private fun querySubProductDetails(listSubVip: List) { + val productDetailsResponseListener = + ProductDetailsResponseListener { billingResult, productDetailsList -> + if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { + val priceInfo = productDetailsList.mapNotNull { productDetails -> + productDetails.subscriptionOfferDetails?.get(0)?.pricingPhases?.pricingPhaseList?.get( + 0 + )?.let { + productDetails.productId to (it.formattedPrice to it.priceCurrencyCode) + } + }.toMap() + + // 更新VIP列表的价格和货币代码 + val updatedVipList = listSubVip.map { vip -> + priceInfo[vip.android_template_id]?.let { (price, currency) -> + vip.copy(price_google = price, currency_goolge = currency) + } ?: vip + } + + mAdapter?.recyclerView?.postDelayed({ + mAdapter?.submitList(updatedVipList) + hideDialog() + }, 500) + } else { + hideDialog() + } + } + + val productType: String = BillingClient.ProductType.SUBS + + val inAppProductInfo = listSubVip.map { + QueryProductDetailsParams.Product.newBuilder() + .setProductId(it.android_template_id) + .setProductType(productType) + .build() + } + if (inAppProductInfo.isNotEmpty()) { + val productDetailsParams = QueryProductDetailsParams.newBuilder() + .setProductList(inAppProductInfo) + .build() + billingClient?.queryProductDetailsAsync( + productDetailsParams, + productDetailsResponseListener + ) + } else { + hideDialog() + } + } + + private fun queryInAppProductDetails( + coinsList: List + ) { + val productDetailsResponseListener = + ProductDetailsResponseListener { billingResult, productDetailsList -> + if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { + val priceInfo = productDetailsList.mapNotNull { productDetails -> + productDetails.oneTimePurchaseOfferDetails?.let { + productDetails.productId to (it.formattedPrice to it.priceCurrencyCode) + } + }.toMap() + + // 更新Coins列表的价格和货币代码 + val updatedCoinsList = coinsList.map { coin -> + priceInfo[coin.android_template_id]?.let { (price, currency) -> + coin.copy(price_google = price, currency_goolge = currency) + } ?: coin + } + + mCoinAdapter?.recyclerView?.postDelayed({ + mCoinAdapter?.submitList(updatedCoinsList) + }, 500) + } else { + hideDialog() + } + } + + val productType = BillingClient.ProductType.INAPP + + val inAppProductInfo = coinsList.map { + QueryProductDetailsParams.Product.newBuilder() + .setProductId(it.android_template_id) + .setProductType(productType) + .build() + } + + if (inAppProductInfo.isNotEmpty()) { + val productDetailsParams = QueryProductDetailsParams.newBuilder() + .setProductList(inAppProductInfo) + .build() + billingClient?.queryProductDetailsAsync( + productDetailsParams, + productDetailsResponseListener + ) + } else { + hideDialog() + } + } + + private fun getProduct(productId: String) { + val productDetailsResponseListener = + ProductDetailsResponseListener { billingResult, productDetailsList -> + if (productDetailsList.isNotEmpty()) { + pay(productDetailsList[0]) + } else { + lifecycleScope.launch { + toast(billingResult.toString()) + hideDialog() + } + } + } + val productType: String = if (type == 0) { + BillingClient.ProductType.INAPP + } else { + BillingClient.ProductType.SUBS + } + + val inAppProductInfo = ArrayList() + inAppProductInfo.add( + QueryProductDetailsParams.Product.newBuilder() + .setProductId(productId) + .setProductType(productType) + .build() + ) + val productDetailsParams = QueryProductDetailsParams.newBuilder() + .setProductList(inAppProductInfo) + .build() + billingClient?.queryProductDetailsAsync( + productDetailsParams, + productDetailsResponseListener + ) + } + + private fun pay(productDetailInfo: ProductDetails) { + if (productDetailInfo.subscriptionOfferDetails?.isNotEmpty() == true) { + val params = ArrayList() + productDetailInfo.subscriptionOfferDetails?.get(0)?.offerToken?.let { + BillingFlowParams.ProductDetailsParams.newBuilder() + .setProductDetails(productDetailInfo) + .setOfferToken(it) + .build() + }?.let { + params.add( + it + ) + } + val billingFlowParams = BillingFlowParams.newBuilder() + .setObfuscatedProfileId(order_code) + .setObfuscatedAccountId(MsMMKVUtils.getCustomId()) + .setProductDetailsParamsList(params) + .build() + + billingClient?.launchBillingFlow(this, billingFlowParams) + } else { + val params = ArrayList() + params.add( + BillingFlowParams.ProductDetailsParams.newBuilder() + .setProductDetails(productDetailInfo) + .build() + ) + + val billingFlowParams = BillingFlowParams.newBuilder() + .setObfuscatedProfileId(order_code) + .setObfuscatedAccountId(MsMMKVUtils.getCustomId()) + .setProductDetailsParamsList(params) + .build() + + billingClient?.launchBillingFlow(this, billingFlowParams) + } + } + + fun Any.toMapViaGson(): MutableMap { + val json = Gson().toJson(this) + return Gson().fromJson(json, object : TypeToken>() {}.type) + } + + fun getCreateOrder(data: CreateOrderReqBean) { + EasyHttp.post(this) + .api(CreateOrderApi()) + .body(getPublicRequest(data.toMapViaGson())) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + order_code = it.order_code.toString() + if (type == 0){ + coinsData?.android_template_id?.let { it1 -> getProduct(it1) } + }else { + vipData?.android_template_id?.let { it1 -> getProduct(it1) } + } + + } ?: run { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.network_error.toString()) + } else { + toast(getString(R.string.example_service_exception_please_try_again)) + } + } + + } + + override fun onHttpFail(throwable: Throwable) { + super.onHttpFail(throwable) + } + + override fun onHttpEnd(api: IRequestApi) { + } + }) + } + + fun googlePaid(data: PayBean) { + EasyHttp.post(this) + .api(GooglePaidApi()) + .body(getPublicRequest(data.toMapViaGson())) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.g_pay_success.toString()) + } else { + toast(getString(R.string.google_pay_success)) + } + if (null != payReq) { + MsMMKVUtils.removeOrder(payReq) + } + if (it.is_backhaul == 1) { +// LogEventUtils.logEvent( +// ExampleAppConstants.LogEvent_af_app_recharge, +// it.data.money.toDouble(), "USD", "", order_code +// ) + } + getCustomerUser() + + } ?: run { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.network_error.toString()) + } else { + toast(getString(R.string.example_service_exception_please_try_again)) + } + hideDialog() + } + } + + }) + } + + + private fun consumePurchase(purchase: Purchase?) { + if (billingClient?.isReady == true) { + purchaseData = purchase + val consumeParams = ConsumeParams.newBuilder() + .setPurchaseToken(purchase?.purchaseToken!!) + .build() + billingClient?.consumeAsync(consumeParams, consumeResponseListener) + } else { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.g_pay_error.toString()) + } else { + toast(getString(R.string.google_pay_error)) + } + hideDialog() + } + } + + private var consumeResponseListener = + ConsumeResponseListener { billingResult, purchaseToken -> + val examplePayReq = PayBean( + order_code, + if (type == 0) coinsData?.id.toString() else vipData?.id.toString(), + AppConfig.getPackageName(), + if (type == 0) coinsData?.android_template_id.toString() else vipData?.android_template_id.toString(), + purchaseToken, + purchaseData?.orderId.toString(), + if (type == 0) coinsData?.price.toString() else vipData?.price.toString() + ) + if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { + lifecycleScope.launch { + googlePaid(examplePayReq) + payReq = examplePayReq + MsMMKVUtils.saveOrder(examplePayReq) + } + } else { + MsMMKVUtils.saveOrder(examplePayReq) + lifecycleScope.launch { + toast(billingResult.toString()) + hideDialog() + } + } + } + + private fun getCustomerUser() { + EasyHttp.get(this) + .api(UserInfoApi()) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + MsMMKVUtils.saveUserInfo(it) + setUI() + } + } + }) + } + + override fun onDestroy() { + super.onDestroy() + payReq = null + billingClient?.endConnection() + billingClient = null + System.gc() + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/VideoPlayActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/VideoPlayActivity.kt index cd55994..dcc7b04 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/VideoPlayActivity.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/VideoPlayActivity.kt @@ -1,26 +1,56 @@ package com.localee.mireo.app.ui.activity import android.annotation.SuppressLint +import android.net.Uri import android.os.Bundle import android.view.View import android.view.ViewGroup import android.view.WindowManager +import android.widget.FrameLayout +import android.widget.ImageView import android.widget.TextView +import androidx.activity.OnBackPressedCallback +import androidx.annotation.OptIn import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.AppCompatTextView +import androidx.fragment.app.DialogFragment.STYLE_NO_FRAME +import androidx.lifecycle.lifecycleScope +import androidx.media3.common.MediaItem +import androidx.media3.common.PlaybackException +import androidx.media3.common.Player +import androidx.media3.common.util.UnstableApi +import androidx.media3.datasource.DataSource +import androidx.media3.datasource.DefaultDataSourceFactory +import androidx.media3.exoplayer.DefaultRenderersFactory +import androidx.media3.exoplayer.ExoPlayer +import androidx.media3.exoplayer.hls.HlsMediaSource +import androidx.media3.exoplayer.source.MediaSource +import androidx.media3.exoplayer.source.ProgressiveMediaSource +import androidx.media3.ui.PlayerView import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import com.blankj.utilcode.util.NetworkUtils -import com.localee.mireo.app.utils.MsMMKVUtils +import com.bumptech.glide.Glide +import com.google.common.reflect.TypeToken +import com.google.gson.Gson import com.hjq.http.EasyHttp import com.hjq.http.config.IRequestApi import com.hjq.http.listener.HttpCallbackProxy import com.hjq.toast.ToastUtils -import com.localee.mireo.app.R import com.localee.mireo.app.app.AppActivity import com.localee.mireo.app.app.BaseEventBus +import com.localee.mireo.app.http.api.ActiveAfterWatchingVideoApi import com.localee.mireo.app.http.api.CreateHistoryApi +import com.localee.mireo.app.http.api.DetailsRecommandApi +import com.localee.mireo.app.http.api.DoBuyVideoApi +import com.localee.mireo.app.http.api.ExampleRecommendDataRes +import com.localee.mireo.app.http.api.UploadHistorySecondsApi +import com.localee.mireo.app.http.api.UserInfoApi +import com.localee.mireo.app.http.api.UserInfoRes import com.localee.mireo.app.http.api.VideoDetailsApi +import com.localee.mireo.app.http.bean.HomeDataHistoryBean +import com.localee.mireo.app.http.bean.PaySettingsBean +import com.localee.mireo.app.http.bean.UploadHistoryBean import com.localee.mireo.app.http.model.HttpData import com.localee.mireo.app.other.MsConstants import com.localee.mireo.app.other.MsConstants.CONSTANTS_activity_id @@ -28,22 +58,30 @@ import com.localee.mireo.app.other.MsConstants.CONSTANTS_quality import com.localee.mireo.app.other.MsConstants.CONSTANTS_quality_refresh import com.localee.mireo.app.other.MsConstants.CONSTANTS_short_play_id import com.localee.mireo.app.other.MsConstants.Constants_Episodes_Series_Data_currentPositionExample -import com.localee.mireo.app.ui.videoPaly.ExamplePlayerDetailDataRes +import com.localee.mireo.app.other.MsConstants.ExampleDetailCanPlay +import com.localee.mireo.app.ui.adapter.RecommendBannerAdapter +import com.localee.mireo.app.ui.fragment.RechargeDialogFragment import com.localee.mireo.app.ui.videoPaly.ExampleSeriesDialogFragment import com.localee.mireo.app.ui.videoPaly.ExampleUnFavoriteDialog +import com.localee.mireo.app.ui.videoPaly.FfmpegRenderersFactory import com.localee.mireo.app.ui.videoPaly.VideoPlayAdapter import com.localee.mireo.app.ui.videoPaly.VideoPlayerView import com.localee.mireo.app.utils.DHStringUtils.getPublicRequest +import com.localee.mireo.app.utils.MsMMKVUtils import com.localee.mireo.app.utils.TranslatesUtils import com.localee.mireo.app.utils.formatNumber import com.localee.mireo.app.utils.singleClick +import com.localee.mireo.shortapp.R import com.scwang.smart.refresh.layout.SmartRefreshLayout +import com.youth.banner.Banner +import com.youth.banner.listener.OnPageChangeListener +import kotlinx.coroutines.launch import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailCollection, - ExampleSeriesDialogFragment.SeriesCallBack { + ExampleSeriesDialogFragment.SeriesCallBack, RechargeDialogFragment.OnDataPass { companion object { const val INTENT_KEY_PARAMETERS: String = "parameters" @@ -52,13 +90,17 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle private var first: Boolean = true private var play: Boolean = true private var qualityRefresh: Boolean = false + private var needRefresh: Boolean = false + private var needRestart: Boolean = false + private var isComplete: Boolean = false // private val exampleRecommendViewModel by lazy { ViewModelProvider(this)[ExampleRecommendViewModel::class.java] } private var currentPage = 1 private val currentSize = 10 private var currentPosition = 0 - private var exampleRecommendAdapter: VideoPlayAdapter? = null - private var data: com.localee.mireo.app.http.api.ExampleRecommendDataRes.Data? = null + private var bannerPosition = 0 + private var recommendAdapter: VideoPlayAdapter? = null + private var data: ExampleRecommendDataRes.Data? = null private var revolution = MsMMKVUtils.getMMKV().getInt(MsConstants.CONSTANTS_quality, 0).toString() @@ -73,16 +115,39 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle private val exampleEmpty: ViewGroup? by lazy { findViewById(R.id.example_empty) } private val exampleTvEmpty: TextView? by lazy { exampleEmpty?.findViewById(R.id.example_tv_empty) } - private var shortVideoId: Int? = null + private val viewLock: ViewGroup? by lazy { findViewById(R.id.view_lock) } + private val tvLockEpisode: TextView? by lazy { viewLock?.findViewById(R.id.tv_lock_episode) } + + private val cover: ImageView? by lazy { findViewById(R.id.cover) } + + private val viewVideoRecommend: ViewGroup? by lazy { findViewById(R.id.view_video_recommend) } + private val exampleBannerRecommend: Banner? by lazy { + viewVideoRecommend?.findViewById(R.id.example_banner_recommend) + } + private val recommendPlayerView: PlayerView? by lazy { viewVideoRecommend?.findViewById(R.id.recommend_player_view) } + private val tvPlayNowRecommend: TextView? by lazy { viewVideoRecommend?.findViewById(R.id.tv_play_now_recommend) } + private val ivCloseRecommend: ImageView? by lazy { viewVideoRecommend?.findViewById(R.id.iv_close_recommend) } + private val frameLayout: FrameLayout? by lazy { viewVideoRecommend?.findViewById(R.id.frameLayout) } + private val ivCoverRecommendDetail: ImageView? by lazy { recommendPlayerView?.findViewById(R.id.iv_cover_recommend_detail) } + + private var shortPlayId: Int? = null private var activityId: Int? = null private var shortVideo: VideoDetailsApi.Bean.ShortPlayInfo? = null + private var episode: VideoDetailsApi.Bean.Episode? = null + + private var startTime: Long = 0 + + @SuppressLint("UnsafeOptInUsageError") + private var builder: ExoPlayer.Builder? = null + private var player: ExoPlayer? = null override fun getLayoutId(): Int { return R.layout.video_play_activity } + @SuppressLint("UnsafeOptInUsageError") override fun initView() { - shortVideoId = intent.getIntExtra(CONSTANTS_short_play_id, 0) + shortPlayId = intent.getIntExtra(CONSTANTS_short_play_id, 0) activityId = intent.getIntExtra(CONSTANTS_activity_id, 0) EventBus.getDefault().register(this) this.window?.setFlags( @@ -91,10 +156,54 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle ) this.window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + startTime = System.currentTimeMillis() + exampleTvNoNetwork?.text = TranslatesUtils.translates()?.no_network tvExampleRetry?.text = TranslatesUtils.translates()?.retry exampleTvEmpty?.text = TranslatesUtils.translates()?.s_no_content + + + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (handleCustomLogic()) { + return + } + } + }) + builder = ExoPlayer.Builder(this, FfmpegRenderersFactory(this)) + .setRenderersFactory(DefaultRenderersFactory(this).setEnableDecoderFallback(true)) + player = builder?.build() + recommendPlayerView?.player = player + player?.addListener(object : Player.Listener { + override fun onPlaybackStateChanged(playbackState: Int) { + super.onPlaybackStateChanged(playbackState) + when (playbackState) { + Player.STATE_BUFFERING -> { + + } + + Player.STATE_READY -> { + player?.play() + ivCoverRecommendDetail?.visibility = View.INVISIBLE + } + + Player.STATE_ENDED -> { + ivCoverRecommendDetail?.visibility = View.VISIBLE + } + + Player.STATE_IDLE -> { + } + } + } + + override fun onPlayerError(error: PlaybackException) { + super.onPlayerError(error) + ivCoverRecommendDetail?.visibility = View.VISIBLE + } + + }) + ivCloseRecommend?.setOnClickListener { finish() } } override fun initData() { @@ -110,8 +219,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle fun initialization() { if (NetworkUtils.isConnected()) { -// avi?.start() - getVideoDetails() + getVideoDetails(shortPlayId, 0, activityId) } else { if (TranslatesUtils.translates() != null) { @@ -123,13 +231,12 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle } srRecommend?.setOnRefreshListener { if (NetworkUtils.isConnected()) { -// avi?.start() currentPage = 1 viewPagerExampleRecommend?.post { detailPlayerView()?.stop() detailPlayerView()?.release() } - getVideoDetails() + getVideoDetails(shortPlayId, 0, activityId) } else { if (TranslatesUtils.translates() != null) { ToastUtils.show(TranslatesUtils.translates()?.no_network.toString()) @@ -144,32 +251,79 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle override fun onPageSelected(position: Int) { super.onPageSelected(position) currentPosition = position - val previousPosition = exampleRecommendAdapter?.currentPlayingPosition + val previousPosition = recommendAdapter?.currentPlayingPosition if (previousPosition != position) { - exampleRecommendAdapter?.recyclerView?.post { exampleRecommendAdapter?.notifyDataSetChanged() } - } - exampleRecommendAdapter?.currentPlayingPosition = position - - previousPosition?.let { - val recyclerView = - viewPagerExampleRecommend?.getChildAt(0) as RecyclerView - val exampleDetailPlayerView = - recyclerView.layoutManager?.findViewByPosition(it) as VideoPlayerView? - if (null != exampleDetailPlayerView) { - val episode1 = - exampleRecommendAdapter?.items?.get(it) - episode1?.short_play_id?.let { it1 -> - episode1?.short_play_video_id?.let { it2 -> - createHistory( - it1, - it2 - ) + previousPosition?.let { + try { + val recyclerView = + viewPagerExampleRecommend?.getChildAt(0) as RecyclerView + val exampleDetailPlayerView = + recyclerView.layoutManager?.findViewByPosition(it) as VideoPlayerView? + if (null != exampleDetailPlayerView) { + val episode1 = + recommendAdapter?.items?.get(previousPosition) + episode1?.play_seconds = + if (needRestart) "0" else exampleDetailPlayerView.lastProgress() + .toString() + if (episode1?.is_lock == false) { + setUploadHistorySeconds( + UploadHistoryBean( + if (needRestart) 0 else exampleDetailPlayerView.lastProgress(), + shortPlayId!!, + episode?.short_play_video_id + ) + ) + needRestart = false + } } + } catch (e: Exception) { + e.printStackTrace() } - } + recommendAdapter?.recyclerView?.post { recommendAdapter?.notifyDataSetChanged() } } + recommendAdapter?.currentPlayingPosition = position + recommendAdapter?.items?.get(currentPosition)?.let { + episode = it + if (it.is_lock && !MsMMKVUtils.isVip()) { + MsConstants.ExampleLock = true + viewLock?.visibility = View.VISIBLE + tvLockEpisode?.text = + "Unlocking costs ".plus(it.coins.toString()).plus(" coins") + + + tvLockEpisode?.setOnClickListener { it1 -> + if (currentPosition > 0) { + recommendAdapter?.items?.get(currentPosition - 1) + ?.let { it2 -> + if (it2.is_lock) { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.jump_unlock_error.toString()) + } else { + toast("The prequel to this series is not unlocked. Please unlock the prequel before unlocking this series") + } + return@setOnClickListener + } + } + } + showGoldShortageDialog(it) + } + viewLock?.postDelayed({ + detailPlayerView()?.pause() + }, 500) + } else { + MsConstants.ExampleLock = false + viewLock?.visibility = View.INVISIBLE + createHistory( + it.short_play_id, + it.short_play_video_id + ) + } + + } + + } override fun onPageScrollStateChanged(state: Int) { @@ -181,7 +335,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle ) ) { if (!first) { - getVideoDetails() + getVideoDetails(shortPlayId, 0, activityId) } else { first = false } @@ -208,9 +362,8 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle } return@singleClick } -// avi?.start() currentPage = 1 - getVideoDetails() + getVideoDetails(shortPlayId, 0, activityId) } } tvExampleRetry?.setOnClickListener { @@ -223,25 +376,12 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle } return@singleClick } -// avi?.start() currentPage = 1 - getVideoDetails() + getVideoDetails(shortPlayId, 0, activityId) } } } -// override fun onHiddenChanged(hidden: Boolean) { -// super.onHiddenChanged(hidden) -// if (!hidden) { -// activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) -// MsConstants.ExampleIsCurrentPage = true -// qualityLogic() -// } else { -// activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) -// MsConstants.ExampleIsCurrentPage = false -// srRecommend?.postDelayed({ detailPlayerView()?.pause() }, 300) -// } -// } override fun onResume() { super.onResume() @@ -258,7 +398,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle detailPlayerView()?.stop() detailPlayerView()?.release() } - getVideoDetails() + getVideoDetails(shortPlayId, 0, activityId) qualityRefresh = false } else { detailPlayerView()?.play() @@ -271,13 +411,16 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle srRecommend?.postDelayed({ detailPlayerView()?.pause() }, 300) } - fun getVideoDetails() { + fun getVideoDetails( + shortPlayId: Int?, + videoId: Int?, + activityId: Int? + ) { EasyHttp.get(this) .api(VideoDetailsApi().apply { - if (activityId!! != 0) { - video_id = activityId; - } - short_play_id = shortVideoId; + activity_id = activityId; + video_id = videoId; + short_play_id = shortPlayId; }) .request(object : HttpCallbackProxy>(this) { @@ -285,11 +428,13 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle result.getData()?.let { if (it.episodeList.isNotEmpty()) { shortVideo = it.shortPlayInfo - exampleRecommendAdapter = VideoPlayAdapter() - exampleRecommendAdapter?.shortVideo = it.shortPlayInfo - viewPagerExampleRecommend?.adapter = exampleRecommendAdapter - exampleRecommendAdapter?.submitList(it.episodeList) - exampleRecommendAdapter?.playerDetailCollection = + cover?.visibility = View.INVISIBLE + viewPagerExampleRecommend?.visibility = View.VISIBLE + recommendAdapter = VideoPlayAdapter() + recommendAdapter?.shortVideo = it.shortPlayInfo + viewPagerExampleRecommend?.adapter = recommendAdapter + recommendAdapter?.submitList(it.episodeList) + recommendAdapter?.playerDetailCollection = this@VideoPlayActivity createHistory( it.episodeList[0].short_play_id, @@ -297,6 +442,19 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle ); exampleNetwork?.visibility = View.INVISIBLE exampleEmpty?.visibility = View.INVISIBLE + cover?.let { it1 -> + Glide.with(this@VideoPlayActivity).load(shortVideo?.image_url) + .into(it1) + } + if (it.video_info.episode > 1) { + it.video_info.episode.minus(1) + .let { it1 -> + viewPagerExampleRecommend?.setCurrentItem( + it1, + false + ) + } + } } else { if (TranslatesUtils.translates() != null) { ToastUtils.show(TranslatesUtils.translates()?.no_more_data.toString()) @@ -359,7 +517,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle shortVideo?.is_collect = true textview?.text = formatNumber(shortVideo?.collect_total!!) textview?.setTextColor(resources.getColor(R.color.example_color_F56490)) - exampleRecommendAdapter?.shortVideo = shortVideo + recommendAdapter?.shortVideo = shortVideo EventBus.getDefault().post( BaseEventBus( MsConstants.Constants_Episodes_Series_DataExample, @@ -403,7 +561,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle shortVideo?.is_collect = false textview?.text = formatNumber(shortVideo?.collect_total!!) textview?.setTextColor(resources.getColor(R.color.white)) - exampleRecommendAdapter?.shortVideo = shortVideo + recommendAdapter?.shortVideo = shortVideo EventBus.getDefault().post( BaseEventBus( MsConstants.Constants_Episodes_Series_DataExample, @@ -437,18 +595,26 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle } override fun onDestroy() { + ExampleDetailCanPlay = false viewPagerExampleRecommend?.post { + player?.stop() + player?.release() + player = null detailPlayerView()?.stop() detailPlayerView()?.release() } + recommendAdapter?.shortVideo = null + recommendAdapter?.playerDetailCollection = null + window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); super.onDestroy() EventBus.getDefault().unregister(this) + System.gc() } @Subscribe(threadMode = ThreadMode.MAIN) fun onEvent(event: String) { if (MsConstants.Constants_RecommendPlayerView_DramaSeriesExample == event) { - if (exampleRecommendAdapter?.items?.isNotEmpty() == true) { + if (recommendAdapter?.items?.isNotEmpty() == true) { val exampleSeriesDialogFragment = ExampleSeriesDialogFragment() val bundle = Bundle() bundle.putInt( @@ -461,7 +627,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle ) bundle.putParcelableArrayList( MsConstants.Constants_Episodes_Series_Data_ListExample, - exampleRecommendAdapter?.items?.let { ArrayList(it) } + recommendAdapter?.items?.let { ArrayList(it) } ) exampleSeriesDialogFragment.seriesCallBack = this exampleSeriesDialogFragment.arguments = bundle @@ -472,14 +638,39 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle } } if (MsConstants.Constants_DetailPlayerView_PLAYER_STATUS_FINISHExample == event) { + if (viewPagerExampleRecommend?.currentItem == recommendAdapter?.items?.size?.minus( + 1 + ) + ) { + getDetailsRecommand() + viewPagerExampleRecommend?.post { + detailPlayerView()?.pause() + detailPlayerView()?.release() + viewPagerExampleRecommend?.visibility = View.GONE + cover?.visibility = View.VISIBLE + } + } + needRestart = true + recommendAdapter?.items?.get(currentPosition)?.let { it1 -> + if (activityId != 0) { + setActiveAfterWatchingVideo( + it1.short_play_id, + it1.short_play_video_id, + activityId!! + ) + isComplete = true + } + it1.play_seconds = "0" + } currentPosition.plus(1) .let { - exampleRecommendAdapter?.items?.get(it)?.let { it1 -> + recommendAdapter?.items?.get(it)?.let { it1 -> + MsConstants.ExampleLock = it1.is_lock if (it1.coins > 0) { if (MsMMKVUtils.getMMKV().getString( CONSTANTS_short_play_id, "" - ) == shortVideoId.toString() + ) == shortPlayId.toString() ) { } } @@ -487,6 +678,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle detailPlayerView()?.stop() viewPagerExampleRecommend?.currentItem = it } + } if (CONSTANTS_quality_refresh == event) { @@ -497,26 +689,29 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle } if (MsConstants.Constants_RecommendPlayerView_CLOSEExample == event) { - finish() + handleCustomLogic() } if (CONSTANTS_quality == event) { startActivity(SearchActivity::class.java) } - + if (MsConstants.CONSTANTS_pay_refresh == event) { + needRefresh = true + getCustomerUser() + } } @Subscribe(threadMode = ThreadMode.MAIN) - fun onEvent(event: BaseEventBus) { + fun onEvent(event: BaseEventBus) { // if (MsConstants.Constants_Episodes_Series_DataExample == event.code) { -// if (exampleRecommendAdapter?.items?.get(currentPosition)?.name == event.data.name) { +// if (recommendAdapter?.items?.get(currentPosition)?.name == event.data.name) { // val imageView = // detailPlayerView()?.findViewById(R.id.example_iv_collection_controller) // val textview = // detailPlayerView()?.findViewById(R.id.example_tv_collection_num_controller) // imageView?.setImageResource(if (event.data.is_collect) R.mipmap.iv_example_collection_h else R.mipmap.iv_example_collection_n) -// exampleRecommendAdapter?.items?.get(currentPosition)?.collect_total = +// recommendAdapter?.items?.get(currentPosition)?.collect_total = // event.data.collect_total -// exampleRecommendAdapter?.items?.get(currentPosition)?.is_collect = +// recommendAdapter?.items?.get(currentPosition)?.is_collect = // event.data.is_collect // textview?.text = formatNumber(event.data.collect_total) // } @@ -568,47 +763,48 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle override fun collection(episode: VideoDetailsApi.Bean.Episode) { singleClick { - if (shortVideo?.is_collect == true) { - val exampleUnFavoriteDialog = ExampleUnFavoriteDialog(this) - val tvThinkAgain = - exampleUnFavoriteDialog.findViewById(R.id.example_tv_think_again) - val tvUnfavorite = - exampleUnFavoriteDialog.findViewById(R.id.example_tv_unfavorite) - val tvTitle = - exampleUnFavoriteDialog.findViewById(R.id.example_tv_title) - val tvContent = - exampleUnFavoriteDialog.findViewById(R.id.example_tv_content) - if (TranslatesUtils.translates() != null) { - tvThinkAgain.text = TranslatesUtils.translates()?.try_again - tvUnfavorite.text = TranslatesUtils.translates()?.collection - tvTitle.text = TranslatesUtils.translates()?.collection - tvContent.text = TranslatesUtils.translates()?.not_collect_warning - } - tvThinkAgain.setOnClickListener { exampleUnFavoriteDialog.dismiss() } - tvUnfavorite.setOnClickListener { - episode.short_play_id.let { - episode.short_play_video_id.let { it1 -> - doCancelCollect( - it, it1 - ) - } - } - exampleUnFavoriteDialog.dismiss() - } - exampleUnFavoriteDialog.show() - } else { + if (shortVideo?.is_collect == true) { + val exampleUnFavoriteDialog = ExampleUnFavoriteDialog(this) + val tvThinkAgain = + exampleUnFavoriteDialog.findViewById(R.id.example_tv_think_again) + val tvUnfavorite = + exampleUnFavoriteDialog.findViewById(R.id.example_tv_unfavorite) + val tvTitle = + exampleUnFavoriteDialog.findViewById(R.id.example_tv_title) + val tvContent = + exampleUnFavoriteDialog.findViewById(R.id.example_tv_content) + if (TranslatesUtils.translates() != null) { + tvThinkAgain.text = TranslatesUtils.translates()?.try_again + tvUnfavorite.text = TranslatesUtils.translates()?.collection + tvTitle.text = TranslatesUtils.translates()?.collection + tvContent.text = TranslatesUtils.translates()?.not_collect_warning + } + tvThinkAgain.setOnClickListener { exampleUnFavoriteDialog.dismiss() } + tvUnfavorite.setOnClickListener { episode.short_play_id.let { episode.short_play_video_id.let { it1 -> - doCollect( + doCancelCollect( it, it1 ) } } + exampleUnFavoriteDialog.dismiss() + } + exampleUnFavoriteDialog.show() + } else { + episode.short_play_id.let { + episode.short_play_video_id.let { it1 -> + doCollect( + it, it1 + ) + } + } } } } override fun chooseSeries(episode: VideoDetailsApi.Bean.Episode) { + MsConstants.ExampleLock = episode.is_lock postDelayed({ detailPlayerView()?.pause() }, 300) episode.episode.minus(1) .let { @@ -617,5 +813,366 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle } + private fun showGoldShortageDialog(episode1: VideoDetailsApi.Bean.Episode) { + val allCoin = MsMMKVUtils.getAllCoin() + if (allCoin >= episode1.coins) { + if (currentPosition > 0) { + recommendAdapter?.items?.get(currentPosition - 1) + ?.let { it2 -> + if (it2.is_lock) { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.jump_unlock_error.toString()) + } else { + toast("The prequel to this series is not unlocked. Please unlock the prequel before unlocking this series") + } + return + } + } + } + doBuyVideo( + episode1.short_play_id, + episode1.short_play_video_id + ) + } else { + try { + rechargeDialog(episode1) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + fun doBuyVideo(shortPlayId: Int, videoId: Int) { + val sMap: MutableMap = LinkedHashMap() + // StringMap = getSortMap(StringMap); + sMap.put("short_play_id", shortPlayId.toString()) + sMap.put("video_id", videoId.toString()) + + EasyHttp.post(this) + .api(DoBuyVideoApi()) + .body(getPublicRequest(sMap)) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + if (result.getData() != null) { + when (result.getData()?.status) { + "no_play" -> { + toast(getString(R.string.example_service_exception_please_try_again)) +// exampleHomeViewModel.getHomeCategories() + } + + "not_enough" -> { + val get = recommendAdapter?.items?.get(currentPosition) + get?.let { it1 -> rechargeDialog(it1) } + } + + "success" -> { + needRefresh = false + getCustomerUser() + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.success.toString()) + } + MsConstants.ExampleLock = false + viewLock?.visibility = View.INVISIBLE + val get = recommendAdapter?.items?.get(currentPosition) + get?.is_lock = false + recommendAdapter?.notifyDataSetChanged() + get?.short_play_id?.let { it1 -> + get.short_play_video_id.let { it2 -> + createHistory( + it1, + it2 + ) + } + } + } + } + } else { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.network_error.toString()) + } else { + toast(getString(R.string.example_service_exception_please_try_again)) + } + } + } + }) + } + + fun getCustomerUser() { + EasyHttp.get(this) + .api(UserInfoApi().apply { + }) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + + MsMMKVUtils.saveUserInfo(it) + if (needRefresh) { + if (MsMMKVUtils.isVip()) { + revolution = "1080" + MsMMKVUtils.getMMKV() + .putInt(CONSTANTS_quality, 1080) + detailRefresh() + EventBus.getDefault().post(CONSTANTS_quality_refresh) + } + } + } + } + }) + } + + private fun detailRefresh() { + detailPlayerView()?.pause() + detailPlayerView()?.stop() + detailPlayerView()?.release() + recommendAdapter?.items?.get(currentPosition)?.let { it1 -> + getVideoDetails( + it1.short_play_id, + it1.short_play_video_id, + activityId, + ) + } + } + + private fun rechargeDialog( + it: VideoDetailsApi.Bean.Episode + ) { + try { + val exampleRechargeDialogFragment = + RechargeDialogFragment() + exampleRechargeDialogFragment.dataPasser = this + val bundle = Bundle() + bundle.putParcelable(MsConstants.CONSTANTS_Episode, it) + exampleRechargeDialogFragment.setStyle(STYLE_NO_FRAME, 0) + exampleRechargeDialogFragment.arguments = bundle + exampleRechargeDialogFragment.show( + supportFragmentManager, + "ExampleRechargeDialogFragment" + ) + play = true + } catch (e: Exception) { + e.printStackTrace() + } + } + + private var detainmentData: PaySettingsBean.Coins? = null + override fun onDataPass(data: PaySettingsBean.Coins?) { + detainmentData = data + } + + private fun handleCustomLogic(): Boolean { + if (viewVideoRecommend?.visibility == View.INVISIBLE) { + val currentTime = System.currentTimeMillis() + val duration = currentTime - startTime + if (duration > 3000) { + getDetailsRecommand() + viewPagerExampleRecommend?.post { + detailPlayerView()?.stop() + viewPagerExampleRecommend?.visibility = View.GONE + cover?.visibility = View.VISIBLE + } + } else { + finish() + } + } + return false + } + + + fun getDetailsRecommand() { + EasyHttp.get(this) + .api(DetailsRecommandApi()) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + setDetailsRecommendation(it) + } ?: finish() + } + }) + } + + + @SuppressLint("UnsafeOptInUsageError") + private fun setDetailsRecommendation(data: DetailsRecommandApi.Bean) { + if (data.list.isNotEmpty()) { + ExampleDetailCanPlay = false + viewVideoRecommend?.visibility = View.VISIBLE + val recommendBannerAdapter = + RecommendBannerAdapter(data.list) + exampleBannerRecommend?.setBannerGalleryEffect( + 52, + 20 + ) + exampleBannerRecommend?.addOnPageChangeListener( + object : + OnPageChangeListener { + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + } + + @SuppressLint("UnsafeOptInUsageError") + override fun onPageSelected(position: Int) { + bannerPosition = position + recommendBannerAdapter.currentPlayingPosition = position + recommendBannerAdapter.notifyDataSetChanged() + val data = recommendBannerAdapter.getData(position) + ivCoverRecommendDetail?.let { it1 -> + Glide.with(this@VideoPlayActivity) + .load(data?.image_url) + .error(R.mipmap.ic_loading_v) + .placeholder(R.mipmap.ic_loading_v) + .into(it1) + } + frameLayout?.visibility = View.VISIBLE + ivCoverRecommendDetail?.visibility = View.VISIBLE + player?.stop() + player?.setMediaSource(buildMediaSource(data?.video_url.toString())) + player?.prepare() + } + + override fun onPageScrollStateChanged(state: Int) { + if (1 == state) { + player?.pause() + frameLayout?.visibility = + View.INVISIBLE + recommendBannerAdapter.currentPlayingPosition = -1 + recommendBannerAdapter.notifyDataSetChanged() + } else { + if (2 == state) { + if (player?.isPlaying == false) { + player?.play() + frameLayout?.visibility = + View.VISIBLE + recommendBannerAdapter.currentPlayingPosition = + bannerPosition + recommendBannerAdapter.notifyDataSetChanged() + } + } + } + } + }) + exampleBannerRecommend?.setAdapter( + recommendBannerAdapter + ) + tvPlayNowRecommend?.setOnClickListener { + val data = recommendBannerAdapter.getData(bannerPosition) + watchNow(data, data?.short_play_id) + } + val data = recommendBannerAdapter.getData(0) + ivCoverRecommendDetail?.let { it1 -> + Glide.with(this@VideoPlayActivity).load(data?.image_url) + .into(it1) + } + lifecycleScope.launch { + player?.setMediaSource(buildMediaSource(data?.video_url.toString())) + player?.prepare() + } + } else { + finish() + } + } + + @SuppressLint("UnsafeOptInUsageError") + private fun buildMediaSource(videoPath: String): MediaSource { + val dataSourceFactory: DataSource.Factory = DefaultDataSourceFactory(this, "guyantv") + + return if (videoPath.endsWith(".m3u8")) { + HlsMediaSource.Factory(dataSourceFactory) + .createMediaSource(MediaItem.fromUri(Uri.parse(videoPath))) + } else { + ProgressiveMediaSource.Factory(dataSourceFactory) + .createMediaSource(MediaItem.fromUri(Uri.parse(videoPath))) + } + } + + private fun watchNow( + data: DetailsRecommandApi.Bean.Item?, + short_play_id: Int? + ) { + exampleBannerRecommend?.postDelayed({ + if (data?.short_play_id != null) { + player?.stop() + if (short_play_id != null) { + shortPlayId = short_play_id + } + getVideoDetails(shortPlayId, 0, activityId) + } + }, 300) + viewVideoRecommend?.visibility = View.INVISIBLE + } + + override fun onStop() { + super.onStop() + val size = recommendAdapter?.items?.size ?: 0 + if (size > 1) { + recommendAdapter?.items?.get(currentPosition)?.let { + if (!it.is_lock) { + setUploadHistorySeconds( + UploadHistoryBean( + detailPlayerView()?.lastProgress(), + shortPlayId!!, + it.short_play_video_id + ) + ) + } + val toJson = Gson().toJson( + shortPlayId?.let { it1 -> + HomeDataHistoryBean( + shortVideo?.name.toString(), + it1, + it.episode.toString(), + shortVideo?.image_url.toString() + ) + } + ) + MsMMKVUtils.getMMKV() + .putString(MsConstants.Constants_Main_Video_info, toJson) + MsMMKVUtils.getMMKV() + .putBoolean(MsConstants.Constants_Main_Video_status, true) + } + } + } + + fun Any.toMapViaGson(): MutableMap { + val json = Gson().toJson(this) + return Gson().fromJson(json, object : TypeToken>() {}.type) + } + + fun setUploadHistorySeconds(data: UploadHistoryBean) { + EasyHttp.post(this) + .api(UploadHistorySecondsApi()) + .body(getPublicRequest(data.toMapViaGson())) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + } + }) + } + + fun setActiveAfterWatchingVideo( + short_play_id: Int, + video_id: Int, + activity_id: Int + ) { + val sMap: MutableMap = LinkedHashMap() + sMap.put("short_play_id", short_play_id.toString()) + sMap.put("short_play_video_id", video_id.toString()) + sMap.put("activity_id", activity_id.toString()) + EasyHttp.post(this) + .api(ActiveAfterWatchingVideoApi()) + .body(getPublicRequest(sMap)) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + } + }) + } + } \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/CustomerBuyRecordAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/CustomerBuyRecordAdapter.kt new file mode 100644 index 0000000..ce9de38 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/CustomerBuyRecordAdapter.kt @@ -0,0 +1,40 @@ +package com.localee.mireo.app.ui.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.chad.library.adapter4.BaseQuickAdapter +import com.localee.mireo.app.http.api.CustomerBuyRecordsApi +import com.localee.mireo.shortapp.databinding.ItemWalletRecordBinding + +class CustomerBuyRecordAdapter : + BaseQuickAdapter() { + + class VH( + parent: ViewGroup, + val binding: ItemWalletRecordBinding = ItemWalletRecordBinding.inflate( + LayoutInflater.from(parent.context), parent, false + ), + ) : RecyclerView.ViewHolder(binding.root) + + override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH { + return VH(parent) + } + + override fun onBindViewHolder( + holder: VH, + position: Int, + item: CustomerBuyRecordsApi.Bean.Data? + ) { + if (null != item) { + holder.binding.tvName.text = "Purchase Single Episode" + holder.binding.tvTime.text = item.created_at + holder.binding.tvConins.text = "-" + item.coins + holder.binding.ivConins.visibility = View.VISIBLE + holder.binding.tvBalance.text = "EP." + item.episode + " Romantic Flash Marri..." + } + + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/CustomerOrderRecordAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/CustomerOrderRecordAdapter.kt new file mode 100644 index 0000000..4a34779 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/CustomerOrderRecordAdapter.kt @@ -0,0 +1,44 @@ +package com.localee.mireo.app.ui.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.chad.library.adapter4.BaseQuickAdapter +import com.localee.mireo.shortapp.databinding.ItemWalletRecordBinding +import com.localee.mireo.app.http.api.CustomerOrderApi + +class CustomerOrderRecordAdapter : + BaseQuickAdapter() { + + class VH( + parent: ViewGroup, + val binding: ItemWalletRecordBinding = ItemWalletRecordBinding.inflate( + LayoutInflater.from(parent.context), parent, false + ), + ) : RecyclerView.ViewHolder(binding.root) + + override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH { + return VH(parent) + } + + override fun onBindViewHolder( + holder: VH, + position: Int, + item: CustomerOrderApi.Bean.Data? + ) { + if (null != item) { + holder.binding.tvBalance.visibility = View.GONE + holder.binding.tvTime.text = item.created_at + holder.binding.tvName.text = item.type + holder.binding.tvConins.text = "+" + item.value + + if (item.value.isNotEmpty() && item.value.contains("day")){ + holder.binding.ivConins.visibility = View.GONE + } + + } + + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeBannerAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeBannerAdapter.kt index 72e1213..49ca378 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeBannerAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeBannerAdapter.kt @@ -7,9 +7,9 @@ import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R import com.localee.mireo.app.app.AppApplication -import com.localee.mireo.app.http.api.RecommendBean +import com.localee.mireo.app.http.bean.RecommendBean import com.youth.banner.adapter.BannerAdapter class HomeBannerAdapter(mDatas: List) : @@ -30,6 +30,8 @@ class HomeBannerAdapter(mDatas: List) : ) { Glide.with(AppApplication.instance) .load(data.image_url) + .placeholder(R.mipmap.ic_loading_h) + .error(R.mipmap.ic_loading_h) .into(holder.imageView) holder.tvName.setText(data.name) diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeCategoriesTabAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeCategoriesTabAdapter.kt index 7dff21d..d24c909 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeCategoriesTabAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeCategoriesTabAdapter.kt @@ -6,9 +6,10 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.chad.library.adapter4.BaseQuickAdapter +import com.localee.mireo.shortapp.R import com.localee.mireo.app.app.AppApplication -import com.localee.mireo.app.databinding.ItemListTabBinding -import com.localee.mireo.app.http.api.RecommendBean +import com.localee.mireo.shortapp.databinding.ItemListTabBinding +import com.localee.mireo.app.http.bean.RecommendBean class HomeCategoriesTabAdapter : BaseQuickAdapter() { @@ -28,6 +29,8 @@ class HomeCategoriesTabAdapter : BaseQuickAdapter() { @@ -44,8 +45,17 @@ class HomeCriticallyAdapter : } Glide.with(AppApplication.instance) .load(item.image_url) + .placeholder(R.mipmap.ic_loading_v) + .error(R.mipmap.ic_loading_v) .into(holder.binding.ivContent) + if (position < 6) { + holder.binding.tvScore.visibility = View.VISIBLE + holder.binding.tvScore.text = (position + 1).toString() + } else { + holder.binding.tvScore.visibility = View.GONE + } + } } diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeGenresAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeGenresAdapter.kt index fda849c..7e4ebb5 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeGenresAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeGenresAdapter.kt @@ -6,7 +6,7 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.chad.library.adapter4.BaseQuickAdapter import com.hjq.shape.view.ShapeTextView -import com.localee.mireo.app.databinding.ItemHomeGenresBinding +import com.localee.mireo.shortapp.databinding.ItemHomeGenresBinding class HomeGenresAdapter(var id: Int) : BaseQuickAdapter() { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeShortAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeShortAdapter.kt index 70abf67..6eba508 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeShortAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeShortAdapter.kt @@ -6,9 +6,10 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.chad.library.adapter4.BaseQuickAdapter +import com.localee.mireo.shortapp.R import com.localee.mireo.app.app.AppApplication -import com.localee.mireo.app.databinding.ItemHomeShortBinding -import com.localee.mireo.app.http.api.RecommendBean +import com.localee.mireo.shortapp.databinding.ItemHomeShortBinding +import com.localee.mireo.app.http.bean.RecommendBean class HomeShortAdapter : BaseQuickAdapter() { @@ -29,6 +30,8 @@ class HomeShortAdapter : BaseQuickAdapter() holder.binding.tvDescription.text = item.description Glide.with(AppApplication.instance) .load(item.image_url) + .placeholder(R.mipmap.ic_loading_v) + .error(R.mipmap.ic_loading_v) .into(holder.binding.ivContent) } diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeTopAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeTopAdapter.kt index f800d1a..a75aab0 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeTopAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeTopAdapter.kt @@ -6,9 +6,9 @@ import com.bumptech.glide.Glide import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.viewholder.QuickViewHolder import com.hjq.shape.view.ShapeTextView -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R import com.localee.mireo.app.app.AppApplication -import com.localee.mireo.app.http.api.RecommendBean +import com.localee.mireo.app.http.bean.RecommendBean class HomeTopAdapter(var type: Int) : BaseQuickAdapter() { @@ -28,6 +28,8 @@ class HomeTopAdapter(var type: Int) : ) { Glide.with(AppApplication.instance) .load(item?.image_url) + .placeholder(R.mipmap.ic_loading_v) + .error(R.mipmap.ic_loading_v) .into(holder.getView(R.id.iv_content)) val text: ShapeTextView = holder.getView(R.id.tv_hot) diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/LanguageSwitchAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/LanguageSwitchAdapter.kt new file mode 100644 index 0000000..75118ad --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/LanguageSwitchAdapter.kt @@ -0,0 +1,38 @@ +package com.localee.mireo.app.ui.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.chad.library.adapter4.BaseQuickAdapter +import com.localee.mireo.shortapp.databinding.ItemLanguageSwitchBinding +import com.localee.mireo.app.http.api.LanguageApi + +class LanguageSwitchAdapter : + BaseQuickAdapter() { + var currentPosition = -1 + + class VH( + parent: ViewGroup, + val binding: ItemLanguageSwitchBinding = ItemLanguageSwitchBinding.inflate( + LayoutInflater.from(parent.context), parent, false + ), + ) : RecyclerView.ViewHolder(binding.root) + + override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH { + return VH(parent) + } + + override fun onBindViewHolder(holder: VH, position: Int, item: LanguageApi.Bean.Data?) { + if (null != item) { + holder.binding.tvName.text = item.show_name + holder.binding.tvDescription.text = item.description + if (currentPosition == position) { + holder.binding.cbSelectCheck.isChecked = true + } else { + holder.binding.cbSelectCheck.isChecked = false + } + } + + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/LostTabAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/LostTabAdapter.kt index 7524e70..3147414 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/LostTabAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/LostTabAdapter.kt @@ -8,8 +8,9 @@ import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.chad.library.adapter4.BaseQuickAdapter import com.localee.mireo.app.app.AppApplication -import com.localee.mireo.app.databinding.ItemListTabBinding -import com.localee.mireo.app.http.api.HistoryBean +import com.localee.mireo.app.http.bean.HistoryBean +import com.localee.mireo.shortapp.R +import com.localee.mireo.shortapp.databinding.ItemListTabBinding class LostTabAdapter(var tabPosition: Int) : BaseQuickAdapter() { @@ -33,10 +34,14 @@ class LostTabAdapter(var tabPosition: Int) : holder.binding.tvName.text = item.name Glide.with(AppApplication.instance) .load(item.image_url) + .placeholder(R.mipmap.ic_loading_v) + .error(R.mipmap.ic_loading_v) .into(holder.binding.ivContent) holder.binding.tvName2.text = item.name Glide.with(AppApplication.instance) .load(item.image_url) + .placeholder(R.mipmap.ic_loading_v) + .error(R.mipmap.ic_loading_v) .into(holder.binding.ivContent2) if (type == 0) { @@ -66,11 +71,11 @@ class LostTabAdapter(var tabPosition: Int) : when (tabPosition) { 0 -> { - if (item.categoryList?.isNotEmpty() == true) { - holder.binding.tvFavor.text = item.categoryList.get(0).name + if (item.category != null && !item.category.isEmpty()) { + holder.binding.tvFavor.text = item.category.get(0) holder.binding.tvFavor.visibility = View.VISIBLE - if (item.categoryList.size > 1) { - holder.binding.tvLove.text = item.categoryList.get(1).name + if (item.category.size > 1) { + holder.binding.tvLove.text = item.category.get(1) holder.binding.tvLove.visibility = View.VISIBLE } else { holder.binding.tvLove.visibility = View.GONE @@ -82,7 +87,7 @@ class LostTabAdapter(var tabPosition: Int) : 1 -> { holder.binding.tvFavor.text = - "EP" + item.current_episode + " / EP" + item.episode_total + "EP." + item.current_episode + " / EP." + item.episode_total holder.binding.tvFavor.visibility = View.VISIBLE holder.binding.tvLove.visibility = View.GONE } diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/MeHistoryAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/MeHistoryAdapter.kt index de6a8dc..31ed903 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/MeHistoryAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/MeHistoryAdapter.kt @@ -6,9 +6,10 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.chad.library.adapter4.BaseQuickAdapter +import com.localee.mireo.shortapp.R import com.localee.mireo.app.app.AppApplication -import com.localee.mireo.app.databinding.ItemMeHistoryBinding -import com.localee.mireo.app.http.api.HistoryBean +import com.localee.mireo.shortapp.databinding.ItemMeHistoryBinding +import com.localee.mireo.app.http.bean.HistoryBean class MeHistoryAdapter() : BaseQuickAdapter() { @@ -31,6 +32,8 @@ class MeHistoryAdapter() : if (null != item) { Glide.with(AppApplication.instance) .load(item.image_url) + .placeholder(R.mipmap.ic_loading_v) + .error(R.mipmap.ic_loading_v) .into(holder.binding.ivContent) } diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/MyCoinBuyAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/MyCoinBuyAdapter.kt new file mode 100644 index 0000000..d406d6d --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/MyCoinBuyAdapter.kt @@ -0,0 +1,76 @@ +package com.localee.mireo.app.ui.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.chad.library.adapter4.BaseQuickAdapter +import com.localee.mireo.shortapp.databinding.ItemCoinBuyBinding +import com.localee.mireo.app.http.bean.PaySettingsBean +import kotlin.math.floor + +class MyCoinBuyAdapter : BaseQuickAdapter() { + + var currentPosition = -1 + + class VH( + parent: ViewGroup, + val binding: ItemCoinBuyBinding = ItemCoinBuyBinding.inflate( + LayoutInflater.from(parent.context), parent, false + ), + ) : RecyclerView.ViewHolder(binding.root) + + override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH { + return VH(parent) + } + + override fun onBindViewHolder(holder: VH, position: Int, item: PaySettingsBean.Coins?) { + if (null != item) { + holder.binding.tvCoins.text = "+" + item.coins.toString() + holder.binding.tvPrice.text = item.price_google + if (item.corner_marker.isNotEmpty()) { + holder.binding.tvHot.text = item.corner_marker + holder.binding.tvHot.visibility = View.VISIBLE + } else { + holder.binding.tvHot.visibility = View.INVISIBLE + } + if (currentPosition == position) { + holder.binding.tvPrice.shapeDrawableBuilder?.setSolidGradientColors( + 0xFFF8726D.toInt(), + 0xFFF24C92.toInt() + ) + ?.intoBackground() + + holder.binding.root.shapeDrawableBuilder?.setSolidColor(0xFF3E4155.toInt()) + ?.setStrokeSize(1) + ?.intoBackground() + } else { + holder.binding.tvPrice.shapeDrawableBuilder?.setSolidGradientColors( + 0xFF353739.toInt(), + 0xFF353739.toInt() + ) + ?.intoBackground() + + holder.binding.root.shapeDrawableBuilder?.setSolidColor(0xFF1A191C.toInt()) + ?.setStrokeSize(0) + ?.intoBackground() + } + val sendCoins = item?.send_coins?.toDouble() + if (sendCoins != null) { + if (sendCoins > 0) { + val coins = item?.coins?.toDouble() + val let = coins?.let { sendCoins?.div(it) } + val times = let?.times(100) + if (times != null) { + val floor = floor(times).toInt() + holder.binding.tvCorner.text = "+".plus(floor).plus("%") + holder.binding.tvCorner.visibility = View.VISIBLE + } + } else { + holder.binding.tvCorner.visibility = View.INVISIBLE + } + } + } + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/MyVipBuyAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/MyVipBuyAdapter.kt new file mode 100644 index 0000000..f649890 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/MyVipBuyAdapter.kt @@ -0,0 +1,69 @@ +package com.localee.mireo.app.ui.adapter + +import android.content.Context +import android.graphics.Color +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.chad.library.adapter4.BaseQuickAdapter +import com.localee.mireo.app.http.bean.PaySettingsBean +import com.localee.mireo.shortapp.R +import com.localee.mireo.shortapp.databinding.ItemVipBuyBinding + +class MyVipBuyAdapter : BaseQuickAdapter() { + + var currentPosition = -1 + + class VH( + parent: ViewGroup, + val binding: ItemVipBuyBinding = ItemVipBuyBinding.inflate( + LayoutInflater.from(parent.context), parent, false + ), + ) : RecyclerView.ViewHolder(binding.root) + + override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH { + return VH(parent) + } + + override fun onBindViewHolder(holder: VH, position: Int, item: PaySettingsBean.Vip?) { + if (null != item) { + holder.binding.tvDay.text = item.brief + holder.binding.tvMoney.text = item.price_google + + when (item.vip_type_key) { + "week" -> { + holder.binding.llContent.setBackgroundResource(R.mipmap.ic_vip_week_bg) + holder.binding.tvDay.setTextColor(Color.parseColor("#71412B")) + holder.binding.tvMoney.setTextColor(Color.parseColor("#71412B")) + + } + + "month" -> { + holder.binding.llContent.setBackgroundResource(R.mipmap.ic_vip_month_bg) + holder.binding.tvDay.setTextColor(Color.parseColor("#7E0026")) + holder.binding.tvMoney.setTextColor(Color.parseColor("#7E0026")) + } + + "quarter" -> { + holder.binding.llContent.setBackgroundResource(R.mipmap.ic_vip_quarter_bg) + holder.binding.tvDay.setTextColor(Color.parseColor("#0E008A")) + holder.binding.tvMoney.setTextColor(Color.parseColor("#0E008A")) + } + + "year" -> { + holder.binding.llContent.setBackgroundResource(R.mipmap.ic_vip_year_bg) + holder.binding.tvDay.setTextColor(Color.parseColor("#00516A")) + holder.binding.tvMoney.setTextColor(Color.parseColor("#00516A")) + } + } + + if (currentPosition == position) { + holder.binding.flSelect.visibility = View.VISIBLE + } else { + holder.binding.flSelect.visibility = View.GONE + } + } + + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/NavigationAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/NavigationAdapter.kt index 8bc9f84..2068cdb 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/NavigationAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/NavigationAdapter.kt @@ -6,8 +6,8 @@ import android.view.* import android.widget.* import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.hjq.base.BaseAdapter -import com.localee.mireo.app.R +import com.localee.mireo.app.base.BaseAdapter +import com.localee.mireo.shortapp.R import com.localee.mireo.app.app.AppAdapter class NavigationAdapter constructor(context: Context) : diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/RecommendBannerAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/RecommendBannerAdapter.kt new file mode 100644 index 0000000..bb115d6 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/RecommendBannerAdapter.kt @@ -0,0 +1,54 @@ +package com.localee.mireo.app.ui.adapter + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.widget.AppCompatImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.localee.mireo.shortapp.R +import com.localee.mireo.app.http.api.DetailsRecommandApi +import com.youth.banner.adapter.BannerAdapter + +class RecommendBannerAdapter (items: List?) : + BannerAdapter(items) { + var currentPlayingPosition = 0 + + override fun onCreateHolder(parent: ViewGroup, viewType: Int): BannerViewHolder { + val view: View = LayoutInflater.from(parent.context) + .inflate(R.layout.item_hot_banner_view, parent, false) + view.layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + return BannerViewHolder(view) + } + + + override fun onBindView( + holder: BannerViewHolder?, + data: DetailsRecommandApi.Bean.Item?, + position: Int, + size: Int + ) { + val imageView = + holder?.view?.findViewById(R.id.ic_icon_banner) + if (imageView != null) { + Glide.with(holder.view.context!!) + .load(data?.image_url) + .placeholder(R.mipmap.ic_loading_v) + .into(imageView) + } + if (position == currentPlayingPosition) { + holder?.itemView?.visibility = View.INVISIBLE + } else { + holder?.itemView?.visibility = View.VISIBLE + } + + } + + inner class BannerViewHolder(var view: View) : RecyclerView.ViewHolder( + view + ) + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/SearchGridAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/SearchGridAdapter.kt new file mode 100644 index 0000000..13a5d56 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/SearchGridAdapter.kt @@ -0,0 +1,40 @@ +package com.localee.mireo.app.ui.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.chad.library.adapter4.BaseQuickAdapter +import com.localee.mireo.app.app.AppApplication +import com.localee.mireo.app.http.api.SearchSearchApi +import com.localee.mireo.shortapp.R +import com.localee.mireo.shortapp.databinding.ItemMeHistoryBinding +import com.localee.mireo.shortapp.databinding.ItemSearchGirlBinding + +class SearchGridAdapter() : + BaseQuickAdapter() { + + class VH( + parent: ViewGroup, + val binding: ItemSearchGirlBinding = ItemSearchGirlBinding.inflate( + LayoutInflater.from(parent.context), parent, false + ), + ) : RecyclerView.ViewHolder(binding.root) + + override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH { + return VH(parent) + } + + override fun onBindViewHolder(holder: VH, position: Int, item: SearchSearchApi.Bean.Data?) { + if (null != item) { + Glide.with(AppApplication.instance) + .load(item.image_url) + .placeholder(R.mipmap.ic_loading_v) + .error(R.mipmap.ic_loading_v) + .into(holder.binding.ivContent) + holder.binding.tvName.text = item.name + } + + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/SearchHotAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/SearchHotAdapter.kt index a4fcb7f..c8f4316 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/SearchHotAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/SearchHotAdapter.kt @@ -8,8 +8,9 @@ import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.chad.library.adapter4.BaseQuickAdapter import com.localee.mireo.app.app.AppApplication -import com.localee.mireo.app.databinding.ItemSearchHotBinding import com.localee.mireo.app.http.api.SearchHotApi +import com.localee.mireo.shortapp.R +import com.localee.mireo.shortapp.databinding.ItemSearchHotBinding class SearchHotAdapter : BaseQuickAdapter() { @@ -31,6 +32,8 @@ class SearchHotAdapter : BaseQuickAdapter() { + var keyword = "" class VH( parent: ViewGroup, @@ -23,9 +28,37 @@ class SearchSearchAdapter : BaseQuickAdapter() { + + class VH( + parent: ViewGroup, + val binding: ItemWalletRecordBinding = ItemWalletRecordBinding.inflate( + LayoutInflater.from(parent.context), parent, false + ), + ) : RecyclerView.ViewHolder(binding.root) + + override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH { + return VH(parent) + } + + override fun onBindViewHolder( + holder: VH, + position: Int, + item: SendCoinListApi.Bean.Data? + ) { + if (null != item) { + holder.binding.tvName.text = item.type + holder.binding.tvTime.text = item.created_at + holder.binding.tvConins.text = "+" + item.coins + holder.binding.ivConins.visibility = View.VISIBLE + if (!"Expired".equals(item.diff_datetime)) { + holder.binding.tvBalance.text = "Expires in: " + item.diff_datetime + } + } + + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/TabAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/TabAdapter.kt index af05b81..3388dfc 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/TabAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/TabAdapter.kt @@ -11,9 +11,9 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver -import com.hjq.base.BaseAdapter +import com.localee.mireo.app.base.BaseAdapter import com.hjq.shape.view.ShapeTextView -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R import com.localee.mireo.app.app.AppAdapter class TabAdapter @JvmOverloads constructor( diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/CommonDialog.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/CommonDialog.kt index 384f128..91c12a5 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/CommonDialog.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/CommonDialog.kt @@ -5,9 +5,9 @@ import android.view.* import android.widget.TextView import androidx.annotation.LayoutRes import androidx.annotation.StringRes -import com.hjq.base.BaseDialog -import com.hjq.base.action.AnimAction -import com.localee.mireo.app.R +import com.localee.mireo.app.base.BaseDialog +import com.localee.mireo.app.base.action.AnimAction +import com.localee.mireo.shortapp.R class CommonDialog { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/GooglePlayRatingDialog.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/GooglePlayRatingDialog.kt new file mode 100644 index 0000000..ead98bc --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/GooglePlayRatingDialog.kt @@ -0,0 +1,31 @@ +package com.localee.mireo.app.ui.dialog + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.view.Gravity +import android.view.Window +import android.view.WindowManager +import com.localee.mireo.shortapp.R + +class GooglePlayRatingDialog(context: Context) : Dialog(context) { + + init { + init() + } + + private fun init() { + requestWindowFeature(Window.FEATURE_NO_TITLE) + setContentView(R.layout.dialog_google_play_rating) + + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.setLayout( + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.WRAP_CONTENT + ) + window?.setGravity(Gravity.CENTER) + setCancelable(true) + } + +} diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/InputDialog.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/InputDialog.kt index d798477..bb3e1d1 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/InputDialog.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/InputDialog.kt @@ -7,10 +7,10 @@ import android.view.inputmethod.EditorInfo import android.widget.TextView import android.widget.TextView.OnEditorActionListener import androidx.annotation.StringRes -import com.hjq.base.BaseDialog -import com.localee.mireo.app.R -import com.localee.mireo.app.aop.SingleClick -import com.hjq.widget.view.RegexEditText +import com.localee.mireo.app.base.BaseDialog +import com.localee.mireo.shortapp.R +import com.localee.mireo.app.widget.view.RegexEditText +import com.localee.mireo.app.utils.singleClick class InputDialog { @@ -65,17 +65,19 @@ class InputDialog { postDelayed({ showKeyboard(inputView) }, 500) } - @SingleClick override fun onClick(view: View) { - when (view.id) { - R.id.tv_ui_confirm -> { - autoDismiss() - listener?.onConfirm(getDialog(), inputView?.text?.toString() ?: "") - } - R.id.tv_ui_cancel -> { - autoDismiss() - listener?.onCancel(getDialog()) + singleClick { + when (view.id) { + R.id.tv_ui_confirm -> { + autoDismiss() + listener?.onConfirm(getDialog(), inputView?.text?.toString() ?: "") + } + R.id.tv_ui_cancel -> { + autoDismiss() + listener?.onCancel(getDialog()) + } } + } } diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/MessageDialog.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/MessageDialog.kt index 58d1ac4..6c5daac 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/MessageDialog.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/MessageDialog.kt @@ -4,9 +4,9 @@ import android.content.Context import android.view.View import android.widget.TextView import androidx.annotation.StringRes -import com.hjq.base.BaseDialog -import com.localee.mireo.app.R -import com.localee.mireo.app.aop.SingleClick +import com.localee.mireo.app.base.BaseDialog +import com.localee.mireo.shortapp.R +import com.localee.mireo.app.utils.singleClick class MessageDialog { @@ -39,17 +39,19 @@ class MessageDialog { return super.create() } - @SingleClick override fun onClick(view: View) { - when (view.id) { - R.id.tv_ui_confirm -> { - autoDismiss() - listener?.onConfirm(getDialog()) - } - R.id.tv_ui_cancel -> { - autoDismiss() - listener?.onCancel(getDialog()) + singleClick { + when (view.id) { + R.id.tv_ui_confirm -> { + autoDismiss() + listener?.onConfirm(getDialog()) + } + R.id.tv_ui_cancel -> { + autoDismiss() + listener?.onCancel(getDialog()) + } } + } } } diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/NotificationPermissionDialog.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/NotificationPermissionDialog.kt new file mode 100644 index 0000000..4be956d --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/NotificationPermissionDialog.kt @@ -0,0 +1,31 @@ +package com.localee.mireo.app.ui.dialog + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.view.Gravity +import android.view.Window +import android.view.WindowManager +import com.localee.mireo.shortapp.R + +class NotificationPermissionDialog (context: Context) : Dialog(context) { + + init { + init() + } + + private fun init() { + requestWindowFeature(Window.FEATURE_NO_TITLE) + setContentView(R.layout.dialog_notification_permission) + + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.setLayout( + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.WRAP_CONTENT + ) + window?.setGravity(Gravity.CENTER) + setCancelable(false) + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/TipsDialog.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/TipsDialog.kt index d23640f..2ab678e 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/TipsDialog.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/TipsDialog.kt @@ -6,16 +6,17 @@ import android.widget.ImageView import android.widget.TextView import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import com.hjq.base.BaseDialog -import com.hjq.base.action.AnimAction -import com.localee.mireo.app.R +import com.localee.mireo.app.base.BaseDialog +import com.localee.mireo.app.base.action.AnimAction +import com.localee.mireo.shortapp.R class TipsDialog { companion object { - const val ICON_FINISH: Int = R.drawable.tips_finish_ic - const val ICON_ERROR: Int = R.drawable.tips_error_ic - const val ICON_WARNING: Int = R.drawable.tips_warning_ic +// const val ICON_FINISH: Int = R.drawable.tips_finish_ic +// const val ICON_ERROR: Int = R.drawable.tips_error_ic +// const val ICON_WARNING: Int = R.drawable.tips_warning_ic + const val ICON_WARNING: Int = 0 } class Builder(context: Context) : BaseDialog.Builder(context), diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/WaitDialog.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/WaitDialog.kt index 7d8069d..fc63eb4 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/WaitDialog.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/WaitDialog.kt @@ -1,24 +1,32 @@ package com.localee.mireo.app.ui.dialog -import android.content.* -import android.view.* -import android.widget.TextView +import android.content.Context +import android.widget.ImageView import androidx.annotation.StringRes -import com.hjq.base.BaseDialog -import com.hjq.base.action.AnimAction -import com.localee.mireo.app.R +import com.bumptech.glide.Glide +import com.localee.mireo.app.base.BaseDialog +import com.localee.mireo.app.base.action.AnimAction +import com.localee.mireo.shortapp.R class WaitDialog { class Builder(context: Context) : BaseDialog.Builder(context) { - private val messageView: TextView? by lazy { findViewById(R.id.tv_wait_message) } + private val ivLoading: ImageView? by lazy { findViewById(R.id.iv_loading) } init { setContentView(R.layout.wait_dialog) setAnimStyle(AnimAction.ANIM_TOAST) setBackgroundDimEnabled(false) setCancelable(false) + + ivLoading?.let { + Glide.with(context) + .asGif() + .load(R.mipmap.iv_loading) + .into(it) + } + } fun setMessage(@StringRes id: Int): Builder = apply { @@ -26,8 +34,8 @@ class WaitDialog { } fun setMessage(text: CharSequence?): Builder = apply { - messageView?.text = text - messageView?.visibility = if (text == null) View.GONE else View.VISIBLE +// messageView?.text = text +// messageView?.visibility = if (text == null) View.GONE else View.VISIBLE } } } \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/BrowserFragment.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/BrowserFragment.kt index a2ed487..c58e893 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/BrowserFragment.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/BrowserFragment.kt @@ -4,10 +4,8 @@ import android.graphics.Bitmap import android.net.Uri import android.os.Bundle import android.webkit.WebView -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R import com.localee.mireo.app.action.StatusAction -import com.localee.mireo.app.aop.CheckNet -import com.localee.mireo.app.aop.Log import com.localee.mireo.app.app.AppActivity import com.localee.mireo.app.app.AppFragment import com.localee.mireo.app.ui.activity.BrowserActivity @@ -19,7 +17,7 @@ import com.localee.mireo.app.widget.StatusLayout.OnRetryListener import com.scwang.smart.refresh.layout.SmartRefreshLayout import com.scwang.smart.refresh.layout.api.RefreshLayout import com.scwang.smart.refresh.layout.listener.OnRefreshListener -import java.util.* +import java.util.Locale class BrowserFragment : AppFragment(), StatusAction, OnRefreshListener { @@ -27,7 +25,6 @@ class BrowserFragment : AppFragment(), StatusAction, OnRefreshListe private const val INTENT_KEY_IN_URL: String = "url" - @Log fun newInstance(url: String): BrowserFragment { val fragment = BrowserFragment() val bundle = Bundle() @@ -63,7 +60,6 @@ class BrowserFragment : AppFragment(), StatusAction, OnRefreshListe return hintLayout!! } - @CheckNet private fun reload() { browserView?.reload() } @@ -76,7 +72,12 @@ class BrowserFragment : AppFragment(), StatusAction, OnRefreshListe } private inner class AppBrowserViewClient : BrowserViewClient() { - override fun onReceivedError(view: WebView, errorCode: Int, description: String, failingUrl: String) { + override fun onReceivedError( + view: WebView, + errorCode: Int, + description: String, + failingUrl: String + ) { post { showError(object : OnRetryListener { override fun onRetry(layout: StatusLayout) { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/ExploreFragment.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/ExploreFragment.kt index fb2db90..65c41ec 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/ExploreFragment.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/ExploreFragment.kt @@ -10,27 +10,28 @@ import androidx.appcompat.widget.AppCompatTextView import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import com.blankj.utilcode.util.NetworkUtils -import com.localee.mireo.app.utils.MsMMKVUtils -import com.localee.mireo.app.R +import com.hjq.http.EasyHttp +import com.hjq.http.config.IRequestApi +import com.hjq.http.listener.HttpCallbackProxy +import com.hjq.toast.ToastUtils +import com.localee.mireo.shortapp.R import com.localee.mireo.app.app.BaseEventBus import com.localee.mireo.app.app.TitleBarFragment import com.localee.mireo.app.http.api.ExampleRecommendDataRes import com.localee.mireo.app.http.api.HomeRecommendApi +import com.localee.mireo.app.http.api.VideoDetailsApi import com.localee.mireo.app.http.model.HttpData import com.localee.mireo.app.other.MsConstants import com.localee.mireo.app.other.MsConstants.CONSTANTS_quality_refresh import com.localee.mireo.app.ui.activity.HomeActivity -import com.localee.mireo.app.ui.videoPaly.ExamplePlayerDetailDataRes import com.localee.mireo.app.ui.videoPaly.ExampleRecommendAdapter import com.localee.mireo.app.ui.videoPaly.ExampleRecommendPlayerView import com.localee.mireo.app.ui.videoPaly.ExampleUnFavoriteDialog import com.localee.mireo.app.utils.DHStringUtils.getPublicRequest +import com.localee.mireo.app.utils.MsMMKVUtils import com.localee.mireo.app.utils.TranslatesUtils import com.localee.mireo.app.utils.formatNumber import com.localee.mireo.app.utils.singleClick -import com.hjq.http.EasyHttp -import com.hjq.http.listener.HttpCallbackProxy -import com.hjq.toast.ToastUtils import com.scwang.smart.refresh.layout.SmartRefreshLayout import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe @@ -84,10 +85,10 @@ class ExploreFragment : TitleBarFragment(), ) activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - exampleTvNoNetwork?.text = - TranslatesUtils.translates()?.no_network - tvExampleRetry?.text = TranslatesUtils.translates()?.retry - exampleTvEmpty?.text = TranslatesUtils.translates()?.s_no_content +// exampleTvNoNetwork?.text = +// TranslatesUtils.translates()?.no_network +// tvExampleRetry?.text = TranslatesUtils.translates()?.retry +// exampleTvEmpty?.text = TranslatesUtils.translates()?.s_no_content } override fun initData() { @@ -97,7 +98,6 @@ class ExploreFragment : TitleBarFragment(), fun initialization() { if (NetworkUtils.isConnected()) { -// avi?.start() getRecommands(currentPage, currentSize, revolution) } else { if (TranslatesUtils.translates() != null) { @@ -109,7 +109,6 @@ class ExploreFragment : TitleBarFragment(), } srRecommend?.setOnRefreshListener { if (NetworkUtils.isConnected()) { -// avi?.start() currentPage = 1 viewPagerExampleRecommend?.post { recommendPlayerView()?.stop() @@ -125,6 +124,7 @@ class ExploreFragment : TitleBarFragment(), } else { ToastUtils.show(getString(R.string.example_no_network)) } + srRecommend?.finishRefresh() } } viewPagerExampleRecommend?.registerOnPageChangeCallback(object : @@ -312,12 +312,14 @@ class ExploreFragment : TitleBarFragment(), srRecommend?.finishRefresh() } } + + override fun onHttpEnd(api: IRequestApi) { + super.onHttpEnd(api) + srRecommend?.finishRefresh() + } }) -// ExampleRecommendRequest.getRecommands(current_page, page_size, revolution) -// .observeForever { result -> -// recommendLiveData.value = result.getOrNull() -// } + } fun doCollect(videoId: Int, shortPlayId: Int) { @@ -437,7 +439,7 @@ class ExploreFragment : TitleBarFragment(), } @Subscribe(threadMode = ThreadMode.MAIN) - fun onEvent(event: BaseEventBus) { + fun onEvent(event: BaseEventBus) { if (MsConstants.Constants_Episodes_Series_DataExample == event.code) { if (exampleRecommendAdapter?.items?.get(currentPosition)?.name == event.data.name) { val imageView = @@ -450,7 +452,11 @@ class ExploreFragment : TitleBarFragment(), exampleRecommendAdapter?.items?.get(currentPosition)?.is_collect = event.data.is_collect textview?.text = formatNumber(event.data.collect_total) - textview?.setTextColor(if (event.data.is_collect) resources.getColor(R.color.example_color_F56490) else resources.getColor(R.color.white)) + textview?.setTextColor( + if (event.data.is_collect) resources.getColor(R.color.example_color_F56490) else resources.getColor( + R.color.white + ) + ) } } } diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/HomeCategoriesTabFragment.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/HomeCategoriesTabFragment.kt index 5994961..9d26bf5 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/HomeCategoriesTabFragment.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/HomeCategoriesTabFragment.kt @@ -10,11 +10,11 @@ import androidx.recyclerview.widget.RecyclerView import com.hjq.http.EasyHttp import com.hjq.http.config.IRequestApi import com.hjq.http.listener.HttpCallbackProxy -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R import com.localee.mireo.app.action.StatusAction import com.localee.mireo.app.app.TitleBarFragment import com.localee.mireo.app.http.api.HomeVideoListApi -import com.localee.mireo.app.http.api.RecommendBean +import com.localee.mireo.app.http.bean.RecommendBean import com.localee.mireo.app.http.model.HttpData import com.localee.mireo.app.other.MsConstants.CONSTANTS_short_play_id import com.localee.mireo.app.ui.activity.HomeActivity diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/HomeFragment.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/HomeFragment.kt index 64390c2..0aa6d69 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/HomeFragment.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/HomeFragment.kt @@ -2,7 +2,6 @@ package com.localee.mireo.app.ui.fragment import android.content.Intent import android.graphics.Rect -import android.view.Display import android.view.View import android.view.ViewGroup import android.widget.ImageView @@ -14,22 +13,22 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager.widget.ViewPager -import com.hjq.base.FragmentPagerAdapter import com.hjq.http.EasyHttp import com.hjq.http.config.IRequestApi import com.hjq.http.listener.HttpCallbackProxy import com.hjq.toast.ToastUtils -import com.localee.mireo.app.R +import com.localee.mireo.app.action.StatusAction import com.localee.mireo.app.app.AppFragment import com.localee.mireo.app.app.TitleBarFragment -import com.localee.mireo.app.http.api.CustomerRegisterApi +import com.localee.mireo.app.base.FragmentPagerAdapter import com.localee.mireo.app.http.api.HomeCategoriesApi import com.localee.mireo.app.http.api.HomeDayMaxRechargeShortPlayRankApi import com.localee.mireo.app.http.api.HomeModuleApi -import com.localee.mireo.app.http.api.RecommendBean import com.localee.mireo.app.http.api.UserInfoApi import com.localee.mireo.app.http.api.UserInfoRes +import com.localee.mireo.app.http.bean.RecommendBean import com.localee.mireo.app.http.model.HttpData +import com.localee.mireo.app.other.MsConstants import com.localee.mireo.app.other.MsConstants.CONSTANTS_short_play_id import com.localee.mireo.app.ui.activity.HomeActivity import com.localee.mireo.app.ui.activity.SearchActivity @@ -44,13 +43,25 @@ import com.localee.mireo.app.ui.adapter.TabAdapter.Companion.TAB_MODE_SLIDING import com.localee.mireo.app.utils.DHStringUtils.getPublicRequest import com.localee.mireo.app.utils.MsMMKVUtils import com.localee.mireo.app.utils.TranslatesUtils +import com.localee.mireo.app.utils.singleClick +import com.localee.mireo.app.widget.StatusLayout +import com.localee.mireo.app.widget.StatusLayout.OnRetryListener +import com.localee.mireo.shortapp.R +import com.scwang.smart.refresh.layout.SmartRefreshLayout +import com.scwang.smart.refresh.layout.api.RefreshLayout +import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener import com.youth.banner.Banner import com.youth.banner.listener.OnBannerListener +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode class HomeFragment : TitleBarFragment(), HomeBannerAdapter.HomeBannerOnClick, TabAdapter.OnTabListener, - ViewPager.OnPageChangeListener { + ViewPager.OnPageChangeListener, + OnRefreshLoadMoreListener, + StatusAction { companion object { @@ -65,7 +76,8 @@ class HomeFragment : TitleBarFragment(), HomeBannerAdapter.HomeBan R.id.banner ) } - + private val hintLayout: StatusLayout? by lazy { findViewById(R.id.hl_status_hint) } + private val rlStatusRefresh: SmartRefreshLayout? by lazy { findViewById(R.id.rl_status_refresh) } private val layoutTop: ViewGroup? by lazy { findViewById(R.id.layout_top) } private val tvTopOne: TextView? by lazy { layoutTop?.findViewById(R.id.tv_name) } private val ivTop: ImageView? by lazy { layoutTop?.findViewById(R.id.iv_img) } @@ -108,6 +120,7 @@ class HomeFragment : TitleBarFragment(), HomeBannerAdapter.HomeBan } override fun initView() { + EventBus.getDefault().register(this) recyclerOne?.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) recyclerNew?.layoutManager = @@ -174,10 +187,21 @@ class HomeFragment : TitleBarFragment(), HomeBannerAdapter.HomeBan viewPager?.adapter = pagerAdapter viewPager?.addOnPageChangeListener(this@HomeFragment) + rlStatusRefresh?.setOnRefreshLoadMoreListener(this) + rlStatusRefresh?.setEnableRefresh(true) + rlStatusRefresh?.setEnableLoadMore(false) + + } + + fun loadingData() { + getCustomerUser() + getHomeModuleData() + getDayMaxRechargeShortPlayRank(); + } override fun initData() { - getCustomerRegister() + loadingData() topAdapter?.setOnItemClickListener { adapter, view, position -> val data: RecommendBean = adapter.items.get(position) @@ -234,22 +258,6 @@ class HomeFragment : TitleBarFragment(), HomeBannerAdapter.HomeBan return !super.isStatusBarEnabled() } - fun getCustomerRegister() { - EasyHttp.post(this) - .api(CustomerRegisterApi().apply { - }) - .request(object : HttpCallbackProxy>(this) { - override fun onHttpSuccess(result: HttpData) { - result.getData()?.token?.let { - MsMMKVUtils.saveToken(it) - getCustomerUser() - getHomeModuleData() -// getCategories() - getDayMaxRechargeShortPlayRank(); - } - } - }) - } fun getHomeModuleData() { EasyHttp.get(this) @@ -258,45 +266,68 @@ class HomeFragment : TitleBarFragment(), HomeBannerAdapter.HomeBan .request(object : HttpCallbackProxy>(this) { override fun onHttpSuccess(result: HttpData) { result.getData()?.let { - bannerAdapter = it.bannerData?.let { it1 -> HomeBannerAdapter(it1) } - bannerAdapter?.homeBannerOnClick = - this@HomeFragment - banner?.addBannerLifecycleObserver(getAttachActivity()) - ?.setAdapter(bannerAdapter) - ?.setOnBannerListener(OnBannerListener { data, position -> - val recommendBean: RecommendBean = it.bannerData!![position] - startActivity( - Intent( - context, - VideoPlayActivity::class.java - ).apply { - putExtra( - CONSTANTS_short_play_id, - recommendBean.short_play_id - ) - }) - }) - if (it.hotData == null) { + nestedScrollView?.visibility = View.VISIBLE + showComplete() + if (it.bannerData == null || it.bannerData!!.isEmpty()) { + banner?.visibility = View.GONE + } else { + banner?.visibility = View.VISIBLE + bannerAdapter = it.bannerData?.let { it1 -> HomeBannerAdapter(it1) } + bannerAdapter?.homeBannerOnClick = + this@HomeFragment + banner?.addBannerLifecycleObserver(getAttachActivity()) + ?.setAdapter(bannerAdapter) + ?.setOnBannerListener(OnBannerListener { data, position -> + val recommendBean: RecommendBean = it.bannerData!![position] + startActivity( + Intent( + context, + VideoPlayActivity::class.java + ).apply { + putExtra( + CONSTANTS_short_play_id, + recommendBean.short_play_id + ) + }) + }) + } + if (it.hotData == null || it.hotData!!.isEmpty()) { layoutTop?.visibility = View.GONE } else { layoutTop?.visibility = View.VISIBLE topAdapter?.submitList(it.hotData) } - if (it.manualNewestRecommand == null) { + if (it.manualNewestRecommand == null || it.manualNewestRecommand?.list == null || it.manualNewestRecommand!!.list!!.isEmpty()) { layoutNew?.visibility = View.GONE } else { layoutNew?.visibility = View.VISIBLE newAdapter?.submitList(it.manualNewestRecommand?.list) } - if (it.recommandData == null || it.recommandData?.list == null) { + if (it.nineSquare == null || it.nineSquare?.list == null || it.nineSquare!!.list!!.isEmpty()) { layoutShort?.visibility = View.GONE } else { layoutShort?.visibility = View.VISIBLE - shortAdapter?.submitList(it.recommandData?.list) + shortAdapter?.submitList(it.nineSquare?.list) } -// criticallyAdapter?.submitList(it.newTopThree) + + } ?: run { + nestedScrollView?.visibility = View.GONE + showEmpty() } } + + override fun onHttpFail(throwable: Throwable) { + super.onHttpFail(throwable) + nestedScrollView?.visibility = View.GONE + showError(object : OnRetryListener { + override fun onRetry(layout: StatusLayout) { + singleClick { + loadingData() + } + } + + }) + } }) } @@ -304,8 +335,8 @@ class HomeFragment : TitleBarFragment(), HomeBannerAdapter.HomeBan fun getDayMaxRechargeShortPlayRank() { val sMap: MutableMap = LinkedHashMap() - // StringMap = getSortMap(StringMap); - sMap.put("type", "top_searched") + sMap.put("type", "most_trending") + // type:most_trending,top_searched,new_releases EasyHttp.post(this) .api(HomeDayMaxRechargeShortPlayRankApi().apply { }) @@ -357,6 +388,9 @@ class HomeFragment : TitleBarFragment(), HomeBannerAdapter.HomeBan .api(UserInfoApi().apply { }) .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + override fun onHttpSuccess(result: HttpData) { result.getData()?.let { @@ -395,7 +429,7 @@ class HomeFragment : TitleBarFragment(), HomeBannerAdapter.HomeBan override fun onHttpSuccess(result: HttpData) { result.getData()?.let { if (it != null) { - viewModel.triggerAction(2) + viewModel.triggerAction(3) viewModel.meToHistoryAction(0) } else { if (TranslatesUtils.translates() != null) { @@ -409,6 +443,13 @@ class HomeFragment : TitleBarFragment(), HomeBannerAdapter.HomeBan }) } + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(event: String) { + if (MsConstants.CONSTANTS_refresh_home == event) { + loadingData() + } + } + private val viewModel: SharedViewModel by activityViewModels() override fun onTabSelected(recyclerView: RecyclerView?, position: Int): Boolean { @@ -426,4 +467,16 @@ class HomeFragment : TitleBarFragment(), HomeBannerAdapter.HomeBan override fun onPageScrollStateChanged(state: Int) { } + override fun onRefresh(refreshLayout: RefreshLayout) { + loadingData() + rlStatusRefresh?.finishRefresh(2000) + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + } + + override fun getStatusLayout(): StatusLayout? { + return hintLayout + } + } \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/ListTabFragment.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/ListTabFragment.kt index 6ce58fa..d44cc8f 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/ListTabFragment.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/ListTabFragment.kt @@ -15,12 +15,12 @@ import com.hjq.http.EasyHttp import com.hjq.http.config.IRequestApi import com.hjq.http.listener.HttpCallbackProxy import com.hjq.shape.layout.ShapeLinearLayout -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R import com.localee.mireo.app.action.StatusAction import com.localee.mireo.app.app.TitleBarFragment -import com.localee.mireo.app.http.api.HistoryBean import com.localee.mireo.app.http.api.MyCollectionsApi import com.localee.mireo.app.http.api.MyHistoryApi +import com.localee.mireo.app.http.bean.HistoryBean import com.localee.mireo.app.http.model.HttpData import com.localee.mireo.app.other.MsConstants.CONSTANTS_activity_id import com.localee.mireo.app.other.MsConstants.CONSTANTS_short_play_id @@ -28,7 +28,10 @@ import com.localee.mireo.app.ui.activity.HomeActivity import com.localee.mireo.app.ui.activity.VideoPlayActivity import com.localee.mireo.app.ui.adapter.LostTabAdapter import com.localee.mireo.app.utils.DHStringUtils.getPublicRequest +import com.localee.mireo.app.utils.TranslatesUtils +import com.localee.mireo.app.utils.singleClick import com.localee.mireo.app.widget.StatusLayout +import com.localee.mireo.app.widget.StatusLayout.OnRetryListener import com.scwang.smart.refresh.layout.SmartRefreshLayout import com.scwang.smart.refresh.layout.api.RefreshLayout import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener @@ -182,6 +185,7 @@ class ListTabFragment : TitleBarFragment(), OnRefreshLoadMoreListe } fun setEdit() { + rlStatusRefresh?.setEnableRefresh(false) mAdapter?.selectEdit = !mAdapter?.selectEdit!! mAdapter?.notifyDataSetChanged() if (llDelete?.visibility == View.VISIBLE) @@ -192,18 +196,22 @@ class ListTabFragment : TitleBarFragment(), OnRefreshLoadMoreListe } fun setCancel() { + rlStatusRefresh?.setEnableRefresh(true) val allData: List? = mAdapter?.items for (i in allData?.indices!!) { allData[i].is_check = false } detailList.clear() - mAdapter?.selectEdit = !mAdapter?.selectEdit!! + mAdapter?.selectEdit = false mAdapter?.notifyDataSetChanged() - if (llDelete?.visibility == View.VISIBLE) - llDelete?.visibility = View.GONE - else - llDelete?.visibility = View.VISIBLE + llDelete?.visibility = View.GONE + llDelete?.shapeDrawableBuilder?.setStrokeColor(0xFF9D9D9D.toInt()) + ?.intoBackground(); + context?.resources?.getColor(R.color.example_color_d9d9d9) + ?.let { tvDelete?.setTextColor(it) } + tvDelete?.text = "Delete (0)" + ivDelete?.setImageResource(R.mipmap.ic_list_detele_n) } fun setAllSelect(isSelect: Boolean) { @@ -268,24 +276,38 @@ class ListTabFragment : TitleBarFragment(), OnRefreshLoadMoreListe .request(object : HttpCallbackProxy>(this) { override fun onHttpSuccess(result: HttpData) { result.getData()?.let { + recyclerView?.visibility = View.VISIBLE if (pageIndex == 1) { if (it.list.isEmpty()) { - hintLayout?.show() + showEmpty() } else { - hintLayout?.hide() + showComplete() } mAdapter?.submitList(it.list) - pageTotal = it.pagination.page_total + it.pagination?.let { it1 -> + pageTotal = it1.page_total + } } else { mAdapter?.addAll(it.list) } + } ?: run { + recyclerView?.visibility = View.GONE + showEmpty() } } override fun onHttpFail(throwable: Throwable) { super.onHttpFail(throwable) if (pageIndex == 1) { - hintLayout?.show() + recyclerView?.visibility = View.GONE + showError(object : OnRetryListener { + override fun onRetry(layout: StatusLayout) { + singleClick { + onRefreshData() + } + } + + }) } } @@ -309,17 +331,23 @@ class ListTabFragment : TitleBarFragment(), OnRefreshLoadMoreListe .request(object : HttpCallbackProxy>(this) { override fun onHttpSuccess(result: HttpData) { result.getData()?.let { + recyclerView?.visibility = View.VISIBLE if (pageIndex == 1) { if (it.list.isEmpty()) { - hintLayout?.show() + showEmpty() } else { - hintLayout?.hide() + showComplete() } mAdapter?.submitList(it.list) - pageTotal = it.pagination.page_total + it.pagination?.let { it1 -> + pageTotal = it1.page_total + } } else { mAdapter?.addAll(it.list) } + } ?: run { + recyclerView?.visibility = View.GONE + showEmpty() } } @@ -327,7 +355,15 @@ class ListTabFragment : TitleBarFragment(), OnRefreshLoadMoreListe override fun onHttpFail(throwable: Throwable) { super.onHttpFail(throwable) if (pageIndex == 1) { - hintLayout?.show() + recyclerView?.visibility = View.GONE + showError(object : OnRetryListener { + override fun onRetry(layout: StatusLayout) { + singleClick { + onRefreshData() + } + } + + }) } } @@ -353,9 +389,9 @@ class ListTabFragment : TitleBarFragment(), OnRefreshLoadMoreListe .body(getPublicRequest(sMap)) .request(object : HttpCallbackProxy>(this) { override fun onHttpSuccess(result: HttpData) { - result.getData()?.let { - viewModel.listTabAction(0) - } +// result.getData()?.let { +// viewModel.listTabAction(0) +// } } override fun onHttpEnd(api: IRequestApi) { @@ -363,10 +399,10 @@ class ListTabFragment : TitleBarFragment(), OnRefreshLoadMoreListe detailPosition++ if (detailPosition == detailList.size) { pageIndex = 1 - mAdapter?.selectEdit = false + detailPosition = 0 loadData() - llDelete?.visibility = View.GONE - detailList.clear() + viewModel.listTabAction(0) + setCancel() } } }) diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/MessageFragment.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/MessageFragment.kt index 4a08115..03b7e50 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/MessageFragment.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/MessageFragment.kt @@ -8,15 +8,15 @@ import androidx.appcompat.widget.AppCompatCheckBox import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.RecyclerView import androidx.viewpager.widget.ViewPager -import com.hjq.base.FragmentPagerAdapter -import com.lxj.xpopup.XPopup -import com.localee.mireo.app.R +import com.localee.mireo.app.base.FragmentPagerAdapter +import com.localee.mireo.shortapp.R import com.localee.mireo.app.app.AppFragment import com.localee.mireo.app.app.TitleBarFragment import com.localee.mireo.app.ui.activity.HomeActivity import com.localee.mireo.app.ui.adapter.TabAdapter import com.localee.mireo.app.ui.popup.CustomBubbleAttachPopup import com.localee.mireo.app.ui.popup.CustomBubbleAttachPopup.CustomPopupOnclick +import com.lxj.xpopup.XPopup class MessageFragment : TitleBarFragment(), TabAdapter.OnTabListener, @@ -53,11 +53,10 @@ class MessageFragment : TitleBarFragment(), TabAdapter.OnTabListen ivMore?.setOnClickListener { XPopup.Builder(context) - .hasShadowBg(false) - .isTouchThrough(true) + .isTouchThrough(false) .atView(ivMore) - .hasShadowBg(false) - .hasNavigationBar(false) + .hasShadowBg(true) + .hasNavigationBar(true) .asCustom(context?.let { it1 -> CustomBubbleAttachPopup( it1, @@ -115,10 +114,10 @@ class MessageFragment : TitleBarFragment(), TabAdapter.OnTabListen } flSelectCheck?.setOnClickListener { - if (cbSelectCheck?.isChecked == true){ + if (cbSelectCheck?.isChecked == true) { cbSelectCheck?.isChecked = false listTabOneFragment.setAllSelect(false) - }else{ + } else { cbSelectCheck?.isChecked = true listTabOneFragment.setAllSelect(true) } @@ -144,10 +143,11 @@ class MessageFragment : TitleBarFragment(), TabAdapter.OnTabListen viewModel.meToHistoryAction.observe(this) { data -> viewPager?.currentItem = data - when(data) { + when (data) { 0 -> { listTabOneFragment.onRefreshData() } + 1 -> { listTabTwoFragment.onRefreshData() } @@ -160,7 +160,6 @@ class MessageFragment : TitleBarFragment(), TabAdapter.OnTabListen } - val listTabOneFragment: ListTabFragment = ListTabFragment.newInstance(0) val listTabTwoFragment: ListTabFragment = ListTabFragment.newInstance(1) @@ -191,6 +190,18 @@ class MessageFragment : TitleBarFragment(), TabAdapter.OnTabListen } } + override fun onPause() { + super.onPause() + if (tabView?.visibility == View.VISIBLE){ + tvCancel?.visibility = View.GONE + ivMore?.visibility = View.VISIBLE + tabView?.visibility = View.VISIBLE + cbSelectCheck?.isChecked = false + flSelectCheck?.visibility = View.GONE + listTabOneFragment.setCancel() + } + } + override fun initData() {} diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/MineFragment.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/MineFragment.kt index 104f04c..baf21ec 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/MineFragment.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/MineFragment.kt @@ -2,35 +2,65 @@ package com.localee.mireo.app.ui.fragment import android.content.Intent import android.view.View +import android.widget.ImageView import android.widget.TextView +import androidx.appcompat.widget.AppCompatTextView import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.resource.bitmap.CircleCrop +import com.bumptech.glide.request.RequestOptions +import com.facebook.login.LoginManager import com.hjq.http.EasyHttp import com.hjq.http.listener.HttpCallbackProxy -import com.localee.mireo.app.R -import com.localee.mireo.app.aop.SingleClick import com.localee.mireo.app.app.TitleBarFragment -import com.localee.mireo.app.http.api.HistoryBean +import com.localee.mireo.app.http.api.DoLogoutApi import com.localee.mireo.app.http.api.MyHistoryApi import com.localee.mireo.app.http.api.UserInfoApi import com.localee.mireo.app.http.api.UserInfoRes +import com.localee.mireo.app.http.bean.HistoryBean import com.localee.mireo.app.http.model.HttpData import com.localee.mireo.app.other.MsConstants import com.localee.mireo.app.other.MsConstants.CONSTANTS_short_play_id import com.localee.mireo.app.ui.activity.AboutActivity import com.localee.mireo.app.ui.activity.BrowserActivity +import com.localee.mireo.app.ui.activity.FeedBackActivity import com.localee.mireo.app.ui.activity.HomeActivity +import com.localee.mireo.app.ui.activity.LanguageSwitchActivity +import com.localee.mireo.app.ui.activity.MyVipActivity +import com.localee.mireo.app.ui.activity.MyWalletActivity import com.localee.mireo.app.ui.activity.SettingActivity +import com.localee.mireo.app.ui.activity.StoreActivity import com.localee.mireo.app.ui.activity.VideoPlayActivity import com.localee.mireo.app.ui.adapter.MeHistoryAdapter +import com.localee.mireo.app.ui.videoPaly.ExampleUnFavoriteDialog import com.localee.mireo.app.utils.MsMMKVUtils +import com.localee.mireo.app.utils.TranslatesUtils +import com.localee.mireo.app.utils.singleClick +import com.localee.mireo.app.utils.transToString +import com.localee.mireo.shortapp.R +import com.scwang.smart.refresh.layout.SmartRefreshLayout +import com.scwang.smart.refresh.layout.api.RefreshLayout +import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode -class MineFragment : TitleBarFragment() { +class MineFragment : TitleBarFragment(), OnRefreshLoadMoreListener { + private val rlStatusRefresh: SmartRefreshLayout? by lazy { findViewById(R.id.rl_status_refresh) } private val tvId: TextView? by lazy { findViewById(R.id.tv_id) } private val recyclerView: RecyclerView? by lazy { findViewById(R.id.recyclerView) } + private val tvConins: TextView? by lazy { findViewById(R.id.tv_conins) } + private val tvDonate: TextView? by lazy { findViewById(R.id.tv_donate) } + private val tvVipTime: TextView? by lazy { findViewById(R.id.tv_vip_time) } + private val tvName: TextView? by lazy { findViewById(R.id.tv_name) } + private val tvLogin: TextView? by lazy { findViewById(R.id.tv_login) } + private val ivPortrait: ImageView? by lazy { findViewById(R.id.iv_portrait) } + private val ivVip: ImageView? by lazy { findViewById(R.id.iv_vip) } private var mAdapter: MeHistoryAdapter? = null @@ -48,12 +78,19 @@ class MineFragment : TitleBarFragment() { } override fun initView() { + EventBus.getDefault().register(this) setOnClickListener( R.id.sb_play_list, R.id.sb_setting, R.id.sb_privacy, R.id.sb_agreement, - R.id.sb_about + R.id.sb_about, + R.id.sb_feedback, + R.id.sb_language, + R.id.ll_wallet, + R.id.ll_vip, + R.id.sb_store, + R.id.tv_login ) recyclerView?.layoutManager = @@ -72,49 +109,165 @@ class MineFragment : TitleBarFragment() { putExtra(CONSTANTS_short_play_id, data.short_play_id) }) } + rlStatusRefresh?.setOnRefreshLoadMoreListener(this) + rlStatusRefresh?.setEnableRefresh(true) + rlStatusRefresh?.setEnableLoadMore(false) } override fun initData() { + if (MsMMKVUtils.isTourist()) { + tvName?.text = "Visitor" + ivPortrait?.let { + Glide.with(this).load(MsMMKVUtils.getUserInfo()?.avator).skipMemoryCache(true) + .diskCacheStrategy( + DiskCacheStrategy.NONE + ) + .apply(RequestOptions.bitmapTransform(CircleCrop())) + .placeholder(R.mipmap.iv_login_icon) + .error(R.mipmap.iv_login_icon).into(it) + } + + tvLogin?.text = "Log in" + + } else { + tvName?.text = + MsMMKVUtils.getUserInfo()?.family_name.plus(MsMMKVUtils.getUserInfo()?.giving_name) + ivPortrait?.let { + Glide.with(this).load(MsMMKVUtils.getUserInfo()?.avator).skipMemoryCache(true) + .diskCacheStrategy( + DiskCacheStrategy.NONE + ) + .apply(RequestOptions.bitmapTransform(CircleCrop())) + .placeholder(R.mipmap.ic_login_icon_de) + .error(R.mipmap.ic_login_icon_de).into(it) + } + + tvLogin?.text = "Log out" + + } tvId?.text = "ID:".plus(MsMMKVUtils.getUserInfo()?.customer_id) + tvConins?.text = + MsMMKVUtils.getUserInfo()?.coin_left_total.toString() + tvDonate?.text = + MsMMKVUtils.getUserInfo()?.send_coin_left_total.toString() + if (MsMMKVUtils.isVip()) { + ivVip?.visibility = View.VISIBLE + if (TranslatesUtils.translates() != null) { + tvVipTime?.text = + TranslatesUtils.translates()?.vip_expire_time.plus(MsMMKVUtils.getUserInfo()?.vip_end_time?.let { + transToString( + it.toLong() + ) + }) + } else { + tvVipTime?.text = + "Vip Expires:".plus(MsMMKVUtils.getUserInfo()?.vip_end_time?.let { + transToString( + it.toLong() + ) + }) + } + } else { + ivVip?.visibility = View.GONE + tvVipTime?.text = "Enjoy all dramas for free" + } + + } private var isDataLoaded = false override fun onResume() { super.onResume() - if (isVisible && !isDataLoaded) { - getCustomerUser() - isDataLoaded = true - } +// if (isVisible && !isDataLoaded) { + getCustomerUser() +// isDataLoaded = true +// } getMyHistory(1, 20) } - @SingleClick override fun onClick(view: View) { - when (view.id) { - R.id.sb_play_list -> { - viewModel.triggerAction(2) - viewModel.meToHistoryAction(1) - } + singleClick { + when (view.id) { + R.id.sb_play_list -> { + viewModel.triggerAction(3) + viewModel.meToHistoryAction(1) + } - R.id.sb_setting -> { - startActivity(SettingActivity::class.java) - } + R.id.sb_setting -> { + startActivity(SettingActivity::class.java) + } - R.id.sb_privacy -> { - BrowserActivity.start(getAttachActivity()!!, MsConstants.Constants_privacy_policy) - } + R.id.sb_privacy -> { + BrowserActivity.start( + getAttachActivity()!!, + MsConstants.Constants_privacy_policy + ) + } - R.id.sb_agreement -> { - BrowserActivity.start(getAttachActivity()!!, MsConstants.Constants_user_agreement) - } + R.id.sb_agreement -> { + BrowserActivity.start( + getAttachActivity()!!, + MsConstants.Constants_user_agreement + ) + } - R.id.sb_about -> { - startActivity(AboutActivity::class.java) + R.id.sb_about -> { + startActivity(AboutActivity::class.java) + } + + R.id.sb_feedback -> { + startActivity(FeedBackActivity::class.java) + } + + R.id.sb_language -> { + startActivity(LanguageSwitchActivity::class.java) + } + + R.id.ll_wallet -> { + startActivity(MyWalletActivity::class.java) + } + + R.id.ll_vip -> { + startActivity(MyVipActivity::class.java) + } + + R.id.sb_store -> { + startActivity(StoreActivity::class.java) + } + + R.id.tv_login -> { + if (MsMMKVUtils.isTourist()) { + viewModel.loginAction(0) + } else { + getLogoutDialog() + } + } } } } + private fun getLogoutDialog() { + val exampleUnFavoriteDialog = ExampleUnFavoriteDialog(requireContext()) + val tvThinkAgain = + exampleUnFavoriteDialog.findViewById(R.id.example_tv_think_again) + val tvUnfavorite = + exampleUnFavoriteDialog.findViewById(R.id.example_tv_unfavorite) + val tvTitle = + exampleUnFavoriteDialog.findViewById(R.id.example_tv_title) + val tvContent = + exampleUnFavoriteDialog.findViewById(R.id.example_tv_content) + tvUnfavorite.text = getString(R.string.common_confirm) + tvTitle.text = getString(R.string.logout_title) + tvContent.text = getString(R.string.logout_content) + tvThinkAgain.setOnClickListener { exampleUnFavoriteDialog.dismiss() } + tvUnfavorite.setOnClickListener { + getDoLogout() + exampleUnFavoriteDialog.dismiss() + } + exampleUnFavoriteDialog.show() + } + private fun getCustomerUser() { EasyHttp.get(this) .api(UserInfoApi().apply { @@ -124,7 +277,28 @@ class MineFragment : TitleBarFragment() { result.getData()?.let { MsMMKVUtils.saveUserInfo(it) - tvId?.text = "ID:".plus(MsMMKVUtils.getUserInfo()?.customer_id) + initData() + } + } + }) + } + + private fun getDoLogout() { + EasyHttp.post(this) + .api(DoLogoutApi()) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + LoginManager.getInstance().logOut() + MsMMKVUtils.getMMKV() + .putString(MsConstants.ACCESS_TOKEN, it.token) + EventBus.getDefault() + .post(MsConstants.CONSTANTS_leaveApp) + EventBus.getDefault() + .post(MsConstants.CONSTANTS_enterTheApp) + EventBus.getDefault().post(MsConstants.CONSTANTS_quality_refresh) + EventBus.getDefault() + .post(MsConstants.CONSTANTS_user_refresh) } } }) @@ -150,4 +324,21 @@ class MineFragment : TitleBarFragment() { override fun isStatusBarEnabled(): Boolean { return !super.isStatusBarEnabled() } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(event: String) { + if (MsConstants.CONSTANTS_user_refresh == event || MsConstants.CONSTANTS_refresh_me == event) { + getCustomerUser() + getMyHistory(1, 15) + } + } + + override fun onRefresh(refreshLayout: RefreshLayout) { + getCustomerUser() + getMyHistory(1, 20) + rlStatusRefresh?.finishRefresh(1000) + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + } } \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/RechargeDialogFragment.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/RechargeDialogFragment.kt new file mode 100644 index 0000000..d2b753d --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/RechargeDialogFragment.kt @@ -0,0 +1,624 @@ +package com.localee.mireo.app.ui.fragment + +import android.app.AlertDialog +import android.app.Dialog +import android.content.DialogInterface +import android.os.Bundle +import android.view.Gravity +import android.view.View +import android.view.WindowManager +import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.LinearLayoutManager +import com.android.billingclient.api.AcknowledgePurchaseParams +import com.android.billingclient.api.BillingClient +import com.android.billingclient.api.BillingClientStateListener +import com.android.billingclient.api.BillingFlowParams +import com.android.billingclient.api.BillingResult +import com.android.billingclient.api.ConsumeParams +import com.android.billingclient.api.ConsumeResponseListener +import com.android.billingclient.api.ProductDetails +import com.android.billingclient.api.ProductDetailsResponseListener +import com.android.billingclient.api.Purchase +import com.android.billingclient.api.PurchasesUpdatedListener +import com.android.billingclient.api.QueryProductDetailsParams +import com.bumptech.glide.Glide +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import com.google.common.reflect.TypeToken +import com.google.gson.Gson +import com.hjq.http.EasyHttp +import com.hjq.http.config.IRequestApi +import com.hjq.http.listener.HttpCallbackProxy +import com.hjq.http.listener.OnHttpListener +import com.hjq.toast.ToastUtils +import com.localee.mireo.app.http.api.CreateOrderApi +import com.localee.mireo.app.http.api.GooglePaidApi +import com.localee.mireo.app.http.api.PaySettingsApi +import com.localee.mireo.app.http.api.VideoDetailsApi +import com.localee.mireo.app.http.bean.CreateOrderReqBean +import com.localee.mireo.app.http.bean.PayBean +import com.localee.mireo.app.http.bean.PayResBean +import com.localee.mireo.app.http.bean.PaySettingsBean +import com.localee.mireo.app.http.model.HttpData +import com.localee.mireo.app.other.AppConfig +import com.localee.mireo.app.other.MsConstants +import com.localee.mireo.app.ui.adapter.MyCoinBuyAdapter +import com.localee.mireo.app.ui.adapter.MyVipBuyAdapter +import com.localee.mireo.app.utils.DHStringUtils.getPublicRequest +import com.localee.mireo.app.utils.MsMMKVUtils +import com.localee.mireo.app.utils.TranslatesUtils +import com.localee.mireo.app.utils.singleClick +import com.localee.mireo.shortapp.R +import com.localee.mireo.shortapp.databinding.DialogRechargeFragmentBinding +import kotlinx.coroutines.launch +import org.greenrobot.eventbus.EventBus + +class RechargeDialogFragment : BottomSheetDialogFragment(), OnHttpListener { + private var dialogRechargeFragmentBinding: DialogRechargeFragmentBinding? = null + private var isConnect = false + private var isPay = false + private var type = 0 + private var promise_view_ad: Int? = -1 + private var connectNum = 0 + private var short_play_id: Int? = 0 + private var mAdapter: MyVipBuyAdapter? = null + private var mCoinAdapter: MyCoinBuyAdapter? = null + + private var order_code = "" + private var vipData: PaySettingsBean.Vip? = null + private var coinsData: PaySettingsBean.Coins? = null + private var billingClient: BillingClient? = null + private var purchaseData: Purchase? = null + private var payReq: PayBean? = null + private var detainmentData: PaySettingsBean.Coins? = null + + interface OnDataPass { + fun onDataPass(data: PaySettingsBean.Coins?) + } + + var dataPasser: OnDataPass? = null + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val builder = AlertDialog.Builder(requireActivity()) + val inflater = requireActivity().layoutInflater + val view = inflater.inflate(R.layout.dialog_recharge_fragment, null) + dialogRechargeFragmentBinding = DialogRechargeFragmentBinding.bind(view) + val parcelable = + arguments?.getParcelable(MsConstants.CONSTANTS_Episode) + short_play_id = parcelable?.short_play_id + promise_view_ad = parcelable?.promise_view_ad + + dialogRechargeFragmentBinding?.tvCoins?.text = MsMMKVUtils.getAllCoin().toString() + dialogRechargeFragmentBinding?.ivLoading?.let { + Glide.with(requireContext()) + .asGif() + .load(R.mipmap.iv_loading) + .into(it) + } + dialogRechargeFragmentBinding?.recyclerCoin?.layoutManager = + LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) + dialogRechargeFragmentBinding?.recyclerView?.layoutManager = + LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) + + mCoinAdapter = MyCoinBuyAdapter() + dialogRechargeFragmentBinding?.recyclerCoin?.adapter = mCoinAdapter + + mAdapter = MyVipBuyAdapter() + dialogRechargeFragmentBinding?.recyclerView?.adapter = mAdapter + + mCoinAdapter?.setOnItemClickListener { adapter, view, position -> + if (type == 1) { + mAdapter?.currentPosition = -1 + mAdapter?.notifyDataSetChanged() + } + type = 0 + mCoinAdapter?.currentPosition = position + mCoinAdapter?.notifyDataSetChanged() + } + mAdapter?.setOnItemClickListener { adapter, view, position -> + if (type == 0) { + mCoinAdapter?.currentPosition = -1 + mCoinAdapter?.notifyDataSetChanged() + } + type = 1 + mAdapter?.currentPosition = position + mAdapter?.notifyDataSetChanged() + } + dialogRechargeFragmentBinding?.tvBuy?.setOnClickListener { + if (mAdapter?.currentPosition == -1 && mCoinAdapter?.currentPosition == -1) { + ToastUtils.show(getString(R.string.select_a_payment_item)) + return@setOnClickListener + } + singleClick { + if (!isConnect) { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.g_pay_error.toString()) + } else { + ToastUtils.show(getString(R.string.google_pay_error)) + } + return@singleClick + } + dialogRechargeFragmentBinding?.ivLoading?.visibility = View.VISIBLE + if (type == 0) { + coinsData = + mCoinAdapter!!.getItem(mCoinAdapter!!.currentPosition) as PaySettingsBean.Coins + } else { + vipData = mAdapter!!.getItem(mAdapter!!.currentPosition) as PaySettingsBean.Vip + } + if (parcelable != null) { + short_play_id?.let { it1 -> + CreateOrderReqBean( + if (type == 0) coinsData?.id.toString() else vipData?.id.toString(), + "google", + it1, + parcelable.short_play_video_id + ) + }?.let { it2 -> + getCreateOrder( + it2 + ) + } + } + } + } + + + getPaySettings(parcelable?.short_play_id, parcelable?.short_play_video_id) + initPay() + + builder.setView(dialogRechargeFragmentBinding?.root) + val dialog = builder.create() + dialog.window?.setBackgroundDrawableResource(android.R.color.transparent) + val window = dialog.window + window?.decorView?.setPadding(0, 0, 0, 0) + window?.setGravity(Gravity.BOTTOM) + val layoutParams = window?.attributes + layoutParams?.width = WindowManager.LayoutParams.MATCH_PARENT + layoutParams?.height = resources.getDimensionPixelSize(R.dimen.dp_500) + window?.attributes = layoutParams + return dialog + } + + private fun getPaySettings(shortPlayId: Int?, videoId: Int?) { + EasyHttp.get(this) + .api(PaySettingsApi().apply { + short_play_id = shortPlayId + short_play_video_id = videoId + }) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + mCoinAdapter?.submitList(it.list_coins) + mAdapter?.submitList(it.list_sub_vip) + + it.list_sub_vip?.let { it1 -> querySubProductDetails(it1) } + it.list_coins?.let { it1 -> queryInAppProductDetails(it1) } + + } + } + }) + } + + + private fun initPay() { + val purchasesUpdatedListener = + PurchasesUpdatedListener { billingResult, purchases -> + when (billingResult.responseCode) { + BillingClient.BillingResponseCode.OK -> { + for (purchase in purchases!!) { + if (purchase.purchaseState == Purchase.PurchaseState.PURCHASED) { + if (type == 0) { + consumePurchase(purchase) + } else { + consumePurchaseSub(purchase) + } + } + } + } + + BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED -> { + queryAndConsumePurchases() + } + + BillingClient.BillingResponseCode.USER_CANCELED -> { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.g_pay_cancel.toString()) + } else { + ToastUtils.show(getString(R.string.google_pay_canceled)) + } + dialogRechargeFragmentBinding?.ivLoading?.visibility = View.GONE + } + + else -> { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.g_pay_error.toString()) + } else { + ToastUtils.show(getString(R.string.google_pay_error)) + } + dialogRechargeFragmentBinding?.ivLoading?.visibility = View.GONE + } + } + } + + + billingClient = BillingClient.newBuilder(requireActivity()) + .setListener(purchasesUpdatedListener) + .enablePendingPurchases() + .build() + + + val stateListener: BillingClientStateListener = object : BillingClientStateListener { + override fun onBillingSetupFinished(billingResult: BillingResult) { + if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { + isConnect = true + } + } + + override fun onBillingServiceDisconnected() { + if (connectNum < 5) { + connectNum++ + isConnect = false + billingClient?.startConnection(this) + } + } + } + billingClient?.startConnection(stateListener) + } + + private fun queryAndConsumePurchases() { + // 查询所有未消费的购买记录 + billingClient?.queryPurchasesAsync(BillingClient.ProductType.INAPP) { billingResult, purchaseList -> + if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { + for (purchase in purchaseList) { + consumePurchase(purchase) + } + } + } + } + + private fun getProduct(productId: String) { + val productDetailsResponseListener = + ProductDetailsResponseListener { billingResult, productDetailsList -> + if (productDetailsList.isNotEmpty()) { + pay(productDetailsList[0]) + } else { + lifecycleScope.launch { + ToastUtils.show(billingResult.toString()) + } + dialogRechargeFragmentBinding?.ivLoading?.visibility = View.GONE + } + } + + val productType: String = if (type == 0) { + BillingClient.ProductType.INAPP + } else { + BillingClient.ProductType.SUBS + } + val inAppProductInfo = ArrayList() + inAppProductInfo.add( + QueryProductDetailsParams.Product.newBuilder() + .setProductId(productId) + .setProductType(productType) + .build() + ) + val productDetailsParams = QueryProductDetailsParams.newBuilder() + .setProductList(inAppProductInfo) + .build() + billingClient?.queryProductDetailsAsync( + productDetailsParams, + productDetailsResponseListener + ) + } + + private fun querySubProductDetails(listSubVip: List) { + val productDetailsResponseListener = + ProductDetailsResponseListener { billingResult, productDetailsList -> + if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { + val priceInfo = productDetailsList.mapNotNull { productDetails -> + productDetails.subscriptionOfferDetails?.get(0)?.pricingPhases?.pricingPhaseList?.get( + 0 + )?.let { + productDetails.productId to (it.formattedPrice to it.priceCurrencyCode) + } + }.toMap() + + // 更新VIP列表的价格和货币代码 + val updatedVipList = listSubVip.map { vip -> + priceInfo[vip.android_template_id]?.let { (price, currency) -> + vip.copy(price_google = price, currency_goolge = currency) + } ?: vip + } + + mAdapter?.recyclerView?.postDelayed({ + mAdapter?.submitList(updatedVipList) + }, 500) + } + } + + val productType: String = BillingClient.ProductType.SUBS + + val inAppProductInfo = listSubVip.map { + QueryProductDetailsParams.Product.newBuilder() + .setProductId(it.android_template_id) + .setProductType(productType) + .build() + } + if (inAppProductInfo.isNotEmpty()) { + val productDetailsParams = QueryProductDetailsParams.newBuilder() + .setProductList(inAppProductInfo) + .build() + billingClient?.queryProductDetailsAsync( + productDetailsParams, + productDetailsResponseListener + ) + } + } + + private fun queryInAppProductDetails( + coinsList: List + ) { + val productDetailsResponseListener = + ProductDetailsResponseListener { billingResult, productDetailsList -> + if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { + val priceInfo = productDetailsList.mapNotNull { productDetails -> + productDetails.oneTimePurchaseOfferDetails?.let { + productDetails.productId to (it.formattedPrice to it.priceCurrencyCode) + } + }.toMap() + + // 更新Coins列表的价格和货币代码 + val updatedCoinsList = coinsList.map { coin -> + priceInfo[coin.android_template_id]?.let { (price, currency) -> + coin.copy(price_google = price, currency_goolge = currency) + } ?: coin + } + + mCoinAdapter?.recyclerView?.postDelayed({ + mCoinAdapter?.submitList(updatedCoinsList) + }, 500) + } + } + + val productType = BillingClient.ProductType.INAPP + + val inAppProductInfo = coinsList.map { + QueryProductDetailsParams.Product.newBuilder() + .setProductId(it.android_template_id) + .setProductType(productType) + .build() + } + + if (inAppProductInfo.isNotEmpty()) { + val productDetailsParams = QueryProductDetailsParams.newBuilder() + .setProductList(inAppProductInfo) + .build() + billingClient?.queryProductDetailsAsync( + productDetailsParams, + productDetailsResponseListener + ) + } + } + + private fun pay(productDetailInfo: ProductDetails) { + if (productDetailInfo.subscriptionOfferDetails?.isNotEmpty() == true) { + val params = ArrayList() + productDetailInfo.subscriptionOfferDetails?.get(0)?.offerToken?.let { + BillingFlowParams.ProductDetailsParams.newBuilder() + .setProductDetails(productDetailInfo) + .setOfferToken(it) + .build() + }?.let { + params.add( + it + ) + } + val billingFlowParams = BillingFlowParams.newBuilder() + .setObfuscatedProfileId(order_code) + .setObfuscatedAccountId(MsMMKVUtils.getCustomId()) + .setProductDetailsParamsList(params) + .build() + + billingClient?.launchBillingFlow(requireActivity(), billingFlowParams) + } else { + val params = ArrayList() + params.add( + BillingFlowParams.ProductDetailsParams.newBuilder() + .setProductDetails(productDetailInfo) + .build() + ) + + val billingFlowParams = BillingFlowParams.newBuilder() + .setObfuscatedProfileId(order_code) + .setObfuscatedAccountId(MsMMKVUtils.getCustomId()) + .setProductDetailsParamsList(params) + .build() + + billingClient?.launchBillingFlow(requireActivity(), billingFlowParams) + } + } + + private var consumeResponseListener = + ConsumeResponseListener { billingResult, purchaseToken -> + val PayBean = PayBean( + order_code, + coinsData?.id.toString(), + AppConfig.getPackageName(), + coinsData?.android_template_id.toString(), + purchaseToken, + purchaseData?.orderId.toString(), + coinsData?.price.toString() + ) + if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { + lifecycleScope.launch { + googlePaid(PayBean) + MsMMKVUtils.saveOrder(PayBean) + payReq = PayBean + } + } else { + MsMMKVUtils.saveOrder(PayBean) + lifecycleScope.launch { + ToastUtils.show(billingResult.toString()) + dialogRechargeFragmentBinding?.ivLoading?.visibility = View.GONE + } + } + } + + private fun consumePurchaseSub( + purchase: Purchase + ) { + if (billingClient?.isReady == true) { + if (!purchase.isAcknowledged) { + val acknowledgePurchaseParams = + AcknowledgePurchaseParams.newBuilder() + .setPurchaseToken(purchase.purchaseToken) + .build() + billingClient?.acknowledgePurchase( + acknowledgePurchaseParams + ) { + val PayBean = PayBean( + order_code, + vipData?.id.toString(), + AppConfig.getPackageName(), + vipData?.android_template_id.toString(), + purchase.purchaseToken, + purchase.orderId.toString(), + vipData?.price.toString() + ) + if (it.responseCode == BillingClient.BillingResponseCode.OK) { + lifecycleScope.launch { + googlePaid(PayBean) + MsMMKVUtils.saveOrder(PayBean) + payReq = PayBean + } + } else { + MsMMKVUtils.saveOrder(PayBean) + lifecycleScope.launch { + ToastUtils.show(it.toString()) + dialogRechargeFragmentBinding?.ivLoading?.visibility = View.GONE + } + } + } + } + } + } + + private fun consumePurchase(purchase: Purchase?) { + if (billingClient?.isReady == true) { + purchaseData = purchase + val consumeParams = ConsumeParams.newBuilder() + .setPurchaseToken(purchase?.purchaseToken!!) + .build() + billingClient?.consumeAsync(consumeParams, consumeResponseListener) + } else { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.g_pay_error.toString()) + } else { + ToastUtils.show(getString(R.string.google_pay_error)) + } + dialogRechargeFragmentBinding?.ivLoading?.visibility = View.GONE + } + } + + fun Any.toMapViaGson(): MutableMap { + val json = Gson().toJson(this) + return Gson().fromJson(json, object : TypeToken>() {}.type) + } + + fun getCreateOrder(data: CreateOrderReqBean) { + EasyHttp.post(this) + .api(CreateOrderApi()) + .body(getPublicRequest(data.toMapViaGson())) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + order_code = it.order_code.toString() + if (type == 0) { + coinsData?.android_template_id?.let { it1 -> getProduct(it1) } + } else { + vipData?.android_template_id?.let { it1 -> getProduct(it1) } + } + + } ?: run { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.network_error.toString()) + } else { + ToastUtils.show(getString(R.string.example_service_exception_please_try_again)) + } + } + + } + + }) + } + + fun googlePaid(data: PayBean) { + EasyHttp.post(this) + .api(GooglePaidApi()) + .body(getPublicRequest(data.toMapViaGson())) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.g_pay_success.toString()) + } else { + ToastUtils.show(getString(R.string.google_pay_success)) + } + if (null != payReq) { + MsMMKVUtils.removeOrder(payReq) + } + if (null != payReq) { + MsMMKVUtils.removeOrder(payReq) + } + EventBus.getDefault() + .post(MsConstants.CONSTANTS_pay_refresh) + isPay = true + dismiss() + } ?: run { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.network_error.toString()) + } else { + ToastUtils.show(getString(R.string.example_service_exception_please_try_again)) + } + } + } + + }) + } + + + override fun onHttpStart(api: IRequestApi) { + super.onHttpStart(api) + dialogRechargeFragmentBinding?.ivLoading?.visibility = View.VISIBLE + } + + override fun onHttpSuccess(result: Any) { + } + + override fun onHttpFail(throwable: Throwable) { + } + + override fun onHttpEnd(api: IRequestApi) { + super.onHttpEnd(api) + dialogRechargeFragmentBinding?.ivLoading?.visibility = View.GONE + } + + + override fun onDismiss(dialog: DialogInterface) { + billingClient?.endConnection() + billingClient = null + payReq = null + dataPasser?.onDataPass(detainmentData) + System.gc() + super.onDismiss(dialog) +// if (!isPay) { +// EventBus.getDefault().post(Constants_close_recharge) +// } + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/RewardFragment.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/RewardFragment.kt new file mode 100644 index 0000000..434bacf --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/RewardFragment.kt @@ -0,0 +1,366 @@ +package com.localee.mireo.app.ui.fragment + +import android.Manifest +import android.annotation.SuppressLint +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.Bitmap +import android.graphics.Color +import android.net.Uri +import android.os.Build +import android.util.Log +import android.view.View +import android.view.ViewGroup +import android.webkit.WebChromeClient +import android.webkit.WebResourceError +import android.webkit.WebResourceRequest +import android.webkit.WebSettings +import android.webkit.WebView +import android.webkit.WebViewClient +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.widget.AppCompatImageView +import androidx.appcompat.widget.AppCompatTextView +import androidx.core.content.ContextCompat +import com.blankj.utilcode.util.NetworkUtils +import com.google.android.gms.tasks.OnCompleteListener +import com.google.firebase.messaging.FirebaseMessaging +import com.hjq.http.EasyHttp +import com.hjq.http.config.IRequestApi +import com.hjq.http.listener.HttpCallbackProxy +import com.localee.mireo.app.action.StatusAction +import com.localee.mireo.app.widget.view.SimpleRatingBar +import com.localee.mireo.shortapp.R +import com.localee.mireo.app.app.TitleBarFragment +import com.localee.mireo.app.http.api.FirebaseTokenApi +import com.localee.mireo.app.http.api.OpenNotifyApi +import com.localee.mireo.app.http.model.HttpData +import com.localee.mireo.app.other.AppConfig +import com.localee.mireo.app.other.MsConstants +import com.localee.mireo.app.ui.activity.HomeActivity +import com.localee.mireo.app.ui.dialog.GooglePlayRatingDialog +import com.localee.mireo.app.utils.DHStringUtils.getPublicRequest +import com.localee.mireo.app.utils.JsBridge +import com.localee.mireo.app.utils.MsMMKVUtils +import com.localee.mireo.app.utils.NotificationUtils +import com.localee.mireo.app.utils.TranslatesUtils +import com.localee.mireo.app.utils.singleClick +import com.localee.mireo.app.widget.StatusLayout +import com.localee.mireo.app.widget.StatusLayout.OnRetryListener +import com.scwang.smart.refresh.layout.SmartRefreshLayout +import com.scwang.smart.refresh.layout.api.RefreshLayout +import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode + + +class RewardFragment : TitleBarFragment(), OnRefreshLoadMoreListener ,StatusAction{ + + private val hintLayout: StatusLayout? by lazy { findViewById(R.id.hl_status_hint) } + private val rlStatusRefresh: SmartRefreshLayout? by lazy { findViewById(R.id.rl_status_refresh) } + private val web: WebView? by lazy { findViewById(R.id.web) } + + companion object { + + fun newInstance(): RewardFragment { + return RewardFragment() + } + } + + override fun getLayoutId(): Int { + return R.layout.fragment_reward + } + + override fun initView() { + EventBus.getDefault().register(this) + rlStatusRefresh?.setOnRefreshLoadMoreListener(this) + rlStatusRefresh?.setEnableLoadMore(false) + web?.setBackgroundColor(Color.TRANSPARENT) + } + + override fun initData() { + setWebView() + } + + private var isDataLoaded = false + override fun onResume() { + super.onResume() + if (isVisible && !isDataLoaded) { + loadingData() + isDataLoaded = true + } + } + + fun loadingData() { + showDialog() + if (NetworkUtils.isConnected()) { + showComplete() + loadPageUrl(MsConstants.REWARD_URL_RES) + } else { + showErrorStatus() + } + } + + fun showErrorStatus(){ + showError(object : OnRetryListener { + override fun onRetry(layout: StatusLayout) { + singleClick { + loadingData() + } + } + }) + hideDialog() + } + + @SuppressLint("SetJavaScriptEnabled") + private fun setWebView() { + val webSettings: WebSettings = web!!.settings + webSettings.javaScriptEnabled = true + web?.webChromeClient = WebChromeClient() + + web?.webViewClient = object : WebViewClient() { + override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { + super.onPageStarted(view, url, favicon) + + } + + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + hideDialog() + rlStatusRefresh?.finishRefresh() + if (NetworkUtils.isConnected()) { + showComplete() + } + } + + override fun onReceivedError( + view: WebView?, + request: WebResourceRequest?, + error: WebResourceError? + ) { + super.onReceivedError(view, request, error) + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.network_error.toString()) + } else { + toast(getString(R.string.example_service_exception_please_try_again)) + } + hideDialog() + rlStatusRefresh?.finishRefresh() + } + } + webSettings.domStorageEnabled = true + webSettings.loadsImagesAutomatically = true + webSettings.useWideViewPort = true + webSettings.loadWithOverviewMode = true + webSettings.builtInZoomControls = true + webSettings.displayZoomControls = false + web?.addJavascriptInterface( + JsBridge(requireContext()), + "AndroidInterface" + ) + } + + + private fun loadPageUrl(url: String) { + web?.loadUrl(url) + } + + override fun onDestroyView() { + super.onDestroyView() + (view?.parent as? ViewGroup)?.removeView(web) + web?.destroy() + } + + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(event: String) { + if (MsConstants.CONSTANTS_web_refresh == event) { + web?.loadUrl( + "javascript:loginCallback(" + "'" + MsMMKVUtils.getMMKV() + .getString(MsConstants.ACCESS_TOKEN, "") + "'" + ")" + ) + } + + if (MsConstants.CONSTANTS_rating == event) { + val exampleRatingDialog = GooglePlayRatingDialog(requireContext()) + val example_confirm = + exampleRatingDialog.findViewById(R.id.example_confirm) + val iv_close_vip = + exampleRatingDialog.findViewById(R.id.iv_close_vip) +// val example_tv_title = +// exampleRatingDialog.findViewById(R.id.example_tv_title) +// val example_tv_content = +// exampleRatingDialog.findViewById(R.id.example_tv_content) + val rating = exampleRatingDialog.findViewById(R.id.rating) +// example_confirm.text = TranslatesUtils.translates()?.alter_confirm +// example_tv_title.text = TranslatesUtils.translates()?.enjoy +// example_tv_content.text = TranslatesUtils.translates()?.rating + example_confirm.setOnClickListener { + val currentGrade = rating.getGrade() + if (currentGrade == 5f) { + context?.packageName?.let { it1 -> + openGooglePlayForReview( + requireContext(), + it1 + ) + } + web?.loadUrl( + "javascript:commentCallBack(" + "'" + currentGrade + "'" + ")" + ) + exampleRatingDialog.dismiss() + } else { + if (currentGrade != 0f) { + web?.loadUrl( + "javascript:commentCallBack(" + "'" + currentGrade + "'" + ")" + ) + exampleRatingDialog.dismiss() + } + } + } + iv_close_vip.setOnClickListener { exampleRatingDialog.dismiss() } + exampleRatingDialog.show() + } + + if (MsConstants.CONSTANTS_web_notification == event) { + askNotificationPermission() + } + } + + private fun openGooglePlayForReview(context: Context, packageName: String) { + val uri = Uri.parse("market://details?id=$packageName") + val intent = Intent(Intent.ACTION_VIEW, uri) + // 设置Intent的包名为Google Play商店的包名,以确保跳转到Google Play + intent.setPackage("com.android.vending") + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + + // 检查是否有应用能够处理这个Intent(即是否安装了Google Play) + if (intent.resolveActivity(context.packageManager) != null) { + context.startActivity(intent) + } else { + // 如果设备上没有安装Google Play,则通过浏览器打开Google Play网页版 + val fallbackUri = + Uri.parse("https://play.google.com/store/apps/details?id=$packageName") + val fallbackIntent = Intent(Intent.ACTION_VIEW, fallbackUri) + fallbackIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + context.startActivity(fallbackIntent) + } + } + + private fun firebase() { + FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task -> + if (!task.isSuccessful) { + Log.d( + "LOG_TAG", "Fetching FCM registration token failed", task.exception + ) + return@OnCompleteListener + } + // Get new FCM registration token + val token = task.result + // Log and toast + Log.d("LOG_TAG", token) + firebaseToken(token) + }) + } + + fun firebaseToken(data: String?) { + val sMap: MutableMap = LinkedHashMap() + sMap.put("fcm_token", data) + EasyHttp.post(this) + .api(FirebaseTokenApi()) + .body(getPublicRequest(sMap)) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + } + }) + } + + private fun askNotificationPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (ContextCompat.checkSelfPermission( + requireContext(), Manifest.permission.POST_NOTIFICATIONS + ) == PackageManager.PERMISSION_GRANTED + ) { + firebase() + openNotify() + } else { + requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) + } + } else { + if (NotificationUtils.isNotificationEnabled(requireContext())) { + firebase() + openNotify() + } else { + NotificationUtils.openNotificationSettings(requireActivity()) + } + } + } + + private val requestPermissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission(), + ) { isGranted: Boolean -> + MsConstants.CanNotification = isGranted + if (isGranted) { + firebase() + openNotify() + } else { + openAppNotificationSettings() + } + } + + fun openNotify() { + EasyHttp.post(this) + .api(OpenNotifyApi()) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + } + }) + } + + private fun openAppNotificationSettings() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + val intent = Intent() + intent.action = "android.settings.APP_NOTIFICATION_SETTINGS" + intent.putExtra( + "android.provider.extra.APP_PACKAGE", + AppConfig.getPackageName() + ) + startActivity(intent) + } else { + val intent = Intent() + intent.action = "android.settings.APPLICATION_DETAILS_SETTINGS" + intent.data = + Uri.fromParts("package", AppConfig.getPackageName(), null) + startActivity(intent) + } + } + + override fun onDestroy() { + EventBus.getDefault().unregister(this) + super.onDestroy() + } + + + override fun isStatusBarEnabled(): Boolean { + return !super.isStatusBarEnabled() + } + + override fun onRefresh(refreshLayout: RefreshLayout) { + loadPageUrl(MsConstants.REWARD_URL_RES) + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + } + + override fun getStatusLayout(): StatusLayout? { + return hintLayout + } + + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/SharedViewModel.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/SharedViewModel.kt index 6d57dc6..580b450 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/SharedViewModel.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/SharedViewModel.kt @@ -32,4 +32,11 @@ class SharedViewModel : ViewModel() { fun meToHistoryCheckAction(data: Int) { _meToHistoryCheckAction.value = data } + + private val _loginAction = MutableLiveData() + val loginAction: LiveData get() = _loginAction + + fun loginAction(data: Int) { + _loginAction.value = data + } } \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/popup/CustomBottomLoginPopup.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/popup/CustomBottomLoginPopup.kt new file mode 100644 index 0000000..fb5a407 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/popup/CustomBottomLoginPopup.kt @@ -0,0 +1,79 @@ +package com.localee.mireo.app.ui.popup + +import android.content.Context +import android.graphics.Color +import android.text.SpannableString +import android.text.method.LinkMovementMethod +import android.text.style.ClickableSpan +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import com.localee.mireo.app.other.MsConstants +import com.localee.mireo.app.ui.activity.BrowserActivity +import com.localee.mireo.app.widget.CustomClickableSpan +import com.localee.mireo.shortapp.R +import com.lxj.xpopup.core.BottomPopupView + +class CustomBottomLoginPopup(context: Context, val popupOnclick: CustomPopupOnclick?) : + BottomPopupView(context) { + interface CustomPopupOnclick { + fun onFacebook() + fun onGoogle() + fun onTikTok() + } + + + override fun getImplLayoutId(): Int { + return R.layout.custom_bottom_login_popup + } + + override fun onCreate() { + super.onCreate() + val ivClose = findViewById(R.id.iv_close) + val tvFacebook = findViewById(R.id.tv_facebook) + val tvFirst = findViewById(R.id.tv_first) + val tvGoogle = findViewById(R.id.tv_google) + val tvTiktok = findViewById(R.id.tv_tiktok) + val tvPolicy = findViewById(R.id.tv_policy) + ivClose.setOnClickListener { + dismiss() + } + tvFacebook.setOnClickListener { + popupOnclick?.onFacebook() + dismiss() + } + tvGoogle.setOnClickListener { + popupOnclick?.onGoogle() + dismiss() + } + tvTiktok.setOnClickListener { + popupOnclick?.onTikTok() + dismiss() + } + + val fullText = "By logging in you agree to: User Agreement & Privacy Policy" + + val spannableString = SpannableString(fullText) + + val start1 = fullText.indexOf("User") + val end1 = fullText.indexOf("t ") + 1 + val start2 = fullText.lastIndexOf("Pri") + val end2 = fullText.length + + spannableString.setSpan( + CustomClickableSpan(Color.parseColor("#FF888888")) { + BrowserActivity.start(context, MsConstants.Constants_user_agreement) + }, + start1, end1, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE + ) + spannableString.setSpan( + CustomClickableSpan(Color.parseColor("#FF888888")) { + BrowserActivity.start(context, MsConstants.Constants_privacy_policy) + }, + start2, end2, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE + ) + + tvPolicy.text = spannableString + tvPolicy.movementMethod = LinkMovementMethod.getInstance() // 必须设置! + } +} diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/popup/CustomBubbleAttachPopup.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/popup/CustomBubbleAttachPopup.kt index ed9a465..ef6a350 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/popup/CustomBubbleAttachPopup.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/popup/CustomBubbleAttachPopup.kt @@ -4,7 +4,7 @@ import android.content.Context import android.view.View import android.widget.TextView import com.lxj.xpopup.core.BubbleAttachPopupView -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R class CustomBubbleAttachPopup(context: Context,var tabPosition: Int?,var mode: Int, val popupOnclick: CustomPopupOnclick?) : BubbleAttachPopupView(context) { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExamplePlayerDetailDataRes.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExamplePlayerDetailDataRes.kt deleted file mode 100644 index 5af2548..0000000 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExamplePlayerDetailDataRes.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.localee.mireo.app.ui.videoPaly - -import android.os.Parcel -import android.os.Parcelable - - -data class ExamplePlayerDetailDataRes( - val episodeList: List, - val is_collect: Boolean, - val show_share_coin: Boolean, - val share_coin: Int, - val install_coins: Int, - val unlock_video_ad_count: Int, - val revolution: Int, - val discount: Int, - var business_model: String, - val shortPlayInfo: ShortPlayInfo, - val video_info: VideoInfo -) { - - data class Episode( - val coins: Int, - val episode: Int, - val id: Int, - var is_lock: Boolean, - val is_vip: Int, - val short_play_id: Int, - val short_play_video_id: Int, - val video_url: String, - val vip_coins: Int, - var play_seconds: String?, - var promise_view_ad: Int, - ):Parcelable { - constructor(parcel: Parcel) : this( - parcel.readInt(), - parcel.readInt(), - parcel.readInt(), - parcel.readByte() != 0.toByte(), - parcel.readInt(), - parcel.readInt(), - parcel.readInt(), - parcel.readString().toString(), - parcel.readInt(), - parcel.readString().toString(), - parcel.readInt() - ) { - } - - override fun writeToParcel(parcel: Parcel, flags: Int) { - parcel.writeInt(coins) - parcel.writeInt(episode) - parcel.writeInt(id) - parcel.writeByte(if (is_lock) 1 else 0) - parcel.writeInt(is_vip) - parcel.writeInt(short_play_id) - parcel.writeInt(short_play_video_id) - parcel.writeString(video_url) - parcel.writeInt(vip_coins) - parcel.writeString(play_seconds) - parcel.writeInt(promise_view_ad) - } - - override fun describeContents(): Int { - return 0 - } - - companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel: Parcel): Episode { - return Episode(parcel) - } - - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } - } - } - - data class ShortPlayInfo( - val all_coins: Int, - val buy_type: Int, - var collect_total: Int, - val description: String, - val episode_total: Int, - val id: Int, - val image_url: String, - var is_collect: Boolean, - val name: String, - val process: Int, - val short_id: Int, - val watch_total: Int - ):Parcelable { - constructor(parcel: Parcel) : this( - parcel.readInt(), - parcel.readInt(), - parcel.readInt(), - parcel.readString().toString(), - parcel.readInt(), - parcel.readInt(), - parcel.readString().toString(), - parcel.readByte() != 0.toByte(), - parcel.readString().toString(), - parcel.readInt(), - parcel.readInt(), - parcel.readInt() - ) { - } - - override fun writeToParcel(parcel: Parcel, flags: Int) { - parcel.writeInt(all_coins) - parcel.writeInt(buy_type) - parcel.writeInt(collect_total) - parcel.writeString(description) - parcel.writeInt(episode_total) - parcel.writeInt(id) - parcel.writeString(image_url) - parcel.writeByte(if (is_collect) 1 else 0) - parcel.writeString(name) - parcel.writeInt(process) - parcel.writeInt(short_id) - parcel.writeInt(watch_total) - } - - override fun describeContents(): Int { - return 0 - } - - companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel: Parcel): ShortPlayInfo { - return ShortPlayInfo(parcel) - } - - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } - } - } - - data class VideoInfo( - val coins: Int, - val episode: Int, - val id: Int, - val is_vip: Int, - val short_id: Int, - val short_play_id: Int, - val short_play_video_id: Int, - val promise_view_ad: Int, - val video_url: String, - val vip_coins: Int - ) -} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleRecommendAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleRecommendAdapter.kt index 5f5d01d..1ba6a8d 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleRecommendAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleRecommendAdapter.kt @@ -6,7 +6,7 @@ import androidx.appcompat.widget.AppCompatImageView import androidx.media3.ui.PlayerView import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.viewholder.QuickViewHolder -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R class ExampleRecommendAdapter : BaseQuickAdapter() { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleRecommendPlayerView.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleRecommendPlayerView.kt index 7316a51..1fa98a3 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleRecommendPlayerView.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleRecommendPlayerView.kt @@ -27,8 +27,8 @@ import com.bumptech.glide.Glide import com.hjq.shape.view.ShapeImageView import com.hjq.shape.view.ShapeTextView import com.hjq.toast.ToastUtils -import com.localee.mireo.app.R -import com.localee.mireo.app.databinding.ExampleRecommendPlayerViewBinding +import com.localee.mireo.shortapp.R +import com.localee.mireo.shortapp.databinding.ExampleRecommendPlayerViewBinding import com.localee.mireo.app.other.MsConstants import com.localee.mireo.app.other.MsConstants.CONSTANTS_activity_id import com.localee.mireo.app.other.MsConstants.CONSTANTS_short_play_id diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleSeriesDataAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleSeriesDataAdapter.kt index 8216bea..77fbfd7 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleSeriesDataAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleSeriesDataAdapter.kt @@ -5,8 +5,9 @@ import android.view.ViewGroup import androidx.appcompat.widget.AppCompatTextView import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.viewholder.QuickViewHolder -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R import com.localee.mireo.app.http.api.VideoDetailsApi +import com.localee.mireo.app.utils.MsMMKVUtils class ExampleSeriesDataAdapter : BaseQuickAdapter() { @@ -35,6 +36,12 @@ class ExampleSeriesDataAdapter : holder.setVisible(R.id.example_tv_num_data, true) holder.setVisible(R.id.example_iv_num_data, false) } + + if (item?.is_lock == true && !MsMMKVUtils.isVip()) { + holder.setVisible(R.id.iv_example_lock, true) + } else { + holder.setVisible(R.id.iv_example_lock, false) + } } override fun onCreateViewHolder( diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleSeriesDialogFragment.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleSeriesDialogFragment.kt index cccbdf2..17b682e 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleSeriesDialogFragment.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleSeriesDialogFragment.kt @@ -4,21 +4,21 @@ import android.app.AlertDialog import android.app.Dialog import android.os.Bundle import android.view.Gravity +import android.view.View import android.view.WindowManager import androidx.fragment.app.DialogFragment import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import com.bumptech.glide.Glide -import com.localee.mireo.app.R -import com.localee.mireo.app.databinding.ExampleDialogSeriesBinding +import com.hjq.toast.ToastUtils import com.localee.mireo.app.http.api.VideoDetailsApi -import com.localee.mireo.app.other.MsConstants import com.localee.mireo.app.other.MsConstants.Constants_Episodes_Series_DataExample import com.localee.mireo.app.other.MsConstants.Constants_Episodes_Series_Data_ListExample import com.localee.mireo.app.other.MsConstants.Constants_Episodes_Series_Data_currentPositionExample +import com.localee.mireo.app.utils.MsMMKVUtils import com.localee.mireo.app.utils.TranslatesUtils -import com.localee.mireo.app.utils.singleClick -import org.greenrobot.eventbus.EventBus +import com.localee.mireo.shortapp.R +import com.localee.mireo.shortapp.databinding.ExampleDialogSeriesBinding class ExampleSeriesDialogFragment : DialogFragment() { var seriesCallBack: SeriesCallBack? = null @@ -84,18 +84,18 @@ class ExampleSeriesDialogFragment : DialogFragment() { } exampleSeriesDataAdapter.setOnItemClickListener { adapter, view, position -> val item = adapter.getItem(position) as VideoDetailsApi.Bean.Episode -// if (position > 0) { -// val beforeItem = adapter.getItem(position - 1) as VideoDetailsApi.Bean.Episode -// if (beforeItem.is_lock && !MsMMKVUtils.isVip()) { -// if (TranslatesUtils.translates() != null) { -// ToastUtils.show(TranslatesUtils.translates()?.jump_unlock_error.toString()) -// } else { -// ToastUtils.show("The prequel to this series is not unlocked. Please unlock the prequel before unlocking this series") -// } -// dismiss() -// return@setOnItemClickListener -// } -// } + if (position > 0) { + val beforeItem = adapter.getItem(position - 1) as VideoDetailsApi.Bean.Episode + if (beforeItem.is_lock && !MsMMKVUtils.isVip()) { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.jump_unlock_error.toString()) + } else { + ToastUtils.show("The prequel to this series is not unlocked. Please unlock the prequel before unlocking this series") + } + dismiss() + return@setOnItemClickListener + } + } seriesCallBack?.chooseSeries(item) dismiss() } @@ -107,6 +107,20 @@ class ExampleSeriesDialogFragment : DialogFragment() { append(data?.episode_total) append(" Episodes") } + + if (data?.category != null && data.category.isNotEmpty()) { + exampleDialogSeriesBinding.tvFavor.text = data.category[0] + exampleDialogSeriesBinding.tvFavor.visibility = View.VISIBLE + if (data.category.size > 1) { + exampleDialogSeriesBinding.tvLove.text = data.category[1] + exampleDialogSeriesBinding.tvLove.visibility = View.VISIBLE + } else { + exampleDialogSeriesBinding.tvLove.visibility = View.GONE + } + } else { + exampleDialogSeriesBinding.tvFavor.visibility = View.GONE + } + Glide.with(this) .load(data?.image_url) .into(exampleDialogSeriesBinding.ivImg) diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleSeriesNumAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleSeriesNumAdapter.kt index 093f175..55d4a8b 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleSeriesNumAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleSeriesNumAdapter.kt @@ -5,7 +5,7 @@ import android.graphics.Color import android.view.ViewGroup import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.viewholder.QuickViewHolder -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R class ExampleSeriesNumAdapter : BaseQuickAdapter() { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleUnFavoriteDialog.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleUnFavoriteDialog.kt index eccc222..15b8ec0 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleUnFavoriteDialog.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleUnFavoriteDialog.kt @@ -7,7 +7,7 @@ import android.graphics.drawable.ColorDrawable import android.view.Gravity import android.view.Window import android.view.WindowManager -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R class ExampleUnFavoriteDialog(context: Context) : Dialog(context) { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/LoadingLine.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/LoadingLine.kt index d00d0e3..9d44cad 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/LoadingLine.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/LoadingLine.kt @@ -9,7 +9,7 @@ import android.view.animation.Animation import android.view.animation.AnimationSet import android.view.animation.ScaleAnimation import android.widget.FrameLayout -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R class LoadingLine : FrameLayout { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/VideoPlayAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/VideoPlayAdapter.kt index c1e72fb..e9f06a5 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/VideoPlayAdapter.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/VideoPlayAdapter.kt @@ -6,7 +6,7 @@ import androidx.appcompat.widget.AppCompatImageView import androidx.media3.ui.PlayerView import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.viewholder.QuickViewHolder -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R import com.localee.mireo.app.http.api.VideoDetailsApi class VideoPlayAdapter : diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/VideoPlayerView.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/VideoPlayerView.kt index de3a4b9..4f0fd7e 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/VideoPlayerView.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/VideoPlayerView.kt @@ -25,11 +25,12 @@ import androidx.media3.exoplayer.source.ProgressiveMediaSource import com.bumptech.glide.Glide import com.hjq.shape.view.ShapeTextView import com.hjq.toast.ToastUtils -import com.localee.mireo.app.R -import com.localee.mireo.app.databinding.ExampleDetailPlayerViewBinding +import com.localee.mireo.shortapp.R +import com.localee.mireo.shortapp.databinding.ExampleDetailPlayerViewBinding import com.localee.mireo.app.http.api.VideoDetailsApi import com.localee.mireo.app.other.MsConstants import com.localee.mireo.app.other.MsConstants.ExampleDetailCanPlay +import com.localee.mireo.app.other.MsConstants.ExampleLock import com.localee.mireo.app.other.MsConstants.seek import com.localee.mireo.app.utils.TranslatesUtils import com.localee.mireo.app.utils.formatNumber @@ -119,7 +120,7 @@ class VideoPlayerView(context: Context, attrs: AttributeSet?) : Player.STATE_READY -> { exampleIvPlayPlayerController?.isEnabled = true - if (ExampleDetailCanPlay) { + if (ExampleDetailCanPlay && !ExampleLock) { if (seek && progress > 0) { player?.seekTo(progress) seek = false @@ -150,10 +151,12 @@ class VideoPlayerView(context: Context, attrs: AttributeSet?) : } }) exampleIvPlayPlayerController?.setOnClickListener { - if (MsConstants.ExampleDetailPlaying) { - pause() - } else { - play() + if (!ExampleLock) { + if (MsConstants.ExampleDetailPlaying) { + pause() + } else { + play() + } } } iv_des_change?.setOnClickListener { @@ -307,12 +310,16 @@ class VideoPlayerView(context: Context, attrs: AttributeSet?) : player?.setMediaSource(buildMediaSource(episode.video_url)) player?.prepare() exampleTvEpisodePlayerController?.setOnClickListener { + if (!episode.is_lock) { EventBus.getDefault() .post(MsConstants.Constants_RecommendPlayerView_DramaSeriesExample) + } } ivEpisodePlayerController?.setOnClickListener { + if (!episode.is_lock) { EventBus.getDefault() .post(MsConstants.Constants_RecommendPlayerView_DramaSeriesExample) + } } exampleIvBackController?.setOnClickListener { EventBus.getDefault() diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/ExampleStand.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/ExampleStand.kt index df005e6..6aa31ce 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/ExampleStand.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/ExampleStand.kt @@ -3,6 +3,7 @@ package com.localee.mireo.app.utils import android.annotation.SuppressLint import android.content.Context import android.os.Build +import com.localee.mireo.app.other.MsConstants import java.text.SimpleDateFormat import java.time.Instant import java.time.LocalDateTime @@ -119,13 +120,13 @@ fun transToString(time: Long): String { // return currentTime - lastPopupTime > ONE_DAY_IN_MILLIS //} // -//fun shouldShowNotification(): Boolean { -// val lastPopupTime = -// ExampleMMKVUtils.getMMKV().getLong(CONSTANTS_PREF_LAST_POPUP_TIME_Notification, 0) -// val currentTime = System.currentTimeMillis() -// -// return currentTime - lastPopupTime > ONE_DAY_IN_MILLIS -//} +fun shouldShowNotification(): Boolean { + val lastPopupTime = + MsMMKVUtils.getMMKV().getLong(MsConstants.CONSTANTS_PREF_LAST_POPUP_TIME_Notification, 0) + val currentTime = System.currentTimeMillis() + + return currentTime - lastPopupTime > MsConstants.ONE_DAY_IN_MILLIS +} // //fun shouldShowVIP(): Boolean { // val lastPopupTime = diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/JsBridge.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/JsBridge.kt new file mode 100644 index 0000000..5bfd90a --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/JsBridge.kt @@ -0,0 +1,224 @@ +package com.localee.mireo.app.utils + +import android.Manifest +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Build +import android.util.Log +import android.webkit.JavascriptInterface +import androidx.core.content.ContextCompat +import com.google.gson.Gson +import com.google.gson.JsonObject +import com.google.gson.JsonParser +import com.localee.mireo.app.app.BaseEventBus +import com.localee.mireo.app.http.bean.JsBean +import com.localee.mireo.app.http.bean.JsonInfoBean +import com.localee.mireo.app.http.bean.JsonInfoUrlBean +import com.localee.mireo.app.other.MsConstants +import com.localee.mireo.app.ui.activity.VideoPlayActivity +import org.greenrobot.eventbus.EventBus + + +class JsBridge(private val context: Context) { + @JavascriptInterface + fun getUserInfo(): String { + val jsInfo = JsBean( + MsMMKVUtils.getMMKV() + .getString(MsConstants.ACCESS_TOKEN, "") + .toString(), + getCurrentTimeZone(), + MsMMKVUtils.getMMKV().getString(MsConstants.CONSTANTS_lang_key, "en") + .toString(), + "android", + "theme_1" + ) + return Gson().toJson(jsInfo) + } + + @JavascriptInterface + fun js2app(string: String) { + val parser = JsonParser() + val rootJson = parser.parse(string) as JsonObject + when (rootJson.get("type").asString) { + "login" -> { + EventBus.getDefault().post(MsConstants.CONSTANTS_Login) +// context.startActivity( +// Intent( +// context, +// ExampleLoginActivity::class.java +// ).apply { +// putExtra( +// MsConstants.CONSTANTS_activity_id, +// "login" +// ) +// } +// ) + } + + "open_notify" -> { + EventBus.getDefault().post(MsConstants.CONSTANTS_web_notification) + } + + "watch_video" -> { + val fromJson = Gson().fromJson(string, JsonInfoBean::class.java) + context.startActivity( + Intent( + context, + VideoPlayActivity::class.java + ).apply { + putExtra( + MsConstants.CONSTANTS_short_play_id, + fromJson.data?.short_play_id + ) + putExtra( + MsConstants.CONSTANTS_activity_id, + fromJson.data?.activity_id + ) + }) + } + + "go_tiktok" -> { + val fromJson = Gson().fromJson(string, JsonInfoUrlBean::class.java) + val tiktokUrl = fromJson.data.link + val tiktokIntent = Intent(Intent.ACTION_VIEW, Uri.parse(tiktokUrl)) + tiktokIntent.setPackage("com.ss.android.ugc.trill") + if (tiktokIntent.resolveActivity(context.packageManager) != null) { + context.startActivity(tiktokIntent) + } else { + // 如果没有安装TikTok,使用浏览器打开 + val webIntent = Intent(Intent.ACTION_VIEW, Uri.parse(tiktokUrl)) + context.startActivity(webIntent) + } + } + + "go_youtube" -> { + val fromJson = Gson().fromJson(string, JsonInfoUrlBean::class.java) + val youtubeUrl = fromJson.data.link + val youtubeIntent = Intent(Intent.ACTION_VIEW, Uri.parse(youtubeUrl)) + youtubeIntent.setPackage("com.google.android.youtube") // YouTube的包名 + + if (youtubeIntent.resolveActivity(context.packageManager) != null) { + context.startActivity(youtubeIntent) + } else { + // 如果没有安装YouTube,使用浏览器打开 + val webIntent = Intent(Intent.ACTION_VIEW, Uri.parse(youtubeUrl)) + context.startActivity(webIntent) + } + } + + "go_facebook" -> { + val fromJson = Gson().fromJson(string, JsonInfoUrlBean::class.java) + val facebookUrl = fromJson.data.link + try { + // 尝试使用Facebook应用打开 + val facebookIntent = Intent(Intent.ACTION_VIEW, Uri.parse(facebookUrl)) + context.startActivity(facebookIntent) + } catch (e: Exception) { + // 如果没有安装Facebook,使用浏览器打开 + val webIntent = Intent(Intent.ACTION_VIEW, Uri.parse(facebookUrl)) + context.startActivity(webIntent) + } + } + + "go_instagram" -> { + val fromJson = Gson().fromJson(string, JsonInfoUrlBean::class.java) + val instagramUrl = fromJson.data.link + try { + // 尝试使用Instagram应用打开 + val instagramIntent = Intent(Intent.ACTION_VIEW, Uri.parse(instagramUrl)) + instagramIntent.setPackage("com.instagram.android") // Instagram的包名 + context.startActivity(instagramIntent) + } catch (e: java.lang.Exception) { + // 如果没有安装Instagram,使用浏览器打开 + val webIntent = Intent(Intent.ACTION_VIEW, Uri.parse(instagramUrl)) + context.startActivity(webIntent) + } + } + + "go_comment" -> { + EventBus.getDefault().post(MsConstants.CONSTANTS_rating) + } + + "lucky_wheel" -> { + val dataObject = rootJson.getAsJsonObject("data") + val link = dataObject.get("link").asString +// context.startActivity( +// Intent( +// context, +// MovableTurntableActivity::class.java +// ).apply { +// putExtra("title", link) +// } +// ) + } + } + } + + @JavascriptInterface + fun openFeedbackDetail(id: String) { + EventBus.getDefault() + .post(BaseEventBus(MsConstants.Constants_openFeedbackDetail, id)) + } + + @JavascriptInterface + fun openFeedbackList() { + EventBus.getDefault() + .post(MsConstants.Constants_openFeedback) + } + + @JavascriptInterface + fun openPhotoPicker() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (ContextCompat.checkSelfPermission( + context, + Manifest.permission.READ_MEDIA_IMAGES + ) == PackageManager.PERMISSION_GRANTED + ) { + openFilePicker() + } else { + EventBus.getDefault().post(MsConstants.Constants_requestPermissions_photo) + } + } else { + if ((ContextCompat.checkSelfPermission( + context, + Manifest.permission.READ_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED && + ContextCompat.checkSelfPermission( + context, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED && + ContextCompat.checkSelfPermission( + context, + Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED) + ) { + openFilePicker() + } else { + EventBus.getDefault().post(MsConstants.Constants_requestPermissions_photo) + } + } + + } + + + private val REQUEST_PICK_FILE: Int = 1002 + + private fun openFilePicker() { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "image/*" + } + (context as? Activity)?.startActivityForResult(intent, REQUEST_PICK_FILE) + } + + @JavascriptInterface + fun openLuckyDrawAD(string: String) { + Log.d("openLuckyDrawAD", string) +// EventBus.getDefault() +// .post(BaseEventBus(MsConstants.Constants_Movable_turntable_ad, string)) + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/JsBridgeDetail.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/JsBridgeDetail.kt new file mode 100644 index 0000000..1d4a2ab --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/JsBridgeDetail.kt @@ -0,0 +1,80 @@ +package com.localee.mireo.app.utils + +import android.Manifest +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Build +import android.webkit.JavascriptInterface +import androidx.core.content.ContextCompat +import com.google.gson.Gson +import com.localee.mireo.app.http.bean.JsDetailsBean +import com.localee.mireo.app.other.MsConstants +import org.greenrobot.eventbus.EventBus + + +class JsBridgeDetail(private val context: Context) { + @JavascriptInterface + fun getUserInfo(): String { + val jsInfo = JsDetailsBean( + MsMMKVUtils.getMMKV() + .getString(MsConstants.ACCESS_TOKEN, "") + .toString(), + getCurrentTimeZone(), + MsMMKVUtils.getMMKV().getString(MsConstants.CONSTANTS_lang_key, "en") + .toString(), + "android", + MsMMKVUtils.getMMKV().getString(MsConstants.CONSTANTS_Detail_id, "") + .toString(), + "theme_1" + ) + return Gson().toJson(jsInfo) + } + + + @JavascriptInterface + fun openPhotoPicker() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (ContextCompat.checkSelfPermission( + context, + Manifest.permission.READ_MEDIA_IMAGES + ) == PackageManager.PERMISSION_GRANTED + ) { + openFilePicker() + } else { + EventBus.getDefault().post(MsConstants.Constants_requestPermissions_photo_detail) + } + } else { + if ((ContextCompat.checkSelfPermission( + context, + Manifest.permission.READ_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED && + ContextCompat.checkSelfPermission( + context, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED && + ContextCompat.checkSelfPermission( + context, + Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED) + ) { + openFilePicker() + } else { + EventBus.getDefault().post(MsConstants.Constants_requestPermissions_photo_detail) + } + } + + } + + + private val REQUEST_PICK_FILE: Int = 1003 + + private fun openFilePicker() { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "image/*" + } + (context as? Activity)?.startActivityForResult(intent, REQUEST_PICK_FILE) + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/MsMMKVUtils.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/MsMMKVUtils.kt index e34c57b..a06c315 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/MsMMKVUtils.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/MsMMKVUtils.kt @@ -2,6 +2,7 @@ package com.localee.mireo.app.utils import com.google.gson.Gson import com.localee.mireo.app.http.api.UserInfoRes +import com.localee.mireo.app.http.bean.PayBean import com.localee.mireo.app.other.MsConstants import com.tencent.mmkv.MMKV @@ -48,5 +49,54 @@ object MsMMKVUtils { } return Gson().fromJson(string, UserInfoRes::class.java) } + fun isVip(): Boolean { + return getUserInfo()?.is_vip == true + } + fun isTourist(): Boolean { + return getUserInfo()?.is_tourist == true + } + fun getAllCoin(): Int { + if (getUserInfo() == null) { + return 0 + } + return getUserInfo()?.coin_left_total!! + getUserInfo()?.send_coin_left_total!! + } + + fun getCustomId(): String { + return getUserInfo()?.customer_id.toString() + } + + fun saveOrder(payReq: PayBean) { + val list = getOrder() + if (!list.contains(payReq)) { + list.add(payReq) + } + val toJson = Gson().toJson(list) + getMMKV().putString(MsConstants.CONSTANTS_examplePayReq, toJson) + } + fun removeOrder(payReq: PayBean?) { + val updatedList = getOrder().filterNot { it == payReq } + getMMKV().putString( + MsConstants.CONSTANTS_examplePayReq, + Gson().toJson(updatedList) + ) + } + + + fun getOrder(): MutableList { + try { + val string = getMMKV().getString(MsConstants.CONSTANTS_examplePayReq, "[]") + if (null != string && "[]" != string) { + return Gson().fromJson(string, Array::class.java).toMutableList() + } + } catch (e: Exception) { + e.printStackTrace() + getMMKV().putString( + MsConstants.CONSTANTS_examplePayReq, + "[]" + ) + } + return mutableListOf() + } } \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/NotificationUtils.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/NotificationUtils.kt new file mode 100644 index 0000000..0142743 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/NotificationUtils.kt @@ -0,0 +1,45 @@ +package com.localee.mireo.app.utils + +import android.app.Activity +import android.app.NotificationManager +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.util.Log +import com.google.android.gms.tasks.OnCompleteListener +import com.google.firebase.messaging.FirebaseMessaging +import com.localee.mireo.app.other.AppConfig + +object NotificationUtils { + const val NOTIFICATION_SETTINGS_REQUEST_CODE: Int = 4001 + + fun isNotificationEnabled(context: Context): Boolean { + val notificationManager = + context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + notificationManager.areNotificationsEnabled() + } else { + true + } + } + + + fun openNotificationSettings(context: Activity) { + val intent = Intent() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.action = "android.settings.APP_NOTIFICATION_SETTINGS" + intent.putExtra( + "android.provider.extra.APP_PACKAGE", + AppConfig.getPackageName() + ) + context.startActivity(intent) + } else { + intent.action = "android.settings.APPLICATION_DETAILS_SETTINGS" + intent.data = + Uri.fromParts("package", AppConfig.getPackageName(), null) + context.startActivityForResult(intent, NOTIFICATION_SETTINGS_REQUEST_CODE) + } + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/TranslatesUtils.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/TranslatesUtils.kt index c5fe2ea..1bb8bad 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/TranslatesUtils.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/TranslatesUtils.kt @@ -8,19 +8,19 @@ import android.text.style.UnderlineSpan import android.widget.TextView import com.google.gson.Gson import com.localee.mireo.app.other.MsConstants -import com.localee.mireo.app.ui.videoPaly.TranslatesRes +import com.localee.mireo.app.http.bean.TranslatesBean object TranslatesUtils { - fun saveTranslates(infoRes: TranslatesRes.Translates?) { + fun saveTranslates(infoRes: TranslatesBean.Translates?) { val toJson = Gson().toJson(infoRes) MsMMKVUtils.getMMKV() .putString(MsConstants.CONSTANTS_Translates_STRING, toJson) } - fun translates(): TranslatesRes.Translates? { + fun translates(): TranslatesBean.Translates? { val string = MsMMKVUtils.getMMKV() .getString(MsConstants.CONSTANTS_Translates_STRING, "") - return Gson().fromJson(string, TranslatesRes.Translates::class.java) + return Gson().fromJson(string, TranslatesBean.Translates::class.java) } fun replace(string: String, new: String): String { diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/BrowserView.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/BrowserView.kt index 197b574..966bedc 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/BrowserView.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/BrowserView.kt @@ -9,30 +9,35 @@ import android.net.http.SslError import android.os.Build import android.text.TextUtils import android.util.AttributeSet -import android.webkit.* +import android.webkit.JsPromptResult +import android.webkit.JsResult +import android.webkit.SslErrorHandler +import android.webkit.ValueCallback +import android.webkit.WebChromeClient +import android.webkit.WebResourceError +import android.webkit.WebResourceRequest +import android.webkit.WebSettings +import android.webkit.WebView +import android.webkit.WebViewClient import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleOwner -import com.hjq.base.BaseActivity -import com.hjq.base.BaseActivity.OnActivityCallback -import com.hjq.base.BaseDialog -import com.hjq.base.action.ActivityAction -import com.localee.mireo.app.R +import com.localee.mireo.app.base.BaseActivity +import com.localee.mireo.app.base.BaseActivity.OnActivityCallback +import com.localee.mireo.app.base.BaseDialog +import com.localee.mireo.app.base.action.ActivityAction +import com.localee.mireo.app.widget.layout.NestedScrollWebView +import com.localee.mireo.shortapp.R import com.localee.mireo.app.other.AppConfig -import com.localee.mireo.app.other.PermissionCallback import com.localee.mireo.app.ui.dialog.InputDialog import com.localee.mireo.app.ui.dialog.MessageDialog import com.localee.mireo.app.ui.dialog.TipsDialog -import com.hjq.permissions.Permission -import com.hjq.permissions.XXPermissions -import com.hjq.widget.layout.NestedScrollWebView -import timber.log.Timber -import java.util.* @Suppress("SetJavaScriptEnabled") -class BrowserView @JvmOverloads constructor( +class BrowserView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - defStyleAttr: Int = android.R.attr.webViewStyle, defStyleRes: Int = 0) : + defStyleAttr: Int = android.R.attr.webViewStyle, defStyleRes: Int = 0 +) : NestedScrollWebView(context, attrs, defStyleAttr, defStyleRes), LifecycleEventObserver, ActivityAction { @@ -84,9 +89,12 @@ class BrowserView @JvmOverloads constructor( destroy() } - @Deprecated("Please use {@link BrowserViewClient}", ReplaceWith( - "super.setWebViewClient(client)", - "com.hjq.widget.layout.NestedScrollWebView")) + @Deprecated( + "Please use {@link BrowserViewClient}", ReplaceWith( + "super.setWebViewClient(client)", + "com.localee.mireo.app.widget.layout.NestedScrollWebView" + ) + ) override fun setWebViewClient(client: WebViewClient) { super.setWebViewClient(client) } @@ -99,9 +107,12 @@ class BrowserView @JvmOverloads constructor( super.setWebViewClient(client) } - @Deprecated("Please use {@link BrowserChromeClient}", ReplaceWith( - "super.setWebChromeClient(client)", - "com.hjq.widget.layout.NestedScrollWebView")) + @Deprecated( + "Please use {@link BrowserChromeClient}", ReplaceWith( + "super.setWebChromeClient(client)", + "com.localee.mireo.app.widget.layout.NestedScrollWebView" + ) + ) override fun setWebChromeClient(client: WebChromeClient?) { super.setWebChromeClient(client) } @@ -132,13 +143,27 @@ class BrowserView @JvmOverloads constructor( } @TargetApi(Build.VERSION_CODES.M) - override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) { + override fun onReceivedError( + view: WebView, + request: WebResourceRequest, + error: WebResourceError + ) { if (request.isForMainFrame) { - onReceivedError(view, error.errorCode, error.description.toString(), request.url.toString()) + onReceivedError( + view, + error.errorCode, + error.description.toString(), + request.url.toString() + ) } } - override fun onReceivedError(view: WebView, errorCode: Int, description: String, failingUrl: String) { + override fun onReceivedError( + view: WebView, + errorCode: Int, + description: String, + failingUrl: String + ) { super.onReceivedError(view, errorCode, description, failingUrl) } @@ -148,7 +173,6 @@ class BrowserView @JvmOverloads constructor( } override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { - Timber.i("WebView shouldOverrideUrlLoading:%s", url) val scheme: String = Uri.parse(url).scheme ?: return false when (scheme) { "http", "https" -> view.loadUrl(url) @@ -160,9 +184,12 @@ class BrowserView @JvmOverloads constructor( protected fun dialing(view: WebView, url: String) { val context: Context = view.context MessageDialog.Builder(context) - .setMessage(String.format( - view.resources.getString(R.string.common_web_call_phone_title), - url.replace("tel:", ""))) + .setMessage( + String.format( + view.resources.getString(R.string.common_web_call_phone_title), + url.replace("tel:", "") + ) + ) .setConfirm(R.string.common_web_call_phone_allow) .setCancel(R.string.common_web_call_phone_reject) .setCancelable(false) @@ -179,9 +206,15 @@ class BrowserView @JvmOverloads constructor( } } - open class BrowserChromeClient constructor(private val webView: BrowserView) : WebChromeClient() { + open class BrowserChromeClient constructor(private val webView: BrowserView) : + WebChromeClient() { - override fun onJsAlert(view: WebView, url: String, message: String, result: JsResult): Boolean { + override fun onJsAlert( + view: WebView, + url: String, + message: String, + result: JsResult + ): Boolean { val activity: Activity = webView.getActivity() ?: return false TipsDialog.Builder(activity) .setIcon(TipsDialog.ICON_WARNING) @@ -197,7 +230,12 @@ class BrowserView @JvmOverloads constructor( return true } - override fun onJsConfirm(view: WebView, url: String, message: String, result: JsResult): Boolean { + override fun onJsConfirm( + view: WebView, + url: String, + message: String, + result: JsResult + ): Boolean { val activity: Activity = webView.getActivity() ?: return false MessageDialog.Builder(activity) .setMessage(message) @@ -216,7 +254,13 @@ class BrowserView @JvmOverloads constructor( return true } - override fun onJsPrompt(view: WebView, url: String, message: String, defaultValue: String, result: JsPromptResult): Boolean { + override fun onJsPrompt( + view: WebView, + url: String, + message: String, + defaultValue: String, + result: JsPromptResult + ): Boolean { val activity: Activity = webView.getActivity() ?: return false InputDialog.Builder(activity) .setContent(defaultValue) @@ -236,61 +280,12 @@ class BrowserView @JvmOverloads constructor( return true } - override fun onGeolocationPermissionsShowPrompt(origin: String, callback: GeolocationPermissions.Callback) { - val activity: Activity = webView.getActivity() ?: return - MessageDialog.Builder(activity) - .setMessage(R.string.common_web_location_permission_title) - .setConfirm(R.string.common_web_location_permission_allow) - .setCancel(R.string.common_web_location_permission_reject) - .setCancelable(false) - .setListener(object : MessageDialog.OnListener { - override fun onConfirm(dialog: BaseDialog?) { - XXPermissions.with(activity) - .permission(Permission.ACCESS_FINE_LOCATION) - .permission(Permission.ACCESS_COARSE_LOCATION) - .request(object : PermissionCallback() { - override fun onGranted( - permissions: MutableList?, - all: Boolean - ) { - if (all) { - callback.invoke(origin, true, true) - } - } - }) - } - - override fun onCancel(dialog: BaseDialog?) { - callback.invoke(origin, false, true) - } - }) - .show() - } - - override fun onShowFileChooser(webView: WebView, callback: ValueCallback>, params: FileChooserParams): Boolean { - val activity: Activity? = this.webView.getActivity() - if (activity !is BaseActivity) { - return false - } - XXPermissions.with(activity) - .permission(*Permission.Group.STORAGE) - .request(object : PermissionCallback() { - override fun onGranted(permissions: MutableList, all: Boolean) { - if (all) { - openSystemFileChooser(activity, params, callback) - } - } - - override fun onDenied(permissions: MutableList, never: Boolean) { - super.onDenied(permissions, never) - callback.onReceiveValue(null) - } - }) - return true - } - - private fun openSystemFileChooser(activity: BaseActivity, params: FileChooserParams, callback: ValueCallback>) { + private fun openSystemFileChooser( + activity: BaseActivity, + params: FileChooserParams, + callback: ValueCallback> + ) { val intent: Intent = params.createIntent() val mimeTypes: Array? = params.acceptTypes val multipleSelect: Boolean = params.mode == FileChooserParams.MODE_OPEN_MULTIPLE @@ -337,26 +332,28 @@ class BrowserView @JvmOverloads constructor( } intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, multipleSelect) - activity.startActivityForResult(Intent.createChooser(intent, params.title), object : OnActivityCallback { + activity.startActivityForResult( + Intent.createChooser(intent, params.title), + object : OnActivityCallback { - override fun onActivityResult(resultCode: Int, data: Intent?) { - val uris: MutableList = ArrayList() - if (resultCode == Activity.RESULT_OK && data != null) { - val uri = data.data - if (uri != null) { - uris.add(uri) - } else { - val clipData = data.clipData - if (clipData != null) { - for (i in 0 until clipData.itemCount) { - uris.add(clipData.getItemAt(i).uri) + override fun onActivityResult(resultCode: Int, data: Intent?) { + val uris: MutableList = ArrayList() + if (resultCode == Activity.RESULT_OK && data != null) { + val uri = data.data + if (uri != null) { + uris.add(uri) + } else { + val clipData = data.clipData + if (clipData != null) { + for (i in 0 until clipData.itemCount) { + uris.add(clipData.getItemAt(i).uri) + } } } } + callback.onReceiveValue(uris.toTypedArray()) } - callback.onReceiveValue(uris.toTypedArray()) - } - }) + }) } } } \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/CustomClickableSpan.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/CustomClickableSpan.kt new file mode 100644 index 0000000..11e0719 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/CustomClickableSpan.kt @@ -0,0 +1,18 @@ +package com.localee.mireo.app.widget + +import android.graphics.Color +import android.text.TextPaint +import android.text.style.ClickableSpan +import android.view.View + +class CustomClickableSpan ( + private val color: Int = Color.BLUE, + private val onClick: () -> Unit +) : ClickableSpan() { + override fun onClick(widget: View) = onClick() + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = color + ds.isUnderlineText = true + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/MenuDialog.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/MenuDialog.kt new file mode 100644 index 0000000..747269d --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/MenuDialog.kt @@ -0,0 +1,191 @@ +package com.hjq.demo.ui.dialog + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.annotation.StringRes +import androidx.recyclerview.widget.RecyclerView +import com.localee.mireo.app.base.BaseAdapter +import com.localee.mireo.app.base.BaseDialog +import com.localee.mireo.app.base.action.AnimAction +import com.localee.mireo.shortapp.R +import com.localee.mireo.app.app.AppAdapter +import com.localee.mireo.app.utils.singleClick + +class MenuDialog { + + class Builder(context: Context) : BaseDialog.Builder(context), + BaseAdapter.OnItemClickListener, View.OnLayoutChangeListener, Runnable { + + private val recyclerView: RecyclerView? by lazy { findViewById(R.id.rv_menu_list) } + private val cancelView: TextView? by lazy { findViewById(R.id.tv_menu_cancel) } + + private val adapter: MenuAdapter + private var listener: OnListener? = null + private var autoDismiss = true + + init { + setContentView(R.layout.menu_dialog) + setAnimStyle(AnimAction.ANIM_BOTTOM) + setOnClickListener(cancelView) + adapter = MenuAdapter(getContext()) + adapter.setOnItemClickListener(this) + recyclerView?.adapter = adapter + } + + override fun setGravity(gravity: Int): Builder = apply { + when (gravity) { + Gravity.CENTER, Gravity.CENTER_VERTICAL -> { + setCancel(null) + setAnimStyle(AnimAction.ANIM_SCALE) + } + } + super.setGravity(gravity) + } + + fun setList(vararg ids: Int): Builder = apply { + val data: MutableList = ArrayList(ids.size) + for (id in ids) { + data.add(getString(id)!!) + } + setList(data) + } + + fun setList(vararg data: String): Builder = apply { + setList(mutableListOf(*data)) + } + + @Suppress("UNCHECKED_CAST") + fun setList(data: MutableList): Builder = apply { + adapter.setData(data as MutableList) + recyclerView?.addOnLayoutChangeListener(this) + } + + fun setCancel(@StringRes id: Int): Builder = apply { + setCancel(getString(id)) + } + + fun setCancel(text: CharSequence?): Builder = apply { + cancelView?.text = text + } + + fun setSelectPosition(selectPosition: Int): Builder = apply { + adapter.selectPosition = selectPosition + } + + fun setAutoDismiss(dismiss: Boolean): Builder = apply { + autoDismiss = dismiss + } + + @Suppress("UNCHECKED_CAST") + fun setListener(listener: OnListener?): Builder = apply { + this.listener = listener as OnListener? + } + + override fun onClick(view: View) { + singleClick { + if (autoDismiss) { + dismiss() + } + if (view === cancelView) { + listener?.onCancel(getDialog()) + } + } + } + + /** + * [BaseAdapter.OnItemClickListener] + */ + override fun onItemClick(recyclerView: RecyclerView?, itemView: View?, position: Int) { + if (autoDismiss) { + dismiss() + } + listener?.onSelected(getDialog(), position, adapter.getItem(position)) + } + + /** + * [View.OnLayoutChangeListener] + */ + override fun onLayoutChange( + v: View, + left: Int, + top: Int, + right: Int, + bottom: Int, + oldLeft: Int, + oldTop: Int, + oldRight: Int, + oldBottom: Int + ) { + recyclerView?.removeOnLayoutChangeListener(this) + post(this) + } + + override fun run() { + val params = recyclerView?.layoutParams ?: return + recyclerView?.let { + val maxHeight = getScreenHeight() / 4 * 3 + if (it.height > maxHeight) { + if (params.height != maxHeight) { + params.height = maxHeight + it.layoutParams = params + } + return + } + if (params.height != ViewGroup.LayoutParams.WRAP_CONTENT) { + params.height = ViewGroup.LayoutParams.WRAP_CONTENT + it.layoutParams = params + } + } + } + + private fun getScreenHeight(): Int { + val resources = getResources() + val outMetrics = resources.displayMetrics + return outMetrics.heightPixels + } + } + + class MenuAdapter(context: Context) : AppAdapter(context) { + + var selectPosition = -1 + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder() + } + + inner class ViewHolder : AppViewHolder(R.layout.menu_item) { + + private val textView: TextView? by lazy { findViewById(R.id.tv_menu_text) } + private val lineView: View? by lazy { findViewById(R.id.v_menu_line) } + + override fun onBindView(position: Int) { + textView?.text = getItem(position).toString() + if (position == selectPosition){ + textView?.setTextColor(getColor(R.color.example_color_F56490)) + } + + if (position == 0) { + if (getCount() == 1) { + lineView?.visibility = View.GONE + } else { + lineView?.visibility = View.VISIBLE + } + } else if (position == getCount() - 1) { + lineView?.visibility = View.GONE + } else { + lineView?.visibility = View.VISIBLE + } + } + } + } + + interface OnListener { + + fun onSelected(dialog: BaseDialog?, position: Int, data: T) + + fun onCancel(dialog: BaseDialog?) {} + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/PasswordView.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/PasswordView.kt index a4cd3a0..f10fd72 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/PasswordView.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/PasswordView.kt @@ -7,7 +7,7 @@ import android.graphics.Paint import android.graphics.Path import android.util.AttributeSet import android.view.View -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R class PasswordView @JvmOverloads constructor (context: Context?, attrs: AttributeSet? = null, diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/StatusLayout.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/StatusLayout.kt index ecf1a44..5471f60 100644 --- a/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/StatusLayout.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/StatusLayout.kt @@ -11,7 +11,7 @@ import androidx.annotation.DrawableRes import androidx.annotation.RawRes import androidx.annotation.StringRes import androidx.core.content.ContextCompat -import com.localee.mireo.app.R +import com.localee.mireo.shortapp.R class StatusLayout @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, @@ -34,6 +34,19 @@ class StatusLayout @JvmOverloads constructor( if (isShow()) { return } + retryView!!.visibility = INVISIBLE + mainLayout!!.visibility = VISIBLE + } + + fun netWorkShow() { + if (mainLayout == null) { + initLayout() + } + if (isShow()) { + return + } + setIcon(R.mipmap.ic_network) + setHint("Network anomaly") retryView!!.visibility = if (listener == null) INVISIBLE else VISIBLE mainLayout!!.visibility = VISIBLE } diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/CustomViewStub.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/CustomViewStub.kt similarity index 96% rename from Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/CustomViewStub.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/CustomViewStub.kt index a1a94f3..ca96b96 100644 --- a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/CustomViewStub.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/CustomViewStub.kt @@ -1,11 +1,11 @@ -package com.hjq.widget.layout +package com.localee.mireo.app.widget.layout import android.content.* import android.content.res.TypedArray import android.util.AttributeSet import android.view.* import android.widget.FrameLayout -import com.hjq.widget.R +import com.localee.mireo.shortapp.R class CustomViewStub @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedLinearLayout.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/NestedLinearLayout.kt similarity index 99% rename from Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedLinearLayout.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/NestedLinearLayout.kt index 12a7015..c175f28 100644 --- a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedLinearLayout.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/NestedLinearLayout.kt @@ -1,4 +1,4 @@ -package com.hjq.widget.layout +package com.localee.mireo.app.widget.layout import android.content.Context import android.util.AttributeSet diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedScrollWebView.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/NestedScrollWebView.kt similarity index 99% rename from Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedScrollWebView.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/NestedScrollWebView.kt index d6a3cc1..df9e829 100644 --- a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedScrollWebView.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/NestedScrollWebView.kt @@ -1,4 +1,4 @@ -package com.hjq.widget.layout +package com.localee.mireo.app.widget.layout import android.content.Context import android.util.AttributeSet diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedViewPager.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/NestedViewPager.kt similarity index 98% rename from Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedViewPager.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/NestedViewPager.kt index 0fbb8f0..2f846e7 100644 --- a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedViewPager.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/NestedViewPager.kt @@ -1,4 +1,4 @@ -package com.hjq.widget.layout +package com.localee.mireo.app.widget.layout import android.content.Context import android.util.AttributeSet diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NoScrollViewPager.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/NoScrollViewPager.kt similarity index 94% rename from Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NoScrollViewPager.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/NoScrollViewPager.kt index 992f928..60c1caf 100644 --- a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NoScrollViewPager.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/NoScrollViewPager.kt @@ -1,4 +1,4 @@ -package com.hjq.widget.layout +package com.localee.mireo.app.widget.layout import android.content.Context import android.util.AttributeSet diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/SettingBar.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/SettingBar.kt similarity index 99% rename from Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/SettingBar.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/SettingBar.kt index 2e0e9a3..6c86d7e 100644 --- a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/SettingBar.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/SettingBar.kt @@ -1,4 +1,4 @@ -package com.hjq.widget.layout +package com.localee.mireo.app.widget.layout import android.content.Context import android.content.res.TypedArray @@ -19,7 +19,7 @@ import androidx.annotation.ColorInt import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.core.content.ContextCompat -import com.hjq.widget.R +import com.localee.mireo.shortapp.R class SettingBar @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, defStyleRes: Int = 0) : diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/WrapRecyclerView.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/WrapRecyclerView.kt similarity index 99% rename from Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/WrapRecyclerView.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/WrapRecyclerView.kt index 34e89a2..52e1503 100644 --- a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/WrapRecyclerView.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/layout/WrapRecyclerView.kt @@ -1,4 +1,4 @@ -package com.hjq.widget.layout +package com.localee.mireo.app.widget.layout import android.content.Context import android.util.AttributeSet diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/ClearEditText.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/ClearEditText.kt similarity index 97% rename from Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/ClearEditText.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/ClearEditText.kt index 4232e5d..3d7e607 100644 --- a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/ClearEditText.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/ClearEditText.kt @@ -1,4 +1,4 @@ -package com.hjq.widget.view +package com.localee.mireo.app.widget.view import android.content.Context import android.graphics.drawable.Drawable @@ -12,7 +12,7 @@ import android.view.View.OnFocusChangeListener import android.view.View.OnTouchListener import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat -import com.hjq.widget.R +import com.localee.mireo.shortapp.R @Suppress("ClickableViewAccessibility") class ClearEditText @JvmOverloads constructor( diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/CountdownView.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/CountdownView.kt similarity index 96% rename from Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/CountdownView.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/CountdownView.kt index 75cdcd7..2f0d6b1 100644 --- a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/CountdownView.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/CountdownView.kt @@ -1,4 +1,4 @@ -package com.hjq.widget.view +package com.localee.mireo.app.widget.view import android.content.Context import android.util.AttributeSet diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PasswordEditText.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/PasswordEditText.kt similarity index 98% rename from Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PasswordEditText.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/PasswordEditText.kt index e13a5ac..45bbdbc 100644 --- a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PasswordEditText.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/PasswordEditText.kt @@ -1,4 +1,4 @@ -package com.hjq.widget.view +package com.localee.mireo.app.widget.view import android.content.Context import android.graphics.drawable.Drawable @@ -15,7 +15,7 @@ import android.view.View.OnFocusChangeListener import android.view.View.OnTouchListener import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat -import com.hjq.widget.R +import com.localee.mireo.shortapp.R @Suppress("ClickableViewAccessibility") class PasswordEditText @JvmOverloads constructor( diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PlayButton.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/PlayButton.kt similarity index 99% rename from Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PlayButton.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/PlayButton.kt index c11f879..efcc4eb 100644 --- a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PlayButton.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/PlayButton.kt @@ -1,4 +1,4 @@ -package com.hjq.widget.view +package com.localee.mireo.app.widget.view import android.animation.ValueAnimator import android.content.* @@ -7,7 +7,7 @@ import android.graphics.* import android.util.AttributeSet import android.view.* import android.view.animation.AnticipateInterpolator -import com.hjq.widget.R +import com.localee.mireo.shortapp.R class PlayButton @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PressAlphaTextView.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/PressAlphaTextView.kt similarity index 91% rename from Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PressAlphaTextView.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/PressAlphaTextView.kt index c237404..9811382 100644 --- a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PressAlphaTextView.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/PressAlphaTextView.kt @@ -1,4 +1,4 @@ -package com.hjq.widget.view +package com.localee.mireo.app.widget.view import android.content.Context import android.util.AttributeSet diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/RegexEditText.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/RegexEditText.kt similarity index 98% rename from Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/RegexEditText.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/RegexEditText.kt index f3d9a78..a1f79fa 100644 --- a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/RegexEditText.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/RegexEditText.kt @@ -1,11 +1,11 @@ -package com.hjq.widget.view +package com.localee.mireo.app.widget.view import android.content.* import android.content.res.TypedArray import android.text.* import android.util.AttributeSet import androidx.appcompat.widget.AppCompatEditText -import com.hjq.widget.R +import com.localee.mireo.shortapp.R import java.util.regex.Pattern open class RegexEditText @JvmOverloads constructor( diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/ScaleImageView.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/ScaleImageView.kt similarity index 91% rename from Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/ScaleImageView.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/ScaleImageView.kt index ceced7b..da90a1c 100644 --- a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/ScaleImageView.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/ScaleImageView.kt @@ -1,10 +1,10 @@ -package com.hjq.widget.view +package com.localee.mireo.app.widget.view import android.content.* import android.content.res.TypedArray import android.util.AttributeSet import androidx.appcompat.widget.AppCompatImageView -import com.hjq.widget.R +import com.localee.mireo.shortapp.R class ScaleImageView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/SimpleRatingBar.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/SimpleRatingBar.kt new file mode 100644 index 0000000..00f44a6 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/SimpleRatingBar.kt @@ -0,0 +1,212 @@ +package com.localee.mireo.app.widget.view + +import android.content.Context +import android.content.res.TypedArray +import android.graphics.Canvas +import android.graphics.Rect +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.view.MotionEvent +import android.view.View +import androidx.annotation.DrawableRes +import androidx.core.content.ContextCompat +import com.localee.mireo.shortapp.R +import kotlin.math.max +import kotlin.math.min + +class SimpleRatingBar @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : + View(context, attrs, defStyleAttr) { + + private var normalDrawable: Drawable + + private var fillDrawable: Drawable + + private var halfDrawable: Drawable? + + private var currentGrade: Float + + private var gradeCount: Int + + private var gradeWidth: Int + + private var gradeHeight: Int + + private var gradeSpace: Int + + private var gradeStep: GradleStep? = null + + private var listener: OnRatingChangeListener? = null + + private val gradeBounds: Rect = Rect() + + init { + val array: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.SimpleRatingBar) + normalDrawable = ContextCompat.getDrawable(getContext(), array.getResourceId( + R.styleable.SimpleRatingBar_normalDrawable, R.drawable.rating_star_off_ic))!! + halfDrawable = ContextCompat.getDrawable(getContext(), array.getResourceId( + R.styleable.SimpleRatingBar_halfDrawable, R.drawable.rating_star_half_ic)) + fillDrawable = ContextCompat.getDrawable(getContext(), array.getResourceId( + R.styleable.SimpleRatingBar_fillDrawable, R.drawable.rating_star_fill_ic))!! + + if ((normalDrawable.intrinsicWidth != fillDrawable.intrinsicWidth) || ( + normalDrawable.intrinsicWidth != halfDrawable?.intrinsicWidth) || ( + normalDrawable.intrinsicHeight != fillDrawable.intrinsicHeight) || ( + normalDrawable.intrinsicHeight != halfDrawable?.intrinsicHeight)) { + throw IllegalStateException("The width and height of the picture do not agree") + } + currentGrade = array.getFloat(R.styleable.SimpleRatingBar_grade, 0f) + gradeCount = array.getInt(R.styleable.SimpleRatingBar_gradeCount, 5) + gradeWidth = array.getDimensionPixelSize(R.styleable.SimpleRatingBar_gradeWidth, normalDrawable.intrinsicWidth) + gradeHeight = array.getDimensionPixelSize(R.styleable.SimpleRatingBar_gradeHeight, fillDrawable.intrinsicHeight) + gradeSpace = array.getDimension(R.styleable.SimpleRatingBar_gradeSpace, gradeWidth / 4f).toInt() + gradeStep = when (array.getInt(R.styleable.SimpleRatingBar_gradeStep, 0)) { + 0x01 -> GradleStep.ONE + 0x00 -> GradleStep.HALF + else -> GradleStep.HALF + } + array.recycle() + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val measuredWidth: Int = (gradeWidth * gradeCount) + (gradeSpace * (gradeCount + 1)) + val measuredHeight: Int = gradeHeight + setMeasuredDimension(measuredWidth + paddingLeft + paddingRight, + measuredHeight + paddingTop + paddingBottom) + } + + @Suppress("ClickableViewAccessibility") + override fun onTouchEvent(event: MotionEvent): Boolean { + if (!isEnabled) { + return false + } + when (event.action) { + MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE -> { + var grade = 0f + val distance: Float = event.x - paddingLeft - gradeSpace + if (distance > 0) { + grade = distance / (gradeWidth + gradeSpace) + } + + grade = min(max(grade, 0f), gradeCount.toFloat()) + + if (grade - grade.toInt() > 0) { + grade = if (grade - grade.toInt() > 0.5f) { + (grade + 0.5f).toInt().toFloat() + } else { + grade.toInt() + 0.5f + } + } + if (grade * 10 != currentGrade * 10) { + currentGrade = grade + invalidate() + listener?.onRatingChanged(this, currentGrade, true) + } + } + } + return true + } + + override fun onDraw(canvas: Canvas) { + for (i in 0 until gradeCount) { + val start: Int = gradeSpace + (gradeWidth + gradeSpace) * i + gradeBounds.left = paddingLeft + start + gradeBounds.top = paddingTop + gradeBounds.right = gradeBounds.left + gradeWidth + gradeBounds.bottom = gradeBounds.top + gradeHeight + if (currentGrade > i) { + if ((halfDrawable != null) && (gradeStep == GradleStep.HALF) && ( + currentGrade.toInt() == i) && (currentGrade - currentGrade.toInt() == 0.5f)) { + halfDrawable!!.bounds = gradeBounds + halfDrawable!!.draw(canvas) + } else { + fillDrawable.bounds = gradeBounds + fillDrawable.draw(canvas) + } + } else { + normalDrawable.bounds = gradeBounds + normalDrawable.draw(canvas) + } + } + } + + fun setRatingDrawable(@DrawableRes normalDrawableId: Int, @DrawableRes halfDrawableId: Int, @DrawableRes fillDrawableId: Int) { + setRatingDrawable(ContextCompat.getDrawable(context, normalDrawableId)!!, + ContextCompat.getDrawable(context, halfDrawableId), + ContextCompat.getDrawable(context, fillDrawableId)!!) + } + + fun setRatingDrawable(normalDrawable: Drawable, halfDrawable: Drawable?, fillDrawable: Drawable) { + + // 两张图片的宽高不一致 + if (normalDrawable.intrinsicWidth != fillDrawable.intrinsicWidth || + normalDrawable.intrinsicHeight != fillDrawable.intrinsicHeight) { + throw IllegalStateException("The width and height of the picture do not agree") + } + this.normalDrawable = normalDrawable + this.halfDrawable = halfDrawable + this.fillDrawable = fillDrawable + gradeWidth = this.normalDrawable.intrinsicWidth + gradeHeight = this.normalDrawable.intrinsicHeight + requestLayout() + } + + fun getGrade(): Float { + return currentGrade + } + + fun setGrade(grade: Float) { + var finalGrade: Float = grade + if (finalGrade > gradeCount) { + finalGrade = gradeCount.toFloat() + } + if (finalGrade - finalGrade.toInt() != 0.5f || finalGrade - finalGrade.toInt() > 0) { + throw IllegalArgumentException("grade must be a multiple of 0.5f") + } + currentGrade = finalGrade + invalidate() + listener?.onRatingChanged(this, currentGrade, false) + } + + fun getGradeCount(): Int { + return gradeCount + } + + fun setGradeCount(count: Int) { + if (count > currentGrade) { + currentGrade = count.toFloat() + } + gradeCount = count + invalidate() + } + + fun setGradeSpace(space: Int) { + gradeSpace = space + requestLayout() + } + + fun setGradeStep(step: GradleStep?) { + gradeStep = step + invalidate() + } + + fun getGradeStep(): GradleStep? { + return gradeStep + } + + fun setOnRatingBarChangeListener(listener: OnRatingChangeListener?) { + this.listener = listener + } + + enum class GradleStep { + + HALF, + + ONE + } + + interface OnRatingChangeListener { + + fun onRatingChanged(ratingBar: SimpleRatingBar, grade: Float, touch: Boolean) + } +} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/SmartTextView.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/SmartTextView.kt similarity index 97% rename from Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/SmartTextView.kt rename to Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/SmartTextView.kt index a0a4083..22574c2 100644 --- a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/SmartTextView.kt +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/view/SmartTextView.kt @@ -1,4 +1,4 @@ -package com.hjq.widget.view +package com.localee.mireo.app.widget.view import android.content.* import android.graphics.drawable.Drawable diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw1024dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw1024dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw1024dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw1024dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw1024dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw1024dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw1024dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw1024dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw1280dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw1280dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw1280dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw1280dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw1280dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw1280dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw1280dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw1280dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw1365dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw1365dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw1365dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw1365dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw1365dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw1365dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw1365dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw1365dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw240dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw240dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw240dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw240dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw240dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw240dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw240dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw240dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw320dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw320dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw320dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw320dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw320dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw320dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw320dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw320dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw360dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw360dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw360dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw360dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw360dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw360dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw360dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw360dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw362dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw362dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw362dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw362dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw362dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw362dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw362dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw362dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw384dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw384dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw384dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw384dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw384dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw384dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw384dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw384dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw392dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw392dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw392dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw392dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw392dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw392dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw392dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw392dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw400dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw400dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw400dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw400dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw400dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw400dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw400dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw400dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw410dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw410dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw410dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw410dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw410dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw410dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw410dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw410dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw411dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw411dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw411dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw411dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw411dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw411dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw411dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw411dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw432dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw432dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw432dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw432dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw432dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw432dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw432dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw432dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw480dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw480dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw480dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw480dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw480dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw480dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw480dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw480dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw533dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw533dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw533dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw533dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw533dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw533dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw533dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw533dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw540dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw540dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw540dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw540dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw540dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw540dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw540dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw540dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw592dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw592dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw592dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw592dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw592dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw592dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw592dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw592dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw600dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw600dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw600dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw600dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw600dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw600dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw600dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw600dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw640dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw640dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw640dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw640dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw640dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw640dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw640dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw640dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw662dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw662dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw662dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw662dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw662dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw662dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw662dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw662dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw720dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw720dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw720dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw720dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw720dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw720dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw720dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw720dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw768dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw768dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw768dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw768dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw768dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw768dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw768dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw768dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw800dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw800dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw800dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw800dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw800dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw800dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw800dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw800dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw811dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw811dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw811dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw811dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw811dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw811dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw811dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw811dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw820dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw820dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw820dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw820dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw820dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw820dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw820dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw820dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw960dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw960dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw960dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw960dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw960dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw960dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw960dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw960dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw961dp/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values-sw961dp/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw961dp/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw961dp/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw961dp/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values-sw961dp/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values-sw961dp/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values-sw961dp/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values/dimens_dp.xml b/Android_Mireo/app/src/main/res-sw/values/dimens_dp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values/dimens_dp.xml rename to Android_Mireo/app/src/main/res-sw/values/dimens_dp.xml diff --git a/Android_Mireo/library/base/src/main/res-sw/values/dimens_sp.xml b/Android_Mireo/app/src/main/res-sw/values/dimens_sp.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res-sw/values/dimens_sp.xml rename to Android_Mireo/app/src/main/res-sw/values/dimens_sp.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/layout_fall_down.xml b/Android_Mireo/app/src/main/res/anim/layout_fall_down.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/layout_fall_down.xml rename to Android_Mireo/app/src/main/res/anim/layout_fall_down.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/layout_fall_down_item.xml b/Android_Mireo/app/src/main/res/anim/layout_fall_down_item.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/layout_fall_down_item.xml rename to Android_Mireo/app/src/main/res/anim/layout_fall_down_item.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/layout_from_bottom.xml b/Android_Mireo/app/src/main/res/anim/layout_from_bottom.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/layout_from_bottom.xml rename to Android_Mireo/app/src/main/res/anim/layout_from_bottom.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/layout_from_bottom_item.xml b/Android_Mireo/app/src/main/res/anim/layout_from_bottom_item.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/layout_from_bottom_item.xml rename to Android_Mireo/app/src/main/res/anim/layout_from_bottom_item.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/layout_from_right.xml b/Android_Mireo/app/src/main/res/anim/layout_from_right.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/layout_from_right.xml rename to Android_Mireo/app/src/main/res/anim/layout_from_right.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/layout_from_right_item.xml b/Android_Mireo/app/src/main/res/anim/layout_from_right_item.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/layout_from_right_item.xml rename to Android_Mireo/app/src/main/res/anim/layout_from_right_item.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/window_bottom_in.xml b/Android_Mireo/app/src/main/res/anim/window_bottom_in.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/window_bottom_in.xml rename to Android_Mireo/app/src/main/res/anim/window_bottom_in.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/window_bottom_out.xml b/Android_Mireo/app/src/main/res/anim/window_bottom_out.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/window_bottom_out.xml rename to Android_Mireo/app/src/main/res/anim/window_bottom_out.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/window_ios_in.xml b/Android_Mireo/app/src/main/res/anim/window_ios_in.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/window_ios_in.xml rename to Android_Mireo/app/src/main/res/anim/window_ios_in.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/window_ios_out.xml b/Android_Mireo/app/src/main/res/anim/window_ios_out.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/window_ios_out.xml rename to Android_Mireo/app/src/main/res/anim/window_ios_out.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/window_left_in.xml b/Android_Mireo/app/src/main/res/anim/window_left_in.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/window_left_in.xml rename to Android_Mireo/app/src/main/res/anim/window_left_in.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/window_left_out.xml b/Android_Mireo/app/src/main/res/anim/window_left_out.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/window_left_out.xml rename to Android_Mireo/app/src/main/res/anim/window_left_out.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/window_right_in.xml b/Android_Mireo/app/src/main/res/anim/window_right_in.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/window_right_in.xml rename to Android_Mireo/app/src/main/res/anim/window_right_in.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/window_right_out.xml b/Android_Mireo/app/src/main/res/anim/window_right_out.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/window_right_out.xml rename to Android_Mireo/app/src/main/res/anim/window_right_out.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/window_scale_in.xml b/Android_Mireo/app/src/main/res/anim/window_scale_in.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/window_scale_in.xml rename to Android_Mireo/app/src/main/res/anim/window_scale_in.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/window_scale_out.xml b/Android_Mireo/app/src/main/res/anim/window_scale_out.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/window_scale_out.xml rename to Android_Mireo/app/src/main/res/anim/window_scale_out.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/window_top_in.xml b/Android_Mireo/app/src/main/res/anim/window_top_in.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/window_top_in.xml rename to Android_Mireo/app/src/main/res/anim/window_top_in.xml diff --git a/Android_Mireo/library/base/src/main/res/anim/window_top_out.xml b/Android_Mireo/app/src/main/res/anim/window_top_out.xml similarity index 100% rename from Android_Mireo/library/base/src/main/res/anim/window_top_out.xml rename to Android_Mireo/app/src/main/res/anim/window_top_out.xml diff --git a/Android_Mireo/app/src/main/res/drawable/bg_example_text_think_again.xml b/Android_Mireo/app/src/main/res/drawable/bg_example_text_think_again.xml index 794e760..0078b71 100644 --- a/Android_Mireo/app/src/main/res/drawable/bg_example_text_think_again.xml +++ b/Android_Mireo/app/src/main/res/drawable/bg_example_text_think_again.xml @@ -2,7 +2,7 @@ - + diff --git a/Android_Mireo/library/widget/src/main/res/drawable/input_delete_ic.xml b/Android_Mireo/app/src/main/res/drawable/input_delete_ic.xml similarity index 100% rename from Android_Mireo/library/widget/src/main/res/drawable/input_delete_ic.xml rename to Android_Mireo/app/src/main/res/drawable/input_delete_ic.xml diff --git a/Android_Mireo/library/widget/src/main/res/drawable/password_off_ic.xml b/Android_Mireo/app/src/main/res/drawable/password_off_ic.xml similarity index 100% rename from Android_Mireo/library/widget/src/main/res/drawable/password_off_ic.xml rename to Android_Mireo/app/src/main/res/drawable/password_off_ic.xml diff --git a/Android_Mireo/library/widget/src/main/res/drawable/password_on_ic.xml b/Android_Mireo/app/src/main/res/drawable/password_on_ic.xml similarity index 100% rename from Android_Mireo/library/widget/src/main/res/drawable/password_on_ic.xml rename to Android_Mireo/app/src/main/res/drawable/password_on_ic.xml diff --git a/Android_Mireo/app/src/main/res/drawable/progress_vip_bg.xml b/Android_Mireo/app/src/main/res/drawable/progress_vip_bg.xml new file mode 100644 index 0000000..e1c94e4 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/progress_vip_bg.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/res/drawable/rating_star_fill_ic.xml b/Android_Mireo/app/src/main/res/drawable/rating_star_fill_ic.xml similarity index 100% rename from Android_Mireo/library/widget/src/main/res/drawable/rating_star_fill_ic.xml rename to Android_Mireo/app/src/main/res/drawable/rating_star_fill_ic.xml diff --git a/Android_Mireo/library/widget/src/main/res/drawable/rating_star_half_ic.xml b/Android_Mireo/app/src/main/res/drawable/rating_star_half_ic.xml similarity index 100% rename from Android_Mireo/library/widget/src/main/res/drawable/rating_star_half_ic.xml rename to Android_Mireo/app/src/main/res/drawable/rating_star_half_ic.xml diff --git a/Android_Mireo/library/widget/src/main/res/drawable/rating_star_off_ic.xml b/Android_Mireo/app/src/main/res/drawable/rating_star_off_ic.xml similarity index 100% rename from Android_Mireo/library/widget/src/main/res/drawable/rating_star_off_ic.xml rename to Android_Mireo/app/src/main/res/drawable/rating_star_off_ic.xml diff --git a/Android_Mireo/app/src/main/res/layout/about_activity.xml b/Android_Mireo/app/src/main/res/layout/about_activity.xml index 2c6b06e..02f40be 100644 --- a/Android_Mireo/app/src/main/res/layout/about_activity.xml +++ b/Android_Mireo/app/src/main/res/layout/about_activity.xml @@ -6,8 +6,7 @@ android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical" - android:background="@color/black121418" - tools:context=".ui.activity.AboutActivity"> + android:background="@color/black121418"> - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/activity_feedback.xml b/Android_Mireo/app/src/main/res/layout/activity_feedback.xml new file mode 100644 index 0000000..97dbdfe --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/activity_feedback.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/activity_feedback_details.xml b/Android_Mireo/app/src/main/res/layout/activity_feedback_details.xml new file mode 100644 index 0000000..a9701a4 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/activity_feedback_details.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/activity_feedback_list.xml b/Android_Mireo/app/src/main/res/layout/activity_feedback_list.xml new file mode 100644 index 0000000..dcb1424 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/activity_feedback_list.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/activity_language_switch.xml b/Android_Mireo/app/src/main/res/layout/activity_language_switch.xml new file mode 100644 index 0000000..5498202 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/activity_language_switch.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/activity_my_vip.xml b/Android_Mireo/app/src/main/res/layout/activity_my_vip.xml new file mode 100644 index 0000000..e4c2b08 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/activity_my_vip.xml @@ -0,0 +1,277 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/activity_my_wallet.xml b/Android_Mireo/app/src/main/res/layout/activity_my_wallet.xml new file mode 100644 index 0000000..88b9cd2 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/activity_my_wallet.xml @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/activity_store.xml b/Android_Mireo/app/src/main/res/layout/activity_store.xml new file mode 100644 index 0000000..1e8f643 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/activity_store.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/browser_activity.xml b/Android_Mireo/app/src/main/res/layout/browser_activity.xml index 36e6138..533f5df 100644 --- a/Android_Mireo/app/src/main/res/layout/browser_activity.xml +++ b/Android_Mireo/app/src/main/res/layout/browser_activity.xml @@ -5,8 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:background="#121418" - tools:context=".ui.activity.BrowserActivity"> + android:background="#121418"> + android:layout_height="match_parent"> + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/dialog_google_play_rating.xml b/Android_Mireo/app/src/main/res/layout/dialog_google_play_rating.xml new file mode 100644 index 0000000..4a3d86b --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/dialog_google_play_rating.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/dialog_home_history.xml b/Android_Mireo/app/src/main/res/layout/dialog_home_history.xml new file mode 100644 index 0000000..389db3f --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/dialog_home_history.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/dialog_notification_permission.xml b/Android_Mireo/app/src/main/res/layout/dialog_notification_permission.xml new file mode 100644 index 0000000..e81a975 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/dialog_notification_permission.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/dialog_recharge_fragment.xml b/Android_Mireo/app/src/main/res/layout/dialog_recharge_fragment.xml new file mode 100644 index 0000000..895418e --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/dialog_recharge_fragment.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/example_emptyview.xml b/Android_Mireo/app/src/main/res/layout/example_emptyview.xml index 9710a35..4ee861d 100644 --- a/Android_Mireo/app/src/main/res/layout/example_emptyview.xml +++ b/Android_Mireo/app/src/main/res/layout/example_emptyview.xml @@ -12,6 +12,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="180dp" + android:src="@mipmap/status_nothing" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -24,6 +25,7 @@ android:text="@string/example_no_content_for_the_time_being" android:textColor="@color/white" android:textSize="16sp" + android:visibility="gone" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/example_iv_empty" /> diff --git a/Android_Mireo/app/src/main/res/layout/example_item_num_data.xml b/Android_Mireo/app/src/main/res/layout/example_item_num_data.xml index 6ad9caf..f7add2d 100644 --- a/Android_Mireo/app/src/main/res/layout/example_item_num_data.xml +++ b/Android_Mireo/app/src/main/res/layout/example_item_num_data.xml @@ -31,4 +31,14 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/example_network_error.xml b/Android_Mireo/app/src/main/res/layout/example_network_error.xml index 4c8eff3..73af49f 100644 --- a/Android_Mireo/app/src/main/res/layout/example_network_error.xml +++ b/Android_Mireo/app/src/main/res/layout/example_network_error.xml @@ -10,6 +10,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="180dp" + android:src="@mipmap/ic_network" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -22,28 +23,33 @@ android:text="@string/example_no_network" android:textColor="@color/white" android:textSize="16sp" + android:visibility="gone" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/example_iv_empty" /> - + app:layout_constraintTop_toBottomOf="@id/example_tv_no_network" + app:shape_radius="@dimen/dp_20" + app:shape_strokeGradientEndColor="#F56490" + app:shape_strokeGradientStartColor="#EB8A64" + app:shape_strokeSize="@dimen/dp_1" /> \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/fragment_reward.xml b/Android_Mireo/app/src/main/res/layout/fragment_reward.xml new file mode 100644 index 0000000..57298ca --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/fragment_reward.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/home_activity.xml b/Android_Mireo/app/src/main/res/layout/home_activity.xml index 3086f2b..91f0792 100644 --- a/Android_Mireo/app/src/main/res/layout/home_activity.xml +++ b/Android_Mireo/app/src/main/res/layout/home_activity.xml @@ -1,17 +1,20 @@ - + android:background="@color/example_color_121418" + android:orientation="vertical"> - + app:layout_constraintBottom_toTopOf="@+id/rv_home_navigation" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - \ No newline at end of file + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/home_fragment.xml b/Android_Mireo/app/src/main/res/layout/home_fragment.xml index ddd2cf8..8d82ce7 100644 --- a/Android_Mireo/app/src/main/res/layout/home_fragment.xml +++ b/Android_Mireo/app/src/main/res/layout/home_fragment.xml @@ -1,77 +1,88 @@ - + android:background="#121418"> - + android:layout_height="match_parent"> - - - + android:layout_height="match_parent"> + android:layout_height="match_parent" + android:orientation="vertical"> - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - \ No newline at end of file + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/home_navigation_item.xml b/Android_Mireo/app/src/main/res/layout/home_navigation_item.xml index 52fd215..c705d36 100644 --- a/Android_Mireo/app/src/main/res/layout/home_navigation_item.xml +++ b/Android_Mireo/app/src/main/res/layout/home_navigation_item.xml @@ -7,8 +7,7 @@ android:gravity="center_horizontal" android:orientation="vertical" android:background="@color/black" - android:paddingVertical="@dimen/dp_5" - tools:context=".ui.adapter.NavigationAdapter"> + android:paddingVertical="@dimen/dp_5"> - \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/input_dialog.xml b/Android_Mireo/app/src/main/res/layout/input_dialog.xml index fd9dd74..63787c1 100644 --- a/Android_Mireo/app/src/main/res/layout/input_dialog.xml +++ b/Android_Mireo/app/src/main/res/layout/input_dialog.xml @@ -1,5 +1,5 @@ - \ No newline at end of file + android:textSize="@dimen/sp_14" /> \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/item_coin_buy.xml b/Android_Mireo/app/src/main/res/layout/item_coin_buy.xml new file mode 100644 index 0000000..eed25ba --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/item_coin_buy.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/item_home_top.xml b/Android_Mireo/app/src/main/res/layout/item_home_top.xml index 62c4532..42c3269 100644 --- a/Android_Mireo/app/src/main/res/layout/item_home_top.xml +++ b/Android_Mireo/app/src/main/res/layout/item_home_top.xml @@ -9,7 +9,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginEnd="@dimen/dp_9" - app:cardCornerRadius="8dp" + app:cardCornerRadius="@dimen/dp_8" app:cardElevation="0dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent"> diff --git a/Android_Mireo/app/src/main/res/layout/item_hot_banner_view.xml b/Android_Mireo/app/src/main/res/layout/item_hot_banner_view.xml new file mode 100644 index 0000000..a6a27d2 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/item_hot_banner_view.xml @@ -0,0 +1,32 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/item_language_switch.xml b/Android_Mireo/app/src/main/res/layout/item_language_switch.xml new file mode 100644 index 0000000..ba32251 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/item_language_switch.xml @@ -0,0 +1,50 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/item_list_tab.xml b/Android_Mireo/app/src/main/res/layout/item_list_tab.xml index d7ed117..a779167 100644 --- a/Android_Mireo/app/src/main/res/layout/item_list_tab.xml +++ b/Android_Mireo/app/src/main/res/layout/item_list_tab.xml @@ -78,7 +78,6 @@ android:layout_marginBottom="@dimen/dp_4" android:lineSpacingExtra="@dimen/dp_2" android:maxLines="2" - android:singleLine="true" android:text="Salvation Mispaid" android:textColor="@color/white" android:textSize="@dimen/sp_13" diff --git a/Android_Mireo/app/src/main/res/layout/item_search_girl.xml b/Android_Mireo/app/src/main/res/layout/item_search_girl.xml new file mode 100644 index 0000000..00b3f18 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/item_search_girl.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/item_vip_buy.xml b/Android_Mireo/app/src/main/res/layout/item_vip_buy.xml new file mode 100644 index 0000000..756c563 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/item_vip_buy.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/item_wallet_record.xml b/Android_Mireo/app/src/main/res/layout/item_wallet_record.xml new file mode 100644 index 0000000..7352cb8 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/item_wallet_record.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/layout_close_episode_recommend.xml b/Android_Mireo/app/src/main/res/layout/layout_close_episode_recommend.xml new file mode 100644 index 0000000..52f7327 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/layout_close_episode_recommend.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/layout_detail_player_view_controller.xml b/Android_Mireo/app/src/main/res/layout/layout_detail_player_view_controller.xml new file mode 100644 index 0000000..5c9fe95 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/layout_detail_player_view_controller.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/layout_lock_episode.xml b/Android_Mireo/app/src/main/res/layout/layout_lock_episode.xml new file mode 100644 index 0000000..06ef18d --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/layout_lock_episode.xml @@ -0,0 +1,56 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/menu_dialog.xml b/Android_Mireo/app/src/main/res/layout/menu_dialog.xml new file mode 100644 index 0000000..73f16bc --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/menu_dialog.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/menu_item.xml b/Android_Mireo/app/src/main/res/layout/menu_item.xml new file mode 100644 index 0000000..4b8abbd --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/menu_item.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/message_dialog.xml b/Android_Mireo/app/src/main/res/layout/message_dialog.xml index ea03cf5..0dbbf8a 100644 --- a/Android_Mireo/app/src/main/res/layout/message_dialog.xml +++ b/Android_Mireo/app/src/main/res/layout/message_dialog.xml @@ -9,6 +9,4 @@ android:gravity="center_horizontal" android:lineSpacingExtra="@dimen/dp_4" android:textColor="#333333" - android:textSize="@dimen/sp_14" - tools:context=".ui.dialog.MessageDialog" - tools:text="内容" /> \ No newline at end of file + android:textSize="@dimen/sp_14" /> \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/message_fragment.xml b/Android_Mireo/app/src/main/res/layout/message_fragment.xml index 864d94f..1fb5d89 100644 --- a/Android_Mireo/app/src/main/res/layout/message_fragment.xml +++ b/Android_Mireo/app/src/main/res/layout/message_fragment.xml @@ -5,8 +5,7 @@ android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:background="#121418" - android:orientation="vertical" - tools:context=".ui.fragment.MessageFragment"> + android:orientation="vertical"> - - - - - - - - - - - - - - - - - - - - + android:layout_height="match_parent"> - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/setting_activity.xml b/Android_Mireo/app/src/main/res/layout/setting_activity.xml index 93ebdd2..c89b5f3 100644 --- a/Android_Mireo/app/src/main/res/layout/setting_activity.xml +++ b/Android_Mireo/app/src/main/res/layout/setting_activity.xml @@ -5,8 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="#121418" - android:orientation="vertical" - tools:context=".ui.activity.SettingActivity"> + android:orientation="vertical"> - + + diff --git a/Android_Mireo/app/src/main/res/layout/splash_activity.xml b/Android_Mireo/app/src/main/res/layout/splash_activity.xml index 83dd830..265c33f 100644 --- a/Android_Mireo/app/src/main/res/layout/splash_activity.xml +++ b/Android_Mireo/app/src/main/res/layout/splash_activity.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - tools:context=".ui.activity.SplashActivity"> + android:id="@+id/frameLayout"> \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/status_activity.xml b/Android_Mireo/app/src/main/res/layout/status_activity.xml index 7abbee1..631e11a 100644 --- a/Android_Mireo/app/src/main/res/layout/status_activity.xml +++ b/Android_Mireo/app/src/main/res/layout/status_activity.xml @@ -1,12 +1,10 @@ + android:orientation="vertical"> + + + android:layout_marginHorizontal="@dimen/dp_5" /> diff --git a/Android_Mireo/app/src/main/res/layout/tab_item_design.xml b/Android_Mireo/app/src/main/res/layout/tab_item_design.xml index 4c53a74..f9eb417 100644 --- a/Android_Mireo/app/src/main/res/layout/tab_item_design.xml +++ b/Android_Mireo/app/src/main/res/layout/tab_item_design.xml @@ -5,8 +5,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" - android:paddingHorizontal="@dimen/dp_10" - tools:context=".ui.adapter.TabAdapter"> + android:paddingHorizontal="@dimen/dp_10"> + android:paddingHorizontal="@dimen/dp_3"> + app:cardElevation="0px"> + > - - + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/wait_dialog.xml b/Android_Mireo/app/src/main/res/layout/wait_dialog.xml index cbae7aa..7e90a68 100644 --- a/Android_Mireo/app/src/main/res/layout/wait_dialog.xml +++ b/Android_Mireo/app/src/main/res/layout/wait_dialog.xml @@ -1,43 +1,16 @@ - + android:background="@color/transparent" + > - - - - - - - - \ No newline at end of file + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/widget_player_view.xml b/Android_Mireo/app/src/main/res/layout/widget_player_view.xml deleted file mode 100644 index 2e7e0f0..0000000 --- a/Android_Mireo/app/src/main/res/layout/widget_player_view.xml +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/widget_status_layout.xml b/Android_Mireo/app/src/main/res/layout/widget_status_layout.xml index a6b9d49..6c39751 100644 --- a/Android_Mireo/app/src/main/res/layout/widget_status_layout.xml +++ b/Android_Mireo/app/src/main/res/layout/widget_status_layout.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_account_delete.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_account_delete.webp new file mode 100644 index 0000000..0f3a3d0 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_account_delete.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_account_delete_bg.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_account_delete_bg.webp new file mode 100644 index 0000000..99f0279 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_account_delete_bg.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_ads_episode.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_ads_episode.webp new file mode 100644 index 0000000..b8c5329 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_ads_episode.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_dialog_close.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_dialog_close.webp new file mode 100644 index 0000000..e1c99aa Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_dialog_close.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_dialog_history_play.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_dialog_history_play.webp new file mode 100644 index 0000000..e86e158 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_dialog_history_play.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_feedback_list.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_feedback_list.webp new file mode 100644 index 0000000..81269b7 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_feedback_list.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_loading_h.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_loading_h.webp new file mode 100644 index 0000000..1fe4bda Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_loading_h.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_loading_v.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_loading_v.webp new file mode 100644 index 0000000..dca4f1e Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_loading_v.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_lock_episode.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_lock_episode.webp new file mode 100644 index 0000000..42c6492 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_lock_episode.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_login_conins.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_login_conins.webp new file mode 100644 index 0000000..54e6a6a Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_login_conins.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_login_facebook.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_login_facebook.webp new file mode 100644 index 0000000..5b29f35 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_login_facebook.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_login_google.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_login_google.webp new file mode 100644 index 0000000..b179546 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_login_google.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_login_icon_de.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_login_icon_de.webp new file mode 100644 index 0000000..a954444 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_login_icon_de.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_login_tiktok.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_login_tiktok.webp new file mode 100644 index 0000000..22b1ec6 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_login_tiktok.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_me_about_us.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_me_about_us.webp new file mode 100644 index 0000000..fce2076 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_me_about_us.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_me_conins.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_me_conins.webp new file mode 100644 index 0000000..441d5ac Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_me_conins.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_me_language.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_me_language.webp new file mode 100644 index 0000000..a7d2c52 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_me_language.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_me_wallet_bg.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_me_wallet_bg.webp new file mode 100644 index 0000000..3a25567 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_me_wallet_bg.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_vip_top_bg.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_vip_top_bg.webp new file mode 100644 index 0000000..e24d2e8 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_vip_top_bg.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_wallet_down.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_wallet_down.webp new file mode 100644 index 0000000..dea7dd9 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_wallet_down.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_wallet_feedback.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_wallet_feedback.webp new file mode 100644 index 0000000..53a9dd2 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_wallet_feedback.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_wallet_right.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_wallet_right.webp new file mode 100644 index 0000000..7bbbb89 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_wallet_right.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_wallet_top_bg.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_wallet_top_bg.webp new file mode 100644 index 0000000..4252589 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_wallet_top_bg.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_wallet_top_up.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_wallet_top_up.webp new file mode 100644 index 0000000..5b257c8 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_my_wallet_top_up.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_network.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_network.webp new file mode 100644 index 0000000..f6ffe81 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_network.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_store_right_coin.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_store_right_coin.webp new file mode 100644 index 0000000..1712038 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_store_right_coin.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_store_top_bg.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_store_top_bg.webp new file mode 100644 index 0000000..8077ace Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_store_top_bg.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_store_v.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_store_v.webp new file mode 100644 index 0000000..2ced0f5 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_store_v.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_undraw_push_notifications.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_undraw_push_notifications.webp new file mode 100644 index 0000000..4c3c9de Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_undraw_push_notifications.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_video_lock.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_video_lock.webp new file mode 100644 index 0000000..aca6987 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_video_lock.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_exclusive.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_exclusive.webp new file mode 100644 index 0000000..d4764ac Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_exclusive.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_free.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_free.webp new file mode 100644 index 0000000..ae27168 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_free.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_item_bg.png b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_item_bg.png new file mode 100644 index 0000000..d8d08b4 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_item_bg.png differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_item_yes.png b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_item_yes.png new file mode 100644 index 0000000..df7a848 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_item_yes.png differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_member.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_member.webp new file mode 100644 index 0000000..45c10f0 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_member.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_month_bg.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_month_bg.webp new file mode 100644 index 0000000..f477526 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_month_bg.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_no_ads.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_no_ads.webp new file mode 100644 index 0000000..636e273 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_no_ads.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_only_coupons.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_only_coupons.webp new file mode 100644 index 0000000..93ab316 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_only_coupons.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_quarter_bg.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_quarter_bg.webp new file mode 100644 index 0000000..dbe2fd8 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_quarter_bg.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_top.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_top.webp new file mode 100644 index 0000000..46b6c94 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_top.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_vip.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_vip.webp new file mode 100644 index 0000000..33fc40d Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_vip.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_week_bg.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_week_bg.webp new file mode 100644 index 0000000..d772c00 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_week_bg.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_year_bg.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_year_bg.webp new file mode 100644 index 0000000..25caae8 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_vip_year_bg.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_dialog_history_bg.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_dialog_history_bg.webp new file mode 100644 index 0000000..410dfd1 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_dialog_history_bg.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_home_play_n.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_home_play_n.webp new file mode 100644 index 0000000..cd90959 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_home_play_n.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_loading.gif b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_loading.gif new file mode 100644 index 0000000..727de66 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_loading.gif differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_store.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_store.webp new file mode 100644 index 0000000..12eb375 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_store.webp differ diff --git a/Android_Mireo/app/src/main/res/values/attrs.xml b/Android_Mireo/app/src/main/res/values/attrs.xml index 78554f9..8954cf9 100644 --- a/Android_Mireo/app/src/main/res/values/attrs.xml +++ b/Android_Mireo/app/src/main/res/values/attrs.xml @@ -1,5 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/values/colors.xml b/Android_Mireo/app/src/main/res/values/colors.xml index c170210..00c6eeb 100644 --- a/Android_Mireo/app/src/main/res/values/colors.xml +++ b/Android_Mireo/app/src/main/res/values/colors.xml @@ -11,6 +11,61 @@ #BBBBBB #ECECEC #7C7C7C + #00000000 + #FF757575 + + #FFFFFFFF + #F2FFFFFF + #E6FFFFFF + #D9FFFFFF + #CCFFFFFF + #BFFFFFFF + #B3FFFFFF + #A6FFFFFF + #99FFFFFF + #8CFFFFFF + #80FFFFFF + #73FFFFFF + #66FFFFFF + #59FFFFFF + #4DFFFFFF + #40FFFFFF + #33FFFFFF + #26FFFFFF + #1AFFFFFF + #0DFFFFFF + + #FF000000 + #F2000000 + #E6000000 + #D9000000 + #CC000000 + #B000000F + #B3000000 + #A6000000 + #99000000 + #8C000000 + #80000000 + #73000000 + #66000000 + #59000000 + #4D000000 + #40000000 + #33000000 + #26000000 + #1A000000 + #0D000000 + #121418 + + #FF808080 + #FFFF0000 + #FFFFD700 + #FFFFFF00 + #FF008000 + #FF0000FF + #FF800080 + #FFFFC0CB + #FFFFA500 #007AFF #F44336 @@ -22,5 +77,9 @@ #999999 #d9d9d9 + #121418 + #D2D2D2 + #2B292A + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/values/integers.xml b/Android_Mireo/app/src/main/res/values/integers.xml index 0e4da0e..0cfa479 100644 --- a/Android_Mireo/app/src/main/res/values/integers.xml +++ b/Android_Mireo/app/src/main/res/values/integers.xml @@ -1,6 +1,7 @@ 200 + 400 4 \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/values/strings.xml b/Android_Mireo/app/src/main/res/values/strings.xml index 122cb0f..cc81c36 100644 --- a/Android_Mireo/app/src/main/res/values/strings.xml +++ b/Android_Mireo/app/src/main/res/values/strings.xml @@ -94,10 +94,10 @@ File md5 verification failed - Empty + Request failed. Please try again. - Network error. Please try again. - Retry + Network anomaly + Reload Please select a region Please select @@ -243,7 +243,7 @@ REWARDS ME The service is abnormal. Check the network. - Watch Now + Play Now Watch Continue Watching login @@ -272,11 +272,11 @@ Delete Account Feedback Please log in first - 1886904725382038 - fb1886904725382038 - b63e62471e03fc8a1ba13219ebd06363 + 1412578806724790 + fb1412578806724790 + 7dd592739f01bfe1bdc4e5766affcdcc XW2aulJv9urKD4MIIFT1xcSCuyTHaDZ9qUbDqygnTLS04GkdX7WMQJviGP5vDRWGsk4OJJIyLGRV3mbLqOWx0W - guyantv + mireotv No record of spending at the moment Top Up Retry @@ -289,7 +289,12 @@ Google Pay Error Google Pay Canceled Theater - 2. Paid content can be unlocked using coins or subscription. Member-only content is only accessible after subscribing.
3. Bonus coins expire after one month.
4. Coins will be used first when unlocking episodes. If the balance is insufficient, bonus coins will be used automatically.
5. During the subscription period, you will have unlimited access to all episodes on GuyanTV.
6. Subscription renewal will be automatically deducted from your Google account within 24 hours before your current subscription expires.
7. If you want to cancel your subscription, please go to your Google Play account and cancel your subscription at least 24 hours before the end of the current subscription period.
8. If the recharge payment is successful but your balance is not updated, please try to click Restore to refresh your balance.
9. Our subscription prices will be converted to the region where you pay.
If you want to manage your GuyanTV subscription, go to Google Subscription Management.]]>
+ Log out + Are you sure you want to log out? + + 1. Mireo offers free and paid content for everyone. \n 2. Paid content can be unlocked using coins or subscription. Member-only content is only accessible after subscribing. \n 3. Bonus coins expire after one day. \n 4. Coins will be used first when unlocking episodes. If the balance is insufficient, bonus coins will be used automatically. \n 5. During the subscription period, you will have unlimited access to all episodes on Mireo. \n 6. Subscription renewal will be automatically deducted from your Google account within 24 hours before your current subscription expires. \n 7. If you want to cancel your subscription, please go to your Google Play account and cancel your subscription at least 24 hours before the end of the current subscription period. \n 8. If the recharge payment is successful but your balance is not updated, please try to click Restore to refresh your balance. \n 9. Our subscription prices will be converted to the region where you pay. \nIf you want to manage your Mireo subscription, go to Google Subscription Management. + Please select a payment item + Network abnormality, please check your network \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/values/styles.xml b/Android_Mireo/app/src/main/res/values/styles.xml index d159236..9d05770 100644 --- a/Android_Mireo/app/src/main/res/values/styles.xml +++ b/Android_Mireo/app/src/main/res/values/styles.xml @@ -102,5 +102,51 @@ 14sp @color/white + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/build.gradle b/Android_Mireo/build.gradle index b5a430f..d2946c0 100644 --- a/Android_Mireo/build.gradle +++ b/Android_Mireo/build.gradle @@ -1,24 +1,46 @@ -apply from : 'configs.gradle' +apply from: 'configs.gradle' buildscript { - apply from : 'maven.gradle' + apply from: 'maven.gradle' repositories { + google() + mavenCentral() + maven { url "https://artifact.bytedance.com/repository/pangle" } + maven { url "https://artifacts.applovin.com/android" } + maven { url "https://artifact.bytedance.com/repository/AwemeOpenSDK" } + maven { url "https://jitpack.io" } + maven { url "https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea" } + maven { url "https://android-sdk.is.com" } + maven { url 'https://maven.aliyun.com/repository/google' } + maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } addCommonMaven(repositories) } dependencies { - classpath 'com.android.tools.build:gradle:7.1.3' - classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.20' - classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10' + classpath 'com.android.tools.build:gradle:8.2.1' + classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0' + classpath 'com.google.gms:google-services:4.4.2' + classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.2' + classpath 'com.google.firebase:perf-plugin:1.4.2' } } allprojects { repositories { + google() + mavenCentral() + maven { url "https://artifact.bytedance.com/repository/pangle" } + maven { url "https://artifacts.applovin.com/android" } + maven { url "https://artifact.bytedance.com/repository/AwemeOpenSDK" } + maven { url "https://jitpack.io" } + maven { url "https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea" } + maven { url "https://android-sdk.is.com" } + maven { url 'https://maven.aliyun.com/repository/google' } + maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://repo1.maven.org/maven2' } addCommonMaven(repositories) } diff --git a/Android_Mireo/common.gradle b/Android_Mireo/common.gradle index d9a49a1..58da13b 100644 --- a/Android_Mireo/common.gradle +++ b/Android_Mireo/common.gradle @@ -2,12 +2,13 @@ apply plugin: 'kotlin-android' android { + namespace = "com.localee.mireo.shortapp" compileSdk 34 defaultConfig { minSdk 24 targetSdk 34 - versionName '1.0.0' - versionCode 1 + versionName '1.1.0' + versionCode 8 } compileOptions { @@ -37,18 +38,18 @@ android { } } -afterEvaluate { - if (android.defaultConfig.applicationId == null && "umeng" != getName()) { - generateReleaseBuildConfig.enabled = false - generatePreviewBuildConfig.enabled = false - generateDebugBuildConfig.enabled = false - } -} +//afterEvaluate { +// if (android.defaultConfig.applicationId == null) { +// generateReleaseBuildConfig.enabled = false +// generatePreviewBuildConfig.enabled = false +// generateDebugBuildConfig.enabled = false +// } +//} dependencies { implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs') - implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.4.0' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0' @@ -56,4 +57,6 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1' implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.0" implementation "androidx.fragment:fragment-ktx:1.6.0" + + } \ No newline at end of file diff --git a/Android_Mireo/gradle.properties b/Android_Mireo/gradle.properties index 8419537..83cb849 100644 --- a/Android_Mireo/gradle.properties +++ b/Android_Mireo/gradle.properties @@ -18,4 +18,10 @@ org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8 # 表示使用 AndroidX android.useAndroidX = true # 表示将第三方库迁移到 AndroidX -android.enableJetifier = true \ No newline at end of file +android.enableJetifier = true + +# ?????????????? +systemProp.http.proxyHost=127.0.0.1 +systemProp.http.proxyPort=8800 +systemProp.https.proxyHost=127.0.0.1 +systemProp.https.proxyPort=8800 \ No newline at end of file diff --git a/Android_Mireo/gradle/wrapper/gradle-wrapper.properties b/Android_Mireo/gradle/wrapper/gradle-wrapper.properties index e7e2af3..647558b 100644 --- a/Android_Mireo/gradle/wrapper/gradle-wrapper.properties +++ b/Android_Mireo/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ zipStoreBase = GRADLE_USER_HOME zipStorePath = wrapper/dists distributionBase = GRADLE_USER_HOME distributionPath = wrapper/dists -distributionUrl = https\://services.gradle.org/distributions/gradle-7.6-bin.zip \ No newline at end of file +distributionUrl = https\://services.gradle.org/distributions/gradle-8.2-bin.zip \ No newline at end of file diff --git a/Android_Mireo/library/base/build.gradle b/Android_Mireo/library/base/build.gradle deleted file mode 100644 index 888cf74..0000000 --- a/Android_Mireo/library/base/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -apply plugin : 'com.android.library' -apply from : '../../common.gradle' - -android { - - defaultConfig { - consumerProguardFiles 'proguard-base.pro' - } - - sourceSets { - main { - res.srcDirs( - 'src/main/res', - 'src/main/res-sw', - ) - } - } -} \ No newline at end of file diff --git a/Android_Mireo/library/base/proguard-base.pro b/Android_Mireo/library/base/proguard-base.pro deleted file mode 100644 index d076383..0000000 --- a/Android_Mireo/library/base/proguard-base.pro +++ /dev/null @@ -1,61 +0,0 @@ -# 基于 sdk/tools/proguard/proguard-android-optimize.txt 修改 --optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* --optimizationpasses 5 --allowaccessmodification --dontpreverify --dontusemixedcaseclassnames --dontskipnonpubliclibraryclasses --verbose - -# 不要删除无用代码 --dontshrink - -# 不混淆泛型 --keepattributes Signature - -# 不混淆注解类 --keepattributes *Annotation* - -# 不混淆本地方法 --keepclasseswithmembernames class * { - native ; -} - -# 不混淆 Activity 在 XML 布局所设置的 onClick 属性值 --keepclassmembers class * extends android.app.Activity { - public void *(android.view.View); -} - -# 不混淆枚举类 --keepclassmembers enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - -# 不混淆 Parcelable 子类 --keepclassmembers class * implements android.os.Parcelable { - public static final android.os.Parcelable$Creator CREATOR; -} - -# 不混淆 Serializable 子类 --keepclassmembers class * implements java.io.Serializable { - static final long serialVersionUID; - private static final java.io.ObjectStreamField[] serialPersistentFields; - !static !transient ; - !private ; - !private ; - private void writeObject(java.io.ObjectOutputStream); - private void readObject(java.io.ObjectInputStream); - java.lang.Object writeReplace(); - java.lang.Object readResolve(); -} - -# 不混淆 R 文件中的字段 --keepclassmembers class **.R$* { - public static ; -} - -# 不混淆 WebView 设置的 JS 接口的方法名 --keepclassmembers class * { - @android.webkit.JavascriptInterface ; -} \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/AndroidManifest.xml b/Android_Mireo/library/base/src/main/AndroidManifest.xml deleted file mode 100644 index 47d69f1..0000000 --- a/Android_Mireo/library/base/src/main/AndroidManifest.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/values/colors.xml b/Android_Mireo/library/base/src/main/res/values/colors.xml deleted file mode 100644 index 04e8e4f..0000000 --- a/Android_Mireo/library/base/src/main/res/values/colors.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - #00000000 - #FF757575 - - #FFFFFFFF - #F2FFFFFF - #E6FFFFFF - #D9FFFFFF - #CCFFFFFF - #BFFFFFFF - #B3FFFFFF - #A6FFFFFF - #99FFFFFF - #8CFFFFFF - #80FFFFFF - #73FFFFFF - #66FFFFFF - #59FFFFFF - #4DFFFFFF - #40FFFFFF - #33FFFFFF - #26FFFFFF - #1AFFFFFF - #0DFFFFFF - - #FF000000 - #F2000000 - #E6000000 - #D9000000 - #CC000000 - #B000000F - #B3000000 - #A6000000 - #99000000 - #8C000000 - #80000000 - #73000000 - #66000000 - #59000000 - #4D000000 - #40000000 - #33000000 - #26000000 - #1A000000 - #0D000000 - #121418 - - #FF808080 - #FFFF0000 - #FFFFD700 - #FFFFFF00 - #FF008000 - #FF0000FF - #FF800080 - #FFFFC0CB - #FFFFA500 - - \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/values/integers.xml b/Android_Mireo/library/base/src/main/res/values/integers.xml deleted file mode 100644 index e3ffc79..0000000 --- a/Android_Mireo/library/base/src/main/res/values/integers.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 400 - \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/values/styles.xml b/Android_Mireo/library/base/src/main/res/values/styles.xml deleted file mode 100644 index f622eee..0000000 --- a/Android_Mireo/library/base/src/main/res/values/styles.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Android_Mireo/library/widget/build.gradle b/Android_Mireo/library/widget/build.gradle deleted file mode 100644 index 45a82b3..0000000 --- a/Android_Mireo/library/widget/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ -apply plugin : 'com.android.library' -apply from : '../../common.gradle' - -dependencies { - implementation project(':library:base') -} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/AndroidManifest.xml b/Android_Mireo/library/widget/src/main/AndroidManifest.xml deleted file mode 100644 index b084981..0000000 --- a/Android_Mireo/library/widget/src/main/AndroidManifest.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/SlantedTextView.kt b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/SlantedTextView.kt deleted file mode 100644 index 1c934af..0000000 --- a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/SlantedTextView.kt +++ /dev/null @@ -1,308 +0,0 @@ -package com.hjq.widget.view - -import android.content.Context -import android.content.res.TypedArray -import android.graphics.* -import android.text.TextPaint -import android.text.TextUtils -import android.util.AttributeSet -import android.util.TypedValue -import android.view.Gravity -import android.view.View -import androidx.annotation.StringRes -import com.hjq.widget.R -import kotlin.math.max - -@Suppress("RtlHardcoded") -class SlantedTextView @JvmOverloads constructor( - context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : - View(context, attrs, defStyleAttr) { - - companion object { - - const val ROTATE_ANGLE: Int = 45 - } - - private val backgroundPaint: Paint = Paint() - - private val textPaint: TextPaint - - private var text: String = "" - - private var gravity: Int = 0 - - private var triangle: Boolean = false - - private var colorBackground: Int = 0 - - private val textBounds: Rect = Rect() - - private var textHeight: Int = 0 - - init { - backgroundPaint.style = Paint.Style.FILL - backgroundPaint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_OVER) - backgroundPaint.isAntiAlias = true - textPaint = TextPaint(Paint.ANTI_ALIAS_FLAG) - textPaint.isAntiAlias = true - val array: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.SlantedTextView) - setText(array.getString(R.styleable.SlantedTextView_android_text)) - setTextSize(TypedValue.COMPLEX_UNIT_PX, array.getDimensionPixelSize(R.styleable.SlantedTextView_android_textSize, - resources.getDimension(R.dimen.sp_12).toInt()).toFloat()) - setTextColor(array.getColor(R.styleable.SlantedTextView_android_textColor, Color.WHITE)) - setTextStyle(Typeface.defaultFromStyle(array.getInt(R.styleable.SlantedTextView_android_textStyle, Typeface.NORMAL))) - setGravity(array.getInt(R.styleable.SlantedTextView_android_gravity, Gravity.END)) - setColorBackground(array.getColor(R.styleable.SlantedTextView_android_colorBackground, getAccentColor())) - setTriangle(array.getBoolean(R.styleable.SlantedTextView_triangle, false)) - array.recycle() - } - - override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { - textPaint.getTextBounds(text, 0, text.length, textBounds) - textHeight = textBounds.height() + paddingTop + paddingBottom - var width = 0 - when (MeasureSpec.getMode(widthMeasureSpec)) { - MeasureSpec.EXACTLY -> width = MeasureSpec.getSize(widthMeasureSpec) - MeasureSpec.AT_MOST, MeasureSpec.UNSPECIFIED -> width = - textBounds.width() + paddingLeft + paddingRight - } - var height = 0 - when (MeasureSpec.getMode(heightMeasureSpec)) { - MeasureSpec.EXACTLY -> { - height = MeasureSpec.getSize(heightMeasureSpec) - } - MeasureSpec.AT_MOST, MeasureSpec.UNSPECIFIED -> { - height = textBounds.height() + paddingTop + paddingBottom - } - } - setMeasuredDimension(max(width, height), max(width, height)) - } - - override fun onDraw(canvas: Canvas) { - drawBackground(canvas) - drawText(canvas) - } - - private fun drawBackground(canvas: Canvas) { - val path = Path() - val width: Int = canvas.width - val height: Int = canvas.height - when (gravity) { - Gravity.LEFT, Gravity.LEFT or Gravity.TOP -> { - if (triangle) { - path.lineTo(0f, height.toFloat()) - path.lineTo(width.toFloat(), 0f) - } else { - path.moveTo(width.toFloat(), 0f) - path.lineTo(0f, height.toFloat()) - path.lineTo(0f, (height - textHeight).toFloat()) - path.lineTo((width - textHeight).toFloat(), 0f) - } - } - Gravity.NO_GRAVITY, Gravity.RIGHT, Gravity.RIGHT or Gravity.TOP -> { - if (triangle) { - path.lineTo(width.toFloat(), 0f) - path.lineTo(width.toFloat(), height.toFloat()) - } else { - path.lineTo(width.toFloat(), height.toFloat()) - path.lineTo(width.toFloat(), (height - textHeight).toFloat()) - path.lineTo(textHeight * 1f, 0f) - } - } - Gravity.BOTTOM, Gravity.LEFT or Gravity.BOTTOM -> { - if (triangle) { - path.lineTo(width.toFloat(), height.toFloat()) - path.lineTo(0f, height.toFloat()) - } else { - path.lineTo(width.toFloat(), height.toFloat()) - path.lineTo((width - textHeight).toFloat(), height.toFloat()) - path.lineTo(0f, textHeight.toFloat()) - } - } - Gravity.RIGHT or Gravity.BOTTOM -> { - if (triangle) { - path.moveTo(0f, height.toFloat()) - path.lineTo(width.toFloat(), height.toFloat()) - path.lineTo(width.toFloat(), 0f) - } else { - path.moveTo(0f, height.toFloat()) - path.lineTo(textHeight * 1f, height.toFloat()) - path.lineTo(width.toFloat(), textHeight.toFloat()) - path.lineTo(width.toFloat(), 0f) - } - } - else -> { - throw IllegalArgumentException("are you ok?") - } - } - path.close() - canvas.drawPath(path, backgroundPaint) - canvas.save() - } - - private fun drawText(canvas: Canvas) { - val width: Int = canvas.width - textHeight / 2 - val height: Int = canvas.height - textHeight / 2 - val rect: Rect? - val rectF: RectF? - val offset: Int = textHeight / 2 - val toX: Float - val toY: Float - val centerX: Float - val centerY: Float - val angle: Float - when (gravity) { - Gravity.LEFT, Gravity.LEFT or Gravity.TOP -> { - rect = Rect(0, 0, width, height) - rectF = RectF(rect) - rectF.right = textPaint.measureText(text, 0, text.length) - rectF.bottom = textPaint.descent() - textPaint.ascent() - rectF.left += (rect.width() - rectF.right) / 2.0f - rectF.top += (rect.height() - rectF.bottom) / 2.0f - toX = rectF.left - toY = rectF.top - textPaint.ascent() - centerX = width / 2f - centerY = height / 2f - angle = -ROTATE_ANGLE.toFloat() - } - Gravity.NO_GRAVITY, Gravity.RIGHT, Gravity.RIGHT or Gravity.TOP -> { - rect = Rect(offset, 0, width + offset, height) - rectF = RectF(rect) - rectF.right = textPaint.measureText(text, 0, text.length) - rectF.bottom = textPaint.descent() - textPaint.ascent() - rectF.left += (rect.width() - rectF.right) / 2.0f - rectF.top += (rect.height() - rectF.bottom) / 2.0f - toX = rectF.left - toY = rectF.top - textPaint.ascent() - centerX = width / 2f + offset - centerY = height / 2f - angle = ROTATE_ANGLE.toFloat() - } - Gravity.BOTTOM, Gravity.LEFT or Gravity.BOTTOM -> { - rect = Rect(0, offset, width, height + offset) - rectF = RectF(rect) - rectF.right = textPaint.measureText(text, 0, text.length) - rectF.bottom = textPaint.descent() - textPaint.ascent() - rectF.left += (rect.width() - rectF.right) / 2.0f - rectF.top += (rect.height() - rectF.bottom) / 2.0f - toX = rectF.left - toY = rectF.top - textPaint.ascent() - centerX = width / 2f - centerY = height / 2f + offset - angle = ROTATE_ANGLE.toFloat() - } - Gravity.RIGHT or Gravity.BOTTOM -> { - rect = Rect(offset, offset, width + offset, height + offset) - rectF = RectF(rect) - rectF.right = textPaint.measureText(text, 0, text.length) - rectF.bottom = textPaint.descent() - textPaint.ascent() - rectF.left += (rect.width() - rectF.right) / 2.0f - rectF.top += (rect.height() - rectF.bottom) / 2.0f - toX = rectF.left - toY = rectF.top - textPaint.ascent() - centerX = width / 2f + offset - centerY = height / 2f + offset - angle = -ROTATE_ANGLE.toFloat() - } - else -> { - throw IllegalArgumentException("are you ok?") - } - } - canvas.rotate(angle, centerX, centerY) - canvas.drawText(text, toX, toY, textPaint) - } - - fun getText(): String { - return text - } - - fun setText(@StringRes id: Int) { - setText(resources.getString(id)) - } - - fun setText(text: String?) { - val finalText = text ?: "" - if (!TextUtils.equals(finalText, getText())) { - this.text = finalText - invalidate() - } - } - - fun getTextColor(): Int { - return textPaint.color - } - - fun setTextColor(color: Int) { - if (getTextColor() != color) { - textPaint.color = color - invalidate() - } - } - - fun getTextSize(): Float { - return textPaint.textSize - } - - fun setTextSize(size: Float) { - setTextSize(TypedValue.COMPLEX_UNIT_SP, size) - } - - fun setTextSize(unit: Int, size: Float) { - val textSize: Float = TypedValue.applyDimension(unit, size, resources.displayMetrics) - if (getTextSize() != textSize) { - textPaint.textSize = textSize - invalidate() - } - } - - fun getTextStyle(): Typeface? { - return textPaint.typeface - } - - fun setTextStyle(tf: Typeface?) { - if (getTextStyle() !== tf) { - textPaint.typeface = tf - invalidate() - } - } - - fun getColorBackground(): Int { - return colorBackground - } - - fun setColorBackground(color: Int) { - if (getColorBackground() != color) { - colorBackground = color - backgroundPaint.color = colorBackground - invalidate() - } - } - - fun getGravity(): Int { - return gravity - } - - fun setGravity(gravity: Int) { - if (this.gravity != gravity) { - this.gravity = Gravity.getAbsoluteGravity(gravity, resources.configuration.layoutDirection) - invalidate() - } - } - - fun isTriangle(): Boolean { - return triangle - } - - fun setTriangle(triangle: Boolean) { - if (isTriangle() != triangle) { - this.triangle = triangle - invalidate() - } - } - - private fun getAccentColor(): Int { - val typedValue = TypedValue() - context.theme.resolveAttribute(R.attr.colorAccent, typedValue, true) - return typedValue.data - } -} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/res/values/attrs.xml b/Android_Mireo/library/widget/src/main/res/values/attrs.xml deleted file mode 100644 index 7286715..0000000 --- a/Android_Mireo/library/widget/src/main/res/values/attrs.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Android_Mireo/settings.gradle b/Android_Mireo/settings.gradle index 09ee302..e7b4def 100644 --- a/Android_Mireo/settings.gradle +++ b/Android_Mireo/settings.gradle @@ -1,3 +1 @@ include ':app' -include ':library:base' -include ':library:widget'