diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a0740cf999..063581b94f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,12 +1,57 @@ stages: - - analysis - - sendmail + - android-build && analysis + - docker-build && sendmail + - deploy-trigger -## 代码检查 +android_build: + tags: + - offline-test + stage: android-build && analysis + image: hub.shanqu.cc/devops/ci-android:jdk11 + variables: + KUBERNETES_CPU_LIMIT: "16" + GIT_SUBMODULE_STRATEGY: recursive + Apk_Path: "app/build/outputs/apk/**/release/*.apk" + script: + - export GRADLE_USER_HOME=./.gradle + - chmod +x ./gradlew + - ./scripts/meta_build.sh --config_id 6400549c21c2c94ead074500 --sdk_platform toutiao --sdk_version 5.3.0 --channel BD-GHZS-ZP-KY --activate_reporting_ratio 60 --first_lanuch_jump e1wibGlua190eXBlXCI6XCJcIixcImxpbmtfaWRcIjpcIlwiLFwibGlua190ZXh0XCI6XCJcIixcImhvbWVfaW5kZXhcIjpcIlwiLFwiYm90dG9tX2luZGV4XCI6XCJcIn0= --unix_timestamp 1677657618 --output ./release/com.gh.gamecenter_5.17.4_694_BD-GHZS-ZP-KY_toutiao_5.3.0_1677657618.apk + - rm -rf ./.gradle/caches/build-cache-1 + cache: + paths: + - .gradle + artifacts: + paths: + - Dockerfile + expire_in: 15 mins + only: + - feature-meta_build + +# 构建推送docker镜像 +docker-build: + tags: + - offline-test + stage: docker-build && sendmail + image: hub.shanqu.cc/library/docker:latest + variables: + GIT_STRATEGY: none + script: + - projectPath=`echo $CI_PROJECT_PATH | sed 's#/#-#g'` + - docker build -t registry.cn-shenzhen.aliyuncs.com/ghzs/$projectPath:latest . + - docker push registry.cn-shenzhen.aliyuncs.com/ghzs/$projectPath:latest + - docker run -e PROJECTKEY=$projectPath -e EMAIL=$GITLAB_USER_EMAIL -e BRANCH=$CI_COMMIT_REF_NAME --name send-email --rm hub.shanqu.cc/platform/send-sonar-report:latest + cache: + paths: + - .gradle + policy: pull + only: + - feature-meta_build + +# 代码检查 sonarqube_analysis: tags: - offline-test - stage: analysis + stage: android-build && analysis image: sonarsource/sonar-scanner-cli:latest dependencies: [] #禁止传递来的artifact script: @@ -27,17 +72,12 @@ sonarqube_analysis: -Dsonar.gitlab.merge_request_discussion=true -Dsonar.java.binaries=. # 如果不使用Maven或Gradle进行分析,则必须手动提供测试二进制文件 only: - - dev - -## 发送简易检测结果报告 -send_sonar_report: - tags: - - offline-test - stage: sendmail - image: hub.shanqu.cc/library/docker:latest - dependencies: [] #禁止传递来的artifact - script: - - group=`echo $CI_PROJECT_PATH | sed 's#/#-#g'` - - docker run -e PROJECTKEY=$group -e EMAIL=$GITLAB_USER_EMAIL --name send-email --rm hub.shanqu.cc/platform/send-sonar-report:latest - only: - - dev + - feature-meta_build + +## 触发多项目构建 +trigger_job: + stage: deploy-trigger + trigger: + project: devops/automation/build-eci + branch: dev + diff --git a/.gitmodules b/.gitmodules index b5e90c44ba..7cbef87053 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,13 +1,13 @@ [submodule "libraries/LGLibrary"] path = libraries/LGLibrary - url = git@git.shanqu.cc:android/common-library.git + url = ../../../android/common-library.git branch = master [submodule "vspace-bridge"] path = vspace-bridge - url = git@git.shanqu.cc:cwzs/android/vspace-bridge.git + url = ../../../cwzs/android/vspace-bridge.git [submodule "module_common/src/debug/assets/assistant-android-mock"] path = module_common/src/debug/assets/assistant-android-mock - url = git@git.shanqu.cc:halo/android/assistant-android-mock.git + url = ../../../halo/android/assistant-android-mock.git [submodule "ndownload"] path = ndownload - url = git@git.shanqu.cc:android/ndownload.git + url = ../../../android/ndownload.git diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..ab194bd3e4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,15 @@ +FROM openjdk:11-jdk +WORKDIR /project +SHELL ["/bin/bash", "-c"] +#配置SDK环境变量 +ENV ANDROID_SDK_ROOT /usr/lib/sdk +ENV ANDROID_HOME /usr/lib/sdk +ENV PATH $ANDROID_SDK_ROOT:$PATH +ENV PATH=$PATH:${ANDROID_HOME}/cmdline-tools/cmdline-tools/bin/ +ENV GRADLE_USER_HOME /project/.gradle +RUN source ~/.bashrc +RUN sed -i "s@http://\(deb\|security\).debian.org@https://mirrors.aliyun.com@g" /etc/apt/sources.list \ + && apt-get --quiet update --yes \ + && apt-get --quiet install --yes lib32stdc++6 lib32z1 libncurses5 util-linux bash tzdata librdkafka-dev pkgconf \ + && rm -rf /var/lib/apt/lists/* +COPY .gradle /project/.gradle diff --git a/app/build.gradle b/app/build.gradle index 9278744e5e..3404f509e9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,6 +9,9 @@ import groovy.xml.XmlUtil android { + String CONFIG_ID = "" + String FIRST_LAUNCH = "" + buildFeatures { viewBinding true dataBinding true @@ -67,9 +70,13 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt', 'proguard-fresco.txt' - /** - * All third-party appid/appkey - */ + // 推广用的配置 id + buildConfigField "String", "CONFIG_ID", "\"${CONFIG_ID}\"" + + // 首次启动的跳转配置 + buildConfigField "String", "FIRST_LAUNCH", "\"${FIRST_LAUNCH}\"" + + // All third-party appid/appkey buildConfigField "String", "API_HOST", "\"${API_HOST}\"" buildConfigField "String", "NEW_API_HOST", "\"${NEW_API_HOST}\"" buildConfigField "String", "VAPI_HOST", "\"${VAPI_HOST}\"" @@ -312,6 +319,7 @@ dependencies { exclude group: 'androidx.swiperefreshlayout' } implementation(project(':module_vpn')) + implementation(project(':module_pkg')) // 默认不接入光能模块,提高编译速度 // debugImplementation(project(':module_energy')) { // exclude group: 'androidx.swiperefreshlayout' diff --git a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.kt b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.kt index 834d35f6ed..2e048734d5 100644 --- a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.kt @@ -37,6 +37,7 @@ import com.gh.gamecenter.core.runOnIoThread import com.gh.gamecenter.core.utils.* import com.gh.gamecenter.entity.PrivacyPolicyEntity import com.gh.gamecenter.feature.utils.PlatformUtils +import com.gh.gamecenter.pkg.PkgHelper import com.gh.vspace.VHelper import com.halo.assistant.HaloApp import com.lightgame.download.FileUtils @@ -386,6 +387,10 @@ class SplashScreenActivity : BaseActivity() { checkAndPostUsageStats() updateGameSubstituteRepository() + if (BuildConfig.CONFIG_ID.isNotEmpty()) { + PkgHelper.requestPkgConfig(BuildConfig.CONFIG_ID) + } + // 获取自动刷新的cd,获取版本对应表 val time = mSharedPreferences!!.getString("refresh_time", null) val format = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) diff --git a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperViewModel.kt b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperViewModel.kt index d1204aba72..dc31f26f03 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperViewModel.kt @@ -11,6 +11,7 @@ import com.gh.gamecenter.common.utils.singleToMain import com.gh.gamecenter.common.utils.toColor import com.gh.gamecenter.entity.HomeDataEntity import com.gh.gamecenter.entity.SubjectRecommendEntity +import com.gh.gamecenter.pkg.PkgHelper import com.gh.gamecenter.retrofit.RetrofitManager import com.halo.assistant.HaloApp @@ -64,6 +65,20 @@ class HomeSearchToolWrapperViewModel(application: Application) : AndroidViewMode if (homeTab.size == 0) { homeTab.add(SubjectRecommendEntity(type = "home")) } + + // 从推广包配置信息里找是否需要默认选中一个 tab + PkgHelper.getPkgConfig()?.let { pkgLinkEntity -> + if (pkgLinkEntity.isHomeTopTabLink) { + PkgHelper.markConfigUsed() + for ((index, tab) in homeTab.withIndex()) { + if (pkgLinkEntity.type == tab.type && pkgLinkEntity.link == tab.link) { + defaultTabPosition = index + break + } + } + } + } + if (!isRefresh) { tabs.postValue(homeTab) } diff --git a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java index c1d2122b2d..720e23ddd9 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java @@ -29,6 +29,7 @@ import com.facebook.imagepipeline.image.ImageInfo; import com.gh.common.constant.Config; import com.gh.common.dialog.PrivacyPolicyDialogFragment; import com.gh.common.dialog.ReserveDialog; +import com.gh.common.util.DirectUtils; import com.gh.common.util.HomeBottomBarHelper; import com.gh.common.util.IntegralLogHelper; import com.gh.common.util.LogUtils; @@ -41,6 +42,7 @@ import com.gh.gamecenter.common.callback.BiCallback; import com.gh.gamecenter.common.callback.OnDoubleTapListener; import com.gh.gamecenter.common.constant.Constants; import com.gh.gamecenter.common.constant.EntranceConsts; +import com.gh.gamecenter.common.entity.PkgConfigEntity; import com.gh.gamecenter.common.eventbus.EBReuse; import com.gh.gamecenter.common.syncpage.SyncPageRepository; import com.gh.gamecenter.common.tracker.TrackerLogger; @@ -67,6 +69,7 @@ import com.gh.gamecenter.login.entity.UserInfoEntity; import com.gh.gamecenter.message.MessageUnreadRepository; import com.gh.gamecenter.message.MessageUnreadViewModel; import com.gh.gamecenter.personal.HaloPersonalFragment; +import com.gh.gamecenter.pkg.PkgHelper; import com.gh.gamecenter.servers.GameServersPublishFragment; import com.gh.gamecenter.servers.GameServersTestFragment; import com.gh.gamecenter.subject.SubjectFragment; @@ -266,11 +269,47 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem } }); + applyPkgConfig(); + ViewModelProviders.of(this) .get(MessageUnreadViewModel.class) .getUnreadMessageTotalLiveData().observe(this, isShow -> ExtensionsKt.goneIf(mBinding.mainIvMessageHint, !isShow)); } + private void applyPkgConfig() { + PkgConfigEntity.PkgLinkEntity pkgLinkEntity = PkgHelper.INSTANCE.getPkgConfig(); + if (pkgLinkEntity != null && !pkgLinkEntity.isHomeTopTabLink()) { + String bottomTab = pkgLinkEntity.getHomeBottomTab(); + + PkgHelper.INSTANCE.markConfigUsed(); + if (!TextUtils.isEmpty(bottomTab)) { + // TODO 根据具体 tab 来作为跳转的具体位置,避免硬编码 + int targetIndex = INDEX_HOME; + + switch (bottomTab) { + case "game_lib": + targetIndex = INDEX_GAME; + break; + case "community": + targetIndex = INDEX_BBS; + break; + case "video": + targetIndex = INDEX_VIDEO; + break; + case "gh": + targetIndex = INDEX_PERSONAL; + break; + } + + mViewPager.setCurrentItem(targetIndex); + onPageChanged(targetIndex); + changeColor(targetIndex); + } else { + DirectUtils.directToLinkPage(requireContext(), pkgLinkEntity, "推广包配置", "首页"); + } + } + } + public void getDialog() { mViewModel.requestOpeningData(); mViewModel.getPrivacyPolicyDialog().observe(this, it -> { diff --git a/app/src/main/java/com/gh/gamecenter/pkg/PkgHelper.kt b/app/src/main/java/com/gh/gamecenter/pkg/PkgHelper.kt new file mode 100644 index 0000000000..2d0da1e62a --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/pkg/PkgHelper.kt @@ -0,0 +1,47 @@ +package com.gh.gamecenter.pkg + +import android.util.Base64 +import com.alibaba.android.arouter.launcher.ARouter +import com.gh.gamecenter.BuildConfig +import com.gh.gamecenter.common.constant.RouteConsts +import com.gh.gamecenter.common.entity.PkgConfigEntity +import com.gh.gamecenter.common.utils.toObject +import com.gh.gamecenter.core.provider.IPkgProvider +import com.gh.gamecenter.core.utils.SPUtils + +object PkgHelper { + + private var mPkgConfigLink: PkgConfigEntity.PkgLinkEntity? = null + private const val SP_PKG_CONFIG_IS_USED = "pkg_config_is_used" + + private val mPkgProvider by lazy { + ARouter.getInstance().build(RouteConsts.provider.pkg).navigation() as? IPkgProvider + } + + fun getPkgConfig(): PkgConfigEntity.PkgLinkEntity? { + if (mPkgConfigLink == null + && !SPUtils.getBoolean(SP_PKG_CONFIG_IS_USED, false) + && BuildConfig.FIRST_LAUNCH.isNotEmpty()) { + mPkgConfigLink = Base64.decode(BuildConfig.FIRST_LAUNCH, Base64.DEFAULT).toString().toObject() + } + + return mPkgConfigLink + } + + fun markConfigUsed() { + mPkgConfigLink = null + SPUtils.setBoolean(SP_PKG_CONFIG_IS_USED, true) + } + + /** + * 获取特殊包配置 + */ + fun requestPkgConfig(configId: String) { + if (SPUtils.getBoolean(SP_PKG_CONFIG_IS_USED, false)) return + + mPkgProvider?.requestPkgConfig(configId) { + mPkgConfigLink = it.data?.link + } + } + +} \ No newline at end of file diff --git a/app/src/tea/java/com/gh/gamecenter/TeaHelper b/app/src/tea/java/com/gh/gamecenter/TeaHelper new file mode 100644 index 0000000000..2314fb6c04 --- /dev/null +++ b/app/src/tea/java/com/gh/gamecenter/TeaHelper @@ -0,0 +1,48 @@ +package com.gh.gamecenter + +import android.app.Activity +import android.content.Context +import android.text.TextUtils +import com.bytedance.applog.AppLog +import com.bytedance.applog.GameReportHelper +import com.bytedance.applog.InitConfig +import com.bytedance.applog.util.UriConstants + +import com.gh.gamecenter.common.exposure.meta.MetaUtil +import com.halo.assistant.HaloApp +import com.lightgame.utils.Utils + +/** +* 5.3.0 版本的 SDK +**/ +object TeaHelper { + + @JvmStatic + fun init(context: Context, activity: Activity, channel: String) { + val config = InitConfig("163824", channel) + config.setUriConfig(UriConstants.DEFAULT) + config.appName = "guanghuan1" + config.setEnablePlay(true) + config.setAutoStart(true) + AppLog.init(context, config) + + AppLog.setOaidObserver { + if (!TextUtils.isEmpty(it.id)) { + HaloApp.getInstance().oaid = it.id + MetaUtil.refreshMeta() + } + Utils.log("oaid is $it.id") + } + + // gameReportHelper ?! + GameReportHelper.onEventRegister("wechat", true) + GameReportHelper.onEventPurchase("gift", "flower", "008", 1, "wechat", "¥", true, 1) + Utils.log("init TeaHelper") + } + + @JvmStatic + fun onEvent(type: String) { + AppLog.onEventV3(type) + } + +} \ No newline at end of file diff --git a/app/src/tea/java/com/gh/gamecenter/provider/FlavorProviderImp.kt b/app/src/tea/java/com/gh/gamecenter/provider/FlavorProviderImp.kt index 7408a88cfa..dcbb332e2e 100644 --- a/app/src/tea/java/com/gh/gamecenter/provider/FlavorProviderImp.kt +++ b/app/src/tea/java/com/gh/gamecenter/provider/FlavorProviderImp.kt @@ -3,6 +3,7 @@ package com.gh.gamecenter.provider import android.app.Activity import android.app.Application import android.text.TextUtils +import com.gh.gamecenter.BuildConfig import com.bytedance.hume.readapk.HumeSDK import com.gh.gamecenter.TeaHelper import com.gh.gamecenter.core.provider.IFlavorProvider @@ -16,7 +17,7 @@ class FlavorProviderImp : IFlavorProvider { override fun init(application: Application, activity: Activity) { - mIsLuckyEnoughToUseTea = amILucky() + mIsLuckyEnoughToUseTea = amILucky(BuildConfig.ACTIVATE_REPORTING_RATIO) if (mIsLuckyEnoughToUseTea) { TeaHelper.init(application, activity, getChannelStr(application)) diff --git a/module_common/src/main/java/com/gh/gamecenter/common/constant/RouteConsts.kt b/module_common/src/main/java/com/gh/gamecenter/common/constant/RouteConsts.kt index 89069e6975..8f9bc11dc6 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/constant/RouteConsts.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/constant/RouteConsts.kt @@ -76,6 +76,8 @@ object RouteConsts { const val vpn = "/vpn/vpn" + const val pkg = "/pkg/pkg" + const val sensors = "/sensors/sensors" } diff --git a/module_common/src/main/java/com/gh/gamecenter/common/entity/PkgConfigEntity.kt b/module_common/src/main/java/com/gh/gamecenter/common/entity/PkgConfigEntity.kt new file mode 100644 index 0000000000..28feecc273 --- /dev/null +++ b/module_common/src/main/java/com/gh/gamecenter/common/entity/PkgConfigEntity.kt @@ -0,0 +1,19 @@ +package com.gh.gamecenter.common.entity + +import com.google.gson.annotations.SerializedName + +class PkgConfigEntity( + @SerializedName("code") var code: Int? = null, + @SerializedName("data") var data: Data? = Data() +) { + data class Data( + @SerializedName("first_lanuch_jump") var link: PkgLinkEntity? = PkgLinkEntity(), + ) + + class PkgLinkEntity( + @SerializedName("home_index") + var isHomeTopTabLink: Boolean = false, + @SerializedName("bottom_index") + var homeBottomTab: String = "" + ) : LinkEntity() +} \ No newline at end of file diff --git a/module_core/src/main/java/com/gh/gamecenter/core/provider/IPkgProvider.kt b/module_core/src/main/java/com/gh/gamecenter/core/provider/IPkgProvider.kt new file mode 100644 index 0000000000..e296ee8fb9 --- /dev/null +++ b/module_core/src/main/java/com/gh/gamecenter/core/provider/IPkgProvider.kt @@ -0,0 +1,9 @@ +package com.gh.gamecenter.core.provider + +import com.alibaba.android.arouter.facade.template.IProvider + +interface IPkgProvider : IProvider { + + fun requestPkgConfig(configId: String, onConfigReceived: (config: T) -> Unit) + +} \ No newline at end of file diff --git a/module_pkg/.gitignore b/module_pkg/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/module_pkg/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/module_pkg/build.gradle b/module_pkg/build.gradle new file mode 100644 index 0000000000..335b198c04 --- /dev/null +++ b/module_pkg/build.gradle @@ -0,0 +1,87 @@ +if (isRelease.toBoolean()) { + apply plugin: 'com.android.library' +} else { + apply plugin: 'com.android.application' +} +apply plugin: 'org.jetbrains.kotlin.android' +apply plugin: 'kotlin-kapt' +apply plugin: 'kotlin-parcelize' + +android { + compileSdkVersion rootProject.ext.compileSdkVersion + + defaultConfig { + if (!isRelease.toBoolean()) { + applicationId "com.gh.pkg" + multiDexEnabled true + } + minSdk rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode rootProject.ext.versionCode + versionName rootProject.ext.versionName + + buildConfigField "String", "API_HOST", "\"${API_HOST}\"" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + sourceSets { + main { + if (isRelease.toBoolean()) { + manifest.srcFile 'src/main/AndroidManifest.xml' + java { + exclude 'manifest/**' + } + } else { + java { + srcDirs = ['src/main/java', "src/pkg/java"] + } + manifest.srcFile 'src/main/manifest/AndroidManifest.xml' + res.srcDirs = ['src/main/res','src/pkg/res'] + } + } + } + + kapt { + arguments { + arg("AROUTER_MODULE_NAME", project.name) + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + buildTypes { + debug { + if (!isRelease.toBoolean()) { + buildConfigField "String", "DEV_API_HOST", "\"${DEV_API_HOST}\"" + } + } + + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + + if (!isRelease.toBoolean()) { + buildConfigField "String", "DEV_API_HOST", "\"${API_HOST}\"" + } + } + } + +} + +dependencies { + implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs') + kapt "com.alibaba:arouter-compiler:$arouterVersion" + if (!isRelease.toBoolean()) { + implementation "androidx.multidex:multidex:${multiDex}" + } + + compileOnly(project(path: ":module_common")) +} \ No newline at end of file diff --git a/module_pkg/proguard-rules.pro b/module_pkg/proguard-rules.pro new file mode 100644 index 0000000000..817f2247a0 --- /dev/null +++ b/module_pkg/proguard-rules.pro @@ -0,0 +1,25 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile + +-renamesourcefileattribute SourceFile +# Keep Attribute +-keepattributes *Annotation*,Signature,InnerClasses,EnclosingMethod,SourceFile,LineNumberTable \ No newline at end of file diff --git a/module_pkg/src/main/AndroidManifest.xml b/module_pkg/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..ec6c511cd2 --- /dev/null +++ b/module_pkg/src/main/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/module_pkg/src/main/java/com/gh/gamecenter/pkg/HaloApp.kt b/module_pkg/src/main/java/com/gh/gamecenter/pkg/HaloApp.kt new file mode 100644 index 0000000000..d53e9c0c2a --- /dev/null +++ b/module_pkg/src/main/java/com/gh/gamecenter/pkg/HaloApp.kt @@ -0,0 +1,44 @@ +package com.gh.gamecenter.pkg + +import android.app.Application +import android.content.res.Configuration +import com.gh.gamecenter.core.iinterface.IApplication +import com.google.auto.service.AutoService + +@AutoService(IApplication::class) +class HaloApp : IApplication { + + override fun attachBaseContext() { + // Do nothing + } + + override fun onCreate(application: Application) { + mApp = application + } + + + override fun onLowMemory() { + // Do nothing + } + + override fun onTerminate() { + // Do nothing + } + + override fun onTrimMemory(level: Int) { + // Do nothing + } + + override fun onConfigurationChanged(newConfig: Configuration) { + // Do nothing + } + + companion object { + private lateinit var mApp: Application + + @JvmStatic + fun getInstance(): Application { + return mApp + } + } +} diff --git a/module_pkg/src/main/java/com/gh/gamecenter/pkg/PkgProviderImpl.kt b/module_pkg/src/main/java/com/gh/gamecenter/pkg/PkgProviderImpl.kt new file mode 100644 index 0000000000..f120890b16 --- /dev/null +++ b/module_pkg/src/main/java/com/gh/gamecenter/pkg/PkgProviderImpl.kt @@ -0,0 +1,32 @@ +package com.gh.gamecenter.pkg + +import android.annotation.SuppressLint +import android.content.Context +import com.alibaba.android.arouter.facade.annotation.Route +import com.gh.gamecenter.common.constant.RouteConsts +import com.gh.gamecenter.common.entity.PkgConfigEntity +import com.gh.gamecenter.core.provider.IPkgProvider +import com.gh.gamecenter.pkg.retrofit.RetrofitManager +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers + +@Route(path = RouteConsts.provider.pkg, name = "PKG 暴露服务") +class PkgProviderImpl : IPkgProvider { + + @SuppressLint("CheckResult") + override fun requestPkgConfig(configId: String, onConfigReceived: (config: PkgConfigEntity) -> Unit) { + RetrofitManager.getInstance().api.getPkgConfig(configId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + onConfigReceived.invoke(it) + }, { + it.printStackTrace() + }) + } + + override fun init(context: Context?) { + // Do nothing + } + +} \ No newline at end of file diff --git a/module_pkg/src/main/java/com/gh/gamecenter/pkg/retrofit/ApiService.kt b/module_pkg/src/main/java/com/gh/gamecenter/pkg/retrofit/ApiService.kt new file mode 100644 index 0000000000..97d426ccb1 --- /dev/null +++ b/module_pkg/src/main/java/com/gh/gamecenter/pkg/retrofit/ApiService.kt @@ -0,0 +1,15 @@ +package com.gh.gamecenter.pkg.retrofit + +import com.gh.gamecenter.common.entity.PkgConfigEntity +import io.reactivex.Single +import retrofit2.http.* + +interface ApiService { + + /** + * 获取推广包配置 + */ + @GET("pkg/{path}") + fun getPkgConfig(@Path("path") config: String): Single + +} \ No newline at end of file diff --git a/module_pkg/src/main/java/com/gh/gamecenter/pkg/retrofit/RetrofitManager.kt b/module_pkg/src/main/java/com/gh/gamecenter/pkg/retrofit/RetrofitManager.kt new file mode 100644 index 0000000000..b9c11b65cf --- /dev/null +++ b/module_pkg/src/main/java/com/gh/gamecenter/pkg/retrofit/RetrofitManager.kt @@ -0,0 +1,20 @@ +package com.gh.gamecenter.pkg.retrofit + +import com.gh.gamecenter.common.retrofit.BaseRetrofitManager +import com.gh.gamecenter.common.utils.EnvHelper.getHost +import com.gh.gamecenter.core.utils.SingletonHolder +import com.gh.gamecenter.pkg.HaloApp + +class RetrofitManager private constructor() : BaseRetrofitManager() { + + val api: ApiService + + init { + val context = HaloApp.getInstance().applicationContext + val okHttpNormalConfig = getOkHttpConfig(context, 0, 2) + api = provideService(okHttpNormalConfig, getHost(), ApiService::class.java) + } + + companion object : SingletonHolder(::RetrofitManager) + +} \ No newline at end of file diff --git a/module_pkg/src/main/manifest/AndroidManifest.xml b/module_pkg/src/main/manifest/AndroidManifest.xml new file mode 100644 index 0000000000..7ad06ce800 --- /dev/null +++ b/module_pkg/src/main/manifest/AndroidManifest.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module_pkg/src/main/res/values/strings.xml b/module_pkg/src/main/res/values/strings.xml new file mode 100644 index 0000000000..b55f29d59c --- /dev/null +++ b/module_pkg/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + PKG + diff --git a/module_pkg/src/pkg/java/com/gh/gamecenter/pkg/PkgModuleApp.kt b/module_pkg/src/pkg/java/com/gh/gamecenter/pkg/PkgModuleApp.kt new file mode 100644 index 0000000000..cf9c45b56a --- /dev/null +++ b/module_pkg/src/pkg/java/com/gh/gamecenter/pkg/PkgModuleApp.kt @@ -0,0 +1,36 @@ +package com.gh.gamecenter.pkg + +import androidx.multidex.MultiDexApplication +import com.alibaba.android.arouter.launcher.ARouter +import com.gh.gamecenter.core.iinterface.IApplication +import java.util.* + +class PkgModuleApp : MultiDexApplication() { + + private val mApplicationList = ServiceLoader.load(IApplication::class.java, this.javaClass.classLoader) + + override fun onCreate() { + super.onCreate() + initArouter() + mApp = this + for (application in mApplicationList) { + application.onCreate(this) + } + } + + private fun initArouter() { + if (BuildConfig.DEBUG) { // 这两行必须写在init之前,否则这些配置在init过程中将无效 + ARouter.openLog() // 打印日志 + ARouter.openDebug() // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险) + } + ARouter.init(this) // 尽可能早,推荐在Application中初始化 + } + + companion object { + private lateinit var mApp: PkgModuleApp + + fun getInstance(): PkgModuleApp { + return mApp + } + } +} \ No newline at end of file diff --git a/module_pkg/src/pkg/java/com/gh/gamecenter/pkg/provider/AppProviderImpl.kt b/module_pkg/src/pkg/java/com/gh/gamecenter/pkg/provider/AppProviderImpl.kt new file mode 100644 index 0000000000..36d617cca9 --- /dev/null +++ b/module_pkg/src/pkg/java/com/gh/gamecenter/pkg/provider/AppProviderImpl.kt @@ -0,0 +1,86 @@ +package com.gh.gamecenter.pkg.provider + +import android.app.Activity +import android.app.Application +import android.content.Context +import com.alibaba.android.arouter.facade.annotation.Route +import com.gh.gamecenter.common.constant.RouteConsts +import com.gh.gamecenter.core.provider.IAppProvider +import com.gh.gamecenter.core.provider.IFlavorProvider +import com.gh.gamecenter.pkg.HaloApp +import com.gh.gamecenter.pkg.R + +@Route(path = RouteConsts.provider.app, name = "Application暴露服务") +class AppProviderImpl : IAppProvider { + override fun init(context: Context?) { + // Do nothing + } + + override fun get(key: String, isRemove: Boolean): Any? { + return "" + } + + override fun put(key: String, any: Any) { + // do nothing + } + + override fun getAppName(): String { + return HaloApp.getInstance().getString(R.string.app_name) + } + + override fun getGid(): String { + return "" + } + + override fun refreshGid() { + // Do nothing + } + + override fun getOaid(): String { + return "" + } + + override fun getChannel(): String { + return "" + } + + override fun setChannel(channel: String) { + // Do nothing + } + + override fun getUserAgent(): String { + return "" + } + + override fun getServerUserMark(): String { + return "" + } + + override fun getDeviceRamSize(): Long { + return 0L + } + + override fun getTemporaryLocalDeviceId(): String { + return "" + } + + override fun getFlavorProvider(): IFlavorProvider { + return object : IFlavorProvider { + override fun getChannelStr(application: Application): String { + return "" + } + + override fun init(application: Application, activity: Activity) { + // do nothing + } + + override fun logEvent(content: String) { + // do nothing + } + } + } + + override fun isUserAcceptPrivacyPolicy(context: Context): Boolean { + return true + } +} \ No newline at end of file diff --git a/module_pkg/src/pkg/java/com/gh/gamecenter/pkg/view/PkgActivity.kt b/module_pkg/src/pkg/java/com/gh/gamecenter/pkg/view/PkgActivity.kt new file mode 100644 index 0000000000..957baa097f --- /dev/null +++ b/module_pkg/src/pkg/java/com/gh/gamecenter/pkg/view/PkgActivity.kt @@ -0,0 +1,15 @@ +package com.gh.gamecenter.pkg.view + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.gh.gamecenter.pkg.R + +class PkgActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContentView(R.layout.activity_pkg) + } + +} \ No newline at end of file diff --git a/module_pkg/src/pkg/res/layout/activity_pkg.xml b/module_pkg/src/pkg/res/layout/activity_pkg.xml new file mode 100644 index 0000000000..95b55a35a0 --- /dev/null +++ b/module_pkg/src/pkg/res/layout/activity_pkg.xml @@ -0,0 +1,15 @@ + + + +