Skip to content

Commit bbc2b35

Browse files
committed
+ 4.7.0 适配支付宝10.3.80.9100
* 微信支付界面优化
1 parent 1fad984 commit bbc2b35

22 files changed

+155
-56
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
1. 本软件的网络功能仅限检查自己软件更新功能, 如不放心, 欢迎REVIEW代码.
7777
2. 支付宝、淘宝、微信、QQ、云闪付均可沿用市场中的最新版.
7878
3. 云闪付请用play版本
79+
4. 支付宝10.3.80.9100及以上版本请前往 设置-->支付设置 中查找入口
7980

8081
![qq](./doc/qqGroup.png)
8182
#### QQ交流群: [665167891](http://shang.qq.com/wpa/qunwpa?idkey=91c2cd8f14532413701607c364f03f43afa1539a24b96b8907c92f3c018894e5)

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ android {
99
minSdkVersion 14
1010
targetSdkVersion 30
1111
versionCode 23
12-
versionName "4.6.0"
12+
versionName "4.7.0"
1313
buildConfigField "String", "APP_PRODUCT_NAME", "\"FingerprintPay\""
1414
}
1515

app/src/main/java/com/surcumference/fingerprint/Lang.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ public static String getString(int res) {
109109
return tr("启用", "啟用", "Enable");
110110
case R.id.settings_title_password:
111111
return tr("密码", "密碼", "Password");
112+
case R.id.settings_title_no_fingerprint_icon:
113+
return tr("显示指纹图标", "顯示指紋圖標", "Fingerprint Icon");
112114
case R.id.settings_title_donate:
113115
return tr("赞助我", "贊助我", "Donate me");
114116
case R.id.settings_sub_title_switch_alipay:
@@ -123,6 +125,8 @@ public static String getString(int res) {
123125
return tr("请输入支付宝的支付密码, 密码会加密后保存, 请放心", "請輸入支付宝的支付密碼, 密碼會加密后保存, 請放心", "Please enter your Payment password");
124126
case R.id.settings_sub_title_password_wechat:
125127
return tr("请输入微信的支付密码, 密码会加密后保存, 请放心", "請輸入微信的支付密碼, 密碼會加密后保存, 請放心", "Please enter your Payment password");
128+
case R.id.settings_sub_title_no_fingerprint_icon:
129+
return tr("非屏下指纹手机需要显示指纹图标", "非屏下指紋手機需要顯示指紋圖標", "Non IN-DISPLAY fingerprint phone need to display the fingerprint icon");
126130
case R.id.settings_sub_title_password_qq:
127131
return tr("请输入QQ的支付密码, 密码会加密后保存, 请放心", "請輸入QQ的支付密碼, 密碼會加密后保存, 請放心", "Please enter your Payment password");
128132
case R.id.settings_sub_title_password_unionpay:
@@ -138,7 +142,7 @@ public static String getString(int res) {
138142
case R.id.app_settings_name:
139143
return tr("指纹设置", "指紋設置", "Fingerprint");
140144
case R.id.wechat_payview_fingerprint_title:
141-
return tr("请验证指纹", "請驗證指紋", "Verify fingerprint");
145+
return tr(" 请验证指纹", " 請驗證指紋", " Verify fingerprint");
142146
case R.id.wechat_payview_password_title:
143147
return tr("请输入支付密码", "請輸入付款密碼", "Enter payment password");
144148
case R.id.wechat_payview_password_switch_text:

app/src/main/java/com/surcumference/fingerprint/plugin/AlipayBasePlugin.java

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import android.view.View;
1515
import android.view.ViewGroup;
1616
import android.widget.EditText;
17+
import android.widget.FrameLayout;
1718
import android.widget.ImageView;
1819
import android.widget.LinearLayout;
1920
import android.widget.ListView;
@@ -72,7 +73,11 @@ protected void onActivityCreated(Activity activity) {
7273
if (BuildConfig.DEBUG) {
7374
L.d("activity", activity, "clz", activityClzName);
7475
}
75-
if (activityClzName.contains(".MySettingActivity")) {
76+
int alipayVersionCode = getAlipayVersionCode(activity);
77+
if (alipayVersionCode >= 773 /** 10.3.80.9100 */ && activityClzName.contains(".FBAppWindowActivity")) {
78+
Task.onMain(500, () -> doSettingsMenuInject_10_1_38(activity));
79+
Task.onMain(1000, () -> doSettingsMenuInject_10_1_38(activity));
80+
} else if (activityClzName.contains(".MySettingActivity")) {
7681
Task.onMain(100, () -> doSettingsMenuInject_10_1_38(activity));
7782
} else if (activityClzName.contains(".UserSettingActivity")) {
7883
Task.onMain(100, () -> doSettingsMenuInject(activity));
@@ -85,7 +90,6 @@ protected void onActivityCreated(Activity activity) {
8590
return;
8691
}
8792
mIsViewTreeObserverFirst = true;
88-
int alipayVersionCode = getAlipayVersionCode(activity);
8993
activity.getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(() -> {
9094
if (mCurrentActivity == null) {
9195
return;
@@ -101,7 +105,7 @@ protected void onActivityCreated(Activity activity) {
101105
if (alipayVersionCode >= 661 /** 10.3.10.8310 */) {
102106
if (ViewUtils.findViewByName(activity, "com.alipay.android.phone.mobilecommon.verifyidentity", "simplePwdLayout") == null
103107
&& ViewUtils.findViewByName(activity, "com.alipay.android.phone.mobilecommon.verifyidentity", "mini_linSimplePwdComponent") == null
104-
&& ViewUtils.findViewByName(activity, "com.alipay.android.phone.mobilecommon.verifyidentity", "input_et_password") == null ) {
108+
&& ViewUtils.findViewByName(activity, "com.alipay.android.phone.mobilecommon.verifyidentity", "input_et_password") == null) {
105109
return;
106110
}
107111

@@ -301,9 +305,6 @@ private void clickDigitPasswordWidget(Activity activity) {
301305
}
302306

303307
private void doSettingsMenuInject_10_1_38(final Activity activity) {
304-
int listViewId = activity.getResources().getIdentifier("setting_list", "id", "com.alipay.android.phone.openplatform");
305-
306-
ListView listView = activity.findViewById(listViewId);
307308

308309
View lineTopView = new View(activity);
309310
lineTopView.setBackgroundColor(0xFFEEEEEE);
@@ -329,10 +330,13 @@ private void doSettingsMenuInject_10_1_38(final Activity activity) {
329330
itemSummerText.setGravity(Gravity.CENTER_VERTICAL);
330331
itemSummerText.setPadding(0, 0, DpUtils.dip2px(activity, 18), 0);
331332
itemSummerText.setTextColor(0xFF999999);
333+
int versionCode = getAlipayVersionCode(activity);
332334

333335
//try use Alipay style
334336
try {
335-
View settingsView = ViewUtils.findViewByName(activity, "com.alipay.mobile.antui", "item_left_text");
337+
View settingsView = versionCode >= 773 /** 10.3.80.9100 */
338+
? ViewUtils.findViewByText(activity.getWindow().getDecorView(), "生物支付", "Biological ID Pay")
339+
: ViewUtils.findViewByName(activity, "com.alipay.mobile.antui", "item_left_text");
336340
L.d("settingsView", settingsView);
337341
if (settingsView instanceof TextView) {
338342
TextView settingsTextView = (TextView) settingsView;
@@ -345,8 +349,8 @@ private void doSettingsMenuInject_10_1_38(final Activity activity) {
345349
L.e(e);
346350
}
347351

348-
int versionCode = getAlipayVersionCode(activity);
349-
if (versionCode >= 661 /** 10.3.10.8310 */) {
352+
if (versionCode >= 773 /** 10.3.80.9100 */) {
353+
} else if (versionCode >= 661 /** 10.3.10.8310 */) {
350354
ImageView itemIconImageView = new ImageView(activity);
351355
itemIconImageView.setImageBitmap(ImageUtils.base64ToBitmap(ICON_ALIPAY_SETTING_ENTRY_BASE64));
352356
LinearLayout.LayoutParams itemIconImageViewLayoutParams = new LinearLayout.LayoutParams(DpUtils.dip2px(activity, 24), DpUtils.dip2px(activity, 24));
@@ -378,7 +382,24 @@ private void doSettingsMenuInject_10_1_38(final Activity activity) {
378382

379383
rootLinearLayout.addView(lineBottomView, lineParams);
380384

381-
listView.addHeaderView(rootLinearLayout);
385+
if (versionCode >= 773 /** 10.3.80.9100 */) {
386+
View itemView = ViewUtils.findViewByText(activity.getWindow().getDecorView(), "生物支付", "Biological ID Pay");
387+
if (itemView != null) {
388+
ViewGroup itemViewGroup = (ViewGroup) itemView.getParent().getParent().getParent().getParent();
389+
L.d("生物支付item: " + ViewUtils.getViewInfo(itemViewGroup));
390+
itemViewGroup.setPadding(0, DpUtils.dip2px(activity, 62), 0, 0);
391+
itemViewGroup.setClipToPadding(false);
392+
FrameLayout.LayoutParams rootLinearLayoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
393+
rootLinearLayoutParams.topMargin = -DpUtils.dip2px(activity, 50);
394+
rootLinearLayoutParams.leftMargin = DpUtils.dip2px(activity, 12);
395+
rootLinearLayoutParams.rightMargin = DpUtils.dip2px(activity, 12);
396+
itemViewGroup.addView(rootLinearLayout, rootLinearLayoutParams);
397+
}
398+
} else {
399+
int listViewId = activity.getResources().getIdentifier("setting_list", "id", "com.alipay.android.phone.openplatform");
400+
ListView listView = activity.findViewById(listViewId);
401+
listView.addHeaderView(rootLinearLayout);
402+
}
382403
}
383404

384405
private void doSettingsMenuInject(final Activity activity) {

app/src/main/java/com/surcumference/fingerprint/plugin/WeChatBasePlugin.java

Lines changed: 65 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
import android.view.View;
1616
import android.view.ViewGroup;
1717
import android.view.ViewTreeObserver;
18+
import android.view.accessibility.AccessibilityNodeInfo;
1819
import android.widget.AbsListView;
1920
import android.widget.EditText;
21+
import android.widget.FrameLayout;
2022
import android.widget.ImageView;
2123
import android.widget.LinearLayout;
2224
import android.widget.ListView;
@@ -49,6 +51,7 @@
4951

5052
import java.lang.reflect.Field;
5153
import java.util.ArrayList;
54+
import java.util.List;
5255
import java.util.WeakHashMap;
5356

5457
public class WeChatBasePlugin {
@@ -234,8 +237,10 @@ private void stopFragmentObserver(Activity activity) {
234237
protected void onPayDialogShown(ViewGroup rootView) {
235238
L.d("PayDialog show");
236239
Context context = rootView.getContext();
237-
if (Config.from(context).isOn()) {
240+
Config config = Config.from(context);
241+
if (config.isOn()) {
238242
int versionCode = getWeChatVersionCode(context);
243+
ViewUtils.recursiveLoopChildren(rootView);
239244
WeChatPayDialog payDialogView = WeChatPayDialog.findFrom(versionCode, rootView);
240245
L.d(payDialogView);
241246
if (payDialogView == null) {
@@ -245,7 +250,7 @@ protected void onPayDialogShown(ViewGroup rootView) {
245250

246251
ViewGroup passwordLayout = payDialogView.passwordLayout;
247252
EditText mInputEditText = payDialogView.inputEditText;
248-
View keyboardView = payDialogView.keyboardView;
253+
List<View> keyboardViews = payDialogView.keyboardViews;
249254
TextView usePasswordText = payDialogView.usePasswordText;
250255
TextView titleTextView = payDialogView.titleTextView;
251256

@@ -280,28 +285,56 @@ public void onWindowDetached() {
280285
} catch (OutOfMemoryError e) {
281286
L.d(e);
282287
}
283-
fingerprintImageView.setScaleY(4F);
284-
fingerprintImageView.setScaleX(4F);
285-
RelativeLayout.LayoutParams fingerprintImageViewLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
286-
fingerprintImageViewLayoutParams.topMargin = DpUtils.dip2px(context, 24);
288+
RelativeLayout.LayoutParams fingerprintImageViewLayoutParams = new RelativeLayout.LayoutParams(DpUtils.dip2px(context, 70), DpUtils.dip2px(context, 70));
289+
fingerprintImageViewLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
290+
fingerprintImageViewLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
291+
fingerprintImageViewLayoutParams.bottomMargin = DpUtils.dip2px(context, 180);
287292
fingerPrintLayout.addView(fingerprintImageView, fingerprintImageViewLayoutParams);
293+
fingerprintImageView.setVisibility(config.isShowFingerprintIcon() ? View.VISIBLE : View.GONE);
294+
// 防止从选择支付页面返回时标题出错
295+
ViewTreeObserver.OnGlobalLayoutListener layoutListener = (ViewTreeObserver.OnGlobalLayoutListener) passwordLayout.getTag(R.id.tag_password_layout_listener);
296+
if (layoutListener != null) {
297+
passwordLayout.getViewTreeObserver().removeOnGlobalLayoutListener(layoutListener);
298+
}
299+
layoutListener = () -> {
300+
AccessibilityNodeInfo nodeInfo = AccessibilityNodeInfo.obtain();
301+
passwordLayout.onInitializeAccessibilityNodeInfo(nodeInfo);
302+
if (nodeInfo.isVisibleToUser()) {
303+
if (fingerPrintLayout.getVisibility() != View.VISIBLE) {
304+
fingerPrintLayout.setVisibility(View.VISIBLE);
305+
// 防止从选择支付页面返回时标题出错
306+
if (titleTextView != null) {
307+
if (mInputEditText.getVisibility() == View.VISIBLE) {
308+
titleTextView.setText(Lang.getString(R.id.wechat_payview_password_title));
309+
} else {
310+
titleTextView.setText(Lang.getString(R.id.wechat_payview_fingerprint_title));
311+
}
312+
}
313+
}
314+
} else {
315+
if (fingerPrintLayout.getVisibility() != View.GONE) {
316+
fingerPrintLayout.setVisibility(View.GONE);
317+
}
318+
}
319+
nodeInfo.recycle();
320+
};
321+
passwordLayout.setTag(R.id.tag_password_layout_listener, layoutListener);
322+
passwordLayout.getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
288323

289324
final Runnable switchToFingerprintRunnable = ()-> {
290325
mInputEditText.setVisibility(View.GONE);
291-
keyboardView.setVisibility(View.GONE);
292-
View fingerPrintLayoutLast = passwordLayout.findViewWithTag("fingerPrintLayout");
326+
for (View keyboardView : keyboardViews) {
327+
keyboardView.setVisibility(View.GONE);
328+
}
329+
View fingerPrintLayoutLast = rootView.findViewWithTag("fingerPrintLayout");
293330
if (fingerPrintLayoutLast != null) {
294-
passwordLayout.removeView(fingerPrintLayoutLast);
331+
rootView.removeView(fingerPrintLayoutLast);
295332
}
296-
passwordLayout.addView(fingerPrintLayout);
297-
passwordLayout.setClipChildren(false);
298-
((ViewGroup)passwordLayout.getParent()).setClipChildren(false);
299-
((ViewGroup)passwordLayout.getParent().getParent()).setClipChildren(false);
333+
rootView.addView(fingerPrintLayout, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
300334

301335
initFingerPrintLock(context, ()-> {
302336
BlackListUtils.applyIfNeeded(context);
303337
//SUCCESS UNLOCK
304-
Config config = Config.from(context);
305338
String pwd = config.getPassword();
306339
if (TextUtils.isEmpty(pwd)) {
307340
Toast.makeText(context, Lang.getString(R.id.toast_password_not_set_wechat), Toast.LENGTH_SHORT).show();
@@ -325,9 +358,9 @@ public void onWindowDetached() {
325358
};
326359

327360
final Runnable switchToPasswordRunnable = ()-> {
328-
passwordLayout.removeView(fingerPrintLayout);
361+
rootView.removeView(fingerPrintLayout);
329362
mInputEditText.setVisibility(View.VISIBLE);
330-
keyboardView.setVisibility(View.VISIBLE);
363+
keyboardViews.get(keyboardViews.size() - 1).setVisibility(View.VISIBLE);
331364
mInputEditText.performClick();
332365
mFingerprintIdentify.cancelIdentify();
333366
mMockCurrentUser = false;
@@ -356,6 +389,22 @@ public void onWindowDetached() {
356389
return true;
357390
});
358391
}
392+
if (titleTextView != null) {
393+
titleTextView.setOnTouchListener((view, motionEvent) -> {
394+
try {
395+
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
396+
if (mInputEditText.getVisibility() == View.GONE) {
397+
switchToPasswordRunnable.run();
398+
} else {
399+
switchToFingerprintRunnable.run();
400+
}
401+
}
402+
} catch (Exception e) {
403+
L.e(e);
404+
}
405+
return true;
406+
});
407+
}
359408

360409
fingerprintImageView.setOnClickListener(view -> switchToPasswordRunnable.run());
361410
switchToFingerprintRunnable.run();

app/src/main/java/com/surcumference/fingerprint/util/Config.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,14 @@ public void setPassword(String password) {
6969
mCache.sharedPreferences.edit().putString("password", enc).apply();
7070
}
7171

72+
public boolean isShowFingerprintIcon() {
73+
return mCache.sharedPreferences.getBoolean("fingerprint_icon", true);
74+
}
75+
76+
public void setShowFingerprintIcon(boolean on) {
77+
mCache.sharedPreferences.edit().putBoolean("fingerprint_icon", on).apply();
78+
}
79+
7280
public void setSkipVersion(String version) {
7381
mCache.sharedPreferences.edit().putString("skip_version", version).apply();
7482
mCache.mainAppSharedPreferences.edit().putString("skip_version", version).apply();

app/src/main/java/com/surcumference/fingerprint/util/ViewUtils.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,9 @@ public static String getViewInfo(View view) {
258258
stringBuffer.append(" desc:").append(desc);
259259
}
260260
stringBuffer.append(" tag:").append(view.getTag());
261+
if (view instanceof ViewGroup) {
262+
stringBuffer.append(" child:").append(((ViewGroup) view).getChildCount());
263+
}
261264
return stringBuffer.toString();
262265
}
263266

0 commit comments

Comments
 (0)