Commit b2ae28dc authored by shiyl's avatar shiyl

Merge branch 'dev' into dev_commodity

# Conflicts:
#	.gitignore
#	CommonLib/Common/src/main/java/com/yidian/common/YdBaseApplication.kt
#	Components/newscontent/src/main/java/com/yidian/shenghuoquan/newscontent/app/NewsContentApplication.kt
#	Components/newscontent/src/main/java/com/yidian/shenghuoquan/newscontent/ui/FlashActivity.kt
#	app/build.gradle
#	app/src/main/AndroidManifest.xml
#	app/src/main/java/com/shenghuoquan/business/YdSubwayApplication.kt
#	idcard_quality/src/main/AndroidManifest.xml
parents aad31a35 13dbb650
...@@ -17,3 +17,6 @@ local.properties ...@@ -17,3 +17,6 @@ local.properties
app/debug app/debug
app/release app/release
idcard_quality/build idcard_quality/build
Components/xbirdbusiness/build
app/debug
app/release
...@@ -18,6 +18,8 @@ android { ...@@ -18,6 +18,8 @@ android {
targetSdkVersion build_versions.targetSdkVersion targetSdkVersion build_versions.targetSdkVersion
versionCode rootProject.ext.android.versionCode versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName versionName rootProject.ext.android.versionName
buildConfigField("boolean", "IS_ENCRYPT_DEBUG_KEY", rootProject.ext.android.isEncryptDebugKey)
buildConfigField("boolean", "IS_APP_UPGRADE_ONLINE", rootProject.ext.android.isAppUpgradeOnline)
buildConfigField("String", "SERVICE_VERSION", rootProject.ext.android.serviceVersion) buildConfigField("String", "SERVICE_VERSION", rootProject.ext.android.serviceVersion)
buildConfigField("boolean", "IS_ENCRYPT", rootProject.ext.android.isEncrypt) buildConfigField("boolean", "IS_ENCRYPT", rootProject.ext.android.isEncrypt)
buildConfigField("boolean", "IS_UMENG_RELEASE", rootProject.ext.android.isUmengRelease) buildConfigField("boolean", "IS_UMENG_RELEASE", rootProject.ext.android.isUmengRelease)
......
package com.yidian.common
import android.content.Context
import android.util.Log
import com.scwang.smart.refresh.footer.ClassicsFooter
import com.scwang.smart.refresh.header.ClassicsHeader
import com.scwang.smart.refresh.layout.SmartRefreshLayout
import com.scwang.smart.refresh.layout.constant.SpinnerStyle
import com.yidian.common.utils.UMConfigUtils
import com.yidian.framework.mobile.insight.config.ServerUrlConfig
import com.yidian.framework.mobile.insight.config.XDiamondProvide
import com.yidian.framework.mobile.insight.manage.XInsight
import com.yidian.framework.mobile.insight.manage.XInsightConfig
import com.yidian.framework.mobile.xdiamond.SecretUtil
import com.yidian.news.util.ProcessUtil
import com.yidian.xarc.xbase.utils.XLogger
import com.yidian.xarc.xbrid.*
import com.yidian.xpage.XPageManager
import com.yidian.yac.core.zap.ZapTicket
import com.yidian.yac.ftdevicefinger.core.FtDeviceFingerManager
import com.yidian.yac.pm.appupdate.PmUpdateApp
import com.yidian.yac.pm.appupdate.YDAppUpdateManager
import org.json.JSONObject
/**
* 项目基础配置类初始化,用于同意隐私政策后的初始化
*
* 三方库的初始化应该放这里执行,防止因为隐私政策被应用市场拒绝
*/
object BaseInitConfig {
fun performInitialization(context: Context) {
// 初始化友盟
UMConfigUtils.init(context)
if (ProcessUtil.isMainProcess(context)) {
FtDeviceFingerManager.init(context)
initXBridManager(context)
// 初始化磐石SDK
SecretUtil.init(BuildConfig.IS_ENCRYPT_DEBUG_KEY, BuildConfig.DEBUG)
// 初始化App升级
initAppUpgrade(context)
// 初始化慧眼
initXInsight(context)
// SmartRefresh
initSmartRefreshLayout()
}
}
private fun initXBridManager(context: Context) {
XBridManager.init(
XBridApp(context) {
assetRoot = "www"//对应assets目录下存放xbrid资源对应的目录名
appId = "com.yidian.subway"//当前应用包名
platformId = 16 //需要去平台申请
appVersion = AppConfig.cv//当前应用版本号
deviceFinger = FtDeviceFingerManager.getDeviceFinger()//设备指纹
androidChannel = AppConfig.distribution//对应渠道名
}, 20//webview缓存池数量,默认不缓存
)
XBridManager.registerServiceInvoker(object : OnServiceInvoke {
override fun onCall(
identifier: String, // the identifier assigned when webview created
xWebView: XWebView, // webivew 加载的 js 发起的服务调用请求
request: Request, // 具体的服务请求参数,分为 name 和 params 两个部分
response: Response // 业务方需要借助 response 来回应服务调用结果
) {
val data = request.params as JSONObject
Log.e("zhb-yd", "服务名:" + request.name)
Log.e("zhb-yd", "JS传递参数:$data")
val action = data.optString("action")
val params = data.optJSONObject("params")
val options = data.optJSONObject("options")
ZapTicket(request.name).withAction(action).withServiceParams(params).withServiceOptions(options).withIdentifier(identifier)
.onResult { result ->
response.result(result.code, result.result!!, "")
}.onLost { result ->
response.result(result.code, "", result.mesg)
}.ship()
}
})
XBridManager.registerXPageInvoker(object : OnXPageInvoke {
override fun onCall(identifier: String, xWebView: XWebView, request: XPageRequest) {
val params = mutableMapOf<String, Any>()
(request.params as JSONObject).let { reParams ->
reParams.keys().forEach {
params[it] = reParams[it]
}
}
when (request.action) {
"push" -> XPageManager.push(request.name, params)
"pop" -> XPageManager.pop(params)
"popTo" -> XPageManager.popTo(request.name, params)
"popToRoot" -> XPageManager.popToRoot(params)
}
}
})
}
/**
* App升级
*/
private fun initAppUpgrade(context: Context) {
val logger = XLogger("appUpgrade")
logger.debugOn(BuildConfig.DEBUG)
YDAppUpdateManager.init(PmUpdateApp(context) {
online = BuildConfig.IS_APP_UPGRADE_ONLINE // 线上true、线下false
platformId = AppConfig.TowerProPlatformId // 平台Id
platform = AppConfig.TowerProPlatform // ios/Android
appId = context.packageName // 应用包名
appVersion = AppConfig.cv // 客户端版本号
deviceFinger = FtDeviceFingerManager.getDeviceFinger() // 设备指纹
androidChannel = AppConfig.distribution // 渠道
this.logger = logger.subLogger("appUpgrade")
})
}
/**
* 慧眼
*/
private fun initXInsight(context: Context) {
val config = XInsightConfig()
config.cv = AppConfig.cv
config.device_finger = FtDeviceFingerManager.getDeviceFinger()
config.distribution = AppConfig.distribution
config.isEncryption = AppConfig.IS_ENCRYPT
config.version = AppConfig.version
config.serverUrlConfig = ServerUrlConfig.DEV_SERVER_URL
val provide = object : XDiamondProvide {
override fun sign(str: String?): String? {
if (str == null) return null
return SecretUtil.sign(str)
}
override fun rsaEncrypt(str: String?): String? {
if (str == null) return null
return SecretUtil.rsaEncrypt(str)
}
override fun rsaDecrypt(str: String?): String? {
if (str == null) return null
return SecretUtil.rsaDecrypt(str)
}
override fun aesEncrypt(str: String?): String? {
if (str == null) return null
return SecretUtil.aesEncrypt(str)
}
override fun aesDecrypt(str: String?): String? {
if (str == null) return null
return SecretUtil.aesDecrypt(str)
}
override fun verifySign(src: String?, sign: String?): Boolean {
if (src == null || sign == null) return false
return SecretUtil.verifySign(src, sign)
}
}
XInsight.init(context, AppConfig.appid, BuildConfig.DEBUG, config, provide)
}
/**
* 设置刷新 默认的header和footer
*/
private fun initSmartRefreshLayout() {
//设置全局的Header构建器
SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, layout ->
layout.setPrimaryColorsId(android.R.color.transparent)//全局设置主题颜色
ClassicsHeader(context) //指定为经典Header,默认是 贝塞尔雷达Header
}
//设置全局的Footer构建器
SmartRefreshLayout.setDefaultRefreshFooterCreator { context, layout ->
layout.setEnableLoadMoreWhenContentNotFull(true) //内容不满一页时候启用加载更多
val footer = ClassicsFooter(context)
footer.setBackgroundResource(android.R.color.transparent)
footer.setDrawableSize(20f)
footer.spinnerStyle = SpinnerStyle.FixedBehind //设置为固定在背后模式
footer //指定为经典Footer,默认是 BallPulseFooter
}
}
}
...@@ -5,10 +5,6 @@ import android.app.Application ...@@ -5,10 +5,6 @@ import android.app.Application
open class YdBaseApplication : Application() { open class YdBaseApplication : Application() {
override fun onCreate() {
super.onCreate()
}
companion object { companion object {
lateinit var context: Application lateinit var context: Application
var activityList = ArrayList<Activity>() var activityList = ArrayList<Activity>()
......
package com.yidian.common.utils;
import android.app.Activity;
import android.app.Application;
import android.content.ComponentCallbacks;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.os.Build;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.Animation;
import androidx.annotation.NonNull;
import com.yidian.common.YdBaseApplication;
/**
* 显示相关工具类
*/
public class DisplayUtils {
/**
* 将px值转换为dp值
*/
public static int px2dp(float pxValue) {
final float scale = YdBaseApplication.context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 将dp值转换为px值
*/
public static int dp2px(float dpValue) {
final float scale = YdBaseApplication.context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 将px值转换为sp值
*/
public static int px2sp(float pxValue) {
final float scale = YdBaseApplication.context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / scale + 0.5f);
}
/**
* 将sp值转换为px值
*/
public static int sp2px(float dpValue) {
final float scale = YdBaseApplication.context.getResources().getDisplayMetrics().scaledDensity;
return (int) (dpValue * scale + 0.5f);
}
/**
* 获取屏幕宽度
*/
public static int getScreenWidthPixels(Activity context) {
DisplayMetrics metric = new DisplayMetrics();
context.getWindowManager().getDefaultDisplay().getMetrics(metric);
return metric.widthPixels;
}
public static int getWindowWidth(Context context) {
DisplayMetrics dm = new DisplayMetrics();
WindowManager windowManager = (WindowManager) context.getSystemService(Activity.WINDOW_SERVICE);
if (windowManager != null) {
windowManager.getDefaultDisplay().getMetrics(dm);
return dm.widthPixels;
} else {
return 1080;
}
}
/**
* 获取屏幕高度
*/
public static int getScreenHeightPixels(Activity context) {
DisplayMetrics metric = new DisplayMetrics();
context.getWindowManager().getDefaultDisplay().getMetrics(metric);
return metric.heightPixels;
}
/**
* 将一个view转换成bitmap位图
*
* @param view 要转换的View
* @return view转换的bitmap
*/
public static Bitmap viewToBitmap(View view) {
Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(),
Bitmap.Config.ARGB_8888);
view.draw(new Canvas(bitmap));
return bitmap;
}
/**
* 获取模糊虚化的bitmap
*
* @param context
* @param bitmap 要模糊的图片
* @param radius 模糊等级 >=0 && <=25
* @return
*/
public static Bitmap getBlurBitmap(Context context, Bitmap bitmap, int radius) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
return blurBitmap(context, bitmap, radius);
}
return bitmap;
}
/**
* android系统的模糊方法
*
* @param bitmap 要模糊的图片
* @param radius 模糊等级 >=0 && <=25
*/
public static Bitmap blurBitmap(Context context, Bitmap bitmap, int radius) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
//Let's create an empty bitmap with the same size of the bitmap we want to blur
Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap
.Config.ARGB_8888);
//Instantiate a new Renderscript
RenderScript rs = RenderScript.create(context);
//Create an Intrinsic Blur Script using the Renderscript
ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
//Create the Allocations (in/out) with the Renderscript and the in/out bitmaps
Allocation allIn = Allocation.createFromBitmap(rs, bitmap);
Allocation allOut = Allocation.createFromBitmap(rs, outBitmap);
//Set the radius of the blur
blurScript.setRadius(radius);
//Perform the Renderscript
blurScript.setInput(allIn);
blurScript.forEach(allOut);
//Copy the final bitmap created by the out Allocation to the outBitmap
allOut.copyTo(outBitmap);
//recycle the original bitmap
bitmap.recycle();
//After finishing everything, we destroy the Renderscript.
rs.destroy();
return outBitmap;
} else {
return bitmap;
}
}
private static float sNoncompatDensity;
private static float sNoncompatScaledDensity;
public static void setCustomDenisty(@NonNull Activity activity, @NonNull final Application application) {
final DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();
if (sNoncompatDensity == 0) {
sNoncompatDensity = appDisplayMetrics.density;
sNoncompatScaledDensity = appDisplayMetrics.scaledDensity;
application.registerComponentCallbacks(new ComponentCallbacks() {
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (newConfig != null && newConfig.fontScale > 1) {
sNoncompatScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
}
}
@Override
public void onLowMemory() {
}
});
}
final float targetDensity = appDisplayMetrics.widthPixels / 360;
final float targetScaledDensity = targetDensity * (sNoncompatScaledDensity / sNoncompatDensity);
final int targetDensityDpi = (int) (160 * targetDensity);
appDisplayMetrics.density = targetDensity;
appDisplayMetrics.scaledDensity = targetScaledDensity;
appDisplayMetrics.densityDpi = targetDensityDpi;
final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
activityDisplayMetrics.densityDpi = targetDensityDpi;
activityDisplayMetrics.density = targetDensity;
activityDisplayMetrics.scaledDensity = targetScaledDensity;
}
/**
* 批量设置View的显示和隐藏
*
* @param visibility Modifier: Modified Date: Modify:
*/
public static void setViewVisibility(int visibility, View... views) {
setViewVisibility(visibility, null, views);
}
/**
* 批量设置View的显示和隐藏
*
* @param visibility
* @param animation 使用动画
* @param views
*/
public static void setViewVisibility(int visibility, Animation animation, View... views) {
if (views == null || views.length == 0)
return;
for (View view : views) {
if (view.getVisibility() == visibility)
continue;
if (animation != null) {
view.startAnimation(animation);
}
view.setVisibility(visibility);
}
}
}
...@@ -2,6 +2,7 @@ package com.yidian.common.widget ...@@ -2,6 +2,7 @@ package com.yidian.common.widget
import android.content.Context import android.content.Context
import android.os.Bundle import android.os.Bundle
import android.view.Gravity
import android.view.View import android.view.View
import android.view.WindowManager import android.view.WindowManager
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
...@@ -63,6 +64,7 @@ class CommonHintDialog @JvmOverloads constructor( ...@@ -63,6 +64,7 @@ class CommonHintDialog @JvmOverloads constructor(
attrs?.width = DensityUtil.dp2px(280f) attrs?.width = DensityUtil.dp2px(280f)
attrs?.height = WindowManager.LayoutParams.WRAP_CONTENT attrs?.height = WindowManager.LayoutParams.WRAP_CONTENT
window?.attributes = attrs window?.attributes = attrs
window?.attributes?.gravity = Gravity.CENTER
} }
override fun onClick(v: View?) { override fun onClick(v: View?) {
......
...@@ -34,6 +34,25 @@ ...@@ -34,6 +34,25 @@
<item name="android:windowContentOverlay">@null</item> <item name="android:windowContentOverlay">@null</item>
</style> </style>
<style name="NoTitleDialog" parent="Theme.AppCompat.Light.Dialog">
<!--没有标题-->
<item name="windowNoTitle">true</item>
<!--背景透明-->
<item name="android:windowIsTranslucent">true</item>
<!--是否有覆盖-->
<item name="android:windowContentOverlay">@null</item>
<!--是否浮动-->
<item name="android:windowIsFloating">true</item>
<!--边框-->
<item name="android:windowFrame">@null</item>
<!--背景:透明-->
<item name="android:windowBackground">@android:color/transparent</item>
<!--dialog的整个屏幕的背景是否有遮障层-->
<item name="android:backgroundDimEnabled">true</item>
<item name="android:backgroundDimAmount">0.6</item>
<item name="android:windowCloseOnTouchOutside">false</item>
</style>
<style name="update_dialog" parent="android:style/Theme.Dialog"> <style name="update_dialog" parent="android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item> <item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item> <item name="android:windowNoTitle">true</item>
......
...@@ -13,9 +13,6 @@ ...@@ -13,9 +13,6 @@
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity
android:name=".ui.MainActivity"
android:launchMode="singleTask" />
<activity android:name=".ui.DeepLinkActivity"> <activity android:name=".ui.DeepLinkActivity">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
......
package com.yidian.shenghuoquan.newscontent.app package com.yidian.shenghuoquan.newscontent.app
import android.content.Intent import android.content.Intent
import android.util.Log
import com.yidian.common.XRouterPathConstants import com.yidian.common.XRouterPathConstants
import com.yidian.common.XRouterPathConstants.Companion.CHOOSE_CAREER import com.yidian.common.XRouterPathConstants.Companion.CHOOSE_CAREER
import com.yidian.common.XRouterPathConstants.Companion.CHOOSE_STORE_ACTIVITY import com.yidian.common.XRouterPathConstants.Companion.CHOOSE_STORE_ACTIVITY
...@@ -21,7 +22,6 @@ import com.yidian.common.XRouterPathConstants.Companion.MERCHANT_AUTH_INFO ...@@ -21,7 +22,6 @@ import com.yidian.common.XRouterPathConstants.Companion.MERCHANT_AUTH_INFO
import com.yidian.common.XRouterPathConstants.Companion.MERCHANT_CENTER import com.yidian.common.XRouterPathConstants.Companion.MERCHANT_CENTER
import com.yidian.common.XRouterPathConstants.Companion.MERCHANT_INFO import com.yidian.common.XRouterPathConstants.Companion.MERCHANT_INFO
import com.yidian.common.XRouterPathConstants.Companion.NEWS_CONTENT import com.yidian.common.XRouterPathConstants.Companion.NEWS_CONTENT
import com.yidian.common.XRouterPathConstants.Companion.NEWS_MAIN
import com.yidian.common.XRouterPathConstants.Companion.PERSONAL_ADD_STAFF import com.yidian.common.XRouterPathConstants.Companion.PERSONAL_ADD_STAFF
import com.yidian.common.XRouterPathConstants.Companion.PERSONAL_MANAGER_CHANGE import com.yidian.common.XRouterPathConstants.Companion.PERSONAL_MANAGER_CHANGE
import com.yidian.common.XRouterPathConstants.Companion.PERSONAL_MANAGER_INFO import com.yidian.common.XRouterPathConstants.Companion.PERSONAL_MANAGER_INFO
...@@ -33,6 +33,7 @@ import com.yidian.common.XRouterPathConstants.Companion.STORE_MANAGEMENT ...@@ -33,6 +33,7 @@ import com.yidian.common.XRouterPathConstants.Companion.STORE_MANAGEMENT
import com.yidian.common.XRouterPathConstants.Companion.SUPPORT import com.yidian.common.XRouterPathConstants.Companion.SUPPORT
import com.yidian.common.XRouterPathConstants.Companion.SYSTEM_SETTING import com.yidian.common.XRouterPathConstants.Companion.SYSTEM_SETTING
import com.yidian.common.YdBaseApplication import com.yidian.common.YdBaseApplication
import com.yidian.news.util.DensityUtil
import com.yidian.news.util.ProcessUtil import com.yidian.news.util.ProcessUtil
import com.yidian.nightmode.util.NightModeUtil import com.yidian.nightmode.util.NightModeUtil
import com.yidian.shenghuoquan.newscontent.personnel.ui.* import com.yidian.shenghuoquan.newscontent.personnel.ui.*
...@@ -61,6 +62,7 @@ class NewsContentApplication : YdBaseApplication() { ...@@ -61,6 +62,7 @@ class NewsContentApplication : YdBaseApplication() {
registerXPage() registerXPage()
initService() initService()
NightModeUtil.setContext(this) NightModeUtil.setContext(this)
// 工具类的使用需要先初始化,后续才能用
DensityUtil.init(this) DensityUtil.init(this)
} }
} }
...@@ -79,17 +81,6 @@ class NewsContentApplication : YdBaseApplication() { ...@@ -79,17 +81,6 @@ class NewsContentApplication : YdBaseApplication() {
context.startActivity(intent) context.startActivity(intent)
} }
}), }),
XPageNode(NEWS_MAIN, XPageNodePageType.NATIVE, object : XPageHandler {
override fun handler(params: Map<String, Any?>?) {
val intent = Intent()
if (params != null) {
intent.putExtra(XRouterPathConstants.ParamsKey, params as HashMap)
}
intent.setClass(context, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
}
}),
XPageNode(LOGIN_LIFE_CIRCLE, XPageNodePageType.NATIVE, object : XPageHandler { XPageNode(LOGIN_LIFE_CIRCLE, XPageNodePageType.NATIVE, object : XPageHandler {
override fun handler(params: Map<String, Any?>?) { override fun handler(params: Map<String, Any?>?) {
......
package com.yidian.shenghuoquan.newscontent.ui package com.yidian.shenghuoquan.newscontent.ui
import android.app.AlertDialog
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.view.View
import android.widget.TextView
import com.orhanobut.hawk.Hawk import com.orhanobut.hawk.Hawk
import com.yidian.common.BaseInitConfig
import com.yidian.common.HawkConfig import com.yidian.common.HawkConfig
import com.yidian.common.XRouterPathConstants import com.yidian.common.XRouterPathConstants
import com.yidian.common.XRouterPathConstants.Companion.FLASH import com.yidian.common.XRouterPathConstants.Companion.FLASH
import com.yidian.common.YdBaseApplication
import com.yidian.common.base.BaseActivity import com.yidian.common.base.BaseActivity
import com.yidian.common.services.AppUpgradeService import com.yidian.common.services.AppUpgradeService
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.databinding.ActivityFlashBinding import com.yidian.shenghuoquan.newscontent.databinding.ActivityFlashBinding
import com.yidian.shenghuoquan.newscontent.http.ApiService import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.callback.IGetLifeAccountListCallback import com.yidian.shenghuoquan.newscontent.http.callback.IGetLifeAccountListCallback
...@@ -20,6 +25,8 @@ import com.yidian.yac.core.zap.ZapTicket ...@@ -20,6 +25,8 @@ import com.yidian.yac.core.zap.ZapTicket
class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListCallback { class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListCallback {
private var privacyDialog: AlertDialog? = null
override fun createViewBinding(): ActivityFlashBinding { override fun createViewBinding(): ActivityFlashBinding {
return ActivityFlashBinding.inflate(layoutInflater) return ActivityFlashBinding.inflate(layoutInflater)
} }
...@@ -28,30 +35,86 @@ class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListC ...@@ -28,30 +35,86 @@ class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListC
return FLASH return FLASH
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onResume() {
super.onCreate(savedInstanceState) super.onResume()
launcher() checkPrivacyIsAgreed()
// getPermissions()
} }
private fun launcher() { /**
val isAgree = Hawk.get(HawkConfig.ProtocolIsAgree, true) * 检查隐私协议是否同意
*/
private fun checkPrivacyIsAgreed() {
val isAgree = Hawk.get(HawkConfig.ProtocolIsAgree, false)
if (isAgree) { if (isAgree) {
val loginStatus = Hawk.get(HawkConfig.LoginStatus, false) toLoginOrHome()
if (loginStatus) { } else {
// 已登录 请求生活号列表 showPrivacyDialog()
ApiService.getLifeAccountList(this) }
} else { }
// 未登录 跳转登录
// 此处没有使用XPage打开页面 原因:不能设置flag /**
startActivity(Intent(this, LoginLifeCircleActivity::class.java)) * 进登录页或首页
finish() */
// 检查app更新 private fun toLoginOrHome() {
ZapTicket(AppUpgradeService.SERVICE_NAME).withAction(AppUpgradeService.ACTION_CHECK_APP_UPGRADE).ship() // 先执行剩余的初始化任务
} BaseInitConfig.performInitialization(YdBaseApplication.context)
// 判断往哪里走
val loginStatus = Hawk.get(HawkConfig.LoginStatus, false)
if (loginStatus) {
// 已登录 请求生活号列表
ApiService.getLifeAccountList(this)
} else {
// 未登录 跳转登录
// 此处没有使用XPage打开页面 原因:不能设置flag
startActivity(Intent(this, LoginLifeCircleActivity::class.java))
finish()
// 检查app更新
ZapTicket(AppUpgradeService.SERVICE_NAME).withAction(AppUpgradeService.ACTION_CHECK_APP_UPGRADE).ship()
} }
} }
/**
* 显示隐私弹框
*/
private fun showPrivacyDialog() {
val builder = AlertDialog.Builder(this, R.style.NoTitleDialog)
val updateDialog = View.inflate(this, R.layout.dialog_privacy, null)
val tvContent = updateDialog.findViewById<TextView>(R.id.tv_update_content)
val btnCancel = updateDialog.findViewById<TextView>(R.id.tv_cancel)
val btnEnsure = updateDialog.findViewById<TextView>(R.id.tv_sure)
builder.setView(updateDialog)
builder.setCancelable(false)
builder.create()
// 取消按钮
btnCancel.setOnClickListener {
dismissPrivacyDialog()
this.finish()
}
// 确定按钮
btnEnsure.setOnClickListener {
dismissPrivacyDialog()
// 同意则执行剩余的初始化并进入登录或首页
Hawk.put(HawkConfig.ProtocolIsAgree, true)
toLoginOrHome()
}
builder.show()
}
/**
* 关闭弹框
*/
private fun dismissPrivacyDialog() {
if (privacyDialog != null && privacyDialog!!.isShowing) {
privacyDialog!!.dismiss()
privacyDialog = null
}
}
override fun onPause() {
super.onPause()
dismissPrivacyDialog()
}
override fun getLifeAccountListSuccess(result: ArrayList<LifeAccountItemBean.Response>?) { override fun getLifeAccountListSuccess(result: ArrayList<LifeAccountItemBean.Response>?) {
when (result?.size) { when (result?.size) {
0 -> { 0 -> {
...@@ -101,22 +164,4 @@ class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListC ...@@ -101,22 +164,4 @@ class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListC
} }
// 因为市场审核,不能在用户未同意用户协议之前申请权限
// private fun getPermissions() {
// val rxPermissions = RxPermissions(this)
// rxPermissions.request(
// Manifest.permission.ACCESS_COARSE_LOCATION,
// Manifest.permission.ACCESS_FINE_LOCATION,
// Manifest.permission.READ_EXTERNAL_STORAGE,
// Manifest.permission.READ_PHONE_STATE,
// )
// .subscribe {
// if (it) {
// launcher()
// } else {
// DialogUtils.showPermissionDialog(this, "需要电话、存储、位置")
// }
// }
// }
} }
package com.yidian.shenghuoquan.newscontent.ui
import android.Manifest
import android.content.Intent
import android.os.Bundle
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.orhanobut.hawk.Hawk
import com.tbruyelle.rxpermissions3.RxPermissions
import com.yidian.common.AppConfig
import com.yidian.common.HawkConfig
import com.yidian.common.XRouterPathConstants
import com.yidian.common.XRouterPathConstants.Companion.NEWS_MAIN
import com.yidian.common.YdBaseApplication
import com.yidian.common.base.BaseActivity
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.audio.AudioService
import com.yidian.shenghuoquan.newscontent.bean.FeedbackBean
import com.yidian.shenghuoquan.newscontent.databinding.ActivityMainBinding
import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.httpbean.PushTokenAndroidBean
import com.yidian.shenghuoquan.newscontent.service.DeepLinkService
import com.yidian.shenghuoquan.newscontent.service.UniversalService
import com.yidian.shenghuoquan.newscontent.ui.popwindow.FeedbackPopupWindow
import com.yidian.common.utils.ToolsUtil
import com.yidian.utils.ToastUtil
import com.yidian.xarc.xbase.utils.XLogger
import com.yidian.xarc.xevent.XBaseEvent
import com.yidian.xarc.xevent.XEventManager
import com.yidian.xpage.XPageManager
import com.yidian.yac.core.zap.ZapTicket
import com.yidian.yac.ftdevicefinger.core.FtDeviceFingerManager
import com.yidian.yac.pm.appupdate.AppUpdateEchoData
import com.yidian.yac.pm.appupdate.AppUpdateInfo
import com.yidian.yac.pm.appupdate.PmUpdateApp
import com.yidian.yac.pm.appupdate.YDAppUpdateManager
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import org.json.JSONObject
class MainActivity : BaseActivity<ActivityMainBinding>() {
override fun getXPageName(): String {
return NEWS_MAIN
}
override fun createViewBinding(): ActivityMainBinding {
return ActivityMainBinding.inflate(layoutInflater)
}
override fun init(savedInstanceState: Bundle?) {
super.init(savedInstanceState)
XEventManager.register(this)
getIntentData(intent)
getPermissions()
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
getIntentData(intent)
}
private fun getIntentData(intent: Intent?) {
val paramsMap = intent?.getSerializableExtra(XRouterPathConstants.ParamsKey)
if (paramsMap != null) {
paramsMap as HashMap<String, Any?>
when(paramsMap["jumpFrom"]){
"DeepLink" -> {
val paramsJson = JSONObject(paramsMap["deepData"] as String)
ZapTicket(DeepLinkService.serviceName).withAction(DeepLinkService.serviceName).withServiceParams(paramsJson).onResult {
}.onLost {
}.ship()
}
"PushJump" -> {
XPageManager.push(XRouterPathConstants.NEWS_CONTENT, paramsMap)
}
}
}
}
private fun getPermissions() {
val rxPermissions = RxPermissions(this)
rxPermissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE)
.subscribe {
if (it) {
initUpdateManage()
checkUpdate()
bindPushToken()
} else {
ToastUtil.showToast(this, "请在设置里同意读取存储卡权限")
}
}
}
private fun initUpdateManage() {
val logger = XLogger("apkupdate")
logger.debugOn(true)
YDAppUpdateManager.init(PmUpdateApp(YdBaseApplication.context) {
online = false//线上true、线下false
platformId = 27//平台Id需要申请
platform = "Android"//ios/Androiid
appId = "com.yidian.subway"//应用包名
appVersion = AppConfig.cv//客户端版本号
deviceFinger = FtDeviceFingerManager.getDeviceFinger()//设备指纹
androidChannel = AppConfig.distribution//渠道
this.logger = logger.subLogger("apkupdate")
})
}
private fun checkUpdate() {
val jsonObject = JSONObject()
ZapTicket(UniversalService.serviceName).withAction("checkNewVersion").withServiceParams(jsonObject).withServiceOptions(jsonObject).onResult {
val updateInfo = Gson().fromJson<AppUpdateInfo<AppUpdateEchoData>>(it.result.toString(), object : TypeToken<AppUpdateInfo<AppUpdateEchoData>>() {}.type)
compareVersion(updateInfo)
}.ship()
}
private fun compareVersion(updateInfo: AppUpdateInfo<AppUpdateEchoData>) {
if (updateInfo.hasUpdate) {
val forceUpdate = updateInfo.echo_data?.force_update
if (forceUpdate == true) {
val jsonObject = JSONObject()
ZapTicket(UniversalService.serviceName).withAction("popNewVersion")
.withServiceParams(jsonObject).withServiceOptions(jsonObject).ship()
}
}
}
private fun bindPushToken() {
val encryptionToken = ToolsUtil.getYDEncryptionToken()
val pushLevel = AppConfig.PUSH_LEVEL+ToolsUtil.getDeviceBrandMask()
if (null != Hawk.get<String>(HawkConfig.UmToken)) {
val requestParams = HashMap<String, String?>()
requestParams["old_token"] = ""
requestParams["new_token"] = encryptionToken
requestParams["personalRec"] = "1"
requestParams["enable"] = "1"
requestParams["push_key"] = Hawk.get(HawkConfig.UmToken)
requestParams["push_level"] = pushLevel.toString()
ApiService.pushTokenAndroid(requestParams)
}
}
override fun onDestroy() {
super.onDestroy()
//音频的生命周期与MainActivity绑定,当activity销毁时停止播放音频
stopService(Intent(this, AudioService::class.java))
XEventManager.unRegister(this)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == 1) {
ToastUtil.showToast(this, data?.getStringExtra("token"))
}
}
@Subscribe(sticky = false, threadMode = ThreadMode.MAIN)
fun onEvent(event: XBaseEvent?) {
when (event?.name) {
"loginStatus" -> Hawk.put(HawkConfig.LoginStatus, true)
}
}
}
\ No newline at end of file
...@@ -3,10 +3,12 @@ package com.yidian.shenghuoquan.newscontent.ui.setting ...@@ -3,10 +3,12 @@ package com.yidian.shenghuoquan.newscontent.ui.setting
import android.os.Bundle import android.os.Bundle
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.orhanobut.hawk.Hawk import com.orhanobut.hawk.Hawk
import com.yidian.common.AppConfig
import com.yidian.common.HawkConfig import com.yidian.common.HawkConfig
import com.yidian.common.XRouterPathConstants import com.yidian.common.XRouterPathConstants
import com.yidian.common.XRouterPathConstants.Companion.SYSTEM_SETTING import com.yidian.common.XRouterPathConstants.Companion.SYSTEM_SETTING
import com.yidian.common.base.BaseActivity import com.yidian.common.base.BaseActivity
import com.yidian.common.extensions.clickAntiShake
import com.yidian.common.extensions.initTitleBar import com.yidian.common.extensions.initTitleBar
import com.yidian.common.services.AppUpgradeService import com.yidian.common.services.AppUpgradeService
import com.yidian.common.utils.SystemSettingUtils import com.yidian.common.utils.SystemSettingUtils
...@@ -15,6 +17,7 @@ import com.yidian.shenghuoquan.newscontent.bean.HintOptionBean ...@@ -15,6 +17,7 @@ import com.yidian.shenghuoquan.newscontent.bean.HintOptionBean
import com.yidian.shenghuoquan.newscontent.databinding.ActivitySystemSettingBinding import com.yidian.shenghuoquan.newscontent.databinding.ActivitySystemSettingBinding
import com.yidian.shenghuoquan.newscontent.http.ApiService import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.callback.IUserLogoutCallBack import com.yidian.shenghuoquan.newscontent.http.callback.IUserLogoutCallBack
import com.yidian.shenghuoquan.newscontent.ui.ProtocolActivity
import com.yidian.shenghuoquan.newscontent.ui.dialog.HintDialog import com.yidian.shenghuoquan.newscontent.ui.dialog.HintDialog
import com.yidian.shenghuoquan.newscontent.utils.SensitiveInfoUtil import com.yidian.shenghuoquan.newscontent.utils.SensitiveInfoUtil
import com.yidian.utils.ToastUtil import com.yidian.utils.ToastUtil
...@@ -53,19 +56,35 @@ class SystemSettingActivity : BaseActivity<ActivitySystemSettingBinding>() { ...@@ -53,19 +56,35 @@ class SystemSettingActivity : BaseActivity<ActivitySystemSettingBinding>() {
private fun initClick() { private fun initClick() {
// 通知设置 // 通知设置
viewBind.clNotice.setOnClickListener { viewBind.clNotice.clickAntiShake {
SystemSettingUtils.openNotifySetting(this) SystemSettingUtils.openNotifySetting(this)
} }
// 退出登录 // 退出登录
viewBind.tvLogout.setOnClickListener { viewBind.tvLogout.clickAntiShake {
showConfirmDialog() showConfirmDialog()
} }
// 检查app更新 // 检查app更新
viewBind.clCheckUpgrade.setOnClickListener { viewBind.clCheckUpgrade.clickAntiShake {
ZapTicket(AppUpgradeService.SERVICE_NAME).withAction(AppUpgradeService.ACTION_CHECK_APP_UPGRADE).onResult { ZapTicket(AppUpgradeService.SERVICE_NAME).withAction(AppUpgradeService.ACTION_CHECK_APP_UPGRADE).onResult {
if (it.code != 0) ToastUtil.showToast(this, it.tips) if (it.code != 0) ToastUtil.showToast(this, it.tips)
}.ship() }.ship()
} }
// 用户协议
viewBind.clProtocol.clickAntiShake {
val urlMap = HashMap<String, String>()
urlMap[ProtocolActivity.ProtocolUrlKey] = AppConfig.userProtocol
XPageManager.push(XRouterPathConstants.PROTOCOL, urlMap)
}
// 隐私政策
viewBind.clPrivacy.clickAntiShake {
val urlMap = HashMap<String, String>()
urlMap[ProtocolActivity.ProtocolUrlKey] = AppConfig.privacyPolicyStatement
XPageManager.push(XRouterPathConstants.PROTOCOL, urlMap)
}
// 意见反馈
viewBind.clFeedback.clickAntiShake {
ToastUtil.showToast(this, "没事别瞎逼逼啊")
}
} }
private fun showConfirmDialog() { private fun showConfirmDialog() {
......
<?xml version="1.0" encoding="utf-8"?>
<com.yidian.nightmode.widget.YdFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:fitsSystemWindows="true"/>
...@@ -81,6 +81,93 @@ ...@@ -81,6 +81,93 @@
<View style="@style/cut_off_line_style" /> <View style="@style/cut_off_line_style" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_protocol"
android:layout_width="match_parent"
android:layout_height="@dimen/dp60">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="用户协议"
android:textColor="@color/color_333333"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:layout_width="@dimen/dp24"
android:layout_height="@dimen/dp24"
android:src="@mipmap/icon_next"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View style="@style/cut_off_line_style" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_privacy"
android:layout_width="match_parent"
android:layout_height="@dimen/dp60">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="隐私政策"
android:textColor="@color/color_333333"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:layout_width="@dimen/dp24"
android:layout_height="@dimen/dp24"
android:src="@mipmap/icon_next"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View style="@style/cut_off_line_style" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_feedback"
android:layout_width="match_parent"
android:layout_height="@dimen/dp60">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="意见反馈"
android:textColor="@color/color_333333"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:layout_width="@dimen/dp24"
android:layout_height="@dimen/dp24"
android:src="@mipmap/icon_next"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View style="@style/cut_off_line_style" />
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_check_upgrade" android:id="@+id/cl_check_upgrade"
android:layout_width="match_parent" android:layout_width="match_parent"
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/transparent"
android:gravity="center"
android:orientation="vertical">
<LinearLayout
android:layout_width="275dp"
android:layout_height="109dp"
android:background="@drawable/icon_life_account_select"
android:orientation="vertical"
android:paddingStart="15dp"
android:paddingTop="15dp"
android:paddingEnd="15dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="隐私协议声明"
android:textColor="@color/color_333333"
android:textSize="14sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="275dp"
android:layout_height="wrap_content"
android:background="@drawable/shape_person_bg"
android:orientation="vertical"
android:paddingStart="15dp"
android:paddingEnd="15dp"
android:paddingBottom="15dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="新版本说明:"
android:textColor="#292626"
android:textSize="14sp" />
<TextView
android:id="@+id/tv_update_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="1.优化首页按钮、地址导航标题地址导航\n2.首页按钮导航标题地址导航"
android:textColor="@color/color_333333"
android:textSize="14sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp10"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_cancel"
android:layout_width="105dp"
android:layout_height="27dp"
android:gravity="center"
android:text="取消"
android:textColor="#03A9F4"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_sure"
android:layout_width="105dp"
android:layout_height="27dp"
android:gravity="center"
android:text="同意"
android:textColor="#03A9F4"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
\ No newline at end of file
...@@ -5,11 +5,6 @@ import android.content.Context ...@@ -5,11 +5,6 @@ import android.content.Context
import android.content.res.Configuration import android.content.res.Configuration
import android.os.Bundle import android.os.Bundle
import com.orhanobut.hawk.Hawk import com.orhanobut.hawk.Hawk
import com.scwang.smart.refresh.footer.ClassicsFooter
import com.scwang.smart.refresh.header.ClassicsHeader
import com.scwang.smart.refresh.layout.SmartRefreshLayout
import com.scwang.smart.refresh.layout.constant.SpinnerStyle
import com.yidian.common.AppConfig
import com.yidian.common.YdBaseApplication import com.yidian.common.YdBaseApplication
import com.yidian.common.http.ApiSaveCookiesInterceptor import com.yidian.common.http.ApiSaveCookiesInterceptor
import com.yidian.common.http.ApiSetCookiesInterceptor import com.yidian.common.http.ApiSetCookiesInterceptor
...@@ -18,25 +13,12 @@ import com.yidian.common.services.ImageService ...@@ -18,25 +13,12 @@ import com.yidian.common.services.ImageService
import com.yidian.common.services.XEventService import com.yidian.common.services.XEventService
import com.yidian.common.services.XPageService import com.yidian.common.services.XPageService
import com.yidian.common.services.http.MBHttpReqService import com.yidian.common.services.http.MBHttpReqService
import com.yidian.common.utils.UMConfigUtils
import com.yidian.commonutil.CommonUtilLifecycleModule import com.yidian.commonutil.CommonUtilLifecycleModule
import com.yidian.framework.mobile.insight.config.ServerUrlConfig
import com.yidian.framework.mobile.insight.config.XDiamondProvide
import com.yidian.framework.mobile.insight.manage.XInsight
import com.yidian.framework.mobile.insight.manage.XInsightConfig
import com.yidian.framework.mobile.xdiamond.SecretUtil
import com.yidian.http.ServiceFactory import com.yidian.http.ServiceFactory
import com.yidian.news.util.ProcessUtil import com.yidian.news.util.ProcessUtil
import com.yidian.xarc.xbase.utils.XLogger
import com.yidian.xarc.xbrid.*
import com.yidian.xpage.XPageManager import com.yidian.xpage.XPageManager
import com.yidian.yac.core.core.YacAppSpec import com.yidian.yac.core.core.YacAppSpec
import com.yidian.yac.core.zap.Zap import com.yidian.yac.core.zap.Zap
import com.yidian.yac.core.zap.ZapTicket
import com.yidian.yac.ftdevicefinger.core.FtDeviceFingerManager
import com.yidian.yac.pm.appupdate.PmUpdateApp
import com.yidian.yac.pm.appupdate.YDAppUpdateManager
import org.json.JSONObject
import timber.log.Timber import timber.log.Timber
...@@ -46,48 +28,16 @@ class YdSubwayApplication : YdBaseApplication() { ...@@ -46,48 +28,16 @@ class YdSubwayApplication : YdBaseApplication() {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
if (ProcessUtil.isMainProcess(this)) { if (ProcessUtil.isMainProcess(this)) {
Timber.tag("启动").e("onCreate 开始执行")
context = this context = this
// 先初始化日志防止调用时报初始化异常 // 先初始化日志防止调用时报初始化异常
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree()) Timber.plant(Timber.DebugTree())
} }
UMConfigUtils.init(this)
FtDeviceFingerManager.init(this)
initCommonUtils() initCommonUtils()
Zap.init(this) {} Zap.init(this) {}
XPageManager.init(this) XPageManager.init(this)
initXBridManager()
loadService() loadService()
registerActivityLifecycleCallbacks(activityLifecycle) registerActivityLifecycleCallbacks(activityLifecycle)
// 初始化磐石SDK
SecretUtil.init(BuildConfig.IS_ENCRYPT_DEBUG_KEY, BuildConfig.DEBUG)
// 初始化App升级
initAppUpgrade()
initSmartRefreshLayout()
// 初始化慧眼
initXInsight()
Timber.tag("启动").e("onCreate 执行完成")
}
}
/**
* 设置刷新 默认的header和footer
*/
private fun initSmartRefreshLayout() {
//设置全局的Header构建器
SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, layout ->
layout.setPrimaryColorsId(android.R.color.transparent)//全局设置主题颜色
ClassicsHeader(context) //指定为经典Header,默认是 贝塞尔雷达Header
}
//设置全局的Footer构建器
SmartRefreshLayout.setDefaultRefreshFooterCreator { context, layout ->
layout.setEnableLoadMoreWhenContentNotFull(true) //内容不满一页时候启用加载更多
val footer = ClassicsFooter(context)
footer.setBackgroundResource(android.R.color.transparent)
footer.setDrawableSize(20f)
footer.spinnerStyle = SpinnerStyle.FixedBehind //设置为固定在背后模式
footer //指定为经典Footer,默认是 BallPulseFooter
} }
} }
...@@ -163,72 +113,6 @@ class YdSubwayApplication : YdBaseApplication() { ...@@ -163,72 +113,6 @@ class YdSubwayApplication : YdBaseApplication() {
} }
/**
* 初始化XBrid
*
* 注意:
* 1.如果有多个xbrid资源时,请分别进行注册,区分assetRoot名称,否则打包后出现文件丢失加载失败
* 2.更新assert文件后不生效,可以卸载重新安装
*/
private fun initXBridManager() {
XBridManager.init(
XBridApp(applicationContext) {
online = BuildConfig.IS_UPGRADE_ONLINE // 线上、线下
assetRoot = "www/src"//对应assets目录下存放xbrid资源对应的目录名
appId = applicationContext.packageName //当前应用包名
platformId = AppConfig.TowerProXBridUpgradePlatformId //需要去平台申请
appVersion = AppConfig.cv//当前应用版本号
deviceFinger = FtDeviceFingerManager.getDeviceFinger()//设备指纹
androidChannel = AppConfig.distribution//对应渠道名
}, 20//webview缓存池数量,默认不缓存
)
XBridManager.registerServiceInvoker(object : OnServiceInvoke {
override fun onCall(
identifier: String, // the identifier assigned when webview created
xWebView: XWebView, // webivew 加载的 js 发起的服务调用请求
request: Request, // 具体的服务请求参数,分为 name 和 params 两个部分
response: Response // 业务方需要借助 response 来回应服务调用结果
) {
val data = request.params as JSONObject
// JS调用Native传递的数据
Timber.tag("xbrid").e("服务名:%s", request.name)
Timber.tag("xbrid").e("JS传递参数:%s", data)
val action = data.optString("action")
val params = data.optJSONObject("params")
val options = data.optJSONObject("options")
// 发送JS传递的数据到Service,并监听服务返回的结果回传JS
ZapTicket(request.name).withAction(action).withServiceParams(params).withServiceOptions(options).withIdentifier(identifier)
.onResult { result ->
Timber.tag("xbrid").e("回传JS的结果码: ${result.code} + 结果信息: ${result.result}")
response.result(result.code, result.result ?: "", "")
}.onLost { result ->
Timber.tag("xbrid").e("回传JS的错误码: ${result.code} + 错误信息: ${result.mesg}")
response.result(result.code, "", result.mesg)
}.ship()
}
})
XBridManager.registerXPageInvoker(object : OnXPageInvoke {
override fun onCall(identifier: String, xWebView: XWebView, request: XPageRequest) {
val params = mutableMapOf<String, Any>()
(request.params as JSONObject).let { reParams ->
reParams.keys().forEach {
params[it] = reParams[it]
}
}
when (request.action) {
"push" -> XPageManager.push(request.name, params)
"pop" -> XPageManager.pop(params)
"popTo" -> XPageManager.popTo(request.name, params)
"popToRoot" -> XPageManager.popToRoot(params)
}
}
})
}
private fun loadService() { private fun loadService() {
Zap.addService(XPageService.SERVICE_NAME, XPageService()) Zap.addService(XPageService.SERVICE_NAME, XPageService())
Zap.addService(XEventService.SERVICE_NAME, XEventService()) Zap.addService(XEventService.SERVICE_NAME, XEventService())
...@@ -237,68 +121,4 @@ class YdSubwayApplication : YdBaseApplication() { ...@@ -237,68 +121,4 @@ class YdSubwayApplication : YdBaseApplication() {
Zap.addService(ImageService.SERVICE_NAME, ImageService()) Zap.addService(ImageService.SERVICE_NAME, ImageService())
} }
/**
* App升级
*/
private fun initAppUpgrade() {
val logger = XLogger("appUpgrade")
logger.debugOn(BuildConfig.DEBUG)
YDAppUpdateManager.init(PmUpdateApp(this) {
online = BuildConfig.IS_UPGRADE_ONLINE // 线上true、线下false
platformId = AppConfig.TowerProAppUpgradePlatformId // 平台Id
platform = AppConfig.TowerProPlatform // ios/Android
appId = packageName // 应用包名
appVersion = AppConfig.cv // 客户端版本号
deviceFinger = FtDeviceFingerManager.getDeviceFinger() // 设备指纹
androidChannel = AppConfig.distribution // 渠道
this.logger = logger.subLogger("appUpgrade")
})
}
/**
* 慧眼
*/
private fun initXInsight() {
val config = XInsightConfig()
config.cv = AppConfig.cv
config.device_finger = FtDeviceFingerManager.getDeviceFinger()
config.distribution = AppConfig.distribution
config.isEncryption = AppConfig.IS_ENCRYPT
config.version = AppConfig.version
config.serverUrlConfig = ServerUrlConfig.DEV_SERVER_URL
val provide = object : XDiamondProvide {
override fun sign(str: String?): String? {
if (str == null) return null
return SecretUtil.sign(str)
}
override fun rsaEncrypt(str: String?): String? {
if (str == null) return null
return SecretUtil.rsaEncrypt(str)
}
override fun rsaDecrypt(str: String?): String? {
if (str == null) return null
return SecretUtil.rsaDecrypt(str)
}
override fun aesEncrypt(str: String?): String? {
if (str == null) return null
return SecretUtil.aesEncrypt(str)
}
override fun aesDecrypt(str: String?): String? {
if (str == null) return null
return SecretUtil.aesDecrypt(str)
}
override fun verifySign(src: String?, sign: String?): Boolean {
if (src == null || sign == null) return false
return SecretUtil.verifySign(src, sign)
}
}
XInsight.init(this, AppConfig.appid, BuildConfig.DEBUG, config, provide)
}
} }
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.megvii.idcard.quality">
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true">
<activity
android:name="com.megvii.demo.activity.IDCardDetectActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTask"
android:screenOrientation="portrait" />
</application>
</manifest>
\ 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