fix: improve TIM support

This commit is contained in:
ACh Sulfate
2022-03-21 14:25:28 +08:00
parent b3cfc8eeff
commit 85f3ecaf2d
5 changed files with 59 additions and 5 deletions

View File

@@ -1059,6 +1059,32 @@ public class Reflex {
return null;
}
@Nullable
public static Field findFirstDeclaredInstanceFieldByTypeOrNull(@NonNull Class<?> clazz, @NonNull Class<?> type) {
Objects.requireNonNull(clazz, "clazz == null");
Objects.requireNonNull(type, "type == null");
for (Field field : clazz.getDeclaredFields()) {
if (field.getType() == type && !Modifier.isStatic(field.getModifiers())) {
field.setAccessible(true);
return field;
}
}
return null;
}
@Nullable
public static Field findFirstDeclaredStaticFieldByTypeOrNull(@NonNull Class<?> clazz, @NonNull Class<?> type) {
Objects.requireNonNull(clazz, "clazz == null");
Objects.requireNonNull(type, "type == null");
for (Field field : clazz.getDeclaredFields()) {
if (field.getType() == type && Modifier.isStatic(field.getModifiers())) {
field.setAccessible(true);
return field;
}
}
return null;
}
public static Method findMethodByTypes_1(Class<?> clazz, Class returnType, Class... argt)
throws NoSuchMethodException {
Method method = null;

View File

@@ -29,6 +29,7 @@ import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowInsets;
import android.view.WindowManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
@@ -69,6 +70,13 @@ public abstract class AppCompatTransferActivity extends AppCompatActivity {
protected void requestTranslucentStatusBar() {
Window window = getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.flags &= ~WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
params.flags |= WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
}
window.setAttributes(params);
View decorView = window.getDecorView();
int option = decorView.getSystemUiVisibility()
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE

View File

@@ -666,7 +666,11 @@ public class BaseActivity extends AppCompatTransferActivity {
return;
}
try {
Class<?> activityLifecycleCallbacksClass = Initiator.loadClass("com.tencent.mobileqq.app.lifecycle.BaseActivityLifecycleCallbacks");
Class<?> activityLifecycleCallbacksClass = Initiator.load("com.tencent.mobileqq.app.lifecycle.BaseActivityLifecycleCallbacks");
if (activityLifecycleCallbacksClass == null) {
// fail silently if not found
return;
}
sOnActivityPreCreatedMethod = activityLifecycleCallbacksClass.getMethod("doOnActivityPreCreated", Activity.class, Bundle.class);
sOnActivityCreateMethod = activityLifecycleCallbacksClass.getMethod("doOnActivityCreate", Activity.class, Bundle.class);
sOnActivityPostCreatedMethod = activityLifecycleCallbacksClass.getMethod("doOnActivityPostCreated", Activity.class, Bundle.class);

View File

@@ -638,8 +638,12 @@ public class Initiator {
return null;
}
public static Class _C2CMessageManager() {
return load("com/tencent/imcore/message/C2CMessageManager");
public static Class<?> _C2CMessageManager() {
Class<?> k = load("com/tencent/imcore/message/C2CMessageManager");
if (k == null) {
k = load("com/tencent/mobileqq/app/message/C2CMessageManager");
}
return k;
}
public static Class _AllInOne() {

View File

@@ -26,10 +26,12 @@ import android.app.Activity;
import android.content.Intent;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cc.ioctl.util.Reflex;
import com.tencent.common.app.BaseApplicationImpl;
import io.github.qauxv.SyncUtils;
import io.github.qauxv.activity.BaseActivity;
import io.github.qauxv.util.HostInfo;
import io.github.qauxv.util.Initiator;
import io.github.qauxv.util.Log;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
@@ -76,8 +78,18 @@ public class StartupDirectorBridge {
fDirector.setAccessible(true);
mDirectorField = fDirector;
mNeedInterceptStartActivity = true;
} catch (ReflectiveOperationException e) {
Log.e(e);
} catch (NoSuchFieldException nfe) {
Class<?> kStartupDirector = Initiator._StartupDirector();
Field fDirector = null;
if (kStartupDirector != null) {
fDirector = Reflex.findFirstDeclaredStaticFieldByTypeOrNull(BaseApplicationImpl.class, kStartupDirector);
}
if (fDirector != null) {
mDirectorField = fDirector;
mNeedInterceptStartActivity = true;
} else {
Log.e("StartupDirector field not found", nfe);
}
}
}
}