commit fc428a8e0952390739c18d28776c6d7f892e2fa2 Author: yuyl <765782212@qq.com> Date: Wed Apr 16 15:37:20 2025 +0800 first commit diff --git a/Android_Mireo/.gitignore b/Android_Mireo/.gitignore new file mode 100644 index 0000000..34b8758 --- /dev/null +++ b/Android_Mireo/.gitignore @@ -0,0 +1,16 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties +/app/release \ No newline at end of file diff --git a/Android_Mireo/app/AppMireo.jks b/Android_Mireo/app/AppMireo.jks new file mode 100644 index 0000000..e23aeab Binary files /dev/null and b/Android_Mireo/app/AppMireo.jks differ diff --git a/Android_Mireo/app/build.gradle b/Android_Mireo/app/build.gradle new file mode 100644 index 0000000..ca3a264 --- /dev/null +++ b/Android_Mireo/app/build.gradle @@ -0,0 +1,155 @@ +apply plugin: 'com.android.application' +apply plugin: 'android-aspectjx' +apply plugin: 'kotlin-kapt' +apply from: '../common.gradle' + + +android { + + + defaultConfig { + applicationId 'com.localee.mireo.app' + resConfigs 'zh' + resConfigs 'xxhdpi' + proguardFiles 'proguard-sdk.pro', 'proguard-app.pro' + buildConfigField('boolean', 'LOG_ENABLE', '' + LOG_ENABLE + '') + buildConfigField('String', 'HOST_URL', '"' + HOST_URL + '"') + } + + + signingConfigs { + config { + storeFile file(StoreFile) + storePassword StorePassword + keyAlias KeyAlias + keyPassword KeyPassword + } + } + buildFeatures { + viewBinding = true + dataBinding = true + buildConfig = true + } + + buildTypes { + + debug { + + applicationIdSuffix '.debug' + debuggable true + jniDebuggable true + zipAlignEnabled false + shrinkResources false + minifyEnabled false + signingConfig signingConfigs.config + addManifestPlaceholders([ + 'app_name': 'Mireo Debug' + ]) + } + + preview.initWith(debug) + preview { + debuggable false + jniDebuggable false + zipAlignEnabled true + shrinkResources false + minifyEnabled false + signingConfig signingConfigs.config + addManifestPlaceholders([ + 'app_name': '@string/app_name' + ]) + } + + release { + debuggable false + jniDebuggable false + zipAlignEnabled false + shrinkResources true + minifyEnabled true + signingConfig signingConfigs.config + addManifestPlaceholders([ + 'app_name': '@string/app_name' + ]) + } + } + + packagingOptions { + exclude 'META-INF/*******' + } + + aspectjx { + include android.defaultConfig.applicationId + } + + applicationVariants.all { variant -> + variant.outputs.all { output -> + outputFileName = rootProject.getName() + '_v' + variant.versionName + '_' + variant.buildType.name + if (variant.buildType.name == buildTypes.release.getName()) { + outputFileName += '_' + new Date().format('MMdd') + } + outputFileName += '.apk' + } + } +} + +dependencies { + implementation project(':library:base') + implementation project(':library:widget') + + implementation 'com.github.getActivity:XXPermissions:12.3' + + implementation 'com.github.getActivity:TitleBar:9.2' + + implementation 'com.github.getActivity:ToastUtils:9.5' + + implementation 'com.github.getActivity:EasyHttp:13.0' + implementation 'com.squareup.okhttp3:okhttp:3.14.9' + + 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.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.tencent.bugly:crashreport:3.4.4' + implementation 'com.tencent.bugly:nativecrashreport:3.9.2' + + 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 + implementation 'io.github.youth5201314:banner:2.2.3' + + 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 "androidx.media3:media3-ui:1.4.0" + implementation "androidx.media3:media3-exoplayer:1.4.0" + implementation "androidx.media3:media3-exoplayer-dash:1.4.0" + implementation "androidx.media3:media3-exoplayer-hls:1.4.0" + implementation(files("libs/lib-decoder-ffmpeg-release.aar")) + + implementation "org.greenrobot:eventbus:3.3.1" + implementation("com.blankj:utilcodex:1.31.1") + implementation("com.github.li-xiaojun:XPopup:2.10.0") + + +} \ No newline at end of file diff --git a/Android_Mireo/app/gradle.properties b/Android_Mireo/app/gradle.properties new file mode 100644 index 0000000..f3d52d8 --- /dev/null +++ b/Android_Mireo/app/gradle.properties @@ -0,0 +1,4 @@ +StoreFile = AppMireo.jks +StorePassword = appmireo +KeyAlias = appmireo +KeyPassword = appmireo \ No newline at end of file diff --git a/Android_Mireo/app/proguard-app.pro b/Android_Mireo/app/proguard-app.pro new file mode 100644 index 0000000..692091e --- /dev/null +++ b/Android_Mireo/app/proguard-app.pro @@ -0,0 +1,36 @@ +#-ignorewarning + +-libraryjars libs/lib-decoder-ffmpeg-release.aar + +-keep class com.localee.mireo.app.http.api.** { + ; +} +-keep class com.localee.mireo.app.http.response.** { + ; +} +-keep class com.localee.mireo.app.http.model.** { + ; +} +-keep class com.localee.mireo.app.http.exception.** { + ; +} + +-keepclassmembernames class ** { + @com.localee.mireo.app.aop.Log ; +} + + +-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 class * { + public void *(android.view.View); +} \ No newline at end of file diff --git a/Android_Mireo/app/proguard-sdk.pro b/Android_Mireo/app/proguard-sdk.pro new file mode 100644 index 0000000..af74931 --- /dev/null +++ b/Android_Mireo/app/proguard-sdk.pro @@ -0,0 +1,45 @@ +# Glide +-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(); +} + +# 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 +-keepattributes *Annotation* +-keep class okhttp3.** { *; } +-keep interface okhttp3.** { *; } +-dontwarn okhttp3.** +-dontwarn okio.** +-dontwarn org.conscrypt.** + +-keep class com.gyf.immersionbar.* {*;} +-dontwarn com.gyf.immersionbar.** + +# com.hjq +-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 diff --git a/Android_Mireo/app/src/main/AndroidManifest.xml b/Android_Mireo/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..cb255ab --- /dev/null +++ b/Android_Mireo/app/src/main/AndroidManifest.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file 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 new file mode 100644 index 0000000..9a1d1f5 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/action/StatusAction.kt @@ -0,0 +1,74 @@ +package com.localee.mireo.app.action + +import android.graphics.drawable.Drawable +import android.net.ConnectivityManager +import android.net.NetworkInfo +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.app.widget.StatusLayout +import com.localee.mireo.app.widget.StatusLayout.OnRetryListener + + +interface StatusAction { + + + fun getStatusLayout(): StatusLayout? + + + fun showLoading(@RawRes id: Int = R.raw.loading) { + getStatusLayout()?.let { + it.show() + it.setAnimResource(id) + it.setHint("") + it.setOnRetryListener(null) + } + } + + + fun showComplete() { + getStatusLayout()?.let { + if (!it.isShow()) { + return + } + it.hide() + } + } + + + fun showEmpty() { + showLayout(R.drawable.status_empty_ic, R.string.status_layout_no_data, null) + } + + + fun showError(listener: OnRetryListener?) { + getStatusLayout()?.let { + 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) + return + } + } + showLayout(R.drawable.status_error_ic, R.string.status_layout_error_request, listener) + } + } + + fun showLayout(@DrawableRes drawableId: Int, @StringRes stringId: Int, listener: OnRetryListener?) { + getStatusLayout()?.let { + showLayout(ContextCompat.getDrawable(it.context, drawableId), it.context.getString(stringId), listener) + } + } + + fun showLayout(drawable: Drawable?, hint: CharSequence?, listener: OnRetryListener?) { + getStatusLayout()?.let { + it.show() + it.setIcon(drawable) + it.setHint(hint) + it.setOnRetryListener(listener) + } + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/action/TitleBarAction.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/action/TitleBarAction.kt new file mode 100644 index 0000000..2af85fb --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/action/TitleBarAction.kt @@ -0,0 +1,94 @@ +package com.localee.mireo.app.action + +import android.graphics.drawable.Drawable +import android.view.View +import android.view.ViewGroup +import androidx.annotation.StringRes +import com.hjq.bar.OnTitleBarListener +import com.hjq.bar.TitleBar + +interface TitleBarAction : OnTitleBarListener { + + fun getTitleBar(): TitleBar? + + override fun onLeftClick(view: View) {} + + override fun onTitleClick(view: View) {} + + override fun onRightClick(view: View) {} + + fun setTitle(@StringRes id: Int) { + getTitleBar()?.setTitle(id) + } + + fun setTitle(title: CharSequence?) { + getTitleBar()?.title = title + } + + fun setLeftTitle(id: Int) { + getTitleBar()?.setLeftTitle(id) + } + + fun setLeftTitle(text: CharSequence?) { + getTitleBar()?.leftTitle = text + } + + fun getLeftTitle(): CharSequence? { + return getTitleBar()?.leftTitle + } + + fun setRightTitle(id: Int) { + getTitleBar()?.setRightTitle(id) + } + + fun setRightTitle(text: CharSequence?) { + getTitleBar()?.rightTitle = text + } + + fun getRightTitle(): CharSequence? { + return getTitleBar()?.rightTitle + } + + fun setLeftIcon(id: Int) { + getTitleBar()?.setLeftIcon(id) + } + + fun setLeftIcon(drawable: Drawable?) { + getTitleBar()?.leftIcon = drawable + } + + fun getLeftIcon(): Drawable? { + return getTitleBar()?.leftIcon + } + + fun setRightIcon(id: Int) { + getTitleBar()?.setRightIcon(id) + } + + fun setRightIcon(drawable: Drawable?) { + getTitleBar()?.rightIcon = drawable + } + + fun getRightIcon(): Drawable? { + return getTitleBar()?.rightIcon + } + + fun obtainTitleBar(group: ViewGroup?): TitleBar? { + if (group == null) { + return null + } + for (i in 0 until group.childCount) { + val view = group.getChildAt(i) + if (view is TitleBar) { + return view + } + if (view is ViewGroup) { + val titleBar = obtainTitleBar(view) + if (titleBar != null) { + return titleBar + } + } + } + return null + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/action/ToastAction.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/action/ToastAction.kt new file mode 100644 index 0000000..d873451 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/action/ToastAction.kt @@ -0,0 +1,19 @@ +package com.localee.mireo.app.action + +import androidx.annotation.StringRes +import com.hjq.toast.ToastUtils + +interface ToastAction { + + fun toast(text: CharSequence?) { + ToastUtils.show(text) + } + + fun toast(@StringRes id: Int) { + ToastUtils.show(id) + } + + fun toast(`object`: Any?) { + ToastUtils.show(`object`) + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..1a69774 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/CheckNet.kt @@ -0,0 +1,7 @@ +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 new file mode 100644 index 0000000..6ba2961 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/CheckNetAspect.kt @@ -0,0 +1,36 @@ +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 new file mode 100644 index 0000000..9bb1a46 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/Log.kt @@ -0,0 +1,8 @@ +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 new file mode 100644 index 0000000..8420d5f --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/LogAspect.kt @@ -0,0 +1,96 @@ +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 new file mode 100644 index 0000000..d4641ae --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/Permissions.kt @@ -0,0 +1,9 @@ +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 new file mode 100644 index 0000000..804b73b --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/PermissionsAspect.kt @@ -0,0 +1,58 @@ +package com.localee.mireo.app.aop + +import android.app.Activity +import com.localee.mireo.app.other.PermissionCallback +import com.hjq.permissions.XXPermissions +import com.localee.mireo.app.manager.ActivityManager +import com.tencent.bugly.crashreport.CrashReport +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 new file mode 100644 index 0000000..f776414 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/SingleClick.kt @@ -0,0 +1,9 @@ +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 new file mode 100644 index 0000000..0077ff1 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/aop/SingleClickAspect.kt @@ -0,0 +1,51 @@ +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 new file mode 100644 index 0000000..4af8b67 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppActivity.kt @@ -0,0 +1,161 @@ +package com.localee.mireo.app.app + +import android.content.Intent +import android.os.Bundle +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.action.TitleBarAction +import com.localee.mireo.app.action.ToastAction +import com.localee.mireo.app.http.model.HttpData +import com.localee.mireo.app.ui.dialog.WaitDialog +import com.hjq.http.config.IRequestApi +import com.hjq.http.listener.OnHttpListener +import com.hjq.toast.ToastUtils + +abstract class AppActivity : BaseActivity(), + ToastAction, TitleBarAction, OnHttpListener { + + private var titleBar: TitleBar? = null + + private var immersionBar: ImmersionBar? = null + + private var dialog: BaseDialog? = null + + private var dialogCount: Int = 0 + + open fun isShowDialog(): Boolean { + return dialog != null && dialog!!.isShowing + } + + open fun showDialog() { + if (isFinishing || isDestroyed) { + return + } + dialogCount++ + postDelayed(Runnable { + if ((dialogCount <= 0) || isFinishing || isDestroyed) { + return@Runnable + } + if (dialog == null) { + dialog = WaitDialog.Builder(this) + .setCancelable(false) + .create() + } + if (!dialog!!.isShowing) { + dialog!!.show() + } + }, 300) + } + + open fun hideDialog() { + if (isFinishing || isDestroyed) { + return + } + if (dialogCount > 0) { + dialogCount-- + } + if ((dialogCount != 0) || (dialog == null) || !dialog!!.isShowing) { + return + } + dialog?.dismiss() + } + + override fun initLayout() { + super.initLayout() + + val titleBar = getTitleBar() + titleBar?.setOnTitleBarListener(this) + + if (isStatusBarEnabled()) { + getStatusBarConfig().init() + + if (titleBar != null) { + ImmersionBar.setTitleBar(this, titleBar) + } + } + } + + protected open fun isStatusBarEnabled(): Boolean { + return true + } + + open fun isStatusBarDarkFont(): Boolean { + return true + } + + open fun getStatusBarConfig(): ImmersionBar { + if (immersionBar == null) { + immersionBar = createStatusBarConfig() + } + return immersionBar!! + } + + protected open fun createStatusBarConfig(): ImmersionBar { + return ImmersionBar.with(this) // 默认状态栏字体颜色为黑色 + .statusBarDarkFont(false) // 指定导航栏背景颜色 + .navigationBarColor(R.color.black) // 状态栏字体和导航栏内容自动变色,必须指定状态栏颜色和导航栏颜色才可以自动变色 + .autoDarkModeEnable(true, 0.2f) + } + + override fun setTitle(@StringRes id: Int) { + title = getString(id) + } + + override fun setTitle(title: CharSequence?) { + super.setTitle(title) + getTitleBar()?.title = title + } + + override fun getTitleBar(): TitleBar? { + if (titleBar == null) { + titleBar = obtainTitleBar(getContentView()) + } + return titleBar + } + + override fun onLeftClick(view: View) { + onBackPressed() + } + + override fun startActivityForResult(intent: Intent, requestCode: Int, options: Bundle?) { + super.startActivityForResult(intent, requestCode, options) + overridePendingTransition(R.anim.right_in_activity, R.anim.right_out_activity) + } + + override fun finish() { + super.finish() + overridePendingTransition(R.anim.left_in_activity, R.anim.left_out_activity) + } + + override fun onHttpStart(api: IRequestApi) { + showDialog() + } + + override fun onHttpSuccess(result: Any) { + if (result is HttpData<*>) { + toast(result.getMessage()) + } + + } + + override fun onHttpFail(throwable: Throwable) { + ToastUtils.show(throwable.message) + } + + override fun onHttpEnd(api: IRequestApi) { + hideDialog() + } + + override fun onDestroy() { + super.onDestroy() + if (isShowDialog()) { + hideDialog() + } + dialog = null + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..e7ed0e2 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppAdapter.kt @@ -0,0 +1,140 @@ +package com.localee.mireo.app.app + +import android.content.Context +import android.view.View +import androidx.annotation.IntRange +import androidx.annotation.LayoutRes +import com.hjq.base.BaseAdapter +import java.util.* + +abstract class AppAdapter constructor(context: Context) : + BaseAdapter.AppViewHolder>(context) { + + private var dataSet: MutableList = ArrayList() + + private var pageNumber = 1 + + private var lastPage = false + + private var tag: Any? = null + + override fun getItemCount(): Int { + return getCount() + } + + open fun getCount(): Int { + return dataSet.size + } + + open fun setData(data: MutableList?) { + if (data == null) { + dataSet.clear() + } else { + dataSet = data + } + notifyDataSetChanged() + } + + open fun getData(): MutableList { + return dataSet + } + + open fun addData(data: MutableList?) { + if (data == null || data.isEmpty()) { + return + } + dataSet.addAll(data) + notifyItemRangeInserted(dataSet.size - data.size, data.size) + } + + open fun clearData() { + dataSet.clear() + notifyDataSetChanged() + } + + open fun containsItem(@IntRange(from = 0) position: Int): Boolean { + return containsItem(getItem(position)) + } + + open fun containsItem(item: T?): Boolean { + return if (item == null) { + false + } else dataSet.contains(item) + } + + open fun getItem(@IntRange(from = 0) position: Int): T { + return dataSet[position] + } + + open fun setItem(@IntRange(from = 0) position: Int, item: T) { + dataSet[position] = item + notifyItemChanged(position) + } + + open fun addItem(item: T) { + addItem(dataSet.size, item) + } + + open fun addItem(@IntRange(from = 0) position: Int, item: T) { + var finalPosition = position + if (finalPosition < dataSet.size) { + dataSet.add(finalPosition, item) + } else { + dataSet.add(item) + finalPosition = dataSet.size - 1 + } + notifyItemInserted(finalPosition) + } + + open fun removeItem(item: T) { + val index = dataSet.indexOf(item) + if (index != -1) { + removeItem(index) + } + } + + open fun removeItem(@IntRange(from = 0) position: Int) { + dataSet.removeAt(position) + notifyItemRemoved(position) + } + + open fun getPageNumber(): Int { + return pageNumber + } + + open fun setPageNumber(@IntRange(from = 0) number: Int) { + pageNumber = number + } + + open fun isLastPage(): Boolean { + return lastPage + } + + open fun setLastPage(last: Boolean) { + lastPage = last + } + + open fun getTag(): Any? { + return tag + } + + open fun setTag(tag: Any) { + this.tag = tag + } + + abstract inner class AppViewHolder : BaseViewHolder { + + constructor(@LayoutRes id: Int) : super(id) + + constructor(itemView: View) : super(itemView) + } + + inner class SimpleViewHolder : AppViewHolder { + + constructor(@LayoutRes id: Int) : super(id) + + constructor(itemView: View) : super(itemView) + + override fun onBindView(position: Int) {} + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..a558b89 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppApplication.kt @@ -0,0 +1,171 @@ +package com.localee.mireo.app.app + +import android.app.Activity +import android.app.Application +import android.content.Context +import android.net.ConnectivityManager +import android.net.Network +import android.os.Build +import androidx.core.content.ContextCompat +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import com.google.gson.reflect.TypeToken +import com.google.gson.stream.JsonToken +import com.hjq.bar.TitleBar +import com.hjq.gson.factory.GsonFactory +import com.hjq.http.EasyConfig +import com.hjq.http.config.IRequestInterceptor +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.CrashHandler +import com.localee.mireo.app.other.DebugLoggerTree +import com.localee.mireo.app.other.MaterialHeader +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.scwang.smart.refresh.layout.SmartRefreshLayout +import com.scwang.smart.refresh.layout.api.RefreshLayout +import com.tencent.bugly.crashreport.CrashReport +import com.tencent.mmkv.MMKV +import okhttp3.OkHttpClient +import timber.log.Timber + +class AppApplication : Application() { + + @Log("启动耗时") + override fun onCreate() { + super.onCreate() + instance = this; + initSdk(this) + } + + override fun onLowMemory() { + super.onLowMemory() + } + + override fun onTrimMemory(level: Int) { + super.onTrimMemory(level) + } + + companion object { + lateinit var instance: Application; + var isCurrentPage: Boolean = true + + fun initSdk(application: Application) { + TitleBar.setDefaultStyle(TitleBarStyle()) + + SmartRefreshLayout.setDefaultRefreshHeaderCreator { context: Context, layout: RefreshLayout -> + MaterialHeader(context).setColorSchemeColors( + ContextCompat.getColor( + context, + R.color.common_accent_color + ) + ) + } + SmartRefreshLayout.setDefaultRefreshFooterCreator { context: Context, layout: RefreshLayout -> + SmartBallPulseFooter(context) + } + SmartRefreshLayout.setDefaultRefreshInitializer { context: Context, layout: RefreshLayout -> + layout.setEnableHeaderTranslationContent(true) + .setEnableFooterTranslationContent(true) + .setEnableFooterFollowWhenNoMoreData(true) + .setEnableLoadMoreWhenContentNotFull(false) + .setEnableOverScrollDrag(false) + } + + ToastUtils.init(application, ToastStyle()) + ToastUtils.setDebugMode(AppConfig.isDebug()) + + CrashHandler.register(application) + + ActivityManager.getInstance().init(application) + + MMKV.initialize(application) + + val okHttpClient: OkHttpClient = OkHttpClient.Builder() + .addInterceptor(HttpBodyInterceptor()) + .build() + + + EasyConfig.with(okHttpClient) + .setLogEnabled(AppConfig.isLogEnable()) + .setServer(RequestServer()) + .setHandler(RequestHandler(application)) + .setRetryCount(1) + .setInterceptor(object : IRequestInterceptor { + override fun interceptArguments( + httpRequest: HttpRequest<*>, + params: HttpParams, + headers: HttpHeaders + ) { + headers.put("Content-Type", "application/json; charset=utf-8") + headers.put("Content-Type", "text/plain; charset=utf-8") + + headers.put("Authorization", MsMMKVUtils.getToken()) + headers.put( + "device-id", + MsSystemUtlis.getDeviceId(instance).toString() + ) + headers.put( + "lang-key", + "en" + ) + headers.put("system-type", "android") + headers.put("app_id", "nice_short") + headers.put("system_version", "12") + headers.put("model", Build.MODEL) + headers.put("brand", Build.MANUFACTURER + "-" + Build.PRODUCT) + headers.put( + "app_version", + MsSystemUtlis.getVerNameInfo(instance) + ) +// headers.put("security","true") + + + } + }) + + .into() + + GsonFactory.setJsonCallback { typeToken: TypeToken<*>, fieldName: String?, jsonToken: JsonToken -> + CrashReport.postCatchedException(IllegalArgumentException("Type parsing exception:$typeToken#$fieldName,the type returned by the background is:$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) { + connectivityManager.registerDefaultNetworkCallback(object : + ConnectivityManager.NetworkCallback() { + override fun onLost(network: Network) { + val topActivity: Activity? = ActivityManager.getInstance().getTopActivity() + if (topActivity !is LifecycleOwner) { + return + } + val lifecycleOwner: LifecycleOwner = topActivity + if (lifecycleOwner.lifecycle.currentState != Lifecycle.State.RESUMED) { + return + } + ToastUtils.show(R.string.common_network_error) + } + }) + } + } + } + + +} 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 new file mode 100644 index 0000000..697234b --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/AppFragment.kt @@ -0,0 +1,46 @@ +package com.localee.mireo.app.app + +import com.hjq.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 + +abstract class AppFragment : BaseFragment(), + ToastAction, OnHttpListener { + + open fun isShowDialog(): Boolean { + val activity: A = getAttachActivity() ?: return false + return activity.isShowDialog() + } + + open fun showDialog() { + getAttachActivity()?.showDialog() + } + + open fun hideDialog() { + getAttachActivity()?.hideDialog() + } + + + override fun onHttpStart(api: IRequestApi) { + showDialog() + } + + override fun onHttpSuccess(result: Any) { + if (result !is HttpData<*>) { + return + } + toast(result.getMessage()) + + } + + override fun onHttpFail(throwable: Throwable) { + ToastUtils.show(throwable.message) + } + + override fun onHttpEnd(api: IRequestApi) { + hideDialog() + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/BaseEventBus.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/BaseEventBus.kt new file mode 100644 index 0000000..bc398e4 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/BaseEventBus.kt @@ -0,0 +1,4 @@ +package com.localee.mireo.app.app + + +data class BaseEventBus(val code: String, val data: T) 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 new file mode 100644 index 0000000..c246f54 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/app/TitleBarFragment.kt @@ -0,0 +1,69 @@ +package com.localee.mireo.app.app + +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.app.action.TitleBarAction + + +abstract class TitleBarFragment : AppFragment(), TitleBarAction { + + private var titleBar: TitleBar? = null + + private var immersionBar: ImmersionBar? = null + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + val titleBar = getTitleBar() + titleBar?.setOnTitleBarListener(this) + + if (isStatusBarEnabled()) { + getStatusBarConfig().init() + if (titleBar != null) { + ImmersionBar.setTitleBar(this, titleBar) + } + } + } + + override fun onResume() { + super.onResume() + if (isStatusBarEnabled()) { + getStatusBarConfig().init() + } + } + + open fun isStatusBarEnabled(): Boolean { + return false + } + + protected fun getStatusBarConfig(): ImmersionBar { + if (immersionBar == null) { + immersionBar = createStatusBarConfig() + } + return immersionBar!! + } + + protected fun createStatusBarConfig(): ImmersionBar { + return ImmersionBar.with(this) + .statusBarDarkFont(false) + .navigationBarColor(R.color.black) + .autoDarkModeEnable(true, 0.2f) + } + + protected open fun isStatusBarDarkFont(): Boolean { + return getAttachActivity()!!.isStatusBarDarkFont() + } + + override fun getTitleBar(): TitleBar? { + if (titleBar == null || !isLoading()) { + titleBar = obtainTitleBar(view as ViewGroup) + } + return titleBar + } + + + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/CancelCollectApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/CancelCollectApi.kt new file mode 100644 index 0000000..8ff3a23 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/CancelCollectApi.kt @@ -0,0 +1,17 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + + +class CancelCollectApi : IRequestApi { + + override fun getApi(): String { + return "cancelCollect" + } + + var short_play_id: Int? = null + + var 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/CreateHistoryApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/CreateHistoryApi.kt new file mode 100644 index 0000000..3991399 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/CreateHistoryApi.kt @@ -0,0 +1,18 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + + +class CreateHistoryApi : IRequestApi { + + override fun getApi(): String { + return "createHistory" + } + + var short_play_id: Int? = null + + var 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/CustomerRegisterApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/CustomerRegisterApi.kt new file mode 100644 index 0000000..096b1fd --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/CustomerRegisterApi.kt @@ -0,0 +1,19 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi +import java.io.Serializable + + +class CustomerRegisterApi : IRequestApi { + + override fun getApi(): String { + return "customer/register" + } + + class Bean : Serializable{ + var token: String? = null + var customer_id: Int? = null + var auto_login: Boolean = false + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DetailsRecommendRes.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DetailsRecommendRes.kt new file mode 100644 index 0000000..d220931 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DetailsRecommendRes.kt @@ -0,0 +1,29 @@ +package com.localee.mireo.app.http.api + + +data class DetailsRecommendRes( + 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/DoCollectApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DoCollectApi.kt new file mode 100644 index 0000000..8c92e98 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/DoCollectApi.kt @@ -0,0 +1,25 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + + +class DoCollectApi : IRequestApi { + + override fun getApi(): String { + return "collect" + } + + private var short_play_id: String? = null + + private var video_id: String? = null + + fun setShortPlayId(short_play_id: String?): com.localee.mireo.app.http.api.DoCollectApi = apply { + this.short_play_id = short_play_id + } + + fun setVideoId(video_id: String?): com.localee.mireo.app.http.api.DoCollectApi = apply { + this.video_id = video_id + } + + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/ExampleRecommendDataRes.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/ExampleRecommendDataRes.kt new file mode 100644 index 0000000..42caa6e --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/ExampleRecommendDataRes.kt @@ -0,0 +1,39 @@ +package com.localee.mireo.app.http.api + +data class ExampleRecommendDataRes( + val list: List, + val pagination: Pagination +) { + + data class Data( + val all_price_total: 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 video_info: VideoInfo?, + val watch_total: Int + ) + + data class Pagination( + val current_page: Int, + val page_size: Int, + val page_total: Int, + val total_size: Int + ) + + data class VideoInfo( + val episode: Int, + val id: Int, + val is_vip: Int, + val short_play_id: Int, + val short_play_video_id: Int, + val video_url: String, + val image_url: String + ) +} \ 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/api/HistoryBean.kt new file mode 100644 index 0000000..6c53c46 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HistoryBean.kt @@ -0,0 +1,33 @@ +package com.localee.mireo.app.http.api + +class HistoryBean ( + val list: List, + val pagination: Pagination +) { + + data class Data( + val name: String, + val short_play_video_id: Int, + var description: String, + val short_play_id: Int, + val image_url: String, + val episode_total: Int, + val current_episode: String, + var is_collect: Boolean, + var is_check: Boolean, + val categoryList: List + ) + + data class Pagination( + val current_page: Int, + val page_size: Int, + val page_total: Int, + val total_size: Int + ) + + data class categoryBean( + val id: String, + val name: String + ) + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeBannerApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeBannerApi.kt new file mode 100644 index 0000000..ea3c2e1 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeBannerApi.kt @@ -0,0 +1,31 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi +import java.io.Serializable + + +class HomeBannerApi : IRequestApi { + + override fun getApi(): String { + return "getBanners" + } + + class Bean : Serializable{ + var id: Int? = null + var short_id: Int? = null + var short_play_id: Int? = null + var name: String? = null + var description: String? = null + var process: Int? = null + var image_url: String? = null + var horizontally_img: String? = null + var buy_type: Int? = null + var tag_type: String? = null + var all_coins: Int? = null + var collect_total: Int? = null + var watch_total: Int? = null + var episode_total: Int? = null + var search_click_total: Int? = null + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeCategoriesApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeCategoriesApi.kt new file mode 100644 index 0000000..87d3a93 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeCategoriesApi.kt @@ -0,0 +1,22 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + + +class HomeCategoriesApi : IRequestApi { + + override fun getApi(): String { + return "getCategories" + } + + class Bean( + val list: List, + ) { + + data class Data( + val id: Int, + val name: String + ) + } + +} \ 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 new file mode 100644 index 0000000..9e2e176 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeDayMaxRechargeShortPlayRankApi.kt @@ -0,0 +1,18 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi +import java.io.Serializable + + +class HomeDayMaxRechargeShortPlayRankApi : IRequestApi { + + override fun getApi(): String { + return "homeRanking" + } + + class Bean { + var list: List? = null + + } + +} \ No newline at end of file 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 new file mode 100644 index 0000000..2af6f08 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeModuleApi.kt @@ -0,0 +1,32 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi +import java.io.Serializable + + +class HomeModuleApi : IRequestApi { + + override fun getApi(): String { + return "homeModuleData" + } + + class Bean : Serializable { + var bannerData: List? = null + var recommandData: RecommandDataBean? = null + var manualNewestRecommand: RecommandDataBean? = null + var hotData: List? = null + var newTopThree: List? = null + var highestPayment: List? = null + var hottestPist: List? = null + + } + + class RecommandDataBean { + var title: String? = null + var list: List? = null + + } + + + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeRecommendApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeRecommendApi.kt new file mode 100644 index 0000000..cc349ea --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeRecommendApi.kt @@ -0,0 +1,19 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi +import java.io.Serializable + + +class HomeRecommendApi : IRequestApi { + + override fun getApi(): String { + return "getRecommands" + } + + var current_page: Int? = null + var page_size: Int? = null + var revolution: String? = null + + + +} \ No newline at end of file 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 new file mode 100644 index 0000000..fd76e34 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/HomeVideoListApi.kt @@ -0,0 +1,33 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi +import java.io.Serializable + + +class HomeVideoListApi : IRequestApi { + + override fun getApi(): String { + return "videoList" + } + + var category_id : Int? = null + var current_page : Int? = null + var page_size : Int? = null + + class Bean ( + val list: List, + val pagination: Pagination + ) { + + 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/MyCollectionsApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/MyCollectionsApi.kt new file mode 100644 index 0000000..2fba14a --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/MyCollectionsApi.kt @@ -0,0 +1,16 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class MyCollectionsApi : IRequestApi { + + override fun getApi(): String { + return "myCollections" + } + + var current_page: Int? = null + + var page_size: Int? = null + + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/MyHistoryApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/MyHistoryApi.kt new file mode 100644 index 0000000..70deaec --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/MyHistoryApi.kt @@ -0,0 +1,16 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class MyHistoryApi : IRequestApi { + + override fun getApi(): String { + return "myHistorys" + } + + var current_page: Int? = null + + var page_size: Int? = null + + +} \ 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/api/RecommendBean.kt new file mode 100644 index 0000000..4f235fa --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/RecommendBean.kt @@ -0,0 +1,26 @@ +package com.localee.mireo.app.http.api + +class RecommendBean( + var id: Int, + var short_id: Int, + var short_play_id: Int, + var name: String, + var description: String, + var process: Int, + var image_url: String, + var horizontally_img: String, + var buy_type: String, + var tag_type: String, + var all_coins: String, + var collect_total: String, + var watch_total: Int, + var episode_total: String, + var search_click_total: String, + val category: List, + val categoryList: List + +) { + data class categoryBean( + val id: String, val name: String + ) +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/SearchHotApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/SearchHotApi.kt new file mode 100644 index 0000000..de5c895 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/SearchHotApi.kt @@ -0,0 +1,41 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + + +class SearchHotApi : IRequestApi { + + override fun getApi(): String { + return "search/hots" + } + + class Bean( + val list: List, + ) { + + data class Data( + val id: String, + val short_id: Int, + var short_play_id: Int, + val name: String, + val description: String, + val process: Int, + val image_url: String, + var horizontally_img: String, + var buy_type: Int, + var tag_type: String, + var all_coins: Int, + var collect_total: String, + var watch_total: String, + var episode_total: String, + var search_click_total: Boolean, + val categoryList: List + ) + + data class categoryBean( + val id: String, + val name: String + ) + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/SearchSearchApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/SearchSearchApi.kt new file mode 100644 index 0000000..a96b328 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/SearchSearchApi.kt @@ -0,0 +1,43 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + + +class SearchSearchApi : IRequestApi { + + override fun getApi(): String { + return "search" + } + + var search : String? = null + + class Bean( + val list: List, + ) { + + data class Data( + val id: String, + val short_id: Int, + var short_play_id: Int, + val name: String, + val description: String, + val process: Int, + val image_url: String, + var horizontally_img: String, + var buy_type: Int, + var tag_type: String, + var all_coins: Int, + var collect_total: String, + var watch_total: String, + var episode_total: String, + var search_click_total: Boolean, + val categoryList: List + ) + + data class categoryBean( + val id: String, + val name: String + ) + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/UserInfoApi.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/UserInfoApi.kt new file mode 100644 index 0000000..0448312 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/UserInfoApi.kt @@ -0,0 +1,14 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + + +class UserInfoApi : IRequestApi { + + override fun getApi(): String { + return "customer/info" + } + + var short_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/UserInfoRes.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/UserInfoRes.kt new file mode 100644 index 0000000..0f0a64b --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/UserInfoRes.kt @@ -0,0 +1,30 @@ +package com.localee.mireo.app.http.api + +class UserInfoRes ( + val avator: String = "", + val coin_left_total: Int = 0, + val country: String = "", + val country_code: String = "", + val customer_id: String = "", + val email: String = "", + val family_name: String = "", + val fn: String = "", + val giving_name: String = "", + val id: String = "", + val ip_address: String = "0.0.0.0", + val is_guide_vip: Boolean = false, + val is_tourist: Boolean = true, + val is_vip: Boolean = false, + val ln: String = "", + 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_type: String = "" +) { + companion object { + fun createWithDefaults(): UserInfoRes { + return UserInfoRes() + } + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..76e5fc6 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/api/VideoDetailsApi.kt @@ -0,0 +1,165 @@ +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 + + +class VideoDetailsApi : IRequestApi { + + override fun getApi(): String { + return "getVideoDetails" + } + + var short_play_id: Int? = null + + var video_id: Int? = null + + + data class Bean( + 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/http/exception/HttpBodyInterceptor.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/exception/HttpBodyInterceptor.kt new file mode 100644 index 0000000..8aeef45 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/exception/HttpBodyInterceptor.kt @@ -0,0 +1,85 @@ +package com.localee.mireo.app.http.exception + +import okhttp3.Interceptor +import okhttp3.Response +import okhttp3.ResponseBody +import java.io.IOException + + +class HttpBodyInterceptor : Interceptor { + val EN_STR_TAG = '$' + + @kotlin.jvm.Throws(IOException::class) + override fun intercept(chain: Interceptor.Chain): Response { + val k_center = chain.proceed(chain.request()) + + return if (k_center.body() != null && k_center.body()!!.contentType() != null) { + val actiity = k_center.body()!!.contentType() + val circle = k_center.body()!!.string() + val str = deStr(circle) + val current = ResponseBody.create(actiity, str) + k_center.newBuilder().body(current).build() + } else { + + k_center + } + } + + fun deStr(data: String): String { + return String(deStrBytes(data), Charsets.UTF_8) + } + + // Decrypt bytes from hex string + fun deStrBytes(data: String): ByteArray { + if (!data.startsWith(EN_STR_TAG)) { + throw IllegalArgumentException("Invalid encoded string") + } + val hexData = data.substring(1) + val bytes = hexData.chunked(2).map { it.toInt(16).toByte() }.toByteArray() + return de(bytes) + } + + // Decrypt data + fun de(data: ByteArray): ByteArray { + if (data.isEmpty()) { + return data + } + val saltLen = data[0].toInt() + val salt = data.slice(1 until 1 + saltLen).toByteArray() + return deWithSalt(data.slice(1 + saltLen until data.size).toByteArray(), salt) + } + + // Decrypt data with salt + fun deWithSalt(data: ByteArray, salt: ByteArray): ByteArray { + val decryptedData = cxEd(data) + return removeSalt(decryptedData, salt) + } + + // Encrypt/Decrypt data by flipping bits + fun cxEd(data: ByteArray): ByteArray { + return data.map { (it.toInt() xor 0xFF).toByte() }.toByteArray() + } + + // Remove salt from data + fun removeSalt(data: ByteArray, salt: ByteArray): ByteArray { + if (salt.isEmpty()) return data + val ret = mutableListOf() + var idx = 0 + val sl = salt.size + data.forEach { + val s = salt[idx % sl] + ret.add(calRemoveSalt(it, s)) + idx++ + } + return ret.toByteArray() + } + + fun calRemoveSalt(v: Byte, s: Byte): Byte { + return if (v >= s) { + (v - s).toByte() + } else { + (0xFF - (s - v) + 1).toByte() + } + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/exception/ResultException.java b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/exception/ResultException.java new file mode 100644 index 0000000..684548c --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/exception/ResultException.java @@ -0,0 +1,27 @@ +package com.localee.mireo.app.http.exception; + +import androidx.annotation.NonNull; + +import com.localee.mireo.app.http.model.HttpData; +import com.hjq.http.exception.HttpException; + + +public final class ResultException extends HttpException { + + private final HttpData mData; + + public ResultException(String message, HttpData data) { + super(message); + mData = data; + } + + public ResultException(String message, Throwable cause, HttpData data) { + super(message, cause); + mData = data; + } + + @NonNull + public HttpData getHttpData() { + return mData; + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/exception/TokenException.java b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/exception/TokenException.java new file mode 100644 index 0000000..1803d33 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/exception/TokenException.java @@ -0,0 +1,15 @@ +package com.localee.mireo.app.http.exception; + +import com.hjq.http.exception.HttpException; + + +public final class TokenException extends HttpException { + + public TokenException(String message) { + super(message); + } + + public TokenException(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/CharsetInterceptor.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/CharsetInterceptor.kt new file mode 100644 index 0000000..3f9c35c --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/CharsetInterceptor.kt @@ -0,0 +1,22 @@ +package com.localee.mireo.app.http.model + +import okhttp3.Interceptor +import okhttp3.Response + +class CharsetInterceptor : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + val response = chain.proceed(request) + + val contentType = response.header("Content-Type") + val newContentType = if (contentType?.contains("charset=") == true) { + contentType + } else { + "$contentType; charset=utf-8" + } + + return response.newBuilder() + .header("Content-Type", newContentType) + .build() + } +} diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/HttpCacheManager.java b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/HttpCacheManager.java new file mode 100644 index 0000000..98db64f --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/HttpCacheManager.java @@ -0,0 +1,64 @@ +package com.localee.mireo.app.http.model; + +import androidx.annotation.NonNull; +import com.hjq.gson.factory.GsonFactory; +import com.hjq.http.config.IRequestApi; +import com.hjq.http.request.HttpRequest; +import com.tencent.mmkv.MMKV; + + +public final class HttpCacheManager { + + private static final MMKV HTTP_CACHE_CONTENT = MMKV.mmkvWithID("http_cache_content");; + + private static final MMKV HTTP_CACHE_TIME = MMKV.mmkvWithID("http_cache_time"); + + @NonNull + public static String generateCacheKey(@NonNull HttpRequest httpRequest) { + IRequestApi requestApi = httpRequest.getRequestApi(); + return "请替换成当前的用户 id" + "\n" + requestApi.getApi() + "\n" + GsonFactory.getSingletonGson().toJson(requestApi); + } + + public static String readHttpCache(@NonNull String cacheKey) { + String cacheValue = HTTP_CACHE_CONTENT.getString(cacheKey, null); + if (cacheValue == null || cacheValue.isEmpty() || "{}".equals(cacheValue)) { + return null; + } + return cacheValue; + } + + public static boolean writeHttpCache(String cacheKey, String cacheValue) { + return HTTP_CACHE_CONTENT.putString(cacheKey, cacheValue).commit(); + } + + public static boolean deleteHttpCache(String cacheKey) { + return HTTP_CACHE_CONTENT.remove(cacheKey).commit(); + } + + public static void clearCache() { + HTTP_CACHE_CONTENT.clearMemoryCache(); + HTTP_CACHE_CONTENT.clearAll(); + + HTTP_CACHE_TIME.clearMemoryCache(); + HTTP_CACHE_TIME.clearAll(); + } + + public static long getHttpCacheTime(String cacheKey) { + return HTTP_CACHE_TIME.getLong(cacheKey, 0); + } + + public static boolean setHttpCacheTime(String cacheKey, long cacheTime) { + return HTTP_CACHE_TIME.putLong(cacheKey, cacheTime).commit(); + } + + public static boolean isCacheInvalidate(String cacheKey, long maxCacheTime) { + if (maxCacheTime == Long.MAX_VALUE) { + return false; + } + long httpCacheTime = getHttpCacheTime(cacheKey); + if (httpCacheTime == 0) { + return true; + } + return httpCacheTime + maxCacheTime < System.currentTimeMillis(); + } +} \ 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 new file mode 100644 index 0000000..2a11f49 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/HttpData.kt @@ -0,0 +1,30 @@ +package com.localee.mireo.app.http.model + +open class HttpData { + + private val code: Int = 0 + + private val msg: String? = null + + private val data: T? = null + + fun getCode(): Int { + return code + } + + fun getMessage(): String? { + return msg + } + + fun getData(): T? { + return data + } + + fun isRequestSucceed(): Boolean { + return code == 200 + } + + fun isTokenFailure(): Boolean { + return code == 1001 + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/HttpListData.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/HttpListData.kt new file mode 100644 index 0000000..9ce6973 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/HttpListData.kt @@ -0,0 +1,38 @@ +package com.localee.mireo.app.http.model + +import com.localee.mireo.app.http.model.HttpListData.ListBean +import kotlin.math.ceil + +class HttpListData : HttpData?>() { + + class ListBean { + + private val pageIndex: Int = 0 + + private val pageSize: Int = 0 + + private val totalNumber: Int = 0 + + private val items: MutableList? = null + + fun isLastPage(): Boolean { + return ceil((totalNumber.toFloat() / pageSize.toFloat())) <= pageIndex + } + + fun getTotalNumber(): Int { + return totalNumber + } + + fun getPageIndex(): Int { + return pageIndex + } + + fun getPageSize(): Int { + return pageSize + } + + fun getItems(): MutableList? { + return items + } + } +} \ 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 new file mode 100644 index 0000000..318b0d6 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/RequestHandler.kt @@ -0,0 +1,238 @@ +package com.localee.mireo.app.http.model + +import android.app.Application +import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.net.ConnectivityManager +import com.google.gson.JsonSyntaxException +import com.hjq.gson.factory.GsonFactory +import com.hjq.http.EasyLog +import com.hjq.http.config.IRequestHandler +import com.hjq.http.exception.CancelException +import com.hjq.http.exception.DataException +import com.hjq.http.exception.HttpException +import com.hjq.http.exception.NetworkException +import com.hjq.http.exception.NullBodyException +import com.hjq.http.exception.ResponseException +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.app.http.exception.TokenException +import com.tencent.mmkv.MMKV +import okhttp3.Headers +import okhttp3.Response +import okhttp3.ResponseBody +import java.io.IOException +import java.io.InputStream +import java.lang.reflect.GenericArrayType +import java.lang.reflect.Type +import java.net.SocketTimeoutException +import java.net.UnknownHostException + + +class RequestHandler constructor(private val mApplication: Application) : IRequestHandler { + + + override fun requestSuccess(httpRequest: HttpRequest<*>, response: Response, type: Type): Any { + if (Response::class.java == type) { + return response + } + + + if (!response.isSuccessful) { + throw ResponseException( + String.format( + mApplication.getString(R.string.http_response_error), + response.code(), response.message() + ), response + ) + } + if (Headers::class.java == type) { + return response.headers() + } + + val body = response.body() + ?: throw NullBodyException(mApplication.getString(R.string.http_response_null_body)) + if (ResponseBody::class.java == type) { + return body + } +// val decryptedString = response.body()?.string()?.let { decrypt(it) } +// +// body = ResponseBody.create(response.body()!!.contentType(), decryptedString) + + // 如果是用数组接收,判断一下是不是用 byte[] 类型进行接收的 + if (type is GenericArrayType) { + val genericComponentType = type.genericComponentType + if (Byte::class.javaPrimitiveType == genericComponentType) { + return body.bytes() + } + } + + if (InputStream::class.java == type) { + return body.byteStream() + } + + if (Bitmap::class.java == type) { + return BitmapFactory.decodeStream(body.byteStream()) + } + + val text: String + try { + text = body.string() + } catch (e: IOException) { + throw DataException(mApplication.getString(R.string.http_data_explain_error), e) + } + + EasyLog.printJson(httpRequest, text) + + if (String::class.java == type) { + return text + } + + val result: Any + + try { + result = GsonFactory.getSingletonGson().fromJson(text, type) + } catch (e: JsonSyntaxException) { + throw DataException(mApplication.getString(R.string.http_data_explain_error), e) + } + + if (result is HttpData<*>) { + val model = result + val headers = response.headers() + val headersSize = headers.size() + val headersMap: MutableMap = HashMap(headersSize) + for (i in 0 until headersSize) { + headersMap[headers.name(i)] = headers.value(i) + } + + if (model.isRequestSucceed()) { + return result + } + + if (model.isTokenFailure()) { + throw TokenException( + mApplication.getString(R.string.http_token_error) + ) + } + + throw ResultException(model.getMessage(), model) + } + return result + } + + override fun requestFail(httpRequest: HttpRequest<*>, throwable: Throwable): Throwable { + if (throwable is HttpException) { + if (throwable is TokenException) { + } + return throwable + } + + if (throwable is SocketTimeoutException) { + return TimeoutException( + mApplication.getString(R.string.http_server_out_time), + throwable + ) + } + + if (throwable is UnknownHostException) { + val info = + (mApplication.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).activeNetworkInfo + if (info != null && info.isConnected) { + return ServerException( + mApplication.getString(R.string.http_server_error), + throwable + ) + } + return NetworkException(mApplication.getString(R.string.http_network_error), throwable) + } + + if (throwable is IOException) { + return CancelException(mApplication.getString(R.string.http_request_cancel), throwable) + } + + return HttpException(throwable.message, throwable) + } + + + override fun readCache(httpRequest: HttpRequest<*>, type: Type, cacheTime: Long): Any? { + val cacheKey: String = + HttpCacheManager.generateCacheKey( + httpRequest + ) + val cacheValue: String = + HttpCacheManager.readHttpCache( + cacheKey + ) + if (cacheValue == null || cacheValue.isEmpty() || "{}" == cacheValue) { + return null + } + EasyLog.printLog(httpRequest, "----- read cache key -----") + EasyLog.printJson(httpRequest, cacheKey) + EasyLog.printLog(httpRequest, "----- read cache value -----") + EasyLog.printJson(httpRequest, cacheValue) + EasyLog.printLog(httpRequest, "cacheTime = $cacheTime") + val cacheInvalidate: Boolean = + HttpCacheManager.isCacheInvalidate( + cacheKey, + cacheTime + ) + EasyLog.printLog(httpRequest, "cacheInvalidate = $cacheInvalidate") + if (cacheInvalidate) { + return null + } + return GsonFactory.getSingletonGson().fromJson(cacheValue, type) + } + + override fun writeCache(httpRequest: HttpRequest<*>, response: Response, result: Any): Boolean { + val cacheKey = + HttpCacheManager.generateCacheKey( + httpRequest + ) + val cacheValue = GsonFactory.getSingletonGson().toJson(result) + if (cacheValue == null || cacheValue.isEmpty() || "{}" == cacheValue) { + return false + } + EasyLog.printLog(httpRequest, "----- write cache key -----") + EasyLog.printJson(httpRequest, cacheKey) + EasyLog.printLog(httpRequest, "----- write cache value -----") + EasyLog.printJson(httpRequest, cacheValue) + val writeHttpCacheResult = + HttpCacheManager.writeHttpCache( + cacheKey, + cacheValue + ) + EasyLog.printLog(httpRequest, "writeHttpCacheResult = $writeHttpCacheResult") + val refreshHttpCacheTimeResult = + HttpCacheManager.setHttpCacheTime( + cacheKey, + System.currentTimeMillis() + ) + EasyLog.printLog(httpRequest, "refreshHttpCacheTimeResult = $refreshHttpCacheTimeResult") + return writeHttpCacheResult && refreshHttpCacheTimeResult + } + + override fun deleteCache(httpRequest: HttpRequest<*>): Boolean { + val cacheKey = + HttpCacheManager.generateCacheKey( + httpRequest + ) + EasyLog.printLog(httpRequest, "----- delete cache key -----") + EasyLog.printJson(httpRequest, cacheKey) + val deleteHttpCacheResult = + HttpCacheManager.deleteHttpCache( + cacheKey + ) + EasyLog.printLog(httpRequest, "deleteHttpCacheResult = $deleteHttpCacheResult") + return deleteHttpCacheResult + } + + override fun clearCache() { + HttpCacheManager.clearCache() + } + + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/RequestServer.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/RequestServer.kt new file mode 100644 index 0000000..cce51ca --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/http/model/RequestServer.kt @@ -0,0 +1,12 @@ +package com.localee.mireo.app.http.model + +import com.localee.mireo.app.other.AppConfig +import com.hjq.http.config.IRequestServer + +class RequestServer : IRequestServer { + + override fun getHost(): String { + return AppConfig.getHostUrl() + } + +} \ 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 new file mode 100644 index 0000000..24c8937 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/manager/ActivityManager.kt @@ -0,0 +1,183 @@ +package com.localee.mireo.app.manager + +import android.app.Activity +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 { + + companion object { + + @Suppress("StaticFieldLeak") + private val activityManager: ActivityManager by lazy { ActivityManager() } + + fun getInstance(): ActivityManager { + return activityManager + } + + private fun getObjectTag(`object`: Any): String { + return `object`.javaClass.name + Integer.toHexString(`object`.hashCode()) + } + } + + private val activitySet: ArrayMap = ArrayMap() + + private val lifecycleCallbacks: ArrayList = ArrayList() + + private lateinit var application: Application + + private var topActivity: Activity? = null + + private var resumedActivity: Activity? = null + + fun init(application: Application) { + this.application = application + this.application.registerActivityLifecycleCallbacks(this) + } + + fun getApplication(): Application { + return application + } + + fun getTopActivity(): Activity? { + return topActivity + } + + fun getResumedActivity(): Activity? { + return resumedActivity + } + + fun isForeground(): Boolean { + return getResumedActivity() != null + } + + fun registerApplicationLifecycleCallback(callback: ApplicationLifecycleCallback) { + lifecycleCallbacks.add(callback) + } + fun unregisterApplicationLifecycleCallback(callback: ApplicationLifecycleCallback) { + lifecycleCallbacks.remove(callback) + } + + fun finishActivity(clazz: Class?) { + if (clazz == null) { + return + } + val keys: Array = activitySet.keys.toTypedArray() + for (key: String? in keys) { + val activity: Activity? = activitySet[key] + if (activity == null || activity.isFinishing) { + continue + } + if ((activity.javaClass == clazz)) { + activity.finish() + activitySet.remove(key) + break + } + } + } + + fun finishAllActivities() { + finishAllActivities(null as Class?) + } + + @SafeVarargs + fun finishAllActivities(vararg classArray: Class?) { + val keys: Array = activitySet.keys.toTypedArray() + for (key: String? in keys) { + val activity: Activity? = activitySet[key] + if (activity == null || activity.isFinishing) { + continue + } + var whiteClazz = false + for (clazz: Class? in classArray) { + if ((activity.javaClass == clazz)) { + whiteClazz = true + } + } + if (whiteClazz) { + continue + } + + activity.finish() + activitySet.remove(key) + } + } + + 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 + } + if (resumedActivity == null) { + 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 + } + if (activitySet.size == 0) { + for (callback: ApplicationLifecycleCallback in lifecycleCallbacks) { + callback.onApplicationDestroy(activity) + } + Timber.i("%s - onApplicationDestroy", activity.javaClass.simpleName) + } + } + + interface ApplicationLifecycleCallback { + + fun onApplicationCreate(activity: Activity) + + fun onApplicationDestroy(activity: Activity) + + fun onApplicationBackground(activity: Activity) + + fun onApplicationForeground(activity: Activity) + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/manager/CacheDataManager.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/manager/CacheDataManager.kt new file mode 100644 index 0000000..91e73e2 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/manager/CacheDataManager.kt @@ -0,0 +1,77 @@ +package com.localee.mireo.app.manager + +import android.content.Context +import android.os.Environment +import com.tencent.bugly.crashreport.CrashReport +import java.io.File +import java.math.BigDecimal + +object CacheDataManager { + + fun getTotalCacheSize(context: Context): String { + var cacheSize: Long = getFolderSize(context.cacheDir) + if ((Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED)) { + cacheSize += getFolderSize(context.externalCacheDir!!) + } + return getFormatSize(cacheSize.toDouble()) + } + + fun clearAllCache(context: Context) { + deleteDir(context.cacheDir) + if ((Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED)) { + deleteDir(context.externalCacheDir) + } + } + + private fun deleteDir(dir: File?): Boolean { + if (dir == null) { + return false + } + if (!dir.isDirectory) { + return dir.delete() + } + val children: Array = dir.list() ?: return false + for (child: String in children) { + deleteDir(File(dir, child)) + } + return false + } + + private fun getFolderSize(file: File): Long { + var size: Long = 0 + try { + val list: Array = file.listFiles() ?: return 0 + for (temp: File in list) { + size += if (temp.isDirectory) { + getFolderSize(temp) + } else { + temp.length() + } + } + } catch (e: Exception) { + CrashReport.postCatchedException(e) + } + return size + } + + fun getFormatSize(size: Double): String { + val kiloByte: Double = size / 1024 + if (kiloByte < 1) { + // return size + "Byte"; + return "0K" + } + val megaByte: Double = kiloByte / 1024 + if (megaByte < 1) { + return BigDecimal(kiloByte).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "K" + } + val gigaByte: Double = megaByte / 1024 + if (gigaByte < 1) { + return BigDecimal(megaByte).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "M" + } + val teraBytes: Double = gigaByte / 1024 + if (teraBytes < 1) { + return BigDecimal(gigaByte).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB" + } + return BigDecimal(teraBytes).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB" + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/manager/PickerLayoutManager.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/manager/PickerLayoutManager.kt new file mode 100644 index 0000000..1bb93f3 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/manager/PickerLayoutManager.kt @@ -0,0 +1,186 @@ +package com.localee.mireo.app.manager + +import android.content.Context +import android.view.View +import androidx.core.view.ViewCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.LinearSnapHelper +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.Recycler +import kotlin.math.abs +import kotlin.math.min + +class PickerLayoutManager private constructor( + context: Context, orientation: Int, reverseLayout: Boolean, maxItem: Int, scale: Float, alpha: Boolean) : + LinearLayoutManager(context, orientation, reverseLayout) { + + private val linearSnapHelper: LinearSnapHelper = LinearSnapHelper() + private val maxItem: Int + private val scale: Float + private val alpha: Boolean + private var recyclerView: RecyclerView? = null + private var listener: OnPickerListener? = null + + init { + this.maxItem = maxItem + this.alpha = alpha + this.scale = scale + } + + override fun onAttachedToWindow(recyclerView: RecyclerView) { + super.onAttachedToWindow(recyclerView) + this.recyclerView = recyclerView + this.recyclerView!!.clipToPadding = false + // 添加 LinearSnapHelper + linearSnapHelper.attachToRecyclerView(this.recyclerView) + } + + override fun onDetachedFromWindow(recyclerView: RecyclerView?, recycler: Recycler?) { + super.onDetachedFromWindow(recyclerView, recycler) + this.recyclerView = null + } + + override fun isAutoMeasureEnabled(): Boolean { + return maxItem == 0 + } + + override fun onMeasure(recycler: Recycler, state: RecyclerView.State, widthSpec: Int, heightSpec: Int) { + var width: Int = chooseSize(widthSpec, paddingLeft + paddingRight, ViewCompat.getMinimumWidth(recyclerView!!)) + var height: Int = chooseSize(heightSpec, paddingTop + paddingBottom, ViewCompat.getMinimumHeight(recyclerView!!)) + if (state.itemCount != 0 && maxItem != 0) { + val itemView: View = recycler.getViewForPosition(0) + measureChildWithMargins(itemView, widthSpec, heightSpec) + if (orientation == HORIZONTAL) { + val measuredWidth: Int = itemView.measuredWidth + val paddingHorizontal: Int = (maxItem - 1) / 2 * measuredWidth + recyclerView!!.setPadding(paddingHorizontal, 0, paddingHorizontal, 0) + width = measuredWidth * maxItem + } else if (orientation == VERTICAL) { + val measuredHeight: Int = itemView.measuredHeight + val paddingVertical: Int = (maxItem - 1) / 2 * measuredHeight + recyclerView!!.setPadding(0, paddingVertical, 0, paddingVertical) + height = measuredHeight * maxItem + } + } + setMeasuredDimension(width, height) + } + + override fun onScrollStateChanged(state: Int) { + super.onScrollStateChanged(state) + if (state != RecyclerView.SCROLL_STATE_IDLE) { + return + } + recyclerView?.let { + listener?.onPicked(it, getPickedPosition()) + } + } + + override fun onLayoutChildren(recycler: Recycler, state: RecyclerView.State) { + super.onLayoutChildren(recycler, state) + if (itemCount < 0 || state.isPreLayout) { + return + } + if (orientation == HORIZONTAL) { + scaleHorizontalChildView() + } else if (orientation == VERTICAL) { + scaleVerticalChildView() + } + } + + override fun scrollHorizontallyBy(dx: Int, recycler: Recycler?, state: RecyclerView.State?): Int { + scaleHorizontalChildView() + return super.scrollHorizontallyBy(dx, recycler, state) + } + + override fun scrollVerticallyBy(dy: Int, recycler: Recycler?, state: RecyclerView.State?): Int { + scaleVerticalChildView() + return super.scrollVerticallyBy(dy, recycler, state) + } + + private fun scaleHorizontalChildView() { + val mid: Float = width / 2.0f + for (i in 0 until childCount) { + val childView: View = getChildAt(i) ?: continue + val childMid: Float = + (getDecoratedLeft(childView) + getDecoratedRight(childView)) / 2.0f + val scale: Float = 1.0f + (-1 * (1 - scale)) * min(mid, abs(mid - childMid)) / mid + childView.scaleX = scale + childView.scaleY = scale + if (alpha) { + childView.alpha = scale + } + } + } + + private fun scaleVerticalChildView() { + val mid: Float = height / 2.0f + for (i in 0 until childCount) { + val childView: View = getChildAt(i) ?: continue + val childMid: Float = (getDecoratedTop(childView) + getDecoratedBottom(childView)) / 2.0f + val scale: Float = 1.0f + (-1 * (1 - scale)) * (min(mid, abs(mid - childMid))) / mid + childView.scaleX = scale + childView.scaleY = scale + if (alpha) { + childView.alpha = scale + } + } + } + + fun getPickedPosition(): Int { + val itemView: View = linearSnapHelper.findSnapView(this) ?: return 0 + return getPosition(itemView) + } + + fun setOnPickerListener(listener: OnPickerListener?) { + this.listener = listener + } + + interface OnPickerListener { + + fun onPicked(recyclerView: RecyclerView, position: Int) + } + + class Builder constructor(private val context: Context) { + + private var orientation: Int = VERTICAL + private var reverseLayout: Boolean = false + private var listener: OnPickerListener? = null + private var maxItem: Int = 3 + private var scale: Float = 0.6f + private var alpha: Boolean = true + + fun setOrientation(@RecyclerView.Orientation orientation: Int): Builder = apply { + this.orientation = orientation + } + + fun setReverseLayout(reverseLayout: Boolean): Builder = apply { + this.reverseLayout = reverseLayout + } + + fun setMaxItem(maxItem: Int): Builder = apply { + this.maxItem = maxItem + } + + fun setScale(scale: Float): Builder = apply { + this.scale = scale + } + + fun setAlpha(alpha: Boolean): Builder = apply { + this.alpha = alpha + } + + fun setOnPickerListener(listener: OnPickerListener?): Builder = apply { + this.listener = listener + } + + fun build(): PickerLayoutManager { + val layoutManager = PickerLayoutManager(context, orientation, reverseLayout, maxItem, scale, alpha) + layoutManager.setOnPickerListener(listener) + return layoutManager + } + + fun into(recyclerView: RecyclerView) { + recyclerView.layoutManager = build() + } + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..276f853 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/AppConfig.kt @@ -0,0 +1,34 @@ +package com.localee.mireo.app.other + +import com.localee.mireo.app.BuildConfig + +object AppConfig { + + fun isDebug(): Boolean { + return BuildConfig.DEBUG + } + + fun getBuildType(): String { + return BuildConfig.BUILD_TYPE + } + + fun isLogEnable(): Boolean { + return BuildConfig.LOG_ENABLE + } + + fun getPackageName(): String { + return BuildConfig.APPLICATION_ID + } + + fun getVersionName(): String { + return BuildConfig.VERSION_NAME + } + + fun getVersionCode(): Int { + return BuildConfig.VERSION_CODE + } + + fun getHostUrl(): String { + return BuildConfig.HOST_URL + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/CrashHandler.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/CrashHandler.kt new file mode 100644 index 0000000..9aa74c4 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/CrashHandler.kt @@ -0,0 +1,56 @@ +package com.localee.mireo.app.other + +import android.app.* +import android.content.* +import android.os.Process + +class CrashHandler private constructor(private val application: Application) : + Thread.UncaughtExceptionHandler { + + companion object { + + private const val CRASH_FILE_NAME: String = "crash_file" + + private const val KEY_CRASH_TIME: String = "key_crash_time" + + fun register(application: Application) { + Thread.setDefaultUncaughtExceptionHandler(CrashHandler(application)) + } + } + + private val nextHandler: Thread.UncaughtExceptionHandler? = Thread.getDefaultUncaughtExceptionHandler() + + init { + if ((javaClass.name == nextHandler?.javaClass?.name)) { + throw IllegalStateException("are you ok?") + } + } + + @Suppress("ApplySharedPref") + override fun uncaughtException(thread: Thread, throwable: Throwable) { + val sharedPreferences: SharedPreferences = application.getSharedPreferences( + CRASH_FILE_NAME, Context.MODE_PRIVATE) + val currentCrashTime: Long = System.currentTimeMillis() + val lastCrashTime: Long = sharedPreferences.getLong(KEY_CRASH_TIME, 0) + sharedPreferences.edit().putLong(KEY_CRASH_TIME, currentCrashTime).commit() + + val deadlyCrash: Boolean = currentCrashTime - lastCrashTime < 1000 * 60 * 5 +// if (AppConfig.isDebug()) { +// CrashActivity.start(application, throwable) +// } else { +// if (!deadlyCrash) { +// // 如果不是致命的异常就自动重启应用 +// RestartActivity.start(application) +// } +// } + + // 不去触发系统的崩溃处理(com.android.internal.os.RuntimeInit$KillApplicationHandler) + if (nextHandler != null && !nextHandler.javaClass.name + .startsWith("com.android.internal.os")) { + nextHandler.uncaughtException(thread, throwable) + } + + Process.killProcess(Process.myPid()) + System.exit(10) + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..b3b03a7 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/DebugLoggerTree.kt @@ -0,0 +1,19 @@ +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/MaterialHeader.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/MaterialHeader.kt new file mode 100644 index 0000000..bf8c1c2 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/MaterialHeader.kt @@ -0,0 +1,239 @@ +package com.localee.mireo.app.other + +import android.content.Context +import android.content.res.TypedArray +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.graphics.Path +import android.util.AttributeSet +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.scwang.smart.refresh.header.material.CircleImageView +import com.scwang.smart.refresh.header.material.MaterialProgressDrawable +import com.scwang.smart.refresh.layout.api.RefreshHeader +import com.scwang.smart.refresh.layout.api.RefreshKernel +import com.scwang.smart.refresh.layout.api.RefreshLayout +import com.scwang.smart.refresh.layout.constant.RefreshState +import com.scwang.smart.refresh.layout.constant.SpinnerStyle +import com.scwang.smart.refresh.layout.simple.SimpleComponent +import kotlin.math.abs +import kotlin.math.max +import kotlin.math.min +import kotlin.math.pow + +class MaterialHeader @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : + SimpleComponent(context, attrs, 0), RefreshHeader { + + companion object { + + const val BALL_STYLE_LARGE: Int = 0 + + const val BALL_STYLE_DEFAULT: Int = 1 + + private val CIRCLE_BG_LIGHT: Int = Color.parseColor("#FAFAFA") + private const val MAX_PROGRESS_ANGLE: Float = 0.8f + } + + private var finished: Boolean = false + private var circleDiameter: Int + private var circleView: ImageView + private var progressDrawable: MaterialProgressDrawable + private var waveHeight: Int = 0 + private var headHeight: Int = 0 + private var bezierPath: Path + private var bezierPaint: Paint + private var refreshState: RefreshState? = null + private var showBezierWave: Boolean = false + private var scrollableWhenRefreshing: Boolean = true + + init { + mSpinnerStyle = SpinnerStyle.MatchLayout + minimumHeight = resources.getDimension(R.dimen.dp_100).toInt() + progressDrawable = MaterialProgressDrawable(this) + progressDrawable.setColorSchemeColors( + Color.parseColor("#0099CC"), + Color.parseColor("#FF4444"), + Color.parseColor("#669900"), + Color.parseColor("#AA66CC"), + Color.parseColor("#FF8800")) + circleView = CircleImageView(context, CIRCLE_BG_LIGHT) + circleView.setImageDrawable(progressDrawable) + circleView.alpha = 0f + addView(circleView) + circleDiameter = resources.getDimension(R.dimen.dp_40).toInt() + bezierPath = Path() + bezierPaint = Paint() + bezierPaint.isAntiAlias = true + bezierPaint.style = Paint.Style.FILL + val typedArray: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.MaterialHeader) + showBezierWave = typedArray.getBoolean(R.styleable.MaterialHeader_srlShowBezierWave, showBezierWave) + scrollableWhenRefreshing = typedArray.getBoolean(R.styleable.MaterialHeader_srlScrollableWhenRefreshing, scrollableWhenRefreshing) + bezierPaint.color = typedArray.getColor(R.styleable.MaterialHeader_srlPrimaryColor, Color.parseColor("#11BBFF")) + if (typedArray.hasValue(R.styleable.MaterialHeader_srlShadowRadius)) { + val radius: Int = typedArray.getDimensionPixelOffset(R.styleable.MaterialHeader_srlShadowRadius, 0) + val color: Int = typedArray.getColor(R.styleable.MaterialHeader_mhShadowColor, Color.parseColor("#000000")) + bezierPaint.setShadowLayer(radius.toFloat(), 0f, 0f, color) + setLayerType(LAYER_TYPE_SOFTWARE, null) + } + showBezierWave = typedArray.getBoolean(R.styleable.MaterialHeader_mhShowBezierWave, showBezierWave) + scrollableWhenRefreshing = typedArray.getBoolean(R.styleable.MaterialHeader_mhScrollableWhenRefreshing, scrollableWhenRefreshing) + if (typedArray.hasValue(R.styleable.MaterialHeader_mhPrimaryColor)) { + bezierPaint.color = typedArray.getColor(R.styleable.MaterialHeader_mhPrimaryColor, Color.parseColor("#11BBFF")) + } + if (typedArray.hasValue(R.styleable.MaterialHeader_mhShadowRadius)) { + val radius: Int = typedArray.getDimensionPixelOffset(R.styleable.MaterialHeader_mhShadowRadius, 0) + val color: Int = typedArray.getColor(R.styleable.MaterialHeader_mhShadowColor, Color.parseColor("#000000")) + bezierPaint.setShadowLayer(radius.toFloat(), 0f, 0f, color) + setLayerType(LAYER_TYPE_SOFTWARE, null) + } + typedArray.recycle() + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + super.setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)) + + circleView.measure(MeasureSpec.makeMeasureSpec(circleDiameter, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(circleDiameter, MeasureSpec.EXACTLY)) + } + + override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { + if (childCount == 0) { + return + } + val width: Int = measuredWidth + val circleWidth: Int = circleView.measuredWidth + val circleHeight: Int = circleView.measuredHeight + if (isInEditMode && headHeight > 0) { + val circleTop: Int = headHeight - circleHeight / 2 + circleView.layout((width / 2 - circleWidth / 2), circleTop, + (width / 2 + circleWidth / 2), circleTop + circleHeight) + progressDrawable.showArrow(true) + progressDrawable.setStartEndTrim(0f, MAX_PROGRESS_ANGLE) + progressDrawable.setArrowScale(1f) + circleView.alpha = 1f + circleView.visibility = VISIBLE + } else { + circleView.layout((width / 2 - circleWidth / 2), -circleHeight, (width / 2 + circleWidth / 2), 0) + } + } + + override fun dispatchDraw(canvas: Canvas) { + if (showBezierWave) { + // 重置画笔 + bezierPath.reset() + bezierPath.lineTo(0f, headHeight.toFloat()) + // 绘制贝塞尔曲线 + bezierPath.quadTo(measuredWidth / 2f, headHeight + waveHeight * 1.9f, measuredWidth.toFloat(), headHeight.toFloat()) + bezierPath.lineTo(measuredWidth.toFloat(), 0f) + canvas.drawPath(bezierPath, bezierPaint) + } + super.dispatchDraw(canvas) + } + + override fun onInitialized(kernel: RefreshKernel, height: Int, maxDragHeight: Int) { + if (!showBezierWave) { + kernel.requestDefaultTranslationContentFor(this, false) + } + if (isInEditMode) { + headHeight = height / 2 + waveHeight = headHeight + } + } + + override fun onMoving(dragging: Boolean, percent: Float, offset: Int, height: Int, maxDragHeight: Int) { + if (refreshState == RefreshState.Refreshing) { + return + } + if (showBezierWave) { + headHeight = min(offset, height) + waveHeight = max(0, offset - height) + postInvalidate() + } + if (dragging || (!progressDrawable.isRunning && !finished)) { + if (refreshState != RefreshState.Refreshing) { + val originalDragPercent: Float = 1f * offset / height + val dragPercent: Float = min(1f, abs(originalDragPercent)) + val adjustedPercent: Float = max(dragPercent - .4, 0.0).toFloat() * 5 / 3 + val extraOs: Float = (abs(offset) - height).toFloat() + val tensionSlingshotPercent: Float = max(0f, (min(extraOs, height.toFloat() * 2) / height.toFloat())) + val tensionPercent: Float = ((tensionSlingshotPercent / 4) - (tensionSlingshotPercent / 4).toDouble().pow(2.0)).toFloat() * 2f + val strokeStart: Float = adjustedPercent * .8f + progressDrawable.showArrow(true) + progressDrawable.setStartEndTrim(0f, min(MAX_PROGRESS_ANGLE, strokeStart)) + progressDrawable.setArrowScale(min(1f, adjustedPercent)) + val rotation: Float = (-0.25f + (.4f * adjustedPercent) + (tensionPercent * 2)) * .5f + progressDrawable.setProgressRotation(rotation) + } + val targetY: Float = offset / 2f + circleDiameter / 2f + circleView.translationY = min(offset.toFloat(), targetY) + circleView.alpha = min(1f, 4f * offset / circleDiameter) + } + } + + override fun onReleased(layout: RefreshLayout, height: Int, maxDragHeight: Int) { + progressDrawable.start() + } + + override fun onStateChanged(refreshLayout: RefreshLayout, oldState: RefreshState, newState: RefreshState) { + refreshState = newState + if (newState == RefreshState.PullDownToRefresh) { + finished = false + circleView.visibility = VISIBLE + circleView.translationY = 0f + circleView.scaleX = 1f + circleView.scaleY = 1f + } + } + + override fun onFinish(layout: RefreshLayout, success: Boolean): Int { + progressDrawable.stop() + circleView.animate().scaleX(0f).scaleY(0f) + finished = true + return 0 + } + + fun setProgressBackgroundResource(@ColorRes id: Int): MaterialHeader = apply { + setProgressBackgroundColor(ContextCompat.getColor(context, id)) + } + + fun setProgressBackgroundColor(@ColorInt color: Int): MaterialHeader = apply { + circleView.setBackgroundColor(color) + } + + fun setColorSchemeColors(@ColorInt vararg colors: Int): MaterialHeader = apply { + progressDrawable.setColorSchemeColors(*colors) + } + + fun setColorSchemeResources(@ColorRes vararg ids: Int): MaterialHeader = apply { + val colors = IntArray(ids.size) + for (i in ids.indices) { + colors[i] = ContextCompat.getColor(context, ids[i]) + } + setColorSchemeColors(*colors) + } + + fun setBallStyle(style: Int): MaterialHeader = apply { + if (style != BALL_STYLE_LARGE && style != BALL_STYLE_DEFAULT) { + return@apply + } + circleDiameter = if (style == BALL_STYLE_LARGE) resources.getDimension(R.dimen.dp_56).toInt() else resources.getDimension(R.dimen.dp_40).toInt() + // force the bounds of the progress circle inside the circle view to + // update by setting it to null before updating its size and then + // re-setting it + circleView.setImageDrawable(null) + progressDrawable.updateSizes(style) + circleView.setImageDrawable(progressDrawable) + } + + fun setShowBezierWave(show: Boolean): MaterialHeader = apply { + showBezierWave = show + } + + fun setScrollableWhenRefreshing(scrollable: Boolean): MaterialHeader = apply { + scrollableWhenRefreshing = scrollable + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..c81a7d8 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/MsConstants.kt @@ -0,0 +1,65 @@ +package com.localee.mireo.app.other + +object MsConstants { + + const val ACCESS_TOKEN = "access_token" + const val APP_LANG = "app_langs" + + const val CONSTANTS_User_STRING = "CONSTANTS_User_STRING" + + const val Constants_web = "https://www.mireotv.com/" + 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" + + + var ExampleIsCurrentPage: Boolean = true + var Exampleplaying: Boolean = false + var ExampleDetailPlaying: Boolean = false + var Exampleready: Boolean = false + var ExampleDetailCanPlay: Boolean = true + var CanNotification: Boolean = false + var WebRefresh: Boolean = false + var isBannerScrolling: Boolean = true + var seek = true + const val Constants_RecommendPlayerView_PLAYER_STATUS_FINISHExample = + "Constants_RecommendPlayerView_PLAYER_STATUS_FINISHExample" + const val Constants_DetailPlayerView_PLAYER_STATUS_FINISHExample = + "Constants_DetailPlayerView_PLAYER_STATUS_FINISHE" + const val Constants_RecommendPlayerView_CLOSEExample = + "Constants_RecommendPlayerView_CLOSEExample" + const val Constants_RecommendPlayerView_DramaSeriesExample = + "Constants_RecommendPlayerView_DramaSeriesExample" + const val Constants_Episodes_Series_Data_currentPositionExample = + "Constants_Episodes_Series_Data_currentPositionExample" + const val Constants_Episodes_Series_Data_ListExample = + "Constants_Episodes_Series_Data_ListExample" + const val CONSTANTS_Translates_STRING = "CONSTANTS_Translates_STRING" + const val CONSTANTS_quality_refresh = "CONSTANTS_quality_refresh" + const val CONSTANTS_quality = "CONSTANTS_quality" + const val Constants_Episodes_Series_DataExample = "Constants_Episodes_Series_DataExample" + + const val CONSTANTS_short_play_id = "CONSTANTS_short_play_id" + const val CONSTANTS_activity_id = "CONSTANTS_activity_id" + const val CONSTANTS_stop_play = "CONSTANTS_stop_play" + +} \ 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 new file mode 100644 index 0000000..f3483f0 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/PermissionCallback.kt @@ -0,0 +1,188 @@ +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 new file mode 100644 index 0000000..9fa1174 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/SmartBallPulseFooter.kt @@ -0,0 +1,149 @@ +package com.localee.mireo.app.other + +import android.animation.TimeInterpolator +import android.content.Context +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +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.scwang.smart.refresh.layout.api.RefreshFooter +import com.scwang.smart.refresh.layout.api.RefreshLayout +import com.scwang.smart.refresh.layout.constant.SpinnerStyle +import com.scwang.smart.refresh.layout.simple.SimpleComponent +import kotlin.math.min + +class SmartBallPulseFooter @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : + SimpleComponent(context, attrs, 0), RefreshFooter { + + private val interpolator: TimeInterpolator = AccelerateDecelerateInterpolator() + + private var noMoreData: Boolean = false + private var manualNormalColor: Boolean = false + private var manualAnimationColor: Boolean = false + private val paint: Paint = Paint() + private var normalColor: Int = Color.parseColor("#EEEEEE") + + private var animatingColor: IntArray = intArrayOf( + Color.parseColor("#30B399"), + Color.parseColor("#FF4600"), + Color.parseColor("#142DCC") + ) + + private val circleSpacing: Float + private var startTime: Long = 0 + private var started: Boolean = false + private val textWidth: Float + + init { + minimumHeight = resources.getDimension(R.dimen.dp_60).toInt() + paint.color = Color.WHITE + paint.style = Paint.Style.FILL + paint.isAntiAlias = true + mSpinnerStyle = SpinnerStyle.Translate + circleSpacing = resources.getDimension(R.dimen.dp_2) + paint.textSize = resources.getDimension(R.dimen.sp_14) + textWidth = paint.measureText(getContext().getString(R.string.common_no_more_data)) + } + + override fun dispatchDraw(canvas: Canvas) { + val width: Int = width + val height: Int = height + if (noMoreData) { + paint.color = Color.parseColor("#898989") + canvas.drawText( + context.getString(R.string.common_no_more_data), + (width - textWidth) / 2, (height - paint.textSize) / 2, paint + ) + } else { + val radius: Float = (min(width, height) - circleSpacing * 2) / 7 + val x: Float = width / 2f - (radius * 2 + circleSpacing) + val y: Float = height / 2f + val now: Long = System.currentTimeMillis() + for (i in 0..2) { + val time: Long = now - startTime - (120 * (i + 1)) + var percent: Float = if (time > 0) ((time % 750) / 750f) else 0f + percent = interpolator.getInterpolation(percent) + canvas.save() + val translateX: Float = x + ((radius * 2) * i) + (circleSpacing * i) + if (percent < 0.5) { + val scale: Float = 1 - percent * 2 * 0.7f + val translateY: Float = y - scale * 10 + canvas.translate(translateX, translateY) + } else { + val scale: Float = percent * 2 * 0.7f - 0.4f + val translateY: Float = y + scale * 10 + canvas.translate(translateX, translateY) + } + paint.color = animatingColor[i % animatingColor.size] + canvas.drawCircle(0f, 0f, radius / 3, paint) + canvas.restore() + } + } + if (started) { + postInvalidate() + } + } + + override fun onStartAnimator(layout: RefreshLayout, height: Int, maxDragHeight: Int) { + if (started) { + return + } + invalidate() + started = true + startTime = System.currentTimeMillis() + } + + override fun onFinish(layout: RefreshLayout, success: Boolean): Int { + started = false + startTime = 0 + paint.color = normalColor + return 0 + } + + override fun setPrimaryColors(@ColorInt vararg colors: Int) { + if (!manualAnimationColor && colors.size > 1) { + setAnimatingColor(colors[0]) + manualAnimationColor = false + } + if (!manualNormalColor) { + if (colors.size > 1) { + setNormalColor(colors[1]) + } else if (colors.isNotEmpty()) { + setNormalColor(ColorUtils.compositeColors(Color.parseColor("#99FFFFFF"), colors[0])) + } + manualNormalColor = false + } + } + + override fun setNoMoreData(noMoreData: Boolean): Boolean { + this.noMoreData = noMoreData + return true + } + + fun setSpinnerStyle(style: SpinnerStyle?): SmartBallPulseFooter = apply { + mSpinnerStyle = style + } + + fun setNormalColor(@ColorInt color: Int): SmartBallPulseFooter = apply { + normalColor = color + manualNormalColor = true + if (!started) { + paint.color = color + } + } + + fun setAnimatingColor(@ColorInt color: Int): SmartBallPulseFooter = apply { + animatingColor = intArrayOf(color) + manualAnimationColor = true + if (started) { + paint.color = color + } + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..c49ed16 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/TitleBarStyle.kt @@ -0,0 +1,74 @@ +package com.localee.mireo.app.other + +import android.content.* +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable +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 + +class TitleBarStyle : LightBarStyle() { + + override fun newTitleView(context: Context): TextView { + return AppCompatTextView(context) + } + + override fun newLeftView(context: Context): TextView { + return PressAlphaTextView(context) + } + + override fun newRightView(context: Context): TextView { + return PressAlphaTextView(context) + } + + override fun getTitleBarBackground(context: Context): Drawable { + return ColorDrawable(ContextCompat.getColor(context, R.color.common_primary_color)) + } + + override fun getBackButtonDrawable(context: Context): Drawable? { + return ContextCompat.getDrawable(context, R.drawable.arrows_left_ic) + } + + override fun getLeftTitleBackground(context: Context): Drawable? { + return null + } + + override fun getRightTitleBackground(context: Context): Drawable? { + return null + } + + override fun getChildHorizontalPadding(context: Context): Int { + return context.resources.getDimension(R.dimen.dp_12).toInt() + } + + override fun getChildVerticalPadding(context: Context): Int { + return context.resources.getDimension(R.dimen.dp_14).toInt() + } + + override fun getTitleSize(context: Context): Float { + return context.resources.getDimension(R.dimen.sp_15) + } + + override fun getLeftTitleSize(context: Context): Float { + return context.resources.getDimension(R.dimen.sp_13) + } + + override fun getRightTitleSize(context: Context): Float { + return context.resources.getDimension(R.dimen.sp_13) + } + + override fun getTitleIconPadding(context: Context): Int { + return context.resources.getDimension(R.dimen.dp_2).toInt() + } + + override fun getLeftIconPadding(context: Context): Int { + return context.resources.getDimension(R.dimen.dp_2).toInt() + } + + override fun getRightIconPadding(context: Context): Int { + return context.resources.getDimension(R.dimen.dp_2).toInt() + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..606bb4a --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/other/ToastStyle.kt @@ -0,0 +1,29 @@ +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.hjq.toast.style.BlackToastStyle + +class ToastStyle : BlackToastStyle() { + + override fun getBackgroundDrawable(context: Context): Drawable { + val drawable = GradientDrawable() + drawable.setColor(-0x78000000) + drawable.cornerRadius = context.resources.getDimension(R.dimen.button_circle_size) + return drawable + } + + override fun getTextSize(context: Context): Float { + return context.resources.getDimension(R.dimen.sp_14) + } + + override fun getHorizontalPadding(context: Context): Int { + return context.resources.getDimension(R.dimen.sp_24).toInt() + } + + override fun getVerticalPadding(context: Context): Int { + return context.resources.getDimension(R.dimen.sp_16).toInt() + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..705ff62 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/AboutActivity.kt @@ -0,0 +1,45 @@ +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.app.app.AppActivity +import com.localee.mireo.app.other.MsConstants + +class AboutActivity : AppActivity() { + + + override fun getLayoutId(): Int { + return R.layout.about_activity + } + + override fun initView() { + setOnClickListener(R.id.sb_about_web, R.id.sb_about_privacy, R.id.sb_about_agreement) + + } + + 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) + } + + R.id.sb_about_privacy -> { + BrowserActivity.start(this, MsConstants.Constants_privacy_policy) + } + + R.id.sb_about_agreement -> { + BrowserActivity.start(this, MsConstants.Constants_user_agreement) + } + + } + } + +} \ 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 new file mode 100644 index 0000000..b4900cf --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/BrowserActivity.kt @@ -0,0 +1,143 @@ +package com.localee.mireo.app.ui.activity + +import android.app.Activity +import android.content.* +import android.graphics.Bitmap +import android.graphics.drawable.BitmapDrawable +import android.text.TextUtils +import android.view.* +import android.webkit.WebView +import android.widget.ProgressBar +import com.localee.mireo.app.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 +import com.localee.mireo.app.widget.BrowserView.BrowserViewClient +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.OnRefreshListener + +class BrowserActivity : AppActivity(), StatusAction, OnRefreshListener { + + companion object { + + const val INTENT_KEY_IN_URL: String = "url" + + @CheckNet + @Log + fun start(context: Context, url: String) { + if (TextUtils.isEmpty(url)) { + return + } + val intent = Intent(context, BrowserActivity::class.java) + intent.putExtra(INTENT_KEY_IN_URL, url) + if (context !is Activity) { + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + context.startActivity(intent) + } + } + + private val hintLayout: StatusLayout? by lazy { findViewById(R.id.hl_browser_hint) } + private val progressBar: ProgressBar? by lazy { findViewById(R.id.pb_browser_progress) } + private val refreshLayout: SmartRefreshLayout? by lazy { findViewById(R.id.sl_browser_refresh) } + private val browserView: BrowserView? by lazy { findViewById(R.id.wv_browser_view) } + + override fun getLayoutId(): Int { + return R.layout.browser_activity + } + + override fun initView() { + browserView?.setLifecycleOwner(this) + refreshLayout?.setOnRefreshListener(this) + } + + override fun initData() { + showLoading() + browserView?.apply { + setBrowserViewClient(AppBrowserViewClient()) + setBrowserChromeClient(AppBrowserChromeClient(this)) + loadUrl(getString(INTENT_KEY_IN_URL)!!) + } + } + + override fun getStatusLayout(): StatusLayout? { + return hintLayout + } + + override fun onLeftClick(view: View) { + finish() + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + browserView?.apply { + if (keyCode == KeyEvent.KEYCODE_BACK && canGoBack()) { + // 后退网页并且拦截该事件 + goBack() + return true + } + } + return super.onKeyDown(keyCode, event) + } + + @CheckNet + private fun reload() { + browserView?.reload() + } + + /** + * [OnRefreshListener] + */ + override fun onRefresh(refreshLayout: RefreshLayout) { + reload() + } + + private inner class AppBrowserViewClient : BrowserViewClient() { + + override fun onReceivedError(view: WebView, errorCode: Int, description: String, failingUrl: String) { + post { + showError(object : OnRetryListener { + override fun onRetry(layout: StatusLayout) { + reload() + } + }) + } + } + + override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) { + progressBar?.visibility = View.VISIBLE + } + + override fun onPageFinished(view: WebView, url: String) { + progressBar?.visibility = View.GONE + refreshLayout?.finishRefresh() + showComplete() + } + } + + private inner class AppBrowserChromeClient constructor(view: BrowserView) : BrowserChromeClient(view) { + + override fun onReceivedTitle(view: WebView, title: String?) { + if (title == null) { + return + } + setTitle(title) + } + + override fun onReceivedIcon(view: WebView, icon: Bitmap?) { + if (icon == null) { + return + } + setRightIcon(BitmapDrawable(resources, icon)) + } + + override fun onProgressChanged(view: WebView, newProgress: Int) { + progressBar?.progress = newProgress + } + } +} \ 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 new file mode 100644 index 0000000..cb01473 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/HomeActivity.kt @@ -0,0 +1,171 @@ +package com.localee.mireo.app.ui.activity + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.activity.viewModels +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager.widget.ViewPager +import com.localee.mireo.app.utils.MsMMKVUtils +import com.gyf.immersionbar.ImmersionBar +import com.hjq.base.FragmentPagerAdapter +import com.hjq.http.EasyHttp +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.http.model.HttpData +import com.localee.mireo.app.ui.adapter.NavigationAdapter +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.SharedViewModel + +class HomeActivity : AppActivity(), NavigationAdapter.OnNavigationListener { + + companion object { + + private const val INTENT_KEY_IN_FRAGMENT_INDEX: String = "fragmentIndex" + private const val INTENT_KEY_IN_FRAGMENT_CLASS: String = "fragmentClass" + + @JvmOverloads + fun start( + context: Context, + fragmentClass: Class?>? = HomeFragment::class.java + ) { + val intent = Intent(context, HomeActivity::class.java) + intent.putExtra(INTENT_KEY_IN_FRAGMENT_CLASS, fragmentClass) + if (context !is Activity) { + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + context.startActivity(intent) + } + } + + 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 val viewModel: SharedViewModel by viewModels() + + override fun getLayoutId(): Int { + return R.layout.home_activity + } + + override fun initView() { + + navigationAdapter = NavigationAdapter(this).apply { + addItem( + NavigationAdapter.MenuItem( + getString(R.string.home_nav_index), + ContextCompat.getDrawable(this@HomeActivity, R.drawable.home_home_selector) + ) + ) + addItem( + NavigationAdapter.MenuItem( + getString(R.string.home_nav_explore), + ContextCompat.getDrawable(this@HomeActivity, R.drawable.home_explore_selector) + ) + ) + addItem( + NavigationAdapter.MenuItem( + getString(R.string.home_nav_my_list), + ContextCompat.getDrawable(this@HomeActivity, R.drawable.home_my_list_selector) + ) + ) + addItem( + NavigationAdapter.MenuItem( + getString(R.string.home_nav_me), + ContextCompat.getDrawable(this@HomeActivity, R.drawable.home_me_selector) + ) + ) + setOnNavigationListener(this@HomeActivity) + navigationView?.adapter = this + } + } + + override fun initData() { +// getCustomerUser() + + pagerAdapter = FragmentPagerAdapter>(this).apply { + addFragment(HomeFragment.newInstance()) + addFragment(ExploreFragment.newInstance()) + addFragment(MessageFragment.newInstance()) + addFragment(MineFragment.newInstance()) + viewPager?.adapter = this + } + onNewIntent(intent) + + viewModel.action.observe(this) { data -> + switchFragment(data); + } + } + + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + pagerAdapter?.let { + switchFragment(it.getFragmentIndex(getSerializable(INTENT_KEY_IN_FRAGMENT_CLASS))) + } + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + viewPager?.let { + outState.putInt(INTENT_KEY_IN_FRAGMENT_INDEX, it.currentItem) + } + } + + override fun onRestoreInstanceState(savedInstanceState: Bundle) { + super.onRestoreInstanceState(savedInstanceState) + switchFragment(savedInstanceState.getInt(INTENT_KEY_IN_FRAGMENT_INDEX)) + } + + private fun switchFragment(fragmentIndex: Int) { + if (fragmentIndex == -1) { + return + } + when (fragmentIndex) { + 0, 1, 2, 3 -> { + viewPager?.currentItem = fragmentIndex + navigationAdapter?.setSelectedPosition(fragmentIndex) + } + } + } + + /** + * [NavigationAdapter.OnNavigationListener] + */ + override fun onNavigationItemSelected(position: Int): Boolean { + return when (position) { + 0, 1, 2, 3 -> { + viewPager?.currentItem = position + true + } + else -> false + } + } + + + override fun createStatusBarConfig(): ImmersionBar { + return super.createStatusBarConfig() + .navigationBarColor(R.color.white) + } + + override fun onBackPressed() { + moveTaskToBack(false) + } + + + override fun onDestroy() { + super.onDestroy() + viewPager?.adapter = null + navigationView?.adapter = null + navigationAdapter?.setOnNavigationListener(null) + } +} \ 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 new file mode 100644 index 0000000..547e460 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/SearchActivity.kt @@ -0,0 +1,160 @@ +package com.localee.mireo.app.ui.activity + +import android.content.Intent +import android.text.Editable +import android.text.TextUtils +import android.text.TextWatcher +import android.widget.EditText +import android.widget.ImageView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +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.SearchHotAdapter +import com.localee.mireo.app.ui.adapter.SearchSearchAdapter +import com.localee.mireo.app.widget.StatusLayout +import com.hjq.http.EasyHttp +import com.hjq.http.config.IRequestApi +import com.hjq.http.listener.HttpCallbackProxy + + +class SearchActivity : AppActivity(), StatusAction { + + private val hintLayout: StatusLayout? by lazy { findViewById(R.id.hl_status_hint) } + 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 var mAdapter: SearchHotAdapter? = null + private var mKeyAdapter: SearchSearchAdapter? = null + + override fun getLayoutId(): Int { + return R.layout.status_activity + } + + override fun initView() { + + recycler?.layoutManager = + LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) + + + mAdapter = SearchHotAdapter() + mKeyAdapter = SearchSearchAdapter() + recycler?.adapter = mAdapter + + getSearchHot() + + } + + override fun initData() { + ivClose?.setOnClickListener { + finish() + } + + etSearch?.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) { + } + + 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 + } + } + + override fun afterTextChanged(editable: Editable) { + } + }) + + mAdapter?.setOnItemClickListener { adapter, view, position -> + val searchHot: com.localee.mireo.app.http.api.SearchHotApi.Bean.Data = adapter.items.get(position) + startActivity( + Intent( + this, + VideoPlayActivity::class.java + ).apply { + searchHot.short_play_id.let { + putExtra(CONSTANTS_short_play_id, it) + } + }) + } + mKeyAdapter?.setOnItemClickListener { adapter, view, position -> + val search: com.localee.mireo.app.http.api.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 getSearchHot() { + EasyHttp.get(this) + .api(com.localee.mireo.app.http.api.SearchHotApi().apply { + }) + .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) + } + } + + + override fun onHttpFail(throwable: Throwable) { + super.onHttpFail(throwable) + hintLayout?.show() + } + }) + } + + fun getSearchSearch(searchKey: String) { + EasyHttp.get(this) + .api(com.localee.mireo.app.http.api.SearchSearchApi().apply { + search = searchKey + }) + .request(object : HttpCallbackProxy>(this) { + + override fun onHttpStart(api: IRequestApi) { + + } + + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (it.list.isEmpty()) { + hintLayout?.show() + } else { + hintLayout?.hide() + } + mKeyAdapter?.submitList(it.list) + } + } + + override fun onHttpFail(throwable: Throwable) { + super.onHttpFail(throwable) + hintLayout?.show() + } + + }) + } + + 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/SettingActivity.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/SettingActivity.kt new file mode 100644 index 0000000..7f20143 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/SettingActivity.kt @@ -0,0 +1,47 @@ +package com.localee.mireo.app.ui.activity + +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.singleClick +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + + +class SettingActivity : AppActivity(){ + + private val cleanCacheView: SettingBar? by lazy { findViewById(R.id.sb_setting_cache) } + + override fun getLayoutId(): Int { + return R.layout.setting_activity + } + + override fun initView() { + + cleanCacheView?.setOnClickListener { + singleClick { + // 清除内存缓存(必须在主线程) + Glide.get(this@SettingActivity).clearMemory() + lifecycleScope.launch(Dispatchers.IO) { + CacheDataManager.clearAllCache(this@SettingActivity) + // 清除本地缓存(必须在子线程) + Glide.get(this@SettingActivity).clearDiskCache() + withContext(Dispatchers.Main) { + // 重新获取应用缓存大小 + cleanCacheView?.setRightText(CacheDataManager.getTotalCacheSize(this@SettingActivity)) + } + } + } + } + } + + override fun initData() { + // 获取应用缓存大小 + cleanCacheView?.setRightText(CacheDataManager.getTotalCacheSize(this)) + } + +} \ No newline at end of file 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 new file mode 100644 index 0000000..336c6d5 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/SplashActivity.kt @@ -0,0 +1,31 @@ +package com.localee.mireo.app.ui.activity + +import com.gyf.immersionbar.BarHide +import com.gyf.immersionbar.ImmersionBar +import com.localee.mireo.app.R +import com.localee.mireo.app.app.AppActivity + + +class SplashActivity : AppActivity() { + + + override fun getLayoutId(): Int { + return R.layout.splash_activity + } + + override fun initView() { + postDelayed(Runnable { + HomeActivity.start(this@SplashActivity) + finish() + }, 300) + } + + override fun initData() { + } + + override fun createStatusBarConfig(): ImmersionBar { + return super.createStatusBarConfig() + .hideBar(BarHide.FLAG_HIDE_BAR) + } + +} \ 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 new file mode 100644 index 0000000..33ebf1b --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/activity/VideoPlayActivity.kt @@ -0,0 +1,635 @@ +package com.localee.mireo.app.ui.activity + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.TextView +import androidx.appcompat.widget.AppCompatImageView +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.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.CreateHistoryApi +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_activity_id +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.ui.videoPaly.ExampleSeriesDialogFragment +import com.localee.mireo.app.ui.videoPaly.ExampleUnFavoriteDialog +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.TranslatesUtils +import com.localee.mireo.app.utils.formatNumber +import com.localee.mireo.app.utils.singleClick +import com.scwang.smart.refresh.layout.SmartRefreshLayout +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode + +open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailCollection, + ExampleSeriesDialogFragment.SeriesCallBack { + + companion object { + const val INTENT_KEY_PARAMETERS: String = "parameters" + } + + private var first: Boolean = true + private var play: Boolean = true + private var qualityRefresh: 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 revolution = + MsMMKVUtils.getMMKV().getInt(MsConstants.CONSTANTS_quality, 0).toString() + + + private val srRecommend: SmartRefreshLayout? by lazy { findViewById(R.id.sr_recommend) } + private val viewPagerExampleRecommend: ViewPager2? by lazy { findViewById(R.id.viewPager_example_recommend) } + + private val exampleNetwork: ViewGroup? by lazy { findViewById(R.id.example_network) } + private val exampleTvNoNetwork: TextView? by lazy { exampleNetwork?.findViewById(R.id.example_tv_no_network) } + private val tvExampleRetry: TextView? by lazy { exampleNetwork?.findViewById(R.id.tv_example_retry) } + + 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 val avi: LoadingAnimationView? by lazy { findViewById(R.id.avi) } + private var shortVideoId: Int? = null + private var activityId: Int? = null + private var shortVideo: VideoDetailsApi.Bean.ShortPlayInfo? = null + + override fun getLayoutId(): Int { + return R.layout.video_play_activity + } + + override fun initView() { + shortVideoId = intent.getIntExtra(CONSTANTS_short_play_id, 0) + activityId = intent.getIntExtra(CONSTANTS_activity_id, 0) + EventBus.getDefault().register(this) + this.window?.setFlags( + WindowManager.LayoutParams.FLAG_SECURE, + WindowManager.LayoutParams.FLAG_SECURE + ) + this.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 + } + + override fun initData() { + initialization() + MsConstants.ExampleIsCurrentPage = true + if (!play) { + qualityLogic() + } else { + play = false + } + } + + fun initialization() { + + if (NetworkUtils.isConnected()) { +// avi?.start() + getVideoDetails() + + } else { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.no_network.toString()) + } else { + ToastUtils.show(getString(R.string.example_no_network)) + } + exampleNetwork?.visibility = View.VISIBLE + } + srRecommend?.setOnRefreshListener { + if (NetworkUtils.isConnected()) { +// avi?.start() + currentPage = 1 + viewPagerExampleRecommend?.post { + detailPlayerView()?.stop() + detailPlayerView()?.release() + } + getVideoDetails() + } else { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.no_network.toString()) + } else { + ToastUtils.show(getString(R.string.example_no_network)) + } + } + } + viewPagerExampleRecommend?.registerOnPageChangeCallback(object : + ViewPager2.OnPageChangeCallback() { + @SuppressLint("NotifyDataSetChanged") + override fun onPageSelected(position: Int) { + super.onPageSelected(position) + currentPosition = position + val previousPosition = exampleRecommendAdapter?.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 + ) + } + } + + } + } + + } + + override fun onPageScrollStateChanged(state: Int) { + super.onPageScrollStateChanged(state) + when (state) { + ViewPager2.SCROLL_STATE_IDLE -> { + if (viewPagerExampleRecommend?.currentItem == viewPagerExampleRecommend?.adapter?.itemCount?.minus( + 1 + ) + ) { + if (!first) { + getVideoDetails() + } else { + first = false + } + } + } + + ViewPager2.SCROLL_STATE_DRAGGING -> { + + } + + ViewPager2.SCROLL_STATE_SETTLING -> { + + } + } + } + }) + exampleTvEmpty?.setOnClickListener { + singleClick { + if (!NetworkUtils.isConnected()) { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.no_network.toString()) + } else { + ToastUtils.show(getString(R.string.example_no_network)) + } + return@singleClick + } +// avi?.start() + currentPage = 1 + getVideoDetails() + } + } + tvExampleRetry?.setOnClickListener { + singleClick { + if (!NetworkUtils.isConnected()) { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.no_network.toString()) + } else { + ToastUtils.show(getString(R.string.example_no_network)) + } + return@singleClick + } +// avi?.start() + currentPage = 1 + getVideoDetails() + } + } + } + +// 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() + if (!play) { + detailPlayerView()?.play() + } else { + play = false + } + } + + private fun qualityLogic() { + if (qualityRefresh) { + viewPagerExampleRecommend?.post { + detailPlayerView()?.stop() + detailPlayerView()?.release() + } + getVideoDetails() + qualityRefresh = false + } else { + detailPlayerView()?.play() + } + } + + override fun onPause() { + super.onPause() + MsConstants.ExampleIsCurrentPage = false + srRecommend?.postDelayed({ detailPlayerView()?.pause() }, 300) + } + + fun getVideoDetails() { + EasyHttp.get(this) + .api(VideoDetailsApi().apply { + if (activityId!! != 0) { + video_id = activityId; + } + short_play_id = shortVideoId; + + }) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + 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 = + this@VideoPlayActivity + createHistory( + it.episodeList[0].short_play_id, + it.episodeList[0].short_play_video_id + ); + exampleNetwork?.visibility = View.INVISIBLE + exampleEmpty?.visibility = View.INVISIBLE + } else { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.no_more_data.toString()) + } else { + ToastUtils.show(getString(R.string.example_there_s_no_more_data)) + } + if (currentPage == 1) { + exampleEmpty?.visibility = View.VISIBLE + } + } +// avi?.stop() + srRecommend?.finishRefresh() + } + } + }) + +// ExampleRecommendRequest.getVideoDetails(current_page, page_size, revolution) +// .observeForever { result -> +// recommendLiveData.value = result.getOrNull() +// } + } + + fun createHistory(videoId: Int, shortPlayId: Int) { + val sMap: MutableMap = LinkedHashMap() + // StringMap = getSortMap(StringMap); + sMap.put("short_play_id", videoId.toString()) + sMap.put("video_id", shortPlayId.toString()) + EasyHttp.post(this) + .api(CreateHistoryApi()) + .body(getPublicRequest(sMap)) + .request(object : HttpCallbackProxy>(this) { + + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + } + }) + } + + fun doCollect(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(com.localee.mireo.app.http.api.DoCollectApi()) + .body(getPublicRequest(sMap)) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (it != null) { + val imageView = + detailPlayerView()?.findViewById(R.id.example_iv_collection_controller) + val textview = + detailPlayerView()?.findViewById(R.id.example_tv_collection_num_controller) + imageView?.setImageResource(R.mipmap.iv_example_collection_h) + shortVideo?.collect_total = shortVideo?.collect_total?.plus(1)!! + shortVideo?.is_collect = true + textview?.text = formatNumber(shortVideo?.collect_total!!) + textview?.setTextColor(resources.getColor(R.color.example_color_F56490)) + exampleRecommendAdapter?.shortVideo = shortVideo + EventBus.getDefault().post( + BaseEventBus( + MsConstants.Constants_Episodes_Series_DataExample, + shortVideo + ) + ) + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.success.toString()) + } + } else { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.network_error.toString()) + } else { + toast(getString(R.string.example_service_exception_please_try_again)) + } + } + } + } + }) + } + + fun doCancelCollect(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(com.localee.mireo.app.http.api.CancelCollectApi()) + .body(getPublicRequest(sMap)) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (it != null) { + val imageView = + detailPlayerView()?.findViewById(R.id.example_iv_collection_controller) + val textview = + detailPlayerView()?.findViewById(R.id.example_tv_collection_num_controller) + imageView?.setImageResource(R.mipmap.iv_example_collection_n) + shortVideo?.collect_total = shortVideo?.collect_total?.minus(1)!! + shortVideo?.is_collect = false + textview?.text = formatNumber(shortVideo?.collect_total!!) + textview?.setTextColor(resources.getColor(R.color.white)) + exampleRecommendAdapter?.shortVideo = shortVideo + EventBus.getDefault().post( + BaseEventBus( + MsConstants.Constants_Episodes_Series_DataExample, + shortVideo + ) + ) + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.success.toString()) + } + } else { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.network_error.toString()) + } else { + toast(getString(R.string.example_service_exception_please_try_again)) + } + } + } + } + }) + } + + + private fun detailPlayerView(): VideoPlayerView? { + try { + val recyclerView = viewPagerExampleRecommend?.getChildAt(0) as RecyclerView + return recyclerView.layoutManager?.findViewByPosition(currentPosition) as VideoPlayerView? + } catch (e: Exception) { + e.printStackTrace() + } + return null + } + + override fun onDestroy() { + viewPagerExampleRecommend?.post { + detailPlayerView()?.stop() + detailPlayerView()?.release() + } + super.onDestroy() + EventBus.getDefault().unregister(this) + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(event: String) { + if (MsConstants.Constants_RecommendPlayerView_DramaSeriesExample == event) { + if (exampleRecommendAdapter?.items?.isNotEmpty() == true) { + val exampleSeriesDialogFragment = ExampleSeriesDialogFragment() + val bundle = Bundle() + bundle.putInt( + Constants_Episodes_Series_Data_currentPositionExample, + currentPosition + ) + bundle.putParcelable( + MsConstants.Constants_Episodes_Series_DataExample, + shortVideo + ) + bundle.putParcelableArrayList( + MsConstants.Constants_Episodes_Series_Data_ListExample, + exampleRecommendAdapter?.items?.let { ArrayList(it) } + ) + exampleSeriesDialogFragment.seriesCallBack = this + exampleSeriesDialogFragment.arguments = bundle + exampleSeriesDialogFragment.show( + supportFragmentManager, + "ExampleSeriesDialogFragment" + ) + } + } + if (MsConstants.Constants_DetailPlayerView_PLAYER_STATUS_FINISHExample == event) { + if (viewPagerExampleRecommend?.currentItem == exampleRecommendAdapter?.items?.size?.minus( + 1 + ) + ) { +// exampleHomeViewModel.getDetailsRecommand() + viewPagerExampleRecommend?.post { + detailPlayerView()?.pause() + detailPlayerView()?.release() + viewPagerExampleRecommend?.visibility = View.GONE + } + } + currentPosition.plus(1) + .let { + exampleRecommendAdapter?.items?.get(it)?.let { it1 -> + if (it1.coins > 0) { + if (MsMMKVUtils.getMMKV().getString( + CONSTANTS_short_play_id, + "" + ) == shortVideoId.toString() + ) { + } + } + } + detailPlayerView()?.stop() + viewPagerExampleRecommend?.currentItem = it + } + } + + if (CONSTANTS_quality_refresh == event) { + revolution = + MsMMKVUtils.getMMKV().getInt(MsConstants.CONSTANTS_quality, 0) + .toString() + qualityRefresh = true + } + + if (MsConstants.Constants_RecommendPlayerView_CLOSEExample == event) { + finish() + } + if (CONSTANTS_quality == event) { + startActivity(SearchActivity::class.java) + } + + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(event: BaseEventBus) { +// if (MsConstants.Constants_Episodes_Series_DataExample == event.code) { +// if (exampleRecommendAdapter?.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 = +// event.data.collect_total +// exampleRecommendAdapter?.items?.get(currentPosition)?.is_collect = +// event.data.is_collect +// textview?.text = formatNumber(event.data.collect_total) +// } +// } + } + +// override fun collection(dataRes: ExampleRecommendDataRes.Data) { +// singleClick { +// data = dataRes +// if (dataRes.is_collect) { +// 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 { +// dataRes.video_info?.short_play_id?.let { +// dataRes.video_info.short_play_video_id.let { it1 -> +// doCancelCollect( +// it, it1 +// ) +// } +// } +// exampleUnFavoriteDialog.dismiss() +// } +// exampleUnFavoriteDialog.show() +// } else { +// dataRes.video_info?.short_play_id?.let { +// dataRes.video_info.short_play_video_id.let { it1 -> +// doCollect( +// it, it1 +// ) +// } +// } +// } +// } +// } + + override fun collection(episode: VideoDetailsApi.Bean.Episode) { + singleClick { + if (!episode.is_lock) { + 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 { + episode.short_play_id.let { + episode.short_play_video_id.let { it1 -> + doCollect( + it, it1 + ) + } + } + } + } + } + } + + override fun chooseSeries(episode: VideoDetailsApi.Bean.Episode) { + postDelayed({ detailPlayerView()?.pause() }, 300) + episode.episode.minus(1) + .let { + viewPagerExampleRecommend?.currentItem = it + } + + } + + +} \ 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 new file mode 100644 index 0000000..72e1213 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeBannerAdapter.kt @@ -0,0 +1,62 @@ +package com.localee.mireo.app.ui.adapter + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +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.app.app.AppApplication +import com.localee.mireo.app.http.api.RecommendBean +import com.youth.banner.adapter.BannerAdapter + +class HomeBannerAdapter(mDatas: List) : + BannerAdapter(mDatas) { + + override fun onCreateHolder(parent: ViewGroup, viewType: Int): BannerViewHolder { + val view: View = + LayoutInflater.from(parent.context).inflate(R.layout.home_banner_item, parent, false) + + return BannerViewHolder(view) + } + + override fun onBindView( + holder: BannerViewHolder, + data: RecommendBean, + position: Int, + size: Int + ) { + Glide.with(AppApplication.instance) + .load(data.image_url) + .into(holder.imageView) + + holder.tvName.setText(data.name) + holder.tvDescription.setText(data.description) + + holder.tvAdd.setOnClickListener { + data.let { it1 -> homeBannerOnClick?.bannerAdd(it1) } + } + holder.tvPlay.setOnClickListener { + data.let { it1 -> homeBannerOnClick?.bannerPlay(it1) } + } + + } + + inner class BannerViewHolder(view: View) : RecyclerView.ViewHolder(view) { + val imageView: ImageView = view.findViewById(R.id.iv_img) + val tvName: TextView = view.findViewById(R.id.tv_name) + val tvDescription: TextView = view.findViewById(R.id.tv_description) + val tvAdd: TextView = view.findViewById(R.id.tv_add) + val tvPlay: TextView = view.findViewById(R.id.tv_play) + } + + var homeBannerOnClick: HomeBannerOnClick? = null + + interface HomeBannerOnClick { + fun bannerAdd(dataRes: RecommendBean) + fun bannerPlay(dataRes: RecommendBean) + } + +} \ No newline at end of file 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 new file mode 100644 index 0000000..7dff21d --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeCategoriesTabAdapter.kt @@ -0,0 +1,36 @@ +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.databinding.ItemListTabBinding +import com.localee.mireo.app.http.api.RecommendBean + +class HomeCategoriesTabAdapter : BaseQuickAdapter() { + + class VH( + parent: ViewGroup, + val binding: ItemListTabBinding = ItemListTabBinding.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: RecommendBean?) { + if (null != item) { + holder.binding.tvName.text = item.name + Glide.with(AppApplication.instance) + .load(item.image_url) + .into(holder.binding.ivContent) + + } + + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeCriticallyAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeCriticallyAdapter.kt new file mode 100644 index 0000000..1ba21aa --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeCriticallyAdapter.kt @@ -0,0 +1,52 @@ +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.bumptech.glide.Glide +import com.chad.library.adapter4.BaseQuickAdapter +import com.localee.mireo.app.app.AppApplication +import com.localee.mireo.app.databinding.ItemHomeCriticallyBinding +import com.localee.mireo.app.http.api.RecommendBean +import com.localee.mireo.app.utils.formatNumber + +class HomeCriticallyAdapter : + BaseQuickAdapter() { + + class VH( + parent: ViewGroup, + val binding: ItemHomeCriticallyBinding = ItemHomeCriticallyBinding.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: RecommendBean? + ) { + if (null != item) { + holder.binding.tvName.text = item.name + holder.binding.tvDescription.text = item.description + holder.binding.tvScore.text = item.all_coins + holder.binding.tvGood.text = item.watch_total?.let { formatNumber(it) } + if (item.category.isEmpty()) { + holder.binding.tvFavor.visibility = View.GONE + } else { + holder.binding.tvFavor.visibility = View.VISIBLE + holder.binding.tvFavor.text = item.category[0] + } + Glide.with(AppApplication.instance) + .load(item.image_url) + .into(holder.binding.ivContent) + + } + + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..fda849c --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeGenresAdapter.kt @@ -0,0 +1,42 @@ +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.hjq.shape.view.ShapeTextView +import com.localee.mireo.app.databinding.ItemHomeGenresBinding + +class HomeGenresAdapter(var id: Int) : BaseQuickAdapter() { + + class VH( + parent: ViewGroup, + val binding: ItemHomeGenresBinding = ItemHomeGenresBinding.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: String?) { + if (null != item) { + holder.binding.tvType.text = item + val text: ShapeTextView = holder.binding.tvType + + if (position == id) { + text.getShapeDrawableBuilder().setSolidColor(0xFFF8726D.toInt()) + .setShadowColor(0xFFF8726D.toInt()) + .intoBackground(); + } else { + text.getShapeDrawableBuilder().setSolidColor(0x00000000.toInt()) + .setShadowColor(0xFFF8726D.toInt()) + .intoBackground(); + } + + } + + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..70abf67 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeShortAdapter.kt @@ -0,0 +1,37 @@ +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.databinding.ItemHomeShortBinding +import com.localee.mireo.app.http.api.RecommendBean + +class HomeShortAdapter : BaseQuickAdapter() { + + class VH( + parent: ViewGroup, + val binding: ItemHomeShortBinding = ItemHomeShortBinding.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: RecommendBean?) { + if (null != item) { + holder.binding.tvName.text = item.name + holder.binding.tvDescription.text = item.description + Glide.with(AppApplication.instance) + .load(item.image_url) + .into(holder.binding.ivContent) + + } + + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..f800d1a --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/HomeTopAdapter.kt @@ -0,0 +1,54 @@ +package com.localee.mireo.app.ui.adapter + +import android.content.Context +import android.view.ViewGroup +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.app.app.AppApplication +import com.localee.mireo.app.http.api.RecommendBean + +class HomeTopAdapter(var type: Int) : + BaseQuickAdapter() { + + override fun onCreateViewHolder( + context: Context, + parent: ViewGroup, + viewType: Int + ): QuickViewHolder { + return QuickViewHolder(R.layout.item_home_top, parent) + } + + override fun onBindViewHolder( + holder: QuickViewHolder, + position: Int, + item: RecommendBean? + ) { + Glide.with(AppApplication.instance) + .load(item?.image_url) + .into(holder.getView(R.id.iv_content)) + + val text: ShapeTextView = holder.getView(R.id.tv_hot) + + when (type) { + 1 -> { + text.setText("HOT") + text.getShapeDrawableBuilder().setSolidColor(0xFFFF1E63.toInt()) + .intoBackground(); + } + + 2 -> { + text.setText("NEW") + text.getShapeDrawableBuilder().setSolidColor(0xFF564FC0.toInt()) + .intoBackground(); + } + + 3 -> { + + } + } + + } +} \ 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 new file mode 100644 index 0000000..7524e70 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/LostTabAdapter.kt @@ -0,0 +1,95 @@ +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.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 + +class LostTabAdapter(var tabPosition: Int) : + BaseQuickAdapter() { + + var type = 0 + var selectEdit = false + + class VH( + parent: ViewGroup, + val binding: ItemListTabBinding = ItemListTabBinding.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: HistoryBean.Data?) { + if (null != item) { + holder.binding.tvName.text = item.name + Glide.with(AppApplication.instance) + .load(item.image_url) + .into(holder.binding.ivContent) + holder.binding.tvName2.text = item.name + Glide.with(AppApplication.instance) + .load(item.image_url) + .into(holder.binding.ivContent2) + + if (type == 0) { + holder.binding.clOne.visibility = View.VISIBLE + holder.binding.rlTwo.visibility = View.GONE + } else { + holder.binding.clOne.visibility = View.GONE + holder.binding.rlTwo.visibility = View.VISIBLE + } + + if (selectEdit) { + holder.binding.cbOne.visibility = View.VISIBLE + holder.binding.cbTwo.visibility = View.VISIBLE + } else { + holder.binding.cbOne.visibility = View.GONE + holder.binding.cbTwo.visibility = View.GONE + } + + if (item.is_check) { + holder.binding.cbOne.isChecked = true + holder.binding.cbTwo.isChecked = true + } else { + holder.binding.cbOne.isChecked = false + holder.binding.cbTwo.isChecked = false + + } + + when (tabPosition) { + 0 -> { + if (item.categoryList?.isNotEmpty() == true) { + holder.binding.tvFavor.text = item.categoryList.get(0).name + holder.binding.tvFavor.visibility = View.VISIBLE + if (item.categoryList.size > 1) { + holder.binding.tvLove.text = item.categoryList.get(1).name + holder.binding.tvLove.visibility = View.VISIBLE + } else { + holder.binding.tvLove.visibility = View.GONE + } + } else { + holder.binding.tvFavor.visibility = View.GONE + } + } + + 1 -> { + holder.binding.tvFavor.text = + "EP" + item.current_episode + " / EP" + item.episode_total + holder.binding.tvFavor.visibility = View.VISIBLE + holder.binding.tvLove.visibility = View.GONE + } + } + + + } + + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..de6a8dc --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/MeHistoryAdapter.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.bumptech.glide.Glide +import com.chad.library.adapter4.BaseQuickAdapter +import com.localee.mireo.app.app.AppApplication +import com.localee.mireo.app.databinding.ItemMeHistoryBinding +import com.localee.mireo.app.http.api.HistoryBean + +class MeHistoryAdapter() : + BaseQuickAdapter() { + + var type = 0 + var selectEdit = false + + class VH( + parent: ViewGroup, + val binding: ItemMeHistoryBinding = ItemMeHistoryBinding.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: HistoryBean.Data?) { + if (null != item) { + Glide.with(AppApplication.instance) + .load(item.image_url) + .into(holder.binding.ivContent) + } + + } +} \ 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 new file mode 100644 index 0000000..8bc9f84 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/NavigationAdapter.kt @@ -0,0 +1,89 @@ +package com.localee.mireo.app.ui.adapter + +import android.content.* +import android.graphics.drawable.Drawable +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.app.AppAdapter + +class NavigationAdapter constructor(context: Context) : + AppAdapter(context), BaseAdapter.OnItemClickListener { + + private var selectedPosition: Int = 0 + + private var listener: OnNavigationListener? = null + + init { + setOnItemClickListener(this) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder() + } + + override fun generateDefaultLayoutManager(context: Context): RecyclerView.LayoutManager { + return GridLayoutManager(context, getCount(), RecyclerView.VERTICAL, false) + } + + fun getSelectedPosition(): Int { + return selectedPosition + } + + fun setSelectedPosition(position: Int) { + selectedPosition = position + notifyDataSetChanged() + } + + fun setOnNavigationListener(listener: OnNavigationListener?) { + this.listener = listener + } + + override fun onItemClick(recyclerView: RecyclerView?, itemView: View?, position: Int) { + if (selectedPosition == position) { + return + } + if (listener == null) { + selectedPosition = position + notifyDataSetChanged() + return + } + if (listener!!.onNavigationItemSelected(position)) { + selectedPosition = position + notifyDataSetChanged() + } + } + + inner class ViewHolder : AppViewHolder(R.layout.home_navigation_item) { + + private val iconView: ImageView? by lazy { findViewById(R.id.iv_home_navigation_icon) } + private val titleView: TextView? by lazy { findViewById(R.id.tv_home_navigation_title) } + + override fun onBindView(position: Int) { + getItem(position).apply { + iconView?.setImageDrawable(getDrawable()) + titleView?.text = getText() + iconView?.isSelected = (selectedPosition == position) + titleView?.isSelected = (selectedPosition == position) + } + } + } + + class MenuItem constructor(private val text: String?, private val drawable: Drawable?) { + + fun getText(): String? { + return text + } + + fun getDrawable(): Drawable? { + return drawable + } + } + + interface OnNavigationListener { + fun onNavigationItemSelected(position: Int): Boolean + } +} \ 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 new file mode 100644 index 0000000..a4fcb7f --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/SearchHotAdapter.kt @@ -0,0 +1,51 @@ +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.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 + +class SearchHotAdapter : BaseQuickAdapter() { + + class VH( + parent: ViewGroup, + val binding: ItemSearchHotBinding = ItemSearchHotBinding.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: SearchHotApi.Bean.Data?) { + if (null != item) { + holder.binding.tvName.text = item.name + holder.binding.tvDescription.text = item.description + // 设置item数据 + Glide.with(AppApplication.instance) + .load(item.image_url) + .into(holder.binding.ivContent) + + if (item.categoryList?.isNotEmpty() == true) { + holder.binding.tvFavor.text = item.categoryList.get(0).name + holder.binding.tvFavor.visibility = View.VISIBLE + if (item.categoryList.size > 1) { + holder.binding.tvLove.text = item.categoryList.get(1).name + holder.binding.tvLove.visibility = View.VISIBLE + } else { + holder.binding.tvLove.visibility = View.GONE + } + } else { + holder.binding.tvFavor.visibility = View.GONE + } + } + + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/SearchSearchAdapter.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/SearchSearchAdapter.kt new file mode 100644 index 0000000..ba5edd7 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/SearchSearchAdapter.kt @@ -0,0 +1,31 @@ +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.app.databinding.ItemSearchSearchBinding +import com.localee.mireo.app.http.api.SearchSearchApi + +class SearchSearchAdapter : BaseQuickAdapter() { + + class VH( + parent: ViewGroup, + val binding: ItemSearchSearchBinding = ItemSearchSearchBinding.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) { + holder.binding.tvKey.text = item.name + + } + + } +} \ 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 new file mode 100644 index 0000000..af05b81 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/adapter/TabAdapter.kt @@ -0,0 +1,223 @@ +package com.localee.mireo.app.ui.adapter + +import android.animation.ValueAnimator +import android.animation.ValueAnimator.AnimatorUpdateListener +import android.content.Context +import android.util.TypedValue +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +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.hjq.shape.view.ShapeTextView +import com.localee.mireo.app.R +import com.localee.mireo.app.app.AppAdapter + +class TabAdapter @JvmOverloads constructor( + context: Context, + private val tabMode: Int = TAB_MODE_DESIGN, + private val fixed: Boolean = true +) : AppAdapter(context), BaseAdapter.OnItemClickListener { + + companion object { + const val TAB_MODE_DESIGN: Int = 1 + const val TAB_MODE_SLIDING: Int = 2 + } + + private var selectedPosition: Int = 0 + + private var listener: OnTabListener? = null + + init { + setOnItemClickListener(this) + registerAdapterDataObserver(TabAdapterDataObserver()) + } + + override fun getItemViewType(position: Int): Int { + return tabMode + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AppViewHolder { + return when (viewType) { + TAB_MODE_DESIGN -> DesignViewHolder() + TAB_MODE_SLIDING -> SlidingViewHolder() + else -> throw IllegalArgumentException("are you ok?") + } + } + + override fun generateDefaultLayoutManager(context: Context): RecyclerView.LayoutManager { + return if (fixed) { + var count: Int = getCount() + if (count < 1) { + count = 1 + } + GridLayoutManager(context, count, RecyclerView.VERTICAL, false) + } else { + LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) + } + } + + override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { + super.onAttachedToRecyclerView(recyclerView) + recyclerView.itemAnimator = null + } + + fun getSelectedPosition(): Int { + return selectedPosition + } + + fun setSelectedPosition(position: Int) { + if (selectedPosition == position) { + return + } + notifyItemChanged(selectedPosition) + selectedPosition = position + notifyItemChanged(position) + } + + fun setOnTabListener(listener: OnTabListener?) { + this.listener = listener + } + + override fun onItemClick(recyclerView: RecyclerView?, itemView: View?, position: Int) { + if (selectedPosition == position) { + return + } + if (listener == null) { + selectedPosition = position + notifyDataSetChanged() + return + } + if (listener!!.onTabSelected(recyclerView, position)) { + selectedPosition = position + notifyDataSetChanged() + } + } + + inner class DesignViewHolder : AppViewHolder(R.layout.tab_item_design) { + + private val titleView: TextView? by lazy { findViewById(R.id.tv_tab_design_title) } + private val lineView: View? by lazy { findViewById(R.id.v_tab_design_line) } + + init { + if (fixed) { + val itemView: View = getItemView() + val layoutParams: ViewGroup.LayoutParams = itemView.layoutParams + layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT + itemView.layoutParams = layoutParams + } + } + + override fun onBindView(position: Int) { + titleView?.text = getItem(position) + titleView?.isSelected = (selectedPosition == position) + lineView?.visibility = + if (selectedPosition == position) View.VISIBLE else View.INVISIBLE + } + } + + inner class SlidingViewHolder : AppViewHolder(R.layout.tab_item_sliding), + AnimatorUpdateListener { + + private val titleView: ShapeTextView? by lazy { findViewById(R.id.tv_tab_sliding_title) } + + private val mDefaultTextSize: Int by lazy { + getResources().getDimension(R.dimen.sp_12).toInt() + } + private val mSelectedTextSize: Int by lazy { + getResources().getDimension(R.dimen.sp_12).toInt() + } + + init { + titleView?.setTextSize(TypedValue.COMPLEX_UNIT_PX, mDefaultTextSize.toFloat()) + if (fixed) { + val itemView: View = getItemView() + val layoutParams: ViewGroup.LayoutParams = itemView.layoutParams + layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT + itemView.layoutParams = layoutParams + } + } + + override fun onBindView(position: Int) { + titleView?.let { + it.text = getItem(position) + it.isSelected = (selectedPosition == position) + val textSize: Int = it.textSize.toInt() + if (selectedPosition == position) { + it.shapeDrawableBuilder.setSolidGradientColors( + 0xFFF24C92.toInt(), + 0xFFF8726D.toInt() + ).setStrokeSize(0) + .intoBackground(); + if (textSize != mSelectedTextSize) { + startAnimator(mDefaultTextSize, mSelectedTextSize) + } + return + } else { + it.shapeDrawableBuilder.setSolidGradientColors( + 0x00000000.toInt(), + 0x00000000.toInt() + ).setStrokeSize(getResources().getDimension(R.dimen.dp_1).toInt()) + .setStrokeColor(0xFFF56490.toInt()) + .intoBackground(); + } + if (textSize != mDefaultTextSize) { + startAnimator(mSelectedTextSize, mDefaultTextSize) + } + } + } + + private fun startAnimator(start: Int, end: Int) { + val valueAnimator: ValueAnimator = ValueAnimator.ofInt(start, end) + valueAnimator.addUpdateListener(this) + valueAnimator.duration = 100 + valueAnimator.start() + } + + override fun onAnimationUpdate(animation: ValueAnimator) { + titleView?.setTextSize( + TypedValue.COMPLEX_UNIT_PX, + (animation.animatedValue as Int).toFloat() + ) + } + } + + private inner class TabAdapterDataObserver : AdapterDataObserver() { + + override fun onChanged() { + refreshLayoutManager() + } + + override fun onItemRangeChanged(positionStart: Int, itemCount: Int, payload: Any?) {} + + override fun onItemRangeChanged(positionStart: Int, itemCount: Int) {} + + override fun onItemRangeInserted(positionStart: Int, itemCount: Int) { + refreshLayoutManager() + } + + override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) { + refreshLayoutManager() + if (getSelectedPosition() > positionStart - itemCount) { + setSelectedPosition(positionStart - itemCount) + } + } + + override fun onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int) {} + + private fun refreshLayoutManager() { + if (!fixed) { + return + } + getRecyclerView()?.layoutManager = generateDefaultLayoutManager(getContext()) + } + } + + interface OnTabListener { + + fun onTabSelected(recyclerView: RecyclerView?, position: Int): Boolean + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..384f128 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/CommonDialog.kt @@ -0,0 +1,80 @@ +package com.localee.mireo.app.ui.dialog + +import android.content.* +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 + +class CommonDialog { + + @Suppress("UNCHECKED_CAST", "LeakingThis") + open class Builder>(context: Context) : BaseDialog.Builder(context) { + + private var autoDismiss = true + + private val containerLayout: ViewGroup? by lazy { findViewById(R.id.ll_ui_container) } + private val titleView: TextView? by lazy { findViewById(R.id.tv_ui_title) } + private val cancelView: TextView? by lazy { findViewById(R.id.tv_ui_cancel) } + private val lineView: View? by lazy { findViewById(R.id.v_ui_line) } + private val confirmView: TextView? by lazy { findViewById(R.id.tv_ui_confirm) } + + init { + setContentView(R.layout.ui_dialog) + setAnimStyle(AnimAction.ANIM_IOS) + setGravity(Gravity.CENTER) + setOnClickListener(cancelView, confirmView) + } + + fun setCustomView(@LayoutRes id: Int): B { + return setCustomView(LayoutInflater.from(getContext()).inflate(id, containerLayout, false)) + } + + fun setCustomView(view: View?): B { + containerLayout?.addView(view, 1) + return this as B + } + + fun setTitle(@StringRes id: Int): B { + return setTitle(getString(id)) + } + + fun setTitle(text: CharSequence?): B { + titleView?.text = text + return this as B + } + + fun setCancel(@StringRes id: Int): B { + return setCancel(getString(id)) + } + + fun setCancel(text: CharSequence?): B { + cancelView?.text = text + lineView?.visibility = if (text == null || "" == text.toString()) View.GONE else View.VISIBLE + return this as B + } + + fun setConfirm(@StringRes id: Int): B { + return setConfirm(getString(id)) + } + + fun setConfirm(text: CharSequence?): B { + confirmView?.text = text + return this as B + } + + fun setAutoDismiss(dismiss: Boolean): B { + autoDismiss = dismiss + return this as B + } + + fun autoDismiss() { + if (autoDismiss) { + dismiss() + } + } + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..d798477 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/InputDialog.kt @@ -0,0 +1,101 @@ +package com.localee.mireo.app.ui.dialog + +import android.content.Context +import android.view.KeyEvent +import android.view.View +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 + +class InputDialog { + + class Builder(context: Context) : CommonDialog.Builder(context), + BaseDialog.OnShowListener, OnEditorActionListener { + + private val inputView: RegexEditText? by lazy { findViewById(R.id.tv_input_message) } + + private var listener: OnListener? = null + + init { + setCustomView(R.layout.input_dialog) + inputView?.setOnEditorActionListener(this) + addOnShowListener(this) + } + + fun setHint(@StringRes id: Int): Builder = apply { + setHint(getString(id)) + } + + fun setHint(text: CharSequence?): Builder = apply { + inputView?.hint = text + } + + fun setContent(@StringRes id: Int): Builder = apply { + setContent(getString(id)) + } + + fun setContent(text: CharSequence?): Builder = apply { + inputView?.setText(text) + val editable = inputView?.text ?: return@apply + val index = editable.length + if (index <= 0) { + return@apply + } + inputView?.requestFocus() + inputView?.setSelection(index) + } + + fun setInputRegex(regex: String?): Builder = apply { + inputView?.setInputRegex(regex) + } + + fun setListener(listener: OnListener?): Builder = apply { + this.listener = listener + } + + /** + * [BaseDialog.OnShowListener] + */ + override fun onShow(dialog: BaseDialog?) { + 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()) + } + } + } + + /** + * [TextView.OnEditorActionListener] + */ + override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean { + if (actionId == EditorInfo.IME_ACTION_DONE) { + findViewById(R.id.tv_ui_confirm)?.let { + // 模拟点击确认按钮 + onClick(it) + } + return true + } + return false + } + } + + interface OnListener { + fun onConfirm(dialog: BaseDialog?, content: String) + fun onCancel(dialog: BaseDialog?) {} + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..58d1ac4 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/MessageDialog.kt @@ -0,0 +1,63 @@ +package com.localee.mireo.app.ui.dialog + +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 + +class MessageDialog { + + class Builder constructor(context: Context) : CommonDialog.Builder(context) { + + private val messageView: TextView? by lazy { findViewById(R.id.tv_message_message) } + + private var listener: OnListener? = null + + init { + setCustomView(R.layout.message_dialog) + } + + fun setMessage(@StringRes id: Int): Builder = apply { + setMessage(getString(id)) + } + + fun setMessage(text: CharSequence?): Builder = apply { + messageView?.text = text + } + + fun setListener(listener: OnListener?): Builder = apply { + this.listener = listener + } + + override fun create(): BaseDialog { + if (("" == messageView?.text.toString())) { + throw IllegalArgumentException("Dialog message not null") + } + 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()) + } + } + } + } + + interface OnListener { + + fun onConfirm(dialog: BaseDialog?) + + fun onCancel(dialog: BaseDialog?) {} + } +} \ 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 new file mode 100644 index 0000000..d23640f --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/TipsDialog.kt @@ -0,0 +1,70 @@ +package com.localee.mireo.app.ui.dialog + +import android.content.Context +import android.text.TextUtils +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 + +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 + } + + class Builder(context: Context) : BaseDialog.Builder(context), + Runnable, BaseDialog.OnShowListener { + + private val messageView: TextView? by lazy { findViewById(R.id.tv_tips_message) } + private val iconView: ImageView? by lazy { findViewById(R.id.iv_tips_icon) } + + private var duration = 2000 + + init { + setContentView(R.layout.tips_dialog) + setAnimStyle(AnimAction.ANIM_TOAST) + setBackgroundDimEnabled(false) + setCancelable(false) + addOnShowListener(this) + } + + fun setIcon(@DrawableRes id: Int): Builder = apply { + iconView?.setImageResource(id) + } + + fun setDuration(duration: Int): Builder = apply { + this.duration = duration + } + + fun setMessage(@StringRes id: Int): Builder = apply { + setMessage(getString(id)) + } + + fun setMessage(text: CharSequence?): Builder = apply { + messageView?.text = text + } + + override fun create(): BaseDialog { + requireNotNull(iconView?.drawable) { "The display type must be specified" } + require(!TextUtils.isEmpty(messageView?.text.toString())) { "Dialog message not null" } + return super.create() + } + + override fun onShow(dialog: BaseDialog?) { + postDelayed(this, duration.toLong()) + } + + override fun run() { + if (!isShowing()) { + return + } + dismiss() + } + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..7d8069d --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/dialog/WaitDialog.kt @@ -0,0 +1,33 @@ +package com.localee.mireo.app.ui.dialog + +import android.content.* +import android.view.* +import android.widget.TextView +import androidx.annotation.StringRes +import com.hjq.base.BaseDialog +import com.hjq.base.action.AnimAction +import com.localee.mireo.app.R + +class WaitDialog { + + class Builder(context: Context) : BaseDialog.Builder(context) { + + private val messageView: TextView? by lazy { findViewById(R.id.tv_wait_message) } + + init { + setContentView(R.layout.wait_dialog) + setAnimStyle(AnimAction.ANIM_TOAST) + setBackgroundDimEnabled(false) + setCancelable(false) + } + + fun setMessage(@StringRes id: Int): Builder = apply { + setMessage(getString(id)) + } + + fun setMessage(text: CharSequence?): Builder = apply { + 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 new file mode 100644 index 0000000..a2ed487 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/BrowserFragment.kt @@ -0,0 +1,104 @@ +package com.localee.mireo.app.ui.fragment + +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.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 +import com.localee.mireo.app.widget.BrowserView +import com.localee.mireo.app.widget.BrowserView.BrowserChromeClient +import com.localee.mireo.app.widget.BrowserView.BrowserViewClient +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.OnRefreshListener +import java.util.* + +class BrowserFragment : AppFragment(), StatusAction, OnRefreshListener { + + companion object { + + private const val INTENT_KEY_IN_URL: String = "url" + + @Log + fun newInstance(url: String): BrowserFragment { + val fragment = BrowserFragment() + val bundle = Bundle() + bundle.putString(INTENT_KEY_IN_URL, url) + fragment.arguments = bundle + return fragment + } + } + + private val hintLayout: StatusLayout? by lazy { findViewById(R.id.hl_browser_hint) } + private val refreshLayout: SmartRefreshLayout? by lazy { findViewById(R.id.sl_browser_refresh) } + private val browserView: BrowserView? by lazy { findViewById(R.id.wv_browser_view) } + + override fun getLayoutId(): Int { + return R.layout.browser_fragment + } + + override fun initView() { + browserView?.setLifecycleOwner(this) + refreshLayout?.setOnRefreshListener(this) + } + + override fun initData() { + browserView?.apply { + setBrowserViewClient(AppBrowserViewClient()) + setBrowserChromeClient(BrowserChromeClient(this)) + loadUrl(getString(INTENT_KEY_IN_URL)!!) + } + showLoading() + } + + override fun getStatusLayout(): StatusLayout { + return hintLayout!! + } + + @CheckNet + private fun reload() { + browserView?.reload() + } + + /** + * [OnRefreshListener] + */ + override fun onRefresh(refreshLayout: RefreshLayout) { + reload() + } + + private inner class AppBrowserViewClient : BrowserViewClient() { + override fun onReceivedError(view: WebView, errorCode: Int, description: String, failingUrl: String) { + post { + showError(object : OnRetryListener { + override fun onRetry(layout: StatusLayout) { + reload() + } + }) + } + } + + override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) {} + + override fun onPageFinished(view: WebView, url: String) { + refreshLayout?.finishRefresh() + showComplete() + } + + override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { + val scheme: String = Uri.parse(url).scheme ?: return true + when (scheme.lowercase(Locale.getDefault())) { + "http", "https" -> BrowserActivity.start(getAttachActivity()!!, url) + } + return true + } + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..4b999e7 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/ExploreFragment.kt @@ -0,0 +1,502 @@ +package com.localee.mireo.app.ui.fragment + +import android.annotation.SuppressLint +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.TextView +import androidx.appcompat.widget.AppCompatImageView +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.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.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.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 +import org.greenrobot.eventbus.ThreadMode + + +class ExploreFragment : TitleBarFragment(), + ExampleRecommendAdapter.ExampleRecommendCollection { + + companion object { + + fun newInstance(): ExploreFragment { + return ExploreFragment() + } + } + + private var first: Boolean = true + private var play: Boolean = true + private var qualityRefresh: 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: ExampleRecommendAdapter? = null + private var data: com.localee.mireo.app.http.api.ExampleRecommendDataRes.Data? = null + private var revolution = + MsMMKVUtils.getMMKV().getInt(MsConstants.CONSTANTS_quality, 0).toString() + + + private val srRecommend: SmartRefreshLayout? by lazy { findViewById(R.id.sr_recommend) } + private val viewPagerExampleRecommend: ViewPager2? by lazy { findViewById(R.id.viewPager_example_recommend) } + + private val exampleNetwork: ViewGroup? by lazy { findViewById(R.id.example_network) } + private val exampleTvNoNetwork: TextView? by lazy { exampleNetwork?.findViewById(R.id.example_tv_no_network) } + private val tvExampleRetry: TextView? by lazy { exampleNetwork?.findViewById(R.id.tv_example_retry) } + + 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 val avi: LoadingAnimationView? by lazy { findViewById(R.id.avi) } + + override fun getLayoutId(): Int { + return R.layout.find_fragment + } + + override fun initView() { + EventBus.getDefault().register(this) + activity?.window?.setFlags( + WindowManager.LayoutParams.FLAG_SECURE, + WindowManager.LayoutParams.FLAG_SECURE + ) + 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 + } + + override fun initData() { + + } + + fun initialization() { + + if (NetworkUtils.isConnected()) { +// avi?.start() + getRecommands(currentPage, currentSize, revolution) + } else { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.no_network.toString()) + } else { + ToastUtils.show(getString(R.string.example_no_network)) + } + exampleNetwork?.visibility = View.VISIBLE + } + srRecommend?.setOnRefreshListener { + if (NetworkUtils.isConnected()) { +// avi?.start() + currentPage = 1 + viewPagerExampleRecommend?.post { + recommendPlayerView()?.stop() + recommendPlayerView()?.release() + } + getRecommands( + currentPage, + currentSize, revolution + ) + } else { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.no_network.toString()) + } else { + ToastUtils.show(getString(R.string.example_no_network)) + } + } + } + viewPagerExampleRecommend?.registerOnPageChangeCallback(object : + ViewPager2.OnPageChangeCallback() { + @SuppressLint("NotifyDataSetChanged") + override fun onPageSelected(position: Int) { + super.onPageSelected(position) + currentPosition = position + val previousPosition = exampleRecommendAdapter?.currentPlayingPosition + if (previousPosition != position) { + exampleRecommendAdapter?.recyclerView?.post { exampleRecommendAdapter?.notifyDataSetChanged() } + } + exampleRecommendAdapter?.currentPlayingPosition = position + } + + override fun onPageScrollStateChanged(state: Int) { + super.onPageScrollStateChanged(state) + when (state) { + ViewPager2.SCROLL_STATE_IDLE -> { + if (viewPagerExampleRecommend?.currentItem == viewPagerExampleRecommend?.adapter?.itemCount?.minus( + 1 + ) + ) { + if (!first) { + currentPage++ + getRecommands( + currentPage, + currentSize, + revolution + ) + } else { + first = false + } + } + } + + ViewPager2.SCROLL_STATE_DRAGGING -> { + + } + + ViewPager2.SCROLL_STATE_SETTLING -> { + + } + } + } + }) + exampleTvEmpty?.setOnClickListener { + singleClick { + if (!NetworkUtils.isConnected()) { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.no_network.toString()) + } else { + ToastUtils.show(getString(R.string.example_no_network)) + } + return@singleClick + } +// avi?.start() + currentPage = 1 + getRecommands( + currentPage, + currentSize, revolution + ) + } + } + tvExampleRetry?.setOnClickListener { + singleClick { + if (!NetworkUtils.isConnected()) { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.no_network.toString()) + } else { + ToastUtils.show(getString(R.string.example_no_network)) + } + return@singleClick + } +// avi?.start() + currentPage = 1 + getRecommands( + currentPage, + currentSize, revolution + ) + } + } + } + + 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({ recommendPlayerView()?.pause() }, 300) + } + } + + private var isDataLoaded = false + override fun onResume() { + super.onResume() + if (isVisible && !isDataLoaded) { // 检查是否对用户可见 + initialization() + isDataLoaded = true + } + MsConstants.ExampleIsCurrentPage = true + if (isVisible) { + if (!play) { + qualityLogic() + } else { + play = false + } + } + + } + + + private fun qualityLogic() { + if (qualityRefresh) { + viewPagerExampleRecommend?.post { + recommendPlayerView()?.stop() + recommendPlayerView()?.release() + } + getRecommands( + currentPage, + currentSize, revolution + ) + qualityRefresh = false + } else { + recommendPlayerView()?.play() + } + } + + override fun onPause() { + super.onPause() + MsConstants.ExampleIsCurrentPage = false + srRecommend?.postDelayed({ recommendPlayerView()?.pause() }, 300) + } + + fun getRecommands(currentPage: Int, pageSize: Int, revolutionS: String) { + EasyHttp.get(this) + .api(HomeRecommendApi().apply { + current_page = currentPage; + page_size = pageSize; + revolution = revolutionS; + + }) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (it != null) { + if (it.list?.isNotEmpty() == true) { + if (currentPage == 1) { + exampleRecommendAdapter = ExampleRecommendAdapter() + viewPagerExampleRecommend?.adapter = exampleRecommendAdapter + exampleRecommendAdapter?.submitList(it.list) + exampleRecommendAdapter?.recommendCollection = + this@ExploreFragment + } else { + exampleRecommendAdapter?.addAll(it.list) + } + exampleNetwork?.visibility = View.INVISIBLE + exampleEmpty?.visibility = View.INVISIBLE + } else { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.no_more_data.toString()) + } else { + ToastUtils.show(getString(R.string.example_there_s_no_more_data)) + } + if (currentPage == 1) { + exampleEmpty?.visibility = View.VISIBLE + } + } + } else { + if (currentPage == 1) { + recommendPlayerView()?.release() + exampleEmpty?.visibility = View.VISIBLE + } + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.network_error.toString()) + } else { + ToastUtils.show(getString(R.string.example_service_exception_please_try_again)) + } + } +// avi?.stop() + srRecommend?.finishRefresh() + } + } + }) + +// ExampleRecommendRequest.getRecommands(current_page, page_size, revolution) +// .observeForever { result -> +// recommendLiveData.value = result.getOrNull() +// } + } + + fun doCollect(videoId: Int, shortPlayId: Int) { + val sMap: MutableMap = LinkedHashMap() + // StringMap = getSortMap(StringMap); + sMap.put("short_play_id", videoId.toString()) + sMap.put("video_id", shortPlayId.toString()) + + EasyHttp.post(this) + .api(com.localee.mireo.app.http.api.DoCollectApi()) + .body(getPublicRequest(sMap)) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (it != null) { + val imageView = + recommendPlayerView()?.findViewById(R.id.example_iv_collection_controller) + val textview = + recommendPlayerView()?.findViewById(R.id.example_tv_collection_num_controller) + imageView?.setImageResource(R.mipmap.iv_example_collection_h) + data?.collect_total = data?.collect_total?.plus(1) + exampleRecommendAdapter?.items?.get(currentPosition)?.collect_total = + data?.collect_total + exampleRecommendAdapter?.items?.get(currentPosition)?.is_collect = true + textview?.text = data?.collect_total?.let { it1 -> formatNumber(it1) } + textview?.setTextColor(resources.getColor(R.color.example_color_F56490)) + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.success.toString()) + } + } else { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.network_error.toString()) + } else { + ToastUtils.show(getString(R.string.example_service_exception_please_try_again)) + } + } + } + } + }) + } + + fun doCancelCollect(videoId: Int, shortPlayId: Int) { + val sMap: MutableMap = LinkedHashMap() + // StringMap = getSortMap(StringMap); + sMap.put("short_play_id", videoId.toString()) + sMap.put("video_id", shortPlayId.toString()) + + EasyHttp.post(this) + .api(com.localee.mireo.app.http.api.CancelCollectApi()) + .body(getPublicRequest(sMap)) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (it != null) { + val imageView = + recommendPlayerView()?.findViewById(R.id.example_iv_collection_controller) + val textview = + recommendPlayerView()?.findViewById(R.id.example_tv_collection_num_controller) + imageView?.setImageResource(R.mipmap.iv_example_collection_n) + data?.collect_total = data?.collect_total?.minus(1) + exampleRecommendAdapter?.items?.get(currentPosition)?.collect_total = + data?.collect_total + exampleRecommendAdapter?.items?.get(currentPosition)?.is_collect = false + textview?.text = data?.collect_total?.let { it1 -> formatNumber(it1) } + textview?.setTextColor(resources.getColor(R.color.white)) + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.success.toString()) + } + } else { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.network_error.toString()) + } else { + ToastUtils.show(getString(R.string.example_service_exception_please_try_again)) + } + } + } + } + }) + } + + private fun recommendPlayerView(): ExampleRecommendPlayerView? { + val recyclerView = viewPagerExampleRecommend?.getChildAt(0) as RecyclerView + return recyclerView.layoutManager?.findViewByPosition(currentPosition) as ExampleRecommendPlayerView? + } + + override fun onDestroy() { + viewPagerExampleRecommend?.post { + recommendPlayerView()?.stop() + recommendPlayerView()?.release() + } + super.onDestroy() + EventBus.getDefault().unregister(this) + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(event: String) { + if (MsConstants.Constants_RecommendPlayerView_PLAYER_STATUS_FINISHExample == event) { + if (viewPagerExampleRecommend?.currentItem == viewPagerExampleRecommend?.adapter?.itemCount?.minus( + 1 + ) + ) { + viewPagerExampleRecommend?.currentItem = 0 + } else { + currentPosition.plus(1) + .let { + viewPagerExampleRecommend?.currentItem = it + } + } + } + + if (CONSTANTS_quality_refresh == event) { + revolution = + MsMMKVUtils.getMMKV().getInt(MsConstants.CONSTANTS_quality, 0) + .toString() + qualityRefresh = true + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(event: BaseEventBus) { + if (MsConstants.Constants_Episodes_Series_DataExample == event.code) { + if (exampleRecommendAdapter?.items?.get(currentPosition)?.name == event.data.name) { + val imageView = + recommendPlayerView()?.findViewById(R.id.example_iv_collection_controller) + val textview = + recommendPlayerView()?.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 = + event.data.collect_total + 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)) + } + } + } + + override fun collection(dataRes: com.localee.mireo.app.http.api.ExampleRecommendDataRes.Data) { + singleClick { + data = dataRes + if (dataRes.is_collect) { + 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) + 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 { + dataRes.video_info?.short_play_id?.let { + dataRes.video_info.short_play_video_id.let { it1 -> + doCancelCollect( + it, it1 + ) + } + } + exampleUnFavoriteDialog.dismiss() + } + exampleUnFavoriteDialog.show() + } else { + dataRes.video_info?.short_play_id?.let { + dataRes.video_info.short_play_video_id.let { it1 -> + doCollect( + it, it1 + ) + } + } + } + } + } + +} \ No newline at end of file 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 new file mode 100644 index 0000000..5994961 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/HomeCategoriesTabFragment.kt @@ -0,0 +1,183 @@ +package com.localee.mireo.app.ui.fragment + +import android.annotation.SuppressLint +import android.content.Intent +import android.graphics.Rect +import android.os.Bundle +import android.view.View +import androidx.recyclerview.widget.GridLayoutManager +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.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.model.HttpData +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.VideoPlayActivity +import com.localee.mireo.app.ui.adapter.HomeCategoriesTabAdapter +import com.localee.mireo.app.widget.StatusLayout +import com.scwang.smart.refresh.layout.api.RefreshLayout +import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener + + +class HomeCategoriesTabFragment : TitleBarFragment(), OnRefreshLoadMoreListener, + StatusAction { + + companion object { + fun newInstance(tabName: String, tabId: Int): HomeCategoriesTabFragment { + return HomeCategoriesTabFragment().apply { + arguments = Bundle().apply { + putString("TAB_NAME", tabName) + putInt("TAB_ID", tabId) + } + } + } + } + + private var tabName: String? = null + private var tabId: Int? = null + + private val hintLayout: StatusLayout? by lazy { findViewById(R.id.hl_status_hint) } + private val recyclerView: RecyclerView? by lazy { findViewById(R.id.recyclerView) } + + private var mAdapter: HomeCategoriesTabAdapter? = null + private var pageIndex = 1 + private var pageTotal = 1 + val detailList: MutableList = java.util.ArrayList() + + override fun getLayoutId(): Int { + return R.layout.fragment_categories_tab + } + + @SuppressLint("NotifyDataSetChanged") + override fun initView() { + tabName = arguments?.getString("TAB_NAME") + tabId = arguments?.getInt("TAB_ID") + + mAdapter = HomeCategoriesTabAdapter() + + val layoutManager = GridLayoutManager(context, 3) + // 设置给 RecyclerView + recyclerView?.layoutManager = layoutManager + recyclerView?.isNestedScrollingEnabled = false // 关键代码 + recyclerView?.setHasFixedSize(true) // 优化性能 + recyclerView?.adapter = mAdapter + recyclerView?.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + outRect.right = 10 + outRect.left = 10 + } + }) + + mAdapter?.setOnItemClickListener { adapter, view, position -> + val historyBean: RecommendBean = adapter.items.get(position) + startActivity( + Intent( + context, + VideoPlayActivity::class.java + ).apply { + historyBean.short_play_id.let { + putExtra(CONSTANTS_short_play_id, it) + } + }) + } + + recyclerView?.addOnLayoutChangeListener { _, _, _, _, bottom, _, _, _, oldBottom -> + if (bottom != oldBottom) { + recyclerView?.layoutParams?.height = bottom + } + } + } + + override fun initData() { + + + } + + private var isDataLoaded = false + override fun onResume() { + super.onResume() + if (isVisible && !isDataLoaded) { // 检查是否对用户可见 + loadData() + isDataLoaded = true + } + } + + private fun loadData() { + getHomeVideoListApi(pageIndex, 10) + } + + private fun getHomeVideoListApi(currentPage: Int, pageSize: Int) { + EasyHttp.get(this) + .api(HomeVideoListApi().apply { + category_id = tabId + current_page = currentPage + page_size = pageSize + }) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (pageIndex == 1) { + if (it.list.isEmpty()) { + hintLayout?.show() + } else { + hintLayout?.hide() + } + mAdapter?.submitList(it.list) + pageTotal = it.pagination.page_total + } else { + mAdapter?.addAll(it.list) + } + } + + } + + override fun onHttpFail(throwable: Throwable) { + super.onHttpFail(throwable) + if (pageIndex == 1) { + hintLayout?.show() + } + } + + override fun onHttpEnd(api: IRequestApi) { + super.onHttpEnd(api) +// if (pageIndex == 1) { +// rlStatusRefresh?.finishRefresh(200) +// } else { +// rlStatusRefresh?.finishLoadMore(200) +// } + } + }) + } + + + override fun onRefresh(refreshLayout: RefreshLayout) { + pageIndex = 1 + loadData() + } + + 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/fragment/HomeFragment.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/HomeFragment.kt new file mode 100644 index 0000000..f8a04b5 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/HomeFragment.kt @@ -0,0 +1,434 @@ +package com.localee.mireo.app.ui.fragment + +import android.content.Intent +import android.graphics.Rect +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.appcompat.widget.AppCompatImageView +import androidx.core.widget.NestedScrollView +import androidx.fragment.app.activityViewModels +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.app.AppFragment +import com.localee.mireo.app.app.TitleBarFragment +import com.localee.mireo.app.http.api.CustomerRegisterApi +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.model.HttpData +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 +import com.localee.mireo.app.ui.activity.VideoPlayActivity +import com.localee.mireo.app.ui.adapter.HomeBannerAdapter +import com.localee.mireo.app.ui.adapter.HomeCriticallyAdapter +import com.localee.mireo.app.ui.adapter.HomeGenresAdapter +import com.localee.mireo.app.ui.adapter.HomeShortAdapter +import com.localee.mireo.app.ui.adapter.HomeTopAdapter +import com.localee.mireo.app.ui.adapter.TabAdapter +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.youth.banner.Banner +import com.youth.banner.listener.OnBannerListener + +class HomeFragment : TitleBarFragment(), HomeBannerAdapter.HomeBannerOnClick, + TabAdapter.OnTabListener, + ViewPager.OnPageChangeListener { + + companion object { + + fun newInstance(): HomeFragment { + return HomeFragment() + } + } + + private val searchView: AppCompatImageView? by lazy { findViewById(R.id.iv_home_search) } + private val banner: Banner? by lazy { + findViewById( + R.id.banner + ) + } + + 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) } + private val recyclerOne: RecyclerView? by lazy { layoutTop?.findViewById(R.id.recyclerView) } + + private val layoutNew: ViewGroup? by lazy { findViewById(R.id.layout_new) } + private val tvTopNew: TextView? by lazy { layoutNew?.findViewById(R.id.tv_name) } + private val recyclerNew: RecyclerView? by lazy { layoutNew?.findViewById(R.id.recyclerView) } + + private val layoutShort: ViewGroup? by lazy { findViewById(R.id.layout_short) } + private val tvTopShort: TextView? by lazy { layoutShort?.findViewById(R.id.tv_name) } + private val recyclerShort: RecyclerView? by lazy { layoutShort?.findViewById(R.id.recyclerView) } + + private val layoutCritically: ViewGroup? by lazy { findViewById(R.id.layout_critically) } + private val tvTopCritically: TextView? by lazy { layoutCritically?.findViewById(R.id.tv_name) } + private val recyclerCritically: RecyclerView? by lazy { layoutCritically?.findViewById(R.id.recyclerView) } + + private val layoutGenres: ViewGroup? by lazy { findViewById(R.id.layout_genres) } + private val tvTopGenres: TextView? by lazy { layoutGenres?.findViewById(R.id.tv_name) } + private val recyclerGenres: RecyclerView? by lazy { layoutGenres?.findViewById(R.id.recyclerView) } + + private var bannerAdapter: HomeBannerAdapter? = null + + private var topAdapter: HomeTopAdapter? = null + private var newAdapter: HomeTopAdapter? = null + private var shortAdapter: HomeShortAdapter? = null + private var criticallyAdapter: HomeCriticallyAdapter? = null + + private val nestedScrollView: NestedScrollView? by lazy { findViewById(R.id.nestedScrollView) } + private val viewPager: ViewPager? by lazy { findViewById(R.id.viewPager) } + private var tabAdapter: TabAdapter? = null + private var pagerAdapter: FragmentPagerAdapter>? = null + + private var genresAdapter: HomeGenresAdapter? = null + + private var category: List? = null + + override fun getLayoutId(): Int { + return R.layout.home_fragment + } + + override fun initView() { + recyclerOne?.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + recyclerNew?.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + recyclerShort?.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + + val layoutManager: GridLayoutManager = GridLayoutManager( + context, 3, RecyclerView.HORIZONTAL, false + ) + recyclerCritically?.layoutManager = layoutManager + + recyclerGenres?.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + + + topAdapter = HomeTopAdapter(1) + recyclerOne?.adapter = topAdapter + newAdapter = HomeTopAdapter(2) + recyclerNew?.adapter = newAdapter + shortAdapter = HomeShortAdapter() + recyclerShort?.adapter = shortAdapter + criticallyAdapter = HomeCriticallyAdapter() + recyclerCritically?.adapter = criticallyAdapter + genresAdapter = HomeGenresAdapter(0) + recyclerGenres?.adapter = genresAdapter + + + recyclerCritically?.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + outRect.right = 8 + outRect.bottom = 28 + } + }) + + ivTop?.visibility = View.VISIBLE + tvTopOne?.setText("Top 10 Skits This Week") + tvTopNew?.setText("New Releases") + tvTopShort?.setText("Shorts for You") + tvTopCritically?.setText("Critically Acclaimed") + tvTopGenres?.setText("Genres to Explore") + + +// genresAdapter?.submitList(genersList) + + searchView?.setOnClickListener { + startActivity(SearchActivity::class.java) + } + + pagerAdapter = FragmentPagerAdapter(this) + + tabAdapter = TabAdapter(getAttachActivity()!!, TAB_MODE_SLIDING, false) + recyclerGenres?.adapter = tabAdapter + + tabAdapter?.addItem("All") + pagerAdapter?.addFragment(HomeCategoriesTabFragment.newInstance("All", 0), "") + tabAdapter?.setOnTabListener(this) + + viewPager?.adapter = pagerAdapter + viewPager?.addOnPageChangeListener(this@HomeFragment) + + + } + + override fun initData() { + getCustomerRegister() + + topAdapter?.setOnItemClickListener { adapter, view, position -> + val data: RecommendBean = adapter.items.get(position) + startActivity( + Intent( + context, + VideoPlayActivity::class.java + ).apply { + data.short_play_id.let { + putExtra(CONSTANTS_short_play_id, it) + } + }) + } + newAdapter?.setOnItemClickListener { adapter, view, position -> + val data: RecommendBean = adapter.items.get(position) + startActivity( + Intent( + context, + VideoPlayActivity::class.java + ).apply { + data.short_play_id.let { + putExtra(CONSTANTS_short_play_id, it) + } + }) + } + shortAdapter?.setOnItemClickListener { adapter, view, position -> + val data: RecommendBean = adapter.items.get(position) + startActivity( + Intent( + context, + VideoPlayActivity::class.java + ).apply { + data.short_play_id.let { + putExtra(CONSTANTS_short_play_id, it) + } + }) + } + criticallyAdapter?.setOnItemClickListener { adapter, view, position -> + val data: RecommendBean = adapter.items.get(position) + startActivity( + Intent( + context, + VideoPlayActivity::class.java + ).apply { + data.short_play_id.let { + putExtra(CONSTANTS_short_play_id, it) + } + }) + } + + } + + override fun isStatusBarEnabled(): Boolean { + 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) + .api(HomeModuleApi().apply { + }) + .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) { + layoutTop?.visibility = View.GONE + } else { + layoutTop?.visibility = View.VISIBLE + topAdapter?.submitList(it.hotData) + } + if (it.manualNewestRecommand == null) { + layoutNew?.visibility = View.GONE + } else { + layoutNew?.visibility = View.VISIBLE + newAdapter?.submitList(it.manualNewestRecommand?.list) + } + if (it.recommandData == null || it.recommandData?.list == null) { + layoutShort?.visibility = View.GONE + } else { + layoutShort?.visibility = View.VISIBLE + shortAdapter?.submitList(it.recommandData?.list) + } +// criticallyAdapter?.submitList(it.newTopThree) + } + } + }) + + } + + + fun getDayMaxRechargeShortPlayRank() { + val sMap: MutableMap = LinkedHashMap() + // StringMap = getSortMap(StringMap); + sMap.put("type", "top_searched") + EasyHttp.post(this) + .api(HomeDayMaxRechargeShortPlayRankApi().apply { + }) + .body(getPublicRequest(sMap)) + .request(object : + HttpCallbackProxy>(this) { + override fun onHttpStart(api: IRequestApi) { + } + + override fun onHttpSuccess(result: HttpData) { + if (result.getData() == null) { + layoutShort?.visibility = View.GONE + } else { + result.getData()?.let { + layoutShort?.visibility = View.VISIBLE + criticallyAdapter?.submitList(it.list) + } + } + } + }) + } + + fun getCategories() { + EasyHttp.get(this) + .api(HomeCategoriesApi().apply { + }) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + category = it.list + for (cate in it.list) { + tabAdapter?.addItem(cate.name) + pagerAdapter?.addFragment( + HomeCategoriesTabFragment.newInstance( + cate.name, + cate.id + ), "" + ) + } + pagerAdapter?.notifyDataSetChanged() + } + } + }) + } + + + fun getCustomerUser() { + EasyHttp.get(this) + .api(UserInfoApi().apply { + }) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + + MsMMKVUtils.saveUserInfo(it) + + } + } + }) + } + + + override fun onDestroy() { + super.onDestroy() + + } + + override fun bannerAdd(dataRes: RecommendBean) { + dataRes.short_play_id?.let { doCollect(it) }; + } + + override fun bannerPlay(dataRes: RecommendBean) { + startActivity( + Intent( + context, + VideoPlayActivity::class.java + ).apply { + dataRes.short_play_id.let { + putExtra(CONSTANTS_short_play_id, it) + } + }) + } + + fun doCollect(shortPlayId: Int) { + val sMap: MutableMap = LinkedHashMap() + // StringMap = getSortMap(StringMap); + sMap["short_play_id"] = shortPlayId.toString() + + EasyHttp.post(this) + .api(com.localee.mireo.app.http.api.DoCollectApi()) + .body(getPublicRequest(sMap)) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (it != null) { + viewModel.triggerAction(2) + viewModel.meToHistoryAction(0) + } else { + if (TranslatesUtils.translates() != null) { + ToastUtils.show(TranslatesUtils.translates()?.network_error.toString()) + } else { + ToastUtils.show(getString(R.string.example_service_exception_please_try_again)) + } + } + } + } + }) + } + + private val viewModel: SharedViewModel by activityViewModels() + + override fun onTabSelected(recyclerView: RecyclerView?, position: Int): Boolean { + viewPager?.currentItem = position + return true + } + + override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { + } + + override fun onPageSelected(position: Int) { + tabAdapter?.setSelectedPosition(position) + } + + override fun onPageScrollStateChanged(state: Int) { + } + +} \ 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 new file mode 100644 index 0000000..4cb915b --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/ListTabFragment.kt @@ -0,0 +1,385 @@ +package com.localee.mireo.app.ui.fragment + +import android.annotation.SuppressLint +import android.content.Intent +import android.graphics.Rect +import android.os.Bundle +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.fragment.app.activityViewModels +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +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.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.model.HttpData +import com.localee.mireo.app.other.MsConstants.CONSTANTS_activity_id +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.VideoPlayActivity +import com.localee.mireo.app.ui.adapter.LostTabAdapter +import com.localee.mireo.app.utils.DHStringUtils.getPublicRequest +import com.localee.mireo.app.widget.StatusLayout +import com.scwang.smart.refresh.layout.SmartRefreshLayout +import com.scwang.smart.refresh.layout.api.RefreshLayout +import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener + + +class ListTabFragment : TitleBarFragment(), OnRefreshLoadMoreListener, + StatusAction { + + companion object { + fun newInstance(tabName: Int): ListTabFragment { + return ListTabFragment().apply { + arguments = Bundle().apply { + putInt("TAB_NAME", tabName) + } + } + } + } + + private var tabName: Int? = null + + private val hintLayout: StatusLayout? by lazy { findViewById(R.id.hl_status_hint) } + private val recyclerView: RecyclerView? by lazy { findViewById(R.id.recyclerView) } + private val rlStatusRefresh: SmartRefreshLayout? by lazy { findViewById(R.id.rl_status_refresh) } + private val llDelete: ShapeLinearLayout? by lazy { findViewById(R.id.ll_delete) } + private val ivDelete: ImageView? by lazy { findViewById(R.id.iv_delete) } + private val tvDelete: TextView? by lazy { findViewById(R.id.tv_delete) } + + private var mAdapter: LostTabAdapter? = null + private var pageIndex = 1 + private var pageTotal = 1 + private var type = 0 + private var detailPosition = 0 + val detailList: MutableList = java.util.ArrayList() + + override fun getLayoutId(): Int { + return R.layout.fragment_list_tab + } + + @SuppressLint("NotifyDataSetChanged") + override fun initView() { + tabName = arguments?.getInt("TAB_NAME") + + mAdapter = tabName?.let { LostTabAdapter(it) } + + val layoutManager = GridLayoutManager(context, 3) + // 设置给 RecyclerView + recyclerView!!.layoutManager = layoutManager + recyclerView?.adapter = mAdapter + recyclerView?.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + outRect.right = 10 + outRect.left = 10 + } + }) + + mAdapter?.setOnItemClickListener { adapter, view, position -> + val historyBean: HistoryBean.Data = adapter.items.get(position) + if (!mAdapter?.selectEdit!!) { + startActivity( + Intent( + context, + VideoPlayActivity::class.java + ).apply { + historyBean.short_play_id.let { + historyBean.short_play_video_id.let { it1 -> + putExtra(CONSTANTS_activity_id, it1) + putExtra(CONSTANTS_short_play_id, it) + } + } + }) + } else { + if (historyBean.is_check) { + adapter.items.get(position).is_check = false + for (i in detailList.indices) { + if (detailList[i].short_play_id == historyBean.short_play_id) { + detailList.removeAt(i) + } + } + } else { + adapter.items.get(position).is_check = true + detailList.add(historyBean) + } + + if (detailList.size == 0) { + 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) + } else { + llDelete?.shapeDrawableBuilder?.setStrokeColor(0xFFF56490.toInt()) + ?.intoBackground(); + context?.resources?.getColor(R.color.example_color_F56490) + ?.let { tvDelete?.setTextColor(it) } + tvDelete?.text = "Delete (" + detailList.size + ")" + ivDelete?.setImageResource(R.mipmap.ic_list_detele_y) + } + mAdapter?.notifyDataSetChanged() + } + } + + rlStatusRefresh?.setOnRefreshLoadMoreListener(this) + + llDelete?.setOnClickListener { + if (detailList.size != 0) { + for (i in detailList.indices) { + doCancelCollect(detailList[i].short_play_id, detailList[i].short_play_video_id) + } + } + } + + } + + override fun initData() { + + + } + + fun setMode() { + when (type) { + 0 -> { + val layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + // 设置给 RecyclerView + recyclerView!!.layoutManager = layoutManager + recyclerView?.adapter = mAdapter + type = 1 + mAdapter?.type = type + mAdapter?.notifyDataSetChanged() + } + + 1 -> { + // 创建一个 GridLayoutManager,指定列数(例如 3 列) + val layoutManager = GridLayoutManager(context, 3) + // 设置给 RecyclerView + recyclerView!!.layoutManager = layoutManager + recyclerView?.adapter = mAdapter + type = 0 + mAdapter?.type = type + mAdapter?.notifyDataSetChanged() + } + } + } + + fun setEdit() { + mAdapter?.selectEdit = !mAdapter?.selectEdit!! + mAdapter?.notifyDataSetChanged() + if (llDelete?.visibility == View.VISIBLE) + llDelete?.visibility = View.GONE + else + llDelete?.visibility = View.VISIBLE + + } + + fun setAllSelect(isSelect: Boolean) { + val allData: List? = mAdapter?.items + if (isSelect) { + for (i in allData?.indices!!) { + allData[i].is_check = true + } + allData.let { detailList.addAll(it) } + } else { + for (i in allData?.indices!!) { + allData[i].is_check = false + } + detailList.clear() + } + if (detailList.size == 0) { + 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) + } else { + llDelete?.shapeDrawableBuilder?.setStrokeColor(0xFFF56490.toInt()) + ?.intoBackground(); + context?.resources?.getColor(R.color.example_color_F56490) + ?.let { tvDelete?.setTextColor(it) } + tvDelete?.text = "Delete (" + detailList.size + ")" + ivDelete?.setImageResource(R.mipmap.ic_list_detele_y) + } + mAdapter?.notifyDataSetChanged() + } + + private var isDataLoaded = false + override fun onResume() { + super.onResume() + if (isVisible && !isDataLoaded) { // 检查是否对用户可见 + loadData() + isDataLoaded = true + } + } + + private fun loadData() { + when (tabName) { + 0 -> { + myCollections(pageIndex, 15) + } + + 1 -> { + getMyHistory(pageIndex, 15) + } + } + } + + private fun getMyHistory(currentPage: Int, pageSize: Int) { + EasyHttp.get(this) + .api(MyHistoryApi().apply { + current_page = currentPage + page_size = pageSize + }) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (pageIndex == 1) { + if (it.list.isEmpty()) { + hintLayout?.show() + } else { + hintLayout?.hide() + } + mAdapter?.submitList(it.list) + pageTotal = it.pagination.page_total + } else { + mAdapter?.addAll(it.list) + } + } + } + + override fun onHttpFail(throwable: Throwable) { + super.onHttpFail(throwable) + if (pageIndex == 1) { + hintLayout?.show() + } + } + + override fun onHttpEnd(api: IRequestApi) { + super.onHttpEnd(api) + if (pageIndex == 1) { + rlStatusRefresh?.finishRefresh(200) + } else { + rlStatusRefresh?.finishLoadMore(200) + } + } + }) + } + + private fun myCollections(currentPage: Int, pageSize: Int) { + EasyHttp.get(this) + .api(MyCollectionsApi().apply { + current_page = currentPage + page_size = pageSize + }) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + if (pageIndex == 1) { + if (it.list.isEmpty()) { + hintLayout?.show() + } else { + hintLayout?.hide() + } + mAdapter?.submitList(it.list) + pageTotal = it.pagination.page_total + } else { + mAdapter?.addAll(it.list) + } + } + + } + + override fun onHttpFail(throwable: Throwable) { + super.onHttpFail(throwable) + if (pageIndex == 1) { + hintLayout?.show() + } + } + + override fun onHttpEnd(api: IRequestApi) { + super.onHttpEnd(api) + if (pageIndex == 1) { + rlStatusRefresh?.finishRefresh(200) + } else { + rlStatusRefresh?.finishLoadMore(200) + } + } + }) + } + + fun doCancelCollect(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(com.localee.mireo.app.http.api.CancelCollectApi()) + .body(getPublicRequest(sMap)) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + viewModel.listTabAction(0) + } + } + + override fun onHttpEnd(api: IRequestApi) { + super.onHttpEnd(api) + detailPosition++ + if (detailPosition == detailList.size) { + pageIndex = 1 + mAdapter?.selectEdit = false + loadData() + llDelete?.visibility = View.GONE + detailList.clear() + } + } + }) + } + + private val viewModel: SharedViewModel by activityViewModels() + + fun onRefreshData() { + if (isDataLoaded) { + pageIndex = 1 + loadData() + } + } + + override fun onRefresh(refreshLayout: RefreshLayout) { + pageIndex = 1 + loadData() + } + + 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/fragment/MessageFragment.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/MessageFragment.kt new file mode 100644 index 0000000..22da9a3 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/MessageFragment.kt @@ -0,0 +1,203 @@ +package com.localee.mireo.app.ui.fragment + +import android.view.View +import android.widget.ImageView +import android.widget.TextView +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.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 + + +class MessageFragment : TitleBarFragment(), TabAdapter.OnTabListener, + ViewPager.OnPageChangeListener { + + companion object { + + fun newInstance(): MessageFragment { + return MessageFragment() + } + } + + private val ivMore: ImageView? by lazy { findViewById(R.id.iv_more) } + private val tabView: RecyclerView? by lazy { findViewById(R.id.rv_list_tab) } + private val viewPager: ViewPager? by lazy { findViewById(R.id.viewPager) } + private val tvCancel: TextView? by lazy { findViewById(R.id.tv_cancel) } + private val cbSelectCheck: AppCompatCheckBox? by lazy { findViewById(R.id.cb_select_check) } + + private var tabAdapter: TabAdapter? = null + private var pagerAdapter: FragmentPagerAdapter>? = null + + override fun getLayoutId(): Int { + return R.layout.message_fragment + } + + private val viewModel: SharedViewModel by activityViewModels() + + var modeOne: Int = 0 + var modeTwo: Int = 0 + var mode: Int = 0 + + override fun initView() { + + ivMore?.setOnClickListener { + XPopup.Builder(context) + .hasShadowBg(false) + .isTouchThrough(true) + .atView(ivMore) + .hasShadowBg(false) + .hasNavigationBar(false) + .asCustom(context?.let { it1 -> + CustomBubbleAttachPopup( + it1, + viewPager?.currentItem, + mode, + object : CustomPopupOnclick { + override fun onMode() { + + when (viewPager?.currentItem) { + 0 -> { + if (modeOne == 0) { + modeOne = 1 + } else { + modeOne = 0 + } + mode = modeOne + listTabOneFragment.setMode() + } + + 1 -> { + if (modeTwo == 0) { + modeTwo = 1 + } else { + modeTwo = 0 + } + mode = modeTwo + listTabTwoFragment.setMode() + } + } + } + + override fun onEdit() { + if (viewPager?.currentItem == 0) { + tvCancel?.visibility = View.VISIBLE + ivMore?.visibility = View.GONE + tabView?.visibility = View.INVISIBLE + cbSelectCheck?.visibility = View.VISIBLE + listTabOneFragment.setEdit() + + } + } + }) + }) + .show() + } + + tvCancel?.setOnClickListener { + tvCancel?.visibility = View.GONE + ivMore?.visibility = View.VISIBLE + tabView?.visibility = View.VISIBLE + cbSelectCheck?.visibility = View.GONE + listTabOneFragment.setEdit() + } + + cbSelectCheck?.setOnCheckedChangeListener { buttonView, isChecked -> + if (isChecked) { + listTabOneFragment.setAllSelect(true) + } else { + listTabOneFragment.setAllSelect(false) + + } + } + + viewModel.listTabAction.observe(this) { data -> + tvCancel?.visibility = View.GONE + ivMore?.visibility = View.VISIBLE + tabView?.visibility = View.VISIBLE + cbSelectCheck?.isChecked = false + cbSelectCheck?.visibility = View.GONE + listTabOneFragment.setEdit() + } + + viewModel.meToHistoryAction.observe(this) { data -> + viewPager?.currentItem = data + when(data) { + 0 -> { + listTabOneFragment.onRefreshData() + } + 1 -> { + listTabTwoFragment.onRefreshData() + } + } + } + } + + + + val listTabOneFragment: ListTabFragment = ListTabFragment.newInstance(0) + val listTabTwoFragment: ListTabFragment = ListTabFragment.newInstance(1) + + fun initViewA() { + pagerAdapter = FragmentPagerAdapter(this) + pagerAdapter!!.addFragment(listTabOneFragment, "") + pagerAdapter!!.addFragment(listTabTwoFragment, "") + // 设置 Adapter + viewPager?.adapter = pagerAdapter + viewPager?.addOnPageChangeListener(this) + + tabAdapter = TabAdapter(getAttachActivity()!!) + tabView?.adapter = tabAdapter + + tabAdapter?.addItem("Follow List") + tabAdapter?.addItem("Play List") + tabAdapter?.setOnTabListener(this) + + + } + + private var isDataLoaded = false + override fun onResume() { + super.onResume() + if (isVisible && !isDataLoaded) { + initViewA() + isDataLoaded = true + } + } + + override fun initData() {} + + + override fun onTabSelected(recyclerView: RecyclerView?, position: Int): Boolean { + viewPager?.currentItem = position + return true + } + + override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { + } + + override fun onPageSelected(position: Int) { + tabAdapter?.setSelectedPosition(position) + when (position) { + 0 -> { + mode = modeOne + } + + 1 -> { + mode = modeTwo + } + } + } + + override fun onPageScrollStateChanged(state: Int) { + } + +} \ No newline at end of file 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 new file mode 100644 index 0000000..104f04c --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/MineFragment.kt @@ -0,0 +1,153 @@ +package com.localee.mireo.app.ui.fragment + +import android.content.Intent +import android.view.View +import android.widget.TextView +import androidx.fragment.app.activityViewModels +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +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.MyHistoryApi +import com.localee.mireo.app.http.api.UserInfoApi +import com.localee.mireo.app.http.api.UserInfoRes +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.HomeActivity +import com.localee.mireo.app.ui.activity.SettingActivity +import com.localee.mireo.app.ui.activity.VideoPlayActivity +import com.localee.mireo.app.ui.adapter.MeHistoryAdapter +import com.localee.mireo.app.utils.MsMMKVUtils + + +class MineFragment : TitleBarFragment() { + + private val tvId: TextView? by lazy { findViewById(R.id.tv_id) } + private val recyclerView: RecyclerView? by lazy { findViewById(R.id.recyclerView) } + + private var mAdapter: MeHistoryAdapter? = null + + private val viewModel: SharedViewModel by activityViewModels() + + companion object { + + fun newInstance(): MineFragment { + return MineFragment() + } + } + + override fun getLayoutId(): Int { + return R.layout.mine_fragment + } + + override fun initView() { + setOnClickListener( + R.id.sb_play_list, + R.id.sb_setting, + R.id.sb_privacy, + R.id.sb_agreement, + R.id.sb_about + ) + + recyclerView?.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + + mAdapter = MeHistoryAdapter() + recyclerView?.adapter = mAdapter + + mAdapter?.setOnItemClickListener { adapter, view, position -> + val data: HistoryBean.Data = adapter.items[position] + startActivity( + Intent( + context, + VideoPlayActivity::class.java + ).apply { + putExtra(CONSTANTS_short_play_id, data.short_play_id) + }) + } + + } + + override fun initData() { + tvId?.text = "ID:".plus(MsMMKVUtils.getUserInfo()?.customer_id) + } + + private var isDataLoaded = false + override fun onResume() { + super.onResume() + 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) + } + + R.id.sb_setting -> { + startActivity(SettingActivity::class.java) + } + + 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_about -> { + startActivity(AboutActivity::class.java) + } + } + } + + private fun getCustomerUser() { + EasyHttp.get(this) + .api(UserInfoApi().apply { + }) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + + MsMMKVUtils.saveUserInfo(it) + tvId?.text = "ID:".plus(MsMMKVUtils.getUserInfo()?.customer_id) + } + } + }) + } + + + private fun getMyHistory(currentPage: Int, pageSize: Int) { + EasyHttp.get(this) + .api(MyHistoryApi().apply { + current_page = currentPage + page_size = pageSize + }) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + mAdapter?.submitList(it.list) + } + } + }) + } + + + override fun isStatusBarEnabled(): Boolean { + return !super.isStatusBarEnabled() + } +} \ 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 new file mode 100644 index 0000000..b77fe48 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/fragment/SharedViewModel.kt @@ -0,0 +1,28 @@ +package com.localee.mireo.app.ui.fragment + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel + +class SharedViewModel : ViewModel() { + private val _action = MutableLiveData() + val action: LiveData get() = _action + + fun triggerAction(data: Int) { + _action.value = data + } + + private val _listTabAction = MutableLiveData() + val listTabAction: LiveData get() = _listTabAction + + fun listTabAction(data: Int) { + _listTabAction.value = data + } + + private val _meToHistoryAction = MutableLiveData() + val meToHistoryAction: LiveData get() = _meToHistoryAction + + fun meToHistoryAction(data: Int) { + _meToHistoryAction.value = data + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..ed9a465 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/popup/CustomBubbleAttachPopup.kt @@ -0,0 +1,45 @@ +package com.localee.mireo.app.ui.popup + +import android.content.Context +import android.view.View +import android.widget.TextView +import com.lxj.xpopup.core.BubbleAttachPopupView +import com.localee.mireo.app.R + +class CustomBubbleAttachPopup(context: Context,var tabPosition: Int?,var mode: Int, val popupOnclick: CustomPopupOnclick?) : + BubbleAttachPopupView(context) { + interface CustomPopupOnclick { + fun onMode() + + fun onEdit() + } + + + override fun getImplLayoutId(): Int { + return R.layout.custom_bubble_attach_popup + } + + override fun onCreate() { + super.onCreate() + val tvMode = findViewById(R.id.tv_mode) + val tvEdit = findViewById(R.id.tv_edit) + if (tabPosition == 0) { + tvEdit.visibility = View.VISIBLE + } else { + tvEdit.visibility = View.GONE + } + if (mode == 0) { + tvMode.text = "List mode" + } else { + tvMode.text = "Grid mode" + } + tvMode.setOnClickListener { + popupOnclick?.onMode() + dismiss() + } + tvEdit.setOnClickListener { + popupOnclick?.onEdit() + dismiss() + } + } +} 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 new file mode 100644 index 0000000..5af2548 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExamplePlayerDetailDataRes.kt @@ -0,0 +1,150 @@ +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 new file mode 100644 index 0000000..5f5d01d --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleRecommendAdapter.kt @@ -0,0 +1,43 @@ +package com.localee.mireo.app.ui.videoPaly + +import android.content.Context +import android.view.ViewGroup +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 + +class ExampleRecommendAdapter : + BaseQuickAdapter() { + var currentPlayingPosition = 0 + var recommendCollection: ExampleRecommendCollection? = null + + interface ExampleRecommendCollection { + fun collection(dataRes: com.localee.mireo.app.http.api.ExampleRecommendDataRes.Data) + } + + override fun onBindViewHolder( + holder: QuickViewHolder, + position: Int, + item: com.localee.mireo.app.http.api.ExampleRecommendDataRes.Data? + ) { + val recommendPlayerView = holder.getView(R.id.item_recommend_view) + val playerView = recommendPlayerView.findViewById(R.id.player_view) + val imageView = playerView.findViewById(R.id.example_iv_collection_controller) + imageView.setOnClickListener { item?.let { it1 -> recommendCollection?.collection(it1) } } + if (position == currentPlayingPosition) { + item?.let { recommendPlayerView.setPlayInfo(it) } + } else { + recommendPlayerView.stop() + } + } + + override fun onCreateViewHolder( + context: Context, + parent: ViewGroup, + viewType: Int + ): QuickViewHolder { + return QuickViewHolder(R.layout.example_item_recommend, parent) + } +} 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 new file mode 100644 index 0000000..7316a51 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleRecommendPlayerView.kt @@ -0,0 +1,317 @@ +package com.localee.mireo.app.ui.videoPaly + +import android.annotation.SuppressLint +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.SeekBar +import androidx.appcompat.widget.AppCompatImageView +import androidx.appcompat.widget.AppCompatSeekBar +import androidx.appcompat.widget.AppCompatTextView +import androidx.media3.common.MediaItem +import androidx.media3.common.PlaybackException +import androidx.media3.common.Player +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 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.app.other.MsConstants +import com.localee.mireo.app.other.MsConstants.CONSTANTS_activity_id +import com.localee.mireo.app.other.MsConstants.CONSTANTS_short_play_id +import com.localee.mireo.app.ui.activity.SearchActivity +import com.localee.mireo.app.ui.activity.VideoPlayActivity +import com.localee.mireo.app.utils.TranslatesUtils +import com.localee.mireo.app.utils.formatNumber +import com.localee.mireo.app.utils.formatTimestamp +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import org.greenrobot.eventbus.EventBus + + +class ExampleRecommendPlayerView(context: Context, attrs: AttributeSet?) : + FrameLayout(context, attrs) { + @SuppressLint("UnsafeOptInUsageError") + private var builder = ExoPlayer.Builder(context, FfmpegRenderersFactory(context)) + .setRenderersFactory(DefaultRenderersFactory(context).setEnableDecoderFallback(true)) + private var player: ExoPlayer = builder.build() + private var isDragging = false + private var exampleSeekbarPlayerController: AppCompatSeekBar? = null + private var exampleProgressJob: Job? = null + private var exampleIvPlayPlayerController: ShapeImageView? = null + private var exampleIvCollectionController: AppCompatImageView? = null + private var exampleIvDramaSeriesController: AppCompatImageView? = null + private var exampleIvBackController: AppCompatImageView? = null + private var exampleTvEpisodePlayerController: ShapeTextView? = null + private var episodePlayerController: ImageView? = null + private var exampleTvCollectionNumController: AppCompatTextView? = null + private var exampleTvTitlePlayerController: AppCompatTextView? = null + private var tvPlayerSeekTime: AppCompatTextView? = null + private var exampleTvSeries: AppCompatTextView? = null + private var exampleIvQuality: AppCompatImageView? = null + private var ivCover: AppCompatImageView? = null + private var loadingLine: LoadingLine? = null + + init { + val inflate = + LayoutInflater.from(context) + .inflate(R.layout.example_recommend_player_view, this, true) + val exampleRecommendPlayerViewBinding = ExampleRecommendPlayerViewBinding.bind(inflate) + exampleRecommendPlayerViewBinding.playerView.player = player + exampleIvQuality = + exampleRecommendPlayerViewBinding.playerView.findViewById(R.id.example_iv_quality) + exampleSeekbarPlayerController = + exampleRecommendPlayerViewBinding.playerView.findViewById(R.id.example_seekBar_player_controller) + exampleIvPlayPlayerController = + exampleRecommendPlayerViewBinding.playerView.findViewById(R.id.example_iv_play_player_controller) + exampleIvCollectionController = + exampleRecommendPlayerViewBinding.playerView.findViewById(R.id.example_iv_collection_controller) + exampleIvDramaSeriesController = + exampleRecommendPlayerViewBinding.playerView.findViewById(R.id.example_iv_drama_series_controller) +// exampleIvBackController = +// exampleRecommendPlayerViewBinding.playerView.findViewById(R.id.example_iv_back_controller) + exampleTvEpisodePlayerController = + exampleRecommendPlayerViewBinding.playerView.findViewById(R.id.example_tv_episode_player_controller) + episodePlayerController = + exampleRecommendPlayerViewBinding.playerView.findViewById(R.id.iv_episode_player_controller) + exampleTvCollectionNumController = + exampleRecommendPlayerViewBinding.playerView.findViewById(R.id.example_tv_collection_num_controller) + exampleTvTitlePlayerController = + exampleRecommendPlayerViewBinding.playerView.findViewById(R.id.example_tv_title_player_controller) + exampleTvSeries = + exampleRecommendPlayerViewBinding.playerView.findViewById(R.id.example_tv_series) + loadingLine = exampleRecommendPlayerViewBinding.playerView.findViewById(R.id.load_line) + ivCover = exampleRecommendPlayerViewBinding.playerView.findViewById(R.id.iv_cover_recommend) + tvPlayerSeekTime = + exampleRecommendPlayerViewBinding.playerView.findViewById(R.id.tv_player_seek_time) + player.addListener(object : Player.Listener { + override fun onPlaybackStateChanged(playbackState: Int) { + super.onPlaybackStateChanged(playbackState) + when (playbackState) { + Player.STATE_BUFFERING -> { + loadingLine?.visibility = VISIBLE + loadingLine?.postDelayed({ loadingLine?.startAnimation() }, 100) + } + + Player.STATE_READY -> { + exampleIvPlayPlayerController?.isEnabled = true + if (MsConstants.ExampleIsCurrentPage) { + play() + setProgress() + } + MsConstants.Exampleready = true + ivCover?.visibility = View.INVISIBLE + loadingLine?.clearAnimation() + loadingLine?.visibility = View.INVISIBLE + } + + Player.STATE_ENDED -> { + EventBus.getDefault() + .post(MsConstants.Constants_RecommendPlayerView_PLAYER_STATUS_FINISHExample) + } + + Player.STATE_IDLE -> { + exampleIvPlayPlayerController?.isEnabled = false + } + } + } + + override fun onPlayerError(error: PlaybackException) { + super.onPlayerError(error) + ivCover?.visibility = View.INVISIBLE + loadingLine?.visibility = View.INVISIBLE + } + }) + exampleIvPlayPlayerController?.setOnClickListener { + if (MsConstants.Exampleplaying) { + pause() + } else { + play() + } + } + + } + + private fun setProgress() { + exampleProgressJob?.cancel() + exampleProgressJob = CoroutineScope(Dispatchers.Main).launch { + while (isActive) { + if (!isDragging) { + val duration = player.duration + val position = player.currentPosition + exampleSeekbarPlayerController?.max = duration.toInt() + exampleSeekbarPlayerController?.progress = position.toInt() + } + delay(1000) + } + } + + exampleSeekbarPlayerController?.setOnSeekBarChangeListener(object : + SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + if (fromUser) { + seekTo(progress) + } + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) { + tvPlayerSeekTime?.visibility = VISIBLE + isDragging = true + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + isDragging = false + tvPlayerSeekTime?.visibility = INVISIBLE + } + }) + } + + fun play() { + player.play() + exampleIvPlayPlayerController?.setImageResource(R.mipmap.iv_example_stop) + MsConstants.Exampleplaying = true + isDragging = false + } + + fun pause() { + player.pause() + exampleIvPlayPlayerController?.setImageResource(R.mipmap.iv_example_play) + MsConstants.Exampleplaying = false + isDragging = true + } + + private fun seekTo(progress: Int) { + player.seekTo(progress.toLong()) + seekTime() + } + + private fun seekTime() { + val currentPosition = player.currentPosition + val currentTime = formatTimestamp(currentPosition / 1000) + val totalDuration = player.duration + val totalTime = formatTimestamp(totalDuration / 1000) + tvPlayerSeekTime?.text = "$currentTime/$totalTime" + } + + fun stop() { + player.stop() + exampleProgressJob?.cancel() + } + + fun release() { + player.release() + } + + @SuppressLint("UnsafeOptInUsageError") + fun setPlayInfo(dataRes: com.localee.mireo.app.http.api.ExampleRecommendDataRes.Data?) { + if (dataRes?.video_info != null) { + ivCover?.let { + Glide.with(context).load(dataRes.video_info.image_url) + .into(it) + } + ivCover?.visibility = View.VISIBLE + MsConstants.Exampleready = false + exampleTvTitlePlayerController?.text = dataRes.name + if (TranslatesUtils.translates() != null) { + exampleTvEpisodePlayerController?.text = TranslatesUtils.replace( + TranslatesUtils.translates()?.episode_set.toString(), + dataRes.video_info.episode.toString() + ).plus(" / ").plus( + TranslatesUtils.replace( + TranslatesUtils.translates()?.complete_episode.toString(), + dataRes.episode_total.toString() + ) + ) + exampleTvSeries?.text = TranslatesUtils.translates()?.recommand_series + } else { + exampleTvEpisodePlayerController?.text = + "EP.".plus(dataRes.video_info.episode).plus(" / EP.") + .plus(dataRes.episode_total) + exampleTvSeries?.text = context.getString(R.string.example_series) + } + exampleTvCollectionNumController?.text = dataRes.collect_total?.let { formatNumber(it) } + exampleTvCollectionNumController?.setTextColor( + if (dataRes.is_collect) resources.getColor( + R.color.example_color_F56490 + ) else resources.getColor(R.color.white) + ) + exampleIvCollectionController?.setImageResource(if (dataRes.is_collect) R.mipmap.iv_example_collection_h else R.mipmap.iv_example_collection_n) + player.setMediaSource(buildMediaSource(dataRes.video_info.video_url)) + player.prepare() + exampleTvEpisodePlayerController?.setOnClickListener { + if (MsConstants.Exampleready) { + context.startActivity( + Intent( + context, + VideoPlayActivity::class.java + ).apply { + dataRes.video_info?.short_play_id?.let { + dataRes.video_info.short_play_video_id.let { it1 -> + putExtra(CONSTANTS_activity_id, it1) + putExtra(CONSTANTS_short_play_id, it) + } + } + }) + } + } + episodePlayerController?.setOnClickListener { + if (MsConstants.Exampleready) { + context.startActivity( + Intent( + context, + VideoPlayActivity::class.java + ).apply { + dataRes.video_info?.short_play_id?.let { + dataRes.video_info.short_play_video_id.let { it1 -> + putExtra(CONSTANTS_activity_id, it1) + putExtra(CONSTANTS_short_play_id, it) + } + } + }) + } + } + exampleIvQuality?.setOnClickListener { + context.startActivity( + Intent( + context, + SearchActivity::class.java + ) + ) + } + } else { + ToastUtils.show("There is a problem with the video source") + } + } + + @SuppressLint("UnsafeOptInUsageError") + private fun buildMediaSource(videoPath: String): MediaSource { + val dataSourceFactory: DataSource.Factory = DefaultDataSourceFactory(context, "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))) + } + } + + +} 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 new file mode 100644 index 0000000..660ae83 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleSeriesDataAdapter.kt @@ -0,0 +1,52 @@ +package com.localee.mireo.app.ui.videoPaly + +import android.content.Context +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.app.http.api.VideoDetailsApi + +class ExampleSeriesDataAdapter : + BaseQuickAdapter() { + var currentPosition = -1 + override fun onBindViewHolder( + holder: QuickViewHolder, + position: Int, + item: VideoDetailsApi.Bean.Episode? + ) { + val view = holder.getView(R.id.example_tv_num_data) + view.text = item?.episode.toString() + if (currentPosition == view.text.toString().toInt()) { + holder.setBackgroundResource(R.id.ll_num_data, R.drawable.bg_example_num_h) + holder.setTextColor( + R.id.example_tv_num_data, + context.getColor(R.color.example_color_FF0049) + ) + holder.setVisible(R.id.example_tv_num_data, false) + holder.setVisible(R.id.example_iv_num_data, true) + } else { + holder.setBackgroundResource(R.id.ll_num_data, R.drawable.bg_example_num_n) + holder.setTextColor( + R.id.example_tv_num_data, + context.getColor(R.color.example_color_999999) + ) + holder.setVisible(R.id.example_tv_num_data, true) + holder.setVisible(R.id.example_iv_num_data, false) + } +// if (item?.is_lock == true && !ExampleMMKVUtils.isVip()) { +// holder.setVisible(R.id.iv_example_lock, true) +// } else { +// } + holder.setVisible(R.id.iv_example_lock, false) + } + + override fun onCreateViewHolder( + context: Context, + parent: ViewGroup, + viewType: Int + ): QuickViewHolder { + return QuickViewHolder(R.layout.example_item_num_data, parent) + } +} 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 new file mode 100644 index 0000000..0c4d3ed --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleSeriesDialogFragment.kt @@ -0,0 +1,138 @@ +package com.localee.mireo.app.ui.videoPaly + +import android.app.AlertDialog +import android.app.Dialog +import android.os.Bundle +import android.view.Gravity +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.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.TranslatesUtils +import com.localee.mireo.app.utils.singleClick +import org.greenrobot.eventbus.EventBus + +class ExampleSeriesDialogFragment : DialogFragment() { + var seriesCallBack: SeriesCallBack? = null + + interface SeriesCallBack { + fun chooseSeries(episode: VideoDetailsApi.Bean.Episode) + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val builder = AlertDialog.Builder(requireActivity()) + val inflater = requireActivity().layoutInflater + val view = inflater.inflate(R.layout.example_dialog_series, null) + val exampleDialogSeriesBinding = ExampleDialogSeriesBinding.bind(view) + val episodeList: List? = + arguments?.getParcelableArrayList(Constants_Episodes_Series_Data_ListExample) + val data: VideoDetailsApi.Bean.ShortPlayInfo? = + arguments?.getParcelable(Constants_Episodes_Series_DataExample) + val currentPosition = + arguments?.getInt(Constants_Episodes_Series_Data_currentPositionExample, 0) + val splitDataLists: MutableList> = mutableListOf() + val splitDataTypes: MutableList = mutableListOf() + var startIndex = 0 + var endIndex: Int + val pageSize = 30 + var dataIndex = 1 + + while (startIndex < episodeList?.size!!) { + endIndex = startIndex + pageSize + if (endIndex > episodeList.size) { + endIndex = episodeList.size + } + + val sublist = episodeList.subList(startIndex, endIndex) + splitDataLists.add(sublist) + + val dataType = "${dataIndex}-${dataIndex + sublist.size - 1}" + splitDataTypes.add(dataType) + + startIndex = endIndex + dataIndex += sublist.size + } + exampleDialogSeriesBinding.clVip.setOnClickListener { + singleClick { + dismiss() + EventBus.getDefault() + .post(MsConstants.CONSTANTS_stop_play) + } + } + + exampleDialogSeriesBinding.tvVip.text = TranslatesUtils.translates()?.Membership + exampleDialogSeriesBinding.tvVipDes.text = TranslatesUtils.translates()?.go_vip_store +// exampleDialogSeriesBinding.clVip.visibility = +// if (MsMMKVUtils.isVip()) View.INVISIBLE else View.VISIBLE + val exampleSeriesNumAdapter = ExampleSeriesNumAdapter() + val manager = + LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) + exampleDialogSeriesBinding.rvNumDialogSeries.layoutManager = manager + exampleDialogSeriesBinding.rvNumDialogSeries.adapter = exampleSeriesNumAdapter + exampleSeriesNumAdapter.submitList(splitDataTypes) + val exampleSeriesDataAdapter = ExampleSeriesDataAdapter() + val spanCount = 6 + val layoutManager = GridLayoutManager(context, spanCount) + exampleDialogSeriesBinding.rvDataDialogSeries.layoutManager = layoutManager + exampleDialogSeriesBinding.rvDataDialogSeries.adapter = exampleSeriesDataAdapter + exampleSeriesDataAdapter.submitList(splitDataLists[0]) + if (currentPosition != null) { + exampleSeriesDataAdapter.currentPosition = currentPosition.plus(1) + } + exampleSeriesNumAdapter.currentPosition = 0 + exampleSeriesNumAdapter.setOnItemClickListener { adapter, view, position -> + exampleSeriesDataAdapter.submitList(splitDataLists[position]) + exampleSeriesNumAdapter.currentPosition = position + exampleSeriesNumAdapter.notifyDataSetChanged() + exampleSeriesDataAdapter.notifyDataSetChanged() + } + 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 +// } +// } + seriesCallBack?.chooseSeries(item) + dismiss() + } + isCancelable = true + exampleDialogSeriesBinding.tvContentDialogSeries.text = data?.description + exampleDialogSeriesBinding.tvName.text = data?.name + exampleDialogSeriesBinding.tvTotal.text = buildString { + append("Total ") + append(data?.episode_total) + append(" Episodes") + } + Glide.with(this) + .load(data?.image_url) + .into(exampleDialogSeriesBinding.ivImg) + exampleDialogSeriesBinding.ivCloseDialogSeries.setOnClickListener { dismiss() } + builder.setView(exampleDialogSeriesBinding.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 = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = layoutParams + return dialog + } +} 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 new file mode 100644 index 0000000..0fcbcaa --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleSeriesNumAdapter.kt @@ -0,0 +1,33 @@ +package com.localee.mireo.app.ui.videoPaly + +import android.content.Context +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 + +class ExampleSeriesNumAdapter : + BaseQuickAdapter() { + var currentPosition = -1 + override fun onBindViewHolder( + holder: QuickViewHolder, + position: Int, + item: String? + ) { + holder.setText(R.id.example_tv_num_episodes, item) + if (currentPosition == position) { + holder.setTextColor(R.id.example_tv_num_episodes, context.getColor(R.color.white)) + } else { + holder.setTextColor(R.id.example_tv_num_episodes, Color.parseColor("#40FFFFFF")) + } + } + + override fun onCreateViewHolder( + context: Context, + parent: ViewGroup, + viewType: Int + ): QuickViewHolder { + return QuickViewHolder(R.layout.example_item_series_top, parent) + } +} 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 new file mode 100644 index 0000000..eccc222 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleUnFavoriteDialog.kt @@ -0,0 +1,31 @@ +package com.localee.mireo.app.ui.videoPaly + +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.app.R + +class ExampleUnFavoriteDialog(context: Context) : Dialog(context) { + + init { + init() + } + + private fun init() { + requestWindowFeature(Window.FEATURE_NO_TITLE) + setContentView(R.layout.example_dialog_un_collection) + + 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/videoPaly/FfmpegRenderersFactory.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/FfmpegRenderersFactory.kt new file mode 100644 index 0000000..42363bc --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/FfmpegRenderersFactory.kt @@ -0,0 +1,44 @@ +package com.localee.mireo.app.ui.videoPaly + +import android.annotation.SuppressLint +import android.content.Context +import android.os.Handler +import androidx.media3.decoder.ffmpeg.FfmpegAudioRenderer +import androidx.media3.exoplayer.DefaultRenderersFactory +import androidx.media3.exoplayer.Renderer +import androidx.media3.exoplayer.audio.AudioRendererEventListener +import androidx.media3.exoplayer.audio.AudioSink +import androidx.media3.exoplayer.mediacodec.MediaCodecSelector + + +@SuppressLint("UnsafeOptInUsageError") +internal class FfmpegRenderersFactory(context: Context?) : DefaultRenderersFactory( + context!! +) { + init { + setExtensionRendererMode(EXTENSION_RENDERER_MODE_ON) + } + + override fun buildAudioRenderers( + context: Context, + extensionRendererMode: Int, + mediaCodecSelector: MediaCodecSelector, + enableDecoderFallback: Boolean, + audioSink: AudioSink, + eventHandler: Handler, + eventListener: AudioRendererEventListener, + out: ArrayList + ) { + out.add(FfmpegAudioRenderer()) + super.buildAudioRenderers( + context, + extensionRendererMode, + mediaCodecSelector, + enableDecoderFallback, + audioSink, + eventHandler, + eventListener, + out + ) + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..d00d0e3 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/LoadingLine.kt @@ -0,0 +1,59 @@ +package com.localee.mireo.app.ui.videoPaly + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.view.animation.AlphaAnimation +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 + + +class LoadingLine : FrameLayout { + private var loadView: View? = null + + constructor(context: Context) : super(context) { + initView(context) + } + + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { + initView(context) + } + + constructor( + context: Context, + attrs: AttributeSet?, + defStyleAttr: Int + ) : super(context, attrs, defStyleAttr) { + initView(context) + } + + private fun initView(mContext: Context) { + val view: View = LayoutInflater.from(mContext).inflate(R.layout.line_layout, null) + loadView = view.findViewById(R.id.loadingView) + this.addView(view) + } + + fun startAnimation() { + val scale = ScaleAnimation( + 0.3f, 1f, 1f, 1f, + Animation.RELATIVE_TO_SELF, 0.5f, + Animation.RELATIVE_TO_SELF, 0.5f + ) + val alpha = AlphaAnimation(1f, 0.2f) + scale.repeatCount = -1 + alpha.repeatCount = -1 + val set = AnimationSet(true) + set.addAnimation(scale) + set.addAnimation(alpha) + set.duration = 500 + loadView!!.startAnimation(set) + } + + fun endAnimation() { + loadView!!.clearAnimation() + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/MyHeaderView.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/MyHeaderView.kt new file mode 100644 index 0000000..81530a3 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/MyHeaderView.kt @@ -0,0 +1,60 @@ +package com.localee.mireo.app.ui.videoPaly + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.drawable.AnimationDrawable +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.ImageView +import com.localee.mireo.app.R +import com.scwang.smart.refresh.layout.api.RefreshLayout +import com.scwang.smart.refresh.layout.constant.RefreshState +import com.scwang.smart.refresh.layout.simple.SimpleComponent + + +@SuppressLint("UseCompatLoadingForDrawables") +class MyHeaderView(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : + SimpleComponent(context, attrs, defStyleAttr) { + var animDrawable: AnimationDrawable + + constructor(context: Context?) : this(context, null) + constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0) + + init { + val view: View = LayoutInflater.from(context).inflate(R.layout.example_refresh_head, this) + val ref_head_img = view.findViewById(R.id.ref_head_img) + animDrawable = resources.getDrawable(R.drawable.my_refresh_head) as AnimationDrawable + ref_head_img.setImageDrawable(animDrawable) + + } + + override fun onFinish(layout: RefreshLayout, success: Boolean): Int { + if (success) { + animDrawable.stop() + } else { + animDrawable.stop() + } + super.onFinish(layout, success) + return 500 + } + + override fun onStateChanged( + refreshLayout: RefreshLayout, + oldState: RefreshState, + newState: RefreshState + ) { + when (newState) { + RefreshState.PullDownToRefresh -> + animDrawable.start() + + RefreshState.ReleaseToRefresh -> {} + RefreshState.Refreshing -> {} + else -> {} + } + } + +} + + + 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/ui/videoPaly/TranslatesRes.kt new file mode 100644 index 0000000..85216ff --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/TranslatesRes.kt @@ -0,0 +1,251 @@ +package com.localee.mireo.app.ui.videoPaly + +class TranslatesRes( + val languages: List, + val last_update_time: String, + val translates: Translates +) { + + data class Language( + val cn_name: String, + val description: String, + val id: Int, + val is_default: Int, + val lang_key: String, + val show_name: String + ) + + data class Translates( + val alert_setting_message_logout: String, + val all: String, + val QualityChoose: String, + val Quality: String, + val ActivateVIP: String, + val VIP_Membership: String, + val supervalue: String, + val auto_sub: String, + val Membership: String, + val followustip: String, + val Explore_More: String, + val notificestip: String, + val follow_fb_pop: String, + val Go: String, + val go_vip_store: String, + val vip_info: String, + val buy: String, + val join_guyan_vip: String, + val donate_expire: String, + val copied: String, + val updatenowtitle: String, + val picture_error: String, + val updatenow: String, + val no_restored: String, + val open_photo_tips: String, + val Remaining: String, + val RewardRules: String, + val readme: String, + val no_episode: String, + val open_notification: String, + val open_notification_info: String, + val open_notification_later: String, + val open_notification_open: String, + val return_text: String, + val recommended_for_you: String, + val member_service_ag: String, + val feedback: String, + val title_about: String, + val feedbackhistory: String, + val feedbackdetails: String, + val please_click_here: String, + val member_service_agreement: String, + val vip_not_credit_notice_1: String, + val vip_not_credit_notice_2: String, + val vip_not_credit_notice_3: String, + val vip_refresh: String, + val alter_cancel: String, + val alter_confirm: String, + val rating: String, + val enjoy: String, + val buy_episode_notice: String, + val change_language: String, + val click_to_watch: String, + val tag_hot: String, + val tag_free: String, + val tag_new: String, + val coins: String, + val DeleteAccount: String, + val DeleteAccount_tips_1: String, + val DeleteAccount_tips_2: String, + val DeleteAccount_tips_3: String, + val DeleteAccount_tips_4: String, + val DeleteAccount_tips_5: String, + val DeleteAccount_tips_title_1: String, + val DeleteAccount_tips_title_2: String, + val DeleteAccount_tips_title_3: String, + val DeleteAccount_tips_title_4: String, + val DeleteAccount_tips_text_1: String, + val DeleteAccount_tips_text_2: String, + val DeleteAccount_tips_text_3: String, + val store: String, + val balance: String, + val unlock: String, + val unlock_tips: String, + val info_vip: String, + val info_gold: String, + val RewardCoins: String, + val store_tips_android: String, + val Restore: String, + val collection: String, + val player_ads_watched: String, + val watch_video_unlock: String, + val commom_highlight_agreement: String, + val commom_highlight_children: String, + val commom_highlight_privacy: String, + val commom_highlight_teenager: String, + val commom_highlight_third: String, + val commom_highlight_user: String, + val commom_text_subscribe: String, + val common_button_more: String, + val complete_episode: String, + val consumption_record: String, + val continue_watch: String, + val day: String, + val donate_coins: String, + val Extra: String, + val player_share_title: String, + val player_share_copy: String, + val player_share_ep: String, + val player_share_other: String, + val Donate: String, + val not_installed: String, + val Donate_new_user: String, + val Rules: String, + val share_rules_info: String, + val enter_keywords_search: String, + val episode_set: String, + val last_watch: String, + val watch: String, + val first_start_close: String, + val first_start_tips_message: String, + val first_start_title: String, + val free_from_ads: String, + val g_pay_cancel: String, + val g_pay_error: String, + val g_pay_success: String, + val google_login_exception: String, + val home: String, + val join: String, + val jump_unlock_error: String, + val lang_option_notice: String, + val language: String, + val language_text_system: String, + val language_text_system_tip: String, + val log_out: String, + val login: String, + val login_first: String, + val login_read_text: String, + val login_title_apple: String, + val login_title_facebook: String, + val login_title_tiktok: String, + val me: String, + val mine_text_renew: String, + val mine_text_tip: String, + val mine_title_browsing_istory: String, + val mine_title_consumption: String, + val mine_title_consumption_coins: String, + val mine_title_consumption_vip: String, + val mine_title_customer: String, + val mine_title_setting: String, + val mine_title_tourist: String, + val more: String, + val FreeSeries: String, + val view_all_shorts: String, + val manual_new_recommand_tag: String, + val manual_new_recommand_title: String, + val new_for_you: String, + val browsing_history: String, + val my_collection: String, + val edit: String, + val network_error: String, + val ad_error: String, + val success: String, + val no_more_data: String, + val no_spend: String, + val no_vip: String, + val not_collect_warning: String, + val not_allunlock_episodes: String, + val not_unlock_episodes: String, + val ok: String, + val Congratulations: String, + val player_text_episcode: String, + val privacy_policy: String, + val VisitWebsite: String, + val purchase_record: String, + val purchase_vip: String, + val quit: String, + val read_before_purchase: String, + val recharge_coins: String, + val recharge_wait_notice: String, + val recommand: String, + val rewards: String, + val recommand_head: String, + val recommand_series: String, + val refresh_Header_refreshing_text: String, + val refresh_auto_footer_idle_text: String, + val refresh_auto_footer_refreshing_rext: String, + val refresh_header_date_today_text: String, + val refresh_header_idle_text: String, + val refresh_header_last_time_text: String, + val refresh_header_none_last_date_text: String, + val refresh_header_pulling_text: String, + val refresh_success: String, + val reharge_vip_wait_notice: String, + val s_no_content: String, + val search: String, + val search_history: String, + val TrendingSearches: String, + val search_input: String, + val send_coins: String, + val Most_Trending: String, + val Top_Searched: String, + val New_Releases: String, + val send_coins_expire_notice: String, + val setting_title_out: String, + val settings: String, + val short_ranking: String, + val sin_in_with_google: String, + val facebook_top: String, + val stay_turned: String, + val system: String, + val tabbar_discover: String, + val tabbar_mine: String, + val tabbar_videos: String, + val theater: String, + val corner_marker_3: String, + val top_rankings: String, + val tips: String, + val coins_insufficient_and_recharge: String, + val top_up_now: String, + val try_again: String, + val unlocking_coins_notice: String, + val lastUnlock: String, + val user_agreement: String, + val vip_expire_time: String, + val vip_not_credit_notice: String, + val vip_update: String, + val vistor: String, + val watch_all: String, + val watch_now: String, + val Unlocking_whole_series: String, + val whole_series_num: String, + val alert_setting_message_signout: String, + val yes: String, + val top_up: String, + val my_wallet: String, + val ad_viewing_limit: String, + val tiktok_app_tips: String, + val kick_out_login: String, + val retry: String, + val no_network: String + ) +} \ No newline at end of file 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 new file mode 100644 index 0000000..c1e72fb --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/VideoPlayAdapter.kt @@ -0,0 +1,49 @@ +package com.localee.mireo.app.ui.videoPaly + +import android.content.Context +import android.view.ViewGroup +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.app.http.api.VideoDetailsApi + +class VideoPlayAdapter : + BaseQuickAdapter() { + var currentPlayingPosition = 0 + var playerDetailCollection: PlayerDetailCollection? = null + var shortVideo: VideoDetailsApi.Bean.ShortPlayInfo? = null + + interface PlayerDetailCollection { + fun collection(episode: VideoDetailsApi.Bean.Episode) + } + + override fun onBindViewHolder( + holder: QuickViewHolder, + position: Int, + item: VideoDetailsApi.Bean.Episode? + ) { + val exampleDetailPlayerView = holder.getView(R.id.item_detail_view) + val playerView = exampleDetailPlayerView.findViewById(R.id.player_view) + val imageView = + playerView.findViewById(R.id.example_iv_collection_controller) + imageView.setOnClickListener { item?.let { it1 -> playerDetailCollection?.collection(it1) } } + if (position == currentPlayingPosition) { + item?.let { shortVideo?.let { it1 -> + exampleDetailPlayerView.setPlayInfo(it, it1) + } + } + } else { + exampleDetailPlayerView.stop() + } + } + + override fun onCreateViewHolder( + context: Context, + parent: ViewGroup, + viewType: Int + ): QuickViewHolder { + return QuickViewHolder(R.layout.example_item_detail, parent) + } +} 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 new file mode 100644 index 0000000..9f3853b --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/ui/videoPaly/VideoPlayerView.kt @@ -0,0 +1,364 @@ +package com.localee.mireo.app.ui.videoPaly + +import android.annotation.SuppressLint +import android.content.Context +import android.net.Uri +import android.text.TextUtils +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.FrameLayout +import android.widget.SeekBar +import androidx.appcompat.widget.AppCompatImageView +import androidx.appcompat.widget.AppCompatSeekBar +import androidx.appcompat.widget.AppCompatTextView +import androidx.media3.common.MediaItem +import androidx.media3.common.PlaybackException +import androidx.media3.common.Player +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 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.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.seek +import com.localee.mireo.app.utils.TranslatesUtils +import com.localee.mireo.app.utils.formatNumber +import com.localee.mireo.app.utils.formatTimestamp +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import kotlinx.coroutines.delay +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.greenrobot.eventbus.EventBus + + +class VideoPlayerView(context: Context, attrs: AttributeSet?) : + FrameLayout(context, attrs) { + @SuppressLint("UnsafeOptInUsageError") + private var builder = ExoPlayer.Builder(context, FfmpegRenderersFactory(context)) + .setRenderersFactory(DefaultRenderersFactory(context).setEnableDecoderFallback(true)) + private var player: ExoPlayer? = builder.build() + private val viewLifecycleScope = MainScope() + private var isDragging = false + private var exampleSeekbarPlayerController: AppCompatSeekBar? = null + private var exampleProgressJob: Job? = null + private var exampleIvPlayPlayerController: AppCompatImageView? = null + private var exampleIvCollectionController: AppCompatImageView? = null + private var exampleIvBackController: AppCompatImageView? = null + private var ivCover: AppCompatImageView? = null + private var exampleTvEpisodePlayerController: ShapeTextView? = null + private var ivEpisodePlayerController: AppCompatImageView? = null + private var exampleTvDesPlayerController: AppCompatTextView? = null + private var exampleTvCollectionNumController: AppCompatTextView? = null + private var exampleTvTitlePlayerController: AppCompatTextView? = null + private var tvExampleSeries: AppCompatTextView? = null + private var tv_player_seek_time: AppCompatTextView? = null + private var example_iv_quality: AppCompatImageView? = null + private var loadingLine: LoadingLine? = null + private var iv_des_change: AppCompatImageView? = null + private var example_iv_share: AppCompatImageView? = null + private var isExpanded = false + private var progress: Long = 0L + + init { + val inflate = + LayoutInflater.from(context) + .inflate(R.layout.example_detail_player_view, this, true) + val exampleDetailPlayerViewBinding = ExampleDetailPlayerViewBinding.bind(inflate) + exampleDetailPlayerViewBinding.playerView.player = player + exampleSeekbarPlayerController = + exampleDetailPlayerViewBinding.playerView.findViewById(R.id.example_seekBar_player_controller) + exampleIvPlayPlayerController = + exampleDetailPlayerViewBinding.playerView.findViewById(R.id.example_iv_play_player_controller) + exampleIvCollectionController = + exampleDetailPlayerViewBinding.playerView.findViewById(R.id.example_iv_collection_controller) + exampleIvBackController = + exampleDetailPlayerViewBinding.playerView.findViewById(R.id.example_iv_back_controller) + ivCover = exampleDetailPlayerViewBinding.playerView.findViewById(R.id.iv_cover_detail) + tvExampleSeries = + exampleDetailPlayerViewBinding.playerView.findViewById(R.id.tv_example_series) + exampleTvEpisodePlayerController = + exampleDetailPlayerViewBinding.playerView.findViewById(R.id.example_tv_episode_player_controller) + ivEpisodePlayerController = + exampleDetailPlayerViewBinding.playerView.findViewById(R.id.iv_episode_player_controller) + exampleTvDesPlayerController = + exampleDetailPlayerViewBinding.playerView.findViewById(R.id.example_tv_des_player_controller) + exampleTvCollectionNumController = + exampleDetailPlayerViewBinding.playerView.findViewById(R.id.example_tv_collection_num_controller) + exampleTvTitlePlayerController = + exampleDetailPlayerViewBinding.playerView.findViewById(R.id.example_tv_title_player_controller) + tv_player_seek_time = + exampleDetailPlayerViewBinding.playerView.findViewById(R.id.tv_player_seek_time) + loadingLine = exampleDetailPlayerViewBinding.playerView.findViewById(R.id.load_line) + iv_des_change = exampleDetailPlayerViewBinding.playerView.findViewById(R.id.iv_des_change) + example_iv_share = + exampleDetailPlayerViewBinding.playerView.findViewById(R.id.example_iv_share) + example_iv_quality = + exampleDetailPlayerViewBinding.playerView.findViewById(R.id.example_iv_quality) + player?.addListener(object : Player.Listener { + override fun onPlaybackStateChanged(playbackState: Int) { + super.onPlaybackStateChanged(playbackState) + when (playbackState) { + Player.STATE_BUFFERING -> { + loadingLine?.visibility = VISIBLE + loadingLine?.postDelayed({ loadingLine?.startAnimation() }, 200) + } + + Player.STATE_READY -> { + exampleIvPlayPlayerController?.isEnabled = true + if (ExampleDetailCanPlay) { + if (seek && progress > 0) { + player?.seekTo(progress) + seek = false + } + play() + setProgress() + } + ivCover?.visibility = View.INVISIBLE + loadingLine?.visibility = View.INVISIBLE + loadingLine?.endAnimation() + } + + Player.STATE_ENDED -> { + EventBus.getDefault() + .post(MsConstants.Constants_DetailPlayerView_PLAYER_STATUS_FINISHExample) + } + + Player.STATE_IDLE -> { + exampleIvPlayPlayerController?.isEnabled = false + } + } + } + + override fun onPlayerError(error: PlaybackException) { + super.onPlayerError(error) + ivCover?.visibility = View.INVISIBLE + loadingLine?.visibility = View.INVISIBLE + } + }) + exampleIvPlayPlayerController?.setOnClickListener { + if (MsConstants.ExampleDetailPlaying) { + pause() + } else { + play() + } + } + iv_des_change?.setOnClickListener { + isExpanded = !isExpanded + updateTextViewState(exampleTvDesPlayerController) + } + exampleTvDesPlayerController?.setOnClickListener { + isExpanded = !isExpanded + updateTextViewState(exampleTvDesPlayerController) + } +// example_iv_share?.setOnClickListener { +// EventBus.getDefault() +// .post(MsConstants.CONSTANTS_share) +// } + example_iv_quality?.setOnClickListener { + EventBus.getDefault() + .post(MsConstants.CONSTANTS_quality) + } + } + + + private fun setProgress() { + exampleProgressJob?.cancel() + val duration = player!!.duration + exampleSeekbarPlayerController?.max = duration.toInt() + exampleSeekbarPlayerController?.progress = player!!.currentPosition.toInt() + exampleSeekbarPlayerController?.setOnSeekBarChangeListener(null) + exampleProgressJob = viewLifecycleScope.launch { + while (isActive) { + if (!isDragging) { + withContext(Dispatchers.Main) { + exampleSeekbarPlayerController?.progress = player!!.currentPosition.toInt() + } + } + delay(1000) + } + } + + exampleSeekbarPlayerController?.setOnSeekBarChangeListener(object : + SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + if (fromUser) { + seekTo(progress) + } + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) { + tv_player_seek_time?.visibility = VISIBLE + isDragging = true + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + isDragging = false + tv_player_seek_time?.visibility = INVISIBLE + } + }) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + exampleProgressJob?.cancel() + } + + fun play() { + player?.play() + exampleIvPlayPlayerController?.setImageResource(R.mipmap.iv_example_stop) + MsConstants.ExampleDetailPlaying = true + isDragging = false + } + + fun pause() { + player?.pause() + exampleIvPlayPlayerController?.setImageResource(R.mipmap.iv_example_play) + MsConstants.ExampleDetailPlaying = false + isDragging = true + } + + private fun seekTo(progress: Int) { + player?.seekTo(progress.toLong()) + seekTime() + } + + private fun seekTime() { + val currentPosition = player!!.currentPosition + val currentTime = formatTimestamp(currentPosition / 1000) + val totalDuration = player!!.duration + val totalTime = formatTimestamp(totalDuration / 1000) + tv_player_seek_time?.text = "$currentTime/$totalTime" + } + + fun stop() { + player?.stop() + } + + fun lastProgress(): Long { + return player?.currentPosition ?: 0 + } + + fun release() { + viewLifecycleScope.cancel() + exampleProgressJob?.cancel() + exampleProgressJob = null + player?.release() + player = null + } + + @SuppressLint("UnsafeOptInUsageError") + fun setPlayInfo( + episode: VideoDetailsApi.Bean.Episode, + shortVideo: VideoDetailsApi.Bean.ShortPlayInfo? + ) { + if (shortVideo != null) { + ExampleDetailCanPlay = true + ivCover?.let { + Glide.with(context).load(shortVideo.image_url) + .into(it) + } + progress = if (episode.play_seconds?.isNotEmpty() == true) { + episode.play_seconds!!.toLong() + } else { + 0 + } + seek = true + ivCover?.visibility = View.VISIBLE + exampleTvTitlePlayerController?.text = shortVideo.name + if (TranslatesUtils.translates() != null) { + exampleTvEpisodePlayerController?.text = TranslatesUtils.replace( + TranslatesUtils.translates()?.episode_set.toString(), + episode.episode.toString() + ).plus(" / ").plus( + TranslatesUtils.replace( + TranslatesUtils.translates()?.complete_episode.toString(), + shortVideo.episode_total.toString() + ) + ) + tvExampleSeries?.text = TranslatesUtils.translates()?.recommand_series + } else { + exampleTvEpisodePlayerController?.text = + "EP.".plus(episode.episode).plus(" / EP.") + .plus(shortVideo.episode_total) + tvExampleSeries?.text = context.getString(R.string.example_series) + } + exampleTvDesPlayerController?.text = shortVideo.description + exampleTvCollectionNumController?.text = formatNumber(shortVideo.collect_total) + exampleTvCollectionNumController?.setTextColor( + if (shortVideo.is_collect) resources.getColor( + R.color.example_color_F56490 + ) else resources.getColor(R.color.white) + ) + exampleIvCollectionController?.setImageResource(if (shortVideo.is_collect) R.mipmap.iv_example_collection_h else R.mipmap.iv_example_collection_n) + 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() + .post(MsConstants.Constants_RecommendPlayerView_CLOSEExample) + } + updateTextViewState(exampleTvDesPlayerController) + } else { + ToastUtils.show("There is a problem with the video source") + } + } + + @SuppressLint("SetTextI18n") + private fun updateTextViewState(textView: AppCompatTextView?) { + if (isExpanded) { + textView?.maxLines = 5 + textView?.ellipsize = TextUtils.TruncateAt.END + iv_des_change?.setImageResource(R.mipmap.iv_des_top) + } else { + textView?.maxLines = 2 + textView?.ellipsize = TextUtils.TruncateAt.END + iv_des_change?.setImageResource(R.mipmap.iv_des_down) + } + textView?.post { + val ellipsisCount = textView.layout?.getEllipsisCount(textView.lineCount - 1) + if (ellipsisCount != null) { + if (ellipsisCount <= 0 && textView.maxLines == 2) { + iv_des_change?.visibility = View.INVISIBLE + } + } + } + } + + @SuppressLint("UnsafeOptInUsageError") + private fun buildMediaSource(videoPath: String): MediaSource { + val dataSourceFactory: DataSource.Factory = DefaultDataSourceFactory(context, "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))) + } + } +} diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/DHStringUtils.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/DHStringUtils.kt new file mode 100644 index 0000000..eddb19e --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/DHStringUtils.kt @@ -0,0 +1,52 @@ +package com.localee.mireo.app.utils + +import android.text.TextUtils +import okhttp3.FormBody +import okhttp3.RequestBody +import org.json.JSONObject +import java.math.BigDecimal +import java.math.RoundingMode + +object DHStringUtils { + fun divideAndFormat(dividend: Int, divisor: Int): String { + return BigDecimal(dividend) + .divide(BigDecimal(divisor), 2, RoundingMode.HALF_EVEN) + .toPlainString() + } + + fun getLocalizedString(key: String): String? { + val resultString = MsMMKVUtils.getLangs() + if(!TextUtils.isEmpty(resultString)){ + return run { + val resultObject = JSONObject(resultString) + resultObject.optString(key, null) + } + }else{ + return "" + } + + } + fun getLocalizedJSONObject(): JSONObject { + val resultString = MsMMKVUtils.getLangs() + if(!TextUtils.isEmpty(resultString)){ + return run { + val resultObject = JSONObject(resultString) + resultObject + } + }else{ + return JSONObject() + } + + } + + fun getPublicRequest(map: MutableMap): RequestBody { + val builder = FormBody.Builder() + for (key in map.keys) { + builder.add(key, map[key]) + } + val requestBody: RequestBody = builder.build() + return requestBody + } + + +} \ No newline at end of file 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 new file mode 100644 index 0000000..df005e6 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/ExampleStand.kt @@ -0,0 +1,170 @@ +package com.localee.mireo.app.utils + +import android.annotation.SuppressLint +import android.content.Context +import android.os.Build +import java.text.SimpleDateFormat +import java.time.Instant +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter +import java.util.Calendar +import java.util.Date +import java.util.Locale +import java.util.TimeZone + +inline fun Any.saveAs(): T { + return this as T +} + +@Suppress("UNCHECKED_CAST") +fun Any.standAsUnChecked(): T { + return this as T +} + +var lastClickTime = 0L +fun singleClick(during: Long = 500L, callBack: () -> Unit) { + val now = Date().time + if (now - lastClickTime > during) { + callBack() + } + lastClickTime = now +} + + +fun getCurrentTimeZone(): String { + return createGmtOffsetString(true, true, TimeZone.getDefault().rawOffset) +} + +fun createGmtOffsetString( + includeGmt: Boolean, includeMinuteSeparator: Boolean, offsetMillis: Int +): String { + var offsetMinutes = offsetMillis / 60000 + var sign = '+' + if (offsetMinutes < 0) { + sign = '-' + offsetMinutes = -offsetMinutes + } + val builder: StringBuilder = StringBuilder(9) + if (includeGmt) { + builder.append("GMT") + } + builder.append(sign) + appendNumber(builder, 2, offsetMinutes / 60) + if (includeMinuteSeparator) { + builder.append(':') + } + appendNumber(builder, 2, offsetMinutes % 60) + return builder.toString() +} + +private fun appendNumber(builder: StringBuilder, count: Int, value: Int) { + val string = value.toString() + for (i in 0 until count - string.length) { + builder.append('0') + } + builder.append(string); +} + + +fun formatNumber(num: Int): String { + return when { + num >= 1000000 -> "${(num / 1000000.0).format(1)}M" + num >= 1000 -> "${(num / 1000.0).format(1)}K" + else -> num.toString() + } +} + +fun formatNumberByLong(num: Long): String { + return when { + num >= 1000000 -> "${(num / 1000000.0).format(1)}M" + num >= 1000 -> "${(num / 1000.0).format(1)}K" + else -> num.toString() + } +} + +fun formatNumberHeat(num: Long): String { + return when { + num >= 1000000 -> "${(num / 1000000.0).format(1)}M" + else -> num.toString() + } +} + +private fun Double.format(digits: Int) = "%.${digits}f".format(this) + +fun formatTimestamp(timestampInSeconds: Long): String { + val minutes = timestampInSeconds / 60 + val seconds = timestampInSeconds % 60 + return String.format("%02d:%02d", minutes, seconds) +} + +@SuppressLint("SimpleDateFormat") +fun transToString(time: Long): String { + val date = Date(time * 1000) + return SimpleDateFormat("yyyy-MM-dd").format(date) +} +// +//fun getAdvertisingIdInfo(context: Context): String { +// try { +// return AdvertisingIdClient.getAdvertisingIdInfo(context).id.toString() +// } catch (e: Exception) { +// e.printStackTrace() +// } +// return "" +//} +// +//fun shouldShowPopup(): Boolean { +// val lastPopupTime = ExampleMMKVUtils.getMMKV().getLong(CONSTANTS_PREF_LAST_POPUP_TIME, 0) +// val currentTime = System.currentTimeMillis() +// +// 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 shouldShowVIP(): Boolean { +// val lastPopupTime = +// ExampleMMKVUtils.getMMKV().getLong(CONSTANTS_PREF_LAST_POPUP_TIME_VIP, 0) +// val currentTime = System.currentTimeMillis() +// +// return currentTime - lastPopupTime > ONE_DAY_IN_MILLIS_VIP +//} + +fun getUserAgent(): String { + return System.getProperty("http.agent") ?: "" +} + +fun getNowTime(): String { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + // API 26 及以上,使用 LocalDateTime 和 DateTimeFormatter + val currentDateTime = LocalDateTime.now() + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH") + currentDateTime.format(formatter) + } else { + // API 26 以下,使用 SimpleDateFormat 和 Calendar + val calendar = Calendar.getInstance() + val sdf = SimpleDateFormat("yyyy-MM-dd-HH", Locale.getDefault()) + sdf.format(calendar.time) + } +} + + +fun getNowTimeToAd(): Long { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + // API 26 及以上,使用 Instant.now().epochSecond + Instant.now().epochSecond + } else { + // API 26 以下,使用 System.currentTimeMillis() 转换为秒级时间戳 + System.currentTimeMillis() / 1000L + } +} + +fun dpToPx(dp: Int, context: Context): Int { + return (dp * context.resources.displayMetrics.density).toInt() +} + 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 new file mode 100644 index 0000000..e34c57b --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/MsMMKVUtils.kt @@ -0,0 +1,52 @@ +package com.localee.mireo.app.utils + +import com.google.gson.Gson +import com.localee.mireo.app.http.api.UserInfoRes +import com.localee.mireo.app.other.MsConstants +import com.tencent.mmkv.MMKV + + +object MsMMKVUtils { + private var mmkv: MMKV? = null + + + fun getMMKV(): MMKV { + if (mmkv == null) { + mmkv = MMKV.defaultMMKV() + } + return mmkv!! + } + + fun saveToken(token :String){ + getMMKV().putString(MsConstants.ACCESS_TOKEN, token) + } + + fun getToken(): String { + val close = getMMKV().getString(MsConstants.ACCESS_TOKEN, "") + return close.toString(); + } + + fun saveLangs(token: String) { + + getMMKV().putString(MsConstants.APP_LANG, token) + } + fun getLangs(): String { + val close = getMMKV().getString(MsConstants.APP_LANG, "") + return close.toString(); + } + + fun saveUserInfo(infoRes: UserInfoRes?) { + val toJson = Gson().toJson(infoRes) + getMMKV() + .putString(MsConstants.CONSTANTS_User_STRING, toJson) + } + + fun getUserInfo(): UserInfoRes? { + val string = getMMKV().getString(MsConstants.CONSTANTS_User_STRING, "{}") + if ("{}" == string) { + return UserInfoRes.createWithDefaults() + } + return Gson().fromJson(string, UserInfoRes::class.java) + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/MsSystemUtlis.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/MsSystemUtlis.kt new file mode 100644 index 0000000..1d0f310 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/MsSystemUtlis.kt @@ -0,0 +1,242 @@ +package com.localee.mireo.app.utils + +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.Bitmap +import android.graphics.BitmapShader +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.graphics.RectF +import android.graphics.Shader +import android.net.ConnectivityManager +import android.net.Uri +import android.provider.Settings +import android.util.Log +import java.net.NetworkInterface + + +object MsSystemUtlis { + private const val TAG = "SystemUtlis" + + fun getVerNameInfo(context: Context): String { + var loading = "" + try { + val status = context.packageName + loading = context.packageManager + .getPackageInfo(status, 0).versionName + } catch (e: PackageManager.NameNotFoundException) { + e.printStackTrace() + } + return loading + } + + + fun getSchemeFromUrl(url: String?): String? { + var consunmptioni: MutableMap = mutableMapOf() + consunmptioni.put("equivalent", 946.0) + consunmptioni.put("telegra", 781.0) + consunmptioni.put("prods", 152.0) + consunmptioni.put("excluding", 331.0) + while (consunmptioni.size > 80) { + break + } + + + val message = Uri.parse(url) + var expIb: Double = 7816.0 + if (expIb <= 117.0) { + } + + + return message.scheme + } + + fun getVerCodeInfo(context: Context): Int { + + var loading = 1 + try { + + + val status = context.packageName + loading = context.packageManager + .getPackageInfo(status, 0).versionCode + } catch (e: PackageManager.NameNotFoundException) { + e.printStackTrace() + } + + return loading + } + + fun getDeviceId(context: Context): String? { + var tilteR: Boolean = true + while (tilteR) { + break + } + + + val m_view = + Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID) + var wholef: MutableList = mutableListOf() + wholef.add(151.0) + wholef.add(980.0) + if (wholef.size > 88) { + } + + + + + return when { + m_view?.isNotEmpty() == true -> m_view + else -> { + var update_fr: Boolean = true + + + Log.e(TAG, "no androidId") + var themesMO: Long = 9562L + if (themesMO == 62L) { + } + + + null + } + } + } + + fun isNetworkConnected(): Boolean { + try { + val interfaces: List = + NetworkInterface.getNetworkInterfaces().asSequence() + .toList() + .filter { it.isUp } + + for (networkInterface in interfaces) { + val hardwareAddress = networkInterface.hardwareAddress + if (hardwareAddress != null && !isLoopbackAddress(hardwareAddress)) { + return true + } + } + } catch (e: java.net.SocketException) { + e.printStackTrace() + } + + return false + } + + private fun isLoopbackAddress(address: ByteArray): Boolean { + return address.size == 6 && address[0] == 0x00.toByte() && address[1] == 0x00.toByte() && address[2] == 0x5E.toByte() + } + + /** + * check NetworkAvailable + * + * @param context + * @return + */ + fun isNetworkAvailable(context: Context): Boolean { + val manager = context.applicationContext.getSystemService( + Context.CONNECTIVITY_SERVICE + ) as ConnectivityManager + if (null == manager) { + return false + } + val info = manager.activeNetworkInfo + return null != info && info.isAvailable + } + + + fun openFacebookProfile(context: Context, username: String) { + val facebookUrl = "https://www.facebook.com/" + username + try { + val facebookAppUrl = "fb://profile/" + username + val facebookIntent = Intent(Intent.ACTION_VIEW, Uri.parse(facebookAppUrl)) + context.startActivity(facebookIntent) + } catch (e: Exception) { + val webIntent = Intent(Intent.ACTION_VIEW, Uri.parse(facebookUrl)) + context.startActivity(webIntent) + } + } + + fun openTiktok(context: Context, userId: String) { + val tiktokUserProfileUrl = "tiktok://user/profile/$userId" + val intent = Intent(Intent.ACTION_VIEW) + intent.setData(Uri.parse(tiktokUserProfileUrl)) + val packageManager: PackageManager = context.getPackageManager() + val apps = packageManager.queryIntentActivities(intent, 0) + if (apps.size > 0) { + context.startActivity(intent) + } else { + val playStoreIntent = Intent( + Intent.ACTION_VIEW, + Uri.parse("market://details?id=com.zhiliaoapp.musically") + ) + context.startActivity(playStoreIntent) + } + + } + + fun openYouTube(context: Context, channelId: String) { + val youtubeUrl = "https://www.youtube.com/channel/$channelId" + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(youtubeUrl)) + intent.putExtra( + Intent.EXTRA_REFERRER, + Uri.parse("android-app://com.google.android.youtube") + ) + val packageManager: PackageManager = context.getPackageManager() + val apps = packageManager.queryIntentActivities(intent, 0) + if (apps.size > 0) { + context.startActivity(intent) + } else { + val playStoreIntent = Intent( + Intent.ACTION_VIEW, + Uri.parse("market://details?id=com.google.android.youtube") + ) + context.startActivity(playStoreIntent) + } + + } + + fun openInstagram(context: Context, username: String) { + val instagramUrl = "https://www.instagram.com/$username" + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(instagramUrl)) + intent.putExtra(Intent.EXTRA_REFERRER, Uri.parse("android-app://com.instagram.android")) + val packageManager: PackageManager = context.getPackageManager() + val apps = packageManager.queryIntentActivities(intent, 0) + if (apps.size > 0) { + context.startActivity(intent) + } else { + val playStoreIntent = + Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.instagram.android")) + context.startActivity(playStoreIntent) + } + + } + + fun getScaledBitmap(originalBitmap: Bitmap, maxWidth: Int, maxHeight: Int): Bitmap { + val width = originalBitmap.width + val height = originalBitmap.height + val scaleFactor = Math.min(maxWidth.toFloat() / width, maxHeight.toFloat() / height) + + val newWidth = (width * scaleFactor).toInt() + val newHeight = (height * scaleFactor).toInt() + + return Bitmap.createScaledBitmap(originalBitmap, newWidth, newHeight, true) + } + + fun getRoundedCornerBitmap(bitmap: Bitmap): Bitmap { + val output = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888) + val canvas = Canvas(output) + val paint = Paint() + val rect = Rect(0, 0, bitmap.width, bitmap.height) + val roundRect = RectF(rect) + + paint.isAntiAlias = true + paint.shader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP) + canvas.drawRoundRect(roundRect, 10f, 10f, paint) + + return output + } + + +} \ 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 new file mode 100644 index 0000000..c5fe2ea --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/utils/TranslatesUtils.kt @@ -0,0 +1,52 @@ +package com.localee.mireo.app.utils + +import android.text.Spannable +import android.text.SpannableString +import android.text.Spanned +import android.text.style.ForegroundColorSpan +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 + +object TranslatesUtils { + fun saveTranslates(infoRes: TranslatesRes.Translates?) { + val toJson = Gson().toJson(infoRes) + MsMMKVUtils.getMMKV() + .putString(MsConstants.CONSTANTS_Translates_STRING, toJson) + } + + fun translates(): TranslatesRes.Translates? { + val string = MsMMKVUtils.getMMKV() + .getString(MsConstants.CONSTANTS_Translates_STRING, "") + return Gson().fromJson(string, TranslatesRes.Translates::class.java) + } + + fun replace(string: String, new: String): String { + return string.replace("##", new) + } + + fun replaces(string: String, new1: String, new2: String): String { + val replace = string.replace("#1#", new1) + return replace.replace("#2#", new2) + } + + fun highlightCharacter(textView: TextView, charToHighlight: String?, newColor: Int) { + val originalText = textView.text.toString() + val index = originalText.indexOf(charToHighlight.toString()) + if (index >= 0) { + val spannableString = SpannableString(originalText) + if (charToHighlight != null) { + spannableString.setSpan( + ForegroundColorSpan(newColor), + index, + index + charToHighlight.length, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + spannableString.setSpan(UnderlineSpan(), index, index + charToHighlight.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + } + textView.text = spannableString + } + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..197b574 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/BrowserView.kt @@ -0,0 +1,362 @@ +package com.localee.mireo.app.widget + +import android.annotation.TargetApi +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.net.http.SslError +import android.os.Build +import android.text.TextUtils +import android.util.AttributeSet +import android.webkit.* +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.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( + context: Context, attrs: AttributeSet? = null, + defStyleAttr: Int = android.R.attr.webViewStyle, defStyleRes: Int = 0) : + NestedScrollWebView(context, attrs, defStyleAttr, defStyleRes), + LifecycleEventObserver, ActivityAction { + + companion object { + + init { + setWebContentsDebuggingEnabled(AppConfig.isDebug()) + } + } + + init { + val settings: WebSettings = settings + settings.allowFileAccess = true + settings.setGeolocationEnabled(true) + //settings.setSavePassword(true); + // 开启 JavaScript + settings.javaScriptEnabled = true + settings.javaScriptCanOpenWindowsAutomatically = true + settings.loadsImagesAutomatically = true + settings.domStorageEnabled = true + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + settings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW + } + + isVerticalScrollBarEnabled = false + isHorizontalScrollBarEnabled = false + } + + override fun getUrl(): String? { + return super.getOriginalUrl() ?: return super.getUrl() + } + + fun setLifecycleOwner(owner: LifecycleOwner) { + owner.lifecycle.addObserver(this) + } + + /** + * [LifecycleEventObserver] + */ + override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { + } + + fun onDestroy() { + stopLoading() + clearHistory() + setBrowserChromeClient(null) + setBrowserViewClient(null) + removeAllViews() + destroy() + } + + @Deprecated("Please use {@link BrowserViewClient}", ReplaceWith( + "super.setWebViewClient(client)", + "com.hjq.widget.layout.NestedScrollWebView")) + override fun setWebViewClient(client: WebViewClient) { + super.setWebViewClient(client) + } + + fun setBrowserViewClient(client: BrowserViewClient?) { + if (client == null) { + super.setWebViewClient(WebViewClient()) + return + } + super.setWebViewClient(client) + } + + @Deprecated("Please use {@link BrowserChromeClient}", ReplaceWith( + "super.setWebChromeClient(client)", + "com.hjq.widget.layout.NestedScrollWebView")) + override fun setWebChromeClient(client: WebChromeClient?) { + super.setWebChromeClient(client) + } + + fun setBrowserChromeClient(client: BrowserChromeClient?) { + super.setWebChromeClient(client) + } + + open class BrowserViewClient : WebViewClient() { + + override fun onReceivedSslError(view: WebView, handler: SslErrorHandler, error: SslError) { + MessageDialog.Builder(view.context) + .setMessage(R.string.common_web_ssl_error_title) + .setConfirm(R.string.common_web_ssl_error_allow) + .setCancel(R.string.common_web_ssl_error_reject) + .setCancelable(false) + .setListener(object : MessageDialog.OnListener { + + override fun onConfirm(dialog: BaseDialog?) { + handler.proceed() + } + + override fun onCancel(dialog: BaseDialog?) { + handler.cancel() + } + }) + .show() + } + + @TargetApi(Build.VERSION_CODES.M) + override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) { + if (request.isForMainFrame) { + onReceivedError(view, error.errorCode, error.description.toString(), request.url.toString()) + } + } + + override fun onReceivedError(view: WebView, errorCode: Int, description: String, failingUrl: String) { + super.onReceivedError(view, errorCode, description, failingUrl) + } + + @TargetApi(Build.VERSION_CODES.N) + override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { + return shouldOverrideUrlLoading(view, request.url.toString()) + } + + 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) + "tel" -> dialing(view, url) + } + return true + } + + 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:", ""))) + .setConfirm(R.string.common_web_call_phone_allow) + .setCancel(R.string.common_web_call_phone_reject) + .setCancelable(false) + .setListener(object : MessageDialog.OnListener { + + override fun onConfirm(dialog: BaseDialog?) { + val intent = Intent(Intent.ACTION_DIAL) + intent.data = Uri.parse(url) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + context.startActivity(intent) + } + }) + .show() + } + } + + open class BrowserChromeClient constructor(private val webView: BrowserView) : WebChromeClient() { + + 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) + .setMessage(message) + .setCancelable(false) + .addOnDismissListener(object : BaseDialog.OnDismissListener { + + override fun onDismiss(dialog: BaseDialog?) { + result.confirm() + } + }) + .show() + return true + } + + override fun onJsConfirm(view: WebView, url: String, message: String, result: JsResult): Boolean { + val activity: Activity = webView.getActivity() ?: return false + MessageDialog.Builder(activity) + .setMessage(message) + .setCancelable(false) + .setListener(object : MessageDialog.OnListener { + + override fun onConfirm(dialog: BaseDialog?) { + result.confirm() + } + + override fun onCancel(dialog: BaseDialog?) { + result.cancel() + } + }) + .show() + return true + } + + 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) + .setHint(message) + .setCancelable(false) + .setListener(object : InputDialog.OnListener { + + override fun onConfirm(dialog: BaseDialog?, content: String) { + result.confirm(content) + } + + override fun onCancel(dialog: BaseDialog?) { + result.cancel() + } + }) + .show() + 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>) { + val intent: Intent = params.createIntent() + val mimeTypes: Array? = params.acceptTypes + val multipleSelect: Boolean = params.mode == FileChooserParams.MODE_OPEN_MULTIPLE + if ((mimeTypes != null) && (mimeTypes.isNotEmpty()) && !TextUtils.isEmpty(mimeTypes[0])) { + // 要过滤的文件类型 + intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes) +// if (mimeTypes.size == 1) { +// when (mimeTypes[0]) { +// "image/*" -> { +// ImageSelectActivity.start(activity, if (multipleSelect) Int.MAX_VALUE else 1, object : OnPhotoSelectListener { +// override fun onSelected(data: MutableList) { +// val uris: MutableList = ArrayList(data.size) +// for (filePath in data) { +// uris.add(Uri.fromFile(File(filePath))) +// } +// callback.onReceiveValue(uris.toTypedArray()) +// } +// +// override fun onCancel() { +// callback.onReceiveValue(null) +// } +// }) +// return +// } +// "video/*" -> { +// VideoSelectActivity.start(activity, if (multipleSelect) Int.MAX_VALUE else 1, object : OnVideoSelectListener { +// +// override fun onSelected(data: MutableList) { +// val uris: MutableList = ArrayList(data.size) +// for (bean in data) { +// uris.add(Uri.fromFile(File(bean.getVideoPath()))) +// } +// callback.onReceiveValue(uris.toTypedArray()) +// } +// +// override fun onCancel() { +// callback.onReceiveValue(null) +// } +// }) +// return +// } +// } +// } + } + + intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, multipleSelect) + 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) + } + } + } + } + callback.onReceiveValue(uris.toTypedArray()) + } + }) + } + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/CustomNestedScrollView.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/CustomNestedScrollView.kt new file mode 100644 index 0000000..17ed09f --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/CustomNestedScrollView.kt @@ -0,0 +1,31 @@ +package com.localee.mireo.app.widget + +import android.content.Context +import android.util.AttributeSet +import android.view.MotionEvent +import androidx.core.widget.NestedScrollView +import kotlin.math.abs + +class CustomNestedScrollView (context: Context, attrs: AttributeSet?) : NestedScrollView(context, attrs) { + private var lastX = 0f + private var lastY = 0f + + override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { + when (ev.action) { + MotionEvent.ACTION_DOWN -> { + lastX = ev.x + lastY = ev.y + } + MotionEvent.ACTION_MOVE -> { + val dx = abs(ev.x - lastX) + val dy = abs(ev.y - lastY) + // 如果水平滑动距离大于垂直距离,则不拦截事件 + if (dx > dy) { + return false + } + } + } + return super.onInterceptTouchEvent(ev) + } + +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/LoadingAnimationView.kt b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/LoadingAnimationView.kt new file mode 100644 index 0000000..b08584d --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/LoadingAnimationView.kt @@ -0,0 +1,42 @@ +package com.localee.mireo.app.widget + +import android.content.Context +import android.graphics.drawable.AnimationDrawable +import android.util.AttributeSet +import androidx.core.content.ContextCompat +import com.localee.mireo.app.R + +class LoadingAnimationView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : androidx.appcompat.widget.AppCompatImageView(context, attrs, defStyleAttr) { + + private var animationDrawable: AnimationDrawable? = null + + init { + val drawable = ContextCompat.getDrawable(context, R.drawable.my_loading) + background = drawable?.mutate() + animationDrawable = background as? AnimationDrawable + } + + fun start() { + animationDrawable?.apply { + if (!isRunning) { + setLayerType(LAYER_TYPE_HARDWARE, null) + start() + } + } + this.visibility = VISIBLE + } + + fun stop() { + animationDrawable?.apply { + if (isRunning) { + stop() + post { setLayerType(LAYER_TYPE_NONE, null) } + } + } + this.visibility = GONE + } +} \ 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 new file mode 100644 index 0000000..a4cd3a0 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/PasswordView.kt @@ -0,0 +1,96 @@ +package com.localee.mireo.app.widget + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.graphics.Path +import android.util.AttributeSet +import android.view.View +import com.localee.mireo.app.R + +class PasswordView @JvmOverloads constructor + (context: Context?, attrs: AttributeSet? = null, + defStyleAttr: Int = 0, defStyleRes: Int = 0) : + View(context, attrs, defStyleAttr, defStyleRes) { + + companion object { + + private const val POINT_RADIUS: Int = 15 + + private val POINT_COLOR: Int = Color.parseColor("#666666") + + private val STROKE_COLOR: Int = Color.parseColor("#ECECEC") + + const val PASSWORD_COUNT: Int = 6 + } + + private val paint: Paint = Paint() + private val path: Path = Path() + private val pointPaint: Paint = Paint() + + private val itemWidth: Int = resources.getDimension(R.dimen.dp_44).toInt() + + private val itemHeight: Int = resources.getDimension(R.dimen.dp_41).toInt() + + private var currentIndex: Int = 0 + + init { + paint.isAntiAlias = true + paint.color = STROKE_COLOR + paint.style = Paint.Style.STROKE + + path.moveTo(0f, 0f) + path.lineTo((itemWidth * PASSWORD_COUNT).toFloat(), 0f) + path.lineTo((itemWidth * PASSWORD_COUNT).toFloat(), itemHeight.toFloat()) + path.lineTo(0f, itemHeight.toFloat()) + path.close() + + pointPaint.isAntiAlias = true + pointPaint.style = Paint.Style.FILL + pointPaint.color = POINT_COLOR + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + var finalWidthMeasureSpec: Int = widthMeasureSpec + var finalHeightMeasureSpec: Int = heightMeasureSpec + when (MeasureSpec.getMode(finalWidthMeasureSpec)) { + MeasureSpec.AT_MOST, MeasureSpec.UNSPECIFIED -> + finalWidthMeasureSpec = MeasureSpec.makeMeasureSpec(itemWidth * PASSWORD_COUNT, MeasureSpec.EXACTLY) + MeasureSpec.EXACTLY -> {} + } + when (MeasureSpec.getMode(finalHeightMeasureSpec)) { + MeasureSpec.AT_MOST, MeasureSpec.UNSPECIFIED -> + finalHeightMeasureSpec = MeasureSpec.makeMeasureSpec(itemHeight, MeasureSpec.EXACTLY) + MeasureSpec.EXACTLY -> {} + } + setMeasuredDimension(finalWidthMeasureSpec, finalHeightMeasureSpec) + } + + override fun onDraw(canvas: Canvas) { + paint.strokeWidth = 5f + canvas.drawPath(path, paint) + + paint.strokeWidth = 3f + for (index in 1 until PASSWORD_COUNT) { + canvas.drawLine((itemWidth * index).toFloat(), 0f, (itemWidth * index).toFloat(), itemHeight.toFloat(), paint) + } + + if (currentIndex == 0) { + return + } + for (i in 1..currentIndex) { + canvas.drawCircle( + i * itemWidth - itemWidth.toFloat() / 2, + itemHeight.toFloat() / 2, + POINT_RADIUS.toFloat(), + pointPaint + ) + } + } + + fun setPassWordLength(index: Int) { + currentIndex = index + invalidate() + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..ecf1a44 --- /dev/null +++ b/Android_Mireo/app/src/main/java/com/localee/mireo/app/widget/StatusLayout.kt @@ -0,0 +1,97 @@ +package com.localee.mireo.app.widget + +import android.content.* +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.view.* +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.TextView +import androidx.annotation.DrawableRes +import androidx.annotation.RawRes +import androidx.annotation.StringRes +import androidx.core.content.ContextCompat +import com.localee.mireo.app.R + +class StatusLayout @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, + defStyleAttr: Int = 0, defStyleRes: Int = 0) : + FrameLayout(context, attrs, defStyleAttr, defStyleRes) { + + private var mainLayout: ViewGroup? = null + + private var lottieView: ImageView? = null + + private var textView: TextView? = null + + private var retryView: TextView? = null + + private var listener: OnRetryListener? = null + fun show() { + if (mainLayout == null) { + initLayout() + } + if (isShow()) { + return + } + retryView!!.visibility = if (listener == null) INVISIBLE else VISIBLE + mainLayout!!.visibility = VISIBLE + } + + fun hide() { + if (mainLayout == null || !isShow()) { + return + } + mainLayout!!.visibility = INVISIBLE + } + + fun isShow(): Boolean { + return mainLayout != null && mainLayout?.visibility == VISIBLE + } + + fun setIcon(@DrawableRes id: Int) { + setIcon(ContextCompat.getDrawable(context, id)) + } + + fun setIcon(drawable: Drawable?) { + lottieView?.apply { + setImageDrawable(drawable) + } + } + + fun setAnimResource(@RawRes id: Int) { + lottieView?.apply { + } + } + + fun setHint(@StringRes id: Int) { + setHint(resources.getString(id)) + } + + fun setHint(text: CharSequence?) { + textView?.text = text ?: "" + } + + private fun initLayout() { + mainLayout = LayoutInflater.from(context).inflate(R.layout.widget_status_layout, this, false) as ViewGroup + lottieView = mainLayout!!.findViewById(R.id.iv_status_icon) + textView = mainLayout!!.findViewById(R.id.iv_status_text) + retryView = mainLayout!!.findViewById(R.id.iv_status_retry) + retryView!!.setOnClickListener(clickWrapper) + addView(mainLayout) + } + + fun setOnRetryListener(listener: OnRetryListener?) { + this.listener = listener + if (isShow()) { + retryView!!.visibility = if (this.listener == null) INVISIBLE else VISIBLE + } + } + + private val clickWrapper: OnClickListener = OnClickListener { listener?.onRetry(this@StatusLayout) } + + interface OnRetryListener { + + fun onRetry(layout: StatusLayout) + } +} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/anim/left_in_activity.xml b/Android_Mireo/app/src/main/res/anim/left_in_activity.xml new file mode 100644 index 0000000..e03efb4 --- /dev/null +++ b/Android_Mireo/app/src/main/res/anim/left_in_activity.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/anim/left_out_activity.xml b/Android_Mireo/app/src/main/res/anim/left_out_activity.xml new file mode 100644 index 0000000..464168e --- /dev/null +++ b/Android_Mireo/app/src/main/res/anim/left_out_activity.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/anim/right_in_activity.xml b/Android_Mireo/app/src/main/res/anim/right_in_activity.xml new file mode 100644 index 0000000..253a11f --- /dev/null +++ b/Android_Mireo/app/src/main/res/anim/right_in_activity.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/anim/right_out_activity.xml b/Android_Mireo/app/src/main/res/anim/right_out_activity.xml new file mode 100644 index 0000000..912cc35 --- /dev/null +++ b/Android_Mireo/app/src/main/res/anim/right_out_activity.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/anim/shake_anim.xml b/Android_Mireo/app/src/main/res/anim/shake_anim.xml new file mode 100644 index 0000000..157383d --- /dev/null +++ b/Android_Mireo/app/src/main/res/anim/shake_anim.xml @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/anim/shake_interpolator.xml b/Android_Mireo/app/src/main/res/anim/shake_interpolator.xml new file mode 100644 index 0000000..2b3fd50 --- /dev/null +++ b/Android_Mireo/app/src/main/res/anim/shake_interpolator.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guide_1_bg.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guide_1_bg.webp new file mode 100644 index 0000000..d347de5 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guide_1_bg.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guide_2_bg.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guide_2_bg.webp new file mode 100644 index 0000000..6828de4 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guide_2_bg.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guide_3_bg.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guide_3_bg.webp new file mode 100644 index 0000000..3118c08 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guide_3_bg.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh00.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh00.webp new file mode 100644 index 0000000..96a30b0 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh00.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh01.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh01.webp new file mode 100644 index 0000000..dd0fae6 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh01.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh02.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh02.webp new file mode 100644 index 0000000..08d1df2 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh02.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh03.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh03.webp new file mode 100644 index 0000000..af53d15 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh03.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh04.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh04.webp new file mode 100644 index 0000000..301f356 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh04.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh05.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh05.webp new file mode 100644 index 0000000..b10252a Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh05.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh06.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh06.webp new file mode 100644 index 0000000..176d4e4 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh06.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh07.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh07.webp new file mode 100644 index 0000000..8624049 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh07.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh08.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh08.webp new file mode 100644 index 0000000..b942709 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh08.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh09.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh09.webp new file mode 100644 index 0000000..4b1e629 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh09.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh10.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh10.webp new file mode 100644 index 0000000..3cb63af Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh10.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh11.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh11.webp new file mode 100644 index 0000000..1b09b07 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh11.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh12.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh12.webp new file mode 100644 index 0000000..6237d1d Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh12.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh13.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh13.webp new file mode 100644 index 0000000..e6383da Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh13.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh14.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh14.webp new file mode 100644 index 0000000..26b95c4 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh14.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh15.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh15.webp new file mode 100644 index 0000000..f4aba75 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh15.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh16.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh16.webp new file mode 100644 index 0000000..aa5d9bd Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh16.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh17.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh17.webp new file mode 100644 index 0000000..91f915d Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh17.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh18.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh18.webp new file mode 100644 index 0000000..1a86c1d Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh18.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh19.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh19.webp new file mode 100644 index 0000000..83e2633 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh19.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh20.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh20.webp new file mode 100644 index 0000000..4ab61d9 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh20.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh21.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh21.webp new file mode 100644 index 0000000..e5847be Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh21.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh22.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh22.webp new file mode 100644 index 0000000..fcd6284 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh22.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh23.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh23.webp new file mode 100644 index 0000000..ee6e1aa Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh23.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh24.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh24.webp new file mode 100644 index 0000000..43c642e Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh24.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh25.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh25.webp new file mode 100644 index 0000000..9fa86e0 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh25.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh26.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh26.webp new file mode 100644 index 0000000..6c2fe30 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh26.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh27.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh27.webp new file mode 100644 index 0000000..c85db9c Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh27.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh28.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh28.webp new file mode 100644 index 0000000..1345238 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh28.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh29.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh29.webp new file mode 100644 index 0000000..dd3f4d2 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh29.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh30.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh30.webp new file mode 100644 index 0000000..1de4aa3 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh30.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh31.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh31.webp new file mode 100644 index 0000000..1de4aa3 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh31.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh32.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh32.webp new file mode 100644 index 0000000..1de4aa3 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/guyantvrefresh32.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading00.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading00.webp new file mode 100644 index 0000000..25b3728 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading00.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading01.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading01.webp new file mode 100644 index 0000000..66a0371 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading01.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading02.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading02.webp new file mode 100644 index 0000000..30a02f9 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading02.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading03.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading03.webp new file mode 100644 index 0000000..4d2b3ee Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading03.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading04.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading04.webp new file mode 100644 index 0000000..5fd9221 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading04.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading05.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading05.webp new file mode 100644 index 0000000..a790b89 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading05.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading06.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading06.webp new file mode 100644 index 0000000..7432cc7 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading06.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading07.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading07.webp new file mode 100644 index 0000000..1c7c00e Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading07.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading08.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading08.webp new file mode 100644 index 0000000..4ff242f Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading08.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading09.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading09.webp new file mode 100644 index 0000000..fb3a7cb Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading09.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading10.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading10.webp new file mode 100644 index 0000000..7e6b435 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading10.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading11.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading11.webp new file mode 100644 index 0000000..e65b41e Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading11.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading12.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading12.webp new file mode 100644 index 0000000..8627c38 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading12.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading13.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading13.webp new file mode 100644 index 0000000..e3c9fd1 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading13.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading14.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading14.webp new file mode 100644 index 0000000..d3fb012 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading14.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading15.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading15.webp new file mode 100644 index 0000000..c6c99c5 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading15.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading16.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading16.webp new file mode 100644 index 0000000..c67ae06 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading16.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading17.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading17.webp new file mode 100644 index 0000000..7a42688 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading17.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading18.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading18.webp new file mode 100644 index 0000000..8d5e0e4 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading18.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading19.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading19.webp new file mode 100644 index 0000000..ea09ed0 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading19.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading20.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading20.webp new file mode 100644 index 0000000..e3438b6 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading20.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading21.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading21.webp new file mode 100644 index 0000000..6203d94 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading21.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading22.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading22.webp new file mode 100644 index 0000000..7d8dce3 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading22.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading23.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading23.webp new file mode 100644 index 0000000..4bcd09c Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading23.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading24.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading24.webp new file mode 100644 index 0000000..451a1cb Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading24.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading25.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading25.webp new file mode 100644 index 0000000..915ee08 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading25.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading26.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading26.webp new file mode 100644 index 0000000..917f3d7 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading26.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading27.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading27.webp new file mode 100644 index 0000000..873d78f Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading27.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading28.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading28.webp new file mode 100644 index 0000000..a519c0e Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading28.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading29.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading29.webp new file mode 100644 index 0000000..9604867 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading29.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading30.webp b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading30.webp new file mode 100644 index 0000000..25b3728 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/loading30.webp differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/logo_big_ic.png b/Android_Mireo/app/src/main/res/drawable-xxhdpi/logo_big_ic.png new file mode 100644 index 0000000..7ed0ad2 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/logo_big_ic.png differ diff --git a/Android_Mireo/app/src/main/res/drawable-xxhdpi/update_app_top_bg.png b/Android_Mireo/app/src/main/res/drawable-xxhdpi/update_app_top_bg.png new file mode 100644 index 0000000..7f812f8 Binary files /dev/null and b/Android_Mireo/app/src/main/res/drawable-xxhdpi/update_app_top_bg.png differ diff --git a/Android_Mireo/app/src/main/res/drawable/add_ic.xml b/Android_Mireo/app/src/main/res/drawable/add_ic.xml new file mode 100644 index 0000000..43eaf96 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/add_ic.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/arrows_bottom_ic.xml b/Android_Mireo/app/src/main/res/drawable/arrows_bottom_ic.xml new file mode 100644 index 0000000..e6d04ad --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/arrows_bottom_ic.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/arrows_left_ic.xml b/Android_Mireo/app/src/main/res/drawable/arrows_left_ic.xml new file mode 100644 index 0000000..c3361c8 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/arrows_left_ic.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/arrows_right_ic.xml b/Android_Mireo/app/src/main/res/drawable/arrows_right_ic.xml new file mode 100644 index 0000000..71feb85 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/arrows_right_ic.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/arrows_top_ic.xml b/Android_Mireo/app/src/main/res/drawable/arrows_top_ic.xml new file mode 100644 index 0000000..821ae8b --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/arrows_top_ic.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/avatar_placeholder_ic.xml b/Android_Mireo/app/src/main/res/drawable/avatar_placeholder_ic.xml new file mode 100644 index 0000000..a92bf8d --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/avatar_placeholder_ic.xml @@ -0,0 +1,64 @@ + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/bg_bule_17.xml b/Android_Mireo/app/src/main/res/drawable/bg_bule_17.xml new file mode 100644 index 0000000..090ca67 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/bg_bule_17.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/bg_example_dialog_series.xml b/Android_Mireo/app/src/main/res/drawable/bg_example_dialog_series.xml new file mode 100644 index 0000000..9d08a75 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/bg_example_dialog_series.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/bg_example_dialog_un_collection.xml b/Android_Mireo/app/src/main/res/drawable/bg_example_dialog_un_collection.xml new file mode 100644 index 0000000..a683cee --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/bg_example_dialog_un_collection.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Android_Mireo/app/src/main/res/drawable/bg_example_me_login.xml b/Android_Mireo/app/src/main/res/drawable/bg_example_me_login.xml new file mode 100644 index 0000000..04f970e --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/bg_example_me_login.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/bg_example_num_h.xml b/Android_Mireo/app/src/main/res/drawable/bg_example_num_h.xml new file mode 100644 index 0000000..db734e6 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/bg_example_num_h.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/bg_example_num_n.xml b/Android_Mireo/app/src/main/res/drawable/bg_example_num_n.xml new file mode 100644 index 0000000..67afb7d --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/bg_example_num_n.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/bg_example_seekbar_player.xml b/Android_Mireo/app/src/main/res/drawable/bg_example_seekbar_player.xml new file mode 100644 index 0000000..93f2b13 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/bg_example_seekbar_player.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/bg_example_shape_seekbar_player.xml b/Android_Mireo/app/src/main/res/drawable/bg_example_shape_seekbar_player.xml new file mode 100644 index 0000000..0b473f2 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/bg_example_shape_seekbar_player.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file 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 new file mode 100644 index 0000000..794e760 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/bg_example_text_think_again.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Android_Mireo/app/src/main/res/drawable/bg_example_text_un_collection.xml b/Android_Mireo/app/src/main/res/drawable/bg_example_text_un_collection.xml new file mode 100644 index 0000000..d5b8841 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/bg_example_text_un_collection.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/bg_powder_red_17.xml b/Android_Mireo/app/src/main/res/drawable/bg_powder_red_17.xml new file mode 100644 index 0000000..50c22a5 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/bg_powder_red_17.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/bg_seekbar_player.xml b/Android_Mireo/app/src/main/res/drawable/bg_seekbar_player.xml new file mode 100644 index 0000000..93f2b13 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/bg_seekbar_player.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/bg_thumb_seekbar_player.xml b/Android_Mireo/app/src/main/res/drawable/bg_thumb_seekbar_player.xml new file mode 100644 index 0000000..0b473f2 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/bg_thumb_seekbar_player.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/bg_unlocking.xml b/Android_Mireo/app/src/main/res/drawable/bg_unlocking.xml new file mode 100644 index 0000000..7121804 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/bg_unlocking.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/bg_unlocking_ads.xml b/Android_Mireo/app/src/main/res/drawable/bg_unlocking_ads.xml new file mode 100644 index 0000000..d8bf167 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/bg_unlocking_ads.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/bg_white_20.xml b/Android_Mireo/app/src/main/res/drawable/bg_white_20.xml new file mode 100644 index 0000000..d8c4b4b --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/bg_white_20.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/button_circle_selector.xml b/Android_Mireo/app/src/main/res/drawable/button_circle_selector.xml new file mode 100644 index 0000000..97ff0a7 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/button_circle_selector.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/button_rect_selector.xml b/Android_Mireo/app/src/main/res/drawable/button_rect_selector.xml new file mode 100644 index 0000000..2681932 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/button_rect_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/camera_ic.xml b/Android_Mireo/app/src/main/res/drawable/camera_ic.xml new file mode 100644 index 0000000..ca10f5e --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/camera_ic.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/checkbox_checked_ic.xml b/Android_Mireo/app/src/main/res/drawable/checkbox_checked_ic.xml new file mode 100644 index 0000000..3b54b67 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/checkbox_checked_ic.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/checkbox_disable_ic.xml b/Android_Mireo/app/src/main/res/drawable/checkbox_disable_ic.xml new file mode 100644 index 0000000..6286230 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/checkbox_disable_ic.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/checkbox_selector.xml b/Android_Mireo/app/src/main/res/drawable/checkbox_selector.xml new file mode 100644 index 0000000..8b59d92 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/checkbox_selector.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/checkbox_selector_2.xml b/Android_Mireo/app/src/main/res/drawable/checkbox_selector_2.xml new file mode 100644 index 0000000..0478b0c --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/checkbox_selector_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/close_icon.xml b/Android_Mireo/app/src/main/res/drawable/close_icon.xml new file mode 100644 index 0000000..f2b1d4b --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/close_icon.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/compound_normal_ic.xml b/Android_Mireo/app/src/main/res/drawable/compound_normal_ic.xml new file mode 100644 index 0000000..81dbf68 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/compound_normal_ic.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/countdown_color_selector.xml b/Android_Mireo/app/src/main/res/drawable/countdown_color_selector.xml new file mode 100644 index 0000000..43a5372 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/countdown_color_selector.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/countdown_selector.xml b/Android_Mireo/app/src/main/res/drawable/countdown_selector.xml new file mode 100644 index 0000000..ba8a69c --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/countdown_selector.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/delete_ic.xml b/Android_Mireo/app/src/main/res/drawable/delete_ic.xml new file mode 100644 index 0000000..18baed8 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/delete_ic.xml @@ -0,0 +1,31 @@ + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/dialog_input_bg.xml b/Android_Mireo/app/src/main/res/drawable/dialog_input_bg.xml new file mode 100644 index 0000000..1a7c53b --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/dialog_input_bg.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/example_bg.xml b/Android_Mireo/app/src/main/res/drawable/example_bg.xml new file mode 100644 index 0000000..e66f37d --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/example_bg.xml @@ -0,0 +1,32 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/guide_indicator_selected.xml b/Android_Mireo/app/src/main/res/drawable/guide_indicator_selected.xml new file mode 100644 index 0000000..6c1cb31 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/guide_indicator_selected.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/guide_indicator_unselected.xml b/Android_Mireo/app/src/main/res/drawable/guide_indicator_unselected.xml new file mode 100644 index 0000000..aad2111 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/guide_indicator_unselected.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/home_explore_selector.xml b/Android_Mireo/app/src/main/res/drawable/home_explore_selector.xml new file mode 100644 index 0000000..d9c1ebf --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/home_explore_selector.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/home_home_off_ic.xml b/Android_Mireo/app/src/main/res/drawable/home_home_off_ic.xml new file mode 100644 index 0000000..e97da5e --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/home_home_off_ic.xml @@ -0,0 +1,25 @@ + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/home_home_on_ic.xml b/Android_Mireo/app/src/main/res/drawable/home_home_on_ic.xml new file mode 100644 index 0000000..a5e0757 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/home_home_on_ic.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/home_home_selector.xml b/Android_Mireo/app/src/main/res/drawable/home_home_selector.xml new file mode 100644 index 0000000..9f61cc7 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/home_home_selector.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/home_me_selector.xml b/Android_Mireo/app/src/main/res/drawable/home_me_selector.xml new file mode 100644 index 0000000..af770d3 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/home_me_selector.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/home_my_list_selector.xml b/Android_Mireo/app/src/main/res/drawable/home_my_list_selector.xml new file mode 100644 index 0000000..7b40a99 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/home_my_list_selector.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/home_rewards_selector.xml b/Android_Mireo/app/src/main/res/drawable/home_rewards_selector.xml new file mode 100644 index 0000000..2839d79 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/home_rewards_selector.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/home_search_bar_gray_bg.xml b/Android_Mireo/app/src/main/res/drawable/home_search_bar_gray_bg.xml new file mode 100644 index 0000000..067418e --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/home_search_bar_gray_bg.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/home_search_bar_transparent_bg.xml b/Android_Mireo/app/src/main/res/drawable/home_search_bar_transparent_bg.xml new file mode 100644 index 0000000..29b243b --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/home_search_bar_transparent_bg.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/image_error_ic.xml b/Android_Mireo/app/src/main/res/drawable/image_error_ic.xml new file mode 100644 index 0000000..2a70e3c --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/image_error_ic.xml @@ -0,0 +1,40 @@ + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/image_loading_ic.xml b/Android_Mireo/app/src/main/res/drawable/image_loading_ic.xml new file mode 100644 index 0000000..a1987e8 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/image_loading_ic.xml @@ -0,0 +1,43 @@ + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/image_preview_indicator.xml b/Android_Mireo/app/src/main/res/drawable/image_preview_indicator.xml new file mode 100644 index 0000000..bcae118 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/image_preview_indicator.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/info_ic.xml b/Android_Mireo/app/src/main/res/drawable/info_ic.xml new file mode 100644 index 0000000..2c330fa --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/info_ic.xml @@ -0,0 +1,27 @@ + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/login_qq_ic.xml b/Android_Mireo/app/src/main/res/drawable/login_qq_ic.xml new file mode 100644 index 0000000..c0509ee --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/login_qq_ic.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/login_wechat_ic.xml b/Android_Mireo/app/src/main/res/drawable/login_wechat_ic.xml new file mode 100644 index 0000000..63a5e3c --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/login_wechat_ic.xml @@ -0,0 +1,41 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/my_loading.xml b/Android_Mireo/app/src/main/res/drawable/my_loading.xml new file mode 100644 index 0000000..71f80cc --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/my_loading.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/my_refresh_head.xml b/Android_Mireo/app/src/main/res/drawable/my_refresh_head.xml new file mode 100644 index 0000000..f1c2aa1 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/my_refresh_head.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/phone_ic.xml b/Android_Mireo/app/src/main/res/drawable/phone_ic.xml new file mode 100644 index 0000000..bcd8c67 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/phone_ic.xml @@ -0,0 +1,24 @@ + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/progress_gradient_bg.xml b/Android_Mireo/app/src/main/res/drawable/progress_gradient_bg.xml new file mode 100644 index 0000000..3ba3755 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/progress_gradient_bg.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/progress_loading_bg.xml b/Android_Mireo/app/src/main/res/drawable/progress_loading_bg.xml new file mode 100644 index 0000000..b469f2e --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/progress_loading_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/radiobutton_checked_ic.xml b/Android_Mireo/app/src/main/res/drawable/radiobutton_checked_ic.xml new file mode 100644 index 0000000..8ed357f --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/radiobutton_checked_ic.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/radiobutton_disable_ic.xml b/Android_Mireo/app/src/main/res/drawable/radiobutton_disable_ic.xml new file mode 100644 index 0000000..2686fb6 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/radiobutton_disable_ic.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/radiobutton_selector.xml b/Android_Mireo/app/src/main/res/drawable/radiobutton_selector.xml new file mode 100644 index 0000000..f9a9ae3 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/radiobutton_selector.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/reboot_ic.xml b/Android_Mireo/app/src/main/res/drawable/reboot_ic.xml new file mode 100644 index 0000000..5c44055 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/reboot_ic.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/roll_accent_bg.xml b/Android_Mireo/app/src/main/res/drawable/roll_accent_bg.xml new file mode 100644 index 0000000..ee43ce2 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/roll_accent_bg.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/safe_ic.xml b/Android_Mireo/app/src/main/res/drawable/safe_ic.xml new file mode 100644 index 0000000..c243d7e --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/safe_ic.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/search_ic.xml b/Android_Mireo/app/src/main/res/drawable/search_ic.xml new file mode 100644 index 0000000..99a573e --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/search_ic.xml @@ -0,0 +1,57 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/share_ic.xml b/Android_Mireo/app/src/main/res/drawable/share_ic.xml new file mode 100644 index 0000000..5cb14c7 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/share_ic.xml @@ -0,0 +1,36 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/share_link_ic.xml b/Android_Mireo/app/src/main/res/drawable/share_link_ic.xml new file mode 100644 index 0000000..56bbc99 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/share_link_ic.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/share_moment_ic.xml b/Android_Mireo/app/src/main/res/drawable/share_moment_ic.xml new file mode 100644 index 0000000..cba78f6 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/share_moment_ic.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/share_qq_ic.xml b/Android_Mireo/app/src/main/res/drawable/share_qq_ic.xml new file mode 100644 index 0000000..4f82c71 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/share_qq_ic.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/share_qzone_ic.xml b/Android_Mireo/app/src/main/res/drawable/share_qzone_ic.xml new file mode 100644 index 0000000..dacfbc8 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/share_qzone_ic.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/share_wechat_ic.xml b/Android_Mireo/app/src/main/res/drawable/share_wechat_ic.xml new file mode 100644 index 0000000..28afc05 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/share_wechat_ic.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/status_empty_ic.xml b/Android_Mireo/app/src/main/res/drawable/status_empty_ic.xml new file mode 100644 index 0000000..bd74466 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/status_empty_ic.xml @@ -0,0 +1,709 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/status_error_ic.xml b/Android_Mireo/app/src/main/res/drawable/status_error_ic.xml new file mode 100644 index 0000000..952e92f --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/status_error_ic.xml @@ -0,0 +1,799 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/status_network_ic.xml b/Android_Mireo/app/src/main/res/drawable/status_network_ic.xml new file mode 100644 index 0000000..17a339b --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/status_network_ic.xml @@ -0,0 +1,723 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/status_order_ic.xml b/Android_Mireo/app/src/main/res/drawable/status_order_ic.xml new file mode 100644 index 0000000..def8674 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/status_order_ic.xml @@ -0,0 +1,904 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/succeed_ic.xml b/Android_Mireo/app/src/main/res/drawable/succeed_ic.xml new file mode 100644 index 0000000..9c0ed11 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/succeed_ic.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/tips_error_ic.xml b/Android_Mireo/app/src/main/res/drawable/tips_error_ic.xml new file mode 100644 index 0000000..85ea1c7 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/tips_error_ic.xml @@ -0,0 +1,36 @@ + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/tips_finish_ic.xml b/Android_Mireo/app/src/main/res/drawable/tips_finish_ic.xml new file mode 100644 index 0000000..39c7c6d --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/tips_finish_ic.xml @@ -0,0 +1,30 @@ + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/tips_warning_ic.xml b/Android_Mireo/app/src/main/res/drawable/tips_warning_ic.xml new file mode 100644 index 0000000..be868ec --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/tips_warning_ic.xml @@ -0,0 +1,32 @@ + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/transparent_selector.xml b/Android_Mireo/app/src/main/res/drawable/transparent_selector.xml new file mode 100644 index 0000000..e10d84f --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/transparent_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/video_brightness_high_ic.xml b/Android_Mireo/app/src/main/res/drawable/video_brightness_high_ic.xml new file mode 100644 index 0000000..7a695f1 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/video_brightness_high_ic.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/video_brightness_low_ic.xml b/Android_Mireo/app/src/main/res/drawable/video_brightness_low_ic.xml new file mode 100644 index 0000000..aed3511 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/video_brightness_low_ic.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/video_brightness_medium_ic.xml b/Android_Mireo/app/src/main/res/drawable/video_brightness_medium_ic.xml new file mode 100644 index 0000000..d751f86 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/video_brightness_medium_ic.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/video_lock_close_ic.xml b/Android_Mireo/app/src/main/res/drawable/video_lock_close_ic.xml new file mode 100644 index 0000000..c225f08 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/video_lock_close_ic.xml @@ -0,0 +1,11 @@ + + + + diff --git a/Android_Mireo/app/src/main/res/drawable/video_lock_open_ic.xml b/Android_Mireo/app/src/main/res/drawable/video_lock_open_ic.xml new file mode 100644 index 0000000..b5a5f28 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/video_lock_open_ic.xml @@ -0,0 +1,11 @@ + + + + diff --git a/Android_Mireo/app/src/main/res/drawable/video_progress_ball_bg.xml b/Android_Mireo/app/src/main/res/drawable/video_progress_ball_bg.xml new file mode 100644 index 0000000..7dc9c36 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/video_progress_ball_bg.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/video_progress_bg.xml b/Android_Mireo/app/src/main/res/drawable/video_progress_bg.xml new file mode 100644 index 0000000..326bfaa --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/video_progress_bg.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/video_schedule_forward_ic.xml b/Android_Mireo/app/src/main/res/drawable/video_schedule_forward_ic.xml new file mode 100644 index 0000000..4477558 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/video_schedule_forward_ic.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/video_schedule_rewind_ic.xml b/Android_Mireo/app/src/main/res/drawable/video_schedule_rewind_ic.xml new file mode 100644 index 0000000..828f064 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/video_schedule_rewind_ic.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/video_volume_high_ic.xml b/Android_Mireo/app/src/main/res/drawable/video_volume_high_ic.xml new file mode 100644 index 0000000..29bcc6f --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/video_volume_high_ic.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/video_volume_low_ic.xml b/Android_Mireo/app/src/main/res/drawable/video_volume_low_ic.xml new file mode 100644 index 0000000..0ebdbec --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/video_volume_low_ic.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/video_volume_medium_ic.xml b/Android_Mireo/app/src/main/res/drawable/video_volume_medium_ic.xml new file mode 100644 index 0000000..b913cd4 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/video_volume_medium_ic.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/video_volume_mute_ic.xml b/Android_Mireo/app/src/main/res/drawable/video_volume_mute_ic.xml new file mode 100644 index 0000000..d50b605 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/video_volume_mute_ic.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/videocam_ic.xml b/Android_Mireo/app/src/main/res/drawable/videocam_ic.xml new file mode 100644 index 0000000..faf3992 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/videocam_ic.xml @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/drawable/white_selector.xml b/Android_Mireo/app/src/main/res/drawable/white_selector.xml new file mode 100644 index 0000000..c378a12 --- /dev/null +++ b/Android_Mireo/app/src/main/res/drawable/white_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/about_activity.xml b/Android_Mireo/app/src/main/res/layout/about_activity.xml new file mode 100644 index 0000000..2c6b06e --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/about_activity.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/activity_video_play_dh.xml b/Android_Mireo/app/src/main/res/layout/activity_video_play_dh.xml new file mode 100644 index 0000000..aabee81 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/activity_video_play_dh.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + \ 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 new file mode 100644 index 0000000..7c64611 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/browser_activity.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/browser_fragment.xml b/Android_Mireo/app/src/main/res/layout/browser_fragment.xml new file mode 100644 index 0000000..e1aff96 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/browser_fragment.xml @@ -0,0 +1,27 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/custom_bubble_attach_popup.xml b/Android_Mireo/app/src/main/res/layout/custom_bubble_attach_popup.xml new file mode 100644 index 0000000..4c73bdb --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/custom_bubble_attach_popup.xml @@ -0,0 +1,33 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/custom_progress_dialog_view_dh.xml b/Android_Mireo/app/src/main/res/layout/custom_progress_dialog_view_dh.xml new file mode 100644 index 0000000..40d4519 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/custom_progress_dialog_view_dh.xml @@ -0,0 +1,29 @@ + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/example_detail_player_view.xml b/Android_Mireo/app/src/main/res/layout/example_detail_player_view.xml new file mode 100644 index 0000000..b732530 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/example_detail_player_view.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/example_detail_player_view_controller.xml b/Android_Mireo/app/src/main/res/layout/example_detail_player_view_controller.xml new file mode 100644 index 0000000..eae0ba5 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/example_detail_player_view_controller.xml @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/example_dialog_series.xml b/Android_Mireo/app/src/main/res/layout/example_dialog_series.xml new file mode 100644 index 0000000..f30f87d --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/example_dialog_series.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/example_dialog_un_collection.xml b/Android_Mireo/app/src/main/res/layout/example_dialog_un_collection.xml new file mode 100644 index 0000000..fb7628f --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/example_dialog_un_collection.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + \ 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 new file mode 100644 index 0000000..a045fe6 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/example_emptyview.xml @@ -0,0 +1,31 @@ + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/example_item_detail.xml b/Android_Mireo/app/src/main/res/layout/example_item_detail.xml new file mode 100644 index 0000000..6fcddcd --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/example_item_detail.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file 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 new file mode 100644 index 0000000..ee70b7f --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/example_item_num_data.xml @@ -0,0 +1,43 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/example_item_recommend.xml b/Android_Mireo/app/src/main/res/layout/example_item_recommend.xml new file mode 100644 index 0000000..3deb45f --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/example_item_recommend.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/example_item_series_top.xml b/Android_Mireo/app/src/main/res/layout/example_item_series_top.xml new file mode 100644 index 0000000..b94d19f --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/example_item_series_top.xml @@ -0,0 +1,19 @@ + + + + + \ 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 new file mode 100644 index 0000000..e0a7e78 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/example_network_error.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/example_recommend_player_view.xml b/Android_Mireo/app/src/main/res/layout/example_recommend_player_view.xml new file mode 100644 index 0000000..320a9b7 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/example_recommend_player_view.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/example_recommend_player_view_controller.xml b/Android_Mireo/app/src/main/res/layout/example_recommend_player_view_controller.xml new file mode 100644 index 0000000..7ab6ce8 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/example_recommend_player_view_controller.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/example_refresh_head.xml b/Android_Mireo/app/src/main/res/layout/example_refresh_head.xml new file mode 100644 index 0000000..e1e8462 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/example_refresh_head.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/find_fragment.xml b/Android_Mireo/app/src/main/res/layout/find_fragment.xml new file mode 100644 index 0000000..225ed24 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/find_fragment.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/fragment_categories_tab.xml b/Android_Mireo/app/src/main/res/layout/fragment_categories_tab.xml new file mode 100644 index 0000000..f9391e3 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/fragment_categories_tab.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/fragment_list_tab.xml b/Android_Mireo/app/src/main/res/layout/fragment_list_tab.xml new file mode 100644 index 0000000..c757f15 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/fragment_list_tab.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + \ 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 new file mode 100644 index 0000000..3086f2b --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/home_activity.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/home_banner_item.xml b/Android_Mireo/app/src/main/res/layout/home_banner_item.xml new file mode 100644 index 0000000..491b0eb --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/home_banner_item.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + \ 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 new file mode 100644 index 0000000..3971258 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/home_fragment.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 new file mode 100644 index 0000000..52fd215 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/home_navigation_item.xml @@ -0,0 +1,29 @@ + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/image_preview_item.xml b/Android_Mireo/app/src/main/res/layout/image_preview_item.xml new file mode 100644 index 0000000..c617d3e --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/image_preview_item.xml @@ -0,0 +1,7 @@ + + \ 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 new file mode 100644 index 0000000..fd9dd74 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/input_dialog.xml @@ -0,0 +1,16 @@ + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/item_home_critically.xml b/Android_Mireo/app/src/main/res/layout/item_home_critically.xml new file mode 100644 index 0000000..de6dfe0 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/item_home_critically.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/item_home_genres.xml b/Android_Mireo/app/src/main/res/layout/item_home_genres.xml new file mode 100644 index 0000000..d7a8bd3 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/item_home_genres.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/item_home_short.xml b/Android_Mireo/app/src/main/res/layout/item_home_short.xml new file mode 100644 index 0000000..28008e1 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/item_home_short.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + \ 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 new file mode 100644 index 0000000..62c4532 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/item_home_top.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + \ 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 new file mode 100644 index 0000000..674f3a6 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/item_list_tab.xml @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/item_me_history.xml b/Android_Mireo/app/src/main/res/layout/item_me_history.xml new file mode 100644 index 0000000..100ac27 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/item_me_history.xml @@ -0,0 +1,26 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/item_search_hot.xml b/Android_Mireo/app/src/main/res/layout/item_search_hot.xml new file mode 100644 index 0000000..38f92b6 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/item_search_hot.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/item_search_search.xml b/Android_Mireo/app/src/main/res/layout/item_search_search.xml new file mode 100644 index 0000000..6c78509 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/item_search_search.xml @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/layout_controller_player_dh.xml b/Android_Mireo/app/src/main/res/layout/layout_controller_player_dh.xml new file mode 100644 index 0000000..8291f06 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/layout_controller_player_dh.xml @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/layout_home_top_item.xml b/Android_Mireo/app/src/main/res/layout/layout_home_top_item.xml new file mode 100644 index 0000000..7189a32 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/layout_home_top_item.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/layout_item_video_dh.xml b/Android_Mireo/app/src/main/res/layout/layout_item_video_dh.xml new file mode 100644 index 0000000..b7aefbb --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/layout_item_video_dh.xml @@ -0,0 +1,19 @@ + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/layout_progress_dh.xml b/Android_Mireo/app/src/main/res/layout/layout_progress_dh.xml new file mode 100644 index 0000000..d8f5a10 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/layout_progress_dh.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/line_layout.xml b/Android_Mireo/app/src/main/res/layout/line_layout.xml new file mode 100644 index 0000000..d8f5a10 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/line_layout.xml @@ -0,0 +1,12 @@ + + + + + \ 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 new file mode 100644 index 0000000..ea03cf5 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/message_dialog.xml @@ -0,0 +1,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 new file mode 100644 index 0000000..aede3b9 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/message_fragment.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/mine_fragment.xml b/Android_Mireo/app/src/main/res/layout/mine_fragment.xml new file mode 100644 index 0000000..aae68b8 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/mine_fragment.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 new file mode 100644 index 0000000..93ebdd2 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/setting_activity.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/splash_activity.xml b/Android_Mireo/app/src/main/res/layout/splash_activity.xml new file mode 100644 index 0000000..83dd830 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/splash_activity.xml @@ -0,0 +1,10 @@ + + + + + \ 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 new file mode 100644 index 0000000..aa450b6 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/status_activity.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file 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 new file mode 100644 index 0000000..4c53a74 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/tab_item_design.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/tab_item_sliding.xml b/Android_Mireo/app/src/main/res/layout/tab_item_sliding.xml new file mode 100644 index 0000000..722144a --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/tab_item_sliding.xml @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/tips_dialog.xml b/Android_Mireo/app/src/main/res/layout/tips_dialog.xml new file mode 100644 index 0000000..f652dde --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/tips_dialog.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/ui_dialog.xml b/Android_Mireo/app/src/main/res/layout/ui_dialog.xml new file mode 100644 index 0000000..53ef48f --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/ui_dialog.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/layout/video_play_activity.xml b/Android_Mireo/app/src/main/res/layout/video_play_activity.xml new file mode 100644 index 0000000..3ae07eb --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/video_play_activity.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + \ 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 new file mode 100644 index 0000000..cbae7aa --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/wait_dialog.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + \ 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 new file mode 100644 index 0000000..2e7e0f0 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/widget_player_view.xml @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 new file mode 100644 index 0000000..a6b9d49 --- /dev/null +++ b/Android_Mireo/app/src/main/res/layout/widget_status_layout.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/mipmap-xhdpi/launcher_ic.png b/Android_Mireo/app/src/main/res/mipmap-xhdpi/launcher_ic.png new file mode 100644 index 0000000..b48d43f Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xhdpi/launcher_ic.png differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/bg_splash.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/bg_splash.webp new file mode 100644 index 0000000..7a5472a Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/bg_splash.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/checkbox_checked_ic.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/checkbox_checked_ic.webp new file mode 100644 index 0000000..b7f5acf Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/checkbox_checked_ic.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/close_insufficient_bottom.png b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/close_insufficient_bottom.png new file mode 100644 index 0000000..c476490 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/close_insufficient_bottom.png differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/compound_normal_ic_1.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/compound_normal_ic_1.webp new file mode 100644 index 0000000..6ce46b7 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/compound_normal_ic_1.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/compound_normal_ic_2.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/compound_normal_ic_2.webp new file mode 100644 index 0000000..cb4f7c2 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/compound_normal_ic_2.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/decoration_modify_background.png b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/decoration_modify_background.png new file mode 100644 index 0000000..c6a0a8e Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/decoration_modify_background.png differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/episodes_post.png b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/episodes_post.png new file mode 100644 index 0000000..3d957ec Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/episodes_post.png differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_explore_off_ic.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_explore_off_ic.webp new file mode 100644 index 0000000..02bc386 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_explore_off_ic.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_explore_on_ic.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_explore_on_ic.webp new file mode 100644 index 0000000..ad7a801 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_explore_on_ic.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_home_off_ic.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_home_off_ic.webp new file mode 100644 index 0000000..d7ce011 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_home_off_ic.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_home_on_ic.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_home_on_ic.webp new file mode 100644 index 0000000..0737d0f Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_home_on_ic.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_me_off_ic.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_me_off_ic.webp new file mode 100644 index 0000000..b69061d Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_me_off_ic.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_me_on_ic.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_me_on_ic.webp new file mode 100644 index 0000000..0f0d9a7 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_me_on_ic.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_my_list_off_ic.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_my_list_off_ic.webp new file mode 100644 index 0000000..0d8d9d3 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_my_list_off_ic.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_my_list_on_ic.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_my_list_on_ic.webp new file mode 100644 index 0000000..3869990 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_my_list_on_ic.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_rewards_off_ic.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_rewards_off_ic.webp new file mode 100644 index 0000000..1cc996d Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_rewards_off_ic.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_rewards_on_ic.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_rewards_on_ic.webp new file mode 100644 index 0000000..64c81a8 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/home_rewards_on_ic.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_app_logo.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_app_logo.webp new file mode 100644 index 0000000..3378403 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_app_logo.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_home_add.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_home_add.webp new file mode 100644 index 0000000..689bb8e Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_home_add.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_home_notices.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_home_notices.webp new file mode 100644 index 0000000..62b3b26 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_home_notices.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_home_paly.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_home_paly.webp new file mode 100644 index 0000000..c3430ce Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_home_paly.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_home_search.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_home_search.webp new file mode 100644 index 0000000..b2ed9ee Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_home_search.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_home_top.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_home_top.webp new file mode 100644 index 0000000..1033ca8 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_home_top.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_detele_n.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_detele_n.webp new file mode 100644 index 0000000..92f8962 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_detele_n.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_detele_y.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_detele_y.webp new file mode 100644 index 0000000..4de8d8e Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_detele_y.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_menu_bg.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_menu_bg.webp new file mode 100644 index 0000000..702531f Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_menu_bg.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_menu_edit.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_menu_edit.webp new file mode 100644 index 0000000..1b955ac Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_menu_edit.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_menu_grid_mode.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_menu_grid_mode.webp new file mode 100644 index 0000000..bf5d92e Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_menu_grid_mode.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_more.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_more.webp new file mode 100644 index 0000000..57ca777 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_more.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_start.png b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_start.png new file mode 100644 index 0000000..38c49ea Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_list_start.png differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_play_serise_play.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_play_serise_play.webp new file mode 100644 index 0000000..d205185 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_play_serise_play.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_search_search.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_search_search.webp new file mode 100644 index 0000000..2550d93 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_search_search.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_unlocking.png b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_unlocking.png new file mode 100644 index 0000000..1c3b6bd Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_unlocking.png differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_video_ads.png b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_video_ads.png new file mode 100644 index 0000000..9d928aa Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/ic_video_ads.png differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/icon_home_good.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/icon_home_good.webp new file mode 100644 index 0000000..7eeebd1 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/icon_home_good.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/icon_list_share.png b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/icon_list_share.png new file mode 100644 index 0000000..d1c5043 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/icon_list_share.png differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_des_down.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_des_down.webp new file mode 100644 index 0000000..3553690 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_des_down.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_des_top.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_des_top.webp new file mode 100644 index 0000000..af8fe86 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_des_top.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_back.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_back.webp new file mode 100644 index 0000000..e1ad181 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_back.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_close.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_close.webp new file mode 100644 index 0000000..61c5853 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_close.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_collection_h.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_collection_h.webp new file mode 100644 index 0000000..56817ae Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_collection_h.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_collection_n.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_collection_n.webp new file mode 100644 index 0000000..0f3a6cb Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_collection_n.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_drama_series.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_drama_series.webp new file mode 100644 index 0000000..7f065d4 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_drama_series.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_lock.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_lock.webp new file mode 100644 index 0000000..270a37f Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_lock.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_play.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_play.webp new file mode 100644 index 0000000..58a3213 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_play.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_search_empty.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_search_empty.webp new file mode 100644 index 0000000..b562a08 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_search_empty.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_stop.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_stop.webp new file mode 100644 index 0000000..fef4e0b Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_example_stop.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_left_episode_player.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_left_episode_player.webp new file mode 100644 index 0000000..6f7d79e Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_left_episode_player.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_login_icon.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_login_icon.webp new file mode 100644 index 0000000..ef3d92d Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_login_icon.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_agreement.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_agreement.webp new file mode 100644 index 0000000..a2f93ab Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_agreement.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_help.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_help.webp new file mode 100644 index 0000000..7a076e9 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_help.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_privacy.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_privacy.webp new file mode 100644 index 0000000..05e38b8 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_privacy.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_right.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_right.webp new file mode 100644 index 0000000..9016440 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_right.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_setting.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_setting.webp new file mode 100644 index 0000000..c6ac681 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_me_setting.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_play_quality.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_play_quality.webp new file mode 100644 index 0000000..7bc4509 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_play_quality.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_right_episode_player.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_right_episode_player.webp new file mode 100644 index 0000000..cfc9a1d Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_right_episode_player.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_series_top_bg.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_series_top_bg.webp new file mode 100644 index 0000000..0cafb57 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_series_top_bg.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_series_top_right.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_series_top_right.webp new file mode 100644 index 0000000..33496c6 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_series_top_right.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_vip_tag.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_vip_tag.webp new file mode 100644 index 0000000..b60cce6 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_vip_tag.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_vip_tag_n.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_vip_tag_n.webp new file mode 100644 index 0000000..af3c9b5 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/iv_vip_tag_n.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/launcher_ic.png b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/launcher_ic.png new file mode 100644 index 0000000..4a47cf3 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/launcher_ic.png differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/main_order.png b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/main_order.png new file mode 100644 index 0000000..013e60e Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/main_order.png differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/page_unlock_main.png b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/page_unlock_main.png new file mode 100644 index 0000000..a87bc5f Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/page_unlock_main.png differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/play_security_pager.png b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/play_security_pager.png new file mode 100644 index 0000000..3491324 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/play_security_pager.png differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxhdpi/status_nothing.webp b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/status_nothing.webp new file mode 100644 index 0000000..b99cd91 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxhdpi/status_nothing.webp differ diff --git a/Android_Mireo/app/src/main/res/mipmap-xxxhdpi/launcher_ic.png b/Android_Mireo/app/src/main/res/mipmap-xxxhdpi/launcher_ic.png new file mode 100644 index 0000000..2162ca1 Binary files /dev/null and b/Android_Mireo/app/src/main/res/mipmap-xxxhdpi/launcher_ic.png differ diff --git a/Android_Mireo/app/src/main/res/raw/loading.json b/Android_Mireo/app/src/main/res/raw/loading.json new file mode 100644 index 0000000..925ed2f --- /dev/null +++ b/Android_Mireo/app/src/main/res/raw/loading.json @@ -0,0 +1 @@ +{"v":"5.5.8","fr":50,"ip":0,"op":147,"w":800,"h":600,"nm":"Paperplane","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"planete Outlines - Group 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":38,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":88,"s":[50]},{"t":120,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[468.336,323.378,0],"to":[-29,0,0],"ti":[29,0,0]},{"t":102,"s":[294.336,323.378,0]}],"ix":2},"a":{"a":0,"k":[453.672,304.756,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.742,0],[0.741,-0.14],[0,0.074],[13.484,0],[1.669,-0.361],[19.79,0],[3.317,-19.082],[2.691,0],[0,-13.484],[-0.048,-0.629],[2.405,0],[0,-6.742],[-6.742,0],[0,0],[0,6.743]],"o":[[-0.781,0],[0.001,-0.074],[0,-13.484],[-1.778,0],[-3.594,-18.742],[-20.03,0],[-2.421,-0.804],[-13.485,0],[0,0.642],[-1.89,-1.199],[-6.742,0],[0,6.743],[0,0],[6.742,0],[0,-6.742]],"v":[[75.134,16.175],[72.85,16.396],[72.856,16.175],[48.44,-8.241],[43.262,-7.685],[3.406,-40.591],[-36.571,-6.995],[-44.269,-8.241],[-68.685,16.175],[-68.604,18.079],[-75.133,16.175],[-87.341,28.383],[-75.133,40.592],[75.134,40.592],[87.342,28.383]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.815686334348,0.823529471603,0.827451040231,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[453.672,304.756],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":151,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Merged Shape Layer","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.547],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.845],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":77,"s":[35]},{"t":150,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[390.319,298.2,0],"to":[0,-2.583,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":44,"s":[390.319,282.7,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":110,"s":[390.319,319.25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":150,"s":[390.319,298.2,0]}],"ix":2},"a":{"a":0,"k":[664.319,256.2,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[18.967,-3.189],[-18.967,19.935],[-0.949,-19.935]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.223528981209,0.192156970501,0.674510002136,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[236.879,292.737],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[633.939,275.369],"ix":2},"a":{"a":0,"k":[236.879,292.737],"ix":1},"s":{"a":0,"k":[50,50],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"planete Outlines - Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-98.335,64.79],[-105.619,4.984],[105.619,-64.79],[-80.316,24.919]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.278430998325,0.294117987156,0.847059011459,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[316.247,247.882],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[673.623,252.941],"ix":2},"a":{"a":0,"k":[316.247,247.882],"ix":1},"s":{"a":0,"k":[50,50],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"planete Outlines - Group 2","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-133.812,-42.171],[133.812,-75.141],[5.765,75.141],[-61.708,18.402],[124.227,-71.307],[-87.011,-1.534]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.365000009537,0.407999992371,0.976000010967,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[297.638,254.4],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[664.319,256.2],"ix":2},"a":{"a":0,"k":[297.638,254.4],"ix":1},"s":{"a":0,"k":[50,50],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"planete Outlines - Group 3","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":151,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"planete Outlines - Group 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":102,"s":[100]},{"t":150,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[327.38,267.583,0],"to":[25.833,0,0],"ti":[-25.833,0,0]},{"t":150,"s":[482.38,267.583,0]}],"ix":2},"a":{"a":0,"k":[171.76,193.166,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.485,0],[4.38,-4.171],[21.913,0],[3.575,-18.765],[1.851,0],[0,-13.484],[-0.011,-0.291],[1.599,0],[0,-6.743],[-6.742,0],[0,0],[0,13.485]],"o":[[-6.526,0],[-0.793,-21.719],[-19.806,0],[-1.734,-0.391],[-13.485,0],[0,0.293],[-1.4,-0.559],[-6.742,0],[0,6.742],[0,0],[13.485,0],[0,-13.484]],"v":[[59.669,-8.242],[42.84,-1.506],[2.287,-40.592],[-37.576,-7.638],[-42.962,-8.242],[-67.378,16.174],[-67.356,17.049],[-71.878,16.174],[-84.086,28.383],[-71.878,40.591],[59.669,40.591],[84.086,16.174]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.816000007181,0.823999980852,0.827000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[171.76,193.166],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":151,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Pre-comp 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[406,306,0],"ix":2},"a":{"a":0,"k":[400,300,0],"ix":1},"s":{"a":0,"k":[179,179,100],"ix":6}},"ao":0,"w":800,"h":600,"ip":0,"op":147,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/raw/progress.json b/Android_Mireo/app/src/main/res/raw/progress.json new file mode 100644 index 0000000..c1ed963 --- /dev/null +++ b/Android_Mireo/app/src/main/res/raw/progress.json @@ -0,0 +1 @@ +{"v":"4.6.9","fr":30,"ip":0,"op":45,"w":200,"h":200,"nm":"Composition 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":0,"ty":4,"nm":"LFCalque de forme 2","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[1],"y":[0]},"n":["0p833_0p833_1_0"],"t":0,"s":[0],"e":[360]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":15,"s":[360],"e":[510]},{"t":34}]},"p":{"a":0,"k":[100,100,0]},"a":{"a":0,"k":[-93.098,-93.098,0]},"s":{"a":0,"k":[80,80,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[55.228,0],[0,-55.228],[-55.228,0],[0,55.228]],"o":[[-55.228,0],[0,55.228],[55.228,0],[0,-55.228]],"v":[[0,-100],[-100,0],[0,100],[100,0]],"c":true}},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":23,"s":[100],"e":[42]},{"t":45}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[98],"e":[98]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":6,"s":[98],"e":[60]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13,"s":[60],"e":[40]},{"t":23}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Raccorder les tracés 1","mn":"ADBE Vector Filter - Trim"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"nm":"Contour 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[-93.098,-93.098],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":45,"st":0,"bm":0,"sr":1}],"chars":[],"markers":[]} \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/raw/province.json b/Android_Mireo/app/src/main/res/raw/province.json new file mode 100644 index 0000000..7c0a55b --- /dev/null +++ b/Android_Mireo/app/src/main/res/raw/province.json @@ -0,0 +1,5537 @@ +[ + { + "name": "北京市", + "city": [ + { + "name": "北京市", + "area": [ + "东城区", + "西城区", + "海淀区", + "朝阳区", + "丰台区", + "石景山区", + "门头沟区", + "通州区", + "顺义区", + "房山区", + "大兴区", + "昌平区", + "怀柔区", + "平谷区", + "密云区", + "延庆区" + ] + } + ] + }, + { + "name": "上海市", + "city": [ + { + "name": "上海市", + "area": [ + "黄浦区", + "浦东区", + "徐汇区", + "长宁区", + "静安区", + "普陀区", + "虹口区", + "杨浦区", + "闵行区", + "宝山区", + "嘉定区", + "金山区", + "松江区", + "青浦区", + "奉贤区", + "崇明区" + ] + } + ] + }, + { + "name": "天津市", + "city": [ + { + "name": "天津市", + "area": [ + "和平区", + "河西区", + "南开区", + "河东区", + "河北区", + "红桥区", + "滨海区", + "东丽区", + "西青区", + "津南区", + "北辰区", + "武清区", + "宝坻区", + "宁河区", + "静海区", + "蓟州区" + ] + } + ] + }, + { + "name": "重庆市", + "city": [ + { + "name": "重庆市", + "area": [ + "渝中区", + "大渡口区", + "江北区", + "沙坪坝区", + "九龙坡区", + "南岸区", + "北碚区", + "渝北区", + "巴南区", + "涪陵区", + "綦江区", + "大足区", + "长寿区", + "江津区", + "合川区", + "永川区", + "南川区", + "璧山区", + "铜梁区", + "潼南区", + "荣昌区", + "万州区", + "梁平区", + "城口县", + "丰都县", + "垫江县", + "忠县", + "开州区", + "云阳县", + "奉节县", + "巫山县", + "巫溪县", + "黔江区", + "武隆区", + "石柱土家族自治县", + "秀山土家族苗族自治县", + "酉阳土家族苗族自治县", + "彭水苗族土家族自治县" + ] + } + ] + }, + { + "name": "广东省", + "city": [ + { + "name": "广州市", + "area": [ + "越秀区", + "荔湾区", + "海珠区", + "天河区", + "白云区", + "黄埔区", + "番禺区", + "花都区", + "南沙区", + "增城区", + "从化区" + ] + }, + { + "name": "深圳市", + "area": [ + "福田区", + "罗湖区", + "南山区", + "盐田区", + "宝安区", + "龙岗区", + "坪山区", + "光明区", + "龙华区", + "大鹏区" + ] + }, + { + "name": "东莞市", + "area": [ + "莞城区", + "南城区", + "东城区", + "万江区", + "石碣镇", + "石龙镇", + "茶山镇", + "石排镇", + "企石镇", + "横沥镇", + "桥头镇", + "谢岗镇", + "东坑镇", + "常平镇", + "寮步镇", + "大朗镇", + "麻涌镇", + "中堂镇", + "高埗镇", + "樟木头镇", + "大岭山镇", + "望牛墩镇", + "黄江镇", + "洪梅镇", + "清溪镇", + "沙田镇", + "道滘镇", + "塘厦镇", + "虎门镇", + "厚街镇", + "凤岗镇", + "长安镇" + ] + }, + { + "name": "惠州市", + "area": [ + "惠城区", + "惠阳区", + "惠东县", + "博罗县", + "龙门县" + ] + }, + { + "name": "珠海市", + "area": [ + "香洲区", + "金湾区", + "斗门区" + ] + }, + { + "name": "佛山市", + "area": [ + "禅城区", + "南海区", + "顺德区", + "三水区", + "高明区" + ] + }, + { + "name": "中山市", + "area": [ + "石岐区", + "东区", + "西区", + "南区", + "五桂山区", + "火炬开发区", + "黄圃镇", + "南头镇", + "东凤镇", + "阜沙镇", + "小榄镇", + "东升镇", + "古镇镇", + "横栏镇", + "三角镇", + "民众镇", + "南朗镇", + "港口镇", + "大涌镇", + "沙溪镇", + "三乡镇", + "板芙镇", + "神湾镇", + "坦洲镇" + ] + }, + { + "name": "潮州市", + "area": [ + "湘桥区", + "潮安区", + "饶平县" + ] + }, + { + "name": "揭阳市", + "area": [ + "榕城区", + "揭东县", + "揭西县", + "惠来县", + "普宁市" + ] + }, + { + "name": "汕头市", + "area": [ + "金平区", + "龙湖区", + "澄海区", + "濠江区", + "濠江区", + "潮南区", + "南澳县" + ] + }, + { + "name": "汕尾市", + "area": [ + "城区", + "陆丰市", + "海丰县", + "陆河县" + ] + }, + { + "name": "清远市", + "area": [ + "清城区", + "清新区", + "英德市", + "连州市", + "佛冈县", + "阳山县", + "连南瑶族自治县", + "连山壮族瑶族自治县" + ] + }, + { + "name": "云浮市", + "area": [ + "云城区", + "云安县", + "新兴县", + "郁南县", + "罗定市" + ] + }, + { + "name": "韶关市", + "area": [ + "浈江区", + "武江区", + "曲江区", + "乐昌市", + "南雄市", + "始兴县", + "仁化县", + "翁源县", + "新丰县", + "乳源瑶族自治县" + ] + }, + { + "name": "江门市", + "area": [ + "蓬江区", + "江海区", + "新会区", + "台山市", + "开平市", + "鹤山市", + "恩平市" + ] + }, + { + "name": "湛江市", + "area": [ + "赤坎区", + "霞山区", + "坡头区", + "麻章区", + "吴川市", + "雷州市", + "廉江市", + "遂溪县", + "徐闻县" + ] + }, + { + "name": "茂名市", + "area": [ + "茂南区", + "电白区", + "高州市", + "茂港区", + "化州市", + "信宜市" + ] + }, + { + "name": "肇庆市", + "area": [ + "端州区", + "鼎湖区", + "广宁县", + "怀集县", + "封开县", + "德庆县", + "高要区", + "四会市" + ] + }, + { + "name": "河源市", + "area": [ + "源城区", + "紫金县", + "龙川县", + "连平县", + "和平县", + "东源县" + ] + }, + { + "name": "梅州市", + "area": [ + "梅江区", + "梅县区", + "兴宁市", + "平远县", + "蕉岭县", + "大埔县", + "丰顺县", + "五华县" + ] + }, + { + "name": "阳江市", + "area": [ + "江城区", + "阳春市", + "阳东区", + "阳西县", + "海陵岛经济开发试验区", + "阳江高新技术产业开发区" + ] + } + ] + }, + { + "name": "江苏省", + "city": [ + { + "name": "南京市", + "area": [ + "玄武区", + "秦淮区", + "鼓楼区", + "建邺区", + "雨花台区", + "浦口区", + "六合区", + "栖霞区", + "江宁区", + "溧水区", + "高淳县" + ] + }, + { + "name": "无锡市", + "area": [ + "梁溪区", + "滨湖区", + "惠山区", + "锡山区", + "新吴区", + "江阴市", + "宜兴市" + ] + }, + { + "name": "苏州市", + "area": [ + "姑苏区", + "相城区", + "吴中区", + "虎丘区", + "吴江区", + "常熟市", + "昆山市", + "张家港市", + "太仓市" + ] + }, + { + "name": "常州市", + "area": [ + "金坛区", + "武进区", + "新北区", + "天宁区", + "钟楼区", + "溧阳市" + ] + }, + { + "name": "镇江市", + "area": [ + "京口区", + "润州区", + "丹徒区", + "镇江区", + "镇江高新区" + ] + }, + { + "name": "南通市", + "area": [ + "崇川区", + "港闸区", + "通州区", + "海安县", + "如东县", + "启东市", + "如皋市", + "海门市" + ] + }, + { + "name": "泰州市", + "area": [ + "海陵区", + "高港区", + "姜堰市", + "兴化市", + "泰兴市", + "靖江市" + ] + }, + { + "name": "扬州市", + "area": [ + "广陵区", + "邗江区", + "江都区", + "开发区", + "宝应县", + "仪征市", + "高邮市" + ] + }, + { + "name": "盐城市", + "area": [ + "亭湖区", + "盐都区", + "大丰区", + "建湖县", + "射阳县", + "阜宁县", + "滨海县", + "响水县", + "东台市" + ] + }, + { + "name": "连云港市", + "area": [ + "海州区", + "连云区", + "赣榆区", + "灌云县", + "东海县", + "灌南县" + ] + }, + { + "name": "徐州市", + "area": [ + "云龙区", + "鼓楼区", + "贾汪区", + "泉山区", + "铜山区", + "邳州市", + "新沂市", + "睢宁县", + "沛县", + "丰县" + ] + }, + { + "name": "淮安市", + "area": [ + "清江浦区", + "淮阴区", + "淮安区", + "洪泽区", + "涟水县", + "盱眙县", + "金湖县" + ] + }, + { + "name": "宿迁市", + "area": [ + "宿城区", + "宿豫区", + "沭阳县", + "泗阳县", + "泗洪县", + "洋河区", + "湖滨区", + "苏宿工业园区", + "经济开发区" + ] + } + ] + }, + { + "name": "山东省", + "city": [ + { + "name": "济南市", + "area": [ + "历下区", + "市中区", + "槐荫区", + "天桥区", + "历城区", + "长清区", + "章丘区", + "济阳区", + "莱芜区", + "钢城区", + "平阴县", + "商河县", + "高新技术产业开发区" + ] + }, + { + "name": "青岛市", + "area": [ + "市南区", + "市北区", + "黄岛区", + "崂山区", + "李沧区", + "城阳区", + "胶州市", + "即墨区", + "平度市", + "莱西市" + ] + }, + { + "name": "淄博市", + "area": [ + "张店区", + "淄川区", + "博山区", + "临淄区", + "桓台县", + "高青县", + "沂源县" + ] + }, + { + "name": "枣庄市", + "area": [ + "市中区", + "山亭区", + "台儿庄区", + "峄城区", + "薛城区", + "滕州市" + ] + }, + { + "name": "东营市", + "area": [ + "东营区", + "河口区", + "垦利区", + "利津县", + "广饶县" + ] + }, + { + "name": "烟台市", + "area": [ + "芝罘区", + "福山区", + "牟平区", + "莱山区", + "龙口市", + "莱阳市", + "莱州市", + "蓬莱区", + "招远市", + "栖霞市", + "海阳市", + "烟台经济技术开发区", + "烟台高新技术产业开发区" + ] + }, + { + "name": "潍坊市", + "area": [ + "潍城区", + "寒亭区", + "坊子区", + "奎文区", + "临朐县", + "昌乐县", + "青州市", + "诸城市", + "寿光市", + "安丘市", + "高密市", + "昌邑市" + ] + }, + { + "name": "济宁市", + "area": [ + "任城区", + "兖州区", + "微山县", + "鱼台县", + "金乡县", + "嘉祥县", + "汶上县", + "泗水县", + "梁山县", + "曲阜市", + "邹城市" + ] + }, + { + "name": "泰安市", + "area": [ + "泰山区", + "岱岳区", + "新泰市", + "肥城市", + "宁阳县", + "东平县" + ] + }, + { + "name": "威海市", + "area": [ + "环翠区", + "文登区", + "荣成市", + "乳山市", + "南海区", + "经济技术开发区", + "火炬高技术产业开发区", + "进出口加工保税区", + "临港经济技术开发区" + ] + }, + { + "name": "日照市", + "area": [ + "东港区", + "岚山区", + "五莲县", + "莒县" + ] + }, + { + "name": "莱芜市", + "area": [ + "莱城区", + "钢城区" + ] + }, + { + "name": "临沂市", + "area": [ + "兰山区", + "罗庄区", + "河东区", + "郯城县", + "兰陵县", + "莒南县", + "沂水县", + "蒙阴县", + "平邑县", + "费县", + "沂南县", + "临沭县" + ] + }, + { + "name": "德州市", + "area": [ + "德城区", + "陵城区", + "宁津县", + "庆云县", + "临邑县", + "齐河县", + "平原县", + "夏津县", + "武城县", + "乐陵市", + "禹城市" + ] + }, + { + "name": "聊城市", + "area": [ + "东昌府区", + "茌平区", + "临清市", + "东阿县", + "冠县", + "高唐县", + "阳谷县", + "莘县" + ] + }, + { + "name": "滨州市", + "area": [ + "滨城区", + "沾化区", + "惠民县", + "阳信县", + "无棣县", + "博兴县", + "邹平市" + ] + }, + { + "name": "菏泽市", + "area": [ + "牡丹区", + "定陶县", + "巨野县", + "曹县", + "成武县", + "单县", + "郓城县", + "鄄城县", + "东明县" + ] + } + ] + }, + { + "name": "浙江省", + "city": [ + { + "name": "杭州市", + "area": [ + "上城区", + "下城区", + "江干区", + "拱墅区", + "西湖区", + "滨江区", + "萧山区", + "余杭区", + "富阳区", + "临安区", + "桐庐县", + "淳安县", + "建德市" + ] + }, + { + "name": "宁波市", + "area": [ + "海曙区", + "江北区", + "北仑区", + "镇海区", + "鄞州区", + "奉化市", + "余姚市", + "慈溪市", + "象山县", + "宁海县" + ] + }, + { + "name": "温州市", + "area": [ + "鹿城区", + "龙湾区", + "瓯海区", + "洞头区", + "永嘉县", + "平阳县", + "苍南县", + "文成县", + "泰顺县", + "瑞安市", + "乐清市", + "龙港市" + ] + }, + { + "name": "嘉兴市", + "area": [ + "南湖区", + "秀洲区", + "嘉善县", + "海盐县", + "海宁市", + "平湖市", + "桐乡市" + ] + }, + { + "name": "湖州市", + "area": [ + "吴兴区", + "南浔区", + "德清县", + "长兴县", + "安吉县" + ] + }, + { + "name": "绍兴市", + "area": [ + "越城区", + "柯桥区", + "上虞区", + "新昌县", + "嵊州市", + "诸暨市" + ] + }, + { + "name": "金华市", + "area": [ + "婺城区", + "金东区", + "兰溪市", + "义乌市", + "东阳市", + "永康市", + "浦江县", + "武义县", + "磐安县" + ] + }, + { + "name": "衢州市", + "area": [ + "柯城区", + "衢江区", + "龙游县", + "江山市", + "常山县", + "开化县" + ] + }, + { + "name": "舟山市", + "area": [ + "定海区", + "普陀区", + "岱山县", + "嵊泗县" + ] + }, + { + "name": "台州市", + "area": [ + "椒江区", + "黄岩区", + "路桥区", + "临海市", + "温岭市", + "玉环市", + "天台县", + "仙居县", + "三门县" + ] + }, + { + "name": "丽水市", + "area": [ + "莲都区", + "龙泉市", + "青田县", + "云和县", + "庆元县", + "缙云县", + "遂昌县", + "松阳县", + "景宁畲族自治县" + ] + } + ] + }, + { + "name": "河南省", + "city": [ + { + "name": "郑州市", + "area": [ + "中原区", + "二七区", + "管城回族区", + "金水区", + "上街区", + "惠济区", + "中牟县", + "巩义市", + "荥阳市", + "新密市", + "新郑市", + "登封市" + ] + }, + { + "name": "开封市", + "area": [ + "龙亭区", + "顺河回族区", + "鼓楼区", + "禹王台区", + "祥符区", + "杞县", + "通许县", + "尉氏县", + "兰考县" + ] + }, + { + "name": "洛阳市", + "area": [ + "老城区", + "西工区", + "瀍河回族区", + "涧西区", + "吉利区", + "洛龙区", + "孟津县", + "新安县", + "栾川县", + "嵩县", + "汝阳县", + "宜阳县", + "洛宁县", + "伊川县", + "偃师市" + ] + }, + { + "name": "平顶山市", + "area": [ + "新华区", + "卫东区", + "石龙区", + "湛河区", + "宝丰县", + "叶县", + "鲁山县", + "郏县", + "舞钢市", + "汝州市" + ] + }, + { + "name": "安阳市", + "area": [ + "文峰区", + "北关区", + "殷都区", + "龙安区", + "安阳县", + "汤阴县", + "滑县", + "内黄县", + "林州市" + ] + }, + { + "name": "鹤壁市", + "area": [ + "鹤山区", + "山城区", + "淇滨区", + "浚县", + "淇县" + ] + }, + { + "name": "新乡市", + "area": [ + "红旗区", + "卫滨区", + "凤泉区", + "牧野区", + "新乡县", + "获嘉县", + "原阳县", + "延津县", + "封丘县", + "卫辉市", + "辉县市", + "长垣市" + ] + }, + { + "name": "焦作市", + "area": [ + "解放区", + "中站区", + "马村区", + "山阳区", + "修武县", + "博爱县", + "武陟县", + "温县", + "沁阳市", + "孟州市" + ] + }, + { + "name": "濮阳市", + "area": [ + "华龙区", + "清丰县", + "南乐县", + "范县", + "台前县", + "濮阳县" + ] + }, + { + "name": "许昌市", + "area": [ + "魏都区", + "建安区", + "鄢陵县", + "襄城县", + "禹州市", + "长葛市" + ] + }, + { + "name": "漯河市", + "area": [ + "源汇区", + "郾城区", + "召陵区", + "舞阳县", + "临颍县" + ] + }, + { + "name": "三门峡市", + "area": [ + "湖滨区", + "陕州区", + "渑池县", + "卢氏县", + "义马市", + "灵宝市" + ] + }, + { + "name": "南阳市", + "area": [ + "宛城区", + "卧龙区", + "南召县", + "方城县", + "西峡县", + "镇平县", + "内乡县", + "淅川县", + "社旗县", + "唐河县", + "新野县", + "桐柏县", + "邓州市" + ] + }, + { + "name": "商丘市", + "area": [ + "梁园区", + "睢阳区", + "民权县", + "睢县", + "宁陵县", + "柘城县", + "虞城县", + "夏邑县", + "永城市" + ] + }, + { + "name": "信阳市", + "area": [ + "浉河区", + "平桥区", + "罗山县", + "光山县", + "新县", + "商城县", + "固始县", + "潢川县", + "淮滨县", + "息县" + ] + }, + { + "name": "周口市", + "area": [ + "川汇区", + "扶沟县", + "淮阳区", + "西华县", + "商水县", + "沈丘县", + "郸城县", + "太康县", + "鹿邑县", + "项城市" + ] + }, + { + "name": "驻马店市", + "area": [ + "驿城区", + "西平县", + "上蔡县", + "平舆县", + "正阳县", + "确山县", + "泌阳县", + "汝南县", + "遂平县", + "新蔡县" + ] + }, + { + "name": "济源市", + "area": [ + "济水街道", + "沁园街道", + "北海街道", + "天坛街道", + "玉泉街道", + "克井镇", + "五龙口镇", + "梨林镇", + "轵城镇", + "承留镇", + "坡头镇", + "大峪镇", + "邵原镇", + "思礼镇", + "王屋镇", + "下冶镇" + ] + } + ] + }, + { + "name": "四川省", + "city": [ + { + "name": "成都市", + "area": [ + "锦江区", + "青羊区", + "金牛区", + "武侯区", + "成华区", + "龙泉驿区", + "青白江区", + "新都区", + "温江区", + "双流区", + "郫都区", + "新津区", + "金堂县", + "大邑县", + "蒲江县", + "都江堰市", + "彭州市", + "邛崃市", + "崇州市", + "简阳市", + "天府区" + ] + }, + { + "name": "自贡市", + "area": [ + "自流井区", + "贡井区", + "大安区", + "沿滩区", + "荣县", + "富顺县" + ] + }, + { + "name": "攀枝花市", + "area": [ + "东区", + "西区", + "仁和区", + "米易县", + "盐边县" + ] + }, + { + "name": "泸州市", + "area": [ + "江阳区", + "纳溪区", + "龙马潭区", + "泸县", + "合江县", + "叙永县", + "古蔺县" + ] + }, + { + "name": "德阳市", + "area": [ + "旌阳区", + "罗江区", + "中江县", + "广汉市", + "什邡市", + "绵竹市" + ] + }, + { + "name": "绵阳市", + "area": [ + "涪城区", + "游仙区", + "安州区", + "三台县", + "盐亭县", + "梓潼县", + "北川羌族自治县", + "平武县", + "江油市" + ] + }, + { + "name": "广元市", + "area": [ + "利州区", + "昭化区", + "朝天区", + "旺苍县", + "青川县", + "剑阁县", + "苍溪县" + ] + }, + { + "name": "遂宁市", + "area": [ + "船山区", + "安居区", + "蓬溪县", + "大英县", + "射洪市" + ] + }, + { + "name": "内江市", + "area": [ + "市中区", + "东兴区", + "威远县", + "资中县", + "隆昌市" + ] + }, + { + "name": "乐山市", + "area": [ + "市中区", + "沙湾区", + "五通桥区", + "金口河区", + "犍为县", + "井研县", + "夹江县", + "沐川县", + "峨边彝族自治县", + "马边彝族自治县", + "峨眉山市" + ] + }, + { + "name": "南充市", + "area": [ + "顺庆区", + "高坪区", + "嘉陵区", + "南部县", + "营山县", + "蓬安县", + "仪陇县", + "西充县", + "阆中市" + ] + }, + { + "name": "眉山市", + "area": [ + "东坡区", + "彭山区", + "仁寿县", + "洪雅县", + "丹棱县", + "青神县" + ] + }, + { + "name": "宜宾市", + "area": [ + "翠屏区", + "南溪区", + "叙州区", + "江安县", + "长宁县", + "高县", + "珙县", + "筠连县", + "兴文县", + "屏山县" + ] + }, + { + "name": "广安市", + "area": [ + "广安区", + "前锋区", + "岳池县", + "武胜县", + "邻水县", + "华蓥市" + ] + }, + { + "name": "达州市", + "area": [ + "通川区", + "达川区", + "宣汉县", + "开江县", + "大竹县", + "渠县", + "万源市" + ] + }, + { + "name": "雅安市", + "area": [ + "雨城区", + "名山区", + "荥经县", + "汉源县", + "石棉县", + "天全县", + "芦山县", + "宝兴县" + ] + }, + { + "name": "巴中市", + "area": [ + "巴州区", + "恩阳区", + "通江县", + "南江县", + "平昌县" + ] + }, + { + "name": "资阳市", + "area": [ + "雁江区", + "安岳县", + "乐至县" + ] + }, + { + "name": "阿坝藏族羌族自治州", + "area": [ + "马尔康市", + "汶川县", + "理县", + "茂县", + "松潘县", + "九寨沟县", + "金川县", + "小金县", + "黑水县", + "壤塘县", + "阿坝县", + "若尔盖县", + "红原县" + ] + }, + { + "name": "甘孜藏族自治州", + "area": [ + "康定市", + "泸定县", + "丹巴县", + "九龙县", + "雅江县", + "道孚县", + "炉霍县", + "甘孜县", + "新龙县", + "德格县", + "白玉县", + "石渠县", + "色达县", + "理塘县", + "巴塘县", + "乡城县", + "稻城县", + "得荣县" + ] + }, + { + "name": "凉山彝族自治州", + "area": [ + "西昌市", + "木里藏族自治县", + "盐源县", + "德昌县", + "会理县", + "会东县", + "宁南县", + "普格县", + "布拖县", + "金阳县", + "昭觉县", + "喜德县", + "冕宁县", + "越西县", + "甘洛县", + "美姑县", + "雷波县" + ] + } + ] + }, + { + "name": "湖北省", + "city": [ + { + "name": "武汉市", + "area": [ + "江岸区", + "江汉区", + "硚口区", + "汉阳区", + "武昌区", + "青山区", + "洪山区", + "东西湖区", + "汉南区", + "蔡甸区", + "江夏区", + "黄陂区", + "新洲区" + ] + }, + { + "name": "黄石市", + "area": [ + "黄石港区", + "西塞山区", + "下陆区", + "铁山区", + "阳新县", + "大冶市" + ] + }, + { + "name": "十堰市", + "area": [ + "茅箭区", + "张湾区", + "郧阳区", + "郧西县", + "竹山县", + "竹溪县", + "房县", + "丹江口市" + ] + }, + { + "name": "宜昌市", + "area": [ + "西陵区", + "伍家岗区", + "点军区", + "猇亭区", + "夷陵区", + "远安县", + "兴山县", + "秭归县", + "长阳土家族自治县", + "五峰土家族自治县", + "宜都市", + "当阳市", + "枝江市" + ] + }, + { + "name": "襄阳市", + "area": [ + "襄城区", + "樊城区", + "襄州区", + "南漳县", + "谷城县", + "保康县", + "老河口市", + "枣阳市", + "宜城市" + ] + }, + { + "name": "鄂州市", + "area": [ + "梁子湖区", + "华容区", + "鄂城区" + ] + }, + { + "name": "荆门市", + "area": [ + "东宝区", + "掇刀区", + "沙洋县", + "钟祥市", + "京山市" + ] + }, + { + "name": "孝感市", + "area": [ + "孝南区", + "孝昌县", + "大悟县", + "云梦县", + "应城市", + "安陆市", + "汉川市" + ] + }, + { + "name": "荆州市", + "area": [ + "沙市区", + "荆州区", + "公安县", + "监利县", + "江陵县", + "石首市", + "洪湖市", + "松滋市" + ] + }, + { + "name": "黄冈市", + "area": [ + "黄州区", + "团风县", + "红安县", + "罗田县", + "英山县", + "浠水县", + "蕲春县", + "黄梅县", + "麻城市", + "武穴市" + ] + }, + { + "name": "咸宁市", + "area": [ + "咸安区", + "嘉鱼县", + "通城县", + "崇阳县", + "通山县", + "赤壁市" + ] + }, + { + "name": "随州市", + "area": [ + "曾都区", + "随县", + "广水市" + ] + }, + { + "name": "恩施土家族苗族自治州", + "area": [ + "恩施市", + "利川市", + "建始县", + "巴东县", + "宣恩县", + "咸丰县", + "来凤县", + "鹤峰县" + ] + }, + { + "name": "仙桃市", + "area": [ + "干河街道", + "龙华山街道", + "沙嘴街道", + "郑场镇", + "毛嘴镇", + "剅河镇", + "三伏潭镇", + "胡场镇", + "长埫口镇", + "西流河镇", + "彭场镇", + "沙湖镇", + "杨林尾镇", + "张沟镇", + "郭河镇", + "沔城回族镇", + "通海口镇", + "陈场镇", + "仙桃经济开发区", + "仙桃工业园", + "沙湖原种场", + "九合垸原种场", + "排湖风景区" + ] + }, + { + "name": "潜江市", + "area": [ + "园林办事处", + "广华办事处", + "杨市办事处", + "周矶办事处", + "泰丰办事处", + "高场办事处", + "熊口镇", + "高石碑镇", + "老新镇", + "王场镇", + "渔洋镇", + "龙湾镇", + "浩口镇", + "积玉口镇", + "张金镇", + "白鹭湖管理区", + "总口管理区", + "熊口农场管理区", + "运粮湖管理区", + "后湖管理区", + "周矶管理区", + "竹根滩镇" + ] + }, + { + "name": "天门市", + "area": [ + "竟陵街道", + "候口街道", + "杨林街道", + "多宝镇", + "拖市镇", + "张港镇", + "蒋场镇", + "汪场镇", + "渔薪镇", + "黄潭镇", + "岳口镇", + "横林镇", + "彭市镇", + "麻洋镇", + "多祥镇", + "干驿镇", + "马湾镇", + "卢市镇", + "小板镇", + "九真镇", + "皂市镇", + "胡市镇", + "石家河镇", + "佛子山镇", + "净潭乡" + ] + }, + { + "name": "神农架林区", + "area": [ + "松柏镇", + "阳日镇", + "木鱼镇", + "红坪镇", + "新华镇", + "大九湖镇", + "宋洛乡", + "下谷坪土家族乡" + ] + } + ] + }, + { + "name": "湖南省", + "city": [ + { + "name": "长沙市", + "area": [ + "芙蓉区", + "天心区", + "岳麓区", + "开福区", + "雨花区", + "望城区", + "长沙县", + "浏阳市", + "宁乡市" + ] + }, + { + "name": "株洲市", + "area": [ + "荷塘区", + "芦淞区", + "石峰区", + "天元区", + "渌口区", + "攸县", + "茶陵县", + "炎陵县", + "醴陵市", + "云龙示范区" + ] + }, + { + "name": "湘潭市", + "area": [ + "雨湖区", + "岳塘区", + "湘潭县", + "湘乡市", + "韶山市" + ] + }, + { + "name": "衡阳市", + "area": [ + "珠晖区", + "雁峰区", + "石鼓区", + "蒸湘区", + "南岳区", + "衡阳县", + "衡南县", + "衡山县", + "衡东县", + "祁东县", + "耒阳市", + "常宁市" + ] + }, + { + "name": "邵阳市", + "area": [ + "双清区", + "大祥区", + "北塔区", + "新邵县", + "邵阳县", + "隆回县", + "洞口县", + "绥宁县", + "新宁县", + "城步苗族自治县", + "武冈市", + "邵东市" + ] + }, + { + "name": "岳阳市", + "area": [ + "岳阳楼区", + "云溪区", + "君山区", + "岳阳县", + "华容县", + "湘阴县", + "平江县", + "汨罗市", + "临湘市" + ] + }, + { + "name": "常德市", + "area": [ + "武陵区", + "鼎城区", + "安乡县", + "汉寿县", + "澧县", + "临澧县", + "桃源县", + "石门县", + "津市市" + ] + }, + { + "name": "张家界市", + "area": [ + "永定区", + "武陵源区", + "慈利县", + "桑植县" + ] + }, + { + "name": "益阳市", + "area": [ + "资阳区", + "赫山区", + "南县", + "桃江县", + "安化县", + "沅江市" + ] + }, + { + "name": "郴州市", + "area": [ + "北湖区", + "苏仙区", + "桂阳县", + "宜章县", + "永兴县", + "嘉禾县", + "临武县", + "汝城县", + "桂东县", + "安仁县", + "资兴市" + ] + }, + { + "name": "永州市", + "area": [ + "零陵区", + "冷水滩区", + "祁阳县", + "东安县", + "双牌县", + "道县", + "江永县", + "宁远县", + "蓝山县", + "新田县", + "江华瑶族自治县" + ] + }, + { + "name": "怀化市", + "area": [ + "鹤城区", + "中方县", + "沅陵县", + "辰溪县", + "溆浦县", + "会同县", + "麻阳苗族自治县", + "新晃侗族自治县", + "芷江侗族自治县", + "靖州苗族侗族自治县", + "通道侗族自治县", + "洪江市" + ] + }, + { + "name": "娄底市", + "area": [ + "娄星区", + "双峰县", + "新化县", + "冷水江市", + "涟源市" + ] + }, + { + "name": "湘西土家族苗族自治州", + "area": [ + "吉首市", + "泸溪县", + "凤凰县", + "花垣县", + "保靖县", + "古丈县", + "永顺县", + "龙山县" + ] + } + ] + }, + { + "name": "河北省", + "city": [ + { + "name": "石家庄市", + "area": [ + "长安区", + "桥西区", + "新华区", + "井陉矿区", + "裕华区", + "藁城区", + "鹿泉区", + "栾城区", + "井陉县", + "正定县", + "行唐县", + "灵寿县", + "高邑县", + "深泽县", + "赞皇县", + "无极县", + "平山县", + "元氏县", + "赵县", + "辛集市", + "晋州市", + "新乐市" + ] + }, + { + "name": "唐山市", + "area": [ + "路南区", + "路北区", + "古冶区", + "开平区", + "丰南区", + "丰润区", + "曹妃甸区", + "滦州市", + "滦南县", + "乐亭县", + "迁西县", + "玉田县", + "遵化市", + "迁安市" + ] + }, + { + "name": "秦皇岛市", + "area": [ + "海港区", + "山海关区", + "北戴河区", + "抚宁区", + "青龙满族自治县", + "昌黎县", + "卢龙县" + ] + }, + { + "name": "邯郸市", + "area": [ + "邯山区", + "丛台区", + "复兴区", + "峰峰矿区", + "肥乡区", + "永年区", + "临漳县", + "成安县", + "大名县", + "涉县", + "磁县", + "邱县", + "鸡泽县", + "广平县", + "馆陶县", + "魏县", + "曲周县", + "武安市" + ] + }, + { + "name": "邢台市", + "area": [ + "襄都区", + "信都区", + "任泽区", + "南和区", + "临城县", + "内丘县", + "柏乡县", + "隆尧县", + "宁晋县", + "巨鹿县", + "新河县", + "广宗县", + "平乡县", + "威县", + "清河县", + "临西县", + "南宫市", + "沙河市" + ] + }, + { + "name": "保定市", + "area": [ + "竞秀区", + "莲池区", + "满城区", + "清苑区", + "徐水区", + "涞水县", + "阜平县", + "定兴县", + "唐县", + "高阳县", + "容城县", + "涞源县", + "望都县", + "安新县", + "易县", + "曲阳县", + "蠡县", + "顺平县", + "博野县", + "雄县", + "涿州市", + "定州市", + "安国市", + "高碑店市" + ] + }, + { + "name": "张家口市", + "area": [ + "桥东区", + "桥西区", + "宣化区", + "下花园区", + "万全区", + "崇礼区", + "张北县", + "康保县", + "沽源县", + "尚义县", + "蔚县", + "阳原县", + "怀安县", + "怀来县", + "涿鹿县", + "赤城县" + ] + }, + { + "name": "承德市", + "area": [ + "双桥区", + "双滦区", + "鹰手营子矿区", + "承德县", + "兴隆县", + "滦平县", + "隆化县", + "丰宁满族自治县", + "宽城满族自治县", + "围场满族蒙古族自治县", + "平泉市" + ] + }, + { + "name": "沧州市", + "area": [ + "新华区", + "运河区", + "沧县", + "青县", + "东光县", + "海兴县", + "盐山县", + "肃宁县", + "南皮县", + "吴桥县", + "献县", + "孟村回族自治县", + "泊头市", + "任丘市", + "黄骅市", + "河间市" + ] + }, + { + "name": "廊坊市", + "area": [ + "安次区", + "广阳区", + "固安县", + "永清县", + "香河县", + "大城县", + "文安县", + "大厂回族自治县", + "霸州市", + "三河市" + ] + }, + { + "name": "衡水市", + "area": [ + "桃城区", + "冀州区", + "枣强县", + "武邑县", + "武强县", + "饶阳县", + "安平县", + "故城县", + "景县", + "阜城县", + "深州市" + ] + } + ] + }, + { + "name": "福建省", + "city": [ + { + "name": "福州市", + "area": [ + "鼓楼区", + "台江区", + "仓山区", + "马尾区", + "晋安区", + "长乐区", + "闽侯县", + "连江县", + "罗源县", + "闽清县", + "永泰县", + "平潭县", + "福清市", + "高新技术产业开发区" + ] + }, + { + "name": "厦门市", + "area": [ + "思明区", + "海沧区", + "湖里区", + "集美区", + "同安区", + "翔安区" + ] + }, + { + "name": "莆田市", + "area": [ + "城厢区", + "涵江区", + "荔城区", + "秀屿区", + "仙游县" + ] + }, + { + "name": "三明市", + "area": [ + "梅列区", + "三元区", + "明溪县", + "清流县", + "宁化县", + "大田县", + "尤溪县", + "沙县", + "将乐县", + "泰宁县", + "建宁县", + "永安市" + ] + }, + { + "name": "泉州市", + "area": [ + "鲤城区", + "丰泽区", + "洛江区", + "泉港区", + "惠安县", + "安溪县", + "永春县", + "德化县", + "金门县", + "石狮市", + "晋江市", + "南安市" + ] + }, + { + "name": "漳州市", + "area": [ + "芗城区", + "龙文区", + "云霄县", + "漳浦县", + "诏安县", + "长泰县", + "东山县", + "南靖县", + "平和县", + "华安县", + "龙海市" + ] + }, + { + "name": "南平市", + "area": [ + "延平区", + "建阳区", + "顺昌县", + "浦城县", + "光泽县", + "松溪县", + "政和县", + "邵武市", + "武夷山市", + "建瓯市" + ] + }, + { + "name": "龙岩市", + "area": [ + "新罗区", + "永定区", + "长汀县", + "上杭县", + "武平县", + "连城县", + "漳平市" + ] + }, + { + "name": "宁德市", + "area": [ + "蕉城区", + "霞浦县", + "古田县", + "屏南县", + "寿宁县", + "周宁县", + "柘荣县", + "福安市", + "福鼎市" + ] + } + ] + }, + { + "name": "安徽省", + "city": [ + { + "name": "合肥市", + "area": [ + "瑶海区", + "庐阳区", + "蜀山区", + "包河区", + "长丰县", + "肥东县", + "肥西县", + "庐江县", + "巢湖市" + ] + }, + { + "name": "芜湖市", + "area": [ + "镜湖区", + "弋江区", + "鸠江区", + "三山区", + "芜湖县", + "繁昌县", + "南陵县", + "无为市" + ] + }, + { + "name": "蚌埠市", + "area": [ + "龙子湖区", + "蚌山区", + "禹会区", + "淮上区", + "怀远县", + "五河县", + "固镇县" + ] + }, + { + "name": "淮南市", + "area": [ + "大通区", + "田家庵区", + "谢家集区", + "八公山区", + "潘集区", + "凤台县", + "寿县" + ] + }, + { + "name": "马鞍山市", + "area": [ + "花山区", + "雨山区", + "博望区", + "当涂县", + "含山县", + "和县" + ] + }, + { + "name": "淮北市", + "area": [ + "杜集区", + "相山区", + "烈山区", + "濉溪县" + ] + }, + { + "name": "铜陵市", + "area": [ + "铜官区", + "义安区", + "郊区", + "枞阳县" + ] + }, + { + "name": "安庆市", + "area": [ + "迎江区", + "大观区", + "宜秀区", + "怀宁县", + "太湖县", + "宿松县", + "望江县", + "岳西县", + "桐城市", + "潜山市" + ] + }, + { + "name": "黄山市", + "area": [ + "屯溪区", + "黄山区", + "徽州区", + "歙县", + "休宁县", + "黟县", + "祁门县" + ] + }, + { + "name": "滁州市", + "area": [ + "琅琊区", + "南谯区", + "来安县", + "全椒县", + "定远县", + "凤阳县", + "天长市", + "明光市" + ] + }, + { + "name": "阜阳市", + "area": [ + "颍州区", + "颍东区", + "颍泉区", + "临泉县", + "太和县", + "阜南县", + "颍上县", + "界首市" + ] + }, + { + "name": "宿州市", + "area": [ + "埇桥区", + "砀山县", + "萧县", + "灵璧县", + "泗县" + ] + }, + { + "name": "六安市", + "area": [ + "金安区", + "裕安区", + "叶集区", + "霍邱县", + "舒城县", + "金寨县", + "霍山县" + ] + }, + { + "name": "亳州市", + "area": [ + "谯城区", + "涡阳县", + "蒙城县", + "利辛县" + ] + }, + { + "name": "池州市", + "area": [ + "贵池区", + "东至县", + "石台县", + "青阳县" + ] + }, + { + "name": "宣城市", + "area": [ + "宣州区", + "郎溪县", + "泾县", + "绩溪县", + "旌德县", + "宁国市", + "广德市" + ] + } + ] + }, + { + "name": "辽宁省", + "city": [ + { + "name": "沈阳市", + "area": [ + "和平区", + "沈河区", + "大东区", + "皇姑区", + "铁西区", + "苏家屯区", + "浑南区", + "沈北区", + "于洪区", + "辽中区", + "康平县", + "法库县", + "新民市" + ] + }, + { + "name": "大连市", + "area": [ + "中山区", + "西岗区", + "沙河口区", + "甘井子区", + "旅顺口区", + "金州区", + "普兰店区", + "长海县", + "瓦房店市", + "庄河市" + ] + }, + { + "name": "鞍山市", + "area": [ + "铁东区", + "铁西区", + "立山区", + "千山区", + "台安县", + "岫岩满族自治县", + "海城市" + ] + }, + { + "name": "抚顺市", + "area": [ + "新抚区", + "东洲区", + "望花区", + "顺城区", + "抚顺县", + "新宾满族自治县", + "清原满族自治县" + ] + }, + { + "name": "本溪市", + "area": [ + "平山区", + "溪湖区", + "明山区", + "南芬区", + "本溪满族自治县", + "桓仁满族自治县" + ] + }, + { + "name": "丹东市", + "area": [ + "元宝区", + "振兴区", + "振安区", + "宽甸满族自治县", + "东港市", + "凤城市" + ] + }, + { + "name": "锦州市", + "area": [ + "古塔区", + "凌河区", + "太和区", + "黑山县", + "义县", + "凌海市", + "北镇市" + ] + }, + { + "name": "营口市", + "area": [ + "站前区", + "西市区", + "鲅鱼圈区", + "老边区", + "盖州市", + "大石桥市" + ] + }, + { + "name": "阜新市", + "area": [ + "海州区", + "新邱区", + "太平区", + "清河门区", + "细河区", + "阜新蒙古族自治县", + "彰武县" + ] + }, + { + "name": "辽阳市", + "area": [ + "白塔区", + "文圣区", + "宏伟区", + "弓长岭区", + "太子河区", + "辽阳县", + "灯塔市" + ] + }, + { + "name": "盘锦市", + "area": [ + "双台子区", + "兴隆台区", + "大洼区", + "盘山县" + ] + }, + { + "name": "铁岭市", + "area": [ + "银州区", + "清河区", + "铁岭县", + "西丰县", + "昌图县", + "调兵山市", + "开原市" + ] + }, + { + "name": "朝阳市", + "area": [ + "双塔区", + "龙城区", + "朝阳县", + "建平县", + "喀喇沁左翼蒙古族自治县", + "北票市", + "凌源市" + ] + }, + { + "name": "葫芦岛市", + "area": [ + "连山区", + "龙港区", + "南票区", + "绥中县", + "建昌县", + "兴城市" + ] + } + ] + }, + { + "name": "陕西省", + "city": [ + { + "name": "西安市", + "area": [ + "新城区", + "碑林区", + "莲湖区", + "灞桥区", + "未央区", + "雁塔区", + "阎良区", + "临潼区", + "长安区", + "高陵区", + "鄠邑区", + "蓝田县", + "周至县", + "西咸区" + ] + }, + { + "name": "铜川市", + "area": [ + "王益区", + "印台区", + "耀州区", + "宜君县" + ] + }, + { + "name": "宝鸡市", + "area": [ + "渭滨区", + "金台区", + "陈仓区", + "凤翔县", + "岐山县", + "扶风县", + "眉县", + "陇县", + "千阳县", + "麟游县", + "凤县", + "太白县" + ] + }, + { + "name": "咸阳市", + "area": [ + "秦都区", + "杨陵区", + "渭城区", + "三原县", + "泾阳县", + "乾县", + "礼泉县", + "永寿县", + "长武县", + "旬邑县", + "淳化县", + "武功县", + "兴平市", + "彬州市" + ] + }, + { + "name": "渭南市", + "area": [ + "临渭区", + "华州区", + "潼关县", + "大荔县", + "合阳县", + "澄城县", + "蒲城县", + "白水县", + "富平县", + "韩城市", + "华阴市" + ] + }, + { + "name": "延安市", + "area": [ + "宝塔区", + "安塞区", + "延长县", + "延川县", + "志丹县", + "吴起县", + "甘泉县", + "富县", + "洛川县", + "宜川县", + "黄龙县", + "黄陵县", + "子长市" + ] + }, + { + "name": "汉中市", + "area": [ + "汉台区", + "南郑区", + "城固县", + "洋县", + "西乡县", + "勉县", + "宁强县", + "略阳县", + "镇巴县", + "留坝县", + "佛坪县" + ] + }, + { + "name": "榆林市", + "area": [ + "榆阳区", + "横山区", + "府谷县", + "靖边县", + "定边县", + "绥德县", + "米脂县", + "佳县", + "吴堡县", + "清涧县", + "子洲县", + "神木市" + ] + }, + { + "name": "安康市", + "area": [ + "汉滨区", + "汉阴县", + "石泉县", + "宁陕县", + "紫阳县", + "岚皋县", + "平利县", + "镇坪县", + "旬阳县", + "白河县" + ] + }, + { + "name": "商洛市", + "area": [ + "商州区", + "洛南县", + "丹凤县", + "商南县", + "山阳县", + "镇安县", + "柞水县" + ] + } + ] + }, + { + "name": "江西省", + "city": [ + { + "name": "南昌市", + "area": [ + "东湖区", + "西湖区", + "青云谱区", + "青山湖区", + "新建区", + "红谷滩区", + "南昌县", + "安义县", + "进贤县" + ] + }, + { + "name": "景德镇市", + "area": [ + "昌江区", + "珠山区", + "浮梁县", + "乐平市" + ] + }, + { + "name": "萍乡市", + "area": [ + "安源区", + "湘东区", + "莲花县", + "上栗县", + "芦溪县" + ] + }, + { + "name": "九江市", + "area": [ + "濂溪区", + "浔阳区", + "柴桑区", + "武宁县", + "修水县", + "永修县", + "德安县", + "都昌县", + "湖口县", + "彭泽县", + "瑞昌市", + "共青城市", + "庐山市" + ] + }, + { + "name": "新余市", + "area": [ + "渝水区", + "分宜县" + ] + }, + { + "name": "鹰潭市", + "area": [ + "月湖区", + "余江区", + "贵溪市" + ] + }, + { + "name": "赣州市", + "area": [ + "章贡区", + "南康区", + "赣县区", + "信丰县", + "大余县", + "上犹县", + "崇义县", + "安远县", + "定南县", + "全南县", + "宁都县", + "于都县", + "兴国县", + "会昌县", + "寻乌县", + "石城县", + "瑞金市", + "龙南市" + ] + }, + { + "name": "吉安市", + "area": [ + "吉州区", + "青原区", + "吉安县", + "吉水县", + "峡江县", + "新干县", + "永丰县", + "泰和县", + "遂川县", + "万安县", + "安福县", + "永新县", + "井冈山市" + ] + }, + { + "name": "宜春市", + "area": [ + "袁州区", + "奉新县", + "万载县", + "上高县", + "宜丰县", + "靖安县", + "铜鼓县", + "丰城市", + "樟树市", + "高安市" + ] + }, + { + "name": "抚州市", + "area": [ + "临川区", + "东乡区", + "南城县", + "黎川县", + "南丰县", + "崇仁县", + "乐安县", + "宜黄县", + "金溪县", + "资溪县", + "广昌县" + ] + }, + { + "name": "上饶市", + "area": [ + "信州区", + "广丰区", + "广信区", + "玉山县", + "铅山县", + "横峰县", + "弋阳县", + "余干县", + "鄱阳县", + "万年县", + "婺源县", + "德兴市" + ] + } + ] + }, + { + "name": "云南省", + "city": [ + { + "name": "昆明市", + "area": [ + "五华区", + "盘龙区", + "官渡区", + "西山区", + "东川区", + "呈贡区", + "晋宁区", + "富民县", + "宜良县", + "石林彝族自治县", + "嵩明县", + "禄劝彝族苗族自治县", + "寻甸回族彝族自治县", + "安宁市" + ] + }, + { + "name": "曲靖市", + "area": [ + "麒麟区", + "沾益区", + "马龙区", + "陆良县", + "师宗县", + "罗平县", + "富源县", + "会泽县", + "宣威市" + ] + }, + { + "name": "玉溪市", + "area": [ + "红塔区", + "江川区", + "通海县", + "华宁县", + "易门县", + "峨山彝族自治县", + "新平彝族傣族自治县", + "元江哈尼族彝族傣族自治县", + "澄江市" + ] + }, + { + "name": "保山市", + "area": [ + "隆阳区", + "施甸县", + "龙陵县", + "昌宁县", + "腾冲市" + ] + }, + { + "name": "昭通市", + "area": [ + "昭阳区", + "鲁甸县", + "巧家县", + "盐津县", + "大关县", + "永善县", + "绥江县", + "镇雄县", + "彝良县", + "威信县", + "水富市" + ] + }, + { + "name": "丽江市", + "area": [ + "古城区", + "玉龙纳西族自治县", + "永胜县", + "华坪县", + "宁蒗彝族自治县" + ] + }, + { + "name": "普洱市", + "area": [ + "思茅区", + "宁洱哈尼族彝族自治县", + "墨江哈尼族自治县", + "景东彝族自治县", + "景谷傣族彝族自治县", + "镇沅彝族哈尼族拉祜族自治县", + "江城哈尼族彝族自治县", + "孟连傣族拉祜族佤族自治县", + "澜沧拉祜族自治县", + "西盟佤族自治县" + ] + }, + { + "name": "临沧市", + "area": [ + "临翔区", + "凤庆县", + "云县", + "永德县", + "镇康县", + "双江拉祜族佤族布朗族傣族自治县", + "耿马傣族佤族自治县", + "沧源佤族自治县" + ] + }, + { + "name": "楚雄彝族自治州", + "area": [ + "楚雄市", + "双柏县", + "牟定县", + "南华县", + "姚安县", + "大姚县", + "永仁县", + "元谋县", + "武定县", + "禄丰县" + ] + }, + { + "name": "红河哈尼族彝族自治州", + "area": [ + "个旧市", + "开远市", + "蒙自市", + "弥勒市", + "屏边苗族自治县", + "建水县", + "石屏县", + "泸西县", + "元阳县", + "红河县", + "金平苗族瑶族傣族自治县", + "绿春县", + "河口瑶族自治县" + ] + }, + { + "name": "文山壮族苗族自治州", + "area": [ + "文山市", + "砚山县", + "西畴县", + "麻栗坡县", + "马关县", + "丘北县", + "广南县", + "富宁县" + ] + }, + { + "name": "西双版纳傣族自治州", + "area": [ + "景洪市", + "勐海县", + "勐腊县" + ] + }, + { + "name": "大理白族自治州", + "area": [ + "大理市", + "漾濞彝族自治县", + "祥云县", + "宾川县", + "弥渡县", + "南涧彝族自治县", + "巍山彝族回族自治县", + "永平县", + "云龙县", + "洱源县", + "剑川县", + "鹤庆县" + ] + }, + { + "name": "德宏傣族景颇族自治州", + "area": [ + "瑞丽市", + "芒市", + "梁河县", + "盈江县", + "陇川县" + ] + }, + { + "name": "怒江傈僳族自治州", + "area": [ + "泸水市", + "福贡县", + "贡山独龙族怒族自治县", + "兰坪白族普米族自治县" + ] + }, + { + "name": "迪庆藏族自治州", + "area": [ + "香格里拉市", + "德钦县", + "维西傈僳族自治县" + ] + } + ] + }, + { + "name": "山西省", + "city": [ + { + "name": "太原市", + "area": [ + "小店区", + "迎泽区", + "杏花岭区", + "尖草坪区", + "万柏林区", + "晋源区", + "清徐县", + "阳曲县", + "娄烦县", + "古交市" + ] + }, + { + "name": "大同市", + "area": [ + "新荣区", + "平城区", + "云冈区", + "云州区", + "阳高县", + "天镇县", + "广灵县", + "灵丘县", + "浑源县", + "左云县" + ] + }, + { + "name": "阳泉市", + "area": [ + "城区", + "矿区", + "郊区", + "平定县", + "盂县" + ] + }, + { + "name": "长治市", + "area": [ + "潞州区", + "上党区", + "屯留区", + "潞城区", + "襄垣县", + "平顺县", + "黎城县", + "壶关县", + "长子县", + "武乡县", + "沁县", + "沁源县" + ] + }, + { + "name": "晋城市", + "area": [ + "城区", + "沁水县", + "阳城县", + "陵川县", + "泽州县", + "高平市" + ] + }, + { + "name": "朔州市", + "area": [ + "朔城区", + "平鲁区", + "山阴县", + "应县", + "右玉县", + "怀仁市" + ] + }, + { + "name": "晋中市", + "area": [ + "榆次区", + "太谷区", + "榆社县", + "左权县", + "和顺县", + "昔阳县", + "寿阳县", + "祁县", + "平遥县", + "灵石县", + "介休市" + ] + }, + { + "name": "运城市", + "area": [ + "盐湖区", + "临猗县", + "万荣县", + "闻喜县", + "稷山县", + "新绛县", + "绛县", + "垣曲县", + "夏县", + "平陆县", + "芮城县", + "永济市", + "河津市" + ] + }, + { + "name": "忻州市", + "area": [ + "忻府区", + "定襄县", + "五台县", + "代县", + "繁峙县", + "宁武县", + "静乐县", + "神池县", + "五寨县", + "岢岚县", + "河曲县", + "保德县", + "偏关县", + "原平市" + ] + }, + { + "name": "临汾市", + "area": [ + "尧都区", + "曲沃县", + "翼城县", + "襄汾县", + "洪洞县", + "古县", + "安泽县", + "浮山县", + "吉县", + "乡宁县", + "大宁县", + "隰县", + "永和县", + "蒲县", + "汾西县", + "侯马市", + "霍州市" + ] + }, + { + "name": "吕梁市", + "area": [ + "离石区", + "文水县", + "交城县", + "兴县", + "临县", + "柳林县", + "石楼县", + "岚县", + "方山县", + "中阳县", + "交口县", + "孝义市", + "汾阳市" + ] + } + ] + }, + { + "name": "吉林省", + "city": [ + { + "name": "长春市", + "area": [ + "南关区", + "宽城区", + "朝阳区", + "二道区", + "绿园区", + "双阳区", + "九台区", + "农安县", + "榆树市", + "德惠市", + "公主岭市", + "长德区", + "北湖区", + "空港区", + "北区", + "南区", + "高新区", + "汽开区", + "净月区", + "莲花山旅游度假区" + ] + }, + { + "name": "吉林市", + "area": [ + "昌邑区", + "龙潭区", + "船营区", + "丰满区", + "永吉县", + "蛟河市", + "桦甸市", + "舒兰市", + "磐石市" + ] + }, + { + "name": "四平市", + "area": [ + "铁西区", + "铁东区", + "梨树县", + "伊通满族自治县", + "双辽市" + ] + }, + { + "name": "辽源市", + "area": [ + "龙山区", + "西安区", + "东丰县", + "东辽县" + ] + }, + { + "name": "通化市", + "area": [ + "东昌区", + "二道江区", + "通化县", + "辉南县", + "柳河县", + "梅河口市", + "集安市" + ] + }, + { + "name": "白山市", + "area": [ + "浑江区", + "江源区", + "抚松县", + "靖宇县", + "长白朝鲜族自治县", + "临江市" + ] + }, + { + "name": "松原市", + "area": [ + "宁江区", + "前郭尔罗斯蒙古族自治县", + "长岭县", + "乾安县", + "扶余市" + ] + }, + { + "name": "白城市", + "area": [ + "洮北区", + "镇赉县", + "通榆县", + "洮南市", + "大安市" + ] + }, + { + "name": "延边朝鲜族自治州", + "area": [ + "延吉市", + "图们市", + "敦化市", + "珲春市", + "龙井市", + "和龙市", + "汪清县", + "安图县" + ] + } + ] + }, + { + "name": "贵州省", + "city": [ + { + "name": "贵阳市", + "area": [ + "南明区", + "云岩区", + "花溪区", + "乌当区", + "白云区", + "观山湖区", + "开阳县", + "息烽县", + "修文县", + "清镇市" + ] + }, + { + "name": "六盘水市", + "area": [ + "钟山区", + "六枝特区", + "水城县", + "盘州市" + ] + }, + { + "name": "遵义市", + "area": [ + "红花岗区", + "汇川区", + "播州区", + "桐梓县", + "绥阳县", + "正安县", + "道真仡佬族苗族自治县", + "务川仡佬族苗族自治县", + "凤冈县", + "湄潭县", + "余庆县", + "习水县", + "赤水市", + "仁怀市" + ] + }, + { + "name": "安顺市", + "area": [ + "西秀区", + "平坝区", + "普定县", + "镇宁布依族苗族自治县", + "关岭布依族苗族自治县", + "紫云苗族布依族自治县" + ] + }, + { + "name": "毕节市", + "area": [ + "七星关区", + "大方县", + "黔西县", + "金沙县", + "织金县", + "纳雍县", + "威宁彝族回族苗族自治县", + "赫章县" + ] + }, + { + "name": "铜仁市", + "area": [ + "碧江区", + "万山区", + "江口县", + "玉屏侗族自治县", + "石阡县", + "思南县", + "印江土家族苗族自治县", + "德江县", + "沿河土家族自治县", + "松桃苗族自治县" + ] + }, + { + "name": "黔西南布依族苗族自治州", + "area": [ + "兴义市", + "兴仁市", + "普安县", + "晴隆县", + "贞丰县", + "望谟县", + "册亨县", + "安龙县" + ] + }, + { + "name": "黔东南苗族侗族自治州", + "area": [ + "凯里市", + "黄平县", + "施秉县", + "三穗县", + "镇远县", + "岑巩县", + "天柱县", + "锦屏县", + "剑河县", + "台江县", + "黎平县", + "榕江县", + "从江县", + "雷山县", + "麻江县", + "丹寨县" + ] + }, + { + "name": "黔南布依族苗族自治州", + "area": [ + "都匀市", + "福泉市", + "荔波县", + "贵定县", + "瓮安县", + "独山县", + "平塘县", + "罗甸县", + "长顺县", + "龙里县", + "惠水县", + "三都水族自治县" + ] + } + ] + }, + { + "name": "甘肃省", + "city": [ + { + "name": "兰州市", + "area": [ + "城关区", + "七里河区", + "西固区", + "安宁区", + "红古区", + "永登县", + "皋兰县", + "榆中县" + ] + }, + { + "name": "嘉峪关市", + "area": [ + "胜利街道", + "五一街道", + "矿山街道", + "新华街道", + "建设街道", + "前进街道", + "峪苑街道", + "朝阳街道", + "峪泉镇", + "文殊镇", + "新城镇", + "雄关区", + "长城区", + "镜铁区" + ] + }, + { + "name": "金昌市", + "area": [ + "金川区", + "永昌县" + ] + }, + { + "name": "白银市", + "area": [ + "白银区", + "平川区", + "靖远县", + "会宁县", + "景泰县" + ] + }, + { + "name": "天水市", + "area": [ + "秦州区", + "麦积区", + "清水县", + "秦安县", + "甘谷县", + "武山县", + "张家川回族自治县" + ] + }, + { + "name": "武威市", + "area": [ + "凉州区", + "民勤县", + "古浪县", + "天祝藏族自治县" + ] + }, + { + "name": "张掖市", + "area": [ + "甘州区", + "肃南裕固族自治县", + "民乐县", + "临泽县", + "高台县", + "山丹县" + ] + }, + { + "name": "平凉市", + "area": [ + "崆峒区", + "泾川县", + "灵台县", + "崇信县", + "庄浪县", + "静宁县", + "华亭市" + ] + }, + { + "name": "酒泉市", + "area": [ + "肃州区", + "金塔县", + "瓜州县", + "肃北蒙古族自治县", + "阿克塞哈萨克族自治县", + "玉门市", + "敦煌市" + ] + }, + { + "name": "庆阳市", + "area": [ + "西峰区", + "庆城县", + "环县", + "华池县", + "合水县", + "正宁县", + "宁县", + "镇原县" + ] + }, + { + "name": "定西市", + "area": [ + "安定区", + "通渭县", + "陇西县", + "渭源县", + "临洮县", + "漳县", + "岷县" + ] + }, + { + "name": "陇南市", + "area": [ + "武都区", + "成县", + "文县", + "宕昌县", + "康县", + "西和县", + "礼县", + "徽县", + "两当县" + ] + }, + { + "name": "临夏回族自治州", + "area": [ + "临夏市", + "临夏县", + "康乐县", + "永靖县", + "广河县", + "和政县", + "东乡族自治县", + "积石山保安族东乡族撒拉族自治县" + ] + }, + { + "name": "甘南藏族自治州", + "area": [ + "合作市", + "临潭县", + "卓尼县", + "舟曲县", + "迭部县", + "玛曲县", + "碌曲县", + "夏河县" + ] + } + ] + }, + { + "name": "海南省", + "city": [ + { + "name": "海口市", + "area": [ + "秀英区", + "龙华区", + "琼山区", + "美兰区" + ] + }, + { + "name": "三亚市", + "area": [ + "海棠区", + "吉阳区", + "天涯区", + "崖州区" + ] + }, + { + "name": "三沙市", + "area": [ + "西沙群岛", + "中沙群岛", + "南沙群岛" + ] + }, + { + "name": "儋州市", + "area": [ + "那大镇", + "和庆镇", + "南丰镇", + "大成镇", + "雅星镇", + "兰洋镇", + "光村镇", + "木棠镇", + "海头镇", + "峨蔓镇", + "王五镇", + "白马井镇", + "中和镇", + "排浦镇", + "东成镇", + "新州镇", + "国营八一总场", + "国营蓝洋农场", + "国营西联农场", + "国营西培农场" + ] + }, + { + "name": "五指山市", + "area": [ + "通什镇", + "南圣镇", + "毛阳镇", + "番阳镇", + "畅好乡", + "毛道乡", + "水满乡" + ] + }, + { + "name": "琼海市", + "area": [ + "嘉积镇", + "博鳌镇", + "万泉镇", + "潭门镇", + "长坡镇", + "塔洋镇", + "大路镇", + "中原镇", + "阳江镇", + "龙江镇", + "石壁镇", + "会山镇" + ] + }, + { + "name": "文昌市", + "area": [ + "文城镇", + "重兴镇", + "蓬莱镇", + "会文镇", + "东路镇", + "潭牛镇", + "东阁镇", + "文教镇", + "东郊镇", + "龙楼镇", + "昌洒镇", + "翁田镇", + "抱罗镇", + "冯坡镇", + "锦山镇", + "铺前镇", + "公坡镇" + ] + }, + { + "name": "万宁市", + "area": [ + "万城镇", + "龙滚镇", + "和乐镇", + "后安镇", + "大茂镇", + "东澳镇", + "礼纪镇", + "长丰镇", + "山根镇", + "北大镇", + "南桥镇", + "三更罗镇", + "兴隆华侨农场", + "地方国营六连林场" + ] + }, + { + "name": "东方市", + "area": [ + "八所镇", + "东河镇", + "大田镇", + "感城镇", + "板桥镇", + "三家镇", + "四更镇", + "新龙镇", + "天安乡", + "江边乡" + ] + }, + { + "name": "定安县", + "area": [ + "定城镇", + "新竹镇", + "龙湖镇", + "黄竹镇", + "雷鸣镇", + "龙门镇", + "龙河镇", + "岭口镇", + "翰林镇", + "富文镇" + ] + }, + { + "name": "屯昌县", + "area": [ + "屯城镇", + "新兴镇", + "枫木镇", + "乌坡镇", + "南吕镇", + "南坤镇", + "坡心镇", + "西昌镇" + ] + }, + { + "name": "澄迈县", + "area": [ + "金江镇", + "瑞溪镇", + "永发镇", + "老城镇", + "加乐镇", + "文儒镇", + "福山镇", + "桥头镇", + "中兴镇", + "仁兴镇", + "大丰镇", + "金安农场", + "红光农场", + "西达农场", + "澄迈林场", + "海南老城经济开发区", + "海口综合保税区", + "马村中心港区" + ] + }, + { + "name": "临高县", + "area": [ + "临城镇", + "东英镇", + "波莲镇", + "调楼镇", + "新盈镇", + "南宝镇", + "和舍镇", + "多文镇", + "博厚镇", + "皇桐镇", + "加来农场", + "金牌港经济开发区", + "临高角旅游度假开发区" + ] + }, + { + "name": "白沙黎族自治县", + "area": [ + "牙叉镇", + "七坊镇", + "邦溪镇", + "打安镇", + "细水乡", + "元门乡", + "南开乡", + "阜龙乡", + "青松乡", + "金波乡", + "荣邦乡" + ] + }, + { + "name": "昌江黎族自治县", + "area": [ + "石碌镇", + "叉河镇", + "十月田镇", + "乌烈镇", + "昌化镇", + "海尾镇", + "七叉镇", + "王下乡" + ] + }, + { + "name": "乐东黎族自治县", + "area": [ + "抱由镇", + "万冲镇", + "大安镇", + "志仲镇", + "千家镇", + "九所镇", + "利国镇", + "黄流镇", + "佛罗镇", + "尖峰镇", + "莺歌海镇" + ] + }, + { + "name": "陵水黎族自治县", + "area": [ + "椰林镇", + "新村镇", + "英州镇", + "本号镇", + "光坡镇", + "三才镇", + "黎安镇", + "隆广镇", + "文罗镇", + "提蒙乡", + "群英乡" + ] + }, + { + "name": "保亭黎族苗族自治县", + "area": [ + "保城镇", + "什玲镇", + "加茂镇", + "响水镇", + "新政镇", + "三道镇", + "六弓乡", + "南林乡", + "毛感乡" + ] + }, + { + "name": "琼中黎族苗族自治县", + "area": [ + "营根镇", + "湾岭镇", + "黎母山镇", + "红毛镇", + "长征镇", + "中平镇", + "和平镇", + "什运乡", + "上安乡", + "吊罗山乡", + "阳江农场", + "大丰农场", + "新进农场", + "乌石农场", + "岭头农场", + "南方农场", + "新伟农场", + "加钗农场", + "长征农场", + "乘坡农场", + "太平农场" + ] + } + ] + }, + { + "name": "青海省", + "city": [ + { + "name": "西宁市", + "area": [ + "城东区", + "城中区", + "城西区", + "城北区", + "湟中区", + "大通回族土族自治县", + "湟源县" + ] + }, + { + "name": "海东市", + "area": [ + "乐都区", + "平安区", + "民和回族土族自治县", + "互助土族自治县", + "化隆回族自治县", + "循化撒拉族自治县" + ] + }, + { + "name": "海北藏族自治州", + "area": [ + "门源回族自治县", + "祁连县", + "海晏县", + "刚察县" + ] + }, + { + "name": "黄南藏族自治州", + "area": [ + "同仁市", + "尖扎县", + "泽库县", + "河南蒙古族自治县" + ] + }, + { + "name": "海南藏族自治州", + "area": [ + "共和县", + "同德县", + "贵德县", + "兴海县", + "贵南县" + ] + }, + { + "name": "果洛藏族自治州", + "area": [ + "玛沁县", + "班玛县", + "甘德县", + "达日县", + "久治县", + "玛多县" + ] + }, + { + "name": "玉树藏族自治州", + "area": [ + "玉树市", + "杂多县", + "称多县", + "治多县", + "囊谦县", + "曲麻莱县" + ] + }, + { + "name": "海西蒙古族藏族自治州", + "area": [ + "格尔木市", + "德令哈市", + "茫崖市", + "乌兰县", + "都兰县", + "天峻县" + ] + } + ] + }, + { + "name": "黑龙江省", + "city": [ + { + "name": "哈尔滨市", + "area": [ + "道里区", + "南岗区", + "道外区", + "平房区", + "松北区", + "香坊区", + "呼兰区", + "阿城区", + "双城区", + "依兰县", + "方正县", + "宾县", + "巴彦县", + "木兰县", + "通河县", + "延寿县", + "尚志市", + "五常市" + ] + }, + { + "name": "齐齐哈尔市", + "area": [ + "龙沙区", + "建华区", + "铁锋区", + "昂昂溪区", + "富拉尔基区", + "碾子山区", + "梅里斯达斡尔族区", + "龙江县", + "依安县", + "泰来县", + "甘南县", + "富裕县", + "克山县", + "克东县", + "拜泉县", + "讷河市" + ] + }, + { + "name": "鸡西市", + "area": [ + "鸡冠区", + "恒山区", + "滴道区", + "梨树区", + "城子河区", + "麻山区", + "鸡东县", + "虎林市", + "密山市" + ] + }, + { + "name": "鹤岗市", + "area": [ + "向阳区", + "工农区", + "南山区", + "兴安区", + "东山区", + "兴山区", + "萝北县", + "绥滨县" + ] + }, + { + "name": "双鸭山市", + "area": [ + "尖山区", + "岭东区", + "四方台区", + "宝山区", + "集贤县", + "友谊县", + "宝清县", + "饶河县" + ] + }, + { + "name": "大庆市", + "area": [ + "萨尔图区", + "龙凤区", + "让胡路区", + "红岗区", + "大同区", + "肇州县", + "肇源县", + "林甸县", + "杜尔伯特蒙古族自治县" + ] + }, + { + "name": "伊春市", + "area": [ + "伊美区", + "乌翠区", + "友好区", + "嘉荫县", + "汤旺县", + "丰林县", + "大箐山县", + "南岔县", + "金林区", + "铁力市" + ] + }, + { + "name": "佳木斯市", + "area": [ + "向阳区", + "前进区", + "东风区", + "郊区", + "桦南县", + "桦川县", + "汤原县", + "同江市", + "富锦市", + "抚远市" + ] + }, + { + "name": "七台河市", + "area": [ + "新兴区", + "桃山区", + "茄子河区", + "勃利县" + ] + }, + { + "name": "牡丹江市", + "area": [ + "东安区", + "阳明区", + "爱民区", + "西安区", + "林口县", + "绥芬河市", + "海林市", + "宁安市", + "穆棱市", + "东宁市" + ] + }, + { + "name": "黑河市", + "area": [ + "爱辉区", + "逊克县", + "孙吴县", + "北安市", + "五大连池市", + "嫩江市" + ] + }, + { + "name": "绥化市", + "area": [ + "北林区", + "望奎县", + "兰西县", + "青冈县", + "庆安县", + "明水县", + "绥棱县", + "安达市", + "肇东市", + "海伦市" + ] + }, + { + "name": "大兴安岭地区", + "area": [ + "漠河市", + "呼玛县", + "塔河县" + ] + } + ] + }, + { + "name": "西藏自治区", + "city": [ + { + "name": "拉萨市", + "area": [ + "城关区", + "堆龙德庆区", + "达孜区", + "林周县", + "当雄县", + "尼木县", + "曲水县", + "墨竹工卡县" + ] + }, + { + "name": "日喀则市", + "area": [ + "桑珠孜区", + "南木林县", + "江孜县", + "定日县", + "萨迦县", + "拉孜县", + "昂仁县", + "谢通门县", + "白朗县", + "仁布县", + "康马县", + "定结县", + "仲巴县", + "亚东县", + "吉隆县", + "聂拉木县", + "萨嘎县", + "岗巴县" + ] + }, + { + "name": "昌都市", + "area": [ + "卡若区", + "江达县", + "贡觉县", + "类乌齐县", + "丁青县", + "察雅县", + "八宿县", + "左贡县", + "芒康县", + "洛隆县", + "边坝县" + ] + }, + { + "name": "林芝市", + "area": [ + "巴宜区", + "工布江达县", + "米林县", + "墨脱县", + "波密县", + "察隅县", + "朗县" + ] + }, + { + "name": "山南市", + "area": [ + "乃东区", + "扎囊县", + "贡嘎县", + "桑日县", + "琼结县", + "曲松县", + "措美县", + "洛扎县", + "加查县", + "隆子县", + "错那县", + "浪卡子县" + ] + }, + { + "name": "那曲市", + "area": [ + "色尼区", + "嘉黎县", + "比如县", + "聂荣县", + "安多县", + "申扎县", + "索县", + "班戈县", + "巴青县", + "尼玛县", + "双湖县" + ] + }, + { + "name": "阿里地区", + "area": [ + "普兰县", + "札达县", + "噶尔县", + "日土县", + "革吉县", + "改则县", + "措勤县" + ] + } + ] + }, + { + "name": "内蒙古自治区", + "city": [ + { + "name": "呼和浩特市", + "area": [ + "新城区", + "回民区", + "玉泉区", + "赛罕区", + "土默特左旗", + "托克托县", + "和林格尔县", + "清水河县", + "武川县" + ] + }, + { + "name": "包头市", + "area": [ + "东河区", + "昆都仑区", + "青山区", + "石拐区", + "白云鄂博矿区", + "九原区", + "土默特右旗", + "固阳县", + "达尔罕茂明安联合旗" + ] + }, + { + "name": "乌海市", + "area": [ + "海勃湾区", + "海南区", + "乌达区" + ] + }, + { + "name": "赤峰市", + "area": [ + "红山区", + "元宝山区", + "松山区", + "阿鲁科尔沁旗", + "巴林左旗", + "巴林右旗", + "林西县", + "克什克腾旗", + "翁牛特旗", + "喀喇沁旗", + "宁城县", + "敖汉旗", + "新城区" + ] + }, + { + "name": "通辽市", + "area": [ + "科尔沁区", + "科尔沁左翼中旗", + "科尔沁左翼后旗", + "开鲁县", + "库伦旗", + "奈曼旗", + "扎鲁特旗", + "霍林郭勒市" + ] + }, + { + "name": "鄂尔多斯市", + "area": [ + "东胜区", + "康巴什区", + "达拉特旗", + "准格尔旗", + "鄂托克前旗", + "鄂托克旗", + "杭锦旗", + "乌审旗", + "伊金霍洛旗" + ] + }, + { + "name": "呼伦贝尔市", + "area": [ + "海拉尔区", + "扎赉诺尔区", + "阿荣旗", + "莫力达瓦达斡尔族自治旗", + "鄂伦春自治旗", + "鄂温克族自治旗", + "陈巴尔虎旗", + "新巴尔虎左旗", + "新巴尔虎右旗", + "满洲里市", + "牙克石市", + "扎兰屯市", + "额尔古纳市", + "根河市" + ] + }, + { + "name": "巴彦淖尔市", + "area": [ + "临河区", + "五原县", + "磴口县", + "乌拉特前旗", + "乌拉特中旗", + "乌拉特后旗", + "杭锦后旗" + ] + }, + { + "name": "乌兰察布市", + "area": [ + "集宁区", + "卓资县", + "化德县", + "商都县", + "兴和县", + "凉城县", + "察哈尔右翼前旗", + "察哈尔右翼中旗", + "察哈尔右翼后旗", + "四子王旗", + "丰镇市" + ] + }, + { + "name": "兴安盟", + "area": [ + "乌兰浩特市", + "阿尔山市", + "科尔沁右翼前旗", + "科尔沁右翼中旗", + "扎赉特旗", + "突泉县" + ] + }, + { + "name": "锡林郭勒盟", + "area": [ + "二连浩特市", + "锡林浩特市", + "阿巴嘎旗", + "苏尼特左旗", + "苏尼特右旗", + "东乌珠穆沁旗", + "西乌珠穆沁旗", + "太仆寺旗", + "镶黄旗", + "正镶白旗", + "正蓝旗", + "多伦县" + ] + }, + { + "name": "阿拉善盟", + "area": [ + "阿拉善左旗", + "阿拉善右旗", + "额济纳旗" + ] + } + ] + }, + { + "name": "广西壮族自治区", + "city": [ + { + "name": "南宁市", + "area": [ + "兴宁区", + "青秀区", + "江南区", + "西乡塘区", + "良庆区", + "邕宁区", + "武鸣区", + "隆安县", + "马山县", + "上林县", + "宾阳县", + "横县" + ] + }, + { + "name": "柳州市", + "area": [ + "城中区", + "鱼峰区", + "柳南区", + "柳北区", + "柳江区", + "柳城县", + "鹿寨县", + "融安县", + "融水苗族自治县", + "三江侗族自治县" + ] + }, + { + "name": "桂林市", + "area": [ + "秀峰区", + "叠彩区", + "象山区", + "七星区", + "雁山区", + "临桂区", + "阳朔县", + "灵川县", + "全州县", + "兴安县", + "永福县", + "灌阳县", + "龙胜各族自治县", + "资源县", + "平乐县", + "荔浦市", + "恭城瑶族自治县" + ] + }, + { + "name": "梧州市", + "area": [ + "万秀区", + "长洲区", + "龙圩区", + "苍梧县", + "藤县", + "蒙山县", + "岑溪市" + ] + }, + { + "name": "北海市", + "area": [ + "海城区", + "银海区", + "铁山港区", + "合浦县" + ] + }, + { + "name": "防城港市", + "area": [ + "港口区", + "防城区", + "上思县", + "东兴市" + ] + }, + { + "name": "钦州市", + "area": [ + "钦南区", + "钦北区", + "灵山县", + "浦北县" + ] + }, + { + "name": "贵港市", + "area": [ + "港北区", + "港南区", + "覃塘区", + "平南县", + "桂平市" + ] + }, + { + "name": "玉林市", + "area": [ + "玉州区", + "福绵区", + "容县", + "陆川县", + "博白县", + "兴业县", + "北流市" + ] + }, + { + "name": "百色市", + "area": [ + "右江区", + "田阳区", + "田东县", + "德保县", + "那坡县", + "凌云县", + "乐业县", + "田林县", + "西林县", + "隆林各族自治县", + "靖西市", + "平果市" + ] + }, + { + "name": "贺州市", + "area": [ + "八步区", + "平桂区", + "昭平县", + "钟山县", + "富川瑶族自治县" + ] + }, + { + "name": "河池市", + "area": [ + "金城江区", + "宜州区", + "南丹县", + "天峨县", + "凤山县", + "东兰县", + "罗城仫佬族自治县", + "环江毛南族自治县", + "巴马瑶族自治县", + "都安瑶族自治县", + "大化瑶族自治县" + ] + }, + { + "name": "来宾市", + "area": [ + "兴宾区", + "忻城县", + "象州县", + "武宣县", + "金秀瑶族自治县", + "合山市" + ] + }, + { + "name": "崇左市", + "area": [ + "江州区", + "扶绥县", + "宁明县", + "龙州县", + "大新县", + "天等县", + "凭祥市" + ] + } + ] + }, + { + "name": "宁夏回族自治区", + "city": [ + { + "name": "银川市", + "area": [ + "兴庆区", + "西夏区", + "金凤区", + "永宁县", + "贺兰县", + "灵武市" + ] + }, + { + "name": "石嘴山市", + "area": [ + "大武口区", + "惠农区", + "平罗县" + ] + }, + { + "name": "吴忠市", + "area": [ + "利通区", + "红寺堡区", + "盐池县", + "同心县", + "青铜峡市" + ] + }, + { + "name": "固原市", + "area": [ + "原州区", + "西吉县", + "隆德县", + "泾源县", + "彭阳县" + ] + }, + { + "name": "中卫市", + "area": [ + "沙坡头区", + "中宁县", + "海原县" + ] + } + ] + }, + { + "name": "新疆维吾尔自治区", + "city": [ + { + "name": "乌鲁木齐市", + "area": [ + "天山区", + "沙依巴克区", + "新市区", + "水磨沟区", + "头屯河区", + "达坂城区", + "米东区", + "乌鲁木齐县" + ] + }, + { + "name": "克拉玛依市", + "area": [ + "独山子区", + "克拉玛依区", + "白碱滩区", + "乌尔禾区" + ] + }, + { + "name": "吐鲁番市", + "area": [ + "高昌区", + "鄯善县", + "托克逊县" + ] + }, + { + "name": "哈密市", + "area": [ + "伊州区", + "巴里坤哈萨克自治县", + "伊吾县" + ] + }, + { + "name": "昌吉回族自治州", + "area": [ + "昌吉市", + "阜康市", + "呼图壁县", + "玛纳斯县", + "奇台县", + "吉木萨尔县", + "木垒哈萨克自治县" + ] + }, + { + "name": "博尔塔拉蒙古自治州", + "area": [ + "博乐市", + "阿拉山口市", + "精河县", + "温泉县" + ] + }, + { + "name": "巴音郭楞蒙古自治州", + "area": [ + "库尔勒市", + "轮台县", + "尉犁县", + "若羌县", + "且末县", + "焉耆回族自治县", + "和静县", + "和硕县", + "博湖县" + ] + }, + { + "name": "阿克苏地区", + "area": [ + "阿克苏市", + "库车市", + "温宿县", + "沙雅县", + "新和县", + "拜城县", + "乌什县", + "阿瓦提县", + "柯坪县" + ] + }, + { + "name": "克孜勒苏柯尔克孜自治州", + "area": [ + "阿图什市", + "阿克陶县", + "阿合奇县", + "乌恰县" + ] + }, + { + "name": "喀什地区", + "area": [ + "喀什市", + "疏附县", + "疏勒县", + "英吉沙县", + "泽普县", + "莎车县", + "叶城县", + "麦盖提县", + "岳普湖县", + "伽师县", + "巴楚县", + "塔什库尔干塔吉克自治县" + ] + }, + { + "name": "和田地区", + "area": [ + "和田市", + "和田县", + "墨玉县", + "皮山县", + "洛浦县", + "策勒县", + "于田县", + "民丰县" + ] + }, + { + "name": "伊犁哈萨克自治州", + "area": [ + "伊宁市", + "奎屯市", + "霍尔果斯市", + "伊宁县", + "察布查尔锡伯自治县", + "霍城县", + "巩留县", + "新源县", + "昭苏县", + "特克斯县", + "尼勒克县" + ] + }, + { + "name": "塔城地区", + "area": [ + "塔城市", + "乌苏市", + "额敏县", + "沙湾县", + "托里县", + "裕民县", + "和布克赛尔蒙古自治县" + ] + }, + { + "name": "阿勒泰地区", + "area": [ + "阿勒泰市", + "布尔津县", + "富蕴县", + "福海县", + "哈巴河县", + "青河县", + "吉木乃县" + ] + }, + { + "name": "石河子市", + "area": [ + "新城街道", + "向阳街道", + "红山街道", + "老街街道", + "东城街道", + "北泉镇", + "石河子镇" + ] + }, + { + "name": "阿拉尔市", + "area": [ + "幸福路街道", + "金银川路街道", + "青松路街道", + "南口街道", + "托喀依乡", + "一团金银川镇", + "二团新井子镇", + "三团甘泉镇", + "四团永宁镇", + "五团沙河镇", + "六团双城镇", + "七团玛滩镇", + "八团塔门镇", + "九团梨花镇", + "十团昌安镇", + "十一团花桥镇", + "十二团塔南镇", + "十三团幸福镇", + "十四团金杨镇", + "十五团", + "十六团新开岭镇" + ] + }, + { + "name": "图木舒克市", + "area": [ + "锦绣街道", + "前海街道", + "永安坝街道", + "四十一团草湖镇", + "四十二团龙口镇", + "四十四团永安镇", + "四十五团前海镇", + "四十六团永兴镇", + "四十八团河东镇", + "四十九团海安镇", + "五十团夏河镇", + "五十一团唐驿镇", + "五十三团金胡杨镇", + "五十四团兴安镇", + "伽师总场嘉和镇" + ] + }, + { + "name": "五家渠市", + "area": [ + "军垦路街道", + "青湖路街道", + "人民路街道", + "一零二团梧桐镇", + "一零三团蔡家湖镇" + ] + }, + { + "name": "北屯市", + "area": [ + "天骄街道", + "龙疆街道", + "军垦街道", + "北屯镇", + "一八三团双渠镇", + "一八七团丰庆镇", + "一八八团海川镇" + ] + }, + { + "name": "铁门关市", + "area": [ + "迎宾街道", + "二十二团河畔镇", + "二十四团高桥镇", + "二十七团天湖镇", + "二十八团博古其镇", + "三十团双丰镇", + "三十六团米兰镇", + "三十七团金山镇", + "三十八团南屯镇", + "二二三团开泽镇" + ] + }, + { + "name": "双河市", + "area": [ + "八十一团双桥镇", + "八十四团石峪镇", + "八十五团", + "八十六团博河镇", + "八十九团", + "九十团双乐镇" + ] + }, + { + "name": "可克达拉市", + "area": [ + "六十三团榆树庄镇", + "六十四团苇湖镇", + "六十六团", + "六十七团", + "六十八团长丰镇" + ] + }, + { + "name": "昆玉市", + "area": [ + "四十七团老兵镇", + "皮山农场昆泉镇", + "一牧场昆牧镇", + "二二四团", + "二二五团玉泉镇" + ] + }, + { + "name": "胡杨河市", + "area": [ + "一二三团", + "一二四团", + "一二五团", + "一二六团", + "一二七团", + "一二八团", + "一二九团", + "一三零团", + "一三一团", + "一三七团" + ] + } + ] + }, + { + "name": "香港特别行政区", + "city": [ + { + "name": "香港特别行政区", + "area": [ + "中西区", + "湾仔区", + "东区", + "南区", + "油尖旺区", + "深水埗区", + "九龙城区", + "黄大仙区", + "观塘区", + "北区", + "大埔区", + "沙田区", + "西贡区", + "荃湾区", + "屯门区", + "元朗区", + "葵青区", + "离岛区" + ] + } + ] + }, + { + "name": "澳门特别行政区", + "city": [ + { + "name": "澳门特别行政区", + "area": [ + "花地玛堂区", + "圣安多尼堂区", + "大堂区", + "望德堂区", + "风顺堂区", + "嘉模堂区", + "圣方济各堂区", + "路氹城" + ] + } + ] + }, + { + "name": "台湾省", + "city": [ + { + "name": "台北市", + "area": [ + "中正区", + "大同区", + "中山区", + "万华区", + "信义区", + "松山区", + "大安区", + "南港区", + "北投区", + "内湖区", + "士林区", + "文山区" + ] + }, + { + "name": "新北市", + "area": [ + "板桥区", + "土城区", + "新庄区", + "新店区", + "深坑区", + "石碇区", + "坪林区", + "乌来区", + "五股区", + "八里区", + "林口区", + "淡水区", + "中和区", + "永和区", + "三重区", + "芦洲区", + "泰山区", + "树林区", + "莺歌区", + "三峡区", + "汐止区", + "金山区", + "万里区", + "三芝区", + "石门区", + "瑞芳区", + "贡寮区", + "双溪区", + "平溪区" + ] + }, + { + "name": "桃园市", + "area": [ + "桃园区", + "中坜区", + "平镇区", + "八德区", + "杨梅区", + "芦竹区", + "大溪区", + "龙潭区", + "龟山区", + "大园区", + "观音区", + "新屋区", + "复兴区" + ] + }, + { + "name": "台中市", + "area": [ + "中区", + "东区", + "西区", + "南区", + "北区", + "西屯区", + "南屯区", + "北屯区", + "丰原区", + "大里区", + "太平区", + "东势区", + "大甲区", + "清水区", + "沙鹿区", + "梧栖区", + "后里区", + "神冈区", + "潭子区", + "大雅区", + "新社区", + "石冈区", + "外埔区", + "大安区", + "乌日区", + "大肚区", + "龙井区", + "雾峰区", + "和平区" + ] + }, + { + "name": "台南市", + "area": [ + "中西区", + "东区", + "南区", + "北区", + "安平区", + "安南区", + "永康区", + "归仁区", + "新化区", + "左镇区", + "玉井区", + "楠西区", + "南化区", + "仁德区", + "关庙区", + "龙崎区", + "官田区", + "麻豆区", + "佳里区", + "西港区", + "七股区", + "将军区", + "学甲区", + "北门区", + "新营区", + "后壁区", + "白河区", + "东山区", + "六甲区", + "下营区", + "柳营区", + "盐水区", + "善化区", + "大内区", + "山上区", + "新市区", + "安定区" + ] + }, + { + "name": "高雄市", + "area": [ + "楠梓区", + "左营区", + "鼓山区", + "三民区", + "盐埕区", + "前金区", + "新兴区苓雅区", + "前镇区", + "旗津区", + "小港区", + "凤山区", + "大寮区", + "鸟松区", + "林园区", + "仁武区", + "大树区", + "大社区", + "冈山区", + "路竹区", + "桥头区", + "梓官区", + "弥陀区", + "永安区", + "燕巢区", + "阿莲区", + "茄萣区", + "湖内区", + "旗山区", + "美浓区", + "内门区", + "杉林区", + "甲仙区", + "六龟区", + "茂林区", + "桃源区", + "那玛夏区" + ] + } + ] + } +] \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/values/attrs.xml b/Android_Mireo/app/src/main/res/values/attrs.xml new file mode 100644 index 0000000..78554f9 --- /dev/null +++ b/Android_Mireo/app/src/main/res/values/attrs.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..c170210 --- /dev/null +++ b/Android_Mireo/app/src/main/res/values/colors.xml @@ -0,0 +1,26 @@ + + + @color/white + @color/black121418 + #5A8DDF + #F4F4F4 + #333333 + @color/panda + + #AA5A8DDF + #BBBBBB + #ECECEC + #7C7C7C + + #007AFF + #F44336 + #503981 + #D81B60 + #080B16 + #F56490 + #FF0049 + #999999 + #d9d9d9 + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/values/dimens.xml b/Android_Mireo/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..11688e0 --- /dev/null +++ b/Android_Mireo/app/src/main/res/values/dimens.xml @@ -0,0 +1,11 @@ + + + + 1px + + 999dp + + 15dp + + 120dp + \ 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 new file mode 100644 index 0000000..0e4da0e --- /dev/null +++ b/Android_Mireo/app/src/main/res/values/integers.xml @@ -0,0 +1,6 @@ + + + 200 + + 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 new file mode 100644 index 0000000..a9cb727 --- /dev/null +++ b/Android_Mireo/app/src/main/res/values/strings.xml @@ -0,0 +1,295 @@ + + Mireo TV + + Loading… + + unknown error + + Confirm + Cancel + + year + month + day + + hour + minute + second + + Restart + + Network Error + + Video error not support + Video error unknown + Error type:%d,Error code:%d + + Please enter your mobile phone number. + The mobile phone number is not entered correctly + + Please enter your password. + The two passwords are inconsistent. Please re-enter them + + Please enter the verification code. + Send verification code + The verification code has been sent. Please pay attention to checking your inbox. + code error + + Next + Complete + Commit + + Authorization Reminder + Permission grant failed. Please correctly grant the permission. + Permission acquisition failed. Please manually grant the permission. + Permission acquisition failed. Please manually grant %s. + The background location permission has not been granted. Please select "Always Allow". + Go to Authorization + + Calendar permission + Camera permission + Contacts permission + Location permission + Background location permission + Microphone permission + Phone permission + Call log permission + Body sensor permission + Fitness activity permission + SMS permission + Storage permission + + Permission for installing applications + Permission for notification bar + Permission for floating window + Permission for system settings + + There is no network connection at present. Please check your network settings. + There is no more data available. + + The security certificate of the current website has expired or is not trusted. Do you want to continue browsing? + Continue browsing + Return to the previous page + + The current website requires access to your geographical location. + Grant + Reject + + Current Number: %s + Make Call + Cancel + + Loading... + + + Request failed with unknown error + Login has expired. Please log in again + Data parsing failed. Please wait a moment + Server request timed out. Please try again later + Request failed. Please check your network settings + Server response is abnormal. Please try again later. Response code: %d, Response message: %s + Server connection is abnormal. Please try again later + Request has been interrupted. Please retry + Server data returned abnormally. Please try again later + File md5 verification failed + + + Empty + Request failed. Please try again. + Network error. Please try again. + Retry + + Please select a region + Please select + + Please select a date + + Please select a time + + Discover New Version + + Updated Content + + Let\'s talk about it later + Update immediately + + You must first grant the permission to download the update normally + + Downloading in progress + Downloading... %d%% + Download completed. Click to install + Download failed. Click to retry + + This version is already the latest one. + + update + Update Notification + + Share to … + + + WeChat + Moment + QQ + QQ Zone + Copy Link + + Copied to clipboard + + Please enter the payment password + + At least %d items need to be selected + Maximum of %d items can be selected + + Identity Verification + + Press again to exit + Home + Explore + Rewards + My list + Me + + + Register + Forget password? + Log in + + Other Login Methods + + Register + The mobile phone number is only used for login and to protect account security. + Set a login password of 6 to 18 characters. + Please re-enter the password. + + Setting title + Language Switch + Simplified Chinese + Traditional Chinese + Check for Updates + + Change Password + Modify Mobile Phone + + Auto-login + Clear Cache + + + Privacy Agreement + About Us + + Log out + + About Us + Android Wheel Brother + + Copyright © 2018 – 2021 + + Forget Password + + Set Login Password + Set a 6-18 character login password + Re-enter the password + The two passwords do not match. Please re-enter + Success in modifying + + Set New Mobile Phone Number + Please use the new mobile phone number you have changed for login next time + Bind Now + + Binding successful + + Personal Information + Profile Picture + + User ID + Nickname + Set a nickname + + Region + Please select + + Personal Data - Phone Number + Bind Now + + Web page loading.… + + Image Selection + All Images + + Total: %d images + + You can only select a maximum of %d images this time + + Cannot be selected. This image has been deleted. + + Failed to crop image. Your current phone does not support image cropping. + + Video Selection + All Videos + + Total: %d + + You can only select a maximum of %d videos this time + + Cannot be selected. This video has been deleted. + + Failed to launch camera + Invalid target address + + loading.... + HOME + RECOMMEND + REWARDS + ME + The service is abnormal. Check the network. + Watch Now + Watch + Continue Watching + login + My Favorites + Settings + Visitor + No content for the time being~ + Check the network and try again~ + Series + no more data. + UnFavorites + You may not find this collection after you uncollect it + Think again + Short Drama Rankings + More + Join + Sign in with Google + Sign in with Tiktok + Sign in with FaceBook + Google login exception. + Enter the content you want to search for + Search + Historical search + Please enter keywords for search. + Quit + Delete Account + Feedback + Please log in first + 1886904725382038 + fb1886904725382038 + b63e62471e03fc8a1ba13219ebd06363 + XW2aulJv9urKD4MIIFT1xcSCuyTHaDZ9qUbDqygnTLS04GkdX7WMQJviGP5vDRWGsk4OJJIyLGRV3mbLqOWx0W + guyantv + No record of spending at the moment + Top Up + Retry + Today\'s AD viewing limit is reached + 8463666 + Your account is already logged in on another device~ + The AD is still on its way + Please install the tiktok app~ + Google Pay Success + 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.]]>
+ + +
\ 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 new file mode 100644 index 0000000..d159236 --- /dev/null +++ b/Android_Mireo/app/src/main/res/values/styles.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/values/themes.xml b/Android_Mireo/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..19b0a24 --- /dev/null +++ b/Android_Mireo/app/src/main/res/values/themes.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/xml/file_paths.xml b/Android_Mireo/app/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..6dd23e2 --- /dev/null +++ b/Android_Mireo/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/app/src/main/res/xml/network_security_config.xml b/Android_Mireo/app/src/main/res/xml/network_security_config.xml new file mode 100644 index 0000000..dca93c0 --- /dev/null +++ b/Android_Mireo/app/src/main/res/xml/network_security_config.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Android_Mireo/build.gradle b/Android_Mireo/build.gradle new file mode 100644 index 0000000..b5a430f --- /dev/null +++ b/Android_Mireo/build.gradle @@ -0,0 +1,42 @@ +apply from : 'configs.gradle' + +buildscript { + + apply from : 'maven.gradle' + + repositories { + 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' + } +} + +allprojects { + + repositories { + maven { url 'https://repo1.maven.org/maven2' } + addCommonMaven(repositories) + } + + tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' + } + tasks.withType(Javadoc) { + options { + encoding 'UTF-8' + charSet 'UTF-8' + links 'http://docs.oracle.com/javase/7/docs/api' + } + } + + setBuildDir(new File(rootDir, "build/${path.replaceAll(':', '/')}")) +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/Android_Mireo/common.gradle b/Android_Mireo/common.gradle new file mode 100644 index 0000000..ea356f7 --- /dev/null +++ b/Android_Mireo/common.gradle @@ -0,0 +1,59 @@ +apply plugin: 'kotlin-android' + +android { + + compileSdk 34 + defaultConfig { + minSdk 21 + targetSdk 34 + versionName '1.0.0' + versionCode 32 + } + + compileOptions { + targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main { + jniLibs.srcDirs = ['libs'] + } + } + + buildTypes { + debug {} + preview {} + release {} + } + + lintOptions { + disable 'HardcodedText' + disable 'ContentDescription' + } +} + +afterEvaluate { + if (android.defaultConfig.applicationId == null && "umeng" != getName()) { + 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 'com.google.android.material:material:1.4.0' + + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0' + 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/configs.gradle b/Android_Mireo/configs.gradle new file mode 100644 index 0000000..2a5c61b --- /dev/null +++ b/Android_Mireo/configs.gradle @@ -0,0 +1,41 @@ +ext { + def SERVER_TYPE_TEST = "test" + def SERVER_TYPE_PREVIEW = "pre" + def SERVER_TYPE_PRODUCT = "product" + + def taskName = project.gradle.startParameter.taskNames[0] + if (taskName == null) { + taskName = "" + } + println "GradleLog TaskNameOutput " + taskName + + def serverType = SERVER_TYPE_PRODUCT + + if (taskName.endsWith("Debug")) { + serverType = SERVER_TYPE_TEST + } else if (taskName.endsWith("Preview")) { + serverType = SERVER_TYPE_PREVIEW + } + + if (project.hasProperty("ServerType")) { + serverType = project.properties["ServerType"] + } + + println "GradleLog ServerTypeOutput " + serverType + + switch(serverType) { + case SERVER_TYPE_TEST: + case SERVER_TYPE_PREVIEW: + LOG_ENABLE = true + if (serverType == SERVER_TYPE_PREVIEW) { + HOST_URL = "https://api-mireotv.mireotv.com/4da6fd4c/" + } else { + HOST_URL = "https://api-mireotv.mireotv.com/4da6fd4c/" + } + break + case SERVER_TYPE_PRODUCT: + LOG_ENABLE = false + HOST_URL = "https://api-mireotv.mireotv.com/4da6fd4c/" + break + } +} \ No newline at end of file diff --git a/Android_Mireo/gradle.properties b/Android_Mireo/gradle.properties new file mode 100644 index 0000000..8419537 --- /dev/null +++ b/Android_Mireo/gradle.properties @@ -0,0 +1,21 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel = true + +# 为 Studio 分配默认的内存大小 +org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8 + +# 表示使用 AndroidX +android.useAndroidX = true +# 表示将第三方库迁移到 AndroidX +android.enableJetifier = true \ No newline at end of file diff --git a/Android_Mireo/gradlew b/Android_Mireo/gradlew new file mode 100644 index 0000000..9d82f78 --- /dev/null +++ b/Android_Mireo/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/Android_Mireo/gradlew.bat b/Android_Mireo/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/Android_Mireo/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/Android_Mireo/library/base/build.gradle b/Android_Mireo/library/base/build.gradle new file mode 100644 index 0000000..888cf74 --- /dev/null +++ b/Android_Mireo/library/base/build.gradle @@ -0,0 +1,18 @@ +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 new file mode 100644 index 0000000..d076383 --- /dev/null +++ b/Android_Mireo/library/base/proguard-base.pro @@ -0,0 +1,61 @@ +# 基于 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 new file mode 100644 index 0000000..47d69f1 --- /dev/null +++ b/Android_Mireo/library/base/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseActivity.kt b/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseActivity.kt new file mode 100644 index 0000000..653b7d7 --- /dev/null +++ b/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseActivity.kt @@ -0,0 +1,141 @@ +package com.hjq.base + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.util.SparseArray +import android.view.KeyEvent +import android.view.ViewGroup +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 kotlin.math.pow + +abstract class BaseActivity : AppCompatActivity(), ActivityAction, + ClickAction, HandlerAction, BundleAction, KeyboardAction { + + companion object { + + const val RESULT_ERROR: Int = -2 + } + + private val activityCallbacks: SparseArray by lazy { SparseArray(1) } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initActivity() + } + + protected open fun initActivity() { + initLayout() + initView() + initData() + } + + protected abstract fun getLayoutId(): Int + + protected abstract fun initView() + + protected abstract fun initData() + + protected open fun initLayout() { + if (getLayoutId() > 0) { + setContentView(getLayoutId()) + initSoftKeyboard() + } + } + + protected open fun initSoftKeyboard() { + getContentView()?.setOnClickListener { + hideKeyboard(currentFocus) + } + } + + override fun onDestroy() { + super.onDestroy() + removeCallbacks() + } + + override fun finish() { + super.finish() + hideKeyboard(currentFocus) + } + + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + setIntent(intent) + } + + override fun getBundle(): Bundle? { + return intent.extras + } + + open fun getContentView(): ViewGroup? { + return findViewById(Window.ID_ANDROID_CONTENT) + } + + override fun getContext(): Context { + return this + } + + override fun startActivity(intent: Intent) { + return super.startActivity(intent) + } + + 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) { + continue + } + if (fragment.dispatchKeyEvent(event)) { + return true + } + } + return super.dispatchKeyEvent(event) + } + + @Suppress("deprecation") + override fun startActivityForResult(intent: Intent, requestCode: Int, options: Bundle?) { + hideKeyboard(currentFocus) + super.startActivityForResult(intent, requestCode, options) + } + + /** + * startActivityForResult + */ + open fun startActivityForResult(clazz: Class, callback: OnActivityCallback?) { + startActivityForResult(Intent(this, clazz), null, callback) + } + + open fun startActivityForResult(intent: Intent, callback: OnActivityCallback?) { + startActivityForResult(intent, null, callback) + } + + @Suppress("deprecation") + 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) + } + + @Suppress("deprecation") + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + var callback: OnActivityCallback? + if ((activityCallbacks.get(requestCode).also { callback = it }) != null) { + callback?.onActivityResult(resultCode, data) + activityCallbacks.remove(requestCode) + return + } + super.onActivityResult(requestCode, resultCode, data) + } + + interface OnActivityCallback { + + fun onActivityResult(resultCode: Int, data: Intent?) + } +} \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseAdapter.kt b/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseAdapter.kt new file mode 100644 index 0000000..95c6591 --- /dev/null +++ b/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseAdapter.kt @@ -0,0 +1,179 @@ +package com.hjq.base + +import android.content.Context +import android.util.SparseArray +import android.view.LayoutInflater +import android.view.View +import android.view.View.OnLongClickListener +import androidx.annotation.IdRes +import androidx.annotation.LayoutRes +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.hjq.base.action.ResourcesAction + +@Suppress("LeakingThis") +abstract class BaseAdapter.BaseViewHolder>(private val context: Context) : + RecyclerView.Adapter(), ResourcesAction { + + private var recyclerView: RecyclerView? = null + + private var itemClickListener: OnItemClickListener? = null + + private var itemLongClickListener: OnItemLongClickListener? = null + + private val childClickListeners: SparseArray by lazy { SparseArray() } + + private val childLongClickListeners: SparseArray by lazy { SparseArray() } + + private var positionOffset: Int = 0 + + override fun onBindViewHolder(holder: VH, position: Int) { + positionOffset = position - holder.adapterPosition + holder.onBindView(position) + } + + open fun getRecyclerView(): RecyclerView? { + return recyclerView + } + + override fun getContext(): Context { + return context + } + + abstract inner class BaseViewHolder constructor(itemView: View) : + RecyclerView.ViewHolder(itemView), View.OnClickListener, OnLongClickListener { + + constructor(@LayoutRes id: Int) : this( + LayoutInflater.from(getContext()).inflate(id, recyclerView, false) + ) + + init { + if (itemClickListener != null) { + itemView.setOnClickListener(this) + } + + if (itemLongClickListener != null) { + itemView.setOnLongClickListener(this) + } + + for (i in 0 until childClickListeners.size()) { + findViewById(childClickListeners.keyAt(i))?.setOnClickListener(this) + } + + for (i in 0 until childLongClickListeners.size()) { + findViewById(childLongClickListeners.keyAt(i))?.setOnLongClickListener(this) + } + } + + abstract fun onBindView(position: Int) + + protected open fun getViewHolderPosition(): Int { + return layoutPosition + positionOffset + } + + /** + * [View.OnClickListener] + */ + override fun onClick(view: View) { + val position: Int = getViewHolderPosition() + if (position < 0 || position >= itemCount) { + return + } + if (view === getItemView()) { + itemClickListener?.onItemClick(recyclerView, view, position) + return + } + childClickListeners.get(view.id)?.onChildClick(recyclerView, view, position) + } + + /** + * [View.OnLongClickListener] + */ + override fun onLongClick(view: View): Boolean { + val position: Int = getViewHolderPosition() + if (position < 0 || position >= itemCount) { + return false + } + if (view === getItemView()) { + if (itemLongClickListener != null) { + return itemLongClickListener!!.onItemLongClick(recyclerView, view, position) + } + return false + } + val listener: OnChildLongClickListener? = childLongClickListeners.get(view.id) + if (listener != null) { + return listener.onChildLongClick(recyclerView, view, position) + } + return false + } + + open fun getItemView(): View { + return itemView + } + + open fun findViewById(@IdRes id: Int): V? { + return getItemView().findViewById(id) + } + } + + override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { + this.recyclerView = recyclerView + if (this.recyclerView?.layoutManager == null) { + this.recyclerView?.layoutManager = generateDefaultLayoutManager(context) + } + } + + override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) { + this.recyclerView = null + } + + protected open fun generateDefaultLayoutManager(context: Context): RecyclerView.LayoutManager? { + return LinearLayoutManager(context) + } + + open fun setOnItemClickListener(listener: OnItemClickListener?) { + checkRecyclerViewState() + itemClickListener = listener + } + + open fun setOnChildClickListener(@IdRes id: Int, listener: OnChildClickListener?) { + checkRecyclerViewState() + childClickListeners.put(id, listener) + } + + open fun setOnItemLongClickListener(listener: OnItemLongClickListener?) { + checkRecyclerViewState() + itemLongClickListener = listener + } + + open fun setOnChildLongClickListener(@IdRes id: Int, listener: OnChildLongClickListener?) { + checkRecyclerViewState() + childLongClickListeners.put(id, listener) + } + + private fun checkRecyclerViewState() { + if (recyclerView != null) { + // 必须在 RecyclerView.setAdapter() 之前设置监听 + throw IllegalStateException("are you ok?") + } + } + + interface OnItemClickListener { + + fun onItemClick(recyclerView: RecyclerView?, itemView: View?, position: Int) + } + + interface OnItemLongClickListener { + + fun onItemLongClick(recyclerView: RecyclerView?, itemView: View?, position: Int): Boolean + } + + interface OnChildClickListener { + + fun onChildClick(recyclerView: RecyclerView?, childView: View?, position: Int) + } + + interface OnChildLongClickListener { + fun onChildLongClick(recyclerView: RecyclerView?, childView: View?, position: Int): Boolean + } +} \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseDialog.kt b/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseDialog.kt new file mode 100644 index 0000000..fc8a40b --- /dev/null +++ b/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseDialog.kt @@ -0,0 +1,935 @@ +package com.hjq.base + +import android.app.Activity +import android.app.Application.ActivityLifecycleCallbacks +import android.content.Context +import android.content.DialogInterface +import android.graphics.drawable.Drawable +import android.os.Build +import android.os.Bundle +import android.util.SparseArray +import android.view.Gravity +import android.view.KeyEvent +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.Window +import android.view.WindowManager +import android.view.inputmethod.InputMethodManager +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.annotation.ColorInt +import androidx.annotation.DrawableRes +import androidx.annotation.FloatRange +import androidx.annotation.IdRes +import androidx.annotation.LayoutRes +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 java.lang.ref.SoftReference + +@Suppress("LeakingThis") +open class BaseDialog constructor( + context: Context, + @StyleRes themeResId: Int = R.style.BaseDialogTheme +) : + AppCompatDialog(context, themeResId), LifecycleOwner, ActivityAction, ResourcesAction, + HandlerAction, ClickAction, AnimAction, KeyboardAction, DialogInterface.OnShowListener, + DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { + + private val listeners: ListenersWrapper = ListenersWrapper(this) + override val lifecycle: LifecycleRegistry = LifecycleRegistry(this) + private var showListeners: MutableList? = null + private var cancelListeners: MutableList? = null + private var dismissListeners: MutableList? = null + + open fun getContentView(): View? { + val contentView: View? = findViewById(Window.ID_ANDROID_CONTENT) + if (contentView is ViewGroup && contentView.childCount == 1) { + return contentView.getChildAt(0) + } + return contentView + } + + open fun setWidth(width: Int) { + val window: Window = window ?: return + val params: WindowManager.LayoutParams? = window.attributes + params?.width = width + window.attributes = params + } + + open fun setHeight(height: Int) { + val window: Window = window ?: return + val params: WindowManager.LayoutParams? = window.attributes + params?.height = height + window.attributes = params + } + + open fun setXOffset(offset: Int) { + val window: Window = window ?: return + val params: WindowManager.LayoutParams? = window.attributes + params?.x = offset + window.attributes = params + } + + open fun setYOffset(offset: Int) { + val window: Window = window ?: return + val params: WindowManager.LayoutParams? = window.attributes + params?.y = offset + window.attributes = params + } + + open fun getGravity(): Int { + val window: Window = window ?: return Gravity.NO_GRAVITY + val params: WindowManager.LayoutParams = window.attributes ?: return Gravity.NO_GRAVITY + return params.gravity + } + + open fun setGravity(gravity: Int) { + window?.setGravity(gravity) + } + + open fun setWindowAnimations(@StyleRes id: Int) { + window?.setWindowAnimations(id) + } + + open fun getWindowAnimations(): Int { + val window: Window = window ?: return AnimAction.ANIM_DEFAULT + return window.attributes.windowAnimations + } + + open fun setBackgroundDimEnabled(enabled: Boolean) { + if (enabled) { + window?.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) + } else { + window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) + } + } + open fun setBackgroundDimAmount(@FloatRange(from = 0.0, to = 1.0) dimAmount: Float) { + window?.setDimAmount(dimAmount) + } + + override fun dismiss() { + removeCallbacks() + val focusView: View? = currentFocus + if (focusView != null) { + getSystemService(InputMethodManager::class.java).hideSoftInputFromWindow( + focusView.windowToken, + 0 + ) + } + super.dismiss() + } + + @Deprecated("Please use {@link #addOnShowListener(BaseDialog.OnShowListener)}}") + override fun setOnShowListener(listener: DialogInterface.OnShowListener?) { + if (listener == null) { + return + } + addOnShowListener(ShowListenerWrapper(listener)) + } + + @Deprecated("Please use {@link #addOnCancelListener(BaseDialog.OnCancelListener)}") + override fun setOnCancelListener(listener: DialogInterface.OnCancelListener?) { + if (listener == null) { + return + } + addOnCancelListener(CancelListenerWrapper(listener)) + } + + @Deprecated("Please use {@link #addOnDismissListener(BaseDialog.OnDismissListener)}") + override fun setOnDismissListener(listener: DialogInterface.OnDismissListener?) { + if (listener == null) { + return + } + addOnDismissListener(DismissListenerWrapper(listener)) + } + + @Deprecated( + "Please use {@link #setOnKeyListener(BaseDialog.OnKeyListener)}", ReplaceWith( + "super.setOnKeyListener(listener)", + "androidx.appcompat.app.AppCompatDialog" + ) + ) + override fun setOnKeyListener(listener: DialogInterface.OnKeyListener?) { + super.setOnKeyListener(listener) + } + + open fun setOnKeyListener(listener: OnKeyListener?) { + super.setOnKeyListener(KeyListenerWrapper(listener)) + } + + open fun addOnShowListener(listener: OnShowListener?) { + if (showListeners == null) { + showListeners = ArrayList() + super.setOnShowListener(listeners) + } + showListeners?.add(listener) + } + + open fun addOnCancelListener(listener: OnCancelListener?) { + if (cancelListeners == null) { + cancelListeners = ArrayList() + super.setOnCancelListener(listeners) + } + cancelListeners?.add(listener) + } + + open fun addOnDismissListener(listener: OnDismissListener?) { + if (dismissListeners == null) { + dismissListeners = ArrayList() + super.setOnDismissListener(listeners) + } + dismissListeners?.add(listener) + } + + open fun removeOnShowListener(listener: OnShowListener?) { + showListeners?.remove(listener) + } + + open fun removeOnCancelListener(listener: OnCancelListener?) { + cancelListeners?.remove(listener) + } + + open fun removeOnDismissListener(listener: OnDismissListener?) { + dismissListeners?.remove(listener) + } + + private fun setOnShowListeners(listeners: MutableList?) { + super.setOnShowListener(this.listeners) + showListeners = listeners + } + + private fun setOnCancelListeners(listeners: MutableList?) { + super.setOnCancelListener(this.listeners) + cancelListeners = listeners + } + + private fun setOnDismissListeners(listeners: MutableList?) { + super.setOnDismissListener(this.listeners) + dismissListeners = listeners + } + + /** + * [DialogInterface.OnShowListener] + */ + override fun onShow(dialog: DialogInterface?) { + lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_RESUME) + showListeners?.let { + for (i in it.indices) { + it[i]?.onShow(this) + } + } + } + + /** + * [DialogInterface.OnCancelListener] + */ + override fun onCancel(dialog: DialogInterface?) { + cancelListeners?.let { + for (i in it.indices) { + it[i]?.onCancel(this) + } + } + } + + /** + * [DialogInterface.OnDismissListener] + */ + override fun onDismiss(dialog: DialogInterface?) { + lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY) + dismissListeners?.let { + for (i in it.indices) { + it[i]?.onDismiss(this) + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_CREATE) + } + + override fun onStart() { + super.onStart() + lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START) + } + + override fun onStop() { + super.onStop() + lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP) + } + + @Suppress("UNCHECKED_CAST") + open class Builder> constructor(private val context: Context) : + ActivityAction, ResourcesAction, ClickAction, KeyboardAction { + + private var dialog: BaseDialog? = null + + private var contentView: View? = null + + private var themeId: Int = R.style.BaseDialogTheme + + private var animStyle: Int = AnimAction.ANIM_DEFAULT + + private var width: Int = WindowManager.LayoutParams.WRAP_CONTENT + private var height: Int = WindowManager.LayoutParams.WRAP_CONTENT + + private var gravity: Int = Gravity.NO_GRAVITY + + private var xOffset: Int = 0 + + private var yOffset: Int = 0 + + private var cancelable: Boolean = true + + private var canceledOnTouchOutside: Boolean = true + + private var backgroundDimEnabled: Boolean = true + + private var backgroundDimAmount: Float = 0.5f + + private var createListener: OnCreateListener? = null + + private val showListeners: MutableList by lazy { ArrayList() } + + private val cancelListeners: MutableList by lazy { ArrayList() } + + private val dismissListeners: MutableList by lazy { ArrayList() } + + private var keyListener: OnKeyListener? = null + + private var clickArray: SparseArray?>? = null + + open fun setContentView(@LayoutRes id: Int): B { + return setContentView( + LayoutInflater.from(context).inflate(id, FrameLayout(context), false) + ) + } + + open fun setContentView(view: View?): B { + if (view == null) { + throw IllegalArgumentException("are you ok?") + } + contentView = view + if (isCreated()) { + dialog?.setContentView(view) + return this as B + } + val layoutParams: ViewGroup.LayoutParams? = contentView?.layoutParams + if ((layoutParams != null) && (width == ViewGroup.LayoutParams.WRAP_CONTENT) && (height == ViewGroup.LayoutParams.WRAP_CONTENT)) { + setWidth(layoutParams.width) + setHeight(layoutParams.height) + } + + if (gravity == Gravity.NO_GRAVITY) { + if (layoutParams is FrameLayout.LayoutParams) { + val gravity: Int = layoutParams.gravity + if (gravity != FrameLayout.LayoutParams.UNSPECIFIED_GRAVITY) { + setGravity(gravity) + } + } else if (layoutParams is LinearLayout.LayoutParams) { + val gravity: Int = layoutParams.gravity + if (gravity != Gravity.NO_GRAVITY) { + setGravity(gravity) + } + } + if (gravity == Gravity.NO_GRAVITY) { + setGravity(Gravity.CENTER) + } + } + return this as B + } + + open fun setThemeStyle(@StyleRes id: Int): B { + themeId = id + if (isCreated()) { + throw IllegalStateException("are you ok?") + } + return this as B + } + + open fun setAnimStyle(@StyleRes id: Int): B { + animStyle = id + if (isCreated()) { + dialog?.setWindowAnimations(id) + } + return this as B + } + + open fun setWidth(width: Int): B { + this.width = width + if (isCreated()) { + dialog?.setWidth(width) + return this as B + } + + + val params: ViewGroup.LayoutParams? = contentView?.layoutParams + if (params != null) { + params.width = width + contentView?.layoutParams = params + } + return this as B + } + + open fun setHeight(height: Int): B { + this.height = height + if (isCreated()) { + dialog?.setHeight(height) + return this as B + } + + val params: ViewGroup.LayoutParams? = contentView?.layoutParams + if (params != null) { + params.height = height + contentView?.layoutParams = params + } + return this as B + } + + open fun setGravity(gravity: Int): B { + this.gravity = + Gravity.getAbsoluteGravity(gravity, getResources().configuration.layoutDirection) + if (isCreated()) { + dialog?.setGravity(gravity) + } + return this as B + } + + open fun setXOffset(offset: Int): B { + xOffset = offset + if (isCreated()) { + dialog?.setXOffset(offset) + } + return this as B + } + + open fun setYOffset(offset: Int): B { + yOffset = offset + if (isCreated()) { + this.dialog?.setYOffset(offset) + } + return this as B + } + + open fun setCancelable(cancelable: Boolean): B { + this.cancelable = cancelable + if (isCreated()) { + dialog?.setCancelable(cancelable) + } + return this as B + } + + open fun setCanceledOnTouchOutside(cancel: Boolean): B { + canceledOnTouchOutside = cancel + if (isCreated() && cancelable) { + dialog?.setCanceledOnTouchOutside(cancel) + } + return this as B + } + + open fun setBackgroundDimEnabled(enabled: Boolean): B { + backgroundDimEnabled = enabled + if (isCreated()) { + dialog?.setBackgroundDimEnabled(enabled) + } + return this as B + } + + open fun setBackgroundDimAmount(@FloatRange(from = 0.0, to = 1.0) dimAmount: Float): B { + backgroundDimAmount = dimAmount + if (isCreated()) { + dialog?.setBackgroundDimAmount(dimAmount) + } + return this as B + } + + open fun setOnCreateListener(listener: OnCreateListener): B { + createListener = listener + return this as B + } + + open fun addOnShowListener(listener: OnShowListener): B { + showListeners.add(listener) + return this as B + } + + open fun addOnCancelListener(listener: OnCancelListener): B { + cancelListeners.add(listener) + return this as B + } + + open fun addOnDismissListener(listener: OnDismissListener): B { + dismissListeners.add(listener) + return this as B + } + + open fun setOnKeyListener(listener: OnKeyListener): B { + keyListener = listener + if (isCreated()) { + dialog?.setOnKeyListener(listener) + } + return this as B + } + + open fun setText(@IdRes viewId: Int, @StringRes stringId: Int): B { + return setText(viewId, getString(stringId)) + } + + open fun setText(@IdRes id: Int, text: CharSequence?): B { + (findViewById(id) as TextView?)?.text = text + return this as B + } + + open fun setTextColor(@IdRes id: Int, @ColorInt color: Int): B { + (findViewById(id) as TextView?)?.setTextColor(color) + return this as B + } + + open fun setHint(@IdRes viewId: Int, @StringRes stringId: Int): B { + return setHint(viewId, getString(stringId)) + } + + open fun setHint(@IdRes id: Int, text: CharSequence?): B { + (findViewById(id) as TextView?)?.hint = text + return this as B + } + + open fun setVisibility(@IdRes id: Int, visibility: Int): B { + findViewById(id)?.visibility = visibility + return this as B + } + + open fun setBackground(@IdRes viewId: Int, @DrawableRes drawableId: Int): B { + return setBackground(viewId, ContextCompat.getDrawable(context, drawableId)) + } + + open fun setBackground(@IdRes id: Int, drawable: Drawable?): B { + findViewById(id)?.background = drawable + return this as B + } + + open fun setImageDrawable(@IdRes viewId: Int, @DrawableRes drawableId: Int): B { + return setBackground(viewId, ContextCompat.getDrawable(context, drawableId)) + } + + open fun setImageDrawable(@IdRes id: Int, drawable: Drawable?): B { + (findViewById(id) as ImageView?)?.setImageDrawable(drawable) + return this as B + } + + open fun setOnClickListener(@IdRes id: Int, listener: OnClickListener): B { + if (clickArray == null) { + clickArray = SparseArray() + } + clickArray!!.put(id, listener as OnClickListener) + if (isCreated()) { + dialog?.findViewById(id) + ?.setOnClickListener(ViewClickWrapper(dialog, listener)) + } + return this as B + } + + @Suppress("RtlHardcoded") + open fun create(): BaseDialog { + if (contentView == null) { + throw IllegalArgumentException("are you ok?") + } + + if (isShowing()) { + dismiss() + } + + if (gravity == Gravity.NO_GRAVITY) { + gravity = Gravity.CENTER + } + + if (animStyle == AnimAction.ANIM_DEFAULT) { + animStyle = when (gravity) { + Gravity.TOP -> AnimAction.ANIM_TOP + Gravity.BOTTOM -> AnimAction.ANIM_BOTTOM + Gravity.LEFT -> AnimAction.ANIM_LEFT + Gravity.RIGHT -> AnimAction.ANIM_RIGHT + else -> AnimAction.ANIM_DEFAULT + } + } + + dialog = createDialog(context, themeId) + dialog!!.let { dialog -> + dialog.setContentView(contentView!!) + dialog.setCancelable(cancelable) + if (cancelable) { + dialog.setCanceledOnTouchOutside(canceledOnTouchOutside) + } + dialog.setOnShowListeners(showListeners) + dialog.setOnCancelListeners(cancelListeners) + dialog.setOnDismissListeners(dismissListeners) + dialog.setOnKeyListener(keyListener) + val window: Window? = dialog.window + if (window != null) { + val params: WindowManager.LayoutParams = window.attributes + params.width = width + params.height = height + params.gravity = gravity + params.x = xOffset + params.y = yOffset + params.windowAnimations = animStyle + + if (backgroundDimEnabled) { + window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) + window.setDimAmount(backgroundDimAmount) + } else { + window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) + } + window.attributes = params + } + + clickArray?.let { array -> + var i = 0 + while (i < array.size()) { + contentView!!.findViewById(array.keyAt(i)) + ?.setOnClickListener(ViewClickWrapper(dialog, array.valueAt(i))) + i++ + } + } + + getActivity()?.let { activity -> + DialogLifecycle.with(activity, dialog) + } + createListener?.onCreate(dialog) + } + return dialog!! + } + + open fun show() { + val activity = getActivity() + if (activity == null || activity.isFinishing || activity.isDestroyed) { + return + } + if (!isCreated()) { + create() + } + if (isShowing()) { + return + } + dialog?.show() + } + + open fun dismiss() { + val activity = getActivity() + if (activity == null || activity.isFinishing || activity.isDestroyed) { + return + } + dialog?.dismiss() + } + + override fun getContext(): Context { + return context + } + + open fun isCreated(): Boolean { + return dialog != null + } + + open fun isShowing(): Boolean { + return isCreated() && dialog!!.isShowing + } + + protected open fun createDialog(context: Context, @StyleRes themeId: Int): BaseDialog { + return BaseDialog(context, themeId) + } + + open fun post(runnable: Runnable) { + if (isShowing()) { + dialog?.post(runnable) + } else { + addOnShowListener(ShowPostWrapper(runnable)) + } + } + + open fun postDelayed(runnable: Runnable, delayMillis: Long) { + if (isShowing()) { + dialog?.postDelayed(runnable, delayMillis) + } else { + addOnShowListener(ShowPostDelayedWrapper(runnable, delayMillis)) + } + } + + open fun postAtTime(runnable: Runnable, uptimeMillis: Long) { + if (isShowing()) { + dialog?.postAtTime(runnable, uptimeMillis) + } else { + addOnShowListener(ShowPostAtTimeWrapper(runnable, uptimeMillis)) + } + } + + open fun getContentView(): View? { + return contentView + } + + override fun findViewById(@IdRes id: Int): V? { + if (contentView == null) { + throw IllegalStateException("are you ok?") + } + return contentView!!.findViewById(id) + } + + open fun getDialog(): BaseDialog? { + return dialog + } + } + + private class DialogLifecycle( + private var activity: Activity?, + private var dialog: BaseDialog? + ) : + ActivityLifecycleCallbacks, OnShowListener, OnDismissListener { + + companion object { + + fun with(activity: Activity, dialog: BaseDialog?) { + DialogLifecycle(activity, dialog) + } + } + + init { + this.dialog?.addOnShowListener(this) + this.dialog?.addOnDismissListener(this) + } + + private var dialogAnim: Int = 0 + + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {} + + override fun onActivityStarted(activity: Activity) {} + + override fun onActivityResumed(activity: Activity) { + if (activity !== activity) { + return + } + + dialog?.let { + if (!it.isShowing) { + return + } + + it.postDelayed({ + if (!it.isShowing) { + return@postDelayed + } + it.setWindowAnimations(dialogAnim) + }, 100) + } + } + + override fun onActivityPaused(activity: Activity) { + if (this.activity !== activity) { + return + } + + this.dialog?.let { + if (!it.isShowing) { + return + } + + dialogAnim = it.getWindowAnimations() + it.setWindowAnimations(AnimAction.ANIM_EMPTY) + } + } + + override fun onActivityStopped(activity: Activity) {} + + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} + + override fun onActivityDestroyed(activity: Activity) { + if (this.activity !== activity) { + return + } + unregisterActivityLifecycleCallbacks() + this.activity = null + this.dialog?.let { + it.removeOnShowListener(this) + it.removeOnDismissListener(this) + if (it.isShowing) { + it.dismiss() + } + } + this.dialog = null + } + + override fun onShow(dialog: BaseDialog?) { + this.dialog = dialog + registerActivityLifecycleCallbacks() + } + + override fun onDismiss(dialog: BaseDialog?) { + this.dialog = null + unregisterActivityLifecycleCallbacks() + } + + private fun registerActivityLifecycleCallbacks() { + activity?.let { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + it.registerActivityLifecycleCallbacks(this) + } else { + it.application.registerActivityLifecycleCallbacks(this) + } + } + } + + private fun unregisterActivityLifecycleCallbacks() { + activity?.let { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + it.unregisterActivityLifecycleCallbacks(this) + } else { + it.application.unregisterActivityLifecycleCallbacks(this) + } + } + } + } + + private class ListenersWrapper(referent: T?) : + SoftReference(referent), DialogInterface.OnShowListener, + DialogInterface.OnCancelListener, + DialogInterface.OnDismissListener + where T : DialogInterface.OnShowListener, + T : DialogInterface.OnCancelListener, + T : DialogInterface.OnDismissListener { + + override fun onShow(dialog: DialogInterface?) { + get()?.onShow(dialog) + } + + override fun onCancel(dialog: DialogInterface?) { + get()?.onCancel(dialog) + } + + override fun onDismiss(dialog: DialogInterface?) { + get()?.onDismiss(dialog) + } + } + + private class ViewClickWrapper constructor( + private val dialog: BaseDialog?, + private val listener: OnClickListener? + ) : View.OnClickListener { + + override fun onClick(view: View) { + listener?.onClick(dialog, view) + } + } + + private class ShowListenerWrapper constructor(referent: DialogInterface.OnShowListener?) : + SoftReference(referent), OnShowListener { + + override fun onShow(dialog: BaseDialog?) { + get()?.onShow(dialog) + } + } + + private class CancelListenerWrapper constructor(referent: DialogInterface.OnCancelListener?) : + SoftReference(referent), OnCancelListener { + + override fun onCancel(dialog: BaseDialog?) { + get()?.onCancel(dialog) + } + } + + private class DismissListenerWrapper constructor(referent: DialogInterface.OnDismissListener?) : + SoftReference(referent), OnDismissListener { + + override fun onDismiss(dialog: BaseDialog?) { + get()?.onDismiss(dialog) + } + } + + private class KeyListenerWrapper constructor(private val listener: OnKeyListener?) : + DialogInterface.OnKeyListener { + + override fun onKey(dialog: DialogInterface?, keyCode: Int, event: KeyEvent?): Boolean { + if (listener == null || dialog !is BaseDialog) { + return false + } + return listener.onKey(dialog, event) + } + } + + private class ShowPostWrapper constructor(private val runnable: Runnable?) : OnShowListener { + + override fun onShow(dialog: BaseDialog?) { + if (runnable == null) { + return + } + dialog?.removeOnShowListener(this) + dialog?.post(runnable) + } + } + + private class ShowPostDelayedWrapper constructor( + private val runnable: Runnable?, + private val delayMillis: Long + ) : OnShowListener { + + override fun onShow(dialog: BaseDialog?) { + if (runnable == null) { + return + } + dialog?.removeOnShowListener(this) + dialog?.postDelayed(runnable, delayMillis) + } + } + + private class ShowPostAtTimeWrapper constructor( + private val runnable: Runnable, + private val uptimeMillis: Long + ) : OnShowListener { + + override fun onShow(dialog: BaseDialog?) { + dialog?.removeOnShowListener(this) + dialog?.postAtTime(runnable, uptimeMillis) + } + } + + interface OnClickListener { + + fun onClick(dialog: BaseDialog?, view: V) + } + + interface OnCreateListener { + + fun onCreate(dialog: BaseDialog?) + } + + interface OnShowListener { + + fun onShow(dialog: BaseDialog?) + } + + interface OnCancelListener { + + fun onCancel(dialog: BaseDialog?) + } + + interface OnDismissListener { + + fun onDismiss(dialog: BaseDialog?) + } + + interface OnKeyListener { + + fun onKey(dialog: BaseDialog?, event: KeyEvent?): Boolean + } +} \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseFragment.kt b/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseFragment.kt new file mode 100644 index 0000000..46c9c1d --- /dev/null +++ b/Android_Mireo/library/base/src/main/java/com/hjq/base/BaseFragment.kt @@ -0,0 +1,166 @@ +package com.hjq.base + +import android.app.Activity +import android.app.Application +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.KeyEvent +import android.view.LayoutInflater +import android.view.View +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 + +abstract class BaseFragment
: Fragment(), + HandlerAction, ClickAction, BundleAction, KeyboardAction { + + private var activity: A? = null + + private var rootView: View? = null + + private var loading: Boolean = false + + @Suppress("UNCHECKED_CAST") + override fun onAttach(context: Context) { + super.onAttach(context) + activity = requireActivity() as A + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (getLayoutId() <= 0) { + return null + } + loading = false + rootView = inflater.inflate(getLayoutId(), container, false) + initView() + return rootView + } + + override fun onResume() { + super.onResume() + if (!loading) { + loading = true + initData() + onFragmentResume(true) + return + } + + if (this.activity?.lifecycle?.currentState == Lifecycle.State.STARTED) { + onActivityResume() + } else { + onFragmentResume(false) + } + } + + protected open fun onFragmentResume(first: Boolean) {} + + protected open fun onActivityResume() {} + + override fun onDestroyView() { + super.onDestroyView() + rootView = null + } + + override fun onDestroy() { + super.onDestroy() + loading = false + removeCallbacks() + } + + override fun onDetach() { + super.onDetach() + activity = null + } + + open fun isLoading(): Boolean { + return loading + } + + override fun getView(): View? { + return rootView + } + + open fun getAttachActivity(): A? { + return activity + } + + open fun getApplication(): Application? { + activity?.let { return it.application } + return null + } + + protected abstract fun getLayoutId(): Int + + protected abstract fun initView() + + protected abstract fun initData() + + override fun findViewById(@IdRes id: Int): V? { + return rootView?.findViewById(id) + } + + override fun getBundle(): Bundle? { + return arguments + } + + open fun startActivity(clazz: Class) { + startActivity(Intent(context, clazz)) + } + + open fun startActivityForResult(clazz: Class, callback: OnActivityCallback?) { + activity?.startActivityForResult(clazz, callback) + } + + open fun startActivityForResult(intent: Intent, callback: OnActivityCallback?) { + activity?.startActivityForResult(intent, null, callback) + } + + open fun startActivityForResult(intent: Intent, options: Bundle?, callback: OnActivityCallback?) { + activity?.startActivityForResult(intent, options, callback) + } + + open fun finish() { + this.activity?.let { + if (it.isFinishing || it.isDestroyed) { + return + } + it.finish() + } + } + + open fun dispatchKeyEvent(event: KeyEvent?): Boolean { + val fragments: MutableList = childFragmentManager.fragments + for (fragment: Fragment? in fragments) { + if (fragment !is BaseFragment<*> || fragment.lifecycle.currentState != Lifecycle.State.RESUMED) { + continue + } + if (fragment.dispatchKeyEvent(event)) { + return true + } + } + return when (event?.action) { + KeyEvent.ACTION_DOWN -> onKeyDown(event.keyCode, event) + KeyEvent.ACTION_UP -> onKeyUp(event.keyCode, event) + else -> false + } + } + + open fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return false + } + + open fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { + return false + } + + override fun getContext(): Context? { + return activity + } +} \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/FragmentPagerAdapter.kt b/Android_Mireo/library/base/src/main/java/com/hjq/base/FragmentPagerAdapter.kt new file mode 100644 index 0000000..9d64bfc --- /dev/null +++ b/Android_Mireo/library/base/src/main/java/com/hjq/base/FragmentPagerAdapter.kt @@ -0,0 +1,99 @@ +package com.hjq.base + +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter +import androidx.viewpager.widget.ViewPager +import java.util.* + +@Suppress("deprecation") +open class FragmentPagerAdapter constructor(manager: FragmentManager) : + FragmentPagerAdapter(manager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + private val fragmentSet: MutableList = ArrayList() + + private val fragmentTitle: MutableList = ArrayList() + + private var showFragment: F? = null + + private var viewPager: ViewPager? = null + + private var lazyMode: Boolean = true + + constructor(activity: FragmentActivity) : this(activity.supportFragmentManager) + + constructor(fragment: Fragment) : this(fragment.childFragmentManager) + + override fun getItem(position: Int): F { + return fragmentSet[position] + } + + override fun getItemId(position: Int): Long { + return getItem(position).hashCode().toLong() + } + + override fun getCount(): Int { + return fragmentSet.size + } + + override fun getPageTitle(position: Int): CharSequence? { + return fragmentTitle[position] + } + + @Suppress("UNCHECKED_CAST") + override fun setPrimaryItem(container: ViewGroup, position: Int, `object`: Any) { + super.setPrimaryItem(container, position, `object`) + if (getShowFragment() !== `object`) { + showFragment = `object` as F + } + } + + @JvmOverloads + open fun addFragment(fragment: F, title: CharSequence? = null) { + fragmentSet.add(fragment) + fragmentTitle.add(title ?: "") + if (viewPager == null) { + return + } + notifyDataSetChanged() + viewPager?.offscreenPageLimit = if (lazyMode) count else 1 + } + + open fun getShowFragment(): F? { + return showFragment + } + + open fun getFragmentIndex(clazz: Class?): Int { + if (clazz == null) { + return -1 + } + for (i in fragmentSet.indices) { + if ((clazz.name == fragmentSet[i].javaClass.name)) { + return i + } + } + return -1 + } + + override fun startUpdate(container: ViewGroup) { + super.startUpdate(container) + if (container is ViewPager) { + viewPager = container + refreshLazyMode() + } + } + + open fun setLazyMode(lazy: Boolean) { + lazyMode = lazy + refreshLazyMode() + } + + private fun refreshLazyMode() { + if (viewPager == null) { + return + } + viewPager?.offscreenPageLimit = if (lazyMode) count else 1 + } +} \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/ActivityAction.kt b/Android_Mireo/library/base/src/main/java/com/hjq/base/action/ActivityAction.kt new file mode 100644 index 0000000..db8ed88 --- /dev/null +++ b/Android_Mireo/library/base/src/main/java/com/hjq/base/action/ActivityAction.kt @@ -0,0 +1,40 @@ +package com.hjq.base.action + +import android.app.Activity +import android.content.Context +import android.content.ContextWrapper +import android.content.Intent + +interface ActivityAction { + + fun getContext(): Context + + fun getActivity(): Activity? { + var context: Context? = getContext() + do { + when (context) { + is Activity -> { + return context + } + is ContextWrapper -> { + context = context.baseContext + } + else -> { + return null + } + } + } while (context != null) + return null + } + + fun startActivity(clazz: Class) { + startActivity(Intent(getContext(), clazz)) + } + + fun startActivity(intent: Intent) { + if (getContext() !is Activity) { + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + getContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/AnimAction.kt b/Android_Mireo/library/base/src/main/java/com/hjq/base/action/AnimAction.kt new file mode 100644 index 0000000..5710167 --- /dev/null +++ b/Android_Mireo/library/base/src/main/java/com/hjq/base/action/AnimAction.kt @@ -0,0 +1,27 @@ +package com.hjq.base.action + +import com.hjq.base.R + +interface AnimAction { + + companion object { + + const val ANIM_DEFAULT: Int = -1 + + const val ANIM_EMPTY: Int = 0 + + val ANIM_SCALE: Int = R.style.ScaleAnimStyle + + val ANIM_IOS: Int = R.style.IOSAnimStyle + + const val ANIM_TOAST: Int = android.R.style.Animation_Toast + + val ANIM_TOP: Int = R.style.TopAnimStyle + + val ANIM_BOTTOM: Int = R.style.BottomAnimStyle + + val ANIM_LEFT: Int = R.style.LeftAnimStyle + + val ANIM_RIGHT: Int = R.style.RightAnimStyle + } +} \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/BundleAction.kt b/Android_Mireo/library/base/src/main/java/com/hjq/base/action/BundleAction.kt new file mode 100644 index 0000000..1bd63ce --- /dev/null +++ b/Android_Mireo/library/base/src/main/java/com/hjq/base/action/BundleAction.kt @@ -0,0 +1,82 @@ +package com.hjq.base.action + +import android.os.Bundle +import android.os.Parcelable +import java.io.Serializable +import java.util.* + +interface BundleAction { + + fun getBundle(): Bundle? + + fun getInt(name: String): Int { + return getInt(name, 0) + } + + fun getInt(name: String, defaultValue: Int): Int { + val bundle: Bundle = getBundle() ?: return defaultValue + return bundle.getInt(name, defaultValue) + } + + fun getLong(name: String): Long { + return getLong(name, 0) + } + + fun getLong(name: String, defaultValue: Long): Long { + val bundle: Bundle = getBundle() ?: return defaultValue + return bundle.getLong(name, defaultValue) + } + + fun getFloat(name: String): Float { + return getFloat(name, 0f) + } + + fun getFloat(name: String, defaultValue: Float): Float { + val bundle: Bundle = getBundle() ?: return defaultValue + return bundle.getFloat(name, defaultValue) + } + + fun getDouble(name: String): Double { + return getDouble(name, 0.0) + } + + fun getDouble(name: String, defaultValue: Double): Double { + val bundle: Bundle = getBundle() ?: return defaultValue + return bundle.getDouble(name, defaultValue) + } + + fun getBoolean(name: String): Boolean { + return getBoolean(name, false) + } + + fun getBoolean(name: String, defaultValue: Boolean): Boolean { + val bundle: Bundle = getBundle() ?: return defaultValue + return bundle.getBoolean(name, defaultValue) + } + + fun getString(name: String): String? { + val bundle: Bundle = getBundle() ?: return null + return bundle.getString(name) + } + + fun

getParcelable(name: String): P? { + val bundle: Bundle = getBundle() ?: return null + return bundle.getParcelable(name) + } + + @Suppress("UNCHECKED_CAST") + fun getSerializable(name: String): S? { + val bundle: Bundle = getBundle() ?: return null + return (bundle.getSerializable(name)) as S? + } + + fun getStringArrayList(name: String): ArrayList? { + val bundle: Bundle = getBundle() ?: return null + return bundle.getStringArrayList(name) + } + + fun getIntegerArrayList(name: String): ArrayList? { + val bundle: Bundle = getBundle() ?: return null + return bundle.getIntegerArrayList(name) + } +} \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/ClickAction.kt b/Android_Mireo/library/base/src/main/java/com/hjq/base/action/ClickAction.kt new file mode 100644 index 0000000..4b759ad --- /dev/null +++ b/Android_Mireo/library/base/src/main/java/com/hjq/base/action/ClickAction.kt @@ -0,0 +1,32 @@ +package com.hjq.base.action + +import android.view.View +import androidx.annotation.IdRes + +interface ClickAction : View.OnClickListener { + + fun findViewById(@IdRes id: Int): V? + + fun setOnClickListener(@IdRes vararg ids: Int) { + setOnClickListener(this, *ids) + } + + fun setOnClickListener(listener: View.OnClickListener?, @IdRes vararg ids: Int) { + for (id: Int in ids) { + findViewById(id)?.setOnClickListener(listener) + } + } + + fun setOnClickListener(vararg views: View?) { + setOnClickListener(this, *views) + } + + fun setOnClickListener(listener: View.OnClickListener?, vararg views: View?) { + for (view: View? in views) { + view?.setOnClickListener(listener) + } + } + + override fun onClick(view: View) { + } +} \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/HandlerAction.kt b/Android_Mireo/library/base/src/main/java/com/hjq/base/action/HandlerAction.kt new file mode 100644 index 0000000..eeb417f --- /dev/null +++ b/Android_Mireo/library/base/src/main/java/com/hjq/base/action/HandlerAction.kt @@ -0,0 +1,38 @@ +package com.hjq.base.action + +import android.os.Handler +import android.os.Looper +import android.os.SystemClock + +interface HandlerAction { + + companion object { + val HANDLER: Handler = Handler(Looper.getMainLooper()) + } + + fun getHandler(): Handler { + return HANDLER + } + + fun post(runnable: Runnable): Boolean { + return postDelayed(runnable, 0) + } + + fun postDelayed(runnable: Runnable, delayMillis: Long): Boolean { + return postAtTime(runnable, SystemClock.uptimeMillis() + if (delayMillis < 0) 0 else delayMillis) + } + + fun postAtTime(runnable: Runnable, uptimeMillis: Long): Boolean { + // 发送和当前对象相关的消息回调 + return HANDLER.postAtTime(runnable, this, uptimeMillis) + } + + fun removeCallbacks(runnable: Runnable) { + HANDLER.removeCallbacks(runnable) + } + + fun removeCallbacks() { + // 移除和当前对象相关的消息回调 + HANDLER.removeCallbacksAndMessages(this) + } +} \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/KeyboardAction.kt b/Android_Mireo/library/base/src/main/java/com/hjq/base/action/KeyboardAction.kt new file mode 100644 index 0000000..30757be --- /dev/null +++ b/Android_Mireo/library/base/src/main/java/com/hjq/base/action/KeyboardAction.kt @@ -0,0 +1,34 @@ +package com.hjq.base.action + +import android.content.Context +import android.view.View +import android.view.inputmethod.InputMethodManager + +interface KeyboardAction { + fun showKeyboard(view: View?) { + if (view == null) { + return + } + val manager: InputMethodManager = view.context + .getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager? ?: return + manager.showSoftInput(view, InputMethodManager.SHOW_FORCED) + } + + fun hideKeyboard(view: View?) { + if (view == null) { + return + } + val manager: InputMethodManager = view.context + .getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager? ?: return + manager.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS) + } + + fun toggleSoftInput(view: View?) { + if (view == null) { + return + } + val manager: InputMethodManager = view.context + .getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager? ?: return + manager.toggleSoftInput(0, 0) + } +} \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/java/com/hjq/base/action/ResourcesAction.kt b/Android_Mireo/library/base/src/main/java/com/hjq/base/action/ResourcesAction.kt new file mode 100644 index 0000000..a83e700 --- /dev/null +++ b/Android_Mireo/library/base/src/main/java/com/hjq/base/action/ResourcesAction.kt @@ -0,0 +1,40 @@ +package com.hjq.base.action + +import android.content.Context +import android.content.res.Resources +import android.graphics.drawable.Drawable +import androidx.annotation.ColorInt +import androidx.annotation.ColorRes +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import androidx.core.content.ContextCompat + +interface ResourcesAction { + + fun getContext(): Context + + fun getResources(): Resources { + return getContext().resources + } + + fun getString(@StringRes id: Int): String? { + return getContext().getString(id) + } + + fun getString(@StringRes id: Int, vararg formatArgs: Any?): String? { + return getResources().getString(id, *formatArgs) + } + + fun getDrawable(@DrawableRes id: Int): Drawable? { + return ContextCompat.getDrawable(getContext(), id) + } + + @ColorInt + fun getColor(@ColorRes id: Int): Int { + return ContextCompat.getColor(getContext(), id) + } + + fun getSystemService(serviceClass: Class): S { + return ContextCompat.getSystemService(getContext(), serviceClass)!! + } +} \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw1024dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw1024dp/dimens_dp.xml new file mode 100644 index 0000000..75fba69 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw1024dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -170.6667dp + -85.3333dp + -56.8889dp + -34.1333dp + -28.4444dp + -22.7556dp + -14.2222dp + -5.6889dp + -2.8444dp + + 0.2844dp + 1.4222dp + 2.8444dp + 4.2667dp + 5.6889dp + 7.1111dp + 8.5333dp + 9.9556dp + 11.3778dp + 12.8000dp + 14.2222dp + 17.0667dp + 19.9111dp + 22.7556dp + 25.6000dp + 28.4444dp + 31.2889dp + 34.1333dp + 36.9778dp + 39.8222dp + 42.6667dp + 45.5111dp + 48.3556dp + 51.2000dp + 54.0444dp + 56.8889dp + 59.7333dp + 62.5778dp + 65.4222dp + 68.2667dp + 71.1111dp + 73.9556dp + 76.8000dp + 79.6444dp + 82.4889dp + 85.3333dp + 88.1778dp + 91.0222dp + 93.8667dp + 96.7111dp + 99.5556dp + 102.4000dp + 105.2444dp + 108.0889dp + 110.9333dp + 113.7778dp + 116.6222dp + 119.4667dp + 122.3111dp + 125.1556dp + 128.0000dp + 130.8444dp + 133.6889dp + 136.5333dp + 139.3778dp + 142.2222dp + 145.0667dp + 147.9111dp + 150.7556dp + 153.6000dp + 156.4444dp + 159.2889dp + 162.1333dp + 164.9778dp + 167.8222dp + 170.6667dp + 173.5111dp + 176.3556dp + 179.2000dp + 182.0444dp + 184.8889dp + 187.7333dp + 190.5778dp + 193.4222dp + 196.2667dp + 199.1111dp + 201.9556dp + 204.8000dp + 207.6444dp + 210.4889dp + 213.3333dp + 216.1778dp + 219.0222dp + 221.8667dp + 224.7111dp + 227.5556dp + 230.4000dp + 233.2444dp + 236.0889dp + 238.9333dp + 241.7778dp + 244.6222dp + 247.4667dp + 250.3111dp + 253.1556dp + 256.0000dp + 258.8444dp + 261.6889dp + 264.5333dp + 267.3778dp + 270.2222dp + 273.0667dp + 275.9111dp + 278.7556dp + 281.6000dp + 284.4444dp + 287.2889dp + 290.1333dp + 292.9778dp + 295.8222dp + 298.6667dp + 301.5111dp + 304.3556dp + 307.2000dp + 310.0444dp + 312.8889dp + 315.7333dp + 318.5778dp + 321.4222dp + 324.2667dp + 327.1111dp + 329.9556dp + 332.8000dp + 335.6444dp + 338.4889dp + 341.3333dp + 344.1778dp + 347.0222dp + 349.8667dp + 352.7111dp + 355.5556dp + 358.4000dp + 361.2444dp + 364.0889dp + 366.9333dp + 369.7778dp + 372.6222dp + 375.4667dp + 378.3111dp + 381.1556dp + 384.0000dp + 386.8444dp + 389.6889dp + 392.5333dp + 395.3778dp + 398.2222dp + 401.0667dp + 403.9111dp + 406.7556dp + 409.6000dp + 412.4444dp + 415.2889dp + 418.1333dp + 420.9778dp + 423.8222dp + 426.6667dp + 429.5111dp + 432.3556dp + 435.2000dp + 438.0444dp + 440.8889dp + 443.7333dp + 446.5778dp + 449.4222dp + 452.2667dp + 455.1111dp + 457.9556dp + 460.8000dp + 463.6444dp + 466.4889dp + 469.3333dp + 472.1778dp + 475.0222dp + 477.8667dp + 480.7111dp + 483.5556dp + 486.4000dp + 489.2444dp + 492.0889dp + 494.9333dp + 497.7778dp + 500.6222dp + 503.4667dp + 506.3111dp + 509.1556dp + 512.0000dp + 514.8444dp + 517.6889dp + 520.5333dp + 523.3778dp + 526.2222dp + 529.0667dp + 531.9111dp + 534.7556dp + 537.6000dp + 540.4444dp + 543.2889dp + 546.1333dp + 548.9778dp + 551.8222dp + 554.6667dp + 557.5111dp + 560.3556dp + 563.2000dp + 566.0444dp + 568.8889dp + 571.7333dp + 574.5778dp + 577.4222dp + 580.2667dp + 583.1111dp + 585.9556dp + 588.8000dp + 591.6444dp + 594.4889dp + 597.3333dp + 600.1778dp + 603.0222dp + 605.8667dp + 608.7111dp + 611.5556dp + 614.4000dp + 617.2444dp + 620.0889dp + 622.9333dp + 625.7778dp + 628.6222dp + 631.4667dp + 634.3111dp + 637.1556dp + 640.0000dp + 642.8444dp + 645.6889dp + 648.5333dp + 651.3778dp + 654.2222dp + 657.0667dp + 659.9111dp + 662.7556dp + 665.6000dp + 668.4444dp + 671.2889dp + 674.1333dp + 676.9778dp + 679.8222dp + 682.6667dp + 685.5111dp + 688.3556dp + 691.2000dp + 694.0444dp + 696.8889dp + 699.7333dp + 702.5778dp + 705.4222dp + 708.2667dp + 711.1111dp + 713.9556dp + 716.8000dp + 719.6444dp + 722.4889dp + 725.3333dp + 728.1778dp + 731.0222dp + 733.8667dp + 736.7111dp + 739.5556dp + 742.4000dp + 745.2444dp + 748.0889dp + 750.9333dp + 753.7778dp + 756.6222dp + 759.4667dp + 762.3111dp + 765.1556dp + 768.0000dp + 770.8444dp + 773.6889dp + 776.5333dp + 779.3778dp + 782.2222dp + 785.0667dp + 787.9111dp + 790.7556dp + 793.6000dp + 796.4444dp + 799.2889dp + 802.1333dp + 804.9778dp + 807.8222dp + 810.6667dp + 813.5111dp + 816.3556dp + 819.2000dp + 822.0444dp + 824.8889dp + 827.7333dp + 830.5778dp + 833.4222dp + 836.2667dp + 839.1111dp + 841.9556dp + 844.8000dp + 847.6444dp + 850.4889dp + 853.3333dp + 856.1778dp + 859.0222dp + 861.8667dp + 864.7111dp + 867.5556dp + 870.4000dp + 873.2444dp + 876.0889dp + 878.9333dp + 881.7778dp + 884.6222dp + 887.4667dp + 890.3111dp + 893.1556dp + 896.0000dp + 898.8444dp + 901.6889dp + 904.5333dp + 907.3778dp + 910.2222dp + 913.0667dp + 915.9111dp + 918.7556dp + 921.6000dp + 924.4444dp + 927.2889dp + 930.1333dp + 932.9778dp + 935.8222dp + 938.6667dp + 941.5111dp + 944.3556dp + 947.2000dp + 950.0444dp + 952.8889dp + 955.7333dp + 958.5778dp + 961.4222dp + 964.2667dp + 967.1111dp + 969.9556dp + 972.8000dp + 975.6444dp + 978.4889dp + 981.3333dp + 984.1778dp + 987.0222dp + 989.8667dp + 992.7111dp + 995.5556dp + 998.4000dp + 1001.2444dp + 1004.0889dp + 1006.9333dp + 1009.7778dp + 1012.6222dp + 1015.4667dp + 1018.3111dp + 1021.1556dp + 1024.0000dp + 1038.2222dp + 1052.4444dp + 1137.7778dp + 1166.2222dp + 1200.3556dp + 1342.5778dp + 1422.2222dp + 1706.6667dp + 1820.4444dp + 2048.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw1024dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw1024dp/dimens_sp.xml new file mode 100644 index 0000000..e36cb3c --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw1024dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 17.0667sp + 19.9111sp + 22.7556sp + 25.6000sp + 28.4444sp + 31.2889sp + 34.1333sp + 36.9778sp + 39.8222sp + 42.6667sp + 45.5111sp + 48.3556sp + 51.2000sp + 54.0444sp + 56.8889sp + 59.7333sp + 62.5778sp + 65.4222sp + 68.2667sp + 71.1111sp + 79.6444sp + 85.3333sp + 91.0222sp + 96.7111sp + 102.4000sp + 108.0889sp + 113.7778sp + 119.4667sp + 136.5333sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw1280dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw1280dp/dimens_dp.xml new file mode 100644 index 0000000..df38b72 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw1280dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -213.3333dp + -106.6667dp + -71.1111dp + -42.6667dp + -35.5556dp + -28.4444dp + -17.7778dp + -7.1111dp + -3.5556dp + + 0.3556dp + 1.7778dp + 3.5556dp + 5.3333dp + 7.1111dp + 8.8889dp + 10.6667dp + 12.4444dp + 14.2222dp + 16.0000dp + 17.7778dp + 21.3333dp + 24.8889dp + 28.4444dp + 32.0000dp + 35.5556dp + 39.1111dp + 42.6667dp + 46.2222dp + 49.7778dp + 53.3333dp + 56.8889dp + 60.4444dp + 64.0000dp + 67.5556dp + 71.1111dp + 74.6667dp + 78.2222dp + 81.7778dp + 85.3333dp + 88.8889dp + 92.4444dp + 96.0000dp + 99.5556dp + 103.1111dp + 106.6667dp + 110.2222dp + 113.7778dp + 117.3333dp + 120.8889dp + 124.4444dp + 128.0000dp + 131.5556dp + 135.1111dp + 138.6667dp + 142.2222dp + 145.7778dp + 149.3333dp + 152.8889dp + 156.4444dp + 160.0000dp + 163.5556dp + 167.1111dp + 170.6667dp + 174.2222dp + 177.7778dp + 181.3333dp + 184.8889dp + 188.4444dp + 192.0000dp + 195.5556dp + 199.1111dp + 202.6667dp + 206.2222dp + 209.7778dp + 213.3333dp + 216.8889dp + 220.4444dp + 224.0000dp + 227.5556dp + 231.1111dp + 234.6667dp + 238.2222dp + 241.7778dp + 245.3333dp + 248.8889dp + 252.4444dp + 256.0000dp + 259.5556dp + 263.1111dp + 266.6667dp + 270.2222dp + 273.7778dp + 277.3333dp + 280.8889dp + 284.4444dp + 288.0000dp + 291.5556dp + 295.1111dp + 298.6667dp + 302.2222dp + 305.7778dp + 309.3333dp + 312.8889dp + 316.4444dp + 320.0000dp + 323.5556dp + 327.1111dp + 330.6667dp + 334.2222dp + 337.7778dp + 341.3333dp + 344.8889dp + 348.4444dp + 352.0000dp + 355.5556dp + 359.1111dp + 362.6667dp + 366.2222dp + 369.7778dp + 373.3333dp + 376.8889dp + 380.4444dp + 384.0000dp + 387.5556dp + 391.1111dp + 394.6667dp + 398.2222dp + 401.7778dp + 405.3333dp + 408.8889dp + 412.4444dp + 416.0000dp + 419.5556dp + 423.1111dp + 426.6667dp + 430.2222dp + 433.7778dp + 437.3333dp + 440.8889dp + 444.4444dp + 448.0000dp + 451.5556dp + 455.1111dp + 458.6667dp + 462.2222dp + 465.7778dp + 469.3333dp + 472.8889dp + 476.4444dp + 480.0000dp + 483.5556dp + 487.1111dp + 490.6667dp + 494.2222dp + 497.7778dp + 501.3333dp + 504.8889dp + 508.4444dp + 512.0000dp + 515.5556dp + 519.1111dp + 522.6667dp + 526.2222dp + 529.7778dp + 533.3333dp + 536.8889dp + 540.4444dp + 544.0000dp + 547.5556dp + 551.1111dp + 554.6667dp + 558.2222dp + 561.7778dp + 565.3333dp + 568.8889dp + 572.4444dp + 576.0000dp + 579.5556dp + 583.1111dp + 586.6667dp + 590.2222dp + 593.7778dp + 597.3333dp + 600.8889dp + 604.4444dp + 608.0000dp + 611.5556dp + 615.1111dp + 618.6667dp + 622.2222dp + 625.7778dp + 629.3333dp + 632.8889dp + 636.4444dp + 640.0000dp + 643.5556dp + 647.1111dp + 650.6667dp + 654.2222dp + 657.7778dp + 661.3333dp + 664.8889dp + 668.4444dp + 672.0000dp + 675.5556dp + 679.1111dp + 682.6667dp + 686.2222dp + 689.7778dp + 693.3333dp + 696.8889dp + 700.4444dp + 704.0000dp + 707.5556dp + 711.1111dp + 714.6667dp + 718.2222dp + 721.7778dp + 725.3333dp + 728.8889dp + 732.4444dp + 736.0000dp + 739.5556dp + 743.1111dp + 746.6667dp + 750.2222dp + 753.7778dp + 757.3333dp + 760.8889dp + 764.4444dp + 768.0000dp + 771.5556dp + 775.1111dp + 778.6667dp + 782.2222dp + 785.7778dp + 789.3333dp + 792.8889dp + 796.4444dp + 800.0000dp + 803.5556dp + 807.1111dp + 810.6667dp + 814.2222dp + 817.7778dp + 821.3333dp + 824.8889dp + 828.4444dp + 832.0000dp + 835.5556dp + 839.1111dp + 842.6667dp + 846.2222dp + 849.7778dp + 853.3333dp + 856.8889dp + 860.4444dp + 864.0000dp + 867.5556dp + 871.1111dp + 874.6667dp + 878.2222dp + 881.7778dp + 885.3333dp + 888.8889dp + 892.4444dp + 896.0000dp + 899.5556dp + 903.1111dp + 906.6667dp + 910.2222dp + 913.7778dp + 917.3333dp + 920.8889dp + 924.4444dp + 928.0000dp + 931.5556dp + 935.1111dp + 938.6667dp + 942.2222dp + 945.7778dp + 949.3333dp + 952.8889dp + 956.4444dp + 960.0000dp + 963.5556dp + 967.1111dp + 970.6667dp + 974.2222dp + 977.7778dp + 981.3333dp + 984.8889dp + 988.4444dp + 992.0000dp + 995.5556dp + 999.1111dp + 1002.6667dp + 1006.2222dp + 1009.7778dp + 1013.3333dp + 1016.8889dp + 1020.4444dp + 1024.0000dp + 1027.5556dp + 1031.1111dp + 1034.6667dp + 1038.2222dp + 1041.7778dp + 1045.3333dp + 1048.8889dp + 1052.4444dp + 1056.0000dp + 1059.5556dp + 1063.1111dp + 1066.6667dp + 1070.2222dp + 1073.7778dp + 1077.3333dp + 1080.8889dp + 1084.4444dp + 1088.0000dp + 1091.5556dp + 1095.1111dp + 1098.6667dp + 1102.2222dp + 1105.7778dp + 1109.3333dp + 1112.8889dp + 1116.4444dp + 1120.0000dp + 1123.5556dp + 1127.1111dp + 1130.6667dp + 1134.2222dp + 1137.7778dp + 1141.3333dp + 1144.8889dp + 1148.4444dp + 1152.0000dp + 1155.5556dp + 1159.1111dp + 1162.6667dp + 1166.2222dp + 1169.7778dp + 1173.3333dp + 1176.8889dp + 1180.4444dp + 1184.0000dp + 1187.5556dp + 1191.1111dp + 1194.6667dp + 1198.2222dp + 1201.7778dp + 1205.3333dp + 1208.8889dp + 1212.4444dp + 1216.0000dp + 1219.5556dp + 1223.1111dp + 1226.6667dp + 1230.2222dp + 1233.7778dp + 1237.3333dp + 1240.8889dp + 1244.4444dp + 1248.0000dp + 1251.5556dp + 1255.1111dp + 1258.6667dp + 1262.2222dp + 1265.7778dp + 1269.3333dp + 1272.8889dp + 1276.4444dp + 1280.0000dp + 1297.7778dp + 1315.5556dp + 1422.2222dp + 1457.7778dp + 1500.4444dp + 1678.2222dp + 1777.7778dp + 2133.3333dp + 2275.5556dp + 2560.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw1280dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw1280dp/dimens_sp.xml new file mode 100644 index 0000000..e9d7c4e --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw1280dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 21.3333sp + 24.8889sp + 28.4444sp + 32.0000sp + 35.5556sp + 39.1111sp + 42.6667sp + 46.2222sp + 49.7778sp + 53.3333sp + 56.8889sp + 60.4444sp + 64.0000sp + 67.5556sp + 71.1111sp + 74.6667sp + 78.2222sp + 81.7778sp + 85.3333sp + 88.8889sp + 99.5556sp + 106.6667sp + 113.7778sp + 120.8889sp + 128.0000sp + 135.1111sp + 142.2222sp + 149.3333sp + 170.6667sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw1365dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw1365dp/dimens_dp.xml new file mode 100644 index 0000000..0bc15ef --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw1365dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -227.5000dp + -113.7500dp + -75.8333dp + -45.5000dp + -37.9167dp + -30.3333dp + -18.9583dp + -7.5833dp + -3.7917dp + + 0.3792dp + 1.8958dp + 3.7917dp + 5.6875dp + 7.5833dp + 9.4792dp + 11.3750dp + 13.2708dp + 15.1667dp + 17.0625dp + 18.9583dp + 22.7500dp + 26.5417dp + 30.3333dp + 34.1250dp + 37.9167dp + 41.7083dp + 45.5000dp + 49.2917dp + 53.0833dp + 56.8750dp + 60.6667dp + 64.4583dp + 68.2500dp + 72.0417dp + 75.8333dp + 79.6250dp + 83.4167dp + 87.2083dp + 91.0000dp + 94.7917dp + 98.5833dp + 102.3750dp + 106.1667dp + 109.9583dp + 113.7500dp + 117.5417dp + 121.3333dp + 125.1250dp + 128.9167dp + 132.7083dp + 136.5000dp + 140.2917dp + 144.0833dp + 147.8750dp + 151.6667dp + 155.4583dp + 159.2500dp + 163.0417dp + 166.8333dp + 170.6250dp + 174.4167dp + 178.2083dp + 182.0000dp + 185.7917dp + 189.5833dp + 193.3750dp + 197.1667dp + 200.9583dp + 204.7500dp + 208.5417dp + 212.3333dp + 216.1250dp + 219.9167dp + 223.7083dp + 227.5000dp + 231.2917dp + 235.0833dp + 238.8750dp + 242.6667dp + 246.4583dp + 250.2500dp + 254.0417dp + 257.8333dp + 261.6250dp + 265.4167dp + 269.2083dp + 273.0000dp + 276.7917dp + 280.5833dp + 284.3750dp + 288.1667dp + 291.9583dp + 295.7500dp + 299.5417dp + 303.3333dp + 307.1250dp + 310.9167dp + 314.7083dp + 318.5000dp + 322.2917dp + 326.0833dp + 329.8750dp + 333.6667dp + 337.4583dp + 341.2500dp + 345.0417dp + 348.8333dp + 352.6250dp + 356.4167dp + 360.2083dp + 364.0000dp + 367.7917dp + 371.5833dp + 375.3750dp + 379.1667dp + 382.9583dp + 386.7500dp + 390.5417dp + 394.3333dp + 398.1250dp + 401.9167dp + 405.7083dp + 409.5000dp + 413.2917dp + 417.0833dp + 420.8750dp + 424.6667dp + 428.4583dp + 432.2500dp + 436.0417dp + 439.8333dp + 443.6250dp + 447.4167dp + 451.2083dp + 455.0000dp + 458.7917dp + 462.5833dp + 466.3750dp + 470.1667dp + 473.9583dp + 477.7500dp + 481.5417dp + 485.3333dp + 489.1250dp + 492.9167dp + 496.7083dp + 500.5000dp + 504.2917dp + 508.0833dp + 511.8750dp + 515.6667dp + 519.4583dp + 523.2500dp + 527.0417dp + 530.8333dp + 534.6250dp + 538.4167dp + 542.2083dp + 546.0000dp + 549.7917dp + 553.5833dp + 557.3750dp + 561.1667dp + 564.9583dp + 568.7500dp + 572.5417dp + 576.3333dp + 580.1250dp + 583.9167dp + 587.7083dp + 591.5000dp + 595.2917dp + 599.0833dp + 602.8750dp + 606.6667dp + 610.4583dp + 614.2500dp + 618.0417dp + 621.8333dp + 625.6250dp + 629.4167dp + 633.2083dp + 637.0000dp + 640.7917dp + 644.5833dp + 648.3750dp + 652.1667dp + 655.9583dp + 659.7500dp + 663.5417dp + 667.3333dp + 671.1250dp + 674.9167dp + 678.7083dp + 682.5000dp + 686.2917dp + 690.0833dp + 693.8750dp + 697.6667dp + 701.4583dp + 705.2500dp + 709.0417dp + 712.8333dp + 716.6250dp + 720.4167dp + 724.2083dp + 728.0000dp + 731.7917dp + 735.5833dp + 739.3750dp + 743.1667dp + 746.9583dp + 750.7500dp + 754.5417dp + 758.3333dp + 762.1250dp + 765.9167dp + 769.7083dp + 773.5000dp + 777.2917dp + 781.0833dp + 784.8750dp + 788.6667dp + 792.4583dp + 796.2500dp + 800.0417dp + 803.8333dp + 807.6250dp + 811.4167dp + 815.2083dp + 819.0000dp + 822.7917dp + 826.5833dp + 830.3750dp + 834.1667dp + 837.9583dp + 841.7500dp + 845.5417dp + 849.3333dp + 853.1250dp + 856.9167dp + 860.7083dp + 864.5000dp + 868.2917dp + 872.0833dp + 875.8750dp + 879.6667dp + 883.4583dp + 887.2500dp + 891.0417dp + 894.8333dp + 898.6250dp + 902.4167dp + 906.2083dp + 910.0000dp + 913.7917dp + 917.5833dp + 921.3750dp + 925.1667dp + 928.9583dp + 932.7500dp + 936.5417dp + 940.3333dp + 944.1250dp + 947.9167dp + 951.7083dp + 955.5000dp + 959.2917dp + 963.0833dp + 966.8750dp + 970.6667dp + 974.4583dp + 978.2500dp + 982.0417dp + 985.8333dp + 989.6250dp + 993.4167dp + 997.2083dp + 1001.0000dp + 1004.7917dp + 1008.5833dp + 1012.3750dp + 1016.1667dp + 1019.9583dp + 1023.7500dp + 1027.5417dp + 1031.3333dp + 1035.1250dp + 1038.9167dp + 1042.7083dp + 1046.5000dp + 1050.2917dp + 1054.0833dp + 1057.8750dp + 1061.6667dp + 1065.4583dp + 1069.2500dp + 1073.0417dp + 1076.8333dp + 1080.6250dp + 1084.4167dp + 1088.2083dp + 1092.0000dp + 1095.7917dp + 1099.5833dp + 1103.3750dp + 1107.1667dp + 1110.9583dp + 1114.7500dp + 1118.5417dp + 1122.3333dp + 1126.1250dp + 1129.9167dp + 1133.7083dp + 1137.5000dp + 1141.2917dp + 1145.0833dp + 1148.8750dp + 1152.6667dp + 1156.4583dp + 1160.2500dp + 1164.0417dp + 1167.8333dp + 1171.6250dp + 1175.4167dp + 1179.2083dp + 1183.0000dp + 1186.7917dp + 1190.5833dp + 1194.3750dp + 1198.1667dp + 1201.9583dp + 1205.7500dp + 1209.5417dp + 1213.3333dp + 1217.1250dp + 1220.9167dp + 1224.7083dp + 1228.5000dp + 1232.2917dp + 1236.0833dp + 1239.8750dp + 1243.6667dp + 1247.4583dp + 1251.2500dp + 1255.0417dp + 1258.8333dp + 1262.6250dp + 1266.4167dp + 1270.2083dp + 1274.0000dp + 1277.7917dp + 1281.5833dp + 1285.3750dp + 1289.1667dp + 1292.9583dp + 1296.7500dp + 1300.5417dp + 1304.3333dp + 1308.1250dp + 1311.9167dp + 1315.7083dp + 1319.5000dp + 1323.2917dp + 1327.0833dp + 1330.8750dp + 1334.6667dp + 1338.4583dp + 1342.2500dp + 1346.0417dp + 1349.8333dp + 1353.6250dp + 1357.4167dp + 1361.2083dp + 1365.0000dp + 1383.9583dp + 1402.9167dp + 1516.6667dp + 1554.5833dp + 1600.0833dp + 1789.6667dp + 1895.8333dp + 2275.0000dp + 2426.6667dp + 2730.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw1365dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw1365dp/dimens_sp.xml new file mode 100644 index 0000000..860fdb4 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw1365dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 22.7500sp + 26.5417sp + 30.3333sp + 34.1250sp + 37.9167sp + 41.7083sp + 45.5000sp + 49.2917sp + 53.0833sp + 56.8750sp + 60.6667sp + 64.4583sp + 68.2500sp + 72.0417sp + 75.8333sp + 79.6250sp + 83.4167sp + 87.2083sp + 91.0000sp + 94.7917sp + 106.1667sp + 113.7500sp + 121.3333sp + 128.9167sp + 136.5000sp + 144.0833sp + 151.6667sp + 159.2500sp + 182.0000sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw240dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw240dp/dimens_dp.xml new file mode 100644 index 0000000..21e3633 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw240dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -40.0000dp + -20.0000dp + -13.3333dp + -8.0000dp + -6.6667dp + -5.3333dp + -3.3333dp + -1.3333dp + -0.6667dp + + 0.0667dp + 0.3333dp + 0.6667dp + 1.0000dp + 1.3333dp + 1.6667dp + 2.0000dp + 2.3333dp + 2.6667dp + 3.0000dp + 3.3333dp + 4.0000dp + 4.6667dp + 5.3333dp + 6.0000dp + 6.6667dp + 7.3333dp + 8.0000dp + 8.6667dp + 9.3333dp + 10.0000dp + 10.6667dp + 11.3333dp + 12.0000dp + 12.6667dp + 13.3333dp + 14.0000dp + 14.6667dp + 15.3333dp + 16.0000dp + 16.6667dp + 17.3333dp + 18.0000dp + 18.6667dp + 19.3333dp + 20.0000dp + 20.6667dp + 21.3333dp + 22.0000dp + 22.6667dp + 23.3333dp + 24.0000dp + 24.6667dp + 25.3333dp + 26.0000dp + 26.6667dp + 27.3333dp + 28.0000dp + 28.6667dp + 29.3333dp + 30.0000dp + 30.6667dp + 31.3333dp + 32.0000dp + 32.6667dp + 33.3333dp + 34.0000dp + 34.6667dp + 35.3333dp + 36.0000dp + 36.6667dp + 37.3333dp + 38.0000dp + 38.6667dp + 39.3333dp + 40.0000dp + 40.6667dp + 41.3333dp + 42.0000dp + 42.6667dp + 43.3333dp + 44.0000dp + 44.6667dp + 45.3333dp + 46.0000dp + 46.6667dp + 47.3333dp + 48.0000dp + 48.6667dp + 49.3333dp + 50.0000dp + 50.6667dp + 51.3333dp + 52.0000dp + 52.6667dp + 53.3333dp + 54.0000dp + 54.6667dp + 55.3333dp + 56.0000dp + 56.6667dp + 57.3333dp + 58.0000dp + 58.6667dp + 59.3333dp + 60.0000dp + 60.6667dp + 61.3333dp + 62.0000dp + 62.6667dp + 63.3333dp + 64.0000dp + 64.6667dp + 65.3333dp + 66.0000dp + 66.6667dp + 67.3333dp + 68.0000dp + 68.6667dp + 69.3333dp + 70.0000dp + 70.6667dp + 71.3333dp + 72.0000dp + 72.6667dp + 73.3333dp + 74.0000dp + 74.6667dp + 75.3333dp + 76.0000dp + 76.6667dp + 77.3333dp + 78.0000dp + 78.6667dp + 79.3333dp + 80.0000dp + 80.6667dp + 81.3333dp + 82.0000dp + 82.6667dp + 83.3333dp + 84.0000dp + 84.6667dp + 85.3333dp + 86.0000dp + 86.6667dp + 87.3333dp + 88.0000dp + 88.6667dp + 89.3333dp + 90.0000dp + 90.6667dp + 91.3333dp + 92.0000dp + 92.6667dp + 93.3333dp + 94.0000dp + 94.6667dp + 95.3333dp + 96.0000dp + 96.6667dp + 97.3333dp + 98.0000dp + 98.6667dp + 99.3333dp + 100.0000dp + 100.6667dp + 101.3333dp + 102.0000dp + 102.6667dp + 103.3333dp + 104.0000dp + 104.6667dp + 105.3333dp + 106.0000dp + 106.6667dp + 107.3333dp + 108.0000dp + 108.6667dp + 109.3333dp + 110.0000dp + 110.6667dp + 111.3333dp + 112.0000dp + 112.6667dp + 113.3333dp + 114.0000dp + 114.6667dp + 115.3333dp + 116.0000dp + 116.6667dp + 117.3333dp + 118.0000dp + 118.6667dp + 119.3333dp + 120.0000dp + 120.6667dp + 121.3333dp + 122.0000dp + 122.6667dp + 123.3333dp + 124.0000dp + 124.6667dp + 125.3333dp + 126.0000dp + 126.6667dp + 127.3333dp + 128.0000dp + 128.6667dp + 129.3333dp + 130.0000dp + 130.6667dp + 131.3333dp + 132.0000dp + 132.6667dp + 133.3333dp + 134.0000dp + 134.6667dp + 135.3333dp + 136.0000dp + 136.6667dp + 137.3333dp + 138.0000dp + 138.6667dp + 139.3333dp + 140.0000dp + 140.6667dp + 141.3333dp + 142.0000dp + 142.6667dp + 143.3333dp + 144.0000dp + 144.6667dp + 145.3333dp + 146.0000dp + 146.6667dp + 147.3333dp + 148.0000dp + 148.6667dp + 149.3333dp + 150.0000dp + 150.6667dp + 151.3333dp + 152.0000dp + 152.6667dp + 153.3333dp + 154.0000dp + 154.6667dp + 155.3333dp + 156.0000dp + 156.6667dp + 157.3333dp + 158.0000dp + 158.6667dp + 159.3333dp + 160.0000dp + 160.6667dp + 161.3333dp + 162.0000dp + 162.6667dp + 163.3333dp + 164.0000dp + 164.6667dp + 165.3333dp + 166.0000dp + 166.6667dp + 167.3333dp + 168.0000dp + 168.6667dp + 169.3333dp + 170.0000dp + 170.6667dp + 171.3333dp + 172.0000dp + 172.6667dp + 173.3333dp + 174.0000dp + 174.6667dp + 175.3333dp + 176.0000dp + 176.6667dp + 177.3333dp + 178.0000dp + 178.6667dp + 179.3333dp + 180.0000dp + 180.6667dp + 181.3333dp + 182.0000dp + 182.6667dp + 183.3333dp + 184.0000dp + 184.6667dp + 185.3333dp + 186.0000dp + 186.6667dp + 187.3333dp + 188.0000dp + 188.6667dp + 189.3333dp + 190.0000dp + 190.6667dp + 191.3333dp + 192.0000dp + 192.6667dp + 193.3333dp + 194.0000dp + 194.6667dp + 195.3333dp + 196.0000dp + 196.6667dp + 197.3333dp + 198.0000dp + 198.6667dp + 199.3333dp + 200.0000dp + 200.6667dp + 201.3333dp + 202.0000dp + 202.6667dp + 203.3333dp + 204.0000dp + 204.6667dp + 205.3333dp + 206.0000dp + 206.6667dp + 207.3333dp + 208.0000dp + 208.6667dp + 209.3333dp + 210.0000dp + 210.6667dp + 211.3333dp + 212.0000dp + 212.6667dp + 213.3333dp + 214.0000dp + 214.6667dp + 215.3333dp + 216.0000dp + 216.6667dp + 217.3333dp + 218.0000dp + 218.6667dp + 219.3333dp + 220.0000dp + 220.6667dp + 221.3333dp + 222.0000dp + 222.6667dp + 223.3333dp + 224.0000dp + 224.6667dp + 225.3333dp + 226.0000dp + 226.6667dp + 227.3333dp + 228.0000dp + 228.6667dp + 229.3333dp + 230.0000dp + 230.6667dp + 231.3333dp + 232.0000dp + 232.6667dp + 233.3333dp + 234.0000dp + 234.6667dp + 235.3333dp + 236.0000dp + 236.6667dp + 237.3333dp + 238.0000dp + 238.6667dp + 239.3333dp + 240.0000dp + 243.3333dp + 246.6667dp + 266.6667dp + 273.3333dp + 281.3333dp + 314.6667dp + 333.3333dp + 400.0000dp + 426.6667dp + 480.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw240dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw240dp/dimens_sp.xml new file mode 100644 index 0000000..d9e8ec6 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw240dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 4.0000sp + 4.6667sp + 5.3333sp + 6.0000sp + 6.6667sp + 7.3333sp + 8.0000sp + 8.6667sp + 9.3333sp + 10.0000sp + 10.6667sp + 11.3333sp + 12.0000sp + 12.6667sp + 13.3333sp + 14.0000sp + 14.6667sp + 15.3333sp + 16.0000sp + 16.6667sp + 18.6667sp + 20.0000sp + 21.3333sp + 22.6667sp + 24.0000sp + 25.3333sp + 26.6667sp + 28.0000sp + 32.0000sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw320dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw320dp/dimens_dp.xml new file mode 100644 index 0000000..aee242f --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw320dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -53.3333dp + -26.6667dp + -17.7778dp + -10.6667dp + -8.8889dp + -7.1111dp + -4.4444dp + -1.7778dp + -0.8889dp + + 0.0889dp + 0.4444dp + 0.8889dp + 1.3333dp + 1.7778dp + 2.2222dp + 2.6667dp + 3.1111dp + 3.5556dp + 4.0000dp + 4.4444dp + 5.3333dp + 6.2222dp + 7.1111dp + 8.0000dp + 8.8889dp + 9.7778dp + 10.6667dp + 11.5556dp + 12.4444dp + 13.3333dp + 14.2222dp + 15.1111dp + 16.0000dp + 16.8889dp + 17.7778dp + 18.6667dp + 19.5556dp + 20.4444dp + 21.3333dp + 22.2222dp + 23.1111dp + 24.0000dp + 24.8889dp + 25.7778dp + 26.6667dp + 27.5556dp + 28.4444dp + 29.3333dp + 30.2222dp + 31.1111dp + 32.0000dp + 32.8889dp + 33.7778dp + 34.6667dp + 35.5556dp + 36.4444dp + 37.3333dp + 38.2222dp + 39.1111dp + 40.0000dp + 40.8889dp + 41.7778dp + 42.6667dp + 43.5556dp + 44.4444dp + 45.3333dp + 46.2222dp + 47.1111dp + 48.0000dp + 48.8889dp + 49.7778dp + 50.6667dp + 51.5556dp + 52.4444dp + 53.3333dp + 54.2222dp + 55.1111dp + 56.0000dp + 56.8889dp + 57.7778dp + 58.6667dp + 59.5556dp + 60.4444dp + 61.3333dp + 62.2222dp + 63.1111dp + 64.0000dp + 64.8889dp + 65.7778dp + 66.6667dp + 67.5556dp + 68.4444dp + 69.3333dp + 70.2222dp + 71.1111dp + 72.0000dp + 72.8889dp + 73.7778dp + 74.6667dp + 75.5556dp + 76.4444dp + 77.3333dp + 78.2222dp + 79.1111dp + 80.0000dp + 80.8889dp + 81.7778dp + 82.6667dp + 83.5556dp + 84.4444dp + 85.3333dp + 86.2222dp + 87.1111dp + 88.0000dp + 88.8889dp + 89.7778dp + 90.6667dp + 91.5556dp + 92.4444dp + 93.3333dp + 94.2222dp + 95.1111dp + 96.0000dp + 96.8889dp + 97.7778dp + 98.6667dp + 99.5556dp + 100.4444dp + 101.3333dp + 102.2222dp + 103.1111dp + 104.0000dp + 104.8889dp + 105.7778dp + 106.6667dp + 107.5556dp + 108.4444dp + 109.3333dp + 110.2222dp + 111.1111dp + 112.0000dp + 112.8889dp + 113.7778dp + 114.6667dp + 115.5556dp + 116.4444dp + 117.3333dp + 118.2222dp + 119.1111dp + 120.0000dp + 120.8889dp + 121.7778dp + 122.6667dp + 123.5556dp + 124.4444dp + 125.3333dp + 126.2222dp + 127.1111dp + 128.0000dp + 128.8889dp + 129.7778dp + 130.6667dp + 131.5556dp + 132.4444dp + 133.3333dp + 134.2222dp + 135.1111dp + 136.0000dp + 136.8889dp + 137.7778dp + 138.6667dp + 139.5556dp + 140.4444dp + 141.3333dp + 142.2222dp + 143.1111dp + 144.0000dp + 144.8889dp + 145.7778dp + 146.6667dp + 147.5556dp + 148.4444dp + 149.3333dp + 150.2222dp + 151.1111dp + 152.0000dp + 152.8889dp + 153.7778dp + 154.6667dp + 155.5556dp + 156.4444dp + 157.3333dp + 158.2222dp + 159.1111dp + 160.0000dp + 160.8889dp + 161.7778dp + 162.6667dp + 163.5556dp + 164.4444dp + 165.3333dp + 166.2222dp + 167.1111dp + 168.0000dp + 168.8889dp + 169.7778dp + 170.6667dp + 171.5556dp + 172.4444dp + 173.3333dp + 174.2222dp + 175.1111dp + 176.0000dp + 176.8889dp + 177.7778dp + 178.6667dp + 179.5556dp + 180.4444dp + 181.3333dp + 182.2222dp + 183.1111dp + 184.0000dp + 184.8889dp + 185.7778dp + 186.6667dp + 187.5556dp + 188.4444dp + 189.3333dp + 190.2222dp + 191.1111dp + 192.0000dp + 192.8889dp + 193.7778dp + 194.6667dp + 195.5556dp + 196.4444dp + 197.3333dp + 198.2222dp + 199.1111dp + 200.0000dp + 200.8889dp + 201.7778dp + 202.6667dp + 203.5556dp + 204.4444dp + 205.3333dp + 206.2222dp + 207.1111dp + 208.0000dp + 208.8889dp + 209.7778dp + 210.6667dp + 211.5556dp + 212.4444dp + 213.3333dp + 214.2222dp + 215.1111dp + 216.0000dp + 216.8889dp + 217.7778dp + 218.6667dp + 219.5556dp + 220.4444dp + 221.3333dp + 222.2222dp + 223.1111dp + 224.0000dp + 224.8889dp + 225.7778dp + 226.6667dp + 227.5556dp + 228.4444dp + 229.3333dp + 230.2222dp + 231.1111dp + 232.0000dp + 232.8889dp + 233.7778dp + 234.6667dp + 235.5556dp + 236.4444dp + 237.3333dp + 238.2222dp + 239.1111dp + 240.0000dp + 240.8889dp + 241.7778dp + 242.6667dp + 243.5556dp + 244.4444dp + 245.3333dp + 246.2222dp + 247.1111dp + 248.0000dp + 248.8889dp + 249.7778dp + 250.6667dp + 251.5556dp + 252.4444dp + 253.3333dp + 254.2222dp + 255.1111dp + 256.0000dp + 256.8889dp + 257.7778dp + 258.6667dp + 259.5556dp + 260.4444dp + 261.3333dp + 262.2222dp + 263.1111dp + 264.0000dp + 264.8889dp + 265.7778dp + 266.6667dp + 267.5556dp + 268.4444dp + 269.3333dp + 270.2222dp + 271.1111dp + 272.0000dp + 272.8889dp + 273.7778dp + 274.6667dp + 275.5556dp + 276.4444dp + 277.3333dp + 278.2222dp + 279.1111dp + 280.0000dp + 280.8889dp + 281.7778dp + 282.6667dp + 283.5556dp + 284.4444dp + 285.3333dp + 286.2222dp + 287.1111dp + 288.0000dp + 288.8889dp + 289.7778dp + 290.6667dp + 291.5556dp + 292.4444dp + 293.3333dp + 294.2222dp + 295.1111dp + 296.0000dp + 296.8889dp + 297.7778dp + 298.6667dp + 299.5556dp + 300.4444dp + 301.3333dp + 302.2222dp + 303.1111dp + 304.0000dp + 304.8889dp + 305.7778dp + 306.6667dp + 307.5556dp + 308.4444dp + 309.3333dp + 310.2222dp + 311.1111dp + 312.0000dp + 312.8889dp + 313.7778dp + 314.6667dp + 315.5556dp + 316.4444dp + 317.3333dp + 318.2222dp + 319.1111dp + 320.0000dp + 324.4444dp + 328.8889dp + 355.5556dp + 364.4444dp + 375.1111dp + 419.5556dp + 444.4444dp + 533.3333dp + 568.8889dp + 640.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw320dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw320dp/dimens_sp.xml new file mode 100644 index 0000000..899c3ce --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw320dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 5.3333sp + 6.2222sp + 7.1111sp + 8.0000sp + 8.8889sp + 9.7778sp + 10.6667sp + 11.5556sp + 12.4444sp + 13.3333sp + 14.2222sp + 15.1111sp + 16.0000sp + 16.8889sp + 17.7778sp + 18.6667sp + 19.5556sp + 20.4444sp + 21.3333sp + 22.2222sp + 24.8889sp + 26.6667sp + 28.4444sp + 30.2222sp + 32.0000sp + 33.7778sp + 35.5556sp + 37.3333sp + 42.6667sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw360dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw360dp/dimens_dp.xml new file mode 100644 index 0000000..6aee2b1 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw360dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -60.0000dp + -30.0000dp + -20.0000dp + -12.0000dp + -10.0000dp + -8.0000dp + -5.0000dp + -2.0000dp + -1.0000dp + + 0.1000dp + 0.5000dp + 1.0000dp + 1.5000dp + 2.0000dp + 2.5000dp + 3.0000dp + 3.5000dp + 4.0000dp + 4.5000dp + 5.0000dp + 6.0000dp + 7.0000dp + 8.0000dp + 9.0000dp + 10.0000dp + 11.0000dp + 12.0000dp + 13.0000dp + 14.0000dp + 15.0000dp + 16.0000dp + 17.0000dp + 18.0000dp + 19.0000dp + 20.0000dp + 21.0000dp + 22.0000dp + 23.0000dp + 24.0000dp + 25.0000dp + 26.0000dp + 27.0000dp + 28.0000dp + 29.0000dp + 30.0000dp + 31.0000dp + 32.0000dp + 33.0000dp + 34.0000dp + 35.0000dp + 36.0000dp + 37.0000dp + 38.0000dp + 39.0000dp + 40.0000dp + 41.0000dp + 42.0000dp + 43.0000dp + 44.0000dp + 45.0000dp + 46.0000dp + 47.0000dp + 48.0000dp + 49.0000dp + 50.0000dp + 51.0000dp + 52.0000dp + 53.0000dp + 54.0000dp + 55.0000dp + 56.0000dp + 57.0000dp + 58.0000dp + 59.0000dp + 60.0000dp + 61.0000dp + 62.0000dp + 63.0000dp + 64.0000dp + 65.0000dp + 66.0000dp + 67.0000dp + 68.0000dp + 69.0000dp + 70.0000dp + 71.0000dp + 72.0000dp + 73.0000dp + 74.0000dp + 75.0000dp + 76.0000dp + 77.0000dp + 78.0000dp + 79.0000dp + 80.0000dp + 81.0000dp + 82.0000dp + 83.0000dp + 84.0000dp + 85.0000dp + 86.0000dp + 87.0000dp + 88.0000dp + 89.0000dp + 90.0000dp + 91.0000dp + 92.0000dp + 93.0000dp + 94.0000dp + 95.0000dp + 96.0000dp + 97.0000dp + 98.0000dp + 99.0000dp + 100.0000dp + 101.0000dp + 102.0000dp + 103.0000dp + 104.0000dp + 105.0000dp + 106.0000dp + 107.0000dp + 108.0000dp + 109.0000dp + 110.0000dp + 111.0000dp + 112.0000dp + 113.0000dp + 114.0000dp + 115.0000dp + 116.0000dp + 117.0000dp + 118.0000dp + 119.0000dp + 120.0000dp + 121.0000dp + 122.0000dp + 123.0000dp + 124.0000dp + 125.0000dp + 126.0000dp + 127.0000dp + 128.0000dp + 129.0000dp + 130.0000dp + 131.0000dp + 132.0000dp + 133.0000dp + 134.0000dp + 135.0000dp + 136.0000dp + 137.0000dp + 138.0000dp + 139.0000dp + 140.0000dp + 141.0000dp + 142.0000dp + 143.0000dp + 144.0000dp + 145.0000dp + 146.0000dp + 147.0000dp + 148.0000dp + 149.0000dp + 150.0000dp + 151.0000dp + 152.0000dp + 153.0000dp + 154.0000dp + 155.0000dp + 156.0000dp + 157.0000dp + 158.0000dp + 159.0000dp + 160.0000dp + 161.0000dp + 162.0000dp + 163.0000dp + 164.0000dp + 165.0000dp + 166.0000dp + 167.0000dp + 168.0000dp + 169.0000dp + 170.0000dp + 171.0000dp + 172.0000dp + 173.0000dp + 174.0000dp + 175.0000dp + 176.0000dp + 177.0000dp + 178.0000dp + 179.0000dp + 180.0000dp + 181.0000dp + 182.0000dp + 183.0000dp + 184.0000dp + 185.0000dp + 186.0000dp + 187.0000dp + 188.0000dp + 189.0000dp + 190.0000dp + 191.0000dp + 192.0000dp + 193.0000dp + 194.0000dp + 195.0000dp + 196.0000dp + 197.0000dp + 198.0000dp + 199.0000dp + 200.0000dp + 201.0000dp + 202.0000dp + 203.0000dp + 204.0000dp + 205.0000dp + 206.0000dp + 207.0000dp + 208.0000dp + 209.0000dp + 210.0000dp + 211.0000dp + 212.0000dp + 213.0000dp + 214.0000dp + 215.0000dp + 216.0000dp + 217.0000dp + 218.0000dp + 219.0000dp + 220.0000dp + 221.0000dp + 222.0000dp + 223.0000dp + 224.0000dp + 225.0000dp + 226.0000dp + 227.0000dp + 228.0000dp + 229.0000dp + 230.0000dp + 231.0000dp + 232.0000dp + 233.0000dp + 234.0000dp + 235.0000dp + 236.0000dp + 237.0000dp + 238.0000dp + 239.0000dp + 240.0000dp + 241.0000dp + 242.0000dp + 243.0000dp + 244.0000dp + 245.0000dp + 246.0000dp + 247.0000dp + 248.0000dp + 249.0000dp + 250.0000dp + 251.0000dp + 252.0000dp + 253.0000dp + 254.0000dp + 255.0000dp + 256.0000dp + 257.0000dp + 258.0000dp + 259.0000dp + 260.0000dp + 261.0000dp + 262.0000dp + 263.0000dp + 264.0000dp + 265.0000dp + 266.0000dp + 267.0000dp + 268.0000dp + 269.0000dp + 270.0000dp + 271.0000dp + 272.0000dp + 273.0000dp + 274.0000dp + 275.0000dp + 276.0000dp + 277.0000dp + 278.0000dp + 279.0000dp + 280.0000dp + 281.0000dp + 282.0000dp + 283.0000dp + 284.0000dp + 285.0000dp + 286.0000dp + 287.0000dp + 288.0000dp + 289.0000dp + 290.0000dp + 291.0000dp + 292.0000dp + 293.0000dp + 294.0000dp + 295.0000dp + 296.0000dp + 297.0000dp + 298.0000dp + 299.0000dp + 300.0000dp + 301.0000dp + 302.0000dp + 303.0000dp + 304.0000dp + 305.0000dp + 306.0000dp + 307.0000dp + 308.0000dp + 309.0000dp + 310.0000dp + 311.0000dp + 312.0000dp + 313.0000dp + 314.0000dp + 315.0000dp + 316.0000dp + 317.0000dp + 318.0000dp + 319.0000dp + 320.0000dp + 321.0000dp + 322.0000dp + 323.0000dp + 324.0000dp + 325.0000dp + 326.0000dp + 327.0000dp + 328.0000dp + 329.0000dp + 330.0000dp + 331.0000dp + 332.0000dp + 333.0000dp + 334.0000dp + 335.0000dp + 336.0000dp + 337.0000dp + 338.0000dp + 339.0000dp + 340.0000dp + 341.0000dp + 342.0000dp + 343.0000dp + 344.0000dp + 345.0000dp + 346.0000dp + 347.0000dp + 348.0000dp + 349.0000dp + 350.0000dp + 351.0000dp + 352.0000dp + 353.0000dp + 354.0000dp + 355.0000dp + 356.0000dp + 357.0000dp + 358.0000dp + 359.0000dp + 360.0000dp + 365.0000dp + 370.0000dp + 400.0000dp + 410.0000dp + 422.0000dp + 472.0000dp + 500.0000dp + 600.0000dp + 640.0000dp + 720.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw360dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw360dp/dimens_sp.xml new file mode 100644 index 0000000..9af9171 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw360dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 6.0000sp + 7.0000sp + 8.0000sp + 9.0000sp + 10.0000sp + 11.0000sp + 12.0000sp + 13.0000sp + 14.0000sp + 15.0000sp + 16.0000sp + 17.0000sp + 18.0000sp + 19.0000sp + 20.0000sp + 21.0000sp + 22.0000sp + 23.0000sp + 24.0000sp + 25.0000sp + 28.0000sp + 30.0000sp + 32.0000sp + 34.0000sp + 36.0000sp + 38.0000sp + 40.0000sp + 42.0000sp + 48.0000sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw362dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw362dp/dimens_dp.xml new file mode 100644 index 0000000..801948a --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw362dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -60.3773dp + -30.1887dp + -20.1258dp + -12.0755dp + -10.0629dp + -8.0503dp + -5.0314dp + -2.0126dp + -1.0063dp + + 0.1006dp + 0.5031dp + 1.0063dp + 1.5094dp + 2.0126dp + 2.5157dp + 3.0189dp + 3.5220dp + 4.0252dp + 4.5283dp + 5.0314dp + 6.0377dp + 7.0440dp + 8.0503dp + 9.0566dp + 10.0629dp + 11.0692dp + 12.0755dp + 13.0818dp + 14.0880dp + 15.0943dp + 16.1006dp + 17.1069dp + 18.1132dp + 19.1195dp + 20.1258dp + 21.1321dp + 22.1384dp + 23.1447dp + 24.1509dp + 25.1572dp + 26.1635dp + 27.1698dp + 28.1761dp + 29.1824dp + 30.1887dp + 31.1950dp + 32.2013dp + 33.2075dp + 34.2138dp + 35.2201dp + 36.2264dp + 37.2327dp + 38.2390dp + 39.2453dp + 40.2516dp + 41.2579dp + 42.2641dp + 43.2704dp + 44.2767dp + 45.2830dp + 46.2893dp + 47.2956dp + 48.3019dp + 49.3082dp + 50.3145dp + 51.3207dp + 52.3270dp + 53.3333dp + 54.3396dp + 55.3459dp + 56.3522dp + 57.3585dp + 58.3648dp + 59.3711dp + 60.3773dp + 61.3836dp + 62.3899dp + 63.3962dp + 64.4025dp + 65.4088dp + 66.4151dp + 67.4214dp + 68.4277dp + 69.4340dp + 70.4402dp + 71.4465dp + 72.4528dp + 73.4591dp + 74.4654dp + 75.4717dp + 76.4780dp + 77.4843dp + 78.4906dp + 79.4968dp + 80.5031dp + 81.5094dp + 82.5157dp + 83.5220dp + 84.5283dp + 85.5346dp + 86.5409dp + 87.5472dp + 88.5534dp + 89.5597dp + 90.5660dp + 91.5723dp + 92.5786dp + 93.5849dp + 94.5912dp + 95.5975dp + 96.6038dp + 97.6100dp + 98.6163dp + 99.6226dp + 100.6289dp + 101.6352dp + 102.6415dp + 103.6478dp + 104.6541dp + 105.6604dp + 106.6667dp + 107.6729dp + 108.6792dp + 109.6855dp + 110.6918dp + 111.6981dp + 112.7044dp + 113.7107dp + 114.7170dp + 115.7233dp + 116.7295dp + 117.7358dp + 118.7421dp + 119.7484dp + 120.7547dp + 121.7610dp + 122.7673dp + 123.7736dp + 124.7799dp + 125.7861dp + 126.7924dp + 127.7987dp + 128.8050dp + 129.8113dp + 130.8176dp + 131.8239dp + 132.8302dp + 133.8365dp + 134.8427dp + 135.8490dp + 136.8553dp + 137.8616dp + 138.8679dp + 139.8742dp + 140.8805dp + 141.8868dp + 142.8931dp + 143.8994dp + 144.9056dp + 145.9119dp + 146.9182dp + 147.9245dp + 148.9308dp + 149.9371dp + 150.9434dp + 151.9497dp + 152.9560dp + 153.9622dp + 154.9685dp + 155.9748dp + 156.9811dp + 157.9874dp + 158.9937dp + 160.0000dp + 161.0063dp + 162.0126dp + 163.0188dp + 164.0251dp + 165.0314dp + 166.0377dp + 167.0440dp + 168.0503dp + 169.0566dp + 170.0629dp + 171.0692dp + 172.0754dp + 173.0817dp + 174.0880dp + 175.0943dp + 176.1006dp + 177.1069dp + 178.1132dp + 179.1195dp + 180.1258dp + 181.1320dp + 182.1383dp + 183.1446dp + 184.1509dp + 185.1572dp + 186.1635dp + 187.1698dp + 188.1761dp + 189.1824dp + 190.1887dp + 191.1949dp + 192.2012dp + 193.2075dp + 194.2138dp + 195.2201dp + 196.2264dp + 197.2327dp + 198.2390dp + 199.2453dp + 200.2515dp + 201.2578dp + 202.2641dp + 203.2704dp + 204.2767dp + 205.2830dp + 206.2893dp + 207.2956dp + 208.3019dp + 209.3081dp + 210.3144dp + 211.3207dp + 212.3270dp + 213.3333dp + 214.3396dp + 215.3459dp + 216.3522dp + 217.3585dp + 218.3647dp + 219.3710dp + 220.3773dp + 221.3836dp + 222.3899dp + 223.3962dp + 224.4025dp + 225.4088dp + 226.4151dp + 227.4214dp + 228.4276dp + 229.4339dp + 230.4402dp + 231.4465dp + 232.4528dp + 233.4591dp + 234.4654dp + 235.4717dp + 236.4780dp + 237.4842dp + 238.4905dp + 239.4968dp + 240.5031dp + 241.5094dp + 242.5157dp + 243.5220dp + 244.5283dp + 245.5346dp + 246.5408dp + 247.5471dp + 248.5534dp + 249.5597dp + 250.5660dp + 251.5723dp + 252.5786dp + 253.5849dp + 254.5912dp + 255.5974dp + 256.6037dp + 257.6100dp + 258.6163dp + 259.6226dp + 260.6289dp + 261.6352dp + 262.6415dp + 263.6478dp + 264.6541dp + 265.6603dp + 266.6666dp + 267.6729dp + 268.6792dp + 269.6855dp + 270.6918dp + 271.6981dp + 272.7044dp + 273.7107dp + 274.7169dp + 275.7232dp + 276.7295dp + 277.7358dp + 278.7421dp + 279.7484dp + 280.7547dp + 281.7610dp + 282.7673dp + 283.7735dp + 284.7798dp + 285.7861dp + 286.7924dp + 287.7987dp + 288.8050dp + 289.8113dp + 290.8176dp + 291.8239dp + 292.8301dp + 293.8364dp + 294.8427dp + 295.8490dp + 296.8553dp + 297.8616dp + 298.8679dp + 299.8742dp + 300.8805dp + 301.8868dp + 302.8930dp + 303.8993dp + 304.9056dp + 305.9119dp + 306.9182dp + 307.9245dp + 308.9308dp + 309.9371dp + 310.9434dp + 311.9496dp + 312.9559dp + 313.9622dp + 314.9685dp + 315.9748dp + 316.9811dp + 317.9874dp + 318.9937dp + 320.0000dp + 321.0062dp + 322.0125dp + 323.0188dp + 324.0251dp + 325.0314dp + 326.0377dp + 327.0440dp + 328.0503dp + 329.0566dp + 330.0628dp + 331.0691dp + 332.0754dp + 333.0817dp + 334.0880dp + 335.0943dp + 336.1006dp + 337.1069dp + 338.1132dp + 339.1194dp + 340.1257dp + 341.1320dp + 342.1383dp + 343.1446dp + 344.1509dp + 345.1572dp + 346.1635dp + 347.1698dp + 348.1761dp + 349.1823dp + 350.1886dp + 351.1949dp + 352.2012dp + 353.2075dp + 354.2138dp + 355.2201dp + 356.2264dp + 357.2327dp + 358.2389dp + 359.2452dp + 360.2515dp + 361.2578dp + 362.2641dp + 367.2955dp + 372.3270dp + 402.5157dp + 412.5786dp + 424.6540dp + 474.9685dp + 503.1446dp + 603.7735dp + 644.0251dp + 724.5282dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw362dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw362dp/dimens_sp.xml new file mode 100644 index 0000000..61137a0 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw362dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 6.0377sp + 7.0440sp + 8.0503sp + 9.0566sp + 10.0629sp + 11.0692sp + 12.0755sp + 13.0818sp + 14.0880sp + 15.0943sp + 16.1006sp + 17.1069sp + 18.1132sp + 19.1195sp + 20.1258sp + 21.1321sp + 22.1384sp + 23.1447sp + 24.1509sp + 25.1572sp + 28.1761sp + 30.1887sp + 32.2013sp + 34.2138sp + 36.2264sp + 38.2390sp + 40.2516sp + 42.2641sp + 48.3019sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw384dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw384dp/dimens_dp.xml new file mode 100644 index 0000000..6d8b3a6 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw384dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -64.0000dp + -32.0000dp + -21.3333dp + -12.8000dp + -10.6667dp + -8.5333dp + -5.3333dp + -2.1333dp + -1.0667dp + + 0.1067dp + 0.5333dp + 1.0667dp + 1.6000dp + 2.1333dp + 2.6667dp + 3.2000dp + 3.7333dp + 4.2667dp + 4.8000dp + 5.3333dp + 6.4000dp + 7.4667dp + 8.5333dp + 9.6000dp + 10.6667dp + 11.7333dp + 12.8000dp + 13.8667dp + 14.9333dp + 16.0000dp + 17.0667dp + 18.1333dp + 19.2000dp + 20.2667dp + 21.3333dp + 22.4000dp + 23.4667dp + 24.5333dp + 25.6000dp + 26.6667dp + 27.7333dp + 28.8000dp + 29.8667dp + 30.9333dp + 32.0000dp + 33.0667dp + 34.1333dp + 35.2000dp + 36.2667dp + 37.3333dp + 38.4000dp + 39.4667dp + 40.5333dp + 41.6000dp + 42.6667dp + 43.7333dp + 44.8000dp + 45.8667dp + 46.9333dp + 48.0000dp + 49.0667dp + 50.1333dp + 51.2000dp + 52.2667dp + 53.3333dp + 54.4000dp + 55.4667dp + 56.5333dp + 57.6000dp + 58.6667dp + 59.7333dp + 60.8000dp + 61.8667dp + 62.9333dp + 64.0000dp + 65.0667dp + 66.1333dp + 67.2000dp + 68.2667dp + 69.3333dp + 70.4000dp + 71.4667dp + 72.5333dp + 73.6000dp + 74.6667dp + 75.7333dp + 76.8000dp + 77.8667dp + 78.9333dp + 80.0000dp + 81.0667dp + 82.1333dp + 83.2000dp + 84.2667dp + 85.3333dp + 86.4000dp + 87.4667dp + 88.5333dp + 89.6000dp + 90.6667dp + 91.7333dp + 92.8000dp + 93.8667dp + 94.9333dp + 96.0000dp + 97.0667dp + 98.1333dp + 99.2000dp + 100.2667dp + 101.3333dp + 102.4000dp + 103.4667dp + 104.5333dp + 105.6000dp + 106.6667dp + 107.7333dp + 108.8000dp + 109.8667dp + 110.9333dp + 112.0000dp + 113.0667dp + 114.1333dp + 115.2000dp + 116.2667dp + 117.3333dp + 118.4000dp + 119.4667dp + 120.5333dp + 121.6000dp + 122.6667dp + 123.7333dp + 124.8000dp + 125.8667dp + 126.9333dp + 128.0000dp + 129.0667dp + 130.1333dp + 131.2000dp + 132.2667dp + 133.3333dp + 134.4000dp + 135.4667dp + 136.5333dp + 137.6000dp + 138.6667dp + 139.7333dp + 140.8000dp + 141.8667dp + 142.9333dp + 144.0000dp + 145.0667dp + 146.1333dp + 147.2000dp + 148.2667dp + 149.3333dp + 150.4000dp + 151.4667dp + 152.5333dp + 153.6000dp + 154.6667dp + 155.7333dp + 156.8000dp + 157.8667dp + 158.9333dp + 160.0000dp + 161.0667dp + 162.1333dp + 163.2000dp + 164.2667dp + 165.3333dp + 166.4000dp + 167.4667dp + 168.5333dp + 169.6000dp + 170.6667dp + 171.7333dp + 172.8000dp + 173.8667dp + 174.9333dp + 176.0000dp + 177.0667dp + 178.1333dp + 179.2000dp + 180.2667dp + 181.3333dp + 182.4000dp + 183.4667dp + 184.5333dp + 185.6000dp + 186.6667dp + 187.7333dp + 188.8000dp + 189.8667dp + 190.9333dp + 192.0000dp + 193.0667dp + 194.1333dp + 195.2000dp + 196.2667dp + 197.3333dp + 198.4000dp + 199.4667dp + 200.5333dp + 201.6000dp + 202.6667dp + 203.7333dp + 204.8000dp + 205.8667dp + 206.9333dp + 208.0000dp + 209.0667dp + 210.1333dp + 211.2000dp + 212.2667dp + 213.3333dp + 214.4000dp + 215.4667dp + 216.5333dp + 217.6000dp + 218.6667dp + 219.7333dp + 220.8000dp + 221.8667dp + 222.9333dp + 224.0000dp + 225.0667dp + 226.1333dp + 227.2000dp + 228.2667dp + 229.3333dp + 230.4000dp + 231.4667dp + 232.5333dp + 233.6000dp + 234.6667dp + 235.7333dp + 236.8000dp + 237.8667dp + 238.9333dp + 240.0000dp + 241.0667dp + 242.1333dp + 243.2000dp + 244.2667dp + 245.3333dp + 246.4000dp + 247.4667dp + 248.5333dp + 249.6000dp + 250.6667dp + 251.7333dp + 252.8000dp + 253.8667dp + 254.9333dp + 256.0000dp + 257.0667dp + 258.1333dp + 259.2000dp + 260.2667dp + 261.3333dp + 262.4000dp + 263.4667dp + 264.5333dp + 265.6000dp + 266.6667dp + 267.7333dp + 268.8000dp + 269.8667dp + 270.9333dp + 272.0000dp + 273.0667dp + 274.1333dp + 275.2000dp + 276.2667dp + 277.3333dp + 278.4000dp + 279.4667dp + 280.5333dp + 281.6000dp + 282.6667dp + 283.7333dp + 284.8000dp + 285.8667dp + 286.9333dp + 288.0000dp + 289.0667dp + 290.1333dp + 291.2000dp + 292.2667dp + 293.3333dp + 294.4000dp + 295.4667dp + 296.5333dp + 297.6000dp + 298.6667dp + 299.7333dp + 300.8000dp + 301.8667dp + 302.9333dp + 304.0000dp + 305.0667dp + 306.1333dp + 307.2000dp + 308.2667dp + 309.3333dp + 310.4000dp + 311.4667dp + 312.5333dp + 313.6000dp + 314.6667dp + 315.7333dp + 316.8000dp + 317.8667dp + 318.9333dp + 320.0000dp + 321.0667dp + 322.1333dp + 323.2000dp + 324.2667dp + 325.3333dp + 326.4000dp + 327.4667dp + 328.5333dp + 329.6000dp + 330.6667dp + 331.7333dp + 332.8000dp + 333.8667dp + 334.9333dp + 336.0000dp + 337.0667dp + 338.1333dp + 339.2000dp + 340.2667dp + 341.3333dp + 342.4000dp + 343.4667dp + 344.5333dp + 345.6000dp + 346.6667dp + 347.7333dp + 348.8000dp + 349.8667dp + 350.9333dp + 352.0000dp + 353.0667dp + 354.1333dp + 355.2000dp + 356.2667dp + 357.3333dp + 358.4000dp + 359.4667dp + 360.5333dp + 361.6000dp + 362.6667dp + 363.7333dp + 364.8000dp + 365.8667dp + 366.9333dp + 368.0000dp + 369.0667dp + 370.1333dp + 371.2000dp + 372.2667dp + 373.3333dp + 374.4000dp + 375.4667dp + 376.5333dp + 377.6000dp + 378.6667dp + 379.7333dp + 380.8000dp + 381.8667dp + 382.9333dp + 384.0000dp + 389.3333dp + 394.6667dp + 426.6667dp + 437.3333dp + 450.1333dp + 503.4667dp + 533.3333dp + 640.0000dp + 682.6667dp + 768.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw384dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw384dp/dimens_sp.xml new file mode 100644 index 0000000..47c5af6 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw384dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 6.4000sp + 7.4667sp + 8.5333sp + 9.6000sp + 10.6667sp + 11.7333sp + 12.8000sp + 13.8667sp + 14.9333sp + 16.0000sp + 17.0667sp + 18.1333sp + 19.2000sp + 20.2667sp + 21.3333sp + 22.4000sp + 23.4667sp + 24.5333sp + 25.6000sp + 26.6667sp + 29.8667sp + 32.0000sp + 34.1333sp + 36.2667sp + 38.4000sp + 40.5333sp + 42.6667sp + 44.8000sp + 51.2000sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw392dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw392dp/dimens_dp.xml new file mode 100644 index 0000000..45357c0 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw392dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -65.4545dp + -32.7273dp + -21.8182dp + -13.0909dp + -10.9091dp + -8.7273dp + -5.4545dp + -2.1818dp + -1.0909dp + + 0.1091dp + 0.5455dp + 1.0909dp + 1.6364dp + 2.1818dp + 2.7273dp + 3.2727dp + 3.8182dp + 4.3636dp + 4.9091dp + 5.4545dp + 6.5455dp + 7.6364dp + 8.7273dp + 9.8182dp + 10.9091dp + 12.0000dp + 13.0909dp + 14.1818dp + 15.2727dp + 16.3636dp + 17.4545dp + 18.5455dp + 19.6364dp + 20.7273dp + 21.8182dp + 22.9091dp + 24.0000dp + 25.0909dp + 26.1818dp + 27.2727dp + 28.3636dp + 29.4545dp + 30.5454dp + 31.6364dp + 32.7273dp + 33.8182dp + 34.9091dp + 36.0000dp + 37.0909dp + 38.1818dp + 39.2727dp + 40.3636dp + 41.4545dp + 42.5454dp + 43.6364dp + 44.7273dp + 45.8182dp + 46.9091dp + 48.0000dp + 49.0909dp + 50.1818dp + 51.2727dp + 52.3636dp + 53.4545dp + 54.5454dp + 55.6364dp + 56.7273dp + 57.8182dp + 58.9091dp + 60.0000dp + 61.0909dp + 62.1818dp + 63.2727dp + 64.3636dp + 65.4545dp + 66.5454dp + 67.6364dp + 68.7273dp + 69.8182dp + 70.9091dp + 72.0000dp + 73.0909dp + 74.1818dp + 75.2727dp + 76.3636dp + 77.4545dp + 78.5454dp + 79.6363dp + 80.7273dp + 81.8182dp + 82.9091dp + 84.0000dp + 85.0909dp + 86.1818dp + 87.2727dp + 88.3636dp + 89.4545dp + 90.5454dp + 91.6363dp + 92.7273dp + 93.8182dp + 94.9091dp + 96.0000dp + 97.0909dp + 98.1818dp + 99.2727dp + 100.3636dp + 101.4545dp + 102.5454dp + 103.6363dp + 104.7273dp + 105.8182dp + 106.9091dp + 108.0000dp + 109.0909dp + 110.1818dp + 111.2727dp + 112.3636dp + 113.4545dp + 114.5454dp + 115.6363dp + 116.7273dp + 117.8182dp + 118.9091dp + 120.0000dp + 121.0909dp + 122.1818dp + 123.2727dp + 124.3636dp + 125.4545dp + 126.5454dp + 127.6363dp + 128.7272dp + 129.8182dp + 130.9091dp + 132.0000dp + 133.0909dp + 134.1818dp + 135.2727dp + 136.3636dp + 137.4545dp + 138.5454dp + 139.6363dp + 140.7272dp + 141.8182dp + 142.9091dp + 144.0000dp + 145.0909dp + 146.1818dp + 147.2727dp + 148.3636dp + 149.4545dp + 150.5454dp + 151.6363dp + 152.7272dp + 153.8182dp + 154.9091dp + 156.0000dp + 157.0909dp + 158.1818dp + 159.2727dp + 160.3636dp + 161.4545dp + 162.5454dp + 163.6363dp + 164.7272dp + 165.8182dp + 166.9091dp + 168.0000dp + 169.0909dp + 170.1818dp + 171.2727dp + 172.3636dp + 173.4545dp + 174.5454dp + 175.6363dp + 176.7272dp + 177.8181dp + 178.9091dp + 180.0000dp + 181.0909dp + 182.1818dp + 183.2727dp + 184.3636dp + 185.4545dp + 186.5454dp + 187.6363dp + 188.7272dp + 189.8181dp + 190.9091dp + 192.0000dp + 193.0909dp + 194.1818dp + 195.2727dp + 196.3636dp + 197.4545dp + 198.5454dp + 199.6363dp + 200.7272dp + 201.8181dp + 202.9091dp + 204.0000dp + 205.0909dp + 206.1818dp + 207.2727dp + 208.3636dp + 209.4545dp + 210.5454dp + 211.6363dp + 212.7272dp + 213.8181dp + 214.9091dp + 216.0000dp + 217.0909dp + 218.1818dp + 219.2727dp + 220.3636dp + 221.4545dp + 222.5454dp + 223.6363dp + 224.7272dp + 225.8181dp + 226.9090dp + 228.0000dp + 229.0909dp + 230.1818dp + 231.2727dp + 232.3636dp + 233.4545dp + 234.5454dp + 235.6363dp + 236.7272dp + 237.8181dp + 238.9090dp + 240.0000dp + 241.0909dp + 242.1818dp + 243.2727dp + 244.3636dp + 245.4545dp + 246.5454dp + 247.6363dp + 248.7272dp + 249.8181dp + 250.9090dp + 252.0000dp + 253.0909dp + 254.1818dp + 255.2727dp + 256.3636dp + 257.4545dp + 258.5454dp + 259.6363dp + 260.7272dp + 261.8181dp + 262.9090dp + 264.0000dp + 265.0909dp + 266.1818dp + 267.2727dp + 268.3636dp + 269.4545dp + 270.5454dp + 271.6363dp + 272.7272dp + 273.8181dp + 274.9090dp + 275.9999dp + 277.0909dp + 278.1818dp + 279.2727dp + 280.3636dp + 281.4545dp + 282.5454dp + 283.6363dp + 284.7272dp + 285.8181dp + 286.9090dp + 287.9999dp + 289.0909dp + 290.1818dp + 291.2727dp + 292.3636dp + 293.4545dp + 294.5454dp + 295.6363dp + 296.7272dp + 297.8181dp + 298.9090dp + 299.9999dp + 301.0909dp + 302.1818dp + 303.2727dp + 304.3636dp + 305.4545dp + 306.5454dp + 307.6363dp + 308.7272dp + 309.8181dp + 310.9090dp + 311.9999dp + 313.0909dp + 314.1818dp + 315.2727dp + 316.3636dp + 317.4545dp + 318.5454dp + 319.6363dp + 320.7272dp + 321.8181dp + 322.9090dp + 323.9999dp + 325.0908dp + 326.1818dp + 327.2727dp + 328.3636dp + 329.4545dp + 330.5454dp + 331.6363dp + 332.7272dp + 333.8181dp + 334.9090dp + 335.9999dp + 337.0908dp + 338.1818dp + 339.2727dp + 340.3636dp + 341.4545dp + 342.5454dp + 343.6363dp + 344.7272dp + 345.8181dp + 346.9090dp + 347.9999dp + 349.0908dp + 350.1818dp + 351.2727dp + 352.3636dp + 353.4545dp + 354.5454dp + 355.6363dp + 356.7272dp + 357.8181dp + 358.9090dp + 359.9999dp + 361.0908dp + 362.1818dp + 363.2727dp + 364.3636dp + 365.4545dp + 366.5454dp + 367.6363dp + 368.7272dp + 369.8181dp + 370.9090dp + 371.9999dp + 373.0908dp + 374.1817dp + 375.2727dp + 376.3636dp + 377.4545dp + 378.5454dp + 379.6363dp + 380.7272dp + 381.8181dp + 382.9090dp + 383.9999dp + 385.0908dp + 386.1817dp + 387.2727dp + 388.3636dp + 389.4545dp + 390.5454dp + 391.6363dp + 392.7272dp + 398.1817dp + 403.6363dp + 436.3636dp + 447.2726dp + 460.3636dp + 514.9090dp + 545.4544dp + 654.5453dp + 698.1817dp + 785.4544dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw392dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw392dp/dimens_sp.xml new file mode 100644 index 0000000..f9156eb --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw392dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 6.5455sp + 7.6364sp + 8.7273sp + 9.8182sp + 10.9091sp + 12.0000sp + 13.0909sp + 14.1818sp + 15.2727sp + 16.3636sp + 17.4545sp + 18.5455sp + 19.6364sp + 20.7273sp + 21.8182sp + 22.9091sp + 24.0000sp + 25.0909sp + 26.1818sp + 27.2727sp + 30.5454sp + 32.7273sp + 34.9091sp + 37.0909sp + 39.2727sp + 41.4545sp + 43.6364sp + 45.8182sp + 52.3636sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw400dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw400dp/dimens_dp.xml new file mode 100644 index 0000000..8428cbc --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw400dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -66.6667dp + -33.3333dp + -22.2222dp + -13.3333dp + -11.1111dp + -8.8889dp + -5.5556dp + -2.2222dp + -1.1111dp + + 0.1111dp + 0.5556dp + 1.1111dp + 1.6667dp + 2.2222dp + 2.7778dp + 3.3333dp + 3.8889dp + 4.4444dp + 5.0000dp + 5.5556dp + 6.6667dp + 7.7778dp + 8.8889dp + 10.0000dp + 11.1111dp + 12.2222dp + 13.3333dp + 14.4444dp + 15.5556dp + 16.6667dp + 17.7778dp + 18.8889dp + 20.0000dp + 21.1111dp + 22.2222dp + 23.3333dp + 24.4444dp + 25.5556dp + 26.6667dp + 27.7778dp + 28.8889dp + 30.0000dp + 31.1111dp + 32.2222dp + 33.3333dp + 34.4444dp + 35.5556dp + 36.6667dp + 37.7778dp + 38.8889dp + 40.0000dp + 41.1111dp + 42.2222dp + 43.3333dp + 44.4444dp + 45.5556dp + 46.6667dp + 47.7778dp + 48.8889dp + 50.0000dp + 51.1111dp + 52.2222dp + 53.3333dp + 54.4444dp + 55.5556dp + 56.6667dp + 57.7778dp + 58.8889dp + 60.0000dp + 61.1111dp + 62.2222dp + 63.3333dp + 64.4444dp + 65.5556dp + 66.6667dp + 67.7778dp + 68.8889dp + 70.0000dp + 71.1111dp + 72.2222dp + 73.3333dp + 74.4444dp + 75.5556dp + 76.6667dp + 77.7778dp + 78.8889dp + 80.0000dp + 81.1111dp + 82.2222dp + 83.3333dp + 84.4444dp + 85.5556dp + 86.6667dp + 87.7778dp + 88.8889dp + 90.0000dp + 91.1111dp + 92.2222dp + 93.3333dp + 94.4444dp + 95.5556dp + 96.6667dp + 97.7778dp + 98.8889dp + 100.0000dp + 101.1111dp + 102.2222dp + 103.3333dp + 104.4444dp + 105.5556dp + 106.6667dp + 107.7778dp + 108.8889dp + 110.0000dp + 111.1111dp + 112.2222dp + 113.3333dp + 114.4444dp + 115.5556dp + 116.6667dp + 117.7778dp + 118.8889dp + 120.0000dp + 121.1111dp + 122.2222dp + 123.3333dp + 124.4444dp + 125.5556dp + 126.6667dp + 127.7778dp + 128.8889dp + 130.0000dp + 131.1111dp + 132.2222dp + 133.3333dp + 134.4444dp + 135.5556dp + 136.6667dp + 137.7778dp + 138.8889dp + 140.0000dp + 141.1111dp + 142.2222dp + 143.3333dp + 144.4444dp + 145.5556dp + 146.6667dp + 147.7778dp + 148.8889dp + 150.0000dp + 151.1111dp + 152.2222dp + 153.3333dp + 154.4444dp + 155.5556dp + 156.6667dp + 157.7778dp + 158.8889dp + 160.0000dp + 161.1111dp + 162.2222dp + 163.3333dp + 164.4444dp + 165.5556dp + 166.6667dp + 167.7778dp + 168.8889dp + 170.0000dp + 171.1111dp + 172.2222dp + 173.3333dp + 174.4444dp + 175.5556dp + 176.6667dp + 177.7778dp + 178.8889dp + 180.0000dp + 181.1111dp + 182.2222dp + 183.3333dp + 184.4444dp + 185.5556dp + 186.6667dp + 187.7778dp + 188.8889dp + 190.0000dp + 191.1111dp + 192.2222dp + 193.3333dp + 194.4444dp + 195.5556dp + 196.6667dp + 197.7778dp + 198.8889dp + 200.0000dp + 201.1111dp + 202.2222dp + 203.3333dp + 204.4444dp + 205.5556dp + 206.6667dp + 207.7778dp + 208.8889dp + 210.0000dp + 211.1111dp + 212.2222dp + 213.3333dp + 214.4444dp + 215.5556dp + 216.6667dp + 217.7778dp + 218.8889dp + 220.0000dp + 221.1111dp + 222.2222dp + 223.3333dp + 224.4444dp + 225.5556dp + 226.6667dp + 227.7778dp + 228.8889dp + 230.0000dp + 231.1111dp + 232.2222dp + 233.3333dp + 234.4444dp + 235.5556dp + 236.6667dp + 237.7778dp + 238.8889dp + 240.0000dp + 241.1111dp + 242.2222dp + 243.3333dp + 244.4444dp + 245.5556dp + 246.6667dp + 247.7778dp + 248.8889dp + 250.0000dp + 251.1111dp + 252.2222dp + 253.3333dp + 254.4444dp + 255.5556dp + 256.6667dp + 257.7778dp + 258.8889dp + 260.0000dp + 261.1111dp + 262.2222dp + 263.3333dp + 264.4444dp + 265.5556dp + 266.6667dp + 267.7778dp + 268.8889dp + 270.0000dp + 271.1111dp + 272.2222dp + 273.3333dp + 274.4444dp + 275.5556dp + 276.6667dp + 277.7778dp + 278.8889dp + 280.0000dp + 281.1111dp + 282.2222dp + 283.3333dp + 284.4444dp + 285.5556dp + 286.6667dp + 287.7778dp + 288.8889dp + 290.0000dp + 291.1111dp + 292.2222dp + 293.3333dp + 294.4444dp + 295.5556dp + 296.6667dp + 297.7778dp + 298.8889dp + 300.0000dp + 301.1111dp + 302.2222dp + 303.3333dp + 304.4444dp + 305.5556dp + 306.6667dp + 307.7778dp + 308.8889dp + 310.0000dp + 311.1111dp + 312.2222dp + 313.3333dp + 314.4444dp + 315.5556dp + 316.6667dp + 317.7778dp + 318.8889dp + 320.0000dp + 321.1111dp + 322.2222dp + 323.3333dp + 324.4444dp + 325.5556dp + 326.6667dp + 327.7778dp + 328.8889dp + 330.0000dp + 331.1111dp + 332.2222dp + 333.3333dp + 334.4444dp + 335.5556dp + 336.6667dp + 337.7778dp + 338.8889dp + 340.0000dp + 341.1111dp + 342.2222dp + 343.3333dp + 344.4444dp + 345.5556dp + 346.6667dp + 347.7778dp + 348.8889dp + 350.0000dp + 351.1111dp + 352.2222dp + 353.3333dp + 354.4444dp + 355.5556dp + 356.6667dp + 357.7778dp + 358.8889dp + 360.0000dp + 361.1111dp + 362.2222dp + 363.3333dp + 364.4444dp + 365.5556dp + 366.6667dp + 367.7778dp + 368.8889dp + 370.0000dp + 371.1111dp + 372.2222dp + 373.3333dp + 374.4444dp + 375.5556dp + 376.6667dp + 377.7778dp + 378.8889dp + 380.0000dp + 381.1111dp + 382.2222dp + 383.3333dp + 384.4444dp + 385.5556dp + 386.6667dp + 387.7778dp + 388.8889dp + 390.0000dp + 391.1111dp + 392.2222dp + 393.3333dp + 394.4444dp + 395.5556dp + 396.6667dp + 397.7778dp + 398.8889dp + 400.0000dp + 405.5556dp + 411.1111dp + 444.4444dp + 455.5556dp + 468.8889dp + 524.4444dp + 555.5556dp + 666.6667dp + 711.1111dp + 800.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw400dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw400dp/dimens_sp.xml new file mode 100644 index 0000000..f4f031b --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw400dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 6.6667sp + 7.7778sp + 8.8889sp + 10.0000sp + 11.1111sp + 12.2222sp + 13.3333sp + 14.4444sp + 15.5556sp + 16.6667sp + 17.7778sp + 18.8889sp + 20.0000sp + 21.1111sp + 22.2222sp + 23.3333sp + 24.4444sp + 25.5556sp + 26.6667sp + 27.7778sp + 31.1111sp + 33.3333sp + 35.5556sp + 37.7778sp + 40.0000sp + 42.2222sp + 44.4444sp + 46.6667sp + 53.3333sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw410dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw410dp/dimens_dp.xml new file mode 100644 index 0000000..152eef9 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw410dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -68.3333dp + -34.1667dp + -22.7778dp + -13.6667dp + -11.3889dp + -9.1111dp + -5.6944dp + -2.2778dp + -1.1389dp + + 0.1139dp + 0.5694dp + 1.1389dp + 1.7083dp + 2.2778dp + 2.8472dp + 3.4167dp + 3.9861dp + 4.5556dp + 5.1250dp + 5.6944dp + 6.8333dp + 7.9722dp + 9.1111dp + 10.2500dp + 11.3889dp + 12.5278dp + 13.6667dp + 14.8056dp + 15.9444dp + 17.0833dp + 18.2222dp + 19.3611dp + 20.5000dp + 21.6389dp + 22.7778dp + 23.9167dp + 25.0556dp + 26.1944dp + 27.3333dp + 28.4722dp + 29.6111dp + 30.7500dp + 31.8889dp + 33.0278dp + 34.1667dp + 35.3056dp + 36.4444dp + 37.5833dp + 38.7222dp + 39.8611dp + 41.0000dp + 42.1389dp + 43.2778dp + 44.4167dp + 45.5556dp + 46.6944dp + 47.8333dp + 48.9722dp + 50.1111dp + 51.2500dp + 52.3889dp + 53.5278dp + 54.6667dp + 55.8056dp + 56.9444dp + 58.0833dp + 59.2222dp + 60.3611dp + 61.5000dp + 62.6389dp + 63.7778dp + 64.9167dp + 66.0556dp + 67.1944dp + 68.3333dp + 69.4722dp + 70.6111dp + 71.7500dp + 72.8889dp + 74.0278dp + 75.1667dp + 76.3056dp + 77.4444dp + 78.5833dp + 79.7222dp + 80.8611dp + 82.0000dp + 83.1389dp + 84.2778dp + 85.4167dp + 86.5556dp + 87.6944dp + 88.8333dp + 89.9722dp + 91.1111dp + 92.2500dp + 93.3889dp + 94.5278dp + 95.6667dp + 96.8056dp + 97.9444dp + 99.0833dp + 100.2222dp + 101.3611dp + 102.5000dp + 103.6389dp + 104.7778dp + 105.9167dp + 107.0556dp + 108.1944dp + 109.3333dp + 110.4722dp + 111.6111dp + 112.7500dp + 113.8889dp + 115.0278dp + 116.1667dp + 117.3056dp + 118.4444dp + 119.5833dp + 120.7222dp + 121.8611dp + 123.0000dp + 124.1389dp + 125.2778dp + 126.4167dp + 127.5556dp + 128.6944dp + 129.8333dp + 130.9722dp + 132.1111dp + 133.2500dp + 134.3889dp + 135.5278dp + 136.6667dp + 137.8056dp + 138.9444dp + 140.0833dp + 141.2222dp + 142.3611dp + 143.5000dp + 144.6389dp + 145.7778dp + 146.9167dp + 148.0556dp + 149.1944dp + 150.3333dp + 151.4722dp + 152.6111dp + 153.7500dp + 154.8889dp + 156.0278dp + 157.1667dp + 158.3056dp + 159.4444dp + 160.5833dp + 161.7222dp + 162.8611dp + 164.0000dp + 165.1389dp + 166.2778dp + 167.4167dp + 168.5556dp + 169.6944dp + 170.8333dp + 171.9722dp + 173.1111dp + 174.2500dp + 175.3889dp + 176.5278dp + 177.6667dp + 178.8056dp + 179.9444dp + 181.0833dp + 182.2222dp + 183.3611dp + 184.5000dp + 185.6389dp + 186.7778dp + 187.9167dp + 189.0556dp + 190.1944dp + 191.3333dp + 192.4722dp + 193.6111dp + 194.7500dp + 195.8889dp + 197.0278dp + 198.1667dp + 199.3056dp + 200.4444dp + 201.5833dp + 202.7222dp + 203.8611dp + 205.0000dp + 206.1389dp + 207.2778dp + 208.4167dp + 209.5556dp + 210.6944dp + 211.8333dp + 212.9722dp + 214.1111dp + 215.2500dp + 216.3889dp + 217.5278dp + 218.6667dp + 219.8056dp + 220.9444dp + 222.0833dp + 223.2222dp + 224.3611dp + 225.5000dp + 226.6389dp + 227.7778dp + 228.9167dp + 230.0556dp + 231.1944dp + 232.3333dp + 233.4722dp + 234.6111dp + 235.7500dp + 236.8889dp + 238.0278dp + 239.1667dp + 240.3056dp + 241.4444dp + 242.5833dp + 243.7222dp + 244.8611dp + 246.0000dp + 247.1389dp + 248.2778dp + 249.4167dp + 250.5556dp + 251.6944dp + 252.8333dp + 253.9722dp + 255.1111dp + 256.2500dp + 257.3889dp + 258.5278dp + 259.6667dp + 260.8056dp + 261.9444dp + 263.0833dp + 264.2222dp + 265.3611dp + 266.5000dp + 267.6389dp + 268.7778dp + 269.9167dp + 271.0556dp + 272.1944dp + 273.3333dp + 274.4722dp + 275.6111dp + 276.7500dp + 277.8889dp + 279.0278dp + 280.1667dp + 281.3056dp + 282.4444dp + 283.5833dp + 284.7222dp + 285.8611dp + 287.0000dp + 288.1389dp + 289.2778dp + 290.4167dp + 291.5556dp + 292.6944dp + 293.8333dp + 294.9722dp + 296.1111dp + 297.2500dp + 298.3889dp + 299.5278dp + 300.6667dp + 301.8056dp + 302.9444dp + 304.0833dp + 305.2222dp + 306.3611dp + 307.5000dp + 308.6389dp + 309.7778dp + 310.9167dp + 312.0556dp + 313.1944dp + 314.3333dp + 315.4722dp + 316.6111dp + 317.7500dp + 318.8889dp + 320.0278dp + 321.1667dp + 322.3056dp + 323.4444dp + 324.5833dp + 325.7222dp + 326.8611dp + 328.0000dp + 329.1389dp + 330.2778dp + 331.4167dp + 332.5556dp + 333.6944dp + 334.8333dp + 335.9722dp + 337.1111dp + 338.2500dp + 339.3889dp + 340.5278dp + 341.6667dp + 342.8056dp + 343.9444dp + 345.0833dp + 346.2222dp + 347.3611dp + 348.5000dp + 349.6389dp + 350.7778dp + 351.9167dp + 353.0556dp + 354.1944dp + 355.3333dp + 356.4722dp + 357.6111dp + 358.7500dp + 359.8889dp + 361.0278dp + 362.1667dp + 363.3056dp + 364.4444dp + 365.5833dp + 366.7222dp + 367.8611dp + 369.0000dp + 370.1389dp + 371.2778dp + 372.4167dp + 373.5556dp + 374.6944dp + 375.8333dp + 376.9722dp + 378.1111dp + 379.2500dp + 380.3889dp + 381.5278dp + 382.6667dp + 383.8056dp + 384.9444dp + 386.0833dp + 387.2222dp + 388.3611dp + 389.5000dp + 390.6389dp + 391.7778dp + 392.9167dp + 394.0556dp + 395.1944dp + 396.3333dp + 397.4722dp + 398.6111dp + 399.7500dp + 400.8889dp + 402.0278dp + 403.1667dp + 404.3056dp + 405.4444dp + 406.5833dp + 407.7222dp + 408.8611dp + 410.0000dp + 415.6944dp + 421.3889dp + 455.5556dp + 466.9444dp + 480.6111dp + 537.5556dp + 569.4444dp + 683.3333dp + 728.8889dp + 820.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw410dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw410dp/dimens_sp.xml new file mode 100644 index 0000000..1f93ba0 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw410dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 6.8333sp + 7.9722sp + 9.1111sp + 10.2500sp + 11.3889sp + 12.5278sp + 13.6667sp + 14.8056sp + 15.9444sp + 17.0833sp + 18.2222sp + 19.3611sp + 20.5000sp + 21.6389sp + 22.7778sp + 23.9167sp + 25.0556sp + 26.1944sp + 27.3333sp + 28.4722sp + 31.8889sp + 34.1667sp + 36.4444sp + 38.7222sp + 41.0000sp + 43.2778sp + 45.5556sp + 47.8333sp + 54.6667sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw411dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw411dp/dimens_dp.xml new file mode 100644 index 0000000..e628dce --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw411dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -68.5714dp + -34.2857dp + -22.8571dp + -13.7143dp + -11.4286dp + -9.1429dp + -5.7143dp + -2.2857dp + -1.1429dp + + 0.1143dp + 0.5714dp + 1.1429dp + 1.7143dp + 2.2857dp + 2.8571dp + 3.4286dp + 4.0000dp + 4.5714dp + 5.1429dp + 5.7143dp + 6.8571dp + 8.0000dp + 9.1429dp + 10.2857dp + 11.4286dp + 12.5714dp + 13.7143dp + 14.8571dp + 16.0000dp + 17.1429dp + 18.2857dp + 19.4286dp + 20.5714dp + 21.7143dp + 22.8571dp + 24.0000dp + 25.1429dp + 26.2857dp + 27.4286dp + 28.5714dp + 29.7143dp + 30.8571dp + 32.0000dp + 33.1429dp + 34.2857dp + 35.4286dp + 36.5714dp + 37.7143dp + 38.8571dp + 40.0000dp + 41.1428dp + 42.2857dp + 43.4286dp + 44.5714dp + 45.7143dp + 46.8571dp + 48.0000dp + 49.1428dp + 50.2857dp + 51.4286dp + 52.5714dp + 53.7143dp + 54.8571dp + 56.0000dp + 57.1428dp + 58.2857dp + 59.4286dp + 60.5714dp + 61.7143dp + 62.8571dp + 64.0000dp + 65.1428dp + 66.2857dp + 67.4286dp + 68.5714dp + 69.7143dp + 70.8571dp + 72.0000dp + 73.1428dp + 74.2857dp + 75.4286dp + 76.5714dp + 77.7143dp + 78.8571dp + 80.0000dp + 81.1428dp + 82.2857dp + 83.4286dp + 84.5714dp + 85.7143dp + 86.8571dp + 88.0000dp + 89.1428dp + 90.2857dp + 91.4286dp + 92.5714dp + 93.7143dp + 94.8571dp + 96.0000dp + 97.1428dp + 98.2857dp + 99.4286dp + 100.5714dp + 101.7143dp + 102.8571dp + 104.0000dp + 105.1428dp + 106.2857dp + 107.4286dp + 108.5714dp + 109.7143dp + 110.8571dp + 112.0000dp + 113.1428dp + 114.2857dp + 115.4286dp + 116.5714dp + 117.7143dp + 118.8571dp + 120.0000dp + 121.1428dp + 122.2857dp + 123.4285dp + 124.5714dp + 125.7143dp + 126.8571dp + 128.0000dp + 129.1428dp + 130.2857dp + 131.4285dp + 132.5714dp + 133.7143dp + 134.8571dp + 136.0000dp + 137.1428dp + 138.2857dp + 139.4285dp + 140.5714dp + 141.7143dp + 142.8571dp + 144.0000dp + 145.1428dp + 146.2857dp + 147.4285dp + 148.5714dp + 149.7143dp + 150.8571dp + 152.0000dp + 153.1428dp + 154.2857dp + 155.4285dp + 156.5714dp + 157.7143dp + 158.8571dp + 160.0000dp + 161.1428dp + 162.2857dp + 163.4285dp + 164.5714dp + 165.7143dp + 166.8571dp + 168.0000dp + 169.1428dp + 170.2857dp + 171.4285dp + 172.5714dp + 173.7143dp + 174.8571dp + 176.0000dp + 177.1428dp + 178.2857dp + 179.4285dp + 180.5714dp + 181.7143dp + 182.8571dp + 184.0000dp + 185.1428dp + 186.2857dp + 187.4285dp + 188.5714dp + 189.7143dp + 190.8571dp + 192.0000dp + 193.1428dp + 194.2857dp + 195.4285dp + 196.5714dp + 197.7143dp + 198.8571dp + 200.0000dp + 201.1428dp + 202.2857dp + 203.4285dp + 204.5714dp + 205.7142dp + 206.8571dp + 208.0000dp + 209.1428dp + 210.2857dp + 211.4285dp + 212.5714dp + 213.7142dp + 214.8571dp + 216.0000dp + 217.1428dp + 218.2857dp + 219.4285dp + 220.5714dp + 221.7142dp + 222.8571dp + 224.0000dp + 225.1428dp + 226.2857dp + 227.4285dp + 228.5714dp + 229.7142dp + 230.8571dp + 232.0000dp + 233.1428dp + 234.2857dp + 235.4285dp + 236.5714dp + 237.7142dp + 238.8571dp + 240.0000dp + 241.1428dp + 242.2857dp + 243.4285dp + 244.5714dp + 245.7142dp + 246.8571dp + 248.0000dp + 249.1428dp + 250.2857dp + 251.4285dp + 252.5714dp + 253.7142dp + 254.8571dp + 256.0000dp + 257.1428dp + 258.2857dp + 259.4285dp + 260.5714dp + 261.7142dp + 262.8571dp + 264.0000dp + 265.1428dp + 266.2857dp + 267.4285dp + 268.5714dp + 269.7142dp + 270.8571dp + 272.0000dp + 273.1428dp + 274.2857dp + 275.4285dp + 276.5714dp + 277.7142dp + 278.8571dp + 280.0000dp + 281.1428dp + 282.2857dp + 283.4285dp + 284.5714dp + 285.7142dp + 286.8571dp + 287.9999dp + 289.1428dp + 290.2857dp + 291.4285dp + 292.5714dp + 293.7142dp + 294.8571dp + 295.9999dp + 297.1428dp + 298.2857dp + 299.4285dp + 300.5714dp + 301.7142dp + 302.8571dp + 303.9999dp + 305.1428dp + 306.2857dp + 307.4285dp + 308.5714dp + 309.7142dp + 310.8571dp + 311.9999dp + 313.1428dp + 314.2857dp + 315.4285dp + 316.5714dp + 317.7142dp + 318.8571dp + 319.9999dp + 321.1428dp + 322.2857dp + 323.4285dp + 324.5714dp + 325.7142dp + 326.8571dp + 327.9999dp + 329.1428dp + 330.2857dp + 331.4285dp + 332.5714dp + 333.7142dp + 334.8571dp + 335.9999dp + 337.1428dp + 338.2857dp + 339.4285dp + 340.5714dp + 341.7142dp + 342.8571dp + 343.9999dp + 345.1428dp + 346.2857dp + 347.4285dp + 348.5714dp + 349.7142dp + 350.8571dp + 351.9999dp + 353.1428dp + 354.2857dp + 355.4285dp + 356.5714dp + 357.7142dp + 358.8571dp + 359.9999dp + 361.1428dp + 362.2857dp + 363.4285dp + 364.5714dp + 365.7142dp + 366.8571dp + 367.9999dp + 369.1428dp + 370.2856dp + 371.4285dp + 372.5714dp + 373.7142dp + 374.8571dp + 375.9999dp + 377.1428dp + 378.2856dp + 379.4285dp + 380.5714dp + 381.7142dp + 382.8571dp + 383.9999dp + 385.1428dp + 386.2856dp + 387.4285dp + 388.5714dp + 389.7142dp + 390.8571dp + 391.9999dp + 393.1428dp + 394.2856dp + 395.4285dp + 396.5714dp + 397.7142dp + 398.8571dp + 399.9999dp + 401.1428dp + 402.2856dp + 403.4285dp + 404.5714dp + 405.7142dp + 406.8571dp + 407.9999dp + 409.1428dp + 410.2856dp + 411.4285dp + 417.1428dp + 422.8571dp + 457.1428dp + 468.5713dp + 482.2856dp + 539.4285dp + 571.4285dp + 685.7142dp + 731.4284dp + 822.8570dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw411dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw411dp/dimens_sp.xml new file mode 100644 index 0000000..27f5ee2 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw411dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 6.8571sp + 8.0000sp + 9.1429sp + 10.2857sp + 11.4286sp + 12.5714sp + 13.7143sp + 14.8571sp + 16.0000sp + 17.1429sp + 18.2857sp + 19.4286sp + 20.5714sp + 21.7143sp + 22.8571sp + 24.0000sp + 25.1429sp + 26.2857sp + 27.4286sp + 28.5714sp + 32.0000sp + 34.2857sp + 36.5714sp + 38.8571sp + 41.1428sp + 43.4286sp + 45.7143sp + 48.0000sp + 54.8571sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw432dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw432dp/dimens_dp.xml new file mode 100644 index 0000000..bdc986e --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw432dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -72.0000dp + -36.0000dp + -24.0000dp + -14.4000dp + -12.0000dp + -9.6000dp + -6.0000dp + -2.4000dp + -1.2000dp + + 0.1200dp + 0.6000dp + 1.2000dp + 1.8000dp + 2.4000dp + 3.0000dp + 3.6000dp + 4.2000dp + 4.8000dp + 5.4000dp + 6.0000dp + 7.2000dp + 8.4000dp + 9.6000dp + 10.8000dp + 12.0000dp + 13.2000dp + 14.4000dp + 15.6000dp + 16.8000dp + 18.0000dp + 19.2000dp + 20.4000dp + 21.6000dp + 22.8000dp + 24.0000dp + 25.2000dp + 26.4000dp + 27.6000dp + 28.8000dp + 30.0000dp + 31.2000dp + 32.4000dp + 33.6000dp + 34.8000dp + 36.0000dp + 37.2000dp + 38.4000dp + 39.6000dp + 40.8000dp + 42.0000dp + 43.2000dp + 44.4000dp + 45.6000dp + 46.8000dp + 48.0000dp + 49.2000dp + 50.4000dp + 51.6000dp + 52.8000dp + 54.0000dp + 55.2000dp + 56.4000dp + 57.6000dp + 58.8000dp + 60.0000dp + 61.2000dp + 62.4000dp + 63.6000dp + 64.8000dp + 66.0000dp + 67.2000dp + 68.4000dp + 69.6000dp + 70.8000dp + 72.0000dp + 73.2000dp + 74.4000dp + 75.6000dp + 76.8000dp + 78.0000dp + 79.2000dp + 80.4000dp + 81.6000dp + 82.8000dp + 84.0000dp + 85.2000dp + 86.4000dp + 87.6000dp + 88.8000dp + 90.0000dp + 91.2000dp + 92.4000dp + 93.6000dp + 94.8000dp + 96.0000dp + 97.2000dp + 98.4000dp + 99.6000dp + 100.8000dp + 102.0000dp + 103.2000dp + 104.4000dp + 105.6000dp + 106.8000dp + 108.0000dp + 109.2000dp + 110.4000dp + 111.6000dp + 112.8000dp + 114.0000dp + 115.2000dp + 116.4000dp + 117.6000dp + 118.8000dp + 120.0000dp + 121.2000dp + 122.4000dp + 123.6000dp + 124.8000dp + 126.0000dp + 127.2000dp + 128.4000dp + 129.6000dp + 130.8000dp + 132.0000dp + 133.2000dp + 134.4000dp + 135.6000dp + 136.8000dp + 138.0000dp + 139.2000dp + 140.4000dp + 141.6000dp + 142.8000dp + 144.0000dp + 145.2000dp + 146.4000dp + 147.6000dp + 148.8000dp + 150.0000dp + 151.2000dp + 152.4000dp + 153.6000dp + 154.8000dp + 156.0000dp + 157.2000dp + 158.4000dp + 159.6000dp + 160.8000dp + 162.0000dp + 163.2000dp + 164.4000dp + 165.6000dp + 166.8000dp + 168.0000dp + 169.2000dp + 170.4000dp + 171.6000dp + 172.8000dp + 174.0000dp + 175.2000dp + 176.4000dp + 177.6000dp + 178.8000dp + 180.0000dp + 181.2000dp + 182.4000dp + 183.6000dp + 184.8000dp + 186.0000dp + 187.2000dp + 188.4000dp + 189.6000dp + 190.8000dp + 192.0000dp + 193.2000dp + 194.4000dp + 195.6000dp + 196.8000dp + 198.0000dp + 199.2000dp + 200.4000dp + 201.6000dp + 202.8000dp + 204.0000dp + 205.2000dp + 206.4000dp + 207.6000dp + 208.8000dp + 210.0000dp + 211.2000dp + 212.4000dp + 213.6000dp + 214.8000dp + 216.0000dp + 217.2000dp + 218.4000dp + 219.6000dp + 220.8000dp + 222.0000dp + 223.2000dp + 224.4000dp + 225.6000dp + 226.8000dp + 228.0000dp + 229.2000dp + 230.4000dp + 231.6000dp + 232.8000dp + 234.0000dp + 235.2000dp + 236.4000dp + 237.6000dp + 238.8000dp + 240.0000dp + 241.2000dp + 242.4000dp + 243.6000dp + 244.8000dp + 246.0000dp + 247.2000dp + 248.4000dp + 249.6000dp + 250.8000dp + 252.0000dp + 253.2000dp + 254.4000dp + 255.6000dp + 256.8000dp + 258.0000dp + 259.2000dp + 260.4000dp + 261.6000dp + 262.8000dp + 264.0000dp + 265.2000dp + 266.4000dp + 267.6000dp + 268.8000dp + 270.0000dp + 271.2000dp + 272.4000dp + 273.6000dp + 274.8000dp + 276.0000dp + 277.2000dp + 278.4000dp + 279.6000dp + 280.8000dp + 282.0000dp + 283.2000dp + 284.4000dp + 285.6000dp + 286.8000dp + 288.0000dp + 289.2000dp + 290.4000dp + 291.6000dp + 292.8000dp + 294.0000dp + 295.2000dp + 296.4000dp + 297.6000dp + 298.8000dp + 300.0000dp + 301.2000dp + 302.4000dp + 303.6000dp + 304.8000dp + 306.0000dp + 307.2000dp + 308.4000dp + 309.6000dp + 310.8000dp + 312.0000dp + 313.2000dp + 314.4000dp + 315.6000dp + 316.8000dp + 318.0000dp + 319.2000dp + 320.4000dp + 321.6000dp + 322.8000dp + 324.0000dp + 325.2000dp + 326.4000dp + 327.6000dp + 328.8000dp + 330.0000dp + 331.2000dp + 332.4000dp + 333.6000dp + 334.8000dp + 336.0000dp + 337.2000dp + 338.4000dp + 339.6000dp + 340.8000dp + 342.0000dp + 343.2000dp + 344.4000dp + 345.6000dp + 346.8000dp + 348.0000dp + 349.2000dp + 350.4000dp + 351.6000dp + 352.8000dp + 354.0000dp + 355.2000dp + 356.4000dp + 357.6000dp + 358.8000dp + 360.0000dp + 361.2000dp + 362.4000dp + 363.6000dp + 364.8000dp + 366.0000dp + 367.2000dp + 368.4000dp + 369.6000dp + 370.8000dp + 372.0000dp + 373.2000dp + 374.4000dp + 375.6000dp + 376.8000dp + 378.0000dp + 379.2000dp + 380.4000dp + 381.6000dp + 382.8000dp + 384.0000dp + 385.2000dp + 386.4000dp + 387.6000dp + 388.8000dp + 390.0000dp + 391.2000dp + 392.4000dp + 393.6000dp + 394.8000dp + 396.0000dp + 397.2000dp + 398.4000dp + 399.6000dp + 400.8000dp + 402.0000dp + 403.2000dp + 404.4000dp + 405.6000dp + 406.8000dp + 408.0000dp + 409.2000dp + 410.4000dp + 411.6000dp + 412.8000dp + 414.0000dp + 415.2000dp + 416.4000dp + 417.6000dp + 418.8000dp + 420.0000dp + 421.2000dp + 422.4000dp + 423.6000dp + 424.8000dp + 426.0000dp + 427.2000dp + 428.4000dp + 429.6000dp + 430.8000dp + 432.0000dp + 438.0000dp + 444.0000dp + 480.0000dp + 492.0000dp + 506.4000dp + 566.4000dp + 600.0000dp + 720.0000dp + 768.0000dp + 864.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw432dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw432dp/dimens_sp.xml new file mode 100644 index 0000000..eacacf1 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw432dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 7.2000sp + 8.4000sp + 9.6000sp + 10.8000sp + 12.0000sp + 13.2000sp + 14.4000sp + 15.6000sp + 16.8000sp + 18.0000sp + 19.2000sp + 20.4000sp + 21.6000sp + 22.8000sp + 24.0000sp + 25.2000sp + 26.4000sp + 27.6000sp + 28.8000sp + 30.0000sp + 33.6000sp + 36.0000sp + 38.4000sp + 40.8000sp + 43.2000sp + 45.6000sp + 48.0000sp + 50.4000sp + 57.6000sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw480dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw480dp/dimens_dp.xml new file mode 100644 index 0000000..b5114c6 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw480dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -80.0000dp + -40.0000dp + -26.6667dp + -16.0000dp + -13.3333dp + -10.6667dp + -6.6667dp + -2.6667dp + -1.3333dp + + 0.1333dp + 0.6667dp + 1.3333dp + 2.0000dp + 2.6667dp + 3.3333dp + 4.0000dp + 4.6667dp + 5.3333dp + 6.0000dp + 6.6667dp + 8.0000dp + 9.3333dp + 10.6667dp + 12.0000dp + 13.3333dp + 14.6667dp + 16.0000dp + 17.3333dp + 18.6667dp + 20.0000dp + 21.3333dp + 22.6667dp + 24.0000dp + 25.3333dp + 26.6667dp + 28.0000dp + 29.3333dp + 30.6667dp + 32.0000dp + 33.3333dp + 34.6667dp + 36.0000dp + 37.3333dp + 38.6667dp + 40.0000dp + 41.3333dp + 42.6667dp + 44.0000dp + 45.3333dp + 46.6667dp + 48.0000dp + 49.3333dp + 50.6667dp + 52.0000dp + 53.3333dp + 54.6667dp + 56.0000dp + 57.3333dp + 58.6667dp + 60.0000dp + 61.3333dp + 62.6667dp + 64.0000dp + 65.3333dp + 66.6667dp + 68.0000dp + 69.3333dp + 70.6667dp + 72.0000dp + 73.3333dp + 74.6667dp + 76.0000dp + 77.3333dp + 78.6667dp + 80.0000dp + 81.3333dp + 82.6667dp + 84.0000dp + 85.3333dp + 86.6667dp + 88.0000dp + 89.3333dp + 90.6667dp + 92.0000dp + 93.3333dp + 94.6667dp + 96.0000dp + 97.3333dp + 98.6667dp + 100.0000dp + 101.3333dp + 102.6667dp + 104.0000dp + 105.3333dp + 106.6667dp + 108.0000dp + 109.3333dp + 110.6667dp + 112.0000dp + 113.3333dp + 114.6667dp + 116.0000dp + 117.3333dp + 118.6667dp + 120.0000dp + 121.3333dp + 122.6667dp + 124.0000dp + 125.3333dp + 126.6667dp + 128.0000dp + 129.3333dp + 130.6667dp + 132.0000dp + 133.3333dp + 134.6667dp + 136.0000dp + 137.3333dp + 138.6667dp + 140.0000dp + 141.3333dp + 142.6667dp + 144.0000dp + 145.3333dp + 146.6667dp + 148.0000dp + 149.3333dp + 150.6667dp + 152.0000dp + 153.3333dp + 154.6667dp + 156.0000dp + 157.3333dp + 158.6667dp + 160.0000dp + 161.3333dp + 162.6667dp + 164.0000dp + 165.3333dp + 166.6667dp + 168.0000dp + 169.3333dp + 170.6667dp + 172.0000dp + 173.3333dp + 174.6667dp + 176.0000dp + 177.3333dp + 178.6667dp + 180.0000dp + 181.3333dp + 182.6667dp + 184.0000dp + 185.3333dp + 186.6667dp + 188.0000dp + 189.3333dp + 190.6667dp + 192.0000dp + 193.3333dp + 194.6667dp + 196.0000dp + 197.3333dp + 198.6667dp + 200.0000dp + 201.3333dp + 202.6667dp + 204.0000dp + 205.3333dp + 206.6667dp + 208.0000dp + 209.3333dp + 210.6667dp + 212.0000dp + 213.3333dp + 214.6667dp + 216.0000dp + 217.3333dp + 218.6667dp + 220.0000dp + 221.3333dp + 222.6667dp + 224.0000dp + 225.3333dp + 226.6667dp + 228.0000dp + 229.3333dp + 230.6667dp + 232.0000dp + 233.3333dp + 234.6667dp + 236.0000dp + 237.3333dp + 238.6667dp + 240.0000dp + 241.3333dp + 242.6667dp + 244.0000dp + 245.3333dp + 246.6667dp + 248.0000dp + 249.3333dp + 250.6667dp + 252.0000dp + 253.3333dp + 254.6667dp + 256.0000dp + 257.3333dp + 258.6667dp + 260.0000dp + 261.3333dp + 262.6667dp + 264.0000dp + 265.3333dp + 266.6667dp + 268.0000dp + 269.3333dp + 270.6667dp + 272.0000dp + 273.3333dp + 274.6667dp + 276.0000dp + 277.3333dp + 278.6667dp + 280.0000dp + 281.3333dp + 282.6667dp + 284.0000dp + 285.3333dp + 286.6667dp + 288.0000dp + 289.3333dp + 290.6667dp + 292.0000dp + 293.3333dp + 294.6667dp + 296.0000dp + 297.3333dp + 298.6667dp + 300.0000dp + 301.3333dp + 302.6667dp + 304.0000dp + 305.3333dp + 306.6667dp + 308.0000dp + 309.3333dp + 310.6667dp + 312.0000dp + 313.3333dp + 314.6667dp + 316.0000dp + 317.3333dp + 318.6667dp + 320.0000dp + 321.3333dp + 322.6667dp + 324.0000dp + 325.3333dp + 326.6667dp + 328.0000dp + 329.3333dp + 330.6667dp + 332.0000dp + 333.3333dp + 334.6667dp + 336.0000dp + 337.3333dp + 338.6667dp + 340.0000dp + 341.3333dp + 342.6667dp + 344.0000dp + 345.3333dp + 346.6667dp + 348.0000dp + 349.3333dp + 350.6667dp + 352.0000dp + 353.3333dp + 354.6667dp + 356.0000dp + 357.3333dp + 358.6667dp + 360.0000dp + 361.3333dp + 362.6667dp + 364.0000dp + 365.3333dp + 366.6667dp + 368.0000dp + 369.3333dp + 370.6667dp + 372.0000dp + 373.3333dp + 374.6667dp + 376.0000dp + 377.3333dp + 378.6667dp + 380.0000dp + 381.3333dp + 382.6667dp + 384.0000dp + 385.3333dp + 386.6667dp + 388.0000dp + 389.3333dp + 390.6667dp + 392.0000dp + 393.3333dp + 394.6667dp + 396.0000dp + 397.3333dp + 398.6667dp + 400.0000dp + 401.3333dp + 402.6667dp + 404.0000dp + 405.3333dp + 406.6667dp + 408.0000dp + 409.3333dp + 410.6667dp + 412.0000dp + 413.3333dp + 414.6667dp + 416.0000dp + 417.3333dp + 418.6667dp + 420.0000dp + 421.3333dp + 422.6667dp + 424.0000dp + 425.3333dp + 426.6667dp + 428.0000dp + 429.3333dp + 430.6667dp + 432.0000dp + 433.3333dp + 434.6667dp + 436.0000dp + 437.3333dp + 438.6667dp + 440.0000dp + 441.3333dp + 442.6667dp + 444.0000dp + 445.3333dp + 446.6667dp + 448.0000dp + 449.3333dp + 450.6667dp + 452.0000dp + 453.3333dp + 454.6667dp + 456.0000dp + 457.3333dp + 458.6667dp + 460.0000dp + 461.3333dp + 462.6667dp + 464.0000dp + 465.3333dp + 466.6667dp + 468.0000dp + 469.3333dp + 470.6667dp + 472.0000dp + 473.3333dp + 474.6667dp + 476.0000dp + 477.3333dp + 478.6667dp + 480.0000dp + 486.6667dp + 493.3333dp + 533.3333dp + 546.6667dp + 562.6667dp + 629.3333dp + 666.6667dp + 800.0000dp + 853.3333dp + 960.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw480dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw480dp/dimens_sp.xml new file mode 100644 index 0000000..46c2116 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw480dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 8.0000sp + 9.3333sp + 10.6667sp + 12.0000sp + 13.3333sp + 14.6667sp + 16.0000sp + 17.3333sp + 18.6667sp + 20.0000sp + 21.3333sp + 22.6667sp + 24.0000sp + 25.3333sp + 26.6667sp + 28.0000sp + 29.3333sp + 30.6667sp + 32.0000sp + 33.3333sp + 37.3333sp + 40.0000sp + 42.6667sp + 45.3333sp + 48.0000sp + 50.6667sp + 53.3333sp + 56.0000sp + 64.0000sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw533dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw533dp/dimens_dp.xml new file mode 100644 index 0000000..f40b47e --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw533dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -88.8333dp + -44.4167dp + -29.6111dp + -17.7667dp + -14.8056dp + -11.8444dp + -7.4028dp + -2.9611dp + -1.4806dp + + 0.1481dp + 0.7403dp + 1.4806dp + 2.2208dp + 2.9611dp + 3.7014dp + 4.4417dp + 5.1819dp + 5.9222dp + 6.6625dp + 7.4028dp + 8.8833dp + 10.3639dp + 11.8444dp + 13.3250dp + 14.8056dp + 16.2861dp + 17.7667dp + 19.2472dp + 20.7278dp + 22.2083dp + 23.6889dp + 25.1694dp + 26.6500dp + 28.1306dp + 29.6111dp + 31.0917dp + 32.5722dp + 34.0528dp + 35.5333dp + 37.0139dp + 38.4944dp + 39.9750dp + 41.4556dp + 42.9361dp + 44.4167dp + 45.8972dp + 47.3778dp + 48.8583dp + 50.3389dp + 51.8194dp + 53.3000dp + 54.7806dp + 56.2611dp + 57.7417dp + 59.2222dp + 60.7028dp + 62.1833dp + 63.6639dp + 65.1444dp + 66.6250dp + 68.1056dp + 69.5861dp + 71.0667dp + 72.5472dp + 74.0278dp + 75.5083dp + 76.9889dp + 78.4694dp + 79.9500dp + 81.4306dp + 82.9111dp + 84.3917dp + 85.8722dp + 87.3528dp + 88.8333dp + 90.3139dp + 91.7944dp + 93.2750dp + 94.7556dp + 96.2361dp + 97.7167dp + 99.1972dp + 100.6778dp + 102.1583dp + 103.6389dp + 105.1194dp + 106.6000dp + 108.0806dp + 109.5611dp + 111.0417dp + 112.5222dp + 114.0028dp + 115.4833dp + 116.9639dp + 118.4444dp + 119.9250dp + 121.4056dp + 122.8861dp + 124.3667dp + 125.8472dp + 127.3278dp + 128.8083dp + 130.2889dp + 131.7694dp + 133.2500dp + 134.7306dp + 136.2111dp + 137.6917dp + 139.1722dp + 140.6528dp + 142.1333dp + 143.6139dp + 145.0944dp + 146.5750dp + 148.0556dp + 149.5361dp + 151.0167dp + 152.4972dp + 153.9778dp + 155.4583dp + 156.9389dp + 158.4194dp + 159.9000dp + 161.3806dp + 162.8611dp + 164.3417dp + 165.8222dp + 167.3028dp + 168.7833dp + 170.2639dp + 171.7444dp + 173.2250dp + 174.7056dp + 176.1861dp + 177.6667dp + 179.1472dp + 180.6278dp + 182.1083dp + 183.5889dp + 185.0694dp + 186.5500dp + 188.0306dp + 189.5111dp + 190.9917dp + 192.4722dp + 193.9528dp + 195.4333dp + 196.9139dp + 198.3944dp + 199.8750dp + 201.3556dp + 202.8361dp + 204.3167dp + 205.7972dp + 207.2778dp + 208.7583dp + 210.2389dp + 211.7194dp + 213.2000dp + 214.6806dp + 216.1611dp + 217.6417dp + 219.1222dp + 220.6028dp + 222.0833dp + 223.5639dp + 225.0444dp + 226.5250dp + 228.0056dp + 229.4861dp + 230.9667dp + 232.4472dp + 233.9278dp + 235.4083dp + 236.8889dp + 238.3694dp + 239.8500dp + 241.3306dp + 242.8111dp + 244.2917dp + 245.7722dp + 247.2528dp + 248.7333dp + 250.2139dp + 251.6944dp + 253.1750dp + 254.6556dp + 256.1361dp + 257.6167dp + 259.0972dp + 260.5778dp + 262.0583dp + 263.5389dp + 265.0194dp + 266.5000dp + 267.9806dp + 269.4611dp + 270.9417dp + 272.4222dp + 273.9028dp + 275.3833dp + 276.8639dp + 278.3444dp + 279.8250dp + 281.3056dp + 282.7861dp + 284.2667dp + 285.7472dp + 287.2278dp + 288.7083dp + 290.1889dp + 291.6694dp + 293.1500dp + 294.6306dp + 296.1111dp + 297.5917dp + 299.0722dp + 300.5528dp + 302.0333dp + 303.5139dp + 304.9944dp + 306.4750dp + 307.9556dp + 309.4361dp + 310.9167dp + 312.3972dp + 313.8778dp + 315.3583dp + 316.8389dp + 318.3194dp + 319.8000dp + 321.2806dp + 322.7611dp + 324.2417dp + 325.7222dp + 327.2028dp + 328.6833dp + 330.1639dp + 331.6444dp + 333.1250dp + 334.6056dp + 336.0861dp + 337.5667dp + 339.0472dp + 340.5278dp + 342.0083dp + 343.4889dp + 344.9694dp + 346.4500dp + 347.9306dp + 349.4111dp + 350.8917dp + 352.3722dp + 353.8528dp + 355.3333dp + 356.8139dp + 358.2944dp + 359.7750dp + 361.2556dp + 362.7361dp + 364.2167dp + 365.6972dp + 367.1778dp + 368.6583dp + 370.1389dp + 371.6194dp + 373.1000dp + 374.5806dp + 376.0611dp + 377.5417dp + 379.0222dp + 380.5028dp + 381.9833dp + 383.4639dp + 384.9444dp + 386.4250dp + 387.9056dp + 389.3861dp + 390.8667dp + 392.3472dp + 393.8278dp + 395.3083dp + 396.7889dp + 398.2694dp + 399.7500dp + 401.2306dp + 402.7111dp + 404.1917dp + 405.6722dp + 407.1528dp + 408.6333dp + 410.1139dp + 411.5944dp + 413.0750dp + 414.5556dp + 416.0361dp + 417.5167dp + 418.9972dp + 420.4778dp + 421.9583dp + 423.4389dp + 424.9194dp + 426.4000dp + 427.8806dp + 429.3611dp + 430.8417dp + 432.3222dp + 433.8028dp + 435.2833dp + 436.7639dp + 438.2444dp + 439.7250dp + 441.2056dp + 442.6861dp + 444.1667dp + 445.6472dp + 447.1278dp + 448.6083dp + 450.0889dp + 451.5694dp + 453.0500dp + 454.5306dp + 456.0111dp + 457.4917dp + 458.9722dp + 460.4528dp + 461.9333dp + 463.4139dp + 464.8944dp + 466.3750dp + 467.8556dp + 469.3361dp + 470.8167dp + 472.2972dp + 473.7778dp + 475.2583dp + 476.7389dp + 478.2194dp + 479.7000dp + 481.1806dp + 482.6611dp + 484.1417dp + 485.6222dp + 487.1028dp + 488.5833dp + 490.0639dp + 491.5444dp + 493.0250dp + 494.5056dp + 495.9861dp + 497.4667dp + 498.9472dp + 500.4278dp + 501.9083dp + 503.3889dp + 504.8694dp + 506.3500dp + 507.8306dp + 509.3111dp + 510.7917dp + 512.2722dp + 513.7528dp + 515.2333dp + 516.7139dp + 518.1944dp + 519.6750dp + 521.1556dp + 522.6361dp + 524.1167dp + 525.5972dp + 527.0778dp + 528.5583dp + 530.0389dp + 531.5194dp + 533.0000dp + 540.4028dp + 547.8056dp + 592.2222dp + 607.0278dp + 624.7944dp + 698.8222dp + 740.2778dp + 888.3333dp + 947.5556dp + 1066.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw533dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw533dp/dimens_sp.xml new file mode 100644 index 0000000..e917664 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw533dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 8.8833sp + 10.3639sp + 11.8444sp + 13.3250sp + 14.8056sp + 16.2861sp + 17.7667sp + 19.2472sp + 20.7278sp + 22.2083sp + 23.6889sp + 25.1694sp + 26.6500sp + 28.1306sp + 29.6111sp + 31.0917sp + 32.5722sp + 34.0528sp + 35.5333sp + 37.0139sp + 41.4556sp + 44.4167sp + 47.3778sp + 50.3389sp + 53.3000sp + 56.2611sp + 59.2222sp + 62.1833sp + 71.0667sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw540dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw540dp/dimens_dp.xml new file mode 100644 index 0000000..959c6e6 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw540dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -90.0000dp + -45.0000dp + -30.0000dp + -18.0000dp + -15.0000dp + -12.0000dp + -7.5000dp + -3.0000dp + -1.5000dp + + 0.1500dp + 0.7500dp + 1.5000dp + 2.2500dp + 3.0000dp + 3.7500dp + 4.5000dp + 5.2500dp + 6.0000dp + 6.7500dp + 7.5000dp + 9.0000dp + 10.5000dp + 12.0000dp + 13.5000dp + 15.0000dp + 16.5000dp + 18.0000dp + 19.5000dp + 21.0000dp + 22.5000dp + 24.0000dp + 25.5000dp + 27.0000dp + 28.5000dp + 30.0000dp + 31.5000dp + 33.0000dp + 34.5000dp + 36.0000dp + 37.5000dp + 39.0000dp + 40.5000dp + 42.0000dp + 43.5000dp + 45.0000dp + 46.5000dp + 48.0000dp + 49.5000dp + 51.0000dp + 52.5000dp + 54.0000dp + 55.5000dp + 57.0000dp + 58.5000dp + 60.0000dp + 61.5000dp + 63.0000dp + 64.5000dp + 66.0000dp + 67.5000dp + 69.0000dp + 70.5000dp + 72.0000dp + 73.5000dp + 75.0000dp + 76.5000dp + 78.0000dp + 79.5000dp + 81.0000dp + 82.5000dp + 84.0000dp + 85.5000dp + 87.0000dp + 88.5000dp + 90.0000dp + 91.5000dp + 93.0000dp + 94.5000dp + 96.0000dp + 97.5000dp + 99.0000dp + 100.5000dp + 102.0000dp + 103.5000dp + 105.0000dp + 106.5000dp + 108.0000dp + 109.5000dp + 111.0000dp + 112.5000dp + 114.0000dp + 115.5000dp + 117.0000dp + 118.5000dp + 120.0000dp + 121.5000dp + 123.0000dp + 124.5000dp + 126.0000dp + 127.5000dp + 129.0000dp + 130.5000dp + 132.0000dp + 133.5000dp + 135.0000dp + 136.5000dp + 138.0000dp + 139.5000dp + 141.0000dp + 142.5000dp + 144.0000dp + 145.5000dp + 147.0000dp + 148.5000dp + 150.0000dp + 151.5000dp + 153.0000dp + 154.5000dp + 156.0000dp + 157.5000dp + 159.0000dp + 160.5000dp + 162.0000dp + 163.5000dp + 165.0000dp + 166.5000dp + 168.0000dp + 169.5000dp + 171.0000dp + 172.5000dp + 174.0000dp + 175.5000dp + 177.0000dp + 178.5000dp + 180.0000dp + 181.5000dp + 183.0000dp + 184.5000dp + 186.0000dp + 187.5000dp + 189.0000dp + 190.5000dp + 192.0000dp + 193.5000dp + 195.0000dp + 196.5000dp + 198.0000dp + 199.5000dp + 201.0000dp + 202.5000dp + 204.0000dp + 205.5000dp + 207.0000dp + 208.5000dp + 210.0000dp + 211.5000dp + 213.0000dp + 214.5000dp + 216.0000dp + 217.5000dp + 219.0000dp + 220.5000dp + 222.0000dp + 223.5000dp + 225.0000dp + 226.5000dp + 228.0000dp + 229.5000dp + 231.0000dp + 232.5000dp + 234.0000dp + 235.5000dp + 237.0000dp + 238.5000dp + 240.0000dp + 241.5000dp + 243.0000dp + 244.5000dp + 246.0000dp + 247.5000dp + 249.0000dp + 250.5000dp + 252.0000dp + 253.5000dp + 255.0000dp + 256.5000dp + 258.0000dp + 259.5000dp + 261.0000dp + 262.5000dp + 264.0000dp + 265.5000dp + 267.0000dp + 268.5000dp + 270.0000dp + 271.5000dp + 273.0000dp + 274.5000dp + 276.0000dp + 277.5000dp + 279.0000dp + 280.5000dp + 282.0000dp + 283.5000dp + 285.0000dp + 286.5000dp + 288.0000dp + 289.5000dp + 291.0000dp + 292.5000dp + 294.0000dp + 295.5000dp + 297.0000dp + 298.5000dp + 300.0000dp + 301.5000dp + 303.0000dp + 304.5000dp + 306.0000dp + 307.5000dp + 309.0000dp + 310.5000dp + 312.0000dp + 313.5000dp + 315.0000dp + 316.5000dp + 318.0000dp + 319.5000dp + 321.0000dp + 322.5000dp + 324.0000dp + 325.5000dp + 327.0000dp + 328.5000dp + 330.0000dp + 331.5000dp + 333.0000dp + 334.5000dp + 336.0000dp + 337.5000dp + 339.0000dp + 340.5000dp + 342.0000dp + 343.5000dp + 345.0000dp + 346.5000dp + 348.0000dp + 349.5000dp + 351.0000dp + 352.5000dp + 354.0000dp + 355.5000dp + 357.0000dp + 358.5000dp + 360.0000dp + 361.5000dp + 363.0000dp + 364.5000dp + 366.0000dp + 367.5000dp + 369.0000dp + 370.5000dp + 372.0000dp + 373.5000dp + 375.0000dp + 376.5000dp + 378.0000dp + 379.5000dp + 381.0000dp + 382.5000dp + 384.0000dp + 385.5000dp + 387.0000dp + 388.5000dp + 390.0000dp + 391.5000dp + 393.0000dp + 394.5000dp + 396.0000dp + 397.5000dp + 399.0000dp + 400.5000dp + 402.0000dp + 403.5000dp + 405.0000dp + 406.5000dp + 408.0000dp + 409.5000dp + 411.0000dp + 412.5000dp + 414.0000dp + 415.5000dp + 417.0000dp + 418.5000dp + 420.0000dp + 421.5000dp + 423.0000dp + 424.5000dp + 426.0000dp + 427.5000dp + 429.0000dp + 430.5000dp + 432.0000dp + 433.5000dp + 435.0000dp + 436.5000dp + 438.0000dp + 439.5000dp + 441.0000dp + 442.5000dp + 444.0000dp + 445.5000dp + 447.0000dp + 448.5000dp + 450.0000dp + 451.5000dp + 453.0000dp + 454.5000dp + 456.0000dp + 457.5000dp + 459.0000dp + 460.5000dp + 462.0000dp + 463.5000dp + 465.0000dp + 466.5000dp + 468.0000dp + 469.5000dp + 471.0000dp + 472.5000dp + 474.0000dp + 475.5000dp + 477.0000dp + 478.5000dp + 480.0000dp + 481.5000dp + 483.0000dp + 484.5000dp + 486.0000dp + 487.5000dp + 489.0000dp + 490.5000dp + 492.0000dp + 493.5000dp + 495.0000dp + 496.5000dp + 498.0000dp + 499.5000dp + 501.0000dp + 502.5000dp + 504.0000dp + 505.5000dp + 507.0000dp + 508.5000dp + 510.0000dp + 511.5000dp + 513.0000dp + 514.5000dp + 516.0000dp + 517.5000dp + 519.0000dp + 520.5000dp + 522.0000dp + 523.5000dp + 525.0000dp + 526.5000dp + 528.0000dp + 529.5000dp + 531.0000dp + 532.5000dp + 534.0000dp + 535.5000dp + 537.0000dp + 538.5000dp + 540.0000dp + 547.5000dp + 555.0000dp + 600.0000dp + 615.0000dp + 633.0000dp + 708.0000dp + 750.0000dp + 900.0000dp + 960.0000dp + 1080.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw540dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw540dp/dimens_sp.xml new file mode 100644 index 0000000..197d2a7 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw540dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 9.0000sp + 10.5000sp + 12.0000sp + 13.5000sp + 15.0000sp + 16.5000sp + 18.0000sp + 19.5000sp + 21.0000sp + 22.5000sp + 24.0000sp + 25.5000sp + 27.0000sp + 28.5000sp + 30.0000sp + 31.5000sp + 33.0000sp + 34.5000sp + 36.0000sp + 37.5000sp + 42.0000sp + 45.0000sp + 48.0000sp + 51.0000sp + 54.0000sp + 57.0000sp + 60.0000sp + 63.0000sp + 72.0000sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw592dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw592dp/dimens_dp.xml new file mode 100644 index 0000000..81e2bab --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw592dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -98.6667dp + -49.3333dp + -32.8889dp + -19.7333dp + -16.4444dp + -13.1556dp + -8.2222dp + -3.2889dp + -1.6444dp + + 0.1644dp + 0.8222dp + 1.6444dp + 2.4667dp + 3.2889dp + 4.1111dp + 4.9333dp + 5.7556dp + 6.5778dp + 7.4000dp + 8.2222dp + 9.8667dp + 11.5111dp + 13.1556dp + 14.8000dp + 16.4444dp + 18.0889dp + 19.7333dp + 21.3778dp + 23.0222dp + 24.6667dp + 26.3111dp + 27.9556dp + 29.6000dp + 31.2444dp + 32.8889dp + 34.5333dp + 36.1778dp + 37.8222dp + 39.4667dp + 41.1111dp + 42.7556dp + 44.4000dp + 46.0444dp + 47.6889dp + 49.3333dp + 50.9778dp + 52.6222dp + 54.2667dp + 55.9111dp + 57.5556dp + 59.2000dp + 60.8444dp + 62.4889dp + 64.1333dp + 65.7778dp + 67.4222dp + 69.0667dp + 70.7111dp + 72.3556dp + 74.0000dp + 75.6444dp + 77.2889dp + 78.9333dp + 80.5778dp + 82.2222dp + 83.8667dp + 85.5111dp + 87.1556dp + 88.8000dp + 90.4444dp + 92.0889dp + 93.7333dp + 95.3778dp + 97.0222dp + 98.6667dp + 100.3111dp + 101.9556dp + 103.6000dp + 105.2444dp + 106.8889dp + 108.5333dp + 110.1778dp + 111.8222dp + 113.4667dp + 115.1111dp + 116.7556dp + 118.4000dp + 120.0444dp + 121.6889dp + 123.3333dp + 124.9778dp + 126.6222dp + 128.2667dp + 129.9111dp + 131.5556dp + 133.2000dp + 134.8444dp + 136.4889dp + 138.1333dp + 139.7778dp + 141.4222dp + 143.0667dp + 144.7111dp + 146.3556dp + 148.0000dp + 149.6444dp + 151.2889dp + 152.9333dp + 154.5778dp + 156.2222dp + 157.8667dp + 159.5111dp + 161.1556dp + 162.8000dp + 164.4444dp + 166.0889dp + 167.7333dp + 169.3778dp + 171.0222dp + 172.6667dp + 174.3111dp + 175.9556dp + 177.6000dp + 179.2444dp + 180.8889dp + 182.5333dp + 184.1778dp + 185.8222dp + 187.4667dp + 189.1111dp + 190.7556dp + 192.4000dp + 194.0444dp + 195.6889dp + 197.3333dp + 198.9778dp + 200.6222dp + 202.2667dp + 203.9111dp + 205.5556dp + 207.2000dp + 208.8444dp + 210.4889dp + 212.1333dp + 213.7778dp + 215.4222dp + 217.0667dp + 218.7111dp + 220.3556dp + 222.0000dp + 223.6444dp + 225.2889dp + 226.9333dp + 228.5778dp + 230.2222dp + 231.8667dp + 233.5111dp + 235.1556dp + 236.8000dp + 238.4444dp + 240.0889dp + 241.7333dp + 243.3778dp + 245.0222dp + 246.6667dp + 248.3111dp + 249.9556dp + 251.6000dp + 253.2444dp + 254.8889dp + 256.5333dp + 258.1778dp + 259.8222dp + 261.4667dp + 263.1111dp + 264.7556dp + 266.4000dp + 268.0444dp + 269.6889dp + 271.3333dp + 272.9778dp + 274.6222dp + 276.2667dp + 277.9111dp + 279.5556dp + 281.2000dp + 282.8444dp + 284.4889dp + 286.1333dp + 287.7778dp + 289.4222dp + 291.0667dp + 292.7111dp + 294.3556dp + 296.0000dp + 297.6444dp + 299.2889dp + 300.9333dp + 302.5778dp + 304.2222dp + 305.8667dp + 307.5111dp + 309.1556dp + 310.8000dp + 312.4444dp + 314.0889dp + 315.7333dp + 317.3778dp + 319.0222dp + 320.6667dp + 322.3111dp + 323.9556dp + 325.6000dp + 327.2444dp + 328.8889dp + 330.5333dp + 332.1778dp + 333.8222dp + 335.4667dp + 337.1111dp + 338.7556dp + 340.4000dp + 342.0444dp + 343.6889dp + 345.3333dp + 346.9778dp + 348.6222dp + 350.2667dp + 351.9111dp + 353.5556dp + 355.2000dp + 356.8444dp + 358.4889dp + 360.1333dp + 361.7778dp + 363.4222dp + 365.0667dp + 366.7111dp + 368.3556dp + 370.0000dp + 371.6444dp + 373.2889dp + 374.9333dp + 376.5778dp + 378.2222dp + 379.8667dp + 381.5111dp + 383.1556dp + 384.8000dp + 386.4444dp + 388.0889dp + 389.7333dp + 391.3778dp + 393.0222dp + 394.6667dp + 396.3111dp + 397.9556dp + 399.6000dp + 401.2444dp + 402.8889dp + 404.5333dp + 406.1778dp + 407.8222dp + 409.4667dp + 411.1111dp + 412.7556dp + 414.4000dp + 416.0444dp + 417.6889dp + 419.3333dp + 420.9778dp + 422.6222dp + 424.2667dp + 425.9111dp + 427.5556dp + 429.2000dp + 430.8444dp + 432.4889dp + 434.1333dp + 435.7778dp + 437.4222dp + 439.0667dp + 440.7111dp + 442.3556dp + 444.0000dp + 445.6444dp + 447.2889dp + 448.9333dp + 450.5778dp + 452.2222dp + 453.8667dp + 455.5111dp + 457.1556dp + 458.8000dp + 460.4444dp + 462.0889dp + 463.7333dp + 465.3778dp + 467.0222dp + 468.6667dp + 470.3111dp + 471.9556dp + 473.6000dp + 475.2444dp + 476.8889dp + 478.5333dp + 480.1778dp + 481.8222dp + 483.4667dp + 485.1111dp + 486.7556dp + 488.4000dp + 490.0444dp + 491.6889dp + 493.3333dp + 494.9778dp + 496.6222dp + 498.2667dp + 499.9111dp + 501.5556dp + 503.2000dp + 504.8444dp + 506.4889dp + 508.1333dp + 509.7778dp + 511.4222dp + 513.0667dp + 514.7111dp + 516.3556dp + 518.0000dp + 519.6444dp + 521.2889dp + 522.9333dp + 524.5778dp + 526.2222dp + 527.8667dp + 529.5111dp + 531.1556dp + 532.8000dp + 534.4444dp + 536.0889dp + 537.7333dp + 539.3778dp + 541.0222dp + 542.6667dp + 544.3111dp + 545.9556dp + 547.6000dp + 549.2444dp + 550.8889dp + 552.5333dp + 554.1778dp + 555.8222dp + 557.4667dp + 559.1111dp + 560.7556dp + 562.4000dp + 564.0444dp + 565.6889dp + 567.3333dp + 568.9778dp + 570.6222dp + 572.2667dp + 573.9111dp + 575.5556dp + 577.2000dp + 578.8444dp + 580.4889dp + 582.1333dp + 583.7778dp + 585.4222dp + 587.0667dp + 588.7111dp + 590.3556dp + 592.0000dp + 600.2222dp + 608.4444dp + 657.7778dp + 674.2222dp + 693.9556dp + 776.1778dp + 822.2222dp + 986.6667dp + 1052.4444dp + 1184.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw592dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw592dp/dimens_sp.xml new file mode 100644 index 0000000..77463cc --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw592dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 9.8667sp + 11.5111sp + 13.1556sp + 14.8000sp + 16.4444sp + 18.0889sp + 19.7333sp + 21.3778sp + 23.0222sp + 24.6667sp + 26.3111sp + 27.9556sp + 29.6000sp + 31.2444sp + 32.8889sp + 34.5333sp + 36.1778sp + 37.8222sp + 39.4667sp + 41.1111sp + 46.0444sp + 49.3333sp + 52.6222sp + 55.9111sp + 59.2000sp + 62.4889sp + 65.7778sp + 69.0667sp + 78.9333sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw600dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw600dp/dimens_dp.xml new file mode 100644 index 0000000..761d4af --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw600dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -100.0000dp + -50.0000dp + -33.3333dp + -20.0000dp + -16.6667dp + -13.3333dp + -8.3333dp + -3.3333dp + -1.6667dp + + 0.1667dp + 0.8333dp + 1.6667dp + 2.5000dp + 3.3333dp + 4.1667dp + 5.0000dp + 5.8333dp + 6.6667dp + 7.5000dp + 8.3333dp + 10.0000dp + 11.6667dp + 13.3333dp + 15.0000dp + 16.6667dp + 18.3333dp + 20.0000dp + 21.6667dp + 23.3333dp + 25.0000dp + 26.6667dp + 28.3333dp + 30.0000dp + 31.6667dp + 33.3333dp + 35.0000dp + 36.6667dp + 38.3333dp + 40.0000dp + 41.6667dp + 43.3333dp + 45.0000dp + 46.6667dp + 48.3333dp + 50.0000dp + 51.6667dp + 53.3333dp + 55.0000dp + 56.6667dp + 58.3333dp + 60.0000dp + 61.6667dp + 63.3333dp + 65.0000dp + 66.6667dp + 68.3333dp + 70.0000dp + 71.6667dp + 73.3333dp + 75.0000dp + 76.6667dp + 78.3333dp + 80.0000dp + 81.6667dp + 83.3333dp + 85.0000dp + 86.6667dp + 88.3333dp + 90.0000dp + 91.6667dp + 93.3333dp + 95.0000dp + 96.6667dp + 98.3333dp + 100.0000dp + 101.6667dp + 103.3333dp + 105.0000dp + 106.6667dp + 108.3333dp + 110.0000dp + 111.6667dp + 113.3333dp + 115.0000dp + 116.6667dp + 118.3333dp + 120.0000dp + 121.6667dp + 123.3333dp + 125.0000dp + 126.6667dp + 128.3333dp + 130.0000dp + 131.6667dp + 133.3333dp + 135.0000dp + 136.6667dp + 138.3333dp + 140.0000dp + 141.6667dp + 143.3333dp + 145.0000dp + 146.6667dp + 148.3333dp + 150.0000dp + 151.6667dp + 153.3333dp + 155.0000dp + 156.6667dp + 158.3333dp + 160.0000dp + 161.6667dp + 163.3333dp + 165.0000dp + 166.6667dp + 168.3333dp + 170.0000dp + 171.6667dp + 173.3333dp + 175.0000dp + 176.6667dp + 178.3333dp + 180.0000dp + 181.6667dp + 183.3333dp + 185.0000dp + 186.6667dp + 188.3333dp + 190.0000dp + 191.6667dp + 193.3333dp + 195.0000dp + 196.6667dp + 198.3333dp + 200.0000dp + 201.6667dp + 203.3333dp + 205.0000dp + 206.6667dp + 208.3333dp + 210.0000dp + 211.6667dp + 213.3333dp + 215.0000dp + 216.6667dp + 218.3333dp + 220.0000dp + 221.6667dp + 223.3333dp + 225.0000dp + 226.6667dp + 228.3333dp + 230.0000dp + 231.6667dp + 233.3333dp + 235.0000dp + 236.6667dp + 238.3333dp + 240.0000dp + 241.6667dp + 243.3333dp + 245.0000dp + 246.6667dp + 248.3333dp + 250.0000dp + 251.6667dp + 253.3333dp + 255.0000dp + 256.6667dp + 258.3333dp + 260.0000dp + 261.6667dp + 263.3333dp + 265.0000dp + 266.6667dp + 268.3333dp + 270.0000dp + 271.6667dp + 273.3333dp + 275.0000dp + 276.6667dp + 278.3333dp + 280.0000dp + 281.6667dp + 283.3333dp + 285.0000dp + 286.6667dp + 288.3333dp + 290.0000dp + 291.6667dp + 293.3333dp + 295.0000dp + 296.6667dp + 298.3333dp + 300.0000dp + 301.6667dp + 303.3333dp + 305.0000dp + 306.6667dp + 308.3333dp + 310.0000dp + 311.6667dp + 313.3333dp + 315.0000dp + 316.6667dp + 318.3333dp + 320.0000dp + 321.6667dp + 323.3333dp + 325.0000dp + 326.6667dp + 328.3333dp + 330.0000dp + 331.6667dp + 333.3333dp + 335.0000dp + 336.6667dp + 338.3333dp + 340.0000dp + 341.6667dp + 343.3333dp + 345.0000dp + 346.6667dp + 348.3333dp + 350.0000dp + 351.6667dp + 353.3333dp + 355.0000dp + 356.6667dp + 358.3333dp + 360.0000dp + 361.6667dp + 363.3333dp + 365.0000dp + 366.6667dp + 368.3333dp + 370.0000dp + 371.6667dp + 373.3333dp + 375.0000dp + 376.6667dp + 378.3333dp + 380.0000dp + 381.6667dp + 383.3333dp + 385.0000dp + 386.6667dp + 388.3333dp + 390.0000dp + 391.6667dp + 393.3333dp + 395.0000dp + 396.6667dp + 398.3333dp + 400.0000dp + 401.6667dp + 403.3333dp + 405.0000dp + 406.6667dp + 408.3333dp + 410.0000dp + 411.6667dp + 413.3333dp + 415.0000dp + 416.6667dp + 418.3333dp + 420.0000dp + 421.6667dp + 423.3333dp + 425.0000dp + 426.6667dp + 428.3333dp + 430.0000dp + 431.6667dp + 433.3333dp + 435.0000dp + 436.6667dp + 438.3333dp + 440.0000dp + 441.6667dp + 443.3333dp + 445.0000dp + 446.6667dp + 448.3333dp + 450.0000dp + 451.6667dp + 453.3333dp + 455.0000dp + 456.6667dp + 458.3333dp + 460.0000dp + 461.6667dp + 463.3333dp + 465.0000dp + 466.6667dp + 468.3333dp + 470.0000dp + 471.6667dp + 473.3333dp + 475.0000dp + 476.6667dp + 478.3333dp + 480.0000dp + 481.6667dp + 483.3333dp + 485.0000dp + 486.6667dp + 488.3333dp + 490.0000dp + 491.6667dp + 493.3333dp + 495.0000dp + 496.6667dp + 498.3333dp + 500.0000dp + 501.6667dp + 503.3333dp + 505.0000dp + 506.6667dp + 508.3333dp + 510.0000dp + 511.6667dp + 513.3333dp + 515.0000dp + 516.6667dp + 518.3333dp + 520.0000dp + 521.6667dp + 523.3333dp + 525.0000dp + 526.6667dp + 528.3333dp + 530.0000dp + 531.6667dp + 533.3333dp + 535.0000dp + 536.6667dp + 538.3333dp + 540.0000dp + 541.6667dp + 543.3333dp + 545.0000dp + 546.6667dp + 548.3333dp + 550.0000dp + 551.6667dp + 553.3333dp + 555.0000dp + 556.6667dp + 558.3333dp + 560.0000dp + 561.6667dp + 563.3333dp + 565.0000dp + 566.6667dp + 568.3333dp + 570.0000dp + 571.6667dp + 573.3333dp + 575.0000dp + 576.6667dp + 578.3333dp + 580.0000dp + 581.6667dp + 583.3333dp + 585.0000dp + 586.6667dp + 588.3333dp + 590.0000dp + 591.6667dp + 593.3333dp + 595.0000dp + 596.6667dp + 598.3333dp + 600.0000dp + 608.3333dp + 616.6667dp + 666.6667dp + 683.3333dp + 703.3333dp + 786.6667dp + 833.3333dp + 1000.0000dp + 1066.6667dp + 1200.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw600dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw600dp/dimens_sp.xml new file mode 100644 index 0000000..998b966 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw600dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 10.0000sp + 11.6667sp + 13.3333sp + 15.0000sp + 16.6667sp + 18.3333sp + 20.0000sp + 21.6667sp + 23.3333sp + 25.0000sp + 26.6667sp + 28.3333sp + 30.0000sp + 31.6667sp + 33.3333sp + 35.0000sp + 36.6667sp + 38.3333sp + 40.0000sp + 41.6667sp + 46.6667sp + 50.0000sp + 53.3333sp + 56.6667sp + 60.0000sp + 63.3333sp + 66.6667sp + 70.0000sp + 80.0000sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw640dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw640dp/dimens_dp.xml new file mode 100644 index 0000000..dd2324c --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw640dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -106.6667dp + -53.3333dp + -35.5556dp + -21.3333dp + -17.7778dp + -14.2222dp + -8.8889dp + -3.5556dp + -1.7778dp + + 0.1778dp + 0.8889dp + 1.7778dp + 2.6667dp + 3.5556dp + 4.4444dp + 5.3333dp + 6.2222dp + 7.1111dp + 8.0000dp + 8.8889dp + 10.6667dp + 12.4444dp + 14.2222dp + 16.0000dp + 17.7778dp + 19.5556dp + 21.3333dp + 23.1111dp + 24.8889dp + 26.6667dp + 28.4444dp + 30.2222dp + 32.0000dp + 33.7778dp + 35.5556dp + 37.3333dp + 39.1111dp + 40.8889dp + 42.6667dp + 44.4444dp + 46.2222dp + 48.0000dp + 49.7778dp + 51.5556dp + 53.3333dp + 55.1111dp + 56.8889dp + 58.6667dp + 60.4444dp + 62.2222dp + 64.0000dp + 65.7778dp + 67.5556dp + 69.3333dp + 71.1111dp + 72.8889dp + 74.6667dp + 76.4444dp + 78.2222dp + 80.0000dp + 81.7778dp + 83.5556dp + 85.3333dp + 87.1111dp + 88.8889dp + 90.6667dp + 92.4444dp + 94.2222dp + 96.0000dp + 97.7778dp + 99.5556dp + 101.3333dp + 103.1111dp + 104.8889dp + 106.6667dp + 108.4444dp + 110.2222dp + 112.0000dp + 113.7778dp + 115.5556dp + 117.3333dp + 119.1111dp + 120.8889dp + 122.6667dp + 124.4444dp + 126.2222dp + 128.0000dp + 129.7778dp + 131.5556dp + 133.3333dp + 135.1111dp + 136.8889dp + 138.6667dp + 140.4444dp + 142.2222dp + 144.0000dp + 145.7778dp + 147.5556dp + 149.3333dp + 151.1111dp + 152.8889dp + 154.6667dp + 156.4444dp + 158.2222dp + 160.0000dp + 161.7778dp + 163.5556dp + 165.3333dp + 167.1111dp + 168.8889dp + 170.6667dp + 172.4444dp + 174.2222dp + 176.0000dp + 177.7778dp + 179.5556dp + 181.3333dp + 183.1111dp + 184.8889dp + 186.6667dp + 188.4444dp + 190.2222dp + 192.0000dp + 193.7778dp + 195.5556dp + 197.3333dp + 199.1111dp + 200.8889dp + 202.6667dp + 204.4444dp + 206.2222dp + 208.0000dp + 209.7778dp + 211.5556dp + 213.3333dp + 215.1111dp + 216.8889dp + 218.6667dp + 220.4444dp + 222.2222dp + 224.0000dp + 225.7778dp + 227.5556dp + 229.3333dp + 231.1111dp + 232.8889dp + 234.6667dp + 236.4444dp + 238.2222dp + 240.0000dp + 241.7778dp + 243.5556dp + 245.3333dp + 247.1111dp + 248.8889dp + 250.6667dp + 252.4444dp + 254.2222dp + 256.0000dp + 257.7778dp + 259.5556dp + 261.3333dp + 263.1111dp + 264.8889dp + 266.6667dp + 268.4444dp + 270.2222dp + 272.0000dp + 273.7778dp + 275.5556dp + 277.3333dp + 279.1111dp + 280.8889dp + 282.6667dp + 284.4444dp + 286.2222dp + 288.0000dp + 289.7778dp + 291.5556dp + 293.3333dp + 295.1111dp + 296.8889dp + 298.6667dp + 300.4444dp + 302.2222dp + 304.0000dp + 305.7778dp + 307.5556dp + 309.3333dp + 311.1111dp + 312.8889dp + 314.6667dp + 316.4444dp + 318.2222dp + 320.0000dp + 321.7778dp + 323.5556dp + 325.3333dp + 327.1111dp + 328.8889dp + 330.6667dp + 332.4444dp + 334.2222dp + 336.0000dp + 337.7778dp + 339.5556dp + 341.3333dp + 343.1111dp + 344.8889dp + 346.6667dp + 348.4444dp + 350.2222dp + 352.0000dp + 353.7778dp + 355.5556dp + 357.3333dp + 359.1111dp + 360.8889dp + 362.6667dp + 364.4444dp + 366.2222dp + 368.0000dp + 369.7778dp + 371.5556dp + 373.3333dp + 375.1111dp + 376.8889dp + 378.6667dp + 380.4444dp + 382.2222dp + 384.0000dp + 385.7778dp + 387.5556dp + 389.3333dp + 391.1111dp + 392.8889dp + 394.6667dp + 396.4444dp + 398.2222dp + 400.0000dp + 401.7778dp + 403.5556dp + 405.3333dp + 407.1111dp + 408.8889dp + 410.6667dp + 412.4444dp + 414.2222dp + 416.0000dp + 417.7778dp + 419.5556dp + 421.3333dp + 423.1111dp + 424.8889dp + 426.6667dp + 428.4444dp + 430.2222dp + 432.0000dp + 433.7778dp + 435.5556dp + 437.3333dp + 439.1111dp + 440.8889dp + 442.6667dp + 444.4444dp + 446.2222dp + 448.0000dp + 449.7778dp + 451.5556dp + 453.3333dp + 455.1111dp + 456.8889dp + 458.6667dp + 460.4444dp + 462.2222dp + 464.0000dp + 465.7778dp + 467.5556dp + 469.3333dp + 471.1111dp + 472.8889dp + 474.6667dp + 476.4444dp + 478.2222dp + 480.0000dp + 481.7778dp + 483.5556dp + 485.3333dp + 487.1111dp + 488.8889dp + 490.6667dp + 492.4444dp + 494.2222dp + 496.0000dp + 497.7778dp + 499.5556dp + 501.3333dp + 503.1111dp + 504.8889dp + 506.6667dp + 508.4444dp + 510.2222dp + 512.0000dp + 513.7778dp + 515.5556dp + 517.3333dp + 519.1111dp + 520.8889dp + 522.6667dp + 524.4444dp + 526.2222dp + 528.0000dp + 529.7778dp + 531.5556dp + 533.3333dp + 535.1111dp + 536.8889dp + 538.6667dp + 540.4444dp + 542.2222dp + 544.0000dp + 545.7778dp + 547.5556dp + 549.3333dp + 551.1111dp + 552.8889dp + 554.6667dp + 556.4444dp + 558.2222dp + 560.0000dp + 561.7778dp + 563.5556dp + 565.3333dp + 567.1111dp + 568.8889dp + 570.6667dp + 572.4444dp + 574.2222dp + 576.0000dp + 577.7778dp + 579.5556dp + 581.3333dp + 583.1111dp + 584.8889dp + 586.6667dp + 588.4444dp + 590.2222dp + 592.0000dp + 593.7778dp + 595.5556dp + 597.3333dp + 599.1111dp + 600.8889dp + 602.6667dp + 604.4444dp + 606.2222dp + 608.0000dp + 609.7778dp + 611.5556dp + 613.3333dp + 615.1111dp + 616.8889dp + 618.6667dp + 620.4444dp + 622.2222dp + 624.0000dp + 625.7778dp + 627.5556dp + 629.3333dp + 631.1111dp + 632.8889dp + 634.6667dp + 636.4444dp + 638.2222dp + 640.0000dp + 648.8889dp + 657.7778dp + 711.1111dp + 728.8889dp + 750.2222dp + 839.1111dp + 888.8889dp + 1066.6667dp + 1137.7778dp + 1280.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw640dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw640dp/dimens_sp.xml new file mode 100644 index 0000000..ac00db6 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw640dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 10.6667sp + 12.4444sp + 14.2222sp + 16.0000sp + 17.7778sp + 19.5556sp + 21.3333sp + 23.1111sp + 24.8889sp + 26.6667sp + 28.4444sp + 30.2222sp + 32.0000sp + 33.7778sp + 35.5556sp + 37.3333sp + 39.1111sp + 40.8889sp + 42.6667sp + 44.4444sp + 49.7778sp + 53.3333sp + 56.8889sp + 60.4444sp + 64.0000sp + 67.5556sp + 71.1111sp + 74.6667sp + 85.3333sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw662dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw662dp/dimens_dp.xml new file mode 100644 index 0000000..66adb83 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw662dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -110.3333dp + -55.1667dp + -36.7778dp + -22.0667dp + -18.3889dp + -14.7111dp + -9.1944dp + -3.6778dp + -1.8389dp + + 0.1839dp + 0.9194dp + 1.8389dp + 2.7583dp + 3.6778dp + 4.5972dp + 5.5167dp + 6.4361dp + 7.3556dp + 8.2750dp + 9.1944dp + 11.0333dp + 12.8722dp + 14.7111dp + 16.5500dp + 18.3889dp + 20.2278dp + 22.0667dp + 23.9056dp + 25.7444dp + 27.5833dp + 29.4222dp + 31.2611dp + 33.1000dp + 34.9389dp + 36.7778dp + 38.6167dp + 40.4556dp + 42.2944dp + 44.1333dp + 45.9722dp + 47.8111dp + 49.6500dp + 51.4889dp + 53.3278dp + 55.1667dp + 57.0056dp + 58.8444dp + 60.6833dp + 62.5222dp + 64.3611dp + 66.2000dp + 68.0389dp + 69.8778dp + 71.7167dp + 73.5556dp + 75.3944dp + 77.2333dp + 79.0722dp + 80.9111dp + 82.7500dp + 84.5889dp + 86.4278dp + 88.2667dp + 90.1056dp + 91.9444dp + 93.7833dp + 95.6222dp + 97.4611dp + 99.3000dp + 101.1389dp + 102.9778dp + 104.8167dp + 106.6556dp + 108.4944dp + 110.3333dp + 112.1722dp + 114.0111dp + 115.8500dp + 117.6889dp + 119.5278dp + 121.3667dp + 123.2056dp + 125.0444dp + 126.8833dp + 128.7222dp + 130.5611dp + 132.4000dp + 134.2389dp + 136.0778dp + 137.9167dp + 139.7556dp + 141.5944dp + 143.4333dp + 145.2722dp + 147.1111dp + 148.9500dp + 150.7889dp + 152.6278dp + 154.4667dp + 156.3056dp + 158.1444dp + 159.9833dp + 161.8222dp + 163.6611dp + 165.5000dp + 167.3389dp + 169.1778dp + 171.0167dp + 172.8556dp + 174.6944dp + 176.5333dp + 178.3722dp + 180.2111dp + 182.0500dp + 183.8889dp + 185.7278dp + 187.5667dp + 189.4056dp + 191.2444dp + 193.0833dp + 194.9222dp + 196.7611dp + 198.6000dp + 200.4389dp + 202.2778dp + 204.1167dp + 205.9556dp + 207.7944dp + 209.6333dp + 211.4722dp + 213.3111dp + 215.1500dp + 216.9889dp + 218.8278dp + 220.6667dp + 222.5056dp + 224.3444dp + 226.1833dp + 228.0222dp + 229.8611dp + 231.7000dp + 233.5389dp + 235.3778dp + 237.2167dp + 239.0556dp + 240.8944dp + 242.7333dp + 244.5722dp + 246.4111dp + 248.2500dp + 250.0889dp + 251.9278dp + 253.7667dp + 255.6056dp + 257.4444dp + 259.2833dp + 261.1222dp + 262.9611dp + 264.8000dp + 266.6389dp + 268.4778dp + 270.3167dp + 272.1556dp + 273.9944dp + 275.8333dp + 277.6722dp + 279.5111dp + 281.3500dp + 283.1889dp + 285.0278dp + 286.8667dp + 288.7056dp + 290.5444dp + 292.3833dp + 294.2222dp + 296.0611dp + 297.9000dp + 299.7389dp + 301.5778dp + 303.4167dp + 305.2556dp + 307.0944dp + 308.9333dp + 310.7722dp + 312.6111dp + 314.4500dp + 316.2889dp + 318.1278dp + 319.9667dp + 321.8056dp + 323.6444dp + 325.4833dp + 327.3222dp + 329.1611dp + 331.0000dp + 332.8389dp + 334.6778dp + 336.5167dp + 338.3556dp + 340.1944dp + 342.0333dp + 343.8722dp + 345.7111dp + 347.5500dp + 349.3889dp + 351.2278dp + 353.0667dp + 354.9056dp + 356.7444dp + 358.5833dp + 360.4222dp + 362.2611dp + 364.1000dp + 365.9389dp + 367.7778dp + 369.6167dp + 371.4556dp + 373.2944dp + 375.1333dp + 376.9722dp + 378.8111dp + 380.6500dp + 382.4889dp + 384.3278dp + 386.1667dp + 388.0056dp + 389.8444dp + 391.6833dp + 393.5222dp + 395.3611dp + 397.2000dp + 399.0389dp + 400.8778dp + 402.7167dp + 404.5556dp + 406.3944dp + 408.2333dp + 410.0722dp + 411.9111dp + 413.7500dp + 415.5889dp + 417.4278dp + 419.2667dp + 421.1056dp + 422.9444dp + 424.7833dp + 426.6222dp + 428.4611dp + 430.3000dp + 432.1389dp + 433.9778dp + 435.8167dp + 437.6556dp + 439.4944dp + 441.3333dp + 443.1722dp + 445.0111dp + 446.8500dp + 448.6889dp + 450.5278dp + 452.3667dp + 454.2056dp + 456.0444dp + 457.8833dp + 459.7222dp + 461.5611dp + 463.4000dp + 465.2389dp + 467.0778dp + 468.9167dp + 470.7556dp + 472.5944dp + 474.4333dp + 476.2722dp + 478.1111dp + 479.9500dp + 481.7889dp + 483.6278dp + 485.4667dp + 487.3056dp + 489.1444dp + 490.9833dp + 492.8222dp + 494.6611dp + 496.5000dp + 498.3389dp + 500.1778dp + 502.0167dp + 503.8556dp + 505.6944dp + 507.5333dp + 509.3722dp + 511.2111dp + 513.0500dp + 514.8889dp + 516.7278dp + 518.5667dp + 520.4056dp + 522.2444dp + 524.0833dp + 525.9222dp + 527.7611dp + 529.6000dp + 531.4389dp + 533.2778dp + 535.1167dp + 536.9556dp + 538.7944dp + 540.6333dp + 542.4722dp + 544.3111dp + 546.1500dp + 547.9889dp + 549.8278dp + 551.6667dp + 553.5056dp + 555.3444dp + 557.1833dp + 559.0222dp + 560.8611dp + 562.7000dp + 564.5389dp + 566.3778dp + 568.2167dp + 570.0556dp + 571.8944dp + 573.7333dp + 575.5722dp + 577.4111dp + 579.2500dp + 581.0889dp + 582.9278dp + 584.7667dp + 586.6056dp + 588.4444dp + 590.2833dp + 592.1222dp + 593.9611dp + 595.8000dp + 597.6389dp + 599.4778dp + 601.3167dp + 603.1556dp + 604.9944dp + 606.8333dp + 608.6722dp + 610.5111dp + 612.3500dp + 614.1889dp + 616.0278dp + 617.8667dp + 619.7056dp + 621.5444dp + 623.3833dp + 625.2222dp + 627.0611dp + 628.9000dp + 630.7389dp + 632.5778dp + 634.4167dp + 636.2556dp + 638.0944dp + 639.9333dp + 641.7722dp + 643.6111dp + 645.4500dp + 647.2889dp + 649.1278dp + 650.9667dp + 652.8056dp + 654.6444dp + 656.4833dp + 658.3222dp + 660.1611dp + 662.0000dp + 671.1944dp + 680.3889dp + 735.5556dp + 753.9444dp + 776.0111dp + 867.9556dp + 919.4444dp + 1103.3333dp + 1176.8889dp + 1324.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw662dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw662dp/dimens_sp.xml new file mode 100644 index 0000000..d9e0e82 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw662dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 11.0333sp + 12.8722sp + 14.7111sp + 16.5500sp + 18.3889sp + 20.2278sp + 22.0667sp + 23.9056sp + 25.7444sp + 27.5833sp + 29.4222sp + 31.2611sp + 33.1000sp + 34.9389sp + 36.7778sp + 38.6167sp + 40.4556sp + 42.2944sp + 44.1333sp + 45.9722sp + 51.4889sp + 55.1667sp + 58.8444sp + 62.5222sp + 66.2000sp + 69.8778sp + 73.5556sp + 77.2333sp + 88.2667sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw720dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw720dp/dimens_dp.xml new file mode 100644 index 0000000..032414a --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw720dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -120.0000dp + -60.0000dp + -40.0000dp + -24.0000dp + -20.0000dp + -16.0000dp + -10.0000dp + -4.0000dp + -2.0000dp + + 0.2000dp + 1.0000dp + 2.0000dp + 3.0000dp + 4.0000dp + 5.0000dp + 6.0000dp + 7.0000dp + 8.0000dp + 9.0000dp + 10.0000dp + 12.0000dp + 14.0000dp + 16.0000dp + 18.0000dp + 20.0000dp + 22.0000dp + 24.0000dp + 26.0000dp + 28.0000dp + 30.0000dp + 32.0000dp + 34.0000dp + 36.0000dp + 38.0000dp + 40.0000dp + 42.0000dp + 44.0000dp + 46.0000dp + 48.0000dp + 50.0000dp + 52.0000dp + 54.0000dp + 56.0000dp + 58.0000dp + 60.0000dp + 62.0000dp + 64.0000dp + 66.0000dp + 68.0000dp + 70.0000dp + 72.0000dp + 74.0000dp + 76.0000dp + 78.0000dp + 80.0000dp + 82.0000dp + 84.0000dp + 86.0000dp + 88.0000dp + 90.0000dp + 92.0000dp + 94.0000dp + 96.0000dp + 98.0000dp + 100.0000dp + 102.0000dp + 104.0000dp + 106.0000dp + 108.0000dp + 110.0000dp + 112.0000dp + 114.0000dp + 116.0000dp + 118.0000dp + 120.0000dp + 122.0000dp + 124.0000dp + 126.0000dp + 128.0000dp + 130.0000dp + 132.0000dp + 134.0000dp + 136.0000dp + 138.0000dp + 140.0000dp + 142.0000dp + 144.0000dp + 146.0000dp + 148.0000dp + 150.0000dp + 152.0000dp + 154.0000dp + 156.0000dp + 158.0000dp + 160.0000dp + 162.0000dp + 164.0000dp + 166.0000dp + 168.0000dp + 170.0000dp + 172.0000dp + 174.0000dp + 176.0000dp + 178.0000dp + 180.0000dp + 182.0000dp + 184.0000dp + 186.0000dp + 188.0000dp + 190.0000dp + 192.0000dp + 194.0000dp + 196.0000dp + 198.0000dp + 200.0000dp + 202.0000dp + 204.0000dp + 206.0000dp + 208.0000dp + 210.0000dp + 212.0000dp + 214.0000dp + 216.0000dp + 218.0000dp + 220.0000dp + 222.0000dp + 224.0000dp + 226.0000dp + 228.0000dp + 230.0000dp + 232.0000dp + 234.0000dp + 236.0000dp + 238.0000dp + 240.0000dp + 242.0000dp + 244.0000dp + 246.0000dp + 248.0000dp + 250.0000dp + 252.0000dp + 254.0000dp + 256.0000dp + 258.0000dp + 260.0000dp + 262.0000dp + 264.0000dp + 266.0000dp + 268.0000dp + 270.0000dp + 272.0000dp + 274.0000dp + 276.0000dp + 278.0000dp + 280.0000dp + 282.0000dp + 284.0000dp + 286.0000dp + 288.0000dp + 290.0000dp + 292.0000dp + 294.0000dp + 296.0000dp + 298.0000dp + 300.0000dp + 302.0000dp + 304.0000dp + 306.0000dp + 308.0000dp + 310.0000dp + 312.0000dp + 314.0000dp + 316.0000dp + 318.0000dp + 320.0000dp + 322.0000dp + 324.0000dp + 326.0000dp + 328.0000dp + 330.0000dp + 332.0000dp + 334.0000dp + 336.0000dp + 338.0000dp + 340.0000dp + 342.0000dp + 344.0000dp + 346.0000dp + 348.0000dp + 350.0000dp + 352.0000dp + 354.0000dp + 356.0000dp + 358.0000dp + 360.0000dp + 362.0000dp + 364.0000dp + 366.0000dp + 368.0000dp + 370.0000dp + 372.0000dp + 374.0000dp + 376.0000dp + 378.0000dp + 380.0000dp + 382.0000dp + 384.0000dp + 386.0000dp + 388.0000dp + 390.0000dp + 392.0000dp + 394.0000dp + 396.0000dp + 398.0000dp + 400.0000dp + 402.0000dp + 404.0000dp + 406.0000dp + 408.0000dp + 410.0000dp + 412.0000dp + 414.0000dp + 416.0000dp + 418.0000dp + 420.0000dp + 422.0000dp + 424.0000dp + 426.0000dp + 428.0000dp + 430.0000dp + 432.0000dp + 434.0000dp + 436.0000dp + 438.0000dp + 440.0000dp + 442.0000dp + 444.0000dp + 446.0000dp + 448.0000dp + 450.0000dp + 452.0000dp + 454.0000dp + 456.0000dp + 458.0000dp + 460.0000dp + 462.0000dp + 464.0000dp + 466.0000dp + 468.0000dp + 470.0000dp + 472.0000dp + 474.0000dp + 476.0000dp + 478.0000dp + 480.0000dp + 482.0000dp + 484.0000dp + 486.0000dp + 488.0000dp + 490.0000dp + 492.0000dp + 494.0000dp + 496.0000dp + 498.0000dp + 500.0000dp + 502.0000dp + 504.0000dp + 506.0000dp + 508.0000dp + 510.0000dp + 512.0000dp + 514.0000dp + 516.0000dp + 518.0000dp + 520.0000dp + 522.0000dp + 524.0000dp + 526.0000dp + 528.0000dp + 530.0000dp + 532.0000dp + 534.0000dp + 536.0000dp + 538.0000dp + 540.0000dp + 542.0000dp + 544.0000dp + 546.0000dp + 548.0000dp + 550.0000dp + 552.0000dp + 554.0000dp + 556.0000dp + 558.0000dp + 560.0000dp + 562.0000dp + 564.0000dp + 566.0000dp + 568.0000dp + 570.0000dp + 572.0000dp + 574.0000dp + 576.0000dp + 578.0000dp + 580.0000dp + 582.0000dp + 584.0000dp + 586.0000dp + 588.0000dp + 590.0000dp + 592.0000dp + 594.0000dp + 596.0000dp + 598.0000dp + 600.0000dp + 602.0000dp + 604.0000dp + 606.0000dp + 608.0000dp + 610.0000dp + 612.0000dp + 614.0000dp + 616.0000dp + 618.0000dp + 620.0000dp + 622.0000dp + 624.0000dp + 626.0000dp + 628.0000dp + 630.0000dp + 632.0000dp + 634.0000dp + 636.0000dp + 638.0000dp + 640.0000dp + 642.0000dp + 644.0000dp + 646.0000dp + 648.0000dp + 650.0000dp + 652.0000dp + 654.0000dp + 656.0000dp + 658.0000dp + 660.0000dp + 662.0000dp + 664.0000dp + 666.0000dp + 668.0000dp + 670.0000dp + 672.0000dp + 674.0000dp + 676.0000dp + 678.0000dp + 680.0000dp + 682.0000dp + 684.0000dp + 686.0000dp + 688.0000dp + 690.0000dp + 692.0000dp + 694.0000dp + 696.0000dp + 698.0000dp + 700.0000dp + 702.0000dp + 704.0000dp + 706.0000dp + 708.0000dp + 710.0000dp + 712.0000dp + 714.0000dp + 716.0000dp + 718.0000dp + 720.0000dp + 730.0000dp + 740.0000dp + 800.0000dp + 820.0000dp + 844.0000dp + 944.0000dp + 1000.0000dp + 1200.0000dp + 1280.0000dp + 1440.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw720dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw720dp/dimens_sp.xml new file mode 100644 index 0000000..345bfa4 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw720dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 12.0000sp + 14.0000sp + 16.0000sp + 18.0000sp + 20.0000sp + 22.0000sp + 24.0000sp + 26.0000sp + 28.0000sp + 30.0000sp + 32.0000sp + 34.0000sp + 36.0000sp + 38.0000sp + 40.0000sp + 42.0000sp + 44.0000sp + 46.0000sp + 48.0000sp + 50.0000sp + 56.0000sp + 60.0000sp + 64.0000sp + 68.0000sp + 72.0000sp + 76.0000sp + 80.0000sp + 84.0000sp + 96.0000sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw768dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw768dp/dimens_dp.xml new file mode 100644 index 0000000..ca4d7c7 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw768dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -128.0000dp + -64.0000dp + -42.6667dp + -25.6000dp + -21.3333dp + -17.0667dp + -10.6667dp + -4.2667dp + -2.1333dp + + 0.2133dp + 1.0667dp + 2.1333dp + 3.2000dp + 4.2667dp + 5.3333dp + 6.4000dp + 7.4667dp + 8.5333dp + 9.6000dp + 10.6667dp + 12.8000dp + 14.9333dp + 17.0667dp + 19.2000dp + 21.3333dp + 23.4667dp + 25.6000dp + 27.7333dp + 29.8667dp + 32.0000dp + 34.1333dp + 36.2667dp + 38.4000dp + 40.5333dp + 42.6667dp + 44.8000dp + 46.9333dp + 49.0667dp + 51.2000dp + 53.3333dp + 55.4667dp + 57.6000dp + 59.7333dp + 61.8667dp + 64.0000dp + 66.1333dp + 68.2667dp + 70.4000dp + 72.5333dp + 74.6667dp + 76.8000dp + 78.9333dp + 81.0667dp + 83.2000dp + 85.3333dp + 87.4667dp + 89.6000dp + 91.7333dp + 93.8667dp + 96.0000dp + 98.1333dp + 100.2667dp + 102.4000dp + 104.5333dp + 106.6667dp + 108.8000dp + 110.9333dp + 113.0667dp + 115.2000dp + 117.3333dp + 119.4667dp + 121.6000dp + 123.7333dp + 125.8667dp + 128.0000dp + 130.1333dp + 132.2667dp + 134.4000dp + 136.5333dp + 138.6667dp + 140.8000dp + 142.9333dp + 145.0667dp + 147.2000dp + 149.3333dp + 151.4667dp + 153.6000dp + 155.7333dp + 157.8667dp + 160.0000dp + 162.1333dp + 164.2667dp + 166.4000dp + 168.5333dp + 170.6667dp + 172.8000dp + 174.9333dp + 177.0667dp + 179.2000dp + 181.3333dp + 183.4667dp + 185.6000dp + 187.7333dp + 189.8667dp + 192.0000dp + 194.1333dp + 196.2667dp + 198.4000dp + 200.5333dp + 202.6667dp + 204.8000dp + 206.9333dp + 209.0667dp + 211.2000dp + 213.3333dp + 215.4667dp + 217.6000dp + 219.7333dp + 221.8667dp + 224.0000dp + 226.1333dp + 228.2667dp + 230.4000dp + 232.5333dp + 234.6667dp + 236.8000dp + 238.9333dp + 241.0667dp + 243.2000dp + 245.3333dp + 247.4667dp + 249.6000dp + 251.7333dp + 253.8667dp + 256.0000dp + 258.1333dp + 260.2667dp + 262.4000dp + 264.5333dp + 266.6667dp + 268.8000dp + 270.9333dp + 273.0667dp + 275.2000dp + 277.3333dp + 279.4667dp + 281.6000dp + 283.7333dp + 285.8667dp + 288.0000dp + 290.1333dp + 292.2667dp + 294.4000dp + 296.5333dp + 298.6667dp + 300.8000dp + 302.9333dp + 305.0667dp + 307.2000dp + 309.3333dp + 311.4667dp + 313.6000dp + 315.7333dp + 317.8667dp + 320.0000dp + 322.1333dp + 324.2667dp + 326.4000dp + 328.5333dp + 330.6667dp + 332.8000dp + 334.9333dp + 337.0667dp + 339.2000dp + 341.3333dp + 343.4667dp + 345.6000dp + 347.7333dp + 349.8667dp + 352.0000dp + 354.1333dp + 356.2667dp + 358.4000dp + 360.5333dp + 362.6667dp + 364.8000dp + 366.9333dp + 369.0667dp + 371.2000dp + 373.3333dp + 375.4667dp + 377.6000dp + 379.7333dp + 381.8667dp + 384.0000dp + 386.1333dp + 388.2667dp + 390.4000dp + 392.5333dp + 394.6667dp + 396.8000dp + 398.9333dp + 401.0667dp + 403.2000dp + 405.3333dp + 407.4667dp + 409.6000dp + 411.7333dp + 413.8667dp + 416.0000dp + 418.1333dp + 420.2667dp + 422.4000dp + 424.5333dp + 426.6667dp + 428.8000dp + 430.9333dp + 433.0667dp + 435.2000dp + 437.3333dp + 439.4667dp + 441.6000dp + 443.7333dp + 445.8667dp + 448.0000dp + 450.1333dp + 452.2667dp + 454.4000dp + 456.5333dp + 458.6667dp + 460.8000dp + 462.9333dp + 465.0667dp + 467.2000dp + 469.3333dp + 471.4667dp + 473.6000dp + 475.7333dp + 477.8667dp + 480.0000dp + 482.1333dp + 484.2667dp + 486.4000dp + 488.5333dp + 490.6667dp + 492.8000dp + 494.9333dp + 497.0667dp + 499.2000dp + 501.3333dp + 503.4667dp + 505.6000dp + 507.7333dp + 509.8667dp + 512.0000dp + 514.1333dp + 516.2667dp + 518.4000dp + 520.5333dp + 522.6667dp + 524.8000dp + 526.9333dp + 529.0667dp + 531.2000dp + 533.3333dp + 535.4667dp + 537.6000dp + 539.7333dp + 541.8667dp + 544.0000dp + 546.1333dp + 548.2667dp + 550.4000dp + 552.5333dp + 554.6667dp + 556.8000dp + 558.9333dp + 561.0667dp + 563.2000dp + 565.3333dp + 567.4667dp + 569.6000dp + 571.7333dp + 573.8667dp + 576.0000dp + 578.1333dp + 580.2667dp + 582.4000dp + 584.5333dp + 586.6667dp + 588.8000dp + 590.9333dp + 593.0667dp + 595.2000dp + 597.3333dp + 599.4667dp + 601.6000dp + 603.7333dp + 605.8667dp + 608.0000dp + 610.1333dp + 612.2667dp + 614.4000dp + 616.5333dp + 618.6667dp + 620.8000dp + 622.9333dp + 625.0667dp + 627.2000dp + 629.3333dp + 631.4667dp + 633.6000dp + 635.7333dp + 637.8667dp + 640.0000dp + 642.1333dp + 644.2667dp + 646.4000dp + 648.5333dp + 650.6667dp + 652.8000dp + 654.9333dp + 657.0667dp + 659.2000dp + 661.3333dp + 663.4667dp + 665.6000dp + 667.7333dp + 669.8667dp + 672.0000dp + 674.1333dp + 676.2667dp + 678.4000dp + 680.5333dp + 682.6667dp + 684.8000dp + 686.9333dp + 689.0667dp + 691.2000dp + 693.3333dp + 695.4667dp + 697.6000dp + 699.7333dp + 701.8667dp + 704.0000dp + 706.1333dp + 708.2667dp + 710.4000dp + 712.5333dp + 714.6667dp + 716.8000dp + 718.9333dp + 721.0667dp + 723.2000dp + 725.3333dp + 727.4667dp + 729.6000dp + 731.7333dp + 733.8667dp + 736.0000dp + 738.1333dp + 740.2667dp + 742.4000dp + 744.5333dp + 746.6667dp + 748.8000dp + 750.9333dp + 753.0667dp + 755.2000dp + 757.3333dp + 759.4667dp + 761.6000dp + 763.7333dp + 765.8667dp + 768.0000dp + 778.6667dp + 789.3333dp + 853.3333dp + 874.6667dp + 900.2667dp + 1006.9333dp + 1066.6667dp + 1280.0000dp + 1365.3333dp + 1536.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw768dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw768dp/dimens_sp.xml new file mode 100644 index 0000000..212928e --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw768dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 12.8000sp + 14.9333sp + 17.0667sp + 19.2000sp + 21.3333sp + 23.4667sp + 25.6000sp + 27.7333sp + 29.8667sp + 32.0000sp + 34.1333sp + 36.2667sp + 38.4000sp + 40.5333sp + 42.6667sp + 44.8000sp + 46.9333sp + 49.0667sp + 51.2000sp + 53.3333sp + 59.7333sp + 64.0000sp + 68.2667sp + 72.5333sp + 76.8000sp + 81.0667sp + 85.3333sp + 89.6000sp + 102.4000sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw800dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw800dp/dimens_dp.xml new file mode 100644 index 0000000..b486684 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw800dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -133.3333dp + -66.6667dp + -44.4444dp + -26.6667dp + -22.2222dp + -17.7778dp + -11.1111dp + -4.4444dp + -2.2222dp + + 0.2222dp + 1.1111dp + 2.2222dp + 3.3333dp + 4.4444dp + 5.5556dp + 6.6667dp + 7.7778dp + 8.8889dp + 10.0000dp + 11.1111dp + 13.3333dp + 15.5556dp + 17.7778dp + 20.0000dp + 22.2222dp + 24.4444dp + 26.6667dp + 28.8889dp + 31.1111dp + 33.3333dp + 35.5556dp + 37.7778dp + 40.0000dp + 42.2222dp + 44.4444dp + 46.6667dp + 48.8889dp + 51.1111dp + 53.3333dp + 55.5556dp + 57.7778dp + 60.0000dp + 62.2222dp + 64.4444dp + 66.6667dp + 68.8889dp + 71.1111dp + 73.3333dp + 75.5556dp + 77.7778dp + 80.0000dp + 82.2222dp + 84.4444dp + 86.6667dp + 88.8889dp + 91.1111dp + 93.3333dp + 95.5556dp + 97.7778dp + 100.0000dp + 102.2222dp + 104.4444dp + 106.6667dp + 108.8889dp + 111.1111dp + 113.3333dp + 115.5556dp + 117.7778dp + 120.0000dp + 122.2222dp + 124.4444dp + 126.6667dp + 128.8889dp + 131.1111dp + 133.3333dp + 135.5556dp + 137.7778dp + 140.0000dp + 142.2222dp + 144.4444dp + 146.6667dp + 148.8889dp + 151.1111dp + 153.3333dp + 155.5556dp + 157.7778dp + 160.0000dp + 162.2222dp + 164.4444dp + 166.6667dp + 168.8889dp + 171.1111dp + 173.3333dp + 175.5556dp + 177.7778dp + 180.0000dp + 182.2222dp + 184.4444dp + 186.6667dp + 188.8889dp + 191.1111dp + 193.3333dp + 195.5556dp + 197.7778dp + 200.0000dp + 202.2222dp + 204.4444dp + 206.6667dp + 208.8889dp + 211.1111dp + 213.3333dp + 215.5556dp + 217.7778dp + 220.0000dp + 222.2222dp + 224.4444dp + 226.6667dp + 228.8889dp + 231.1111dp + 233.3333dp + 235.5556dp + 237.7778dp + 240.0000dp + 242.2222dp + 244.4444dp + 246.6667dp + 248.8889dp + 251.1111dp + 253.3333dp + 255.5556dp + 257.7778dp + 260.0000dp + 262.2222dp + 264.4444dp + 266.6667dp + 268.8889dp + 271.1111dp + 273.3333dp + 275.5556dp + 277.7778dp + 280.0000dp + 282.2222dp + 284.4444dp + 286.6667dp + 288.8889dp + 291.1111dp + 293.3333dp + 295.5556dp + 297.7778dp + 300.0000dp + 302.2222dp + 304.4444dp + 306.6667dp + 308.8889dp + 311.1111dp + 313.3333dp + 315.5556dp + 317.7778dp + 320.0000dp + 322.2222dp + 324.4444dp + 326.6667dp + 328.8889dp + 331.1111dp + 333.3333dp + 335.5556dp + 337.7778dp + 340.0000dp + 342.2222dp + 344.4444dp + 346.6667dp + 348.8889dp + 351.1111dp + 353.3333dp + 355.5556dp + 357.7778dp + 360.0000dp + 362.2222dp + 364.4444dp + 366.6667dp + 368.8889dp + 371.1111dp + 373.3333dp + 375.5556dp + 377.7778dp + 380.0000dp + 382.2222dp + 384.4444dp + 386.6667dp + 388.8889dp + 391.1111dp + 393.3333dp + 395.5556dp + 397.7778dp + 400.0000dp + 402.2222dp + 404.4444dp + 406.6667dp + 408.8889dp + 411.1111dp + 413.3333dp + 415.5556dp + 417.7778dp + 420.0000dp + 422.2222dp + 424.4444dp + 426.6667dp + 428.8889dp + 431.1111dp + 433.3333dp + 435.5556dp + 437.7778dp + 440.0000dp + 442.2222dp + 444.4444dp + 446.6667dp + 448.8889dp + 451.1111dp + 453.3333dp + 455.5556dp + 457.7778dp + 460.0000dp + 462.2222dp + 464.4444dp + 466.6667dp + 468.8889dp + 471.1111dp + 473.3333dp + 475.5556dp + 477.7778dp + 480.0000dp + 482.2222dp + 484.4444dp + 486.6667dp + 488.8889dp + 491.1111dp + 493.3333dp + 495.5556dp + 497.7778dp + 500.0000dp + 502.2222dp + 504.4444dp + 506.6667dp + 508.8889dp + 511.1111dp + 513.3333dp + 515.5556dp + 517.7778dp + 520.0000dp + 522.2222dp + 524.4444dp + 526.6667dp + 528.8889dp + 531.1111dp + 533.3333dp + 535.5556dp + 537.7778dp + 540.0000dp + 542.2222dp + 544.4444dp + 546.6667dp + 548.8889dp + 551.1111dp + 553.3333dp + 555.5556dp + 557.7778dp + 560.0000dp + 562.2222dp + 564.4444dp + 566.6667dp + 568.8889dp + 571.1111dp + 573.3333dp + 575.5556dp + 577.7778dp + 580.0000dp + 582.2222dp + 584.4444dp + 586.6667dp + 588.8889dp + 591.1111dp + 593.3333dp + 595.5556dp + 597.7778dp + 600.0000dp + 602.2222dp + 604.4444dp + 606.6667dp + 608.8889dp + 611.1111dp + 613.3333dp + 615.5556dp + 617.7778dp + 620.0000dp + 622.2222dp + 624.4444dp + 626.6667dp + 628.8889dp + 631.1111dp + 633.3333dp + 635.5556dp + 637.7778dp + 640.0000dp + 642.2222dp + 644.4444dp + 646.6667dp + 648.8889dp + 651.1111dp + 653.3333dp + 655.5556dp + 657.7778dp + 660.0000dp + 662.2222dp + 664.4444dp + 666.6667dp + 668.8889dp + 671.1111dp + 673.3333dp + 675.5556dp + 677.7778dp + 680.0000dp + 682.2222dp + 684.4444dp + 686.6667dp + 688.8889dp + 691.1111dp + 693.3333dp + 695.5556dp + 697.7778dp + 700.0000dp + 702.2222dp + 704.4444dp + 706.6667dp + 708.8889dp + 711.1111dp + 713.3333dp + 715.5556dp + 717.7778dp + 720.0000dp + 722.2222dp + 724.4444dp + 726.6667dp + 728.8889dp + 731.1111dp + 733.3333dp + 735.5556dp + 737.7778dp + 740.0000dp + 742.2222dp + 744.4444dp + 746.6667dp + 748.8889dp + 751.1111dp + 753.3333dp + 755.5556dp + 757.7778dp + 760.0000dp + 762.2222dp + 764.4444dp + 766.6667dp + 768.8889dp + 771.1111dp + 773.3333dp + 775.5556dp + 777.7778dp + 780.0000dp + 782.2222dp + 784.4444dp + 786.6667dp + 788.8889dp + 791.1111dp + 793.3333dp + 795.5556dp + 797.7778dp + 800.0000dp + 811.1111dp + 822.2222dp + 888.8889dp + 911.1111dp + 937.7778dp + 1048.8889dp + 1111.1111dp + 1333.3333dp + 1422.2222dp + 1600.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw800dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw800dp/dimens_sp.xml new file mode 100644 index 0000000..5aff008 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw800dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 13.3333sp + 15.5556sp + 17.7778sp + 20.0000sp + 22.2222sp + 24.4444sp + 26.6667sp + 28.8889sp + 31.1111sp + 33.3333sp + 35.5556sp + 37.7778sp + 40.0000sp + 42.2222sp + 44.4444sp + 46.6667sp + 48.8889sp + 51.1111sp + 53.3333sp + 55.5556sp + 62.2222sp + 66.6667sp + 71.1111sp + 75.5556sp + 80.0000sp + 84.4444sp + 88.8889sp + 93.3333sp + 106.6667sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw811dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw811dp/dimens_dp.xml new file mode 100644 index 0000000..cd7f4c8 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw811dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -135.1667dp + -67.5833dp + -45.0556dp + -27.0333dp + -22.5278dp + -18.0222dp + -11.2639dp + -4.5056dp + -2.2528dp + + 0.2253dp + 1.1264dp + 2.2528dp + 3.3792dp + 4.5056dp + 5.6319dp + 6.7583dp + 7.8847dp + 9.0111dp + 10.1375dp + 11.2639dp + 13.5167dp + 15.7694dp + 18.0222dp + 20.2750dp + 22.5278dp + 24.7806dp + 27.0333dp + 29.2861dp + 31.5389dp + 33.7917dp + 36.0444dp + 38.2972dp + 40.5500dp + 42.8028dp + 45.0556dp + 47.3083dp + 49.5611dp + 51.8139dp + 54.0667dp + 56.3194dp + 58.5722dp + 60.8250dp + 63.0778dp + 65.3306dp + 67.5833dp + 69.8361dp + 72.0889dp + 74.3417dp + 76.5944dp + 78.8472dp + 81.1000dp + 83.3528dp + 85.6056dp + 87.8583dp + 90.1111dp + 92.3639dp + 94.6167dp + 96.8694dp + 99.1222dp + 101.3750dp + 103.6278dp + 105.8806dp + 108.1333dp + 110.3861dp + 112.6389dp + 114.8917dp + 117.1444dp + 119.3972dp + 121.6500dp + 123.9028dp + 126.1556dp + 128.4083dp + 130.6611dp + 132.9139dp + 135.1667dp + 137.4194dp + 139.6722dp + 141.9250dp + 144.1778dp + 146.4306dp + 148.6833dp + 150.9361dp + 153.1889dp + 155.4417dp + 157.6944dp + 159.9472dp + 162.2000dp + 164.4528dp + 166.7056dp + 168.9583dp + 171.2111dp + 173.4639dp + 175.7167dp + 177.9694dp + 180.2222dp + 182.4750dp + 184.7278dp + 186.9806dp + 189.2333dp + 191.4861dp + 193.7389dp + 195.9917dp + 198.2444dp + 200.4972dp + 202.7500dp + 205.0028dp + 207.2556dp + 209.5083dp + 211.7611dp + 214.0139dp + 216.2667dp + 218.5194dp + 220.7722dp + 223.0250dp + 225.2778dp + 227.5306dp + 229.7833dp + 232.0361dp + 234.2889dp + 236.5417dp + 238.7944dp + 241.0472dp + 243.3000dp + 245.5528dp + 247.8056dp + 250.0583dp + 252.3111dp + 254.5639dp + 256.8167dp + 259.0694dp + 261.3222dp + 263.5750dp + 265.8278dp + 268.0806dp + 270.3333dp + 272.5861dp + 274.8389dp + 277.0917dp + 279.3444dp + 281.5972dp + 283.8500dp + 286.1028dp + 288.3556dp + 290.6083dp + 292.8611dp + 295.1139dp + 297.3667dp + 299.6194dp + 301.8722dp + 304.1250dp + 306.3778dp + 308.6306dp + 310.8833dp + 313.1361dp + 315.3889dp + 317.6417dp + 319.8944dp + 322.1472dp + 324.4000dp + 326.6528dp + 328.9056dp + 331.1583dp + 333.4111dp + 335.6639dp + 337.9167dp + 340.1694dp + 342.4222dp + 344.6750dp + 346.9278dp + 349.1806dp + 351.4333dp + 353.6861dp + 355.9389dp + 358.1917dp + 360.4444dp + 362.6972dp + 364.9500dp + 367.2028dp + 369.4556dp + 371.7083dp + 373.9611dp + 376.2139dp + 378.4667dp + 380.7194dp + 382.9722dp + 385.2250dp + 387.4778dp + 389.7306dp + 391.9833dp + 394.2361dp + 396.4889dp + 398.7417dp + 400.9944dp + 403.2472dp + 405.5000dp + 407.7528dp + 410.0056dp + 412.2583dp + 414.5111dp + 416.7639dp + 419.0167dp + 421.2694dp + 423.5222dp + 425.7750dp + 428.0278dp + 430.2806dp + 432.5333dp + 434.7861dp + 437.0389dp + 439.2917dp + 441.5444dp + 443.7972dp + 446.0500dp + 448.3028dp + 450.5556dp + 452.8083dp + 455.0611dp + 457.3139dp + 459.5667dp + 461.8194dp + 464.0722dp + 466.3250dp + 468.5778dp + 470.8306dp + 473.0833dp + 475.3361dp + 477.5889dp + 479.8417dp + 482.0944dp + 484.3472dp + 486.6000dp + 488.8528dp + 491.1056dp + 493.3583dp + 495.6111dp + 497.8639dp + 500.1167dp + 502.3694dp + 504.6222dp + 506.8750dp + 509.1278dp + 511.3806dp + 513.6333dp + 515.8861dp + 518.1389dp + 520.3917dp + 522.6444dp + 524.8972dp + 527.1500dp + 529.4028dp + 531.6556dp + 533.9083dp + 536.1611dp + 538.4139dp + 540.6667dp + 542.9194dp + 545.1722dp + 547.4250dp + 549.6778dp + 551.9306dp + 554.1833dp + 556.4361dp + 558.6889dp + 560.9417dp + 563.1944dp + 565.4472dp + 567.7000dp + 569.9528dp + 572.2056dp + 574.4583dp + 576.7111dp + 578.9639dp + 581.2167dp + 583.4694dp + 585.7222dp + 587.9750dp + 590.2278dp + 592.4806dp + 594.7333dp + 596.9861dp + 599.2389dp + 601.4917dp + 603.7444dp + 605.9972dp + 608.2500dp + 610.5028dp + 612.7556dp + 615.0083dp + 617.2611dp + 619.5139dp + 621.7667dp + 624.0194dp + 626.2722dp + 628.5250dp + 630.7778dp + 633.0306dp + 635.2833dp + 637.5361dp + 639.7889dp + 642.0417dp + 644.2944dp + 646.5472dp + 648.8000dp + 651.0528dp + 653.3056dp + 655.5583dp + 657.8111dp + 660.0639dp + 662.3167dp + 664.5694dp + 666.8222dp + 669.0750dp + 671.3278dp + 673.5806dp + 675.8333dp + 678.0861dp + 680.3389dp + 682.5917dp + 684.8444dp + 687.0972dp + 689.3500dp + 691.6028dp + 693.8556dp + 696.1083dp + 698.3611dp + 700.6139dp + 702.8667dp + 705.1194dp + 707.3722dp + 709.6250dp + 711.8778dp + 714.1306dp + 716.3833dp + 718.6361dp + 720.8889dp + 723.1417dp + 725.3944dp + 727.6472dp + 729.9000dp + 732.1528dp + 734.4056dp + 736.6583dp + 738.9111dp + 741.1639dp + 743.4167dp + 745.6694dp + 747.9222dp + 750.1750dp + 752.4278dp + 754.6806dp + 756.9333dp + 759.1861dp + 761.4389dp + 763.6917dp + 765.9444dp + 768.1972dp + 770.4500dp + 772.7028dp + 774.9556dp + 777.2083dp + 779.4611dp + 781.7139dp + 783.9667dp + 786.2194dp + 788.4722dp + 790.7250dp + 792.9778dp + 795.2306dp + 797.4833dp + 799.7361dp + 801.9889dp + 804.2417dp + 806.4944dp + 808.7472dp + 811.0000dp + 822.2639dp + 833.5278dp + 901.1111dp + 923.6389dp + 950.6722dp + 1063.3111dp + 1126.3889dp + 1351.6667dp + 1441.7778dp + 1622.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw811dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw811dp/dimens_sp.xml new file mode 100644 index 0000000..1ad5de9 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw811dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 13.5167sp + 15.7694sp + 18.0222sp + 20.2750sp + 22.5278sp + 24.7806sp + 27.0333sp + 29.2861sp + 31.5389sp + 33.7917sp + 36.0444sp + 38.2972sp + 40.5500sp + 42.8028sp + 45.0556sp + 47.3083sp + 49.5611sp + 51.8139sp + 54.0667sp + 56.3194sp + 63.0778sp + 67.5833sp + 72.0889sp + 76.5944sp + 81.1000sp + 85.6056sp + 90.1111sp + 94.6167sp + 108.1333sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw820dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw820dp/dimens_dp.xml new file mode 100644 index 0000000..1925707 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw820dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -136.6667dp + -68.3333dp + -45.5556dp + -27.3333dp + -22.7778dp + -18.2222dp + -11.3889dp + -4.5556dp + -2.2778dp + + 0.2278dp + 1.1389dp + 2.2778dp + 3.4167dp + 4.5556dp + 5.6944dp + 6.8333dp + 7.9722dp + 9.1111dp + 10.2500dp + 11.3889dp + 13.6667dp + 15.9444dp + 18.2222dp + 20.5000dp + 22.7778dp + 25.0556dp + 27.3333dp + 29.6111dp + 31.8889dp + 34.1667dp + 36.4444dp + 38.7222dp + 41.0000dp + 43.2778dp + 45.5556dp + 47.8333dp + 50.1111dp + 52.3889dp + 54.6667dp + 56.9444dp + 59.2222dp + 61.5000dp + 63.7778dp + 66.0556dp + 68.3333dp + 70.6111dp + 72.8889dp + 75.1667dp + 77.4444dp + 79.7222dp + 82.0000dp + 84.2778dp + 86.5556dp + 88.8333dp + 91.1111dp + 93.3889dp + 95.6667dp + 97.9444dp + 100.2222dp + 102.5000dp + 104.7778dp + 107.0556dp + 109.3333dp + 111.6111dp + 113.8889dp + 116.1667dp + 118.4444dp + 120.7222dp + 123.0000dp + 125.2778dp + 127.5556dp + 129.8333dp + 132.1111dp + 134.3889dp + 136.6667dp + 138.9444dp + 141.2222dp + 143.5000dp + 145.7778dp + 148.0556dp + 150.3333dp + 152.6111dp + 154.8889dp + 157.1667dp + 159.4444dp + 161.7222dp + 164.0000dp + 166.2778dp + 168.5556dp + 170.8333dp + 173.1111dp + 175.3889dp + 177.6667dp + 179.9444dp + 182.2222dp + 184.5000dp + 186.7778dp + 189.0556dp + 191.3333dp + 193.6111dp + 195.8889dp + 198.1667dp + 200.4444dp + 202.7222dp + 205.0000dp + 207.2778dp + 209.5556dp + 211.8333dp + 214.1111dp + 216.3889dp + 218.6667dp + 220.9444dp + 223.2222dp + 225.5000dp + 227.7778dp + 230.0556dp + 232.3333dp + 234.6111dp + 236.8889dp + 239.1667dp + 241.4444dp + 243.7222dp + 246.0000dp + 248.2778dp + 250.5556dp + 252.8333dp + 255.1111dp + 257.3889dp + 259.6667dp + 261.9444dp + 264.2222dp + 266.5000dp + 268.7778dp + 271.0556dp + 273.3333dp + 275.6111dp + 277.8889dp + 280.1667dp + 282.4444dp + 284.7222dp + 287.0000dp + 289.2778dp + 291.5556dp + 293.8333dp + 296.1111dp + 298.3889dp + 300.6667dp + 302.9444dp + 305.2222dp + 307.5000dp + 309.7778dp + 312.0556dp + 314.3333dp + 316.6111dp + 318.8889dp + 321.1667dp + 323.4444dp + 325.7222dp + 328.0000dp + 330.2778dp + 332.5556dp + 334.8333dp + 337.1111dp + 339.3889dp + 341.6667dp + 343.9444dp + 346.2222dp + 348.5000dp + 350.7778dp + 353.0556dp + 355.3333dp + 357.6111dp + 359.8889dp + 362.1667dp + 364.4444dp + 366.7222dp + 369.0000dp + 371.2778dp + 373.5556dp + 375.8333dp + 378.1111dp + 380.3889dp + 382.6667dp + 384.9444dp + 387.2222dp + 389.5000dp + 391.7778dp + 394.0556dp + 396.3333dp + 398.6111dp + 400.8889dp + 403.1667dp + 405.4444dp + 407.7222dp + 410.0000dp + 412.2778dp + 414.5556dp + 416.8333dp + 419.1111dp + 421.3889dp + 423.6667dp + 425.9444dp + 428.2222dp + 430.5000dp + 432.7778dp + 435.0556dp + 437.3333dp + 439.6111dp + 441.8889dp + 444.1667dp + 446.4444dp + 448.7222dp + 451.0000dp + 453.2778dp + 455.5556dp + 457.8333dp + 460.1111dp + 462.3889dp + 464.6667dp + 466.9444dp + 469.2222dp + 471.5000dp + 473.7778dp + 476.0556dp + 478.3333dp + 480.6111dp + 482.8889dp + 485.1667dp + 487.4444dp + 489.7222dp + 492.0000dp + 494.2778dp + 496.5556dp + 498.8333dp + 501.1111dp + 503.3889dp + 505.6667dp + 507.9444dp + 510.2222dp + 512.5000dp + 514.7778dp + 517.0556dp + 519.3333dp + 521.6111dp + 523.8889dp + 526.1667dp + 528.4444dp + 530.7222dp + 533.0000dp + 535.2778dp + 537.5556dp + 539.8333dp + 542.1111dp + 544.3889dp + 546.6667dp + 548.9444dp + 551.2222dp + 553.5000dp + 555.7778dp + 558.0556dp + 560.3333dp + 562.6111dp + 564.8889dp + 567.1667dp + 569.4444dp + 571.7222dp + 574.0000dp + 576.2778dp + 578.5556dp + 580.8333dp + 583.1111dp + 585.3889dp + 587.6667dp + 589.9444dp + 592.2222dp + 594.5000dp + 596.7778dp + 599.0556dp + 601.3333dp + 603.6111dp + 605.8889dp + 608.1667dp + 610.4444dp + 612.7222dp + 615.0000dp + 617.2778dp + 619.5556dp + 621.8333dp + 624.1111dp + 626.3889dp + 628.6667dp + 630.9444dp + 633.2222dp + 635.5000dp + 637.7778dp + 640.0556dp + 642.3333dp + 644.6111dp + 646.8889dp + 649.1667dp + 651.4444dp + 653.7222dp + 656.0000dp + 658.2778dp + 660.5556dp + 662.8333dp + 665.1111dp + 667.3889dp + 669.6667dp + 671.9444dp + 674.2222dp + 676.5000dp + 678.7778dp + 681.0556dp + 683.3333dp + 685.6111dp + 687.8889dp + 690.1667dp + 692.4444dp + 694.7222dp + 697.0000dp + 699.2778dp + 701.5556dp + 703.8333dp + 706.1111dp + 708.3889dp + 710.6667dp + 712.9444dp + 715.2222dp + 717.5000dp + 719.7778dp + 722.0556dp + 724.3333dp + 726.6111dp + 728.8889dp + 731.1667dp + 733.4444dp + 735.7222dp + 738.0000dp + 740.2778dp + 742.5556dp + 744.8333dp + 747.1111dp + 749.3889dp + 751.6667dp + 753.9444dp + 756.2222dp + 758.5000dp + 760.7778dp + 763.0556dp + 765.3333dp + 767.6111dp + 769.8889dp + 772.1667dp + 774.4444dp + 776.7222dp + 779.0000dp + 781.2778dp + 783.5556dp + 785.8333dp + 788.1111dp + 790.3889dp + 792.6667dp + 794.9444dp + 797.2222dp + 799.5000dp + 801.7778dp + 804.0556dp + 806.3333dp + 808.6111dp + 810.8889dp + 813.1667dp + 815.4444dp + 817.7222dp + 820.0000dp + 831.3889dp + 842.7778dp + 911.1111dp + 933.8889dp + 961.2222dp + 1075.1111dp + 1138.8889dp + 1366.6667dp + 1457.7778dp + 1640.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw820dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw820dp/dimens_sp.xml new file mode 100644 index 0000000..fcf6cc6 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw820dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 13.6667sp + 15.9444sp + 18.2222sp + 20.5000sp + 22.7778sp + 25.0556sp + 27.3333sp + 29.6111sp + 31.8889sp + 34.1667sp + 36.4444sp + 38.7222sp + 41.0000sp + 43.2778sp + 45.5556sp + 47.8333sp + 50.1111sp + 52.3889sp + 54.6667sp + 56.9444sp + 63.7778sp + 68.3333sp + 72.8889sp + 77.4444sp + 82.0000sp + 86.5556sp + 91.1111sp + 95.6667sp + 109.3333sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw960dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw960dp/dimens_dp.xml new file mode 100644 index 0000000..6cbf700 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw960dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -160.0000dp + -80.0000dp + -53.3333dp + -32.0000dp + -26.6667dp + -21.3333dp + -13.3333dp + -5.3333dp + -2.6667dp + + 0.2667dp + 1.3333dp + 2.6667dp + 4.0000dp + 5.3333dp + 6.6667dp + 8.0000dp + 9.3333dp + 10.6667dp + 12.0000dp + 13.3333dp + 16.0000dp + 18.6667dp + 21.3333dp + 24.0000dp + 26.6667dp + 29.3333dp + 32.0000dp + 34.6667dp + 37.3333dp + 40.0000dp + 42.6667dp + 45.3333dp + 48.0000dp + 50.6667dp + 53.3333dp + 56.0000dp + 58.6667dp + 61.3333dp + 64.0000dp + 66.6667dp + 69.3333dp + 72.0000dp + 74.6667dp + 77.3333dp + 80.0000dp + 82.6667dp + 85.3333dp + 88.0000dp + 90.6667dp + 93.3333dp + 96.0000dp + 98.6667dp + 101.3333dp + 104.0000dp + 106.6667dp + 109.3333dp + 112.0000dp + 114.6667dp + 117.3333dp + 120.0000dp + 122.6667dp + 125.3333dp + 128.0000dp + 130.6667dp + 133.3333dp + 136.0000dp + 138.6667dp + 141.3333dp + 144.0000dp + 146.6667dp + 149.3333dp + 152.0000dp + 154.6667dp + 157.3333dp + 160.0000dp + 162.6667dp + 165.3333dp + 168.0000dp + 170.6667dp + 173.3333dp + 176.0000dp + 178.6667dp + 181.3333dp + 184.0000dp + 186.6667dp + 189.3333dp + 192.0000dp + 194.6667dp + 197.3333dp + 200.0000dp + 202.6667dp + 205.3333dp + 208.0000dp + 210.6667dp + 213.3333dp + 216.0000dp + 218.6667dp + 221.3333dp + 224.0000dp + 226.6667dp + 229.3333dp + 232.0000dp + 234.6667dp + 237.3333dp + 240.0000dp + 242.6667dp + 245.3333dp + 248.0000dp + 250.6667dp + 253.3333dp + 256.0000dp + 258.6667dp + 261.3333dp + 264.0000dp + 266.6667dp + 269.3333dp + 272.0000dp + 274.6667dp + 277.3333dp + 280.0000dp + 282.6667dp + 285.3333dp + 288.0000dp + 290.6667dp + 293.3333dp + 296.0000dp + 298.6667dp + 301.3333dp + 304.0000dp + 306.6667dp + 309.3333dp + 312.0000dp + 314.6667dp + 317.3333dp + 320.0000dp + 322.6667dp + 325.3333dp + 328.0000dp + 330.6667dp + 333.3333dp + 336.0000dp + 338.6667dp + 341.3333dp + 344.0000dp + 346.6667dp + 349.3333dp + 352.0000dp + 354.6667dp + 357.3333dp + 360.0000dp + 362.6667dp + 365.3333dp + 368.0000dp + 370.6667dp + 373.3333dp + 376.0000dp + 378.6667dp + 381.3333dp + 384.0000dp + 386.6667dp + 389.3333dp + 392.0000dp + 394.6667dp + 397.3333dp + 400.0000dp + 402.6667dp + 405.3333dp + 408.0000dp + 410.6667dp + 413.3333dp + 416.0000dp + 418.6667dp + 421.3333dp + 424.0000dp + 426.6667dp + 429.3333dp + 432.0000dp + 434.6667dp + 437.3333dp + 440.0000dp + 442.6667dp + 445.3333dp + 448.0000dp + 450.6667dp + 453.3333dp + 456.0000dp + 458.6667dp + 461.3333dp + 464.0000dp + 466.6667dp + 469.3333dp + 472.0000dp + 474.6667dp + 477.3333dp + 480.0000dp + 482.6667dp + 485.3333dp + 488.0000dp + 490.6667dp + 493.3333dp + 496.0000dp + 498.6667dp + 501.3333dp + 504.0000dp + 506.6667dp + 509.3333dp + 512.0000dp + 514.6667dp + 517.3333dp + 520.0000dp + 522.6667dp + 525.3333dp + 528.0000dp + 530.6667dp + 533.3333dp + 536.0000dp + 538.6667dp + 541.3333dp + 544.0000dp + 546.6667dp + 549.3333dp + 552.0000dp + 554.6667dp + 557.3333dp + 560.0000dp + 562.6667dp + 565.3333dp + 568.0000dp + 570.6667dp + 573.3333dp + 576.0000dp + 578.6667dp + 581.3333dp + 584.0000dp + 586.6667dp + 589.3333dp + 592.0000dp + 594.6667dp + 597.3333dp + 600.0000dp + 602.6667dp + 605.3333dp + 608.0000dp + 610.6667dp + 613.3333dp + 616.0000dp + 618.6667dp + 621.3333dp + 624.0000dp + 626.6667dp + 629.3333dp + 632.0000dp + 634.6667dp + 637.3333dp + 640.0000dp + 642.6667dp + 645.3333dp + 648.0000dp + 650.6667dp + 653.3333dp + 656.0000dp + 658.6667dp + 661.3333dp + 664.0000dp + 666.6667dp + 669.3333dp + 672.0000dp + 674.6667dp + 677.3333dp + 680.0000dp + 682.6667dp + 685.3333dp + 688.0000dp + 690.6667dp + 693.3333dp + 696.0000dp + 698.6667dp + 701.3333dp + 704.0000dp + 706.6667dp + 709.3333dp + 712.0000dp + 714.6667dp + 717.3333dp + 720.0000dp + 722.6667dp + 725.3333dp + 728.0000dp + 730.6667dp + 733.3333dp + 736.0000dp + 738.6667dp + 741.3333dp + 744.0000dp + 746.6667dp + 749.3333dp + 752.0000dp + 754.6667dp + 757.3333dp + 760.0000dp + 762.6667dp + 765.3333dp + 768.0000dp + 770.6667dp + 773.3333dp + 776.0000dp + 778.6667dp + 781.3333dp + 784.0000dp + 786.6667dp + 789.3333dp + 792.0000dp + 794.6667dp + 797.3333dp + 800.0000dp + 802.6667dp + 805.3333dp + 808.0000dp + 810.6667dp + 813.3333dp + 816.0000dp + 818.6667dp + 821.3333dp + 824.0000dp + 826.6667dp + 829.3333dp + 832.0000dp + 834.6667dp + 837.3333dp + 840.0000dp + 842.6667dp + 845.3333dp + 848.0000dp + 850.6667dp + 853.3333dp + 856.0000dp + 858.6667dp + 861.3333dp + 864.0000dp + 866.6667dp + 869.3333dp + 872.0000dp + 874.6667dp + 877.3333dp + 880.0000dp + 882.6667dp + 885.3333dp + 888.0000dp + 890.6667dp + 893.3333dp + 896.0000dp + 898.6667dp + 901.3333dp + 904.0000dp + 906.6667dp + 909.3333dp + 912.0000dp + 914.6667dp + 917.3333dp + 920.0000dp + 922.6667dp + 925.3333dp + 928.0000dp + 930.6667dp + 933.3333dp + 936.0000dp + 938.6667dp + 941.3333dp + 944.0000dp + 946.6667dp + 949.3333dp + 952.0000dp + 954.6667dp + 957.3333dp + 960.0000dp + 973.3333dp + 986.6667dp + 1066.6667dp + 1093.3333dp + 1125.3333dp + 1258.6667dp + 1333.3333dp + 1600.0000dp + 1706.6667dp + 1920.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw960dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw960dp/dimens_sp.xml new file mode 100644 index 0000000..62001df --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw960dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 16.0000sp + 18.6667sp + 21.3333sp + 24.0000sp + 26.6667sp + 29.3333sp + 32.0000sp + 34.6667sp + 37.3333sp + 40.0000sp + 42.6667sp + 45.3333sp + 48.0000sp + 50.6667sp + 53.3333sp + 56.0000sp + 58.6667sp + 61.3333sp + 64.0000sp + 66.6667sp + 74.6667sp + 80.0000sp + 85.3333sp + 90.6667sp + 96.0000sp + 101.3333sp + 106.6667sp + 112.0000sp + 128.0000sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw961dp/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw961dp/dimens_dp.xml new file mode 100644 index 0000000..7aabe93 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw961dp/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -160.1667dp + -80.0833dp + -53.3889dp + -32.0333dp + -26.6944dp + -21.3556dp + -13.3472dp + -5.3389dp + -2.6694dp + + 0.2669dp + 1.3347dp + 2.6694dp + 4.0042dp + 5.3389dp + 6.6736dp + 8.0083dp + 9.3431dp + 10.6778dp + 12.0125dp + 13.3472dp + 16.0167dp + 18.6861dp + 21.3556dp + 24.0250dp + 26.6944dp + 29.3639dp + 32.0333dp + 34.7028dp + 37.3722dp + 40.0417dp + 42.7111dp + 45.3806dp + 48.0500dp + 50.7194dp + 53.3889dp + 56.0583dp + 58.7278dp + 61.3972dp + 64.0667dp + 66.7361dp + 69.4056dp + 72.0750dp + 74.7444dp + 77.4139dp + 80.0833dp + 82.7528dp + 85.4222dp + 88.0917dp + 90.7611dp + 93.4306dp + 96.1000dp + 98.7694dp + 101.4389dp + 104.1083dp + 106.7778dp + 109.4472dp + 112.1167dp + 114.7861dp + 117.4556dp + 120.1250dp + 122.7944dp + 125.4639dp + 128.1333dp + 130.8028dp + 133.4722dp + 136.1417dp + 138.8111dp + 141.4806dp + 144.1500dp + 146.8194dp + 149.4889dp + 152.1583dp + 154.8278dp + 157.4972dp + 160.1667dp + 162.8361dp + 165.5056dp + 168.1750dp + 170.8444dp + 173.5139dp + 176.1833dp + 178.8528dp + 181.5222dp + 184.1917dp + 186.8611dp + 189.5306dp + 192.2000dp + 194.8694dp + 197.5389dp + 200.2083dp + 202.8778dp + 205.5472dp + 208.2167dp + 210.8861dp + 213.5556dp + 216.2250dp + 218.8944dp + 221.5639dp + 224.2333dp + 226.9028dp + 229.5722dp + 232.2417dp + 234.9111dp + 237.5806dp + 240.2500dp + 242.9194dp + 245.5889dp + 248.2583dp + 250.9278dp + 253.5972dp + 256.2667dp + 258.9361dp + 261.6056dp + 264.2750dp + 266.9444dp + 269.6139dp + 272.2833dp + 274.9528dp + 277.6222dp + 280.2917dp + 282.9611dp + 285.6306dp + 288.3000dp + 290.9694dp + 293.6389dp + 296.3083dp + 298.9778dp + 301.6472dp + 304.3167dp + 306.9861dp + 309.6556dp + 312.3250dp + 314.9944dp + 317.6639dp + 320.3333dp + 323.0028dp + 325.6722dp + 328.3417dp + 331.0111dp + 333.6806dp + 336.3500dp + 339.0194dp + 341.6889dp + 344.3583dp + 347.0278dp + 349.6972dp + 352.3667dp + 355.0361dp + 357.7056dp + 360.3750dp + 363.0444dp + 365.7139dp + 368.3833dp + 371.0528dp + 373.7222dp + 376.3917dp + 379.0611dp + 381.7306dp + 384.4000dp + 387.0694dp + 389.7389dp + 392.4083dp + 395.0778dp + 397.7472dp + 400.4167dp + 403.0861dp + 405.7556dp + 408.4250dp + 411.0944dp + 413.7639dp + 416.4333dp + 419.1028dp + 421.7722dp + 424.4417dp + 427.1111dp + 429.7806dp + 432.4500dp + 435.1194dp + 437.7889dp + 440.4583dp + 443.1278dp + 445.7972dp + 448.4667dp + 451.1361dp + 453.8056dp + 456.4750dp + 459.1444dp + 461.8139dp + 464.4833dp + 467.1528dp + 469.8222dp + 472.4917dp + 475.1611dp + 477.8306dp + 480.5000dp + 483.1694dp + 485.8389dp + 488.5083dp + 491.1778dp + 493.8472dp + 496.5167dp + 499.1861dp + 501.8556dp + 504.5250dp + 507.1944dp + 509.8639dp + 512.5333dp + 515.2028dp + 517.8722dp + 520.5417dp + 523.2111dp + 525.8806dp + 528.5500dp + 531.2194dp + 533.8889dp + 536.5583dp + 539.2278dp + 541.8972dp + 544.5667dp + 547.2361dp + 549.9056dp + 552.5750dp + 555.2444dp + 557.9139dp + 560.5833dp + 563.2528dp + 565.9222dp + 568.5917dp + 571.2611dp + 573.9306dp + 576.6000dp + 579.2694dp + 581.9389dp + 584.6083dp + 587.2778dp + 589.9472dp + 592.6167dp + 595.2861dp + 597.9556dp + 600.6250dp + 603.2944dp + 605.9639dp + 608.6333dp + 611.3028dp + 613.9722dp + 616.6417dp + 619.3111dp + 621.9806dp + 624.6500dp + 627.3194dp + 629.9889dp + 632.6583dp + 635.3278dp + 637.9972dp + 640.6667dp + 643.3361dp + 646.0056dp + 648.6750dp + 651.3444dp + 654.0139dp + 656.6833dp + 659.3528dp + 662.0222dp + 664.6917dp + 667.3611dp + 670.0306dp + 672.7000dp + 675.3694dp + 678.0389dp + 680.7083dp + 683.3778dp + 686.0472dp + 688.7167dp + 691.3861dp + 694.0556dp + 696.7250dp + 699.3944dp + 702.0639dp + 704.7333dp + 707.4028dp + 710.0722dp + 712.7417dp + 715.4111dp + 718.0806dp + 720.7500dp + 723.4194dp + 726.0889dp + 728.7583dp + 731.4278dp + 734.0972dp + 736.7667dp + 739.4361dp + 742.1056dp + 744.7750dp + 747.4444dp + 750.1139dp + 752.7833dp + 755.4528dp + 758.1222dp + 760.7917dp + 763.4611dp + 766.1306dp + 768.8000dp + 771.4694dp + 774.1389dp + 776.8083dp + 779.4778dp + 782.1472dp + 784.8167dp + 787.4861dp + 790.1556dp + 792.8250dp + 795.4944dp + 798.1639dp + 800.8333dp + 803.5028dp + 806.1722dp + 808.8417dp + 811.5111dp + 814.1806dp + 816.8500dp + 819.5194dp + 822.1889dp + 824.8583dp + 827.5278dp + 830.1972dp + 832.8667dp + 835.5361dp + 838.2056dp + 840.8750dp + 843.5444dp + 846.2139dp + 848.8833dp + 851.5528dp + 854.2222dp + 856.8917dp + 859.5611dp + 862.2306dp + 864.9000dp + 867.5694dp + 870.2389dp + 872.9083dp + 875.5778dp + 878.2472dp + 880.9167dp + 883.5861dp + 886.2556dp + 888.9250dp + 891.5944dp + 894.2639dp + 896.9333dp + 899.6028dp + 902.2722dp + 904.9417dp + 907.6111dp + 910.2806dp + 912.9500dp + 915.6194dp + 918.2889dp + 920.9583dp + 923.6278dp + 926.2972dp + 928.9667dp + 931.6361dp + 934.3056dp + 936.9750dp + 939.6444dp + 942.3139dp + 944.9833dp + 947.6528dp + 950.3222dp + 952.9917dp + 955.6611dp + 958.3306dp + 961.0000dp + 974.3472dp + 987.6944dp + 1067.7778dp + 1094.4722dp + 1126.5056dp + 1259.9778dp + 1334.7222dp + 1601.6667dp + 1708.4444dp + 1922.0000dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values-sw961dp/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values-sw961dp/dimens_sp.xml new file mode 100644 index 0000000..db8bdcd --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values-sw961dp/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 16.0167sp + 18.6861sp + 21.3556sp + 24.0250sp + 26.6944sp + 29.3639sp + 32.0333sp + 34.7028sp + 37.3722sp + 40.0417sp + 42.7111sp + 45.3806sp + 48.0500sp + 50.7194sp + 53.3889sp + 56.0583sp + 58.7278sp + 61.3972sp + 64.0667sp + 66.7361sp + 74.7444sp + 80.0833sp + 85.4222sp + 90.7611sp + 96.1000sp + 101.4389sp + 106.7778sp + 112.1167sp + 128.1333sp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values/dimens_dp.xml b/Android_Mireo/library/base/src/main/res-sw/values/dimens_dp.xml new file mode 100644 index 0000000..4d35be3 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values/dimens_dp.xml @@ -0,0 +1,389 @@ + + + -60dp + -30dp + -20dp + -12dp + -10dp + -8dp + -5dp + -2dp + -1dp + + 0.1dp + 0.5dp + 1dp + 1.5dp + 2dp + 2.5dp + 3dp + 3.5dp + 4dp + 4.5dp + 5dp + 6dp + 7dp + 8dp + 9dp + 10dp + 11dp + 12dp + 13dp + 14dp + 15dp + 16dp + 17dp + 18dp + 19dp + 20dp + 21dp + 22dp + 23dp + 24dp + 25dp + 26dp + 27dp + 28dp + 29dp + 30dp + 31dp + 32dp + 33dp + 34dp + 35dp + 36dp + 37dp + 38dp + 39dp + 40dp + 41dp + 42dp + 43dp + 44dp + 45dp + 46dp + 47dp + 48dp + 49dp + 50dp + 51dp + 52dp + 53dp + 54dp + 55dp + 56dp + 57dp + 58dp + 59dp + 60dp + 61dp + 62dp + 63dp + 64dp + 65dp + 66dp + 67dp + 68dp + 69dp + 70dp + 71dp + 72dp + 73dp + 74dp + 75dp + 76dp + 77dp + 78dp + 79dp + 80dp + 81dp + 82dp + 83dp + 84dp + 85dp + 86dp + 87dp + 88dp + 89dp + 90dp + 91dp + 92dp + 93dp + 94dp + 95dp + 96dp + 97dp + 98dp + 99dp + 100dp + 101dp + 102dp + 103dp + 104dp + 105dp + 106dp + 107dp + 108dp + 109dp + 110dp + 111dp + 112dp + 113dp + 114dp + 115dp + 116dp + 117dp + 118dp + 119dp + 120dp + 121dp + 122dp + 123dp + 124dp + 125dp + 126dp + 127dp + 128dp + 129dp + 130dp + 131dp + 132dp + 133dp + 134dp + 135dp + 136dp + 137dp + 138dp + 139dp + 140dp + 141dp + 142dp + 143dp + 144dp + 145dp + 146dp + 147dp + 148dp + 149dp + 150dp + 151dp + 152dp + 153dp + 154dp + 155dp + 156dp + 157dp + 158dp + 159dp + 160dp + 161dp + 162dp + 163dp + 164dp + 165dp + 166dp + 167dp + 168dp + 169dp + 170dp + 171dp + 172dp + 173dp + 174dp + 175dp + 176dp + 177dp + 178dp + 179dp + 180dp + 181dp + 182dp + 183dp + 184dp + 185dp + 186dp + 187dp + 188dp + 189dp + 190dp + 191dp + 192dp + 193dp + 194dp + 195dp + 196dp + 197dp + 198dp + 199dp + 200dp + 201dp + 202dp + 203dp + 204dp + 205dp + 206dp + 207dp + 208dp + 209dp + 210dp + 211dp + 212dp + 213dp + 214dp + 215dp + 216dp + 217dp + 218dp + 219dp + 220dp + 221dp + 222dp + 223dp + 224dp + 225dp + 226dp + 227dp + 228dp + 229dp + 230dp + 231dp + 232dp + 233dp + 234dp + 235dp + 236dp + 237dp + 238dp + 239dp + 240dp + 241dp + 242dp + 243dp + 244dp + 245dp + 246dp + 247dp + 248dp + 249dp + 250dp + 251dp + 252dp + 253dp + 254dp + 255dp + 256dp + 257dp + 258dp + 259dp + 260dp + 261dp + 262dp + 263dp + 264dp + 265dp + 266dp + 267dp + 268dp + 269dp + 270dp + 271dp + 272dp + 273dp + 274dp + 275dp + 276dp + 277dp + 278dp + 279dp + 280dp + 281dp + 282dp + 283dp + 284dp + 285dp + 286dp + 287dp + 288dp + 289dp + 290dp + 291dp + 292dp + 293dp + 294dp + 295dp + 296dp + 297dp + 298dp + 299dp + 300dp + 301dp + 302dp + 303dp + 304dp + 305dp + 306dp + 307dp + 308dp + 309dp + 310dp + 311dp + 312dp + 313dp + 314dp + 315dp + 316dp + 317dp + 318dp + 319dp + 320dp + 321dp + 322dp + 323dp + 324dp + 325dp + 326dp + 327dp + 328dp + 329dp + 330dp + 331dp + 332dp + 333dp + 334dp + 335dp + 336dp + 337dp + 338dp + 339dp + 340dp + 341dp + 342dp + 343dp + 344dp + 345dp + 346dp + 347dp + 348dp + 349dp + 350dp + 351dp + 352dp + 353dp + 354dp + 355dp + 356dp + 357dp + 358dp + 359dp + 360dp + 365dp + 370dp + 400dp + 410dp + 422dp + 472dp + 500dp + 600dp + 640dp + 720dp + diff --git a/Android_Mireo/library/base/src/main/res-sw/values/dimens_sp.xml b/Android_Mireo/library/base/src/main/res-sw/values/dimens_sp.xml new file mode 100644 index 0000000..04d6e9e --- /dev/null +++ b/Android_Mireo/library/base/src/main/res-sw/values/dimens_sp.xml @@ -0,0 +1,32 @@ + + + 6sp + 7sp + 8sp + 9sp + 10sp + 11sp + 12sp + 13sp + 14sp + 15sp + 16sp + 17sp + 18sp + 19sp + 20sp + 21sp + 22sp + 23sp + 24sp + 25sp + 28sp + 30sp + 32sp + 34sp + 36sp + 38sp + 40sp + 42sp + 48sp + diff --git a/Android_Mireo/library/base/src/main/res/anim/layout_fall_down.xml b/Android_Mireo/library/base/src/main/res/anim/layout_fall_down.xml new file mode 100644 index 0000000..45cffb8 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/layout_fall_down.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/layout_fall_down_item.xml b/Android_Mireo/library/base/src/main/res/anim/layout_fall_down_item.xml new file mode 100644 index 0000000..b1ed417 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/layout_fall_down_item.xml @@ -0,0 +1,24 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/layout_from_bottom.xml b/Android_Mireo/library/base/src/main/res/anim/layout_from_bottom.xml new file mode 100644 index 0000000..28e36cd --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/layout_from_bottom.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/layout_from_bottom_item.xml b/Android_Mireo/library/base/src/main/res/anim/layout_from_bottom_item.xml new file mode 100644 index 0000000..f4df85f --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/layout_from_bottom_item.xml @@ -0,0 +1,15 @@ + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/layout_from_right.xml b/Android_Mireo/library/base/src/main/res/anim/layout_from_right.xml new file mode 100644 index 0000000..6a344e1 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/layout_from_right.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/layout_from_right_item.xml b/Android_Mireo/library/base/src/main/res/anim/layout_from_right_item.xml new file mode 100644 index 0000000..325b1d1 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/layout_from_right_item.xml @@ -0,0 +1,15 @@ + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/window_bottom_in.xml b/Android_Mireo/library/base/src/main/res/anim/window_bottom_in.xml new file mode 100644 index 0000000..2980fd2 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/window_bottom_in.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/window_bottom_out.xml b/Android_Mireo/library/base/src/main/res/anim/window_bottom_out.xml new file mode 100644 index 0000000..03e6b6c --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/window_bottom_out.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/window_ios_in.xml b/Android_Mireo/library/base/src/main/res/anim/window_ios_in.xml new file mode 100644 index 0000000..c9e2f7e --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/window_ios_in.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/window_ios_out.xml b/Android_Mireo/library/base/src/main/res/anim/window_ios_out.xml new file mode 100644 index 0000000..4333adc --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/window_ios_out.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/window_left_in.xml b/Android_Mireo/library/base/src/main/res/anim/window_left_in.xml new file mode 100644 index 0000000..ab117a6 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/window_left_in.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/window_left_out.xml b/Android_Mireo/library/base/src/main/res/anim/window_left_out.xml new file mode 100644 index 0000000..27634dc --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/window_left_out.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/window_right_in.xml b/Android_Mireo/library/base/src/main/res/anim/window_right_in.xml new file mode 100644 index 0000000..8d8caca --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/window_right_in.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/window_right_out.xml b/Android_Mireo/library/base/src/main/res/anim/window_right_out.xml new file mode 100644 index 0000000..84763a7 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/window_right_out.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/window_scale_in.xml b/Android_Mireo/library/base/src/main/res/anim/window_scale_in.xml new file mode 100644 index 0000000..069c2da --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/window_scale_in.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/window_scale_out.xml b/Android_Mireo/library/base/src/main/res/anim/window_scale_out.xml new file mode 100644 index 0000000..005c749 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/window_scale_out.xml @@ -0,0 +1,19 @@ + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/window_top_in.xml b/Android_Mireo/library/base/src/main/res/anim/window_top_in.xml new file mode 100644 index 0000000..30bfd1a --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/window_top_in.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/Android_Mireo/library/base/src/main/res/anim/window_top_out.xml b/Android_Mireo/library/base/src/main/res/anim/window_top_out.xml new file mode 100644 index 0000000..10c465a --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/anim/window_top_out.xml @@ -0,0 +1,5 @@ + + \ 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 new file mode 100644 index 0000000..04e8e4f --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/values/colors.xml @@ -0,0 +1,60 @@ + + + + #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 new file mode 100644 index 0000000..e3ffc79 --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/values/integers.xml @@ -0,0 +1,4 @@ + + + 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 new file mode 100644 index 0000000..f622eee --- /dev/null +++ b/Android_Mireo/library/base/src/main/res/values/styles.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/library/widget/build.gradle b/Android_Mireo/library/widget/build.gradle new file mode 100644 index 0000000..45a82b3 --- /dev/null +++ b/Android_Mireo/library/widget/build.gradle @@ -0,0 +1,6 @@ +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 new file mode 100644 index 0000000..b084981 --- /dev/null +++ b/Android_Mireo/library/widget/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/CustomViewStub.kt b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/CustomViewStub.kt new file mode 100644 index 0000000..a1a94f3 --- /dev/null +++ b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/CustomViewStub.kt @@ -0,0 +1,64 @@ +package com.hjq.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 + +class CustomViewStub @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, + defStyleAttr: Int = 0, defStyleRes: Int = 0) : + FrameLayout(context, attrs, defStyleAttr, defStyleRes) { + + private var listener: OnViewStubListener? = null + private val layoutResource: Int + private var inflateView: View? = null + + init { + val array: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomViewStub) + layoutResource = array.getResourceId(R.styleable.CustomViewStub_android_layout, 0) + array.recycle() + + visibility = GONE + } + + override fun setVisibility(visibility: Int) { + super.setVisibility(visibility) + if (inflateView == null && visibility != GONE) { + inflateView = LayoutInflater.from(context).inflate(layoutResource, this, false) + val layoutParams: LayoutParams? = inflateView!!.layoutParams as LayoutParams? + if (layoutParams != null) { + layoutParams.width = getLayoutParams().width + layoutParams.height = getLayoutParams().height + if (layoutParams.gravity == LayoutParams.UNSPECIFIED_GRAVITY) { + layoutParams.gravity = Gravity.CENTER + } + inflateView!!.layoutParams = layoutParams + } + addView(inflateView) + listener?.onInflate(this, inflateView!!) + } + listener?.onVisibility(this, visibility) + } + + fun setCustomVisibility(visibility: Int) { + super.setVisibility(visibility) + } + + fun getInflateView(): View? { + return inflateView + } + + fun setOnViewStubListener(listener: OnViewStubListener?) { + this.listener = listener + } + + interface OnViewStubListener { + + fun onInflate(stub: CustomViewStub, inflatedView: View) + + fun onVisibility(stub: CustomViewStub, visibility: Int) + } +} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedLinearLayout.kt b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedLinearLayout.kt new file mode 100644 index 0000000..12a7015 --- /dev/null +++ b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedLinearLayout.kt @@ -0,0 +1,222 @@ +package com.hjq.widget.layout + +import android.content.Context +import android.util.AttributeSet +import android.view.* +import android.widget.LinearLayout +import androidx.core.view.* +import kotlin.math.abs + +class NestedLinearLayout @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, defStyleRes: Int = 0) : + LinearLayout(context, attrs, defStyleAttr, defStyleRes), NestedScrollingChild, NestedScrollingParent { + + companion object { + private const val INVALID_POINTER: Int = -1 + } + + private val childHelper: NestedScrollingChildHelper + private val parentHelper: NestedScrollingParentHelper + private val scrollConsumed: IntArray = IntArray(2) + private val scrollOffset: IntArray = IntArray(2) + private val touchSlop: Float + private val maximumVelocity: Float + private val minimumVelocity: Float + private var lastMotionY: Int = 0 + private var activePointerId: Int = 0 + private var velocityTracker: VelocityTracker? = null + private var beingDragged: Boolean = false + + init { + setWillNotDraw(false) + childHelper = NestedScrollingChildHelper(this) + parentHelper = NestedScrollingParentHelper(this) + isNestedScrollingEnabled = true + touchSlop = ViewConfiguration.get(getContext()).scaledTouchSlop.toFloat() + maximumVelocity = ViewConfiguration.get(getContext()).scaledMaximumFlingVelocity.toFloat() + minimumVelocity = ViewConfiguration.get(getContext()).scaledMinimumFlingVelocity.toFloat() + } + + @Suppress("ClickableViewAccessibility") + override fun onTouchEvent(ev: MotionEvent): Boolean { + val event: MotionEvent = MotionEvent.obtain(ev) + initVelocityTrackerIfNotExists() + when (event.actionMasked) { + MotionEvent.ACTION_DOWN -> { + velocityTracker?.addMovement(ev) + lastMotionY = event.y.toInt() + activePointerId = event.getPointerId(0) + startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL) + } + MotionEvent.ACTION_MOVE -> run { + val activePointerIndex: Int = event.findPointerIndex(activePointerId) + if (activePointerIndex == -1) { + return@run + } + val y: Int = event.getY(activePointerIndex).toInt() + var deltaY: Int = lastMotionY - y + if (dispatchNestedPreScroll(0, deltaY, scrollConsumed, scrollOffset)) { + deltaY -= scrollConsumed[1] + event.offsetLocation(0f, scrollOffset[1].toFloat()) + } + if (!beingDragged && abs(lastMotionY - y) > touchSlop) { + this.parent?.requestDisallowInterceptTouchEvent(true) + beingDragged = true + if (deltaY > 0) { + deltaY -= touchSlop.toInt() + } else { + deltaY += touchSlop.toInt() + } + } + if (beingDragged) { + velocityTracker?.addMovement(ev) + lastMotionY = y - scrollOffset[1] + if (dispatchNestedScroll(0, 0, 0, deltaY, scrollOffset)) { + lastMotionY -= scrollOffset[1] + event.offsetLocation(0f, scrollOffset[1].toFloat()) + } + } + } + MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> { + if (beingDragged) { + velocityTracker?.computeCurrentVelocity(1000, maximumVelocity) + var initialVelocity: Int? = + velocityTracker?.getYVelocity(activePointerId)?.toInt() + if (initialVelocity == null) { + initialVelocity = 0 + } + if (abs(initialVelocity) > minimumVelocity) { + flingWithNestedDispatch(-initialVelocity) + } + } + activePointerId = INVALID_POINTER + endDrag() + } + MotionEvent.ACTION_POINTER_DOWN -> { + val index: Int = event.actionIndex + lastMotionY = event.getY(index).toInt() + activePointerId = event.getPointerId(index) + } + MotionEvent.ACTION_POINTER_UP -> { + onSecondaryPointerUp(event) + lastMotionY = event.getY(event.findPointerIndex(activePointerId)).toInt() + } + } + event.recycle() + return true + } + + private fun onSecondaryPointerUp(ev: MotionEvent) { + val pointerIndex: Int = ((ev.action and MotionEvent.ACTION_POINTER_INDEX_MASK) + shr MotionEvent.ACTION_POINTER_INDEX_SHIFT) + val pointerId: Int = ev.getPointerId(pointerIndex) + if (pointerId == activePointerId) { + val newPointerIndex: Int = if (pointerIndex == 0) 1 else 0 + lastMotionY = ev.getY(newPointerIndex).toInt() + activePointerId = ev.getPointerId(newPointerIndex) + velocityTracker?.clear() + } + } + + private fun endDrag() { + beingDragged = false + recycleVelocityTracker() + stopNestedScroll() + } + + private fun flingWithNestedDispatch(velocityY: Int) { + if (!dispatchNestedPreFling(0f, velocityY.toFloat())) { + dispatchNestedFling(0f, velocityY.toFloat(), true) + } + } + + private fun initVelocityTrackerIfNotExists() { + if (velocityTracker == null) { + velocityTracker = VelocityTracker.obtain() + } + } + + private fun recycleVelocityTracker() { + velocityTracker?.recycle() + velocityTracker = null + } + + override fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) { + if (disallowIntercept) { + recycleVelocityTracker() + } + super.requestDisallowInterceptTouchEvent(disallowIntercept) + } + + // NestedScrollingChild + override fun setNestedScrollingEnabled(enabled: Boolean) { + childHelper.isNestedScrollingEnabled = enabled + } + + override fun isNestedScrollingEnabled(): Boolean { + return childHelper.isNestedScrollingEnabled + } + + override fun startNestedScroll(axes: Int): Boolean { + return childHelper.startNestedScroll(axes) + } + + override fun stopNestedScroll() { + childHelper.stopNestedScroll() + } + + override fun hasNestedScrollingParent(): Boolean { + return childHelper.hasNestedScrollingParent() + } + + override fun dispatchNestedScroll(dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int, offsetInWindow: IntArray?): Boolean { + return childHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow) + } + + override fun dispatchNestedPreScroll(dx: Int, dy: Int, consumed: IntArray?, offsetInWindow: IntArray?): Boolean { + return childHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow) + } + + override fun dispatchNestedFling(velocityX: Float, velocityY: Float, consumed: Boolean): Boolean { + return childHelper.dispatchNestedFling(velocityX, velocityY, consumed) + } + + override fun dispatchNestedPreFling(velocityX: Float, velocityY: Float): Boolean { + return childHelper.dispatchNestedPreFling(velocityX, velocityY) + } + + // NestedScrollingParent + override fun onStartNestedScroll(child: View, target: View, nestedScrollAxes: Int): Boolean { + return (nestedScrollAxes and ViewCompat.SCROLL_AXIS_VERTICAL) != 0 + } + + override fun onNestedScrollAccepted(child: View, target: View, nestedScrollAxes: Int) { + parentHelper.onNestedScrollAccepted(child, target, nestedScrollAxes) + startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL) + } + + override fun onStopNestedScroll(target: View) { + parentHelper.onStopNestedScroll(target) + stopNestedScroll() + } + + override fun onNestedScroll(target: View, dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int) { + dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, null) + } + + override fun onNestedPreScroll(target: View, dx: Int, dy: Int, consumed: IntArray) { + dispatchNestedPreScroll(dx, dy, consumed, null) + } + + override fun onNestedFling(target: View, velocityX: Float, velocityY: Float, consumed: Boolean): Boolean { + return dispatchNestedFling(velocityX, velocityY, consumed) + } + + override fun onNestedPreFling(target: View, velocityX: Float, velocityY: Float): Boolean { + return dispatchNestedPreFling(velocityX, velocityY) + } + + override fun getNestedScrollAxes(): Int { + return parentHelper.nestedScrollAxes + } +} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedScrollWebView.kt b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedScrollWebView.kt new file mode 100644 index 0000000..d6a3cc1 --- /dev/null +++ b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedScrollWebView.kt @@ -0,0 +1,124 @@ +package com.hjq.widget.layout + +import android.content.Context +import android.util.AttributeSet +import android.view.MotionEvent +import android.webkit.WebView +import androidx.core.view.NestedScrollingChild +import androidx.core.view.NestedScrollingChildHelper +import androidx.core.view.ViewCompat +import kotlin.math.max + +open class NestedScrollWebView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, defStyleRes: Int = 0) : + WebView(context, attrs, defStyleAttr, defStyleRes), NestedScrollingChild { + + @Suppress("LeakingThis") + private val childHelper: NestedScrollingChildHelper = NestedScrollingChildHelper(this) + private var lastMotionY: Int = 0 + private val scrollOffset: IntArray = IntArray(2) + private val scrollConsumed: IntArray = IntArray(2) + private var nestedOffsetY: Int = 0 + private var change: Boolean = false + + init { + isNestedScrollingEnabled = true + } + + @Suppress("ClickableViewAccessibility") + override fun onTouchEvent(event: MotionEvent): Boolean { + var result = false + val trackedEvent: MotionEvent = MotionEvent.obtain(event) + val action: Int = event.actionMasked + if (action == MotionEvent.ACTION_DOWN) { + nestedOffsetY = 0 + } + val y: Int = event.y.toInt() + event.offsetLocation(0f, nestedOffsetY.toFloat()) + when (action) { + MotionEvent.ACTION_DOWN -> { + change = false + lastMotionY = y + startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL) + result = super.onTouchEvent(event) + } + MotionEvent.ACTION_MOVE -> { + var deltaY: Int = lastMotionY - y + if (dispatchNestedPreScroll(0, deltaY, scrollConsumed, scrollOffset)) { + deltaY -= scrollConsumed[1] + trackedEvent.offsetLocation(0f, scrollOffset[1].toFloat()) + nestedOffsetY += scrollOffset[1] + } + lastMotionY = y - scrollOffset[1] + val oldY: Int = scrollY + val newScrollY: Int = max(0, oldY + deltaY) + val dyConsumed: Int = newScrollY - oldY + val dyUnconsumed: Int = deltaY - dyConsumed + if (dispatchNestedScroll(0, dyConsumed, 0, dyUnconsumed, scrollOffset)) { + lastMotionY -= scrollOffset[1] + trackedEvent.offsetLocation(0f, scrollOffset[1].toFloat()) + nestedOffsetY += scrollOffset[1] + } + if (scrollConsumed[1] == 0 && scrollOffset[1] == 0) { + if (change) { + change = false + trackedEvent.action = MotionEvent.ACTION_DOWN + super.onTouchEvent(trackedEvent) + } else { + result = super.onTouchEvent(trackedEvent) + } + trackedEvent.recycle() + } else { + if (!change) { + change = true + super.onTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0f, 0f, 0)) + } + } + } + MotionEvent.ACTION_POINTER_DOWN, MotionEvent.ACTION_POINTER_UP, MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { + stopNestedScroll() + result = super.onTouchEvent(event) + } + } + return result + } + + /** + * [NestedScrollingChild] + */ + final override fun setNestedScrollingEnabled(enabled: Boolean) { + childHelper.isNestedScrollingEnabled = enabled + } + + override fun isNestedScrollingEnabled(): Boolean { + return childHelper.isNestedScrollingEnabled + } + + override fun startNestedScroll(axes: Int): Boolean { + return childHelper.startNestedScroll(axes) + } + + override fun stopNestedScroll() { + childHelper.stopNestedScroll() + } + + override fun hasNestedScrollingParent(): Boolean { + return childHelper.hasNestedScrollingParent() + } + + override fun dispatchNestedScroll(dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int, offsetInWindow: IntArray?): Boolean { + return childHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow) + } + + override fun dispatchNestedPreScroll(dx: Int, dy: Int, consumed: IntArray?, offsetInWindow: IntArray?): Boolean { + return childHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow) + } + + override fun dispatchNestedFling(velocityX: Float, velocityY: Float, consumed: Boolean): Boolean { + return childHelper.dispatchNestedFling(velocityX, velocityY, consumed) + } + + override fun dispatchNestedPreFling(velocityX: Float, velocityY: Float): Boolean { + return childHelper.dispatchNestedPreFling(velocityX, velocityY) + } +} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedViewPager.kt b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedViewPager.kt new file mode 100644 index 0000000..0fbb8f0 --- /dev/null +++ b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NestedViewPager.kt @@ -0,0 +1,88 @@ +package com.hjq.widget.layout + +import android.content.Context +import android.util.AttributeSet +import android.view.View +import androidx.core.view.* +import androidx.viewpager.widget.ViewPager + +class NestedViewPager @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : + ViewPager(context, attrs), NestedScrollingParent, NestedScrollingChild { + + private val parentHelper: NestedScrollingParentHelper = NestedScrollingParentHelper(this) + private val childHelper: NestedScrollingChildHelper = NestedScrollingChildHelper(this) + + init { + isNestedScrollingEnabled = true + } + + override fun setNestedScrollingEnabled(enabled: Boolean) { + childHelper.isNestedScrollingEnabled = enabled + } + + override fun isNestedScrollingEnabled(): Boolean { + return childHelper.isNestedScrollingEnabled + } + + override fun startNestedScroll(axes: Int): Boolean { + return childHelper.startNestedScroll(axes) + } + + override fun stopNestedScroll() { + childHelper.stopNestedScroll() + } + + override fun hasNestedScrollingParent(): Boolean { + return childHelper.hasNestedScrollingParent() + } + + override fun dispatchNestedScroll(dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int, offsetInWindow: IntArray?): Boolean { + return childHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow) + } + + override fun dispatchNestedPreScroll(dx: Int, dy: Int, consumed: IntArray?, offsetInWindow: IntArray?): Boolean { + return childHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow) + } + + override fun dispatchNestedFling(velocityX: Float, velocityY: Float, consumed: Boolean): Boolean { + return childHelper.dispatchNestedFling(velocityX, velocityY, consumed) + } + + override fun dispatchNestedPreFling(velocityX: Float, velocityY: Float): Boolean { + return childHelper.dispatchNestedPreFling(velocityX, velocityY) + } + + override fun onStartNestedScroll(child: View, target: View, nestedScrollAxes: Int): Boolean { + return (nestedScrollAxes and ViewCompat.SCROLL_AXIS_VERTICAL) != 0 + } + + override fun onNestedScrollAccepted(child: View, target: View, nestedScrollAxes: Int) { + parentHelper.onNestedScrollAccepted(child, target, nestedScrollAxes) + startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL) + } + + override fun onStopNestedScroll(target: View) { + parentHelper.onStopNestedScroll(target) + stopNestedScroll() + } + + override fun onNestedScroll(target: View, dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int) { + dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, null) + } + + override fun onNestedPreScroll(target: View, dx: Int, dy: Int, consumed: IntArray) { + dispatchNestedPreScroll(dx, dy, consumed, null) + } + + override fun onNestedFling(target: View, velocityX: Float, velocityY: Float, consumed: Boolean): Boolean { + return dispatchNestedFling(velocityX, velocityY, consumed) + } + + override fun onNestedPreFling(target: View, velocityX: Float, velocityY: Float): Boolean { + return dispatchNestedPreFling(velocityX, velocityY) + } + + override fun getNestedScrollAxes(): Int { + return parentHelper.nestedScrollAxes + } +} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NoScrollViewPager.kt b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NoScrollViewPager.kt new file mode 100644 index 0000000..992f928 --- /dev/null +++ b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/NoScrollViewPager.kt @@ -0,0 +1,30 @@ +package com.hjq.widget.layout + +import android.content.Context +import android.util.AttributeSet +import android.view.KeyEvent +import android.view.MotionEvent +import androidx.viewpager.widget.ViewPager +import kotlin.math.abs + +class NoScrollViewPager @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null) : + ViewPager(context, attrs) { + + override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { + return false + } + + @Suppress("ClickableViewAccessibility") + override fun onTouchEvent(ev: MotionEvent?): Boolean { + return false + } + + override fun executeKeyEvent(event: KeyEvent): Boolean { + return false + } + + override fun setCurrentItem(item: Int) { + super.setCurrentItem(item, abs(currentItem - item) == 1) + } +} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/SettingBar.kt b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/SettingBar.kt new file mode 100644 index 0000000..2e0e9a3 --- /dev/null +++ b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/SettingBar.kt @@ -0,0 +1,391 @@ +package com.hjq.widget.layout + +import android.content.Context +import android.content.res.TypedArray +import android.graphics.Color +import android.graphics.PorterDuff +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable +import android.graphics.drawable.StateListDrawable +import android.text.TextUtils +import android.util.AttributeSet +import android.util.TypedValue +import android.view.Gravity +import android.view.View +import android.widget.FrameLayout +import android.widget.LinearLayout +import android.widget.TextView +import androidx.annotation.ColorInt +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import androidx.core.content.ContextCompat +import com.hjq.widget.R + +class SettingBar @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, defStyleRes: Int = 0) : + FrameLayout(context, attrs, defStyleAttr, defStyleRes) { + + companion object { + + const val NO_COLOR: Int = Color.TRANSPARENT + } + + private val mainLayout: LinearLayout = LinearLayout(getContext()) + private val leftView: TextView = TextView(getContext()) + private val rightView: TextView = TextView(getContext()) + private val lineView: View = View(getContext()) + + private var leftDrawableTint: Int = 0 + private var rightDrawableTint: Int = 0 + + private var leftDrawableSize: Int = 0 + private var rightDrawableSize: Int = 0 + + init { + mainLayout.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER_VERTICAL) + val leftParams = LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT) + leftParams.gravity = Gravity.CENTER_VERTICAL + leftParams.weight = 1f + leftView.layoutParams = leftParams + + val rightParams = LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT) + rightParams.gravity = Gravity.CENTER_VERTICAL + rightView.layoutParams = rightParams + rightView.layoutParams = rightParams + + lineView.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, 1, Gravity.BOTTOM) + leftView.gravity = Gravity.START or Gravity.CENTER_VERTICAL + rightView.gravity = Gravity.END or Gravity.CENTER_VERTICAL + leftView.isSingleLine = true + rightView.isSingleLine = true + leftView.ellipsize = TextUtils.TruncateAt.END + rightView.ellipsize = TextUtils.TruncateAt.END + leftView.setLineSpacing(resources.getDimension(R.dimen.dp_5), leftView.lineSpacingMultiplier) + rightView.setLineSpacing(resources.getDimension(R.dimen.dp_5), rightView.lineSpacingMultiplier) + leftView.setPaddingRelative( + resources.getDimension(R.dimen.dp_15).toInt(), + resources.getDimension(R.dimen.dp_12).toInt(), + resources.getDimension(R.dimen.dp_15).toInt(), + resources.getDimension(R.dimen.dp_12).toInt() + ) + rightView.setPaddingRelative( + resources.getDimension(R.dimen.dp_15).toInt(), + resources.getDimension(R.dimen.dp_12).toInt(), + resources.getDimension(R.dimen.dp_15).toInt(), + resources.getDimension(R.dimen.dp_12).toInt() + ) + val array: TypedArray = getContext().obtainStyledAttributes(attrs, R.styleable.SettingBar) + + if (array.hasValue(R.styleable.SettingBar_bar_leftText)) { + setLeftText(array.getString(R.styleable.SettingBar_bar_leftText)) + } + if (array.hasValue(R.styleable.SettingBar_bar_rightText)) { + setRightText(array.getString(R.styleable.SettingBar_bar_rightText)) + } + + if (array.hasValue(R.styleable.SettingBar_bar_leftTextHint)) { + setLeftTextHint(array.getString(R.styleable.SettingBar_bar_leftTextHint)) + } + if (array.hasValue(R.styleable.SettingBar_bar_rightTextHint)) { + setRightTextHint(array.getString(R.styleable.SettingBar_bar_rightTextHint)) + } + + if (array.hasValue(R.styleable.SettingBar_bar_leftDrawableSize)) { + setLeftDrawableSize( + array.getDimensionPixelSize( + R.styleable.SettingBar_bar_leftDrawableSize, + 0 + ) + ) + } + if (array.hasValue(R.styleable.SettingBar_bar_rightDrawableSize)) { + setRightDrawableSize( + array.getDimensionPixelSize( + R.styleable.SettingBar_bar_rightDrawableSize, + 0 + ) + ) + } + + if (array.hasValue(R.styleable.SettingBar_bar_leftDrawableTint)) { + setLeftDrawableTint( + array.getColor( + R.styleable.SettingBar_bar_leftDrawableTint, + NO_COLOR + ) + ) + } + if (array.hasValue(R.styleable.SettingBar_bar_rightDrawableTint)) { + setRightDrawableTint( + array.getColor( + R.styleable.SettingBar_bar_rightDrawableTint, + NO_COLOR + ) + ) + } + + setLeftDrawablePadding( + if (array.hasValue(R.styleable.SettingBar_bar_leftDrawablePadding)) array.getDimensionPixelSize( + R.styleable.SettingBar_bar_leftDrawablePadding, + 0 + ) else resources.getDimension(R.dimen.dp_10).toInt() + ) + setRightDrawablePadding( + if (array.hasValue(R.styleable.SettingBar_bar_rightDrawablePadding)) + array.getDimensionPixelSize(R.styleable.SettingBar_bar_rightDrawablePadding, 0) + else + resources.getDimension(R.dimen.dp_10).toInt() + ) + + if (array.hasValue(R.styleable.SettingBar_bar_leftDrawable)) { + setLeftDrawable(array.getDrawable(R.styleable.SettingBar_bar_leftDrawable)) + } + if (array.hasValue(R.styleable.SettingBar_bar_rightDrawable)) { + setRightDrawable(array.getDrawable(R.styleable.SettingBar_bar_rightDrawable)) + } + + setLeftTextColor( + array.getColor( + R.styleable.SettingBar_bar_leftTextColor, + ContextCompat.getColor(getContext(), R.color.black80) + ) + ) + setRightTextColor( + array.getColor( + R.styleable.SettingBar_bar_rightTextColor, + ContextCompat.getColor(getContext(), R.color.black60) + ) + ) + + setLeftTextSize(TypedValue.COMPLEX_UNIT_PX, array.getDimensionPixelSize( + R.styleable.SettingBar_bar_leftTextSize, resources.getDimension(R.dimen.sp_15).toInt()).toFloat()) + setRightTextSize(TypedValue.COMPLEX_UNIT_PX, array.getDimensionPixelSize( + R.styleable.SettingBar_bar_rightTextSize, resources.getDimension(R.dimen.sp_14).toInt()).toFloat()) + + if (array.hasValue(R.styleable.SettingBar_bar_lineDrawable)) { + setLineDrawable(array.getDrawable(R.styleable.SettingBar_bar_lineDrawable)) + } else { + setLineDrawable(ColorDrawable(Color.parseColor("#ECECEC"))) + } + if (array.hasValue(R.styleable.SettingBar_bar_lineVisible)) { + setLineVisible(array.getBoolean(R.styleable.SettingBar_bar_lineVisible, true)) + } + if (array.hasValue(R.styleable.SettingBar_bar_lineSize)) { + setLineSize(array.getDimensionPixelSize(R.styleable.SettingBar_bar_lineSize, 0)) + } + if (array.hasValue(R.styleable.SettingBar_bar_lineMargin)) { + setLineMargin(array.getDimensionPixelSize(R.styleable.SettingBar_bar_lineMargin, 0)) + } + if (background == null) { + val drawable = StateListDrawable() + drawable.addState( + intArrayOf(android.R.attr.state_pressed), + ColorDrawable(ContextCompat.getColor(getContext(), R.color.black5)) + ) + drawable.addState( + intArrayOf(android.R.attr.state_selected), + ColorDrawable(ContextCompat.getColor(getContext(), R.color.black5)) + ) + drawable.addState( + intArrayOf(android.R.attr.state_focused), + ColorDrawable(ContextCompat.getColor(getContext(), R.color.black5)) + ) + drawable.addState( + intArrayOf(), + ColorDrawable(ContextCompat.getColor(getContext(), R.color.white)) + ) + background = drawable + + isFocusable = true + isClickable = true + } + array.recycle() + mainLayout.addView(leftView) + mainLayout.addView(rightView) + addView(mainLayout, 0) + addView(lineView, 1) + } + + fun setLeftText(@StringRes id: Int): SettingBar = apply { + setLeftText(resources.getString(id)) + } + + fun setLeftText(text: CharSequence?): SettingBar = apply { + leftView.text = text + } + + fun getLeftText(): CharSequence? { + return leftView.text + } + + fun setLeftTextHint(@StringRes id: Int): SettingBar = apply { + setLeftTextHint(resources.getString(id)) + } + + fun setLeftTextHint(hint: CharSequence?): SettingBar = apply { + leftView.hint = hint + } + + fun setRightText(@StringRes id: Int): SettingBar = apply { + setRightText(resources.getString(id)) + } + + fun setRightText(text: CharSequence?): SettingBar = apply { + rightView.text = text + } + + fun getRightText(): CharSequence? { + return rightView.text + } + + fun setRightTextHint(@StringRes id: Int): SettingBar = apply { + setRightTextHint(resources.getString(id)) + } + + fun setRightTextHint(hint: CharSequence?): SettingBar = apply { + rightView.hint = hint + } + + fun setLeftDrawable(@DrawableRes id: Int): SettingBar = apply { + setLeftDrawable(ContextCompat.getDrawable(context, id)) + } + + fun setLeftDrawable(drawable: Drawable?): SettingBar = apply { + leftView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null) + setLeftDrawableSize(leftDrawableSize) + setLeftDrawableTint(leftDrawableTint) + } + + fun getLeftDrawable(): Drawable? { + return leftView.compoundDrawables[0] + } + + fun setRightDrawable(@DrawableRes id: Int): SettingBar = apply { + setRightDrawable(ContextCompat.getDrawable(context, id)) + } + + fun setRightDrawable(drawable: Drawable?): SettingBar = apply { + rightView.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null) + setRightDrawableSize(rightDrawableSize) + setRightDrawableTint(rightDrawableTint) + } + + fun getRightDrawable(): Drawable? { + return rightView.compoundDrawables[2] + } + + fun setLeftDrawablePadding(padding: Int): SettingBar = apply { + leftView.compoundDrawablePadding = padding + } + + fun setRightDrawablePadding(padding: Int): SettingBar = apply { + rightView.compoundDrawablePadding = padding + } + + fun setLeftDrawableSize(size: Int): SettingBar = apply { + leftDrawableSize = size + val drawable: Drawable? = getLeftDrawable() + if (drawable != null) { + if (size > 0) { + drawable.setBounds(0, 0, size, size) + } else { + drawable.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight) + } + leftView.setCompoundDrawables(drawable, null, null, null) + } + } + + fun setRightDrawableSize(size: Int): SettingBar = apply { + rightDrawableSize = size + val drawable: Drawable? = getRightDrawable() + if (drawable != null) { + if (size > 0) { + drawable.setBounds(0, 0, size, size) + } else { + drawable.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight) + } + rightView.setCompoundDrawables(null, null, drawable, null) + } + } + + fun setLeftDrawableTint(color: Int): SettingBar = apply { + leftDrawableTint = color + val drawable: Drawable? = getLeftDrawable() + if (drawable != null && color != NO_COLOR) { + drawable.mutate() + drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN) + } + } + + fun setRightDrawableTint(color: Int): SettingBar = apply { + rightDrawableTint = color + val drawable: Drawable? = getRightDrawable() + if (drawable != null && color != NO_COLOR) { + drawable.mutate() + drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN) + } + } + + fun setLeftTextColor(@ColorInt color: Int): SettingBar = apply { + leftView.setTextColor(color) + } + + fun setRightTextColor(@ColorInt color: Int): SettingBar = apply { + rightView.setTextColor(color) + } + + fun setLeftTextSize(unit: Int, size: Float): SettingBar = apply { + leftView.setTextSize(unit, size) + } + + fun setRightTextSize(unit: Int, size: Float): SettingBar = apply { + rightView.setTextSize(unit, size) + } + + fun setLineVisible(visible: Boolean): SettingBar = apply { + lineView.visibility = if (visible) VISIBLE else GONE + } + + fun setLineColor(@ColorInt color: Int): SettingBar = apply { + setLineDrawable(ColorDrawable(color)) + } + + fun setLineDrawable(drawable: Drawable?): SettingBar = apply { + lineView.background = drawable + } + + fun setLineSize(size: Int): SettingBar = apply { + var params: LayoutParams? = lineView.layoutParams as LayoutParams? + if (params == null) { + params = generateDefaultLayoutParams() + } + params?.height = size + lineView.layoutParams = params + } + + fun setLineMargin(margin: Int): SettingBar = apply { + var params: LayoutParams? = lineView.layoutParams as LayoutParams? + if (params == null) { + params = generateDefaultLayoutParams() + } + params?.leftMargin = margin + params?.rightMargin = margin + lineView.layoutParams = params + } + + fun getMainLayout(): LinearLayout { + return mainLayout + } + + fun getLeftView(): TextView { + return leftView + } + + fun getRightView(): TextView { + return rightView + } + + fun getLineView(): View { + return lineView + } +} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/WrapRecyclerView.kt b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/WrapRecyclerView.kt new file mode 100644 index 0000000..34e89a2 --- /dev/null +++ b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/layout/WrapRecyclerView.kt @@ -0,0 +1,316 @@ +package com.hjq.widget.layout + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.ViewParent +import androidx.annotation.LayoutRes +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup +import androidx.recyclerview.widget.RecyclerView +import java.util.* + +class WrapRecyclerView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : + RecyclerView(context, attrs, defStyleAttr) { + + private var realAdapter: Adapter? = null + + private var wrapAdapter: WrapRecyclerAdapter = WrapRecyclerAdapter() + + override fun setAdapter(adapter: Adapter?) { + realAdapter = adapter + wrapAdapter.setRealAdapter(realAdapter) + itemAnimator = null + super.setAdapter(wrapAdapter) + } + + override fun getAdapter(): Adapter<*>? { + return realAdapter + } + + fun addHeaderView(view: View) { + wrapAdapter.addHeaderView(view) + } + + @Suppress("UNCHECKED_CAST") + fun addHeaderView(@LayoutRes id: Int): V { + val headerView: View = LayoutInflater.from(context).inflate(id, this, false) + addHeaderView(headerView) + return headerView as V + } + + fun removeHeaderView(view: View) { + wrapAdapter.removeHeaderView(view) + } + + fun addFooterView(view: View) { + wrapAdapter.addFooterView(view) + } + + @Suppress("UNCHECKED_CAST") + fun addFooterView(@LayoutRes id: Int): V { + val footerView: View = LayoutInflater.from(context).inflate(id, this, false) + addFooterView(footerView) + return footerView as V + } + + fun removeFooterView(view: View) { + wrapAdapter.removeFooterView(view) + } + + fun getHeaderViewsCount(): Int { + return wrapAdapter.getHeaderViewsCount() + } + + fun getFooterViewsCount(): Int { + return wrapAdapter.getFooterViewsCount() + } + + fun getHeaderViews(): MutableList { + return wrapAdapter.getHeaderViews() + } + + fun getFooterViews(): MutableList { + return wrapAdapter.getFooterViews() + } + + fun refreshHeaderFooterViews() { + wrapAdapter.notifyDataSetChanged() + } + + fun adjustSpanSize() { + val layoutManager: LayoutManager? = layoutManager + if (layoutManager !is GridLayoutManager) { + return + } + + layoutManager.spanSizeLookup = object : SpanSizeLookup() { + + override fun getSpanSize(position: Int): Int { + return if (((position < wrapAdapter.getHeaderViewsCount() + || position >= wrapAdapter.getHeaderViewsCount() + (if (realAdapter == null) 0 else realAdapter!!.itemCount))) + ) layoutManager.spanCount else 1 + } + } + } + + private class WrapRecyclerAdapter : Adapter() { + + companion object { + + private const val HEADER_VIEW_TYPE: Int = Int.MIN_VALUE shr 1 + + private const val FOOTER_VIEW_TYPE: Int = Int.MAX_VALUE shr 1 + } + + private var realAdapter: Adapter? = null + + private val headerViews: MutableList = ArrayList() + + private val footerViews: MutableList = ArrayList() + + private var currentPosition: Int = 0 + + private var recyclerView: RecyclerView? = null + + private var observer: WrapAdapterDataObserver? = null + + @Suppress("UNCHECKED_CAST") + fun setRealAdapter(adapter: Adapter?) { + if (realAdapter === adapter) { + return + } + if (realAdapter != null) { + if (observer != null) { + realAdapter!!.unregisterAdapterDataObserver(observer!!) + } + } + realAdapter = adapter as Adapter? + if (realAdapter == null) { + return + } + if (observer == null) { + observer = WrapAdapterDataObserver(this) + } + realAdapter?.registerAdapterDataObserver(observer!!) + if (recyclerView != null) { + notifyDataSetChanged() + } + } + + override fun getItemCount(): Int { + var itemCount = 0 + if (realAdapter != null) { + itemCount = realAdapter!!.itemCount + } + return getHeaderViewsCount() + itemCount + getFooterViewsCount() + } + + override fun getItemViewType(position: Int): Int { + currentPosition = position + val headerCount: Int = getHeaderViewsCount() + val adapterCount: Int = if (realAdapter != null) realAdapter!!.itemCount else 0 + val adjPosition: Int = position - headerCount + if (position < headerCount) { + return HEADER_VIEW_TYPE + } else if (adjPosition < adapterCount) { + return realAdapter!!.getItemViewType(adjPosition) + } + return FOOTER_VIEW_TYPE + } + + fun getPosition(): Int { + return currentPosition + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return when (viewType) { + HEADER_VIEW_TYPE -> newWrapViewHolder(headerViews[getPosition()]!!) + FOOTER_VIEW_TYPE -> newWrapViewHolder(footerViews[getPosition() - getHeaderViewsCount() - (if (realAdapter != null) realAdapter!!.itemCount else 0)]!!) + else -> { + val itemViewType: Int = realAdapter!!.getItemViewType(getPosition() - getHeaderViewsCount()) + if (itemViewType == HEADER_VIEW_TYPE || itemViewType == FOOTER_VIEW_TYPE) { + throw IllegalStateException("Please do not use this type as itemType") + } + realAdapter!!.onCreateViewHolder(parent, itemViewType) + } + } + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + if (realAdapter == null) { + return + } + when (getItemViewType(position)) { + HEADER_VIEW_TYPE, FOOTER_VIEW_TYPE -> {} + else -> realAdapter!!.onBindViewHolder(holder, getPosition() - getHeaderViewsCount()) + } + } + + private fun newWrapViewHolder(view: View): WrapViewHolder { + val parent: ViewParent? = view.parent + if (parent is ViewGroup) { + // IllegalStateException: ViewHolder views must not be attached when created. + // Ensure that you are not passing 'true' to the attachToRoot parameter of LayoutInflater.inflate(..., boolean attachToRoot) + parent.removeView(view) + } + return WrapViewHolder(view) + } + + override fun getItemId(position: Int): Long { + if ((realAdapter != null) && (position > getHeaderViewsCount() - 1) && (position < getHeaderViewsCount() + realAdapter!!.itemCount)) { + return realAdapter!!.getItemId(position - getHeaderViewsCount()) + } + return super.getItemId(position) + } + + override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { + this.recyclerView = recyclerView + realAdapter?.onAttachedToRecyclerView(recyclerView) + } + + override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) { + this.recyclerView = null + realAdapter?.onDetachedFromRecyclerView(recyclerView) + } + + override fun onViewRecycled(holder: ViewHolder) { + if (holder is WrapViewHolder) { + holder.setIsRecyclable(false) + return + } + realAdapter?.onViewRecycled(holder) + } + + override fun onFailedToRecycleView(holder: ViewHolder): Boolean { + if (realAdapter == null) { + return super.onFailedToRecycleView(holder) + } + return realAdapter!!.onFailedToRecycleView(holder) + } + + override fun onViewAttachedToWindow(holder: ViewHolder) { + if (realAdapter == null) { + return + } + realAdapter!!.onViewAttachedToWindow(holder) + } + + override fun onViewDetachedFromWindow(holder: ViewHolder) { + realAdapter?.onViewDetachedFromWindow(holder) + } + fun addHeaderView(view: View) { + if (!headerViews.contains(view) && !footerViews.contains(view)) { + headerViews.add(view) + notifyDataSetChanged() + } + } + + fun removeHeaderView(view: View) { + if (headerViews.remove(view)) { + notifyDataSetChanged() + } + } + + fun addFooterView(view: View) { + // 不能添加同一个View对象,否则会导致RecyclerView复用异常 + if (!footerViews.contains(view) && !headerViews.contains(view)) { + footerViews.add(view) + notifyDataSetChanged() + } + } + + fun removeFooterView(view: View) { + if (footerViews.remove(view)) { + notifyDataSetChanged() + } + } + + fun getHeaderViewsCount(): Int { + return headerViews.size + } + + fun getFooterViewsCount(): Int { + return footerViews.size + } + + fun getHeaderViews(): MutableList { + return headerViews + } + fun getFooterViews(): MutableList { + return footerViews + } + } + + private class WrapViewHolder constructor(itemView: View) : ViewHolder(itemView) + + private class WrapAdapterDataObserver constructor(private val wrapAdapter: WrapRecyclerAdapter) : AdapterDataObserver() { + + override fun onChanged() { + wrapAdapter.notifyDataSetChanged() + } + + override fun onItemRangeChanged(positionStart: Int, itemCount: Int, payload: Any?) { + wrapAdapter.notifyItemRangeChanged(wrapAdapter.getHeaderViewsCount() + positionStart, itemCount, payload) + } + + override fun onItemRangeChanged(positionStart: Int, itemCount: Int) { + wrapAdapter.notifyItemRangeChanged(wrapAdapter.getHeaderViewsCount() + positionStart, itemCount) + } + + override fun onItemRangeInserted(positionStart: Int, itemCount: Int) { + wrapAdapter.notifyItemRangeInserted(wrapAdapter.getHeaderViewsCount() + positionStart, itemCount) + } + + override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) { + wrapAdapter.notifyItemRangeRemoved(wrapAdapter.getHeaderViewsCount() + positionStart, itemCount) + } + + override fun onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int) { + wrapAdapter.notifyItemMoved(wrapAdapter.getHeaderViewsCount() + fromPosition, wrapAdapter.getHeaderViewsCount() + toPosition) + } + } +} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/ClearEditText.kt b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/ClearEditText.kt new file mode 100644 index 0000000..4232e5d --- /dev/null +++ b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/ClearEditText.kt @@ -0,0 +1,96 @@ +package com.hjq.widget.view + +import android.content.Context +import android.graphics.drawable.Drawable +import android.text.Editable +import android.text.TextUtils +import android.text.TextWatcher +import android.util.AttributeSet +import android.view.MotionEvent +import android.view.View +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 + +@Suppress("ClickableViewAccessibility") +class ClearEditText @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, + defStyleAttr: Int = android.R.attr.editTextStyle) : + RegexEditText(context, attrs, defStyleAttr), + OnTouchListener, OnFocusChangeListener, TextWatcher { + + private val clearDrawable: Drawable = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.input_delete_ic)!!) + private var touchListener: OnTouchListener? = null + private var focusChangeListener: OnFocusChangeListener? = null + + init { + clearDrawable.setBounds(0, 0, clearDrawable.intrinsicWidth, clearDrawable.intrinsicHeight) + setDrawableVisible(false) + super.setOnTouchListener(this) + super.setOnFocusChangeListener(this) + super.addTextChangedListener(this) + } + + private fun setDrawableVisible(visible: Boolean) { + if (clearDrawable.isVisible == visible) { + return + } + clearDrawable.setVisible(visible, false) + val drawables: Array = compoundDrawablesRelative + setCompoundDrawablesRelative(drawables[0], drawables[1], + if (visible) clearDrawable else null, drawables[3]) + } + + override fun setOnFocusChangeListener(onFocusChangeListener: OnFocusChangeListener?) { + focusChangeListener = onFocusChangeListener + } + + override fun setOnTouchListener(onTouchListener: OnTouchListener?) { + touchListener = onTouchListener + } + + /** + * [OnFocusChangeListener] + */ + override fun onFocusChange(view: View, hasFocus: Boolean) { + setDrawableVisible(hasFocus && !TextUtils.isEmpty(text)) + focusChangeListener?.onFocusChange(view, hasFocus) + } + + /** + * [OnTouchListener] + */ + override fun onTouch(view: View, event: MotionEvent): Boolean { + val x: Int = event.x.toInt() + + var touchDrawable = false + val layoutDirection: Int = layoutDirection + if (layoutDirection == LAYOUT_DIRECTION_LTR) { + touchDrawable = x > width - clearDrawable.intrinsicWidth - paddingEnd && x < width - paddingEnd + } else if (layoutDirection == LAYOUT_DIRECTION_RTL) { + touchDrawable = x > paddingStart && x < paddingStart + clearDrawable.intrinsicWidth + } + if (clearDrawable.isVisible && touchDrawable) { + if (event.action == MotionEvent.ACTION_UP) { + setText("") + } + return true + } + return touchListener?.onTouch(view, event) ?: false + } + + /** + * [TextWatcher] + */ + override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { + if (isFocused) { + setDrawableVisible(s.isNotEmpty()) + } + } + + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + + override fun afterTextChanged(s: Editable?) {} +} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/CountdownView.kt b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/CountdownView.kt new file mode 100644 index 0000000..75cdcd7 --- /dev/null +++ b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/CountdownView.kt @@ -0,0 +1,54 @@ +package com.hjq.widget.view + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatTextView + +class CountdownView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : + AppCompatTextView(context, attrs, defStyleAttr), Runnable { + + companion object { + + private const val TIME_UNIT: String = "S" + } + + private var totalSecond: Int = 60 + + private var currentSecond: Int = 0 + + private var recordText: CharSequence? = null + + fun setTotalTime(totalTime: Int) { + totalSecond = totalTime + } + + fun start() { + recordText = text + isEnabled = false + currentSecond = totalSecond + post(this) + } + + fun stop() { + currentSecond = 0 + text = recordText + isEnabled = true + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + removeCallbacks(this) + } + + @Suppress("SetTextI18n") + override fun run() { + if (currentSecond == 0) { + stop() + return + } + currentSecond-- + text = "$currentSecond $TIME_UNIT" + postDelayed(this, 1000) + } +} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PasswordEditText.kt b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PasswordEditText.kt new file mode 100644 index 0000000..e13a5ac --- /dev/null +++ b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PasswordEditText.kt @@ -0,0 +1,126 @@ +package com.hjq.widget.view + +import android.content.Context +import android.graphics.drawable.Drawable +import android.text.Editable +import android.text.InputType +import android.text.TextUtils +import android.text.TextWatcher +import android.text.method.HideReturnsTransformationMethod +import android.text.method.PasswordTransformationMethod +import android.util.AttributeSet +import android.view.MotionEvent +import android.view.View +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 + +@Suppress("ClickableViewAccessibility") +class PasswordEditText @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, + defStyleAttr: Int = android.R.attr.editTextStyle) : + RegexEditText(context, attrs, defStyleAttr), + OnTouchListener, OnFocusChangeListener, TextWatcher { + + private var currentDrawable: Drawable + private val visibleDrawable: Drawable = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.password_off_ic)!!) + private val invisibleDrawable: Drawable + private var touchListener: OnTouchListener? = null + private var focusChangeListener: OnFocusChangeListener? = null + + init { + visibleDrawable.setBounds(0, 0, visibleDrawable.intrinsicWidth, visibleDrawable.intrinsicHeight) + invisibleDrawable = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.password_on_ic)!!) + invisibleDrawable.setBounds(0, 0, invisibleDrawable.intrinsicWidth, invisibleDrawable.intrinsicHeight) + currentDrawable = visibleDrawable + + addInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD) + if (getInputRegex() == null) { + setInputRegex(REGEX_NONNULL) + } + setDrawableVisible(false) + super.setOnTouchListener(this) + super.setOnFocusChangeListener(this) + super.addTextChangedListener(this) + } + + private fun setDrawableVisible(visible: Boolean) { + if (currentDrawable.isVisible == visible) { + return + } + currentDrawable.setVisible(visible, false) + val drawables: Array = compoundDrawablesRelative + setCompoundDrawablesRelative(drawables[0], drawables[1], if (visible) currentDrawable else null, drawables[3]) + } + + private fun refreshDrawableStatus() { + val drawables: Array = compoundDrawablesRelative + setCompoundDrawablesRelative(drawables[0], drawables[1], currentDrawable, drawables[3]) + } + + override fun setOnFocusChangeListener(onFocusChangeListener: OnFocusChangeListener?) { + focusChangeListener = onFocusChangeListener + } + + override fun setOnTouchListener(onTouchListener: OnTouchListener?) { + touchListener = onTouchListener + } + + /** + * [OnFocusChangeListener] + */ + override fun onFocusChange(view: View?, hasFocus: Boolean) { + setDrawableVisible(hasFocus && !TextUtils.isEmpty(text)) + focusChangeListener?.onFocusChange(view, hasFocus) + } + + /** + * [OnTouchListener] + */ + override fun onTouch(view: View, event: MotionEvent): Boolean { + val x: Int = event.x.toInt() + + var touchDrawable = false + val layoutDirection: Int = layoutDirection + if (layoutDirection == LAYOUT_DIRECTION_LTR) { + touchDrawable = x > width - currentDrawable.intrinsicWidth - paddingEnd && x < width - paddingEnd + } else if (layoutDirection == LAYOUT_DIRECTION_RTL) { + touchDrawable = x > paddingStart && + x < paddingStart + currentDrawable.intrinsicWidth + } + if (currentDrawable.isVisible && touchDrawable) { + if (event.action == MotionEvent.ACTION_UP) { + if (currentDrawable === visibleDrawable) { + currentDrawable = invisibleDrawable + transformationMethod = HideReturnsTransformationMethod.getInstance() + refreshDrawableStatus() + } else if (currentDrawable === invisibleDrawable) { + currentDrawable = visibleDrawable + transformationMethod = PasswordTransformationMethod.getInstance() + refreshDrawableStatus() + } + val editable: Editable? = text + if (editable != null) { + setSelection(editable.toString().length) + } + } + return true + } + return touchListener != null && touchListener!!.onTouch(view, event) + } + + /** + * [TextWatcher] + */ + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + if (isFocused && s != null) { + setDrawableVisible(s.isNotEmpty()) + } + } + + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + + override fun afterTextChanged(s: Editable?) {} +} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PlayButton.kt b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PlayButton.kt new file mode 100644 index 0000000..c11f879 --- /dev/null +++ b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PlayButton.kt @@ -0,0 +1,197 @@ +package com.hjq.widget.view + +import android.animation.ValueAnimator +import android.content.* +import android.content.res.TypedArray +import android.graphics.* +import android.util.AttributeSet +import android.view.* +import android.view.animation.AnticipateInterpolator +import com.hjq.widget.R + +class PlayButton @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : + View(context, attrs, defStyleAttr) { + + companion object { + + const val STATE_PLAY: Int = 0 + + const val STATE_PAUSE: Int = 1 + } + + private var currentState: Int = STATE_PAUSE + + private var animDuration: Int + + private val paint: Paint + private var viewWidth: Int = 0 + private var viewHeight: Int = 0 + private var centerX: Int = 0 + private var centerY: Int = 0 + private var circleRadius: Int = 0 + private var rectF: RectF? = null + private var bgRectF: RectF? = null + private var fraction: Float = 1f + private val path: Path + private val dstPath: Path + private val pathMeasure: PathMeasure + private var pathLength: Float = 0f + + init { + val typedArray: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.PlayButton) + val lineColor: Int = typedArray.getColor(R.styleable.PlayButton_pb_lineColor, Color.WHITE) + val lineSize: Int = typedArray.getInteger( + R.styleable.PlayButton_pb_lineSize, + resources.getDimension(R.dimen.dp_4).toInt() + ) + animDuration = typedArray.getInteger(R.styleable.PlayButton_pb_animDuration, 200) + typedArray.recycle() + + // 关闭硬件加速 + setLayerType(LAYER_TYPE_SOFTWARE, null) + paint = Paint(Paint.ANTI_ALIAS_FLAG) + paint.style = Paint.Style.STROKE + paint.strokeCap = Paint.Cap.ROUND + paint.color = lineColor + paint.strokeWidth = lineSize.toFloat() + paint.pathEffect = CornerPathEffect(1f) + path = Path() + dstPath = Path() + pathMeasure = PathMeasure() + } + + override fun onSizeChanged(width: Int, height: Int, oldWidth: Int, oldHeight: Int) { + super.onSizeChanged(width, height, oldWidth, oldHeight) + viewWidth = width * 9 / 10 + viewHeight = height * 9 / 10 + circleRadius = width / resources.getDimension(R.dimen.dp_4).toInt() + centerX = width / 2 + centerY = height / 2 + rectF = RectF( + (centerX - circleRadius).toFloat(), centerY + 0.6f * circleRadius, + (centerX + circleRadius).toFloat(), centerY + 2.6f * circleRadius + ) + bgRectF = RectF( + centerX - viewWidth / 2f, centerY - viewHeight / 2f, + centerX + viewWidth / 2f, centerY + viewHeight / 2f + ) + path.moveTo((centerX - circleRadius).toFloat(), centerY + 1.8f * circleRadius) + path.lineTo((centerX - circleRadius).toFloat(), centerY - 1.8f * circleRadius) + path.lineTo((centerX + circleRadius).toFloat(), centerY.toFloat()) + path.close() + pathMeasure.setPath(path, false) + pathLength = pathMeasure.length + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + var finalWidthMeasureSpec: Int = widthMeasureSpec + var finalHeightMeasureSpec: Int = heightMeasureSpec + when (MeasureSpec.getMode(finalWidthMeasureSpec)) { + MeasureSpec.AT_MOST, MeasureSpec.UNSPECIFIED -> + finalWidthMeasureSpec = MeasureSpec.makeMeasureSpec(resources.getDimension(R.dimen.dp_60).toInt(), MeasureSpec.EXACTLY) + MeasureSpec.EXACTLY -> {} + } + when (MeasureSpec.getMode(finalHeightMeasureSpec)) { + MeasureSpec.AT_MOST, MeasureSpec.UNSPECIFIED -> + finalHeightMeasureSpec = MeasureSpec.makeMeasureSpec(resources.getDimension(R.dimen.dp_60).toInt(), MeasureSpec.EXACTLY) + MeasureSpec.EXACTLY -> {} + } + setMeasuredDimension(finalWidthMeasureSpec, finalHeightMeasureSpec) + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + canvas.drawCircle(centerX.toFloat(), centerY.toFloat(), viewWidth / 2f, paint) + when { + fraction < 0 -> { + canvas.drawLine((centerX + circleRadius).toFloat(), + centerY - 1.6f * circleRadius + 10 * circleRadius * fraction, (centerX + circleRadius).toFloat(), + centerY + (1.6f * circleRadius) + (10 * circleRadius * fraction), paint) + canvas.drawLine((centerX - circleRadius).toFloat(), centerY - 1.6f * circleRadius, ( + centerX - circleRadius).toFloat(), centerY + 1.6f * circleRadius, paint) + canvas.drawArc(bgRectF!!, -105f, 360f, false, paint) + } + fraction <= 0.3 -> { + canvas.drawLine((centerX + circleRadius).toFloat(), + centerY - 1.6f * circleRadius + circleRadius * 3.2f / 0.3f * fraction, (centerX + circleRadius).toFloat(), + centerY + 1.6f * circleRadius, paint) + canvas.drawLine((centerX - circleRadius).toFloat(), centerY - 1.6f * circleRadius, ( + centerX - circleRadius).toFloat(), centerY + 1.6f * circleRadius, paint) + if (fraction != 0f) { + canvas.drawArc(rectF!!, 0f, 180f / 0.3f * fraction, false, paint) + } + canvas.drawArc(bgRectF!!, -105 + 360 * fraction, 360 * (1 - fraction), false, paint) + } + fraction <= 0.6 -> { + canvas.drawArc(rectF!!, 180f / 0.3f * (fraction - 0.3f), + 180 - 180f / 0.3f * (fraction - 0.3f), false, paint) + dstPath.reset() + pathMeasure.getSegment(0.02f * pathLength, + 0.38f * pathLength + 0.42f * pathLength / 0.3f * (fraction - 0.3f), + dstPath, true) + canvas.drawPath(dstPath, paint) + canvas.drawArc(bgRectF!!, -105 + 360 * fraction, 360 * (1 - fraction), false, paint) + } + fraction <= 0.8 -> { + dstPath.reset() + pathMeasure.getSegment(0.02f * pathLength + 0.2f * pathLength / 0.2f * (fraction - 0.6f), + 0.8f * pathLength + 0.2f * pathLength / 0.2f * (fraction - 0.6f), dstPath, true) + canvas.drawPath(dstPath, paint) + canvas.drawArc(bgRectF!!, -105 + 360 * fraction, 360 * (1 - fraction), false, paint) + } + else -> { + dstPath.reset() + pathMeasure.getSegment(10 * circleRadius * (fraction - 1), pathLength, dstPath, true) + canvas.drawPath(dstPath, paint) + } + } + } + + fun play() { + if (currentState == STATE_PLAY) { + return + } + currentState = STATE_PLAY + val valueAnimator: ValueAnimator = ValueAnimator.ofFloat(1f, 100f) + valueAnimator.duration = animDuration.toLong() + valueAnimator.interpolator = AnticipateInterpolator() + valueAnimator.addUpdateListener { animation: ValueAnimator -> + fraction = 1 - animation.animatedFraction + invalidate() + } + valueAnimator.start() + } + + fun pause() { + if (currentState == STATE_PAUSE) { + return + } + currentState = STATE_PAUSE + val valueAnimator: ValueAnimator = ValueAnimator.ofFloat(1f, 100f) + valueAnimator.duration = animDuration.toLong() + valueAnimator.interpolator = AnticipateInterpolator() + valueAnimator.addUpdateListener { animation: ValueAnimator -> + fraction = animation.animatedFraction + invalidate() + } + valueAnimator.start() + } + fun getCurrentState(): Int { + return currentState + } + + fun setAnimDuration(duration: Int) { + animDuration = duration + } + + fun setLineColor(color: Int) { + paint.color = color + invalidate() + } + + fun setLineSize(size: Int) { + paint.strokeWidth = size.toFloat() + invalidate() + } +} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PressAlphaTextView.kt b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PressAlphaTextView.kt new file mode 100644 index 0000000..c237404 --- /dev/null +++ b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/PressAlphaTextView.kt @@ -0,0 +1,15 @@ +package com.hjq.widget.view + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatTextView + +class PressAlphaTextView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : + AppCompatTextView(context, attrs, defStyleAttr) { + + override fun dispatchSetPressed(pressed: Boolean) { + // 判断当前手指是否按下了 + alpha = if (pressed) 0.5f else 1f + } +} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/RegexEditText.kt b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/RegexEditText.kt new file mode 100644 index 0000000..f3d9a78 --- /dev/null +++ b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/RegexEditText.kt @@ -0,0 +1,130 @@ +package com.hjq.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 java.util.regex.Pattern + +open class RegexEditText @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, + defStyleAttr: Int = android.R.attr.editTextStyle +) : AppCompatEditText(context, attrs, defStyleAttr), InputFilter { + + companion object { + + const val REGEX_MOBILE: String = "[1]\\d{0,10}" + + const val REGEX_CHINESE: String = "[\\u4e00-\\u9fa5]*" + + const val REGEX_ENGLISH: String = "[a-zA-Z]*" + + const val REGEX_NUMBER: String = "\\d*" + + const val REGEX_COUNT: String = "[1-9]\\d*" + + const val REGEX_NAME: String = "[[\\u4e00-\\u9fa5]|[a-zA-Z]|\\d]*" + + const val REGEX_NONNULL: String = "\\S+" + } + + private var pattern: Pattern? = null + + init { + val array: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.RegexEditText) + if (array.hasValue(R.styleable.RegexEditText_inputRegex)) { + setInputRegex(array.getString(R.styleable.RegexEditText_inputRegex)) + } else if (array.hasValue(R.styleable.RegexEditText_regexType)) { + when (array.getInt(R.styleable.RegexEditText_regexType, 0)) { + 0x01 -> setInputRegex(REGEX_MOBILE) + 0x02 -> setInputRegex(REGEX_CHINESE) + 0x03 -> setInputRegex(REGEX_ENGLISH) + 0x04 -> setInputRegex(REGEX_NUMBER) + 0x05 -> setInputRegex(REGEX_COUNT) + 0x06 -> setInputRegex(REGEX_NAME) + 0x07 -> setInputRegex(REGEX_NONNULL) + } + } + array.recycle() + } + + fun hasInputType(type: Int): Boolean { + return (inputType and type) != 0 + } + + fun addInputType(type: Int) { + inputType = inputType or type + } + + fun removeInputType(type: Int) { + inputType = inputType and type.inv() + } + + fun setInputRegex(regex: String?) { + if (TextUtils.isEmpty(regex)) { + return + } + pattern = Pattern.compile(regex!!) + addFilters(this) + } + + fun getInputRegex(): String? { + if (pattern == null) { + return null + } + return pattern!!.pattern() + } + + fun addFilters(filter: InputFilter?) { + if (filter == null) { + return + } + val newFilters: Array? + val oldFilters: Array? = filters + if (oldFilters != null && oldFilters.isNotEmpty()) { + newFilters = arrayOfNulls(oldFilters.size + 1) + // 复制旧数组的元素到新数组中 + System.arraycopy(oldFilters, 0, newFilters, 0, oldFilters.size) + newFilters[oldFilters.size] = filter + } else { + newFilters = arrayOfNulls(1) + newFilters[0] = filter + } + super.setFilters(newFilters) + } + + fun clearFilters() { + super.setFilters(arrayOfNulls(0)) + } + + override fun filter(source: CharSequence?, start: Int, end: Int, + dest: Spanned?, destStart: Int, destEnd: Int): CharSequence? { + + if (pattern == null) { + return source + } + + val begin: String = dest.toString().substring(0, destStart) + val over: String = dest.toString().substring( + destStart + (destEnd - destStart), + destStart + (dest.toString().length - begin.length) + ) + val result: String = begin + source + over + + if (destStart > destEnd - 1) { + if (!pattern!!.matcher(result).matches()) { + return "" + } + } else { + if (!pattern!!.matcher(result).matches()) { + if ("" != result) { + return dest.toString().substring(destStart, destEnd) + } + } + } + + return source + } +} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/ScaleImageView.kt b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/ScaleImageView.kt new file mode 100644 index 0000000..ceced7b --- /dev/null +++ b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/ScaleImageView.kt @@ -0,0 +1,34 @@ +package com.hjq.widget.view + +import android.content.* +import android.content.res.TypedArray +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatImageView +import com.hjq.widget.R + +class ScaleImageView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : + AppCompatImageView(context, attrs, defStyleAttr) { + + private var scaleSize: Float = 1.2f + + init { + val array: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.ScaleImageView) + setScaleSize(array.getFloat(R.styleable.ScaleImageView_scaleRatio, scaleSize)) + array.recycle() + } + + override fun dispatchSetPressed(pressed: Boolean) { + if (pressed) { + scaleX = scaleSize + scaleY = scaleSize + } else { + scaleX = 1f + scaleY = 1f + } + } + + fun setScaleSize(size: Float) { + scaleSize = size + } +} \ 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 new file mode 100644 index 0000000..1c934af --- /dev/null +++ b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/SlantedTextView.kt @@ -0,0 +1,308 @@ +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/java/com/hjq/widget/view/SmartTextView.kt b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/SmartTextView.kt new file mode 100644 index 0000000..a0a4083 --- /dev/null +++ b/Android_Mireo/library/widget/src/main/java/com/hjq/widget/view/SmartTextView.kt @@ -0,0 +1,61 @@ +package com.hjq.widget.view + +import android.content.* +import android.graphics.drawable.Drawable +import android.text.TextUtils +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatTextView + +class SmartTextView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, + defStyleAttr: Int = android.R.attr.textViewStyle) : + AppCompatTextView(context, attrs, defStyleAttr) { + + init { + refreshVisibilityStatus() + } + + override fun setText(text: CharSequence?, type: BufferType?) { + super.setText(text, type) + refreshVisibilityStatus() + } + + override fun setCompoundDrawables(left: Drawable?, top: Drawable?, right: Drawable?, bottom: Drawable?) { + super.setCompoundDrawables(left, top, right, bottom) + refreshVisibilityStatus() + } + + override fun setCompoundDrawablesRelative(start: Drawable?, top: Drawable?, end: Drawable?, bottom: Drawable?) { + super.setCompoundDrawablesRelative(start, top, end, bottom) + refreshVisibilityStatus() + } + + private fun refreshVisibilityStatus() { + if (isEmptyContent() && visibility != GONE) { + visibility = GONE + return + } + if (visibility != VISIBLE) { + visibility = VISIBLE + } + } + + private fun isEmptyContent(): Boolean { + if (!TextUtils.isEmpty(text)) { + return false + } + val compoundDrawables: Array = compoundDrawables + val compoundDrawablesRelative: Array = compoundDrawablesRelative + for (drawable: Drawable? in compoundDrawables) { + if (drawable != null) { + return false + } + } + for (drawable: Drawable? in compoundDrawablesRelative) { + if (drawable != null) { + return false + } + } + return true + } +} \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/res/drawable/input_delete_ic.xml b/Android_Mireo/library/widget/src/main/res/drawable/input_delete_ic.xml new file mode 100644 index 0000000..58bebec --- /dev/null +++ b/Android_Mireo/library/widget/src/main/res/drawable/input_delete_ic.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/res/drawable/password_off_ic.xml b/Android_Mireo/library/widget/src/main/res/drawable/password_off_ic.xml new file mode 100644 index 0000000..79e0e79 --- /dev/null +++ b/Android_Mireo/library/widget/src/main/res/drawable/password_off_ic.xml @@ -0,0 +1,32 @@ + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/res/drawable/password_on_ic.xml b/Android_Mireo/library/widget/src/main/res/drawable/password_on_ic.xml new file mode 100644 index 0000000..2e31b57 --- /dev/null +++ b/Android_Mireo/library/widget/src/main/res/drawable/password_on_ic.xml @@ -0,0 +1,25 @@ + + + + + + \ 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/library/widget/src/main/res/drawable/rating_star_fill_ic.xml new file mode 100644 index 0000000..dc397cc --- /dev/null +++ b/Android_Mireo/library/widget/src/main/res/drawable/rating_star_fill_ic.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/res/drawable/rating_star_half_ic.xml b/Android_Mireo/library/widget/src/main/res/drawable/rating_star_half_ic.xml new file mode 100644 index 0000000..cc9e1ff --- /dev/null +++ b/Android_Mireo/library/widget/src/main/res/drawable/rating_star_half_ic.xml @@ -0,0 +1,66 @@ + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/library/widget/src/main/res/drawable/rating_star_off_ic.xml b/Android_Mireo/library/widget/src/main/res/drawable/rating_star_off_ic.xml new file mode 100644 index 0000000..09e1fad --- /dev/null +++ b/Android_Mireo/library/widget/src/main/res/drawable/rating_star_off_ic.xml @@ -0,0 +1,20 @@ + + + + + \ 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 new file mode 100644 index 0000000..7286715 --- /dev/null +++ b/Android_Mireo/library/widget/src/main/res/values/attrs.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android_Mireo/local.properties b/Android_Mireo/local.properties new file mode 100644 index 0000000..1314146 --- /dev/null +++ b/Android_Mireo/local.properties @@ -0,0 +1,8 @@ +## This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +#Wed Apr 09 08:46:46 CST 2025 +sdk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk diff --git a/Android_Mireo/maven.gradle b/Android_Mireo/maven.gradle new file mode 100644 index 0000000..e693108 --- /dev/null +++ b/Android_Mireo/maven.gradle @@ -0,0 +1,11 @@ +static def addCommonMaven(RepositoryHandler handler) { + handler.maven { url 'https://maven.aliyun.com/repository/public' } + handler.maven { url 'https://maven.aliyun.com/repository/google' } + handler.maven { url 'https://repo.huaweicloud.com/repository/maven' } + handler.maven { url 'https://jitpack.io' } + handler.mavenCentral() + handler.google() + handler.jcenter() +} + +ext.addCommonMaven = this.&addCommonMaven \ No newline at end of file diff --git a/Android_Mireo/settings.gradle b/Android_Mireo/settings.gradle new file mode 100644 index 0000000..09ee302 --- /dev/null +++ b/Android_Mireo/settings.gradle @@ -0,0 +1,3 @@ +include ':app' +include ':library:base' +include ':library:widget' diff --git a/GiftAgainNew/.idea/.gitignore b/GiftAgainNew/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/GiftAgainNew/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/GiftAgainNew/.idea/GiftAgainNew.iml b/GiftAgainNew/.idea/GiftAgainNew.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/GiftAgainNew/.idea/GiftAgainNew.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/GiftAgainNew/.idea/misc.xml b/GiftAgainNew/.idea/misc.xml new file mode 100644 index 0000000..63c7c6e --- /dev/null +++ b/GiftAgainNew/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/GiftAgainNew/.idea/modules.xml b/GiftAgainNew/.idea/modules.xml new file mode 100644 index 0000000..1ecb9f7 --- /dev/null +++ b/GiftAgainNew/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/GiftAgainNew/.idea/vcs.xml b/GiftAgainNew/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/GiftAgainNew/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file