Commit 7a1afc91 authored by sheteng's avatar sheteng

游戏更新 美团打包

parent 34c09abb
......@@ -74,3 +74,13 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
多渠道打包命令
gradlew clean apkRelease -Poutput=build/apks
java -jar tools/packer-ng-2.0.1.jar generate --channels=@channels.txt --output=build/apks app/release/app-universal-release.apk
......@@ -3,9 +3,11 @@ plugins {
id("kotlin-android")
id("kotlin-kapt")
id("kotlin-parcelize")
id("packer")
}
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
......@@ -26,25 +28,46 @@ android {
applicationId = "com.ccwangluo.accelerator"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
manifestPlaceholders.put("XG_ACCESS_ID","1580009634")
manifestPlaceholders.put("XG_ACCESS_KEY","AIJKAIYR3WPS")
manifestPlaceholders.put("qqappid","101994779")
manifestPlaceholders.put("XG_ACCESS_ID", "1580009634")
manifestPlaceholders.put("XG_ACCESS_KEY", "AIJKAIYR3WPS")
manifestPlaceholders.put("qqappid", "101994779")
flavorDimensions.add("1.0")
ndk {
abiFilters.add("armeabi-v7a")
abiFilters.add("arm64-v8a")
}
}
buildTypes {
named("release"){
named("release") {
signingConfig?.enableV2Signing = true
signingConfig = signingConfigs.getByName("config")
isMinifyEnabled = false
setProguardFiles(listOf(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"))
setProguardFiles(
listOf(
getDefaultProguardFile("proguard-android.txt"),
"proguard-rules.pro"
)
)
}
named("debug"){
named("debug") {
signingConfig = signingConfigs.getByName("config")
isMinifyEnabled = false
}
}
buildFeatures.viewBinding = true
packer {
// archiveNameFormat = "${appPkg}-${buildType}-v${versionName}-${channel}"
archiveOutput = File(project.rootProject.buildDir, "apks")
channelFile = project.rootProject.file("channels.txt")
}
}
setupApp()
android.defaultConfig.applicationId = "com.ccwangluo.accelerator"
......@@ -78,6 +101,8 @@ dependencies {
implementation("com.github.xuexiangjys.XUtil:xutil-core:2.0.0")
implementation("com.github.xuexiangjys.XUtil:xutil-sub:2.0.0")
implementation("com.tencent:mmkv:1.2.10")
//美团多渠道打包
implementation("com.mcxiaoke.packer-ng:helper:2.0.1")
//XPage
implementation("com.github.xuexiangjys.XPage:xpage-lib:3.3.0")
......@@ -107,7 +132,7 @@ dependencies {
// implementation("com.squareup.okhttp3:okhttp:3.14.9")//QQ官方sdk 3.53及之后版本需要集成okhttp3.x,必选)
//gps
implementation ("com.tencent.map.geolocation:TencentLocationSdk-openplatform:7.3.0")
implementation("com.tencent.map.geolocation:TencentLocationSdk-openplatform:7.3.0")
implementation("com.github.bumptech.glide:glide:4.11.0")
annotationProcessor("com.github.bumptech.glide:compiler:4.11.0")
......@@ -115,6 +140,6 @@ dependencies {
implementation("com.github.open-android:JieCaoVideoPlayer:0.1.0")
implementation("com.tencent.bugly:crashreport_upgrade:1.5.23")//其中latest.release指代最新版本号,也可以指定明确的版本号,例如1.2.0
implementation ("com.tencent.bugly:nativecrashreport:3.9.2")//其中latest.release指代最新版本号,也可以指定明确的版本号,例如2.2.0
implementation("com.tencent.bugly:nativecrashreport:3.9.2")//其中latest.release指代最新版本号,也可以指定明确的版本号,例如2.2.0
implementation("com.tencent.tpns:tpns:1.3.2.0-release")
}
\ No newline at end of file
......@@ -6,6 +6,7 @@ import android.os.Environment
import androidx.multidex.MultiDex
import com.ccwangluo.accelerator.ui.MainActivity
import com.ccwangluo.accelerator.utils.PhoneUtils
import com.ccwangluo.accelerator.utils.SysUtils
import com.github.shadowsocks.Core
import com.hjq.toast.ToastUtils
import com.tencent.bugly.Bugly
......@@ -38,6 +39,8 @@ class App : Application(), androidx.work.Configuration.Provider by Core {
XGPushConfig.enableDebug(this, true);
XUtil.init(this)
SysUtils.initChannel(this)
UMConfigure.init(this,"61f0aa7fe014255fcb06a0bd"
,"umeng",UMConfigure.DEVICE_TYPE_PHONE,"")
......
package com.ccwangluo.accelerator.receiver;
import static com.tencent.bugly.beta.tinker.TinkerManager.getApplication;
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.text.TextUtils;
public class AppDownloadReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (!TextUtils.equals(action, DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
return;
}
long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if (downloadId == -1) {
return;
}
DownloadManager downloadManager = (DownloadManager) context.getApplicationContext().getSystemService(Context.DOWNLOAD_SERVICE);
int status = getDownloadStatus(downloadManager, downloadId);
if (status != DownloadManager.STATUS_SUCCESSFUL) { //下载状态不等于成功就跳出
return;
}
Uri uri = downloadManager.getUriForDownloadedFile(downloadId);//获取下载完成文件uri
if (uri == null) {
return;
}
installApk(context,uri);
}
/**
* 安装apk
*/
private void installApk(Context context, Uri uri) {
Intent install = new Intent(Intent.ACTION_VIEW);
install.setDataAndType(uri, "application/vnd.android.package-archive");
install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(install);
}
/**
* 获取下载状态
*
* @param downloadManager
* @param downloadId
* @return
*/
private int getDownloadStatus(DownloadManager downloadManager, long downloadId) {
DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
Cursor c = downloadManager.query(query);
if (c != null) {
try {
if (c.moveToFirst()) {
return c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));
}
} finally {
c.close();
}
}
return -1;
}
}
\ No newline at end of file
package com.ccwangluo.accelerator.ui
import android.Manifest
import android.app.DownloadManager
import android.content.Intent
import android.content.IntentFilter
import android.hardware.Sensor
import android.hardware.SensorEventListener
import android.hardware.SensorManager
import android.os.Bundle
import android.os.Looper
import android.util.Log
import android.view.KeyEvent
import androidx.appcompat.app.AlertDialog
import androidx.lifecycle.ViewModelProvider
import com.ccwangluo.accelerator.R
import com.ccwangluo.accelerator.receiver.AppDownloadReceiver
import com.ccwangluo.accelerator.ui.dialog.PermissionDialog
import com.ccwangluo.accelerator.ui.dialog.PrivacyDialog
import com.ccwangluo.accelerator.ui.home.AccelertorViewModel
import com.ccwangluo.accelerator.ui.login.SplashFragment
import com.ccwangluo.accelerator.utils.AcceleratorUtils
import com.ccwangluo.accelerator.utils.PhoneUtils
import com.github.shadowsocks.http.HttpConfig
import com.ccwangluo.accelerator.utils.datareport.DataRePortUtils
import com.ccwangluo.cc_quickly.utils.SettingSPUtils
import com.github.shadowsocks.bg.AuthManager
import com.github.shadowsocks.http.HttpConfig
import com.github.shadowsocks.utils.StartService
import com.hjq.toast.ToastUtils
import com.tencent.android.tpush.XGIOperateCallback
import com.tencent.android.tpush.XGPushManager
import com.tencent.map.geolocation.TencentLocation
import com.tencent.map.geolocation.TencentLocationListener
import com.tencent.map.geolocation.TencentLocationManager
......@@ -24,17 +36,9 @@ import com.tencent.tauth.Tencent
import com.umeng.socialize.UMShareAPI
import com.xuexiang.xpage.base.XPageActivity
import com.xuexiang.xpage.core.PageOption
import android.hardware.SensorManager
import android.hardware.SensorEventListener
import android.os.Handler
import android.util.Log
import com.ccwangluo.accelerator.ui.dialog.PermissionDialog
import com.ccwangluo.accelerator.ui.home.AcceleratorFragment
import com.ccwangluo.accelerator.utils.datareport.DataRePortUtils
import fm.jiecao.jcvideoplayer_lib.JCVideoPlayer
import com.tencent.android.tpush.XGIOperateCallback
import com.tencent.android.tpush.XGPushManager
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import com.xuexiang.xutil.system.PermissionUtils
import fm.jiecao.jcvideoplayer_lib.JCVideoPlayer
class MainActivity() : XPageActivity(), TencentLocationListener {
......@@ -50,6 +54,7 @@ class MainActivity() : XPageActivity(), TencentLocationListener {
private var mSensorEventListener: SensorEventListener? = null
private var mSensorManager: SensorManager? = null
private val appDownReceiver = AppDownloadReceiver()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
......@@ -90,7 +95,7 @@ class MainActivity() : XPageActivity(), TencentLocationListener {
DataRePortUtils.report("st_app_open")
AcceleratorUtils.initConnect(this)
registerReceiver(appDownReceiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))
}
private fun getPermission() {
......@@ -180,6 +185,7 @@ class MainActivity() : XPageActivity(), TencentLocationListener {
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(appDownReceiver)
AcceleratorUtils.onDestroy(this)
}
......
package com.ccwangluo.accelerator.ui.dialog
import android.app.DownloadManager
import android.content.DialogInterface
import android.database.Cursor
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.lifecycleScope
import com.xuexiang.xui.widget.dialog.materialdialog.GravityEnum
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class DownloadDialog(
val context: FragmentActivity,
val downloadManager: DownloadManager,
var downloadId: Long
) {
fun show() {
val dialog = MaterialDialog.Builder(context)
.content("下载中")
.contentGravity(GravityEnum.CENTER)
.progress(false, 100, true)
.cancelListener(
{ })
.cancelable(false)
.showListener({})
.show()
context.lifecycleScope.launch(Dispatchers.IO) {
while (dialog.progressBar.progress < 100) {
val progress = getDownloadProgress()
withContext(Dispatchers.Main) {
dialog.setProgress(progress.toInt())
}
delay(500)
}
withContext(Dispatchers.Main) {
dialog.dismiss()
}
}
}
fun getDownloadProgress(): Float {
val query = DownloadManager.Query().setFilterById(downloadId)
val c: Cursor = downloadManager.query(query)
if (c != null) {
try {
if (c.moveToFirst()) {
val mDownload_so_far =
c.getInt(c.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR))
val mDownload_all =
c.getInt(c.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES))
println("mDownload_so_far = $mDownload_so_far &&& mDownload_all = ${mDownload_all} &&& ${mDownload_so_far * 100 / mDownload_all} ")
return (mDownload_so_far.toFloat() / mDownload_all) * 100
}
} finally {
c.close()
}
}
return -1F
}
}
\ No newline at end of file
......@@ -9,6 +9,7 @@ import androidx.fragment.app.Fragment
import com.ccwangluo.accelerator.databinding.FragmentMineBinding
import com.ccwangluo.accelerator.ui.web.AndroidInterface
import com.ccwangluo.accelerator.utils.LoginUtils
import com.ccwangluo.accelerator.utils.SysUtils
import com.github.shadowsocks.http.HttpConfig
import com.just.agentweb.core.AgentWeb
import com.just.agentweb.core.client.DefaultWebClient
......@@ -32,9 +33,9 @@ class MineFragment : XPageFragment() {
}
override fun initViews() {
var weburl = HttpConfig.UI_MAIN_URL
var weburl = HttpConfig.UI_MAIN_URL + "?channel=${SysUtils.getChannel()}"
LoginUtils.token?.let {
weburl = weburl + "?token=$it"
weburl = weburl + "&token=${it}"
}
agentWeb =
createAgentWeb(this, binding.mineWebview, weburl)
......
package com.ccwangluo.accelerator.ui.home
import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
......@@ -29,6 +30,7 @@ import com.google.android.material.tabs.TabLayoutMediator
import com.hjq.toast.ToastUtils
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xpage.utils.TitleBar
import com.xuexiang.xutil.app.AppUtils
class NewsFragment : XPageFragment() {
private var _binding: FragmentNewsBinding? = null
......@@ -95,6 +97,25 @@ class NewsFragment : XPageFragment() {
.into(itemView.findViewById<ImageView>(R.id.plugin_img))
}
itemView.findViewById<TextView>(R.id.plugin_name).setText(itemData.name)
if (itemData.type == 3) {
AcceleratorUtils.game?.let {
val version =
AppUtils.getAppVersionCode(it.packageName)
itemData.url?.let {
var newversion = it.split("/").let { it1->
it1.get(it1.lastIndex - 1).toInt()
}
if (newversion > version) {
itemView.findViewById<TextView>(R.id.plugin_name).setText("游戏更新")
itemView.findViewById<TextView>(R.id.plugin_name)
.setTextColor(Color.parseColor("#329CF3"))
}
}
}
}
itemView.setOnClickListener {
if (itemData.type == 3) {
DataRePortUtils.report("st_game_down_clk", mapOf("scene" to "3"))
......@@ -121,9 +142,8 @@ class NewsFragment : XPageFragment() {
if (itemData.type == 3) {
itemData.url?.let {
DataRePortUtils.report("st_game_down_clk", mapOf("scene" to "3"))
context?.let { it1 ->
activity?.let { it1 ->
SysUtils.downloadFile(it1, it)
ToastUtils.show("开始下载")
}
}
}
......
......@@ -4,6 +4,7 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.ccwangluo.accelerator.model.*
import com.ccwangluo.accelerator.utils.SysUtils
import com.ccwangluo.accelerator.utils.http.HttpGo
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
......@@ -38,7 +39,7 @@ class NewsViewModel : ViewModel() {
fun getPlugin(gameId: Int) {
viewModelScope.launch(Dispatchers.IO) {
val res =
HttpGo.getSync<PluginModel>("/api/plugin/list?gameId=$gameId&page=1&size=10")
HttpGo.getSync<PluginModel>("/api/plugin/list?gameId=$gameId&page=1&size=10&channelId=${SysUtils.getChannel()}")
res?.let {
if (it.code == 200) {
it.data?.list?.let {
......
......@@ -20,7 +20,7 @@ class LoginViewModel : ViewModel() {
val timerNumber = MutableLiveData<Int>()
fun login(phone: String, authCdoe: String) {
val map = mutableMapOf<String, String>()
val map = mutableMapOf<String, Any>()
map.put("phone", phone)
map.put("verifyCode", authCdoe)
SysUtils.getDeviceUUID()?.let { map.put("did", it) }
......@@ -48,7 +48,7 @@ class LoginViewModel : ViewModel() {
}
fun getAuthCode(phone: String) {
val map = mutableMapOf<String, String>()
val map = mutableMapOf<String, Any>()
map.put("phone", phone)
viewModelScope.launch(Dispatchers.IO) {
val res = HttpGo.postSync<Boolean>("/api/user/sendSms", map)
......
......@@ -45,9 +45,15 @@ class AndroidInterface(val xPageFragment: XPageFragment, val agentWeb: AgentWeb)
@JavascriptInterface
fun openWebview(url: String) {
openWebview(url, false)
}
@JavascriptInterface
fun openWebview(url: String, noNeedToken: Boolean) {
LoginUtils.token?.let {
val params = Bundle()
params.putString(CommonWebViewFragment.WEBVIEW_URL_KEY, HttpConfig.UI_MAIN_URL + url)
params.putBoolean(CommonWebViewFragment.NOEEDTOKEN, noNeedToken)
xPageFragment.openPage(CommonWebViewFragment::class.java, params)
} ?: let {
xPageFragment.context?.let { it1 ->
......@@ -85,7 +91,6 @@ class AndroidInterface(val xPageFragment: XPageFragment, val agentWeb: AgentWeb)
HttpConfig.HTML_HOST_PRIVACY + url
)
}
xPageFragment.openPage(CommonWebViewFragment::class.java, params)
}
......@@ -353,5 +358,12 @@ class AndroidInterface(val xPageFragment: XPageFragment, val agentWeb: AgentWeb)
}
}
@JavascriptInterface
fun downloadFile(url: String) {
xPageFragment.activity?.let {
SysUtils.downloadFile(it, url)
}
}
}
\ No newline at end of file
......@@ -10,6 +10,7 @@ import android.widget.FrameLayout
import androidx.fragment.app.Fragment
import com.ccwangluo.accelerator.databinding.FragmentWebviewBinding
import com.ccwangluo.accelerator.utils.LoginUtils
import com.ccwangluo.accelerator.utils.SysUtils
import com.github.shadowsocks.http.HttpConfig
import com.just.agentweb.core.AgentWeb
import com.just.agentweb.core.client.DefaultWebClient
......@@ -34,15 +35,18 @@ class CommonWebViewFragment : XPageFragment() {
override fun initViews() {
val url = arguments?.getString(WEBVIEW_URL_KEY)
val noNeedToken = arguments?.getBoolean(NOEEDTOKEN) ?: false
agentWeb =
url?.let {
var weburl = it
LoginUtils.token?.let {
if (!noNeedToken) {
if (weburl.contains("?")) {
weburl = weburl + "&token=$it"
weburl = weburl + "&channel=${SysUtils.getChannel()}"
} else {
weburl = weburl + "?token=$it"
weburl = weburl + "?channel=${SysUtils.getChannel()}"
}
LoginUtils.token?.let {
weburl = weburl + "&token=${it}"
}
}
createAgentWeb(this, binding.commonWebview, weburl)
......@@ -131,6 +135,7 @@ class CommonWebViewFragment : XPageFragment() {
companion object {
var WEBVIEW_URL_KEY = "WEBVIEW_URL_KEY"
val WEBVIEW_URL_KEY = "WEBVIEW_URL_KEY"
val NOEEDTOKEN = "NOEEDTOKEN"
}
}
\ No newline at end of file
......@@ -107,7 +107,7 @@ object LoginUtils {
fun login(context: Context, callBack: (Boolean) -> Unit) {
PhoneUtils.openLoginAuth(context) { b, s ->
if (b) {
val map = mutableMapOf<String, String>()
val map = mutableMapOf<String, Any>()
map.put("token", s)
SysUtils.getDeviceUUID()?.let { map.put("did", it) }
GlobalScope.launch(Dispatchers.IO) {
......
......@@ -13,6 +13,13 @@ object SettingSPUtils {
private val IS_AGREE_PRIVACY_KEY = "is_agree_privacy_key"
private val IS_SMART_ACC_OPEN = "is_smart_acc_open"
private val LAST_APP_SRART_TIME = "LAST_APP_SRART_TIME"
private val CHANNEL_KEY = "CHANNEL_KEY"
var channel: Int
get() = MMKV.defaultMMKV().decodeInt(CHANNEL_KEY, 0)
set(channel) {
MMKV.defaultMMKV().putInt(CHANNEL_KEY, channel)
}
/**
......
package com.ccwangluo.accelerator.utils
import android.content.Context
import android.content.pm.PackageManager
import android.text.TextUtils
import android.util.DisplayMetrics
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xutil.net.NetworkUtils
import java.text.SimpleDateFormat
import java.util.*
import kotlin.collections.ArrayList
import android.app.DownloadManager
import android.content.Context
import android.content.Context.DOWNLOAD_SERVICE
import android.content.Intent
import android.net.*
import android.content.pm.PackageInfo
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.text.TextUtils
import android.util.DisplayMetrics
import androidx.fragment.app.FragmentActivity
import com.ccwangluo.accelerator.ui.dialog.DownloadDialog
import com.ccwangluo.cc_quickly.utils.SettingSPUtils
import com.hjq.toast.ToastUtils
import com.mcxiaoke.packer.helper.PackerNg
import com.sdk.base.framework.bean.PInfo
import com.tencent.mmkv.MMKV
import com.xuexiang.xpage.base.XPageActivity
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xutil.app.AppUtils
import com.xuexiang.xutil.net.NetworkUtils
import com.xuexiang.xutil.system.DeviceUtils
import java.lang.Exception
import java.text.SimpleDateFormat
import java.util.*
object SysUtils {
......@@ -100,13 +107,54 @@ object SysUtils {
return (dm.density * 160)
}
fun downloadFile(context: Context, url: String) {
val request = DownloadManager.Request(Uri.parse(url))
request.setDestinationInExternalPublicDir("", url.substring(url.lastIndexOf("/") + 1))
val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
downloadManager.enqueue(request)
fun getChannel(): Int {
return SettingSPUtils.channel
// return 4
}
fun initChannel(context: Context) {
val channel = PackerNg.getChannel(context)
if (!channel.isNullOrBlank()) {
SettingSPUtils.channel = when (channel) {
"guanwang" -> 1
"huawei" -> 2
"xiaomi" -> 3
"vivo" -> 4
"yingyongbao" -> 5
"OPPO" -> 6
"baiduzhushou" -> 7
else -> 0
}
}
}
fun downloadFile(activity: FragmentActivity, url: String) {
val downloadManager = activity.getSystemService(DOWNLOAD_SERVICE) as DownloadManager
val request =
DownloadManager.Request(Uri.parse(url)) //添加下载文件的网络路径
var filename = url.split("/").last()
ToastUtils.show("开始下载")
request.setDestinationInExternalPublicDir(
Environment.DIRECTORY_DOWNLOADS,
filename
) //添加保存文件路径与名称
request.setTitle("下载中") //添加在通知栏里显示的标题
// request.setDescription("下载中") //添加在通知栏里显示的描述
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE or DownloadManager.Request.NETWORK_WIFI) //设置下载的网络类型
request.setVisibleInDownloadsUi(false) //是否显示下载 从Android Q开始会被忽略
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) //下载中与下载完成后都会在通知中显示| 另外可以选 DownloadManager.Request.VISIBILITY_VISIBLE 仅在下载中时显示在通知中,完成后会自动隐藏
val id = downloadManager.enqueue(request) //加入队列,会返回一个唯一下载id
DownloadDialog(activity, downloadManager, id).show()
}
fun joinQQGroup(context: Context) {
val key = "5CmyFzMWyucgmmLTM7JLG_sSArmaFQxT"
......@@ -164,4 +212,21 @@ object SysUtils {
private fun loadDeviceUUID(): String? {
return MMKV.defaultMMKV().decodeString("device_uuid", null)
}
fun getInstalledApps(context: Context,packageName: String): Int {
val packs: List<PackageInfo> = context.getPackageManager().getInstalledPackages(0)
for (i in packs.indices) {
val p = packs[i]
if (p.versionName == null) {
continue
}
if (packageName.equals(p.packageName)){
return p.versionCode
}
}
return -1
}
}
\ No newline at end of file
......@@ -6,7 +6,7 @@ import com.google.gson.JsonObject
import java.time.LocalDateTime
data class BaseData(
var channel: Int = 0,
var channel: Int = SysUtils.getChannel(),
var client_ip: String = "127.0.0.1",
var did: String? = SysUtils.getDeviceUUID(),
var ds: String = LocalDateTime.now().toString(),
......
......@@ -2,6 +2,7 @@ package com.ccwangluo.accelerator.utils.http
import com.ccwangluo.accelerator.model.BaseModel
import com.ccwangluo.accelerator.utils.LoginUtils
import com.ccwangluo.accelerator.utils.SysUtils
import com.ccwangluo.accelerator.utils.datareport.BaseData
import com.github.shadowsocks.http.HttpConfig
import com.google.gson.Gson
......@@ -87,9 +88,10 @@ object HttpGo {
*/
inline fun <reified T> postSync(
url: String,
param: MutableMap<String, out Any>
param: MutableMap<String,Any>
): BaseModel<T>? {
try {
addCommonParams(param)
val body: RequestBody = gson.toJson(param).toString().toRequestBody(jsonType)
val request = Request.Builder()
.url(HttpConfig.baseUrl + url)
......@@ -120,6 +122,10 @@ object HttpGo {
return null
}
fun addCommonParams(param: MutableMap<String,Any>){
param.put("channel",SysUtils.getChannel().toString())
}
/**
* 异步请求 (专用于数据上报)
*/
......@@ -150,6 +156,8 @@ object HttpGo {
}
private fun initSSLSocketFactory(): SSLSocketFactory {
var sslContext: SSLContext? = null
try {
......
......@@ -6,12 +6,24 @@
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">false</item>
<item name="android:windowNoTitle">true</item><!--隐藏标题栏-->
<item name="android:background">@color/transparent</item>
<item name="android:windowBackground">@color/transparent
</item><!--这儿也很重要啊,我这儿用了一张透明的.9.png的图,当然用#00000000也是可以的,否则的话这儿出来后有一个黑色的背景-->
<item name="android:background">@color/white</item>
<item name="android:textColor">@color/black</item>
<item name="colorPrimary">@color/black</item>
<item name="buttonBarButtonStyle">@style/ButtonStyle</item>
<item name="android:textColorPrimary">@color/black</item>
<item name="android:windowBackground">#00000000</item><!--这儿也很重要啊,我这儿用了一张透明的.9.png的图,当然用#00000000也是可以的,否则的话这儿出来后有一个黑色的背景-->
<item name="android:backgroundDimEnabled">false</item>
</style>
<style name="ButtonStyle">
<item name="android:layout_width">?attr/xui_btn_view_width</item>
<item name="android:layout_height">?attr/xui_btn_view_height</item>
<item name="android:textSize">?attr/xui_btn_view_text_size</item>
<item name="android:textColor">@color/black</item>
<item name="android:gravity">center</item>
<item name="android:background">@color/white</item>
</style>
<style name="MyTablayoutstyle" parent="Base.Widget.Design.TabLayout">
<item name="tabIndicatorHeight">0dp</item>
<item name="tabSelectedTextColor">@color/black</item>
......
......@@ -3,7 +3,7 @@
<style name="Theme.Cc_quickly" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<item name="colorOnPrimary">@color/black</item>
<!-- Secondary brand color. -->>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
......@@ -49,12 +49,15 @@
<item name="xpage_actionbar_side_text_padding">16dp</item>
<item name="XPageTitleBarStyle">@style/XPageTitleBar.Custom</item>
<item name="alertDialogTheme">@style/DialogTheme</item>
</style>
<style name="XPageTitleBar.Custom">
<item name="tb_immersive">false</item>
<item name="tb_centerGravity">center</item>
</style>
<style name="btn_checkbox" parent="@android:style/Widget.CompoundButton.CheckBox">
......
......@@ -4,4 +4,5 @@
<!-- QQ 官方分享SDK 共享路径 -->
<root-path name="opensdk_root" path=""/>
<external-files-path name="opensdk_external" path="Images/tmp"/>
<external-path name="external_storage_root" path="."/>
</paths>
\ No newline at end of file
......@@ -23,6 +23,7 @@ buildscript {
classpath("com.vanniktech:gradle-maven-publish-plugin:0.14.2")
classpath("org.jetbrains.dokka:dokka-gradle-plugin:1.4.32")
classpath("org.mozilla.rust-android-gradle:plugin:0.8.6")
classpath("com.mcxiaoke.packer-ng:plugin:2.0.1")
}
}
......@@ -40,3 +41,4 @@ subprojects {
if (name.contains("uploadCrashlyticsMappingFile")) enabled = false
}
}
......@@ -94,6 +94,7 @@ fun Project.setupApp() {
splits.abi {
isEnable = true
isUniversalApk = true
include("armeabi-v7a","arm64-v8a")
}
}
......
guanwang
huawei
xiaomi
vivo
yingyongbao
OPPO
baiduzhushou
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment