Skip to content
This repository was archived by the owner on Oct 18, 2024. It is now read-only.

Commit e2502f3

Browse files
committed
fix(logsender): remove dependency on :logger
1 parent cf6b63b commit e2502f3

File tree

3 files changed

+89
-51
lines changed

3 files changed

+89
-51
lines changed

logsender-sample/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ android {
3333

3434
dependencies {
3535

36+
implementation(projects.logger)
3637
implementation(projects.logsender)
3738

3839
implementation(libs.androidx.appcompat)

logsender/build.gradle.kts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,13 @@ android {
4040
targetCompatibility = JavaVersion.VERSION_1_8
4141
}
4242

43-
@Suppress("UnstableApiUsage")
4443
buildFeatures.apply {
4544
aidl = true
4645
viewBinding = false
4746
}
4847
}
4948

5049
dependencies {
51-
api(projects.logger)
52-
5350
testImplementation(libs.tests.junit)
5451
testImplementation(libs.tests.robolectric)
5552
testImplementation(libs.tests.google.truth)

logsender/src/main/java/com/itsaky/androidide/logsender/utils/Logger.java

Lines changed: 88 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@
1717

1818
package com.itsaky.androidide.logsender.utils;
1919

20-
import java.util.Arrays;
21-
import org.slf4j.LoggerFactory;
20+
import android.util.Log;
21+
import java.io.PrintWriter;
22+
import java.io.StringWriter;
23+
import java.util.ArrayList;
24+
import java.util.List;
25+
import java.util.StringTokenizer;
2226

2327
/**
2428
* Static methods for logging messages.
@@ -27,73 +31,109 @@
2731
*/
2832
public class Logger {
2933

30-
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(Logger.class);
34+
private static final String TAG = "LogSender";
35+
private static final String LINE_SEP = System.getProperty("line.separator");
3136

32-
public static void error(Object... messages) {
37+
private static String getFormattedMessage(Object... messages) {
3338
if (messages == null || messages.length == 0) {
34-
return;
39+
return "";
3540
}
3641
if (messages.length == 1) {
37-
LOG.error(String.valueOf(messages[0]));
38-
return;
42+
return String.valueOf(messages[0]);
3943
}
4044

41-
if (messages.length == 2) {
42-
LOG.error(String.valueOf(messages[0]), messages[1]);
43-
return;
45+
final StringBuilder sb = new StringBuilder();
46+
for (int i = 0; i < messages.length; i++) {
47+
sb.append(messages[i] instanceof Throwable ? getFullStackTrace(((Throwable) messages[i]))
48+
: String.valueOf(messages[i]));
49+
if (i < messages.length - 1) {
50+
sb.append(" ");
51+
}
4452
}
45-
46-
LOG.error(String.valueOf(messages[0]), Arrays.copyOfRange(messages, 1, messages.length));
53+
return sb.toString();
4754
}
4855

49-
public static void warn(Object... messages) {
50-
if (messages == null || messages.length == 0) {
51-
return;
56+
public static String getFullStackTrace(Throwable throwable) {
57+
final List<Throwable> throwableList = new ArrayList<>();
58+
while (throwable != null && !throwableList.contains(throwable)) {
59+
throwableList.add(throwable);
60+
throwable = throwable.getCause();
5261
}
53-
if (messages.length == 1) {
54-
LOG.warn(String.valueOf(messages[0]));
55-
return;
62+
final int size = throwableList.size();
63+
final List<String> frames = new ArrayList<>();
64+
List<String> nextTrace = getStackFrameList(throwableList.get(size - 1));
65+
for (int i = size; --i >= 0; ) {
66+
final List<String> trace = nextTrace;
67+
if (i != 0) {
68+
nextTrace = getStackFrameList(throwableList.get(i - 1));
69+
removeCommonFrames(trace, nextTrace);
70+
}
71+
if (i == size - 1) {
72+
frames.add(throwableList.get(i).toString());
73+
} else {
74+
frames.add(" Caused by: " + throwableList.get(i).toString());
75+
}
76+
frames.addAll(trace);
5677
}
57-
58-
if (messages.length == 2) {
59-
LOG.warn(String.valueOf(messages[0]), messages[1]);
60-
return;
78+
StringBuilder sb = new StringBuilder();
79+
for (final String element : frames) {
80+
sb.append(element).append(LINE_SEP);
6181
}
62-
63-
LOG.warn(String.valueOf(messages[0]), Arrays.copyOfRange(messages, 1, messages.length));
82+
return sb.toString();
6483
}
6584

66-
public static void info(Object... messages) {
67-
if (messages == null || messages.length == 0) {
68-
return;
69-
}
70-
if (messages.length == 1) {
71-
LOG.info(String.valueOf(messages[0]));
72-
return;
85+
private static List<String> getStackFrameList(final Throwable throwable) {
86+
final StringWriter sw = new StringWriter();
87+
final PrintWriter pw = new PrintWriter(sw, true);
88+
throwable.printStackTrace(pw);
89+
final String stackTrace = sw.toString();
90+
final StringTokenizer frames = new StringTokenizer(stackTrace, LINE_SEP);
91+
final List<String> list = new ArrayList<>();
92+
boolean traceStarted = false;
93+
while (frames.hasMoreTokens()) {
94+
final String token = frames.nextToken();
95+
// Determine if the line starts with <whitespace>at
96+
final int at = token.indexOf("at");
97+
if (at != -1 && token.substring(0, at).trim().isEmpty()) {
98+
traceStarted = true;
99+
list.add(token);
100+
} else if (traceStarted) {
101+
break;
102+
}
73103
}
104+
return list;
105+
}
74106

75-
if (messages.length == 2) {
76-
LOG.info(String.valueOf(messages[0]), messages[1]);
77-
return;
107+
private static void removeCommonFrames(
108+
final List<String> causeFrames, final List<String> wrapperFrames) {
109+
int causeFrameIndex = causeFrames.size() - 1;
110+
int wrapperFrameIndex = wrapperFrames.size() - 1;
111+
while (causeFrameIndex >= 0 && wrapperFrameIndex >= 0) {
112+
// Remove the frame from the cause trace if it is the same
113+
// as in the wrapper trace
114+
final String causeFrame = causeFrames.get(causeFrameIndex);
115+
final String wrapperFrame = wrapperFrames.get(wrapperFrameIndex);
116+
if (causeFrame.equals(wrapperFrame)) {
117+
causeFrames.remove(causeFrameIndex);
118+
}
119+
causeFrameIndex--;
120+
wrapperFrameIndex--;
78121
}
122+
}
79123

80-
LOG.info(String.valueOf(messages[0]), Arrays.copyOfRange(messages, 1, messages.length));
124+
public static void error(Object... messages) {
125+
Log.e(TAG, getFormattedMessage(messages));
81126
}
82127

83-
public static void debug(Object... messages) {
84-
if (messages == null || messages.length == 0) {
85-
return;
86-
}
87-
if (messages.length == 1) {
88-
LOG.debug(String.valueOf(messages[0]));
89-
return;
90-
}
128+
public static void warn(Object... messages) {
129+
Log.w(TAG, getFormattedMessage(messages));
130+
}
91131

92-
if (messages.length == 2) {
93-
LOG.debug(String.valueOf(messages[0]), messages[1]);
94-
return;
95-
}
132+
public static void info(Object... messages) {
133+
Log.i(TAG, getFormattedMessage(messages));
134+
}
96135

97-
LOG.debug(String.valueOf(messages[0]), Arrays.copyOfRange(messages, 1, messages.length));
136+
public static void debug(Object... messages) {
137+
Log.d(TAG, getFormattedMessage(messages));
98138
}
99139
}

0 commit comments

Comments
 (0)