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
app/debug
app/release
idcard_quality/build
Components/xbirdbusiness/build
app/debug
app/release
......@@ -18,6 +18,8 @@ android {
targetSdkVersion build_versions.targetSdkVersion
versionCode rootProject.ext.android.versionCode
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("boolean", "IS_ENCRYPT", rootProject.ext.android.isEncrypt)
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
open class YdBaseApplication : Application() {
override fun onCreate() {
super.onCreate()
}
companion object {
lateinit var context: Application
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
import android.content.Context
import android.os.Bundle
import android.view.Gravity
import android.view.View
import android.view.WindowManager
import androidx.core.content.ContextCompat
......@@ -63,6 +64,7 @@ class CommonHintDialog @JvmOverloads constructor(
attrs?.width = DensityUtil.dp2px(280f)
attrs?.height = WindowManager.LayoutParams.WRAP_CONTENT
window?.attributes = attrs
window?.attributes?.gravity = Gravity.CENTER
}
override fun onClick(v: View?) {
......
......@@ -34,6 +34,25 @@
<item name="android:windowContentOverlay">@null</item>
</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">
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
......
......@@ -13,9 +13,6 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.MainActivity"
android:launchMode="singleTask" />
<activity android:name=".ui.DeepLinkActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
......
package com.yidian.shenghuoquan.newscontent.app
import android.content.Intent
import android.util.Log
import com.yidian.common.XRouterPathConstants
import com.yidian.common.XRouterPathConstants.Companion.CHOOSE_CAREER
import com.yidian.common.XRouterPathConstants.Companion.CHOOSE_STORE_ACTIVITY
......@@ -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_INFO
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_MANAGER_CHANGE
import com.yidian.common.XRouterPathConstants.Companion.PERSONAL_MANAGER_INFO
......@@ -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.SYSTEM_SETTING
import com.yidian.common.YdBaseApplication
import com.yidian.news.util.DensityUtil
import com.yidian.news.util.ProcessUtil
import com.yidian.nightmode.util.NightModeUtil
import com.yidian.shenghuoquan.newscontent.personnel.ui.*
......@@ -61,6 +62,7 @@ class NewsContentApplication : YdBaseApplication() {
registerXPage()
initService()
NightModeUtil.setContext(this)
// 工具类的使用需要先初始化,后续才能用
DensityUtil.init(this)
}
}
......@@ -79,17 +81,6 @@ class NewsContentApplication : YdBaseApplication() {
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 {
override fun handler(params: Map<String, Any?>?) {
......
package com.yidian.shenghuoquan.newscontent.ui
import android.app.AlertDialog
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.TextView
import com.orhanobut.hawk.Hawk
import com.yidian.common.BaseInitConfig
import com.yidian.common.HawkConfig
import com.yidian.common.XRouterPathConstants
import com.yidian.common.XRouterPathConstants.Companion.FLASH
import com.yidian.common.YdBaseApplication
import com.yidian.common.base.BaseActivity
import com.yidian.common.services.AppUpgradeService
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.databinding.ActivityFlashBinding
import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.callback.IGetLifeAccountListCallback
......@@ -20,6 +25,8 @@ import com.yidian.yac.core.zap.ZapTicket
class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListCallback {
private var privacyDialog: AlertDialog? = null
override fun createViewBinding(): ActivityFlashBinding {
return ActivityFlashBinding.inflate(layoutInflater)
}
......@@ -28,15 +35,30 @@ class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListC
return FLASH
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
launcher()
// getPermissions()
override fun onResume() {
super.onResume()
checkPrivacyIsAgreed()
}
private fun launcher() {
val isAgree = Hawk.get(HawkConfig.ProtocolIsAgree, true)
/**
* 检查隐私协议是否同意
*/
private fun checkPrivacyIsAgreed() {
val isAgree = Hawk.get(HawkConfig.ProtocolIsAgree, false)
if (isAgree) {
toLoginOrHome()
} else {
showPrivacyDialog()
}
}
/**
* 进登录页或首页
*/
private fun toLoginOrHome() {
// 先执行剩余的初始化任务
BaseInitConfig.performInitialization(YdBaseApplication.context)
// 判断往哪里走
val loginStatus = Hawk.get(HawkConfig.LoginStatus, false)
if (loginStatus) {
// 已登录 请求生活号列表
......@@ -50,6 +72,47 @@ class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListC
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>?) {
......@@ -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
import android.os.Bundle
import androidx.core.content.ContextCompat
import com.orhanobut.hawk.Hawk
import com.yidian.common.AppConfig
import com.yidian.common.HawkConfig
import com.yidian.common.XRouterPathConstants
import com.yidian.common.XRouterPathConstants.Companion.SYSTEM_SETTING
import com.yidian.common.base.BaseActivity
import com.yidian.common.extensions.clickAntiShake
import com.yidian.common.extensions.initTitleBar
import com.yidian.common.services.AppUpgradeService
import com.yidian.common.utils.SystemSettingUtils
......@@ -15,6 +17,7 @@ import com.yidian.shenghuoquan.newscontent.bean.HintOptionBean
import com.yidian.shenghuoquan.newscontent.databinding.ActivitySystemSettingBinding
import com.yidian.shenghuoquan.newscontent.http.ApiService
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.utils.SensitiveInfoUtil
import com.yidian.utils.ToastUtil
......@@ -53,19 +56,35 @@ class SystemSettingActivity : BaseActivity<ActivitySystemSettingBinding>() {
private fun initClick() {
// 通知设置
viewBind.clNotice.setOnClickListener {
viewBind.clNotice.clickAntiShake {
SystemSettingUtils.openNotifySetting(this)
}
// 退出登录
viewBind.tvLogout.setOnClickListener {
viewBind.tvLogout.clickAntiShake {
showConfirmDialog()
}
// 检查app更新
viewBind.clCheckUpgrade.setOnClickListener {
viewBind.clCheckUpgrade.clickAntiShake {
ZapTicket(AppUpgradeService.SERVICE_NAME).withAction(AppUpgradeService.ACTION_CHECK_APP_UPGRADE).onResult {
if (it.code != 0) ToastUtil.showToast(this, it.tips)
}.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() {
......
<?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 @@
<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
android:id="@+id/cl_check_upgrade"
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
import android.content.res.Configuration
import android.os.Bundle
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.http.ApiSaveCookiesInterceptor
import com.yidian.common.http.ApiSetCookiesInterceptor
......@@ -18,25 +13,12 @@ import com.yidian.common.services.ImageService
import com.yidian.common.services.XEventService
import com.yidian.common.services.XPageService
import com.yidian.common.services.http.MBHttpReqService
import com.yidian.common.utils.UMConfigUtils
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.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.core.YacAppSpec
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
......@@ -46,48 +28,16 @@ class YdSubwayApplication : YdBaseApplication() {
override fun onCreate() {
super.onCreate()
if (ProcessUtil.isMainProcess(this)) {
Timber.tag("启动").e("onCreate 开始执行")
context = this
// 先初始化日志防止调用时报初始化异常
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
}
UMConfigUtils.init(this)
FtDeviceFingerManager.init(this)
initCommonUtils()
Zap.init(this) {}
XPageManager.init(this)
initXBridManager()
loadService()
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() {
}
/**
* 初始化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() {
Zap.addService(XPageService.SERVICE_NAME, XPageService())
Zap.addService(XEventService.SERVICE_NAME, XEventService())
......@@ -237,68 +121,4 @@ class YdSubwayApplication : YdBaseApplication() {
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