|
19 | 19 | import android.view.View; |
20 | 20 | import android.view.ViewGroup; |
21 | 21 | import android.view.ViewTreeObserver; |
| 22 | +import android.widget.AbsListView; |
22 | 23 | import android.widget.EditText; |
23 | 24 | import android.widget.ImageView; |
24 | 25 | import android.widget.LinearLayout; |
|
27 | 28 | import android.widget.TextView; |
28 | 29 | import android.widget.Toast; |
29 | 30 |
|
| 31 | +import com.samsung.android.sdk.SsdkUnsupportedException; |
30 | 32 | import com.wei.android.lib.fingerprintidentify.FingerprintIdentify; |
31 | 33 | import com.wei.android.lib.fingerprintidentify.base.BaseFingerprint; |
32 | 34 | import com.yyxx.wechatfp.BuildConfig; |
|
43 | 45 | import com.yyxx.wechatfp.util.log.L; |
44 | 46 | import com.yyxx.wechatfp.view.SettingsView; |
45 | 47 |
|
| 48 | +import java.lang.reflect.Field; |
46 | 49 | import java.lang.reflect.Method; |
47 | 50 | import java.util.ArrayList; |
48 | 51 | import java.util.List; |
@@ -229,13 +232,14 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { |
229 | 232 |
|
230 | 233 | private void doSettingsMenuInject(final Activity activity) { |
231 | 234 | ListView itemView = (ListView)ViewUtil.findViewByName(activity, "android", "list"); |
232 | | - if (ViewUtil.findViewByText(itemView, Lang.getString(Lang.APP_SETTINGS_NAME)) != null) { |
| 235 | + if (ViewUtil.findViewByText(itemView, Lang.getString(Lang.APP_SETTINGS_NAME)) != null |
| 236 | + || isHeaderViewExistsFallback(itemView)) { |
233 | 237 | return; |
234 | 238 | } |
235 | 239 |
|
236 | 240 | LinearLayout settingsItemRootLLayout = new LinearLayout(activity); |
237 | 241 | settingsItemRootLLayout.setOrientation(LinearLayout.VERTICAL); |
238 | | - settingsItemRootLLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); |
| 242 | + settingsItemRootLLayout.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); |
239 | 243 | settingsItemRootLLayout.setPadding(0, DpUtil.dip2px(activity, 20), 0, 0); |
240 | 244 |
|
241 | 245 | LinearLayout settingsItemLinearLayout = new LinearLayout(activity); |
@@ -300,14 +304,49 @@ private void doSettingsMenuInject(final Activity activity) { |
300 | 304 | settingsItemLinearLayout.addView(itemHlinearLayout, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, DpUtil.dip2px(activity, 50))); |
301 | 305 |
|
302 | 306 | settingsItemRootLLayout.addView(settingsItemLinearLayout); |
| 307 | + settingsItemRootLLayout.setTag(BuildConfig.APPLICATION_ID); |
303 | 308 |
|
304 | 309 | itemView.addHeaderView(settingsItemRootLLayout); |
305 | 310 |
|
306 | 311 | } |
307 | 312 |
|
| 313 | + private boolean isHeaderViewExistsFallback(ListView listView) { |
| 314 | + if (listView == null) { |
| 315 | + return false; |
| 316 | + } |
| 317 | + if (listView.getHeaderViewsCount() <= 0) { |
| 318 | + return false; |
| 319 | + } |
| 320 | + try { |
| 321 | + Field mHeaderViewInfosField = ListView.class.getDeclaredField("mHeaderViewInfos"); |
| 322 | + mHeaderViewInfosField.setAccessible(true); |
| 323 | + ArrayList<ListView.FixedViewInfo> mHeaderViewInfos = (ArrayList<ListView.FixedViewInfo>) mHeaderViewInfosField.get(listView); |
| 324 | + if (mHeaderViewInfos != null) { |
| 325 | + for (ListView.FixedViewInfo viewInfo : mHeaderViewInfos) { |
| 326 | + if (viewInfo.view == null) { |
| 327 | + continue; |
| 328 | + } |
| 329 | + Object tag = viewInfo.view.getTag(); |
| 330 | + if (BuildConfig.APPLICATION_ID.equals(tag)) { |
| 331 | + L.d("found plugin settings headerView"); |
| 332 | + return true; |
| 333 | + } |
| 334 | + } |
| 335 | + } |
| 336 | + } catch (Exception e) { |
| 337 | + L.e(e); |
| 338 | + } |
| 339 | + return false; |
| 340 | + } |
| 341 | + |
308 | 342 | public synchronized void initFingerPrintLock(Context context, Runnable onSuccessUnlockRunnable) { |
309 | 343 | mMockCurrentUser = true; |
310 | | - mFingerprintIdentify = new FingerprintIdentify(context, exception -> L.e("fingerprint", exception)); |
| 344 | + mFingerprintIdentify = new FingerprintIdentify(context, exception -> { |
| 345 | + if (exception instanceof SsdkUnsupportedException) { |
| 346 | + return; |
| 347 | + } |
| 348 | + L.e("fingerprint", exception); |
| 349 | + }); |
311 | 350 | if (mFingerprintIdentify.isFingerprintEnable()) { |
312 | 351 | mFingerprintIdentify.startIdentify(3, new BaseFingerprint.FingerprintIdentifyListener() { |
313 | 352 | @Override |
|
0 commit comments