- Added realracing3-community.apk (71.57 MB) - Removed 32-bit support (armeabi-v7a) - Only includes arm64-v8a libraries - Decompiled source code included - Added README-community.md with analysis
273 lines
11 KiB
Java
273 lines
11 KiB
Java
package com.vungle.ads.internal;
|
|
|
|
import android.R;
|
|
import android.app.Activity;
|
|
import android.content.Context;
|
|
import android.graphics.Rect;
|
|
import android.os.Handler;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.view.ViewParent;
|
|
import android.view.ViewTreeObserver;
|
|
import androidx.annotation.VisibleForTesting;
|
|
import androidx.core.view.ViewCompat;
|
|
import com.vungle.ads.internal.util.Logger;
|
|
import java.lang.ref.WeakReference;
|
|
import java.util.ArrayList;
|
|
import java.util.Iterator;
|
|
import java.util.Map;
|
|
import java.util.WeakHashMap;
|
|
import kotlin.jvm.internal.DefaultConstructorMarker;
|
|
import kotlin.jvm.internal.Intrinsics;
|
|
|
|
/* loaded from: classes4.dex */
|
|
public final class ImpressionTracker {
|
|
private static final int MIN_VISIBILITY_PERCENTAGE = 1;
|
|
private static final int VISIBILITY_THROTTLE_MILLIS = 100;
|
|
private final Rect clipRect;
|
|
private boolean isVisibilityScheduled;
|
|
private final ViewTreeObserver.OnPreDrawListener onPreDrawListener;
|
|
private boolean setViewTreeObserverSucceed;
|
|
private final Map<View, TrackingInfo> trackedViews;
|
|
private final Handler visibilityHandler;
|
|
private final VisibilityRunnable visibilityRunnable;
|
|
private WeakReference<ViewTreeObserver> weakViewTreeObserver;
|
|
public static final Companion Companion = new Companion(null);
|
|
private static final String TAG = ImpressionTracker.class.getSimpleName();
|
|
|
|
public interface ImpressionListener {
|
|
void onImpression(View view);
|
|
}
|
|
|
|
@VisibleForTesting
|
|
public static final class TrackingInfo {
|
|
private ImpressionListener impressionListener;
|
|
private int minViewablePercent;
|
|
|
|
public final ImpressionListener getImpressionListener() {
|
|
return this.impressionListener;
|
|
}
|
|
|
|
public final int getMinViewablePercent() {
|
|
return this.minViewablePercent;
|
|
}
|
|
|
|
public final void setImpressionListener(ImpressionListener impressionListener) {
|
|
this.impressionListener = impressionListener;
|
|
}
|
|
|
|
public final void setMinViewablePercent(int i) {
|
|
this.minViewablePercent = i;
|
|
}
|
|
}
|
|
|
|
@VisibleForTesting
|
|
public static /* synthetic */ void getOnPreDrawListener$annotations() {
|
|
}
|
|
|
|
@VisibleForTesting
|
|
public static /* synthetic */ void getWeakViewTreeObserver$annotations() {
|
|
}
|
|
|
|
public final ViewTreeObserver.OnPreDrawListener getOnPreDrawListener() {
|
|
return this.onPreDrawListener;
|
|
}
|
|
|
|
public final WeakReference<ViewTreeObserver> getWeakViewTreeObserver() {
|
|
return this.weakViewTreeObserver;
|
|
}
|
|
|
|
public final void setWeakViewTreeObserver(WeakReference<ViewTreeObserver> weakReference) {
|
|
Intrinsics.checkNotNullParameter(weakReference, "<set-?>");
|
|
this.weakViewTreeObserver = weakReference;
|
|
}
|
|
|
|
@VisibleForTesting
|
|
public ImpressionTracker(Context context, Map<View, TrackingInfo> trackedViews, Handler visibilityHandler) {
|
|
Intrinsics.checkNotNullParameter(context, "context");
|
|
Intrinsics.checkNotNullParameter(trackedViews, "trackedViews");
|
|
Intrinsics.checkNotNullParameter(visibilityHandler, "visibilityHandler");
|
|
this.trackedViews = trackedViews;
|
|
this.visibilityHandler = visibilityHandler;
|
|
this.clipRect = new Rect();
|
|
this.visibilityRunnable = new VisibilityRunnable();
|
|
this.onPreDrawListener = new ViewTreeObserver.OnPreDrawListener() { // from class: com.vungle.ads.internal.ImpressionTracker$$ExternalSyntheticLambda0
|
|
@Override // android.view.ViewTreeObserver.OnPreDrawListener
|
|
public final boolean onPreDraw() {
|
|
boolean m3859_init_$lambda0;
|
|
m3859_init_$lambda0 = ImpressionTracker.m3859_init_$lambda0(ImpressionTracker.this);
|
|
return m3859_init_$lambda0;
|
|
}
|
|
};
|
|
this.weakViewTreeObserver = new WeakReference<>(null);
|
|
this.setViewTreeObserverSucceed = setViewTreeObserver(context, null);
|
|
}
|
|
|
|
/* JADX WARN: 'this' call moved to the top of the method (can break code semantics) */
|
|
public ImpressionTracker(Context context) {
|
|
this(context, new WeakHashMap(10), new Handler());
|
|
Intrinsics.checkNotNullParameter(context, "context");
|
|
}
|
|
|
|
private final boolean setViewTreeObserver(Context context, View view) {
|
|
ViewTreeObserver viewTreeObserver = this.weakViewTreeObserver.get();
|
|
if (viewTreeObserver != null && viewTreeObserver.isAlive()) {
|
|
return true;
|
|
}
|
|
View topView = getTopView(context, view);
|
|
if (topView == null) {
|
|
Logger.Companion companion = Logger.Companion;
|
|
String TAG2 = TAG;
|
|
Intrinsics.checkNotNullExpressionValue(TAG2, "TAG");
|
|
companion.d(TAG2, "Unable to set ViewTreeObserver due to no available root view.");
|
|
return false;
|
|
}
|
|
ViewTreeObserver viewTreeObserver2 = topView.getViewTreeObserver();
|
|
if (!viewTreeObserver2.isAlive()) {
|
|
Logger.Companion companion2 = Logger.Companion;
|
|
String TAG3 = TAG;
|
|
Intrinsics.checkNotNullExpressionValue(TAG3, "TAG");
|
|
companion2.d(TAG3, "The root view tree observer was not alive");
|
|
return false;
|
|
}
|
|
this.weakViewTreeObserver = new WeakReference<>(viewTreeObserver2);
|
|
viewTreeObserver2.addOnPreDrawListener(this.onPreDrawListener);
|
|
return true;
|
|
}
|
|
|
|
public final void addView(View view, ImpressionListener impressionListener) {
|
|
Intrinsics.checkNotNullParameter(view, "view");
|
|
this.setViewTreeObserverSucceed = setViewTreeObserver(view.getContext(), view);
|
|
TrackingInfo trackingInfo = this.trackedViews.get(view);
|
|
if (trackingInfo == null) {
|
|
trackingInfo = new TrackingInfo();
|
|
this.trackedViews.put(view, trackingInfo);
|
|
scheduleVisibilityCheck();
|
|
}
|
|
trackingInfo.setMinViewablePercent(1);
|
|
trackingInfo.setImpressionListener(impressionListener);
|
|
}
|
|
|
|
@VisibleForTesting
|
|
public final void removeView(View view) {
|
|
Intrinsics.checkNotNullParameter(view, "view");
|
|
this.trackedViews.remove(view);
|
|
}
|
|
|
|
public final void clear() {
|
|
this.trackedViews.clear();
|
|
this.visibilityHandler.removeMessages(0);
|
|
this.isVisibilityScheduled = false;
|
|
}
|
|
|
|
public final void destroy() {
|
|
clear();
|
|
ViewTreeObserver viewTreeObserver = this.weakViewTreeObserver.get();
|
|
if (viewTreeObserver != null && viewTreeObserver.isAlive()) {
|
|
viewTreeObserver.removeOnPreDrawListener(this.onPreDrawListener);
|
|
}
|
|
this.weakViewTreeObserver.clear();
|
|
}
|
|
|
|
private final View getTopView(Context context, View view) {
|
|
View findViewById = context instanceof Activity ? ((Activity) context).getWindow().getDecorView().findViewById(R.id.content) : null;
|
|
if (findViewById != null || view == null) {
|
|
return findViewById;
|
|
}
|
|
if (!ViewCompat.isAttachedToWindow(view)) {
|
|
Logger.Companion companion = Logger.Companion;
|
|
String TAG2 = TAG;
|
|
Intrinsics.checkNotNullExpressionValue(TAG2, "TAG");
|
|
companion.w(TAG2, "Trying to call View#rootView() on an unattached View.");
|
|
}
|
|
View rootView = view.getRootView();
|
|
if (rootView != null) {
|
|
findViewById = rootView.findViewById(R.id.content);
|
|
}
|
|
return findViewById == null ? rootView : findViewById;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public final void scheduleVisibilityCheck() {
|
|
if (this.isVisibilityScheduled) {
|
|
return;
|
|
}
|
|
this.isVisibilityScheduled = true;
|
|
this.visibilityHandler.postDelayed(this.visibilityRunnable, 100L);
|
|
}
|
|
|
|
@VisibleForTesting
|
|
public final class VisibilityRunnable implements Runnable {
|
|
private final ArrayList<View> visibleViews = new ArrayList<>();
|
|
|
|
public VisibilityRunnable() {
|
|
}
|
|
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
ImpressionListener impressionListener;
|
|
ImpressionTracker.this.isVisibilityScheduled = false;
|
|
for (Map.Entry entry : ImpressionTracker.this.trackedViews.entrySet()) {
|
|
View view = (View) entry.getKey();
|
|
if (ImpressionTracker.this.isVisible(view, ((TrackingInfo) entry.getValue()).getMinViewablePercent())) {
|
|
this.visibleViews.add(view);
|
|
}
|
|
}
|
|
Iterator<View> it = this.visibleViews.iterator();
|
|
while (it.hasNext()) {
|
|
View view2 = it.next();
|
|
TrackingInfo trackingInfo = (TrackingInfo) ImpressionTracker.this.trackedViews.get(view2);
|
|
if (trackingInfo != null && (impressionListener = trackingInfo.getImpressionListener()) != null) {
|
|
impressionListener.onImpression(view2);
|
|
}
|
|
ImpressionTracker impressionTracker = ImpressionTracker.this;
|
|
Intrinsics.checkNotNullExpressionValue(view2, "view");
|
|
impressionTracker.removeView(view2);
|
|
}
|
|
this.visibleViews.clear();
|
|
if (!(!ImpressionTracker.this.trackedViews.isEmpty()) || ImpressionTracker.this.setViewTreeObserverSucceed) {
|
|
return;
|
|
}
|
|
ImpressionTracker.this.scheduleVisibilityCheck();
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public final boolean isVisible(View view, int i) {
|
|
if (view == null || view.getVisibility() != 0 || view.getParent() == null) {
|
|
return false;
|
|
}
|
|
ViewParent parent = view.getParent();
|
|
while (parent instanceof ViewGroup) {
|
|
ViewGroup viewGroup = (ViewGroup) parent;
|
|
if (viewGroup.getVisibility() != 0) {
|
|
Logger.Companion.w("ImpressionTracker", "Parent visibility is not visible: " + parent);
|
|
return false;
|
|
}
|
|
parent = viewGroup.getParent();
|
|
}
|
|
if (!view.getGlobalVisibleRect(this.clipRect)) {
|
|
return false;
|
|
}
|
|
long height = view.getHeight() * view.getWidth();
|
|
return height > 0 && ((long) 100) * (this.clipRect.height() * this.clipRect.width()) >= ((long) i) * height;
|
|
}
|
|
|
|
public static final class Companion {
|
|
public /* synthetic */ Companion(DefaultConstructorMarker defaultConstructorMarker) {
|
|
this();
|
|
}
|
|
|
|
private Companion() {
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
/* renamed from: _init_$lambda-0, reason: not valid java name */
|
|
public static final boolean m3859_init_$lambda0(ImpressionTracker this$0) {
|
|
Intrinsics.checkNotNullParameter(this$0, "this$0");
|
|
this$0.scheduleVisibilityCheck();
|
|
return true;
|
|
}
|
|
}
|