diff --git a/app/build.gradle b/app/build.gradle index 661e259..99ffb5b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,7 @@ android { buildTypes { release { buildConfigField("String", "url", "\"${url.release_url}\"") + buildConfigField("String","h5url","\"${url.h5_release_url}\"") buildConfigField("String", "image_prefix","\"${imagePrefix.release_url}\"") buildConfigField("Boolean","isRelease",String.valueOf(true)) minifyEnabled false @@ -78,6 +79,7 @@ android { } debug { buildConfigField("String", "url", "\"${url.debug_url}\"") + buildConfigField("String","h5url","\"${url.h5_debug_url}\"") buildConfigField("Boolean","isRelease",String.valueOf(false)) buildConfigField("String", "image_prefix","\"${imagePrefix.debug_url}\"") signingConfig signingConfigs.release diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 91ab262..e2b446e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -325,7 +325,12 @@ android:name="com.xty.common.xqr_code.XQRCodeAct" android:launchMode="singleTop" android:screenOrientation="portrait"/> + + () { finish() } - binding.tvContent.text = "1.注意事项、操作指南文案。平台能通过照片分析出大部分食物、水果蔬菜、菜品。上传更清晰完整的照片,分析结果更准确。" + - "\n2.平台能通过照片分析出大部分食物、水果蔬菜、菜品。\n" + - "3.上传更清晰完整的招聘,分析结果更准确。平台能通过照片分析出大部分食物。\n" + - "4.上传更清晰完整的照片,分析结果更准确。平台能通过照片分析出大部分食物、水果蔬菜、菜品。\n" + - "5.上传更清晰完整的招聘,分析结果更准确。平台能通过照片分析出大部分食物、水果蔬菜、菜品。上传更清晰完整的招聘,分析结果更准确。\n" - binding.tvDishes.setOnClickListener { bottomSheetDialog?.show() type = "1" diff --git a/app/src/main/java/com/zj365/dc/activity/DietManagementAct.kt b/app/src/main/java/com/zj365/dc/activity/DietManagementAct.kt index 679b87d..d7add37 100644 --- a/app/src/main/java/com/zj365/dc/activity/DietManagementAct.kt +++ b/app/src/main/java/com/zj365/dc/activity/DietManagementAct.kt @@ -6,6 +6,8 @@ import com.xty.base.act.BaseVmAct import com.xty.base.vm.BaseVm import com.xty.common.arouter.ARouterUrl import com.xty.common.arouter.RouteManager +import com.xty.common.util.CommonToastUtils +import com.zj365.dc.BuildConfig import com.zj365.dc.R import com.zj365.dc.databinding.ActDietManagementBinding @@ -40,17 +42,27 @@ class DietManagementAct : BaseVmAct(){ } R.id.rx_healthy_diet ->{ + bundle.clear() + bundle.putString("web_site_url","http://testbuilt.zhongjian365.com/ ") +// bundle.putString("web_site_url","${BuildConfig.h5url}pages/index/index?pageId=cookbook") + RouteManager.goAct(ARouterUrl.H5_ACT,bundle) + // var url = "${BuildConfig.}" } R.id.rx_medicine_food ->{ + bundle.clear() + bundle.putString("web_site_url","${BuildConfig.h5url}pages/index/index?pageId=herbal") + RouteManager.goAct(ARouterUrl.H5_ACT,bundle) } R.id.rx_food_diary ->{ - + bundle.clear() + bundle.putString("web_site_url","${BuildConfig.h5url}pages/index/index?pageId=diary") + RouteManager.goAct(ARouterUrl.H5_ACT,bundle) } R.id.rx_more ->{ - + CommonToastUtils.showToast("敬请期待") } } diff --git a/app/src/main/java/com/zj365/dc/activity/MainActivity.kt b/app/src/main/java/com/zj365/dc/activity/MainActivity.kt index 80b1216..4a1f503 100644 --- a/app/src/main/java/com/zj365/dc/activity/MainActivity.kt +++ b/app/src/main/java/com/zj365/dc/activity/MainActivity.kt @@ -302,7 +302,7 @@ class MainActivity : BaseVmAct(), Consumer { it[3]?.let { if(it != null && it.size > 0){ - // DialogActivities(this,it[0].imgUrl).show() + DialogActivities(this,it[0]).show() } } diff --git a/app/src/main/java/com/zj365/dc/activity/RecognizeResultAct.kt b/app/src/main/java/com/zj365/dc/activity/RecognizeResultAct.kt index b82db22..559e1d1 100644 --- a/app/src/main/java/com/zj365/dc/activity/RecognizeResultAct.kt +++ b/app/src/main/java/com/zj365/dc/activity/RecognizeResultAct.kt @@ -19,6 +19,7 @@ import com.xty.common.arouter.RouteManager import com.xty.common.picture.PictureUtils import com.xty.common.util.SpannableUtils import com.xty.network.model.FoodRecoginzeInfo +import com.zj365.dc.BuildConfig import com.zj365.dc.adapter.RecognizeResultAdapter import com.zj365.dc.databinding.ActRecognizeResultBinding import com.zj365.dc.vm.DietManagementVm @@ -35,6 +36,10 @@ class RecognizeResultAct : BaseVmAct() { var type:String? = null var fileUrl :String? = null + + var currentId:String?= null + + var foodRecoginzeInfo: FoodRecoginzeInfo? = null override fun liveObserver() { mViewModel.foodRecoginzeInfoLiveData.observe(this){ adapter.setNewInstance(it.data) @@ -61,6 +66,12 @@ class RecognizeResultAct : BaseVmAct() { } binding.tvDetail.setOnClickListener { + currentId?.let { + bundle.clear() + bundle.putString("web_site_url","${BuildConfig.h5url}pages/index/index?pageId=mealsDetail&id=${it}") + RouteManager.goAct(ARouterUrl.H5_ACT,bundle) + } + } @@ -72,7 +83,13 @@ class RecognizeResultAct : BaseVmAct() { binding.recycler.layoutManager = LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false) binding.recycler.adapter = adapter adapter.setOnItemChildClickListener { adapter, view, position -> - val foodBean = adapter.getItem(position) as FoodRecoginzeInfo + foodRecoginzeInfo = adapter.getItem(position) as FoodRecoginzeInfo + + foodRecoginzeInfo?.let { + currentId = it.name + binding.tvAnalyzeTitle.text = it.name + val list = mutableListOf() + } } } diff --git a/app/src/main/java/com/zj365/dc/activity/RegisterAct.kt b/app/src/main/java/com/zj365/dc/activity/RegisterAct.kt index 8aa1c31..0e7a4f0 100644 --- a/app/src/main/java/com/zj365/dc/activity/RegisterAct.kt +++ b/app/src/main/java/com/zj365/dc/activity/RegisterAct.kt @@ -189,7 +189,10 @@ class RegisterAct : BaseVmAct() { timer = null } mViewModel.login(binding.mAccount.text.toString().trim(),binding.mPsw.text.toString().trim()) - RxActivityTool.finishActivity(LoginAct::class.java) + runOnUiThread { + RxActivityTool.finishActivity(LoginAct::class.java) + + } } mViewModel.codeLive.observe(this) { diff --git a/app/src/main/java/com/zj365/dc/activity/WelcomeAct.kt b/app/src/main/java/com/zj365/dc/activity/WelcomeAct.kt index 81a300c..708c535 100644 --- a/app/src/main/java/com/zj365/dc/activity/WelcomeAct.kt +++ b/app/src/main/java/com/zj365/dc/activity/WelcomeAct.kt @@ -12,6 +12,8 @@ import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.transition.Transition import com.gyf.immersionbar.ImmersionBar import com.tamsiree.rxkit.RxDeviceTool +import com.tencent.smtt.export.external.TbsCoreSettings +import com.tencent.smtt.sdk.QbSdk import com.umeng.commonsdk.UMConfigure import com.xty.base.act.BaseVmAct import com.xty.common.Const @@ -47,6 +49,7 @@ class WelcomeAct : BaseVmAct() { private val prevDialog by lazy { PrevDialog(this, { startTimer() + // initX5() MMkvHelper.put("private", "") }) { finish() @@ -231,6 +234,8 @@ class WelcomeAct : BaseVmAct() { JPushHelper(this).stopOrResumeJPush(MMkvHelper.getBoolean(Const.NOTICE_FLAG)) } + + override fun onDestroy() { job?.let { it.cancel() diff --git a/app/src/main/java/com/zj365/dc/fragment/DynamicManagementFrag.kt b/app/src/main/java/com/zj365/dc/fragment/DynamicManagementFrag.kt index 50f0a5b..9d36000 100644 --- a/app/src/main/java/com/zj365/dc/fragment/DynamicManagementFrag.kt +++ b/app/src/main/java/com/zj365/dc/fragment/DynamicManagementFrag.kt @@ -214,30 +214,30 @@ class DynamicManagementFrag : BaseVmFrag() , EasyPermission } else { }*/ - - if (deviceType == "X1" || deviceType == "X2") { + goPage(index - 1) + /*if (deviceType == "X1" || deviceType == "X2") { goPage(index - 2) } else { goPage(index - 1) - } + }*/ } 6 -> { val deviceType = MMkvHelper.getString(Const.DEVICE_TYPE) - if (deviceType == "X1" || deviceType == "X2") { + /*if (deviceType == "X1" || deviceType == "X2") { goPage(4) - } else { + } else {*/ goPage(index - 1) - } + // } } 9 -> { //心电隐藏的前提下,尿酸为8 否则为9 val deviceType = MMkvHelper.getString(Const.DEVICE_TYPE) - if (deviceType == "X1" || deviceType == "X2") { + /* if (deviceType == "X1" || deviceType == "X2") { goPage(6) - } else { + } else {*/ goPage(7) - } + // } } 7 -> { //血糖 @@ -257,11 +257,11 @@ class DynamicManagementFrag : BaseVmFrag() , EasyPermission // } // } val deviceType = MMkvHelper.getString(Const.DEVICE_TYPE) - if (deviceType == "X1" || deviceType == "X2") { + /*if (deviceType == "X1" || deviceType == "X2") { goPage(5) - } else { + } else {*/ goPage(index - 1) - } + // } } 10 -> { // //心电隐藏的前提下血脂为9 否则为10 diff --git a/app/src/main/java/com/zj365/dc/fragment/MineFrag.kt b/app/src/main/java/com/zj365/dc/fragment/MineFrag.kt index 6c816cb..db550de 100644 --- a/app/src/main/java/com/zj365/dc/fragment/MineFrag.kt +++ b/app/src/main/java/com/zj365/dc/fragment/MineFrag.kt @@ -4,6 +4,7 @@ import android.Manifest import android.content.Intent import android.net.Uri import android.os.Build +import android.text.TextUtils import android.view.View import androidx.annotation.RequiresApi import com.xty.base.dialog.AppUpdateDialog @@ -23,6 +24,7 @@ import com.xty.network.model.SettingBean import com.zj365.dc.BuildConfig import com.zj365.dc.activity.MainActivity import com.zj365.dc.databinding.FragMineBinding +import com.zj365.health.act.HealthMainAct import com.zj365.health.weight.DialogTip import com.zj365.mime.act.DevInfoAct import com.zj365.mime.vm.SettingVm @@ -142,7 +144,21 @@ class MineFrag : BaseVmFrag(),EasyPermissions.PermissionCallbacks { if(MMkvHelper.getLong(Const.USER_ID).toString() == "0"){ RouteManager.goAct(ARouterUrl.LOGIN_ACT) }else { - CommonToastUtils.showToast("敬请期待") + // CommonToastUtils.showToast("敬请期待") + + bundle.clear() + bundle.putInt("page", 0) + bundle.putBoolean("isDemonstrate", (requireActivity() as MainActivity).isDemonstrate) + + val id = if (MMkvHelper.getLong(Const.USER_ID).toString() == "0") { + "" + } else { + MMkvHelper.getLong(Const.USER_ID).toString() + } + bundle.putString("id", id) + bundle.putString("sex", CommonUtils.getMyUserInfo()?.sex.toString()) + + RouteManager.goAct(ARouterUrl.HEALTHMAIN, bundle) } } @@ -317,7 +333,7 @@ class MineFrag : BaseVmFrag(),EasyPermissions.PermissionCallbacks { } user = it.user binding.mName.text = it.user.name - binding.mPhone.text = "账户:${it.user.phone}" + binding.mPhone.text = "${it.user.phone}" // binding.mDk.text = it.clock.toString() // binding.mLevel.text = it.grade if (it.user.avatarUrl.isNullOrEmpty()) { diff --git a/app/src/main/res/layout/act_calorie_analyze.xml b/app/src/main/res/layout/act_calorie_analyze.xml index 125a278..ef539fe 100644 --- a/app/src/main/res/layout/act_calorie_analyze.xml +++ b/app/src/main/res/layout/act_calorie_analyze.xml @@ -9,63 +9,45 @@ - - - - - - - + android:background="@mipmap/bg_hot_card_analysis" + android:layout_gravity="center_horizontal" + android:layout_marginTop="@dimen/dp_40"/> - + - + + android:orientation="vertical" + android:layout_marginLeft="@dimen/dp_58" + android:layout_marginRight="@dimen/dp_58" + android:layout_marginTop="@dimen/dp_24"> - - + android:layout_below="@+id/ll_analyze" + android:paddingTop="@dimen/dp_22" + android:paddingLeft="@dimen/dp_16" + android:paddingRight="@dimen/dp_16" + android:paddingBottom="@dimen/dp_25" + android:background="@drawable/shape_8round_white"> + - - - - - - + android:layout_height="wrap_content" + android:orientation="horizontal" + android:gravity="center_vertical" + > + + android:text="识别结果" + android:textStyle="bold" + android:textSize="@dimen/sp_17" + android:paddingHorizontal="@dimen/dp_10" + /> + + + + + + + + + - + android:text="营养成分" + android:textStyle="bold" + android:textSize="@dimen/sp_17" + android:paddingHorizontal="@dimen/dp_10" + /> - + + + + + + + \ No newline at end of file diff --git a/base/src/main/java/com/xty/base/act/BaseTenCentWebViewActivity.kt b/base/src/main/java/com/xty/base/act/BaseTenCentWebViewActivity.kt new file mode 100644 index 0000000..57457aa --- /dev/null +++ b/base/src/main/java/com/xty/base/act/BaseTenCentWebViewActivity.kt @@ -0,0 +1,215 @@ +package com.xty.base.act + +import android.R +import android.annotation.SuppressLint +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.text.TextUtils +import android.view.KeyEvent +import android.view.WindowManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.tencent.smtt.sdk.WebChromeClient +import com.tencent.smtt.sdk.WebSettings +import com.tencent.smtt.sdk.WebView +import com.tencent.smtt.sdk.WebViewClient +import com.xty.base.databinding.ActBaseTencentWebviewBinding +import com.xty.base.h5.CloudJSBridge +import com.xty.base.h5.IJsBridge +import com.xty.base.vm.BaseVm +import com.xty.common.LogUtils +import com.xty.common.arouter.ARouterUrl + + +@Route(path = ARouterUrl.H5_ACT) + class BaseTenCentWebViewActivity: BaseVmAct(),IJsBridge{ + + val binding by lazy { ActBaseTencentWebviewBinding.inflate(layoutInflater) } + + var mWebSetting: WebSettings? = null + + var mUrl:String? = null + + val cloudJSBridge by lazy { CloudJSBridge(this@BaseTenCentWebViewActivity,this) } + + companion object{ + val WEB_SITE_URL = "web_site_url" + val WEB_SITE_TITLE = "web_title" + } + + override fun initView() { + super.initView() + initWebViewSettings() + getWindow().setFlags( + WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, + WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); + if (!TextUtils.isEmpty(mUrl)) { + loadWebView(mUrl!!) + } + + var data = Bundle() +//true表示标准全屏,false表示X5全屏;不设置默认false, + //true表示标准全屏,false表示X5全屏;不设置默认false, + data.putBoolean("standardFullScreen", false) +//false:关闭小窗;true:开启小窗;不设置默认true, + //false:关闭小窗;true:开启小窗;不设置默认true, + data.putBoolean("supportLiteWnd", false) +//1:以页面内开始播放,2:以全屏开始播放;不设置默认:1 + //1:以页面内开始播放,2:以全屏开始播放;不设置默认:1 + data.putInt("DefaultVideoScreen", 2) + + if (binding.webView.x5WebViewExtension != null) { + binding.webView.x5WebViewExtension.invokeMiscMethod("setVideoParams", data) + } + + binding.webView.addJavascriptInterface(cloudJSBridge,"business") + } + + override fun liveObserver() { + } + + override fun setLayout()= binding.root + + + @SuppressLint("SetJavaScriptEnabled") + open fun initWebViewSettings() { + mUrl = intent.getStringExtra(WEB_SITE_URL) + LogUtils.e("BaseTenCentWebViewActivity","mUrlmUrl${mUrl}") + mWebSetting = binding.webView.settings + mWebSetting!!.defaultTextEncodingName = "utf-8" + + val ua: String = mWebSetting!!.getUserAgentString() + mWebSetting!!.userAgentString = ua.replace( + "Android", + "Android cswldxiaomi" + ) //设置webview的浏览器标识 + + + mWebSetting!!.setJavaScriptEnabled(true) //允许调用js + + mWebSetting!!.allowFileAccess = true //启用webVIew访问文件数据 + + mWebSetting!!.layoutAlgorithm = WebSettings.LayoutAlgorithm.NARROW_COLUMNS + + mWebSetting!!.setSupportZoom(true) //设置支持缩放 + + mWebSetting!!.builtInZoomControls = true + mWebSetting!!.useWideViewPort = true //将图片调整到合适的webView大小 + + mWebSetting!!.setSupportMultipleWindows(false) //是否支持多窗口 + + mWebSetting!!.loadWithOverviewMode = true + mWebSetting!!.setAppCacheEnabled(true) //设置是否启用缓存 + + mWebSetting!!.databaseEnabled = true + mWebSetting!!.domStorageEnabled = true + mWebSetting!!.setGeolocationEnabled(true) + + mWebSetting!!.loadsImagesAutomatically = true //设置自动加载图片 + + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { + mWebSetting!!.mixedContentMode = android.webkit.WebSettings.MIXED_CONTENT_ALWAYS_ALLOW + } + mWebSetting!!.blockNetworkImage = false //设置是否显示网络图像,false为允许显示 + + mWebSetting!!.cacheMode = WebSettings.LOAD_DEFAULT //不缓存,只从网络获取数据 + + mWebSetting!!.setAppCacheMaxSize(Long.MAX_VALUE) + // 复写shouldOverrideUrlLoading()方法,使得打开网页时不调用系统浏览器, 而是在本WebView中显示 + binding.webView.webViewClient = object : WebViewClient() { + override fun shouldOverrideUrlLoading(webView: WebView, url: String): Boolean { + if (url.startsWith("http:") || url.startsWith("https:")) webView.loadUrl(url) else { + try { + val uri = Uri.parse(url) + val intent = Intent(Intent.ACTION_VIEW, uri) + startActivity(intent) + } catch (e: Exception) { + } + } + return true + } + } + + binding.webView.webChromeClient = object : WebChromeClient() { + override fun onProgressChanged( + view: WebView, + newProgress: Int + ) { + super.onProgressChanged(view, newProgress) + } + } + } + /** + * 加载webview + * + * @param webUrl + */ + protected open fun loadWebView(webUrl: String) { + if (webUrl.startsWith("http:") || webUrl.startsWith("https:")) + binding.webView.loadUrl(webUrl) + else + binding.webView.loadUrl( + "http://$webUrl" + ) + } + + open fun setJsBridge(jsBridge: CloudJSBridge) { + // this.jsBridge = jsBridge + } + + + open fun reload() { + binding.webView.reload() + } + + + override fun onBackPressed() { + if (binding.webView != null) { + if (binding.webView.canGoBack()) { + binding.webView.goBack() + } else { + finish() + } + } else { + finish() + } + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + if (keyCode == KeyEvent.KEYCODE_BACK && binding.webView.canGoBack()) { + binding.webView.goBack() // 返回前一个webview页面 + return true + } + return super.onKeyDown(keyCode, event) + } + + override fun sendDataToJS(functionName: String, data: String) { + + if (functionName.equals("reload")) { + runOnUiThread { reload() } + } else { + runOnUiThread { + binding.webView + .loadUrl( + java.lang.String.format( + "javascript:%s('%s')", + functionName, + R.attr.data + ) + ) + } + } + } + + fun responseToJS(functionName: String?, data: String?) { + runOnUiThread { + binding.webView + .loadUrl(String.format("javascript:%s('%s')", functionName, data)) + } + } + + override fun switchView(name: String, data: String) { + + } + } \ No newline at end of file diff --git a/base/src/main/java/com/xty/base/dialog/DialogActivities.kt b/base/src/main/java/com/xty/base/dialog/DialogActivities.kt index ac3ffeb..fc7285d 100644 --- a/base/src/main/java/com/xty/base/dialog/DialogActivities.kt +++ b/base/src/main/java/com/xty/base/dialog/DialogActivities.kt @@ -2,6 +2,7 @@ package com.xty.base.dialog import android.content.Context import android.graphics.Bitmap +import android.os.Bundle import android.view.View import com.bumptech.glide.Glide import com.bumptech.glide.request.target.SimpleTarget @@ -9,21 +10,23 @@ import com.bumptech.glide.request.transition.Transition import com.xty.base.databinding.DialogActivitiesBinding import com.xty.common.R import com.xty.common.SizeUtil +import com.xty.common.arouter.ARouterUrl +import com.xty.common.arouter.RouteManager import com.xty.common.setBigImage import com.xty.common.setImage import com.xty.common.setImageUser +import com.xty.network.model.BannerBean -class DialogActivities (context:Context,var imgUrl:String?): BaseDialog(context) { +class DialogActivities (context:Context,var bannerBean: BannerBean?): BaseDialog(context) { val binding by lazy { DialogActivitiesBinding.inflate(layoutInflater) } override fun setLayout() = binding.root override fun initView() { super.initView() setDialogPadding(SizeUtil.dp2px(context, 30f), 0, SizeUtil.dp2px(context, 30f), 0) - imgUrl?.let { - - binding.imgActivies.setImage(context,it) - /* Glide.with(context).asBitmap().load(it).error(R.mipmap.ic_welcome_main_bg) + bannerBean?.let { + binding.imgActivies.setBigImage(context,it.imgUrl) + /*Glide.with(context).asBitmap().load(it.imgUrl).error(R.mipmap.ic_welcome_main_bg) .into(object : SimpleTarget() { override fun onResourceReady( resource: Bitmap, @@ -38,6 +41,12 @@ class DialogActivities (context:Context,var imgUrl:String?): BaseDialog(context) binding.imgClose.setOnClickListener { dismiss() } binding.imgActivies.setOnClickListener { + bannerBean?.let { + var bundle = Bundle() + bundle.putString("title", it.title) + bundle.putString("url", it.linkAddress) + RouteManager.goAct(ARouterUrl.WEB_ACT, bundle) + } } } diff --git a/base/src/main/java/com/xty/base/h5/CloudJSBridge.kt b/base/src/main/java/com/xty/base/h5/CloudJSBridge.kt new file mode 100644 index 0000000..d87fc87 --- /dev/null +++ b/base/src/main/java/com/xty/base/h5/CloudJSBridge.kt @@ -0,0 +1,56 @@ +package com.xty.base.h5 + +import android.content.Context +import android.webkit.JavascriptInterface +import com.xty.base.act.BaseVmAct +import com.xty.base.act.IBaseAct +import com.xty.common.Const +import com.xty.common.LogUtils +import com.xty.common.MMkvHelper +import com.xty.common.util.ToastUtils +import org.json.JSONObject + +open class CloudJSBridge(val context: Context, val listener: IJsBridge) { + private var baseActivity: BaseVmAct<*> = context as BaseVmAct<*> + @JavascriptInterface + fun getBaseInfoData(str: String?) { + LogUtils.e("CloudJSBridge","getBaseInfoData str") + str?.apply { + val userId = if (MMkvHelper.getLong(Const.USER_ID).toString() == "0") { + "" + } else { LogUtils.e("CloudJSBridge","str") + MMkvHelper.getLong(Const.USER_ID).toString() + } + + val jsonObject = JSONObject() + jsonObject.put("statuHeight", WebUtils.getStatesBar()) + jsonObject.put("token", MMkvHelper.getString(Const.Auth_Token)) + + jsonObject.put("userId", userId) + listener.sendDataToJS("sendBaseInfo", jsonObject.toString()) + } + } + + @JavascriptInterface + fun getIsFromApp(str:String?){ + LogUtils.e("CloudJSBridge","getIsFromApp str") + str?.let { + val jsonObject = JSONObject() + jsonObject.put("isAPP", 1) + listener.sendDataToJS("sendIsFrom ", jsonObject.toString()) + } + } + + @JavascriptInterface + fun onBack(str: String?){ + LogUtils.e("CloudJSBridge","onBack str") + baseActivity.finish() + } + @JavascriptInterface + fun gotoElectronicFence(str: String?){ + LogUtils.e("CloudJSBridge","gotoElectronicFence str") + ToastUtils(context).showToast("敬请期待") + + } + +} \ No newline at end of file diff --git a/base/src/main/java/com/xty/base/h5/IJsBridge.kt b/base/src/main/java/com/xty/base/h5/IJsBridge.kt new file mode 100644 index 0000000..b33ffd9 --- /dev/null +++ b/base/src/main/java/com/xty/base/h5/IJsBridge.kt @@ -0,0 +1,7 @@ +package com.xty.base.h5 + +interface IJsBridge { + fun sendDataToJS(functionName: String, data: String) + + fun switchView(name: String, data: String) +} \ No newline at end of file diff --git a/base/src/main/java/com/xty/base/h5/JsBridge.kt b/base/src/main/java/com/xty/base/h5/JsBridge.kt new file mode 100644 index 0000000..5c08cc2 --- /dev/null +++ b/base/src/main/java/com/xty/base/h5/JsBridge.kt @@ -0,0 +1,11 @@ +package com.xty.base.h5 + +import android.content.Context + +class JsBridge(context: Context, listener: IJsBridge) : CloudJSBridge(context, listener) { + + + + + +} diff --git a/base/src/main/java/com/xty/base/h5/WebUtils.kt b/base/src/main/java/com/xty/base/h5/WebUtils.kt new file mode 100644 index 0000000..20d4ecf --- /dev/null +++ b/base/src/main/java/com/xty/base/h5/WebUtils.kt @@ -0,0 +1,30 @@ +package com.xty.base.h5 + +import com.xty.base.utils.ContextUtils +import com.xty.base.utils.SystemBarHelper +import com.xty.base.utils.SystemBarHelper.getStatusBarHeight + + +object WebUtils { + private var mSbar = -1 + + /** + * 获取状态栏高度 + * + * @return 状态栏高度px + */ + @Synchronized + fun getStatesBar(): Int { + if (mSbar < 0) { + mSbar = getStatusBarHeight(ContextUtils.getContext()) + } + return mSbar + } + + + @Synchronized + fun getDensityDpi(): Int { + val displayMetrics = ContextUtils.getApplication().resources.displayMetrics + return displayMetrics.density.toInt() + } +} \ No newline at end of file diff --git a/base/src/main/java/com/xty/base/utils/ContextUtils.kt b/base/src/main/java/com/xty/base/utils/ContextUtils.kt new file mode 100644 index 0000000..1c7716f --- /dev/null +++ b/base/src/main/java/com/xty/base/utils/ContextUtils.kt @@ -0,0 +1,48 @@ +package com.xty.base.utils + +import android.app.Application +import android.content.Context + + +object ContextUtils { + + private var context: Context? = null + private var mApplication: Application? = null + + fun ContextUtils() { + throw UnsupportedOperationException("u can't instantiate me...") + } + + /** + * 初始化工具类 + * + * @param context 上下文 + */ + fun init(context: Context) { + ContextUtils.context = context.applicationContext + if (context is Application) { + mApplication = context.getApplicationContext() as Application + } + } + + /** + * 获取ApplicationContext + * + * @return ApplicationContext + */ + fun getContext(): Context { + if (context != null) return context!! + throw NullPointerException("u should init first") + } + + + /** + * 获取ApplicationContext + * + * @return ApplicationContext + */ + fun getApplication(): Application { + if (mApplication != null) return mApplication!! + throw NullPointerException("u should init first") + } +} \ No newline at end of file diff --git a/base/src/main/java/com/xty/base/utils/NetworkUtils.java b/base/src/main/java/com/xty/base/utils/NetworkUtils.java new file mode 100644 index 0000000..9af3e94 --- /dev/null +++ b/base/src/main/java/com/xty/base/utils/NetworkUtils.java @@ -0,0 +1,81 @@ +package com.xty.base.utils; + +import android.app.Activity; +import android.content.Context; +import android.location.LocationManager; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; + + public final class NetworkUtils { + + public static int NET_ETHERNET = 1; + public static int NET_WIFI = 2; + public static int NET_NOCONNECT = 0; + + /** + * 检查当前网络是否可用 + * + * @param + * @return + */ + public static boolean isNetworkAvailable(Context activity) { + Context context = activity; + if (activity instanceof Activity) { + context = activity.getApplicationContext(); + } + //获取手机所有连接管理对象(包括对wi-fi,net等连接的管理) + ConnectivityManager connectivityManager = (ConnectivityManager) context + .getSystemService(Context.CONNECTIVITY_SERVICE); + + if (connectivityManager == null) { + return false; + } else { + // 获取NetworkInfo对象 + NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo(); + + if (networkInfo != null && networkInfo.length > 0) { + for (int i = 0; i < networkInfo.length; i++) { + /** + System.out.println(i + "===状态===" + + networkInfo[i].getState()); + System.out.println(i + "===类型===" + + networkInfo[i].getTypeName()); + **/ + //判断当前网络状态是否为连接状态 + if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED) { + return true; + } + } + } + } + return false; + } + + public static int isNetworkType(Context context) { + ConnectivityManager connectMgr = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo ethNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET); + NetworkInfo wifiNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); + + + if (ethNetInfo != null && ethNetInfo.isConnected()) { + return NET_ETHERNET; + } else if (wifiNetInfo != null && wifiNetInfo.isConnected()) { + return NET_WIFI; + } else { + return NET_NOCONNECT; + } + } + + + /** + * 判断GPS是否开启 + * @param + * @return + */ + public static boolean isGpsEnabled(Context context){ + //获取位置服务 + LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); + //返回开启状态 + return lm.isProviderEnabled(LocationManager.GPS_PROVIDER); + } +} diff --git a/base/src/main/java/com/xty/base/utils/SystemBarHelper.kt b/base/src/main/java/com/xty/base/utils/SystemBarHelper.kt new file mode 100644 index 0000000..42ccb8e --- /dev/null +++ b/base/src/main/java/com/xty/base/utils/SystemBarHelper.kt @@ -0,0 +1,22 @@ +package com.xty.base.utils + +import android.content.Context +import android.os.Build + + +object SystemBarHelper { + + /** + * 获取状态栏高度 + */ + fun getStatusBarHeight(context: Context): Int { + var result = 0 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + val resId = context.resources.getIdentifier("status_bar_height", "dimen", "android") + if (resId > 0) { + result = context.resources.getDimensionPixelSize(resId) + } + } + return result + } +} \ No newline at end of file diff --git a/base/src/main/res/layout/act_base_tencent_webview.xml b/base/src/main/res/layout/act_base_tencent_webview.xml new file mode 100644 index 0000000..9baad2f --- /dev/null +++ b/base/src/main/res/layout/act_base_tencent_webview.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/base/src/main/res/layout/dialog_activities.xml b/base/src/main/res/layout/dialog_activities.xml index e41d590..94b4ad0 100644 --- a/base/src/main/res/layout/dialog_activities.xml +++ b/base/src/main/res/layout/dialog_activities.xml @@ -4,21 +4,25 @@ android:orientation="vertical" android:gravity="center" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="match_parent"> - diff --git a/common/build.gradle b/common/build.gradle index d1c43f0..014eb1a 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -87,6 +87,7 @@ dependencies { api files('libs/rtk-bbpro-core-1.5.9.jar') api files('libs/rtk-core-1.1.7.jar') api files('libs/rtk-dfu-3.2.20.jar') + // api files('tbs_sdk_thirdapp_v4.3.0.386_44286_sharewithdownloadwithfile_withoutGame_obfs_20230210_114429.jar') api project(":AYCrashGuard") kapt rely.arouter_compiler kapt rely.glide_compiler diff --git a/common/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_sharewithdownloadwithfile_withoutGame_obfs_20230210_114429.jar b/common/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_sharewithdownloadwithfile_withoutGame_obfs_20230210_114429.jar new file mode 100644 index 0000000..465ea1b Binary files /dev/null and b/common/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_sharewithdownloadwithfile_withoutGame_obfs_20230210_114429.jar differ diff --git a/common/src/main/java/com/xty/common/app/MyApp.kt b/common/src/main/java/com/xty/common/app/MyApp.kt index 904b476..c6ec44e 100644 --- a/common/src/main/java/com/xty/common/app/MyApp.kt +++ b/common/src/main/java/com/xty/common/app/MyApp.kt @@ -9,6 +9,7 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.os.Build +import android.util.Log import cat.ereza.customactivityoncrash.CustomActivityOnCrash import cat.ereza.customactivityoncrash.config.CaocConfig import com.alibaba.android.arouter.launcher.ARouter @@ -25,6 +26,8 @@ import com.tencent.bugly.crashreport.CrashReport import com.tencent.mm.opensdk.constants.ConstantsAPI import com.tencent.mm.opensdk.openapi.IWXAPI import com.tencent.mm.opensdk.openapi.WXAPIFactory +import com.tencent.smtt.export.external.TbsCoreSettings +import com.tencent.smtt.sdk.QbSdk import com.umeng.commonsdk.UMConfigure import com.xty.common.* import com.xty.common.bracelet.checkBlueConnectPermission @@ -68,6 +71,7 @@ class MyApp : Application() { initUMengSdk() initRefresh() registerBlueToothBoardCastReceiver() + initX5() //bugly 上报 在release版本才会上报 // if(BuildConfig.isRelease){ // CrashReport.initCrashReport(this, "", true) @@ -170,6 +174,27 @@ class MyApp : Application() { RxTool.init(this) } + private fun initX5() { + QbSdk.setCoreMinVersion(QbSdk.CORE_VER_ENABLE_202112); + val map = HashMap() + map[TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER] = true + map[TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE] = true + QbSdk.initTbsSettings(map) + val cb: QbSdk.PreInitCallback = + object : QbSdk.PreInitCallback { + override fun onViewInitFinished(arg0: Boolean) { + //x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。 + Log.d("webX5", " onViewInitFinished is $arg0") + } + + override fun onCoreInitFinished() {} + } + //x5内核初始化接口 + if (!QbSdk.isTbsCoreInited()) { + QbSdk.initX5Environment(applicationContext, cb) + } + } + /** * 初始化手环SDK diff --git a/common/src/main/java/com/xty/common/arouter/ARouterUrl.kt b/common/src/main/java/com/xty/common/arouter/ARouterUrl.kt index 3d37fdc..93e1cac 100644 --- a/common/src/main/java/com/xty/common/arouter/ARouterUrl.kt +++ b/common/src/main/java/com/xty/common/arouter/ARouterUrl.kt @@ -224,6 +224,7 @@ class ARouterUrl { const val RICH_TEXT = "/base/com/xty/base/act/RichTextAct" const val CHAT_MSG = "/base/com/xty/base/act/ChatMsgAct" const val VIDEO_PLAY = "/base/com/xty/base/act/VideoPlayerAct" + const val H5_ACT = "/base/com/xty/base/act/BaseTenCentWebViewActivity" //service diff --git a/common/src/main/res/drawable/shape_btn_select_bg_25c.xml b/common/src/main/res/drawable/shape_btn_select_bg_25c.xml index 5b221d2..b46bdea 100644 --- a/common/src/main/res/drawable/shape_btn_select_bg_25c.xml +++ b/common/src/main/res/drawable/shape_btn_select_bg_25c.xml @@ -3,6 +3,6 @@ - \ No newline at end of file diff --git a/common/src/main/res/drawable/shape_btn_select_bg_rad6.xml b/common/src/main/res/drawable/shape_btn_select_bg_rad6.xml index b1a68f1..4df8fd4 100644 --- a/common/src/main/res/drawable/shape_btn_select_bg_rad6.xml +++ b/common/src/main/res/drawable/shape_btn_select_bg_rad6.xml @@ -3,6 +3,6 @@ - \ No newline at end of file diff --git a/config.gradle b/config.gradle index d861baf..37961cd 100644 --- a/config.gradle +++ b/config.gradle @@ -29,7 +29,10 @@ ext { release_url: "https://auprty.com/app/"*/ //测试环境 debug_url : "http://java01.zhongjian365.com/app/", - release_url: "http://175.6.39.20:8181/app/" + release_url: "http://175.6.39.20:8181/app/", + + h5_debug_url : "http://testbuilt.zhongjian365.com/", + h5_release_url : "http://built.zhongjian365.com/" ] diff --git a/health/build.gradle b/health/build.gradle index ef1f763..7fa1109 100644 --- a/health/build.gradle +++ b/health/build.gradle @@ -35,6 +35,7 @@ android { buildTypes { release { buildConfigField("String","url","\"${url.release_url}\"") + buildConfigField("String","h5url","\"${url.h5_release_url}\"") buildConfigField("String", "image_prefix","\"${imagePrefix.release_url}\"") buildConfigField("Boolean","isRelease",String.valueOf(true)) @@ -43,7 +44,7 @@ android { } debug{ buildConfigField("String","url","\"${url.debug_url}\"") - + buildConfigField("String","h5url","\"${url.h5_debug_url}\"") buildConfigField("Boolean","isRelease",String.valueOf(false)) buildConfigField("String", "image_prefix","\"${imagePrefix.debug_url}\"") } diff --git a/health/src/main/AndroidManifest.xml b/health/src/main/AndroidManifest.xml index a3dd066..9f248a3 100644 --- a/health/src/main/AndroidManifest.xml +++ b/health/src/main/AndroidManifest.xml @@ -251,6 +251,14 @@ + + + + \ No newline at end of file diff --git a/health/src/main/res/layout/act_blood_calibeation_history.xml b/health/src/main/res/layout/act_blood_calibeation_history.xml index 17171b7..9107c3a 100644 --- a/health/src/main/res/layout/act_blood_calibeation_history.xml +++ b/health/src/main/res/layout/act_blood_calibeation_history.xml @@ -49,7 +49,7 @@ android:paddingTop="@dimen/dp_10" android:paddingBottom="@dimen/dp_10" android:text="退出管理" - android:textColor="@color/col_8D0" + android:textColor="@color/col_02c" android:textSize="@dimen/sp_16" android:textStyle="bold" android:visibility="gone" /> diff --git a/mine/build.gradle b/mine/build.gradle index 634f1a6..3280f00 100644 --- a/mine/build.gradle +++ b/mine/build.gradle @@ -35,6 +35,7 @@ android { release { buildConfigField("String","url","\"${url.release_url}\"") buildConfigField("String", "image_prefix","\"${imagePrefix.release_url}\"") + buildConfigField("String","h5url","\"${url.h5_release_url}\"") buildConfigField("Boolean","isRelease",String.valueOf(true)) minifyEnabled false @@ -42,6 +43,7 @@ android { } debug{ buildConfigField("String","url","\"${url.debug_url}\"") + buildConfigField("String","h5url","\"${url.h5_debug_url}\"") buildConfigField("Boolean","isRelease",String.valueOf(false)) buildConfigField("String", "image_prefix","\"${imagePrefix.debug_url}\"") diff --git a/mine/src/main/java/com/zj365/mime/act/DevInfoAct.kt b/mine/src/main/java/com/zj365/mime/act/DevInfoAct.kt index e12eac7..cf2fc3c 100644 --- a/mine/src/main/java/com/zj365/mime/act/DevInfoAct.kt +++ b/mine/src/main/java/com/zj365/mime/act/DevInfoAct.kt @@ -16,11 +16,13 @@ import com.xty.common.Const import com.xty.common.MMkvHelper import com.xty.common.MyLinkedMovementMethod import com.xty.common.arouter.ARouterUrl +import com.xty.common.arouter.RouteManager import com.xty.common.bracelet.YCBBlueConnectHelper import com.xty.common.event.BlueToothConnectEvent import com.xty.common.event.MyInfoEvent import com.xty.network.MyRetrofit import com.xty.network.model.SettingBean +import com.zj365.mime.BuildConfig import com.zj365.mime.R import com.zj365.mime.databinding.ActDevInfoBinding import com.zj365.mime.vm.SettingVm @@ -118,6 +120,12 @@ class DevInfoAct : BaseVmAct(),EasyPermissions.PermissionCallbacks { binding.tvContactKefu.text = span + binding.tvDeviceSetting.setOnClickListener { + bundle.clear() + bundle.putString("web_site_url","${BuildConfig.h5url}pages/index/index?pageId=braceletSetting") + RouteManager.goAct(ARouterUrl.H5_ACT,bundle) + } + } diff --git a/network/src/main/java/com/xty/network/model/BannerBean.kt b/network/src/main/java/com/xty/network/model/BannerBean.kt index c75a344..4d9d15b 100644 --- a/network/src/main/java/com/xty/network/model/BannerBean.kt +++ b/network/src/main/java/com/xty/network/model/BannerBean.kt @@ -1,9 +1,11 @@ package com.xty.network.model +import java.io.Serializable + data class BannerBean( val title: String, val content: String, val bannerType: Int,//1:图文展示, 5:app内部打开, 10:web外部跳转, 15:视频播放】,imgUrl 图片地址,linkAddress,连接地址 val imgUrl: String, val linkAddress: String -) \ No newline at end of file +):Serializable \ No newline at end of file diff --git a/network/src/main/java/com/xty/network/model/FoodRecoginzeInfo.kt b/network/src/main/java/com/xty/network/model/FoodRecoginzeInfo.kt index 2d19151..bfee988 100644 --- a/network/src/main/java/com/xty/network/model/FoodRecoginzeInfo.kt +++ b/network/src/main/java/com/xty/network/model/FoodRecoginzeInfo.kt @@ -3,10 +3,38 @@ package com.xty.network.model import java.nio.DoubleBuffer data class FoodRecoginzeInfo( - val heat:Double, - val df:Double, - val cho:Double, - val chol:Double, - val na:DoubleBuffer + val heat:Double, //热量(大卡/100g) + val df:Double, //膳食纤维(g/100g + val cho:Double,//碳水化合物(g/100g) + + val chol:Double,//胆固醇(mg/100g) + + val na:Double,//钠(mg/100g) + + val vit_a:Double,//维生素A(μg/100g) + + val vit_b1:Double,//维生素B1(mg/100g) + + val vit_c:Double,//维生素C(mg/100g) + + val faca:Double,//质量(g) + + val protein:Double,//蛋白质(g/100g) + + val vit_b2:Double,//维生素B2(mg/100g) + val vpp:Double,//烟酸(mg/100g) + + val vit_e:Double,//维生素E(mg/100g) + + val name:String,//食品中文名 + + val fat:Double,//脂肪(g/100g) + + val ca:Double,//钙(mg/100g) + + val as_name:String,//别名 + + val fe:Double//铁(mg/100g) + ) { } \ No newline at end of file