Skip to content

Commit 6d11348

Browse files
committed
feat: optimize logcat floating
1 parent 92d6dbe commit 6d11348

File tree

16 files changed

+970
-784
lines changed

16 files changed

+970
-784
lines changed

app/src/main/java/org/levimc/launcher/core/minecraft/Application.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import xcrash.XCrash
1313
import java.io.File
1414
import android.content.Intent
1515
import org.levimc.launcher.ui.activities.CrashActivity
16-
import org.levimc.launcher.ui.views.LogcatOverlayManager
16+
import org.levimc.launcher.ui.dialogs.LogcatOverlayManager
1717

1818
class LauncherApplication : Application() {
1919

app/src/main/java/org/levimc/launcher/ui/activities/MainActivity.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import android.content.SharedPreferences;
66
import android.os.Bundle;
77
import android.text.TextUtils;
8-
import android.util.Log;
98
import android.view.MotionEvent;
109
import android.view.View;
1110
import android.widget.TextView;
@@ -41,7 +40,6 @@
4140
import org.levimc.launcher.ui.dialogs.gameversionselect.VersionUtil;
4241
import org.levimc.launcher.ui.views.MainViewModel;
4342
import org.levimc.launcher.ui.views.MainViewModelFactory;
44-
import org.levimc.launcher.ui.views.LogcatOverlay;
4543
import org.levimc.launcher.util.ApkImportManager;
4644
import org.levimc.launcher.util.GithubReleaseUpdater;
4745
import org.levimc.launcher.util.LanguageManager;

app/src/main/java/org/levimc/launcher/ui/activities/SettingsActivity.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.levimc.launcher.settings.FeatureSettings;
2424
import org.levimc.launcher.ui.adapter.SettingsAdapter;
2525
import org.levimc.launcher.ui.animation.DynamicAnim;
26+
import org.levimc.launcher.ui.dialogs.LogcatOverlayManager;
2627
import org.levimc.launcher.util.GithubReleaseUpdater;
2728
import org.levimc.launcher.util.LanguageManager;
2829
import org.levimc.launcher.util.PermissionsHandler;
@@ -72,7 +73,7 @@ protected void onCreate(Bundle savedInstanceState) {
7273
addSwitchItem(getString(R.string.show_logcat_overlay), fs.isLogcatOverlayEnabled(), (btn, checked) -> {
7374
fs.setLogcatOverlayEnabled(checked);
7475
try {
75-
org.levimc.launcher.ui.views.LogcatOverlayManager mgr = org.levimc.launcher.ui.views.LogcatOverlayManager.getInstance();
76+
LogcatOverlayManager mgr = LogcatOverlayManager.getInstance();
7677
if (mgr != null) mgr.refreshVisibility();
7778
} catch (Throwable ignored) {}
7879
});

app/src/main/java/org/levimc/launcher/ui/dialogs/LogcatOverlay.java

Lines changed: 795 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package org.levimc.launcher.ui.dialogs;
2+
3+
import android.app.*;
4+
import android.content.*;
5+
import android.os.*;
6+
import android.view.ViewGroup;
7+
import org.levimc.launcher.settings.FeatureSettings;
8+
import org.levimc.launcher.ui.activities.SplashActivity;
9+
10+
public class LogcatOverlayManager {
11+
12+
private static volatile LogcatOverlayManager instance;
13+
private final Application app;
14+
private LogcatOverlay overlay;
15+
private final Handler mainHandler = new Handler(Looper.getMainLooper());
16+
private volatile boolean onSplash = false;
17+
18+
private LogcatOverlayManager(Application app) {
19+
this.app = app;
20+
registerLifecycleCallbacks();
21+
registerSettingsListener();
22+
}
23+
24+
public static void init(Application app) {
25+
if (instance == null) {
26+
synchronized (LogcatOverlayManager.class) {
27+
if (instance == null) instance = new LogcatOverlayManager(app);
28+
}
29+
}
30+
}
31+
32+
public static LogcatOverlayManager getInstance() { return instance; }
33+
34+
private void attachTo(Activity act) {
35+
if (overlay == null) overlay = new LogcatOverlay(act.getApplicationContext());
36+
ViewGroup root = act.findViewById(android.R.id.content);
37+
if (root == null) return;
38+
if (overlay.getParent() != root) {
39+
if (overlay.getParent() instanceof ViewGroup) ((ViewGroup) overlay.getParent()).removeView(overlay);
40+
root.addView(overlay);
41+
}
42+
updateVisibility();
43+
}
44+
45+
private void updateVisibility() {
46+
boolean show = FeatureSettings.getInstance().isLogcatOverlayEnabled() && !onSplash;
47+
mainHandler.post(() -> {
48+
if (overlay == null) return;
49+
if (show) overlay.show(); else overlay.hide();
50+
});
51+
}
52+
53+
private void registerLifecycleCallbacks() {
54+
app.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
55+
@Override public void onActivityResumed(Activity activity) {
56+
onSplash = activity instanceof SplashActivity;
57+
attachTo(activity);
58+
}
59+
@Override public void onActivityCreated(Activity a, Bundle b) {}
60+
@Override public void onActivityStarted(Activity a) {}
61+
@Override public void onActivityPaused(Activity a) {}
62+
@Override public void onActivityStopped(Activity a) {}
63+
@Override public void onActivitySaveInstanceState(Activity a, Bundle b) {}
64+
@Override public void onActivityDestroyed(Activity a) {}
65+
});
66+
}
67+
68+
private void registerSettingsListener() {
69+
SharedPreferences sp = app.getSharedPreferences("feature_settings", Context.MODE_PRIVATE);
70+
sp.registerOnSharedPreferenceChangeListener((prefs, key) -> {
71+
if ("settings_json".equals(key)) updateVisibility();
72+
});
73+
}
74+
75+
public void refreshVisibility() { updateVisibility(); }
76+
77+
78+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.levimc.launcher.ui.dialogs;
2+
3+
import android.text.Editable;
4+
import android.text.TextWatcher;
5+
import java.util.function.Consumer;
6+
7+
public abstract class SimpleTextWatcher implements TextWatcher {
8+
public static SimpleTextWatcher after(Consumer<Editable> f) {
9+
return new SimpleTextWatcher() {
10+
@Override public void afterTextChanged(Editable s) { f.accept(s); }
11+
};
12+
}
13+
@Override public void beforeTextChanged(CharSequence s,int a,int b,int c){}
14+
@Override public void onTextChanged(CharSequence s,int a,int b,int c){}
15+
}

0 commit comments

Comments
 (0)