Skip to content

Commit 3ba53fa

Browse files
committed
Support CryptoObject
1 parent 7ba30be commit 3ba53fa

40 files changed

+858
-561
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
[submodule "riru/Riru-ModuleTemplate"]
22
path = riru/Riru-ModuleTemplate
33
url = https://github.com/RikkaApps/Riru-ModuleTemplate.git
4+
[submodule "3rdparty/FingerprintIdentify"]
5+
path = 3rdparty/FingerprintIdentify
6+
url = git@github.com:eritpchy/FingerprintIdentify.git

3rdparty/FingerprintIdentify

Submodule FingerprintIdentify added at 4f7d702

app/build.gradle

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ android {
77
applicationId "com.surcumference.fingerprintpay"
88
minSdkVersion 14
99
targetSdkVersion 33
10-
versionCode 29
11-
versionName "4.8.2"
10+
versionCode 30
11+
versionName "5.0.0"
1212
buildConfigField "String", "APP_PRODUCT_NAME", "\"FingerprintPay\""
1313
}
1414

@@ -62,7 +62,8 @@ project.ext.appInfo = [
6262
apply from: 'debug.gradle'
6363
apply from: 'update-json.gradle'
6464
dependencies {
65-
implementation 'com.wei.android.lib:fingerprintidentify:1.2.6'
65+
implementation project(":3rdparty:FingerprintIdentify:FingerprintIdentifyLib")
66+
implementation 'co.infinum:goldfinger:2.1.0'
6667
implementation 'com.google.code.gson:gson:2.8.6'
6768
implementation 'com.squareup.okhttp3:okhttp:3.12.8'
6869
implementation 'com.umeng.analytics:analytics:6.1.2'
@@ -71,5 +72,6 @@ dependencies {
7172
implementation 'com.lzy.net:okgo:3.0.4'
7273
implementation 'eu.chainfire:libsuperuser:1.1.0.202004101746'
7374
implementation 'net.lingala.zip4j:zip4j:1.3.2'
75+
implementation 'com.github.getActivity:Toaster:12.5'
7476
compileOnly 'de.robv.android.xposed:api:53'
7577
}

app/proguard-rules.pro

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,5 @@
1515
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
1616
# public *;
1717
#}
18+
19+
-keep class com.hjq.toast.** {*;}

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public static String getString(int res) {
112112
case R.id.settings_title_switch:
113113
return tr("启用", "啟用", "Enable");
114114
case R.id.settings_title_password:
115-
return tr("密码", "密碼", "Password");
115+
return tr("支付密码", "支付密碼", "Payment Password");
116116
case R.id.settings_title_no_fingerprint_icon:
117117
return tr("显示指纹图标", "顯示指紋圖標", "Fingerprint Icon");
118118
case R.id.settings_title_donate:
@@ -194,6 +194,10 @@ public static String getString(int res) {
194194
return tr("系统限制,重启后必须验证密码后才能使用指纹验证", "系統限制,重啟後必須驗證密碼後才能使用指紋驗證", "Reboot and enable fingerprint verification with your PIN");
195195
case R.id.toast_fingerprint_not_enable:
196196
return tr("系统指纹功能未启用", "系統指紋功能未啟用", "Fingerprint verification has been closed by system");
197+
case R.id.toast_fingerprint_password_enc_success:
198+
return tr("支付密码加密成功", "支付密碼加密成功", "Payment password encryption successful");
199+
case R.id.toast_fingerprint_password_dec_failed:
200+
return tr("支付密码解密失败, 请重新设定支付密码", "支付密码解密失败, 请重新设定支付密码", "Decryption of payment password failed, please reset the payment password");
197201
case R.id.toast_password_not_set_alipay:
198202
return tr("未设定支付密码,请前往設置->指紋設置中设定支付宝的支付密码", "未設定支付密碼,請前往設置 -> 指紋設置中設定支付寶的支付密碼", "Payment password not set, please goto Settings -> Fingerprint to enter you payment password");
199203
case R.id.toast_password_not_set_taobao:
@@ -204,6 +208,8 @@ public static String getString(int res) {
204208
return tr("未设定支付密码,请前往設置->指紋設置中设定QQ的支付密码", "未設定支付密碼,請前往設置 -> 指紋設置中設定QQ的支付密碼", "Payment password not set, please goto Settings -> Fingerprint to enter you payment password");
205209
case R.id.toast_password_not_set_generic:
206210
return tr("未设定支付密码,请前往設置->指紋設置中设定支付密码", "未設定支付密碼,請前往設置 -> 指紋設置中設定支付密碼", "Payment password not set, please goto Settings -> Fingerprint to enter you payment password");
211+
case R.id.toast_password_not_set_switch_on_failed:
212+
return tr("启用失败, 请先设定支付密码", "啟用失敗, 請先設定支付密碼", "Enabled failed, please set a payment password first");
207213
case R.id.toast_password_auto_enter_fail:
208214
return tr("Oops.. 输入失败了. 请手动输入密码", "Oops.. 輸入失敗了. 請手動輸入密碼", "Oops... auto input failure, switch to manual input");
209215
case R.id.toast_goto_donate_page_fail_alipay:

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.app.Application;
44
import android.content.Context;
55

6+
import com.hjq.toast.Toaster;
67
import com.surcumference.fingerprint.bean.PluginType;
78
import com.surcumference.fingerprint.plugin.PluginApp;
89

@@ -13,4 +14,10 @@ protected void attachBaseContext(Context base) {
1314
super.attachBaseContext(base);
1415
PluginApp.setup(PluginType.Xposed, null);
1516
}
17+
18+
@Override
19+
public void onCreate() {
20+
super.onCreate();
21+
Toaster.init(this);
22+
}
1623
}

app/src/main/java/com/surcumference/fingerprint/activity/HomeActivity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
import android.view.View;
2020
import android.widget.AdapterView;
2121
import android.widget.ListView;
22-
import android.widget.Toast;
2322

2423
import androidx.appcompat.app.AppCompatActivity;
2524

25+
import com.hjq.toast.Toaster;
2626
import com.surcumference.fingerprint.BuildConfig;
2727
import com.surcumference.fingerprint.Lang;
2828
import com.surcumference.fingerprint.R;
@@ -95,7 +95,7 @@ public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
9595
WebActivity.openUrl(this, HELP_URL_LICENSE);
9696
} else if (Lang.getString(R.id.settings_title_webside).equals(data.title)) {
9797
com.surcumference.fingerprint.util.UrlUtils.openUrl(this, PROJECT_URL);
98-
Toast.makeText(this, Lang.getString(R.id.toast_give_me_star), Toast.LENGTH_LONG).show();
98+
Toaster.showLong(Lang.getString(R.id.toast_give_me_star));
9999
}
100100
}
101101

app/src/main/java/com/surcumference/fingerprint/network/updateCheck/UpdateFactory.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
import android.content.Intent;
77
import android.net.Uri;
88
import android.text.TextUtils;
9-
import android.widget.Toast;
109

1110
import androidx.annotation.Nullable;
1211

12+
import com.hjq.toast.Toaster;
1313
import com.surcumference.fingerprint.BuildConfig;
1414
import com.surcumference.fingerprint.Constant;
1515
import com.surcumference.fingerprint.Lang;
@@ -55,7 +55,7 @@ public static void doUpdateCheck(final Context context) {
5555

5656
public static void doUpdateCheck(final Context context, final boolean quite, final boolean dontSkip) {
5757
if (!quite) {
58-
Toast.makeText(context, Lang.getString(R.id.toast_checking_update), Toast.LENGTH_LONG).show();
58+
Toaster.showLong(Lang.getString(R.id.toast_checking_update));
5959
}
6060
try {
6161
String packageName = context.getPackageName();
@@ -70,14 +70,14 @@ public static void doUpdateCheck(final Context context, final boolean quite, fin
7070
@Override
7171
public void onNoUpdate() {
7272
if (!quite) {
73-
Toast.makeText(context, Lang.getString(R.id.toast_no_update), Toast.LENGTH_LONG).show();
73+
Toaster.showLong(Lang.getString(R.id.toast_no_update));
7474
}
7575
}
7676

7777
@Override
7878
public void onNetErr() {
7979
if (!quite) {
80-
Toast.makeText(context, Lang.getString(R.id.toast_check_update_fail_net_err), Toast.LENGTH_LONG).show();
80+
Toaster.showLong(Lang.getString(R.id.toast_check_update_fail_net_err));
8181
}
8282
}
8383

@@ -136,7 +136,7 @@ private static void handleMagiskUpdate(Context context, UpdateInfo updateInfo, D
136136
Map<PluginTarget, Boolean> instPluginTargetSelectionMap = instPluginTargetSelectionView.getSelection();
137137
L.d("instPluginTargetSelectionMap", instPluginTargetSelectionMap);
138138
if (!instPluginTargetSelectionMap.values().contains(true)) {
139-
Toast.makeText(context, Lang.getString(R.id.update_at_least_select_one), Toast.LENGTH_SHORT).show();
139+
Toaster.showShort(Lang.getString(R.id.update_at_least_select_one));
140140
return;
141141
}
142142
dialog.dismiss();

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

Lines changed: 43 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -19,43 +19,46 @@
1919
import android.widget.LinearLayout;
2020
import android.widget.ListView;
2121
import android.widget.TextView;
22-
import android.widget.Toast;
2322

23+
import com.hjq.toast.Toaster;
2424
import com.surcumference.fingerprint.BuildConfig;
2525
import com.surcumference.fingerprint.Lang;
2626
import com.surcumference.fingerprint.R;
2727
import com.surcumference.fingerprint.bean.DigitPasswordKeyPadInfo;
2828
import com.surcumference.fingerprint.plugin.inf.IAppPlugin;
29+
import com.surcumference.fingerprint.plugin.inf.OnFingerprintVerificationOKListener;
30+
import com.surcumference.fingerprint.util.AESUtils;
2931
import com.surcumference.fingerprint.util.ActivityViewObserver;
3032
import com.surcumference.fingerprint.util.AlipayVersionControl;
3133
import com.surcumference.fingerprint.util.ApplicationUtils;
3234
import com.surcumference.fingerprint.util.BlackListUtils;
3335
import com.surcumference.fingerprint.util.Config;
3436
import com.surcumference.fingerprint.util.DpUtils;
3537
import com.surcumference.fingerprint.util.ImageUtils;
36-
import com.surcumference.fingerprint.util.NotifyUtils;
3738
import com.surcumference.fingerprint.util.StyleUtils;
3839
import com.surcumference.fingerprint.util.Task;
3940
import com.surcumference.fingerprint.util.ViewUtils;
41+
import com.surcumference.fingerprint.util.XFingerprintIdentify;
4042
import com.surcumference.fingerprint.util.drawable.XDrawable;
4143
import com.surcumference.fingerprint.util.log.L;
4244
import com.surcumference.fingerprint.view.AlipayPayView;
4345
import com.surcumference.fingerprint.view.DialogFrameLayout;
4446
import com.surcumference.fingerprint.view.SettingsView;
45-
import com.wei.android.lib.fingerprintidentify.FingerprintIdentify;
46-
import com.wei.android.lib.fingerprintidentify.base.BaseFingerprint;
47+
import com.wei.android.lib.fingerprintidentify.bean.FingerprintIdentifyFailInfo;
4748

4849
import java.util.ArrayList;
4950
import java.util.List;
5051

52+
import javax.crypto.Cipher;
53+
5154
public class AlipayBasePlugin implements IAppPlugin {
5255

5356

5457
private AlertDialog mFingerPrintAlertDialog;
5558
private boolean mPwdActivityDontShowFlag;
5659
private int mPwdActivityReShowDelayTimeMsec;
5760

58-
private FingerprintIdentify mFingerprintIdentify;
61+
private XFingerprintIdentify mFingerprintIdentify;
5962
private Activity mCurrentActivity;
6063

6164
private boolean mIsViewTreeObserverFirst;
@@ -188,50 +191,26 @@ public void onActivityResumed(Activity activity) {
188191
mCurrentActivity = activity;
189192
}
190193

191-
public void initFingerPrintLock(final Context context, final Runnable onSuccessUnlockCallback) {
192-
mFingerprintIdentify = new FingerprintIdentify(context);
193-
mFingerprintIdentify.setSupportAndroidL(true);
194-
mFingerprintIdentify.init();
195-
if (mFingerprintIdentify.isFingerprintEnable()) {
196-
mFingerprintIdentify.startIdentify(5, new BaseFingerprint.IdentifyListener() {
197-
@Override
198-
public void onSucceed() {
199-
L.d("指纹识别成功");
200-
onSuccessUnlockCallback.run();
201-
}
202-
203-
@Override
204-
public void onNotMatch(int availableTimes) {
205-
// 指纹不匹配,并返回可用剩余次数并自动继续验证
206-
L.d("指纹识别失败,还可尝试" + String.valueOf(availableTimes) + "次");
207-
NotifyUtils.notifyFingerprint(context, Lang.getString(R.id.toast_fingerprint_not_match));
208-
}
194+
public void initFingerPrintLock(final Context context, OnFingerprintVerificationOKListener onSuccessUnlockCallback) {
195+
mFingerprintIdentify = new XFingerprintIdentify(context)
196+
.startIdentify(new XFingerprintIdentify.IdentifyListener() {
197+
@Override
198+
public void onSucceed(Cipher cipher) {
199+
super.onSucceed(cipher);
200+
onSuccessUnlockCallback.onFingerprintVerificationOK(cipher);
201+
}
209202

210-
@Override
211-
public void onFailed(boolean isDeviceLocked) {
212-
// 错误次数达到上限或者API报错停止了验证,自动结束指纹识别
213-
// isDeviceLocked 表示指纹硬件是否被暂时锁定
214-
L.d("多次尝试错误,请确认指纹 isDeviceLocked", isDeviceLocked);
215-
NotifyUtils.notifyFingerprint(context, Lang.getString(R.id.toast_fingerprint_retry_ended));
216-
AlertDialog dialog = mFingerPrintAlertDialog;
217-
if (dialog != null) {
218-
if (dialog.isShowing()) {
219-
dialog.dismiss();
203+
@Override
204+
public void onFailed(FingerprintIdentifyFailInfo failInfo) {
205+
super.onFailed(failInfo);
206+
AlertDialog dialog = mFingerPrintAlertDialog;
207+
if (dialog != null) {
208+
if (dialog.isShowing()) {
209+
dialog.dismiss();
210+
}
220211
}
221212
}
222-
}
223-
224-
@Override
225-
public void onStartFailedByDeviceLocked() {
226-
// 第一次调用startIdentify失败,因为设备被暂时锁定
227-
L.d("系统限制,重启后必须验证密码后才能使用指纹验证");
228-
NotifyUtils.notifyFingerprint(context, Lang.getString(R.id.toast_fingerprint_unlock_reboot));
229-
}
230-
});
231-
} else {
232-
L.d("系统指纹功能未启用");
233-
NotifyUtils.notifyFingerprint(context, Lang.getString(R.id.toast_fingerprint_not_enable));
234-
}
213+
});
235214
}
236215

237216
public boolean showFingerPrintDialog(final Activity activity) {
@@ -252,11 +231,16 @@ public boolean showFingerPrintDialog(final Activity activity) {
252231
mPwdActivityDontShowFlag = false;
253232
mPwdActivityReShowDelayTimeMsec = 0;
254233
clickDigitPasswordWidget(activity);
255-
initFingerPrintLock(context, () -> {
234+
initFingerPrintLock(context, (cipher) -> {
256235
BlackListUtils.applyIfNeeded(context);
257-
String pwd = Config.from(activity).getPassword();
258-
if (TextUtils.isEmpty(pwd)) {
259-
Toast.makeText(activity, Lang.getString(R.id.toast_password_not_set_alipay), Toast.LENGTH_SHORT).show();
236+
String passwordEncrypted = Config.from(activity).getPasswordEncrypted();
237+
if (TextUtils.isEmpty(passwordEncrypted)) {
238+
Toaster.showShort(Lang.getString(R.id.toast_password_not_set_alipay));
239+
return;
240+
}
241+
String password = AESUtils.decrypt(cipher, passwordEncrypted);
242+
if (TextUtils.isEmpty(password)) {
243+
Toaster.showShort(Lang.getString(R.id.toast_fingerprint_password_dec_failed));
260244
return;
261245
}
262246

@@ -268,26 +252,26 @@ public boolean showFingerPrintDialog(final Activity activity) {
268252
}
269253
};
270254

271-
if (!tryInputGenericPassword(activity, pwd)) {
255+
if (!tryInputGenericPassword(activity, password)) {
272256
boolean tryAgain = false;
273257
try {
274-
inputDigitPassword(activity, pwd);
258+
inputDigitPassword(activity, password);
275259
} catch (NullPointerException e) {
276260
tryAgain = true;
277261
} catch (Exception e) {
278-
Toast.makeText(context, Lang.getString(R.id.toast_password_auto_enter_fail), Toast.LENGTH_LONG).show();
262+
Toaster.showLong(Lang.getString(R.id.toast_password_auto_enter_fail));
279263
L.e(e);
280264
}
281265
if (tryAgain) {
282266
clickDigitPasswordWidget(activity);
283267
Task.onMain(1000, ()-> {
284268
try {
285-
inputDigitPassword(activity, pwd);
269+
inputDigitPassword(activity, password);
286270
} catch (NullPointerException e) {
287-
Toast.makeText(context, Lang.getString(R.id.toast_password_auto_enter_fail), Toast.LENGTH_LONG).show();
271+
Toaster.showLong(Lang.getString(R.id.toast_password_auto_enter_fail));
288272
L.d("inputDigitPassword NPE", e);
289273
} catch (Exception e) {
290-
Toast.makeText(context, Lang.getString(R.id.toast_password_auto_enter_fail), Toast.LENGTH_LONG).show();
274+
Toaster.showLong(Lang.getString(R.id.toast_password_auto_enter_fail));
291275
L.e(e);
292276
}
293277
onCompleteRunnable.run();
@@ -297,15 +281,12 @@ public boolean showFingerPrintDialog(final Activity activity) {
297281
}
298282
onCompleteRunnable.run();
299283
});
300-
DialogFrameLayout alipayPayView = new AlipayPayView(context).withOnCloseImageClickListener(v -> {
284+
DialogFrameLayout alipayPayView = new AlipayPayView(context).withOnCloseImageClickListener((target, v) -> {
301285
mPwdActivityDontShowFlag = true;
302-
AlertDialog dialog1 = mFingerPrintAlertDialog;
303-
if (dialog1 != null) {
304-
dialog1.dismiss();
305-
}
286+
target.getDialog().dismiss();
306287
activity.onBackPressed();
307288
}).withOnDismissListener(v -> {
308-
FingerprintIdentify fingerprintIdentify = mFingerprintIdentify;
289+
XFingerprintIdentify fingerprintIdentify = mFingerprintIdentify;
309290
if (fingerprintIdentify != null) {
310291
fingerprintIdentify.cancelIdentify();
311292
}

0 commit comments

Comments
 (0)