From 219f0bd351f4975e79fda1d25961e08a29dd7d26 Mon Sep 17 00:00:00 2001 From: tongtongstudio Date: Thu, 26 Jun 2025 18:18:12 +0800 Subject: [PATCH] =?UTF-8?q?version:2.2.0=20bugfixes:=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E9=80=9A=E8=AF=9D=E4=B8=8D=E9=9C=80=E8=A6=81=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=20update:=E5=A2=9E=E5=8A=A0=E5=90=88=E8=A7=84=E5=BC=B9?= =?UTF-8?q?=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 6 +- app/src/main/AndroidManifest.xml | 5 + .../callwechat/CallWechatActivity.java | 69 ++++--- .../os/activity/privacy/PrivacyActivity.java | 99 ++++++++++ .../os/activity/privacy/PrivacyViewModel.java | 19 ++ .../os/activity/setting/SettingActivity.java | 88 +++++++-- .../com/vscool/os/base/BaseApplication.java | 1 + .../com/vscool/os/config/CommonConfig.java | 4 + .../dialog/PrivacyPolicyFragment.java | 182 ++++++++++++++++++ .../java/com/vscool/os/utils/JgyUtils.java | 44 +++++ .../java/com/vscool/os/view/ToggleButton.java | 6 +- .../res/drawable-hdpi/icon_back_black.png | Bin 0 -> 1061 bytes app/src/main/res/drawable/ic_negative.xml | 9 + app/src/main/res/drawable/ic_positive.xml | 10 + .../main/res/drawable/policy_checkbox_bg.xml | 5 + .../res/drawable/privacy_policy_card_bg.xml | 25 +++ .../drawable/privacy_policy_negative_bg.xml | 23 +++ .../drawable/privacy_policy_positive_bg.xml | 23 +++ .../privacy_policy_positive_selector.xml | 15 ++ .../main/res/drawable/progress_background.xml | 26 +++ app/src/main/res/layout/activity_privacy.xml | 72 +++++++ app/src/main/res/layout/activity_setting.xml | 35 +++- .../main/res/layout/activity_wechat_call.xml | 6 +- .../res/layout/fragment_privacy_policy.xml | 137 +++++++++++++ app/src/main/res/values/strings.xml | 3 + 25 files changed, 861 insertions(+), 51 deletions(-) create mode 100644 app/src/main/java/com/vscool/os/activity/privacy/PrivacyActivity.java create mode 100644 app/src/main/java/com/vscool/os/activity/privacy/PrivacyViewModel.java create mode 100644 app/src/main/java/com/vscool/os/fragment/dialog/PrivacyPolicyFragment.java create mode 100644 app/src/main/res/drawable-hdpi/icon_back_black.png create mode 100644 app/src/main/res/drawable/ic_negative.xml create mode 100644 app/src/main/res/drawable/ic_positive.xml create mode 100644 app/src/main/res/drawable/policy_checkbox_bg.xml create mode 100644 app/src/main/res/drawable/privacy_policy_card_bg.xml create mode 100644 app/src/main/res/drawable/privacy_policy_negative_bg.xml create mode 100644 app/src/main/res/drawable/privacy_policy_positive_bg.xml create mode 100644 app/src/main/res/drawable/privacy_policy_positive_selector.xml create mode 100644 app/src/main/res/drawable/progress_background.xml create mode 100644 app/src/main/res/layout/activity_privacy.xml create mode 100644 app/src/main/res/layout/fragment_privacy_policy.xml diff --git a/app/build.gradle b/app/build.gradle index 1b1fc98..e763215 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { minSdkVersion 24 targetSdkVersion 29 - versionCode 219 - versionName "2.1.9" + versionCode 220 + versionName "2.2.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -138,6 +138,7 @@ dependencies { // Java language implementation implementation "androidx.fragment:fragment:1.4.1" implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.browser:browser:1.7.0' implementation 'androidx.preference:preference:1.1.1' testImplementation 'junit:junit:4.12' @@ -190,6 +191,7 @@ dependencies { // implementation 'com.baidu.lbsyun:BaiduMapSDK_Location:9.1.8' //MMKV implementation 'com.tencent:mmkv-static:1.2.14' +// implementation 'com.tencent.tbs.tbssdk:sdk:43993' //bugly implementation 'com.tencent.bugly:crashreport:4.1.9.2' /*xCrash */ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 107277e..f9e6262 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -280,6 +280,11 @@ android:name=".activity.service.ServiceActivity" android:launchMode="singleTask" android:theme="@style/activity_styles" /> + { - private static final String TAG = "CallWechatActivity"; + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + private Contact mContact; // private static final int REQUEST_CODE_SCREEN_CAPTURE = 1874; @@ -64,7 +67,7 @@ public class CallWechatActivity extends BaseMvvmActivity= Build.VERSION_CODES.O) { // startForegroundService(intent); // } else { - startService(intent); + startService(intent); // } + finish(); + } + } else { + ApkUtils.openPackage(CallWechatActivity.this, "com.tencent.mm"); finish(); } } public void callWechatVoice(View view) { - if (TextUtils.isEmpty(mContact.getTag())) { - Toaster.show("没有设置标签,无法拨打微信语音"); - finish(); - return; - } - if (checkSettings()) { - Intent intent = new Intent(CallWechatActivity.this, SelectToSpeakService.class); - intent.putExtra("WechatInfo", mContact); - intent.putExtra("call_type", SelectToSpeakService.TYPE_VOICE); - startService(intent); +// if (TextUtils.isEmpty(mContact.getTag())) { +// Toaster.show("没有设置标签,无法拨打微信语音"); +// finish(); +// return; +// } + if (isWeChatAutoCall()) { + if (checkSettings()) { + Intent intent = new Intent(CallWechatActivity.this, SelectToSpeakService.class); + intent.putExtra("WechatInfo", mContact); + intent.putExtra("call_type", SelectToSpeakService.TYPE_VOICE); + startService(intent); + finish(); + } + } else { + ApkUtils.openPackage(CallWechatActivity.this, "com.tencent.mm"); finish(); } } diff --git a/app/src/main/java/com/vscool/os/activity/privacy/PrivacyActivity.java b/app/src/main/java/com/vscool/os/activity/privacy/PrivacyActivity.java new file mode 100644 index 0000000..4d2e5b1 --- /dev/null +++ b/app/src/main/java/com/vscool/os/activity/privacy/PrivacyActivity.java @@ -0,0 +1,99 @@ +package com.vscool.os.activity.privacy; + +import android.content.Intent; +import android.view.View; +import android.webkit.WebChromeClient; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import com.vscool.os.R; +import com.vscool.os.base.mvvm.BaseMvvmActivity; +import com.vscool.os.databinding.ActivityPrivacyBinding; + +public class PrivacyActivity extends BaseMvvmActivity { + private static final String TAG = "PrivacyActivity"; + + + @Override + public boolean setNightMode() { + return true; + } + + @Override + public boolean setfitWindow() { + return true; + } + + @Override + protected int getLayoutId() { + return R.layout.activity_privacy; + } + + @Override + protected void initDataBinding() { + mViewModel.setCtx(this); + mViewModel.setVDBinding(mViewDataBinding); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewDataBinding.setClick(new BtnClick()); + } + + @Override + protected void initView() { + WebSettings settings = mViewDataBinding.webView.getSettings(); +// settings.setUseWideViewPort(true); + settings.setJavaScriptEnabled(true); + settings.setAllowFileAccess(true); + settings.setAllowContentAccess(true); + settings.setAllowFileAccessFromFileURLs(true); + settings.setAllowUniversalAccessFromFileURLs(true); + settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); + + mViewDataBinding.webView.setWebViewClient(new WebViewClient()); + mViewDataBinding.webView.setWebChromeClient(new WebChromeClient() { + @Override + public void onProgressChanged(WebView view, int newProgress) { + super.onProgressChanged(view, newProgress); + if (newProgress == 100) { + mViewDataBinding.progressBar.setVisibility(View.GONE); + } else { + mViewDataBinding.progressBar.setVisibility(View.VISIBLE); + mViewDataBinding.progressBar.setMax(100); + mViewDataBinding.progressBar.setProgress(newProgress); + } + } + }); + Intent intent = getIntent(); + int contentType = intent.getIntExtra("ContentType", 1); + switch (contentType) { + default: + case 1: + mViewDataBinding.tvTitle.setText("用户协议"); + mViewDataBinding.webView.loadUrl("https://www.uiuios.com/agreement.html?section=1-1&status=1&projectId=10"); + break; + case 2: + mViewDataBinding.tvTitle.setText("隐私政策"); + mViewDataBinding.webView.loadUrl("https://www.uiuios.com/agreement.html?section=1-2&status=1&projectId=10"); + break; + case 3: + mViewDataBinding.tvTitle.setText("SDK共享清单"); + mViewDataBinding.webView.loadUrl("https://www.uiuios.com/agreement.html?section=1-3&status=1&projectId=10"); + break; + case 4: + mViewDataBinding.tvTitle.setText("微信一键视频、语音通话功能用户须知"); + mViewDataBinding.webView.loadUrl("https://www.uiuios.com/agreement.html?section=3-6&status=1&projectId=10"); + break; + } + } + + @Override + protected void initData() { + + } + + public class BtnClick { + public void exit(View view) { + finish(); + } + } +} diff --git a/app/src/main/java/com/vscool/os/activity/privacy/PrivacyViewModel.java b/app/src/main/java/com/vscool/os/activity/privacy/PrivacyViewModel.java new file mode 100644 index 0000000..3d18385 --- /dev/null +++ b/app/src/main/java/com/vscool/os/activity/privacy/PrivacyViewModel.java @@ -0,0 +1,19 @@ +package com.vscool.os.activity.privacy; + +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.vscool.os.base.mvvm.BaseViewModel; +import com.vscool.os.databinding.ActivityPrivacyBinding; + +public class PrivacyViewModel extends BaseViewModel { + + @Override + public ActivityPrivacyBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } + +} diff --git a/app/src/main/java/com/vscool/os/activity/setting/SettingActivity.java b/app/src/main/java/com/vscool/os/activity/setting/SettingActivity.java index 29bbfa1..5c4e704 100644 --- a/app/src/main/java/com/vscool/os/activity/setting/SettingActivity.java +++ b/app/src/main/java/com/vscool/os/activity/setting/SettingActivity.java @@ -33,6 +33,7 @@ import com.vscool.os.config.CommonConfig; import com.vscool.os.databinding.ActivitySettingBinding; import com.vscool.os.dialog.CustomDialog; import com.vscool.os.dialog.PermissionsDialog; +import com.vscool.os.fragment.dialog.PrivacyPolicyFragment; import com.vscool.os.service.main.MainService; import com.vscool.os.utils.AccessibilityUtils; import com.vscool.os.utils.ApkUtils; @@ -96,12 +97,18 @@ public class SettingActivity extends BaseMvvmActivity factoryClass = Class.forName("android.webkit.WebViewFactory"); + Field field = factoryClass.getDeclaredField("sProviderInstance"); + field.setAccessible(true); + Object sProviderInstance = field.get(null); + if (sProviderInstance != null) { + Log.d(TAG, "sProviderInstance isn't null"); + return; + } + Method getProviderClassMethod; + if (sdkInt > 22) { // above 22 + getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass"); + } else if (sdkInt == 22) { // method name is a little different + getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass"); + } else { // no security check below 22 + Log.i(TAG, "Don't need to Hook WebView"); + return; + } + getProviderClassMethod.setAccessible(true); + Class providerClass = (Class) getProviderClassMethod.invoke(factoryClass); + Class delegateClass = Class.forName("android.webkit.WebViewDelegate"); + Constructor declaredConstructor = delegateClass.getDeclaredConstructor(); + declaredConstructor.setAccessible(true); + sProviderInstance = providerClass + .getDeclaredMethod("create", delegateClass) + .invoke(providerClass, declaredConstructor.newInstance()); + Log.d("sProviderInstance", sProviderInstance.toString()); + field.set("sProviderInstance", sProviderInstance); + Log.d(TAG, "Hook done!"); + } catch (Throwable e) { + Log.e(TAG, "hook WebView Failed", e); + } + } } diff --git a/app/src/main/java/com/vscool/os/view/ToggleButton.java b/app/src/main/java/com/vscool/os/view/ToggleButton.java index eb0b052..2cdfbea 100644 --- a/app/src/main/java/com/vscool/os/view/ToggleButton.java +++ b/app/src/main/java/com/vscool/os/view/ToggleButton.java @@ -138,7 +138,9 @@ public class ToggleButton extends View { paint.setStrokeCap(Paint.Cap.ROUND); springSystem = SpringSystem.create(); spring = springSystem.createSpring(); - spring.setSpringConfig(SpringConfig.fromOrigamiTensionAndFriction(50, 7)); + //张力(tension),摩擦力(friction) + //增大张力会使弹簧更快地向目标值运动,减小摩擦力会减少弹簧运动过程中的阻力,从而使回弹更加迅速和有力。 + spring.setSpringConfig(SpringConfig.fromOrigamiTensionAndFriction(80, 10)); this.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { @@ -342,7 +344,7 @@ public class ToggleButton extends View { /** * @param on = = */ - public void onToggle(boolean on); + void onToggle(boolean on); } public void setOnToggleChanged(OnToggleChanged onToggleChanged) { diff --git a/app/src/main/res/drawable-hdpi/icon_back_black.png b/app/src/main/res/drawable-hdpi/icon_back_black.png new file mode 100644 index 0000000000000000000000000000000000000000..5bd377bc8482a4a072f14b7af6b7442e4f2cd0bc GIT binary patch literal 1061 zcmV+=1ls$FP)Px&-$_J4RCr$PondmDFc5_S<9j5(jc0s=#wTfflEx>Ady=>}@QmSid=Go9My+WZ z7tjg>Jc;LjnFzdkAIt8;2;ztzCH04yA@Gi143K3}ibFG-U8n9XMU!{KlO)7Ls2FM+I9tB1?w@)||aQ#oU$ z)UGIsjkN+`8+Zpq!#JPMZ*d$yRA{-*^L!7cu~j%;0m-sVXT)3G4C6T79FNDHl>%Uc zy#Zo^p><8u^wIY^;sp?0yp>YAX4HN{$PPU@cpzDpy+l#;&2VP%zIK%Jg9eginXVUq zI;k2c!N7pd5EBfg)JdPFeDA964>Gt6sqz^2L2DRAQ9Ob*NKV3m0%GtO<%IWnp0AzE z9&jfxKqPJLM?DD|222eR!r10{t~;)vKci>JlstyyNE#K$)I0_>5K~)w3qB~10Sm+g zBUFz82W09V0}2Q|h6Kkz7Z-(XZSWpLf~5B@O9*2U9%FPM^cWHZpU3o;A@msbFnYUm zVrpxr>M2V;iNV@RcR zGp-Scu&t%XaKqx)UTT3zVCb5WB+1rcJi+fuYu0o>awU*k&3F%9o$)5PPt$Z$wYaDf zh|p(@H=O{!xo&|`C6L8p@fyeRa{%*(okHEJ;kpcY(o4u{R=UDY(zC!Sukke%^%teo zS3+@*xoLfisqHmFxw-T2?!yjqj~}Jr)U!{^(=^@rz9bpp5HJGKK}y|v zT`Pw$QD0&Z0U?y(aEgJHAxW- z1_wf~(hOxZAoMELU`7Q(ukt^X(Sfin{tN{I2%-Fi0t19z4AZ&{PflM6=T!#Ex z;-+{H7&MS6dKGveQ}Zfb0Fk!EA>1wL4G;;G5bl)p3W&g~c>k<;?|{^`#i6_g$x9$* zYh1pZSpOZudvGD0y7?!Zut#{EAt9n65HP9)LLguYfQ7>hArLSHz`|jM5D1t8VBs)B f2n0+4uyB3?v^7?P5iB5H00000NkvXXu0mjf2q?>L literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_negative.xml b/app/src/main/res/drawable/ic_negative.xml new file mode 100644 index 0000000..2a3f38c --- /dev/null +++ b/app/src/main/res/drawable/ic_negative.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_positive.xml b/app/src/main/res/drawable/ic_positive.xml new file mode 100644 index 0000000..557dcdf --- /dev/null +++ b/app/src/main/res/drawable/ic_positive.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/policy_checkbox_bg.xml b/app/src/main/res/drawable/policy_checkbox_bg.xml new file mode 100644 index 0000000..ae1863c --- /dev/null +++ b/app/src/main/res/drawable/policy_checkbox_bg.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/privacy_policy_card_bg.xml b/app/src/main/res/drawable/privacy_policy_card_bg.xml new file mode 100644 index 0000000..fa6a0ce --- /dev/null +++ b/app/src/main/res/drawable/privacy_policy_card_bg.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/privacy_policy_negative_bg.xml b/app/src/main/res/drawable/privacy_policy_negative_bg.xml new file mode 100644 index 0000000..a6b2310 --- /dev/null +++ b/app/src/main/res/drawable/privacy_policy_negative_bg.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/privacy_policy_positive_bg.xml b/app/src/main/res/drawable/privacy_policy_positive_bg.xml new file mode 100644 index 0000000..da28637 --- /dev/null +++ b/app/src/main/res/drawable/privacy_policy_positive_bg.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/privacy_policy_positive_selector.xml b/app/src/main/res/drawable/privacy_policy_positive_selector.xml new file mode 100644 index 0000000..8604090 --- /dev/null +++ b/app/src/main/res/drawable/privacy_policy_positive_selector.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/progress_background.xml b/app/src/main/res/drawable/progress_background.xml new file mode 100644 index 0000000..4f3104c --- /dev/null +++ b/app/src/main/res/drawable/progress_background.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_privacy.xml b/app/src/main/res/layout/activity_privacy.xml new file mode 100644 index 0000000..b7ce74b --- /dev/null +++ b/app/src/main/res/layout/activity_privacy.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml index d6f7234..b483396 100644 --- a/app/src/main/res/layout/activity_setting.xml +++ b/app/src/main/res/layout/activity_setting.xml @@ -185,7 +185,40 @@ app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + + + android:onClick="@{click::callWechatVideo}"> + android:onClick="@{click::callWechatVoice}"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d05cb90..1e6f053 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -16,6 +16,9 @@ Settings 已清理%d个应用 + 您当前要开启微信自动拨打视频、语音、自动接听等功能,此功能需要开启系统的无障碍服务才能实现。用户在开启前需要明确知晓其风险,请详细查看协议内容,用户同意后方可使用此功能。 + 《微信一键视频、语音通话功能用户须知》 + Messages Sync