Skip to content

Commit 8607392

Browse files
committed
* fix 10.10微信红包支付失效
1 parent b3f11c0 commit 8607392

File tree

4 files changed

+413
-118
lines changed

4 files changed

+413
-118
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.yyxx.wechatfp.util;
2+
3+
import android.app.Activity;
4+
import android.view.View;
5+
import android.view.ViewGroup;
6+
7+
import com.yyxx.wechatfp.util.log.L;
8+
9+
import java.lang.ref.WeakReference;
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
13+
public class ActivityViewObserver {
14+
15+
private WeakReference<Activity> mActivityRef;
16+
private boolean mRunning = false;
17+
private String mViewIdentifier;
18+
19+
public ActivityViewObserver(Activity weakRefActivity, String viewIdentifier) {
20+
this.mActivityRef = new WeakReference<>(weakRefActivity);
21+
this.mViewIdentifier = viewIdentifier;
22+
}
23+
24+
public void start(long loopMSec, IActivityViewListener listener) {
25+
if (mRunning) {
26+
return;
27+
}
28+
mRunning = true;
29+
task(loopMSec, listener);
30+
}
31+
32+
public void stop() {
33+
mRunning = false;
34+
}
35+
36+
private void task(long loopMSec, IActivityViewListener listener) {
37+
if (!mRunning) {
38+
return;
39+
}
40+
Activity activity = mActivityRef.get();
41+
if (activity == null) {
42+
mRunning = false;
43+
return;
44+
}
45+
if (activity.isFinishing()) {
46+
mRunning = false;
47+
return;
48+
}
49+
if (activity.isDestroyed()) {
50+
mRunning = false;
51+
return;
52+
}
53+
54+
List<View> viewList = new ArrayList<>();
55+
List<View> decorViewList = ViewUtil.getWindowManagerViews();
56+
for (View decorView : decorViewList) {
57+
if (decorView instanceof ViewGroup) {
58+
} else {
59+
continue;
60+
}
61+
ViewUtil.getChildViewsByType((ViewGroup) decorView, this.mViewIdentifier, viewList);
62+
if (viewList.size() > 0) {
63+
break;
64+
}
65+
}
66+
if (viewList.size() > 0) {
67+
for (View targetView : viewList) {
68+
if (ViewUtil.isViewVisibleInScreen(targetView.getRootView())) {
69+
onViewFounded(listener, targetView);
70+
}
71+
}
72+
}
73+
Task.onMain(loopMSec, () -> task(loopMSec, listener));
74+
}
75+
76+
private void onViewFounded(IActivityViewListener listener, View view) {
77+
try {
78+
listener.onViewFounded(this, view);
79+
} catch (Exception e) {
80+
L.e(e);
81+
}
82+
}
83+
84+
public interface IActivityViewListener {
85+
void onViewFounded(ActivityViewObserver observer, View view);
86+
}
87+
}

app/src/main/java/com/yyxx/wechatfp/util/ViewUtil.java

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.app.Activity;
55
import android.content.res.Resources;
66
import android.graphics.Color;
7+
import android.graphics.Rect;
78
import android.graphics.drawable.ColorDrawable;
89
import android.graphics.drawable.Drawable;
910
import android.graphics.drawable.StateListDrawable;
@@ -43,7 +44,9 @@
4344

4445
import com.yyxx.wechatfp.util.log.L;
4546

47+
import java.lang.reflect.Field;
4648
import java.util.ArrayList;
49+
import java.util.Arrays;
4750
import java.util.Collections;
4851
import java.util.Comparator;
4952
import java.util.List;
@@ -428,4 +431,87 @@ public static int findChildViewPosition(ViewGroup viewGroup, View childView) {
428431
}
429432
return -1;
430433
}
434+
435+
public static List<View> getWindowManagerViews() {
436+
try {
437+
438+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH &&
439+
Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
440+
441+
// get the list from WindowManagerImpl.mViews
442+
Class wmiClass = Class.forName("android.view.WindowManagerImpl");
443+
Object wmiInstance = wmiClass.getMethod("getDefault").invoke(null);
444+
445+
return viewsFromWM(wmiClass, wmiInstance);
446+
447+
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
448+
449+
// get the list from WindowManagerGlobal.mViews
450+
Class wmgClass = Class.forName("android.view.WindowManagerGlobal");
451+
Object wmgInstance = wmgClass.getMethod("getInstance").invoke(null);
452+
453+
return viewsFromWM(wmgClass, wmgInstance);
454+
}
455+
456+
} catch (Exception e) {
457+
e.printStackTrace();
458+
}
459+
460+
return new ArrayList<View>();
461+
}
462+
463+
private static List<View> viewsFromWM(Class wmClass, Object wmInstance) throws Exception {
464+
465+
Field viewsField = wmClass.getDeclaredField("mViews");
466+
viewsField.setAccessible(true);
467+
Object views = viewsField.get(wmInstance);
468+
469+
if (views instanceof List) {
470+
return new ArrayList<View>((List<View>) viewsField.get(wmInstance));
471+
} else if (views instanceof View[]) {
472+
return Arrays.asList((View[])viewsField.get(wmInstance));
473+
}
474+
475+
return new ArrayList<View>();
476+
}
477+
478+
479+
public static boolean isShown(View v) {
480+
Rect r = new Rect();
481+
v.getGlobalVisibleRect(r);
482+
if (r.left == 0 && r.right == 0 && r.top == 0 && r.bottom == 0) {
483+
return false;
484+
}
485+
return true;
486+
}
487+
488+
public static boolean isViewVisibleInScreen(View view) {
489+
if (!isShown(view)) {
490+
return false;
491+
}
492+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
493+
if (!view.isAttachedToWindow()) {
494+
return false;
495+
}
496+
}
497+
if (view.getAlpha() == 0) {
498+
return false;
499+
}
500+
if (view.getWidth() <= 0 && view.getHeight() <= 0) {
501+
return false;
502+
}
503+
return view.getWindowVisibility() == View.VISIBLE;
504+
}
505+
506+
public static ViewGroup getTopestView(View view) {
507+
return getTopestView(view, null);
508+
}
509+
510+
private static ViewGroup getTopestView(View view, ViewGroup current) {
511+
View parent = view.getRootView();
512+
if (parent == null) {
513+
return current;
514+
}
515+
return getTopestView(parent, (ViewGroup)parent);
516+
}
431517
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.yyxx.wechatfp.util;
2+
3+
import android.view.View;
4+
5+
import com.yyxx.wechatfp.util.log.L;
6+
7+
import java.lang.ref.WeakReference;
8+
9+
public class ViewVisibleInScreenObserver {
10+
11+
private WeakReference<View> mViewRef;
12+
private boolean mViewVisibleInScreen;
13+
private boolean mRunning = false;
14+
15+
public ViewVisibleInScreenObserver(View weakRefView) {
16+
this.mViewRef = new WeakReference<>(weakRefView);
17+
this.mViewVisibleInScreen = ViewUtil.isViewVisibleInScreen(weakRefView);
18+
}
19+
20+
public void start(long loopMSec, IViewInScreenListener listener) {
21+
if (mRunning) {
22+
return;
23+
}
24+
mRunning = true;
25+
task(loopMSec, listener);
26+
}
27+
28+
public void stop() {
29+
mRunning = false;
30+
}
31+
32+
private void task(long loopMSec, IViewInScreenListener listener) {
33+
if (!mRunning) {
34+
return;
35+
}
36+
View view = mViewRef.get();
37+
if (view == null) {
38+
onViewVisbileInScreenStateChanged(listener, null, false);
39+
mRunning = false;
40+
return;
41+
}
42+
43+
boolean visibleInScreen = ViewUtil.isViewVisibleInScreen(view);
44+
L.d("visibleInScreen", visibleInScreen);
45+
if (visibleInScreen == mViewVisibleInScreen) {
46+
Task.onMain(loopMSec, () -> task(loopMSec, listener));
47+
return;
48+
}
49+
mViewVisibleInScreen = visibleInScreen;
50+
onViewVisbileInScreenStateChanged(listener, view, visibleInScreen);
51+
Task.onMain(loopMSec, () -> task(loopMSec, listener));
52+
}
53+
54+
private void onViewVisbileInScreenStateChanged(IViewInScreenListener listener, View view, boolean visibleInScreen) {
55+
try {
56+
listener.onViewVisibleInScreenStateChanged(this, view, visibleInScreen);
57+
} catch (Exception e) {
58+
L.e(e);
59+
}
60+
}
61+
62+
public interface IViewInScreenListener {
63+
void onViewVisibleInScreenStateChanged(ViewVisibleInScreenObserver observer, View view, boolean visibleInScreen);
64+
}
65+
66+
}

0 commit comments

Comments
 (0)