diff --git a/.idea/misc.xml b/.idea/misc.xml index b0c570a8d..8336e9f78 100755 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -141,10 +141,12 @@ + + diff --git a/app/src/main/assets/data/common/tooling-api-all.jar b/app/src/main/assets/data/common/tooling-api-all.jar index 523589852..b5ac15296 100644 Binary files a/app/src/main/assets/data/common/tooling-api-all.jar and b/app/src/main/assets/data/common/tooling-api-all.jar differ diff --git a/app/src/main/java/com/itsaky/androidide/EditorActivity.java b/app/src/main/java/com/itsaky/androidide/EditorActivity.java index f972d2aca..d113503b4 100755 --- a/app/src/main/java/com/itsaky/androidide/EditorActivity.java +++ b/app/src/main/java/com/itsaky/androidide/EditorActivity.java @@ -1407,7 +1407,7 @@ public class EditorActivity extends StudioActivity ProgressDialog.show(EditorActivity.this, null, getString(R.string.please_wait)); CompletableFuture.runAsync( () -> { - final var text = adapter.getAsString(); + final var text = adapter.allAsString(); ThreadUtils.runOnUiThread( () -> { progress.dismiss(); diff --git a/app/src/main/java/com/itsaky/androidide/adapters/LogLinesAdapter.kt b/app/src/main/java/com/itsaky/androidide/adapters/LogLinesAdapter.kt index 86aac1faf..b8394d258 100644 --- a/app/src/main/java/com/itsaky/androidide/adapters/LogLinesAdapter.kt +++ b/app/src/main/java/com/itsaky/androidide/adapters/LogLinesAdapter.kt @@ -22,21 +22,27 @@ import android.text.Spannable import android.text.SpannableString import android.text.style.ForegroundColorSpan import android.util.TypedValue +import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.blankj.utilcode.util.SizeUtils import com.itsaky.androidide.adapters.LogLinesAdapter.VH import com.itsaky.androidide.models.LogLine +import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.utils.ILogger.Priority.ERROR +import com.itsaky.androidide.utils.ILogger.Priority.INFO +import com.itsaky.androidide.utils.ILogger.Priority.WARNING import com.itsaky.androidide.utils.TypefaceUtils /** * Adapter for the log view. * @author Akash Yadav */ -class LogLinesAdapter(private val lines: MutableList = mutableListOf()) : - RecyclerView.Adapter() { +class LogLinesAdapter : RecyclerView.Adapter() { + private val log = ILogger.newInstance(javaClass.simpleName) + private val lines: MutableList = mutableListOf() var simpleFormatting = true companion object { @@ -52,8 +58,9 @@ class LogLinesAdapter(private val lines: MutableList = mutableListOf()) } fun add(line: LogLine) { - this.lines.add(line) - this.notifyItemInserted(this.lines.lastIndex) + val wrapped = wrap(line) + this.lines.add(wrapped) + notifyItemInserted(this.lines.lastIndex) if (this.lines.size > MAX_LINES) { this.lines.removeAt(0) @@ -61,18 +68,13 @@ class LogLinesAdapter(private val lines: MutableList = mutableListOf()) } } - fun getItem(index: Int) = this.lines[index] + fun getLine(index: Int) = this.lines[index].log - fun getAsString() = + fun allAsString() = StringBuilder() .apply { for (line in lines) { - append( - if (simpleFormatting) { - line.toSimpleString() - } else { - line.toString() - }) + append(lineString(line)) append("\n") } } @@ -84,53 +86,73 @@ class LogLinesAdapter(private val lines: MutableList = mutableListOf()) text.setTextSize(TypedValue.COMPLEX_UNIT_SP, 11f) text.setPaddingRelative(dp1, dp1 / 2, dp1, dp1 / 2) text.setTextIsSelectable(true) + text.maxLines = 1 text.typeface = TypefaceUtils.jetbrainsMono() return VH(text) } override fun onBindViewHolder(holder: VH, position: Int) { - val line = getItem(position) - val spanned = - if (line is LogWrapper) { - line.spanned!! - } else { - val spannable = - SpannableString( - if (simpleFormatting) line.toSimpleString() else line.toString()) - val color = - when (line.priority) { - LogLine.ERROR -> -0xbbcca - LogLine.WARNING -> -0x14c5 - LogLine.INFO -> -0xb350b0 - else -> -0xa0a0b - } - spannable.setSpan( - ForegroundColorSpan(color), - 0, - spannable.length, - Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) - lines[position] = LogWrapper(line).apply { spanned = spannable } - spannable - } + val line = lines[position] + if (!line.visible) { + holder.itemView.visibility = View.GONE + return + } else { + holder.itemView.visibility = View.VISIBLE + } + + val spanned = line.spannable holder.text.text = spanned } override fun getItemCount() = this.lines.size - class LogWrapper(val log: LogLine) : LogLine() { + private fun wrap(line: LogLine): LogWrapper { + val spannable = SpannableString(lineString(line)) + val color = + when (line.priority) { + ERROR -> -0xbbcca + WARNING -> -0x14c5 + INFO -> -0xb350b0 + else -> -0xa0a0b + } + spannable.setSpan( + ForegroundColorSpan(color), 0, spannable.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + return LogWrapper(line, spannable).apply { visible = true } + } - var spanned: Spannable? = null - - override fun equals(other: Any?): Boolean { - return this.log == other + private fun lineString(logLine: LogLine) = + if (simpleFormatting) { + logLine.toSimpleString() + } else { + logLine.toString() } - override fun hashCode(): Int { - return this.log.hashCode() - } + class LogWrapper(val log: LogLine, val spannable: Spannable) : LogLine() { + + var visible = true override fun toString() = this.log.toString() override fun toSimpleString(): String = this.log.toSimpleString() override fun formattedTagAndMessage(): String = this.log.formattedTagAndMessage() + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as LogWrapper + + if (log != other.log) return false + if (spannable != other.spannable) return false + if (visible != other.visible) return false + + return true + } + + override fun hashCode(): Int { + var result = log.hashCode() + result = 31 * result + spannable.hashCode() + result = 31 * result + visible.hashCode() + return result + } } } diff --git a/app/src/main/java/com/itsaky/androidide/fragments/LogViewFragment.kt b/app/src/main/java/com/itsaky/androidide/fragments/LogViewFragment.kt index c748fed53..59b1bef72 100644 --- a/app/src/main/java/com/itsaky/androidide/fragments/LogViewFragment.kt +++ b/app/src/main/java/com/itsaky/androidide/fragments/LogViewFragment.kt @@ -27,6 +27,7 @@ import com.itsaky.androidide.adapters.LogLinesAdapter import com.itsaky.androidide.databinding.FragmentLogBinding import com.itsaky.androidide.models.LogLine import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.utils.ILogger.Priority /** * Fragment to show logs in a [androidx.recyclerview.widget.RecyclerView]. @@ -37,7 +38,7 @@ abstract class LogViewFragment : Fragment() { private val log = ILogger.newInstance(javaClass.simpleName) var binding: FragmentLogBinding? = null var adapter: LogLinesAdapter? = null - + fun appendLog(line: LogLine) { if (this.binding == null || this.adapter == null) { return @@ -48,16 +49,16 @@ abstract class LogViewFragment : Fragment() { this.adapter!!.add(line) } } - + abstract fun getLogType(): String - + abstract fun isSimpleFormattingEnabled(): Boolean - protected open fun logLine(priority: Int, tag: String, message: String) { - val line = LogLine(ILogger.priorityChar(priority), tag, message) + protected open fun logLine(priority: Priority, tag: String, message: String) { + val line = LogLine(priority, tag, message) appendLog(line) } - + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -66,12 +67,12 @@ abstract class LogViewFragment : Fragment() { binding = FragmentLogBinding.inflate(inflater, container, false) return binding!!.root } - + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val manager = LinearLayoutManager(requireContext()) this.binding!!.lines.layoutManager = manager - + this.adapter = LogLinesAdapter() this.binding!!.lines.adapter = this.adapter } diff --git a/app/src/main/java/com/itsaky/androidide/language/logs/LogLanguageImpl.java b/app/src/main/java/com/itsaky/androidide/language/logs/LogLanguageImpl.java deleted file mode 100755 index c2e3fd7b4..000000000 --- a/app/src/main/java/com/itsaky/androidide/language/logs/LogLanguageImpl.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * This file is part of AndroidIDE. - * - * AndroidIDE is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * AndroidIDE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with AndroidIDE. If not, see . - * - */ -package com.itsaky.androidide.language.logs; - -import android.os.Bundle; - -import androidx.annotation.NonNull; - -import com.itsaky.androidide.language.IDELanguage; -import com.itsaky.androidide.models.LogLine; -import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE; - -import java.util.ArrayList; -import java.util.List; - -import io.github.rosemoe.sora.lang.analysis.AnalyzeManager; -import io.github.rosemoe.sora.lang.analysis.SimpleAnalyzeManager; -import io.github.rosemoe.sora.lang.completion.CompletionCancelledException; -import io.github.rosemoe.sora.lang.completion.CompletionPublisher; -import io.github.rosemoe.sora.lang.smartEnter.NewlineHandler; -import io.github.rosemoe.sora.lang.styling.MappedSpans; -import io.github.rosemoe.sora.lang.styling.Styles; -import io.github.rosemoe.sora.text.CharPosition; -import io.github.rosemoe.sora.text.ContentReference; -import io.github.rosemoe.sora.widget.SymbolPairMatch; - -public class LogLanguageImpl extends IDELanguage { - - private static final LogAnalyzer analyzer = new LogAnalyzer(); - - public void addLine(LogLine line) { - analyzer.addLine(line); - } - - @NonNull - @Override - public AnalyzeManager getAnalyzeManager() { - return analyzer; - } - - @Override - public int getInterruptionLevel() { - return INTERRUPTION_LEVEL_STRONG; - } - - @Override - public void requireAutoComplete( - @NonNull ContentReference content, - @NonNull CharPosition position, - @NonNull CompletionPublisher publisher, - @NonNull Bundle extraArguments) - throws CompletionCancelledException {} - - @Override - public int getIndentAdvance(@NonNull ContentReference content, int line, int column) { - return 0; - } - - @Override - public CharSequence format(CharSequence text) { - return text; - } - - @Override - public SymbolPairMatch getSymbolPairs() { - return new SymbolPairMatch.DefaultSymbolPairs(); - } - - @Override - public NewlineHandler[] getNewlineHandlers() { - return new NewlineHandler[0]; - } - - @Override - public void destroy() {} - - private static class LogAnalyzer extends SimpleAnalyzeManager { - - private static final List lines = new ArrayList<>(); - - public LogAnalyzer addLine(LogLine line) { - if (line != null) lines.add(line); - - return this; - } - - @Override - protected Styles analyze(StringBuilder text, Delegate delegate) { - final var styles = new Styles(); - final var colors = new MappedSpans.Builder(); - int lastLine = 0; - for (int i = 0; i < lines.size() && !delegate.isCancelled(); i++) { - if (i == 0) colors.addNormalIfNull(); - LogLine line = lines.get(i); - colors.addIfNeeded(i, 0, SchemeAndroidIDE.forLogPriority(line.priority)); - lastLine = i; - } - colors.determine(lastLine); - - styles.spans = colors.build(); - - return styles; - } - } -} diff --git a/app/src/main/java/com/itsaky/androidide/services/GradleBuildService.java b/app/src/main/java/com/itsaky/androidide/services/GradleBuildService.java index 080c63968..335296fea 100644 --- a/app/src/main/java/com/itsaky/androidide/services/GradleBuildService.java +++ b/app/src/main/java/com/itsaky/androidide/services/GradleBuildService.java @@ -152,7 +152,7 @@ public class GradleBuildService extends Service implements BuildService, IToolin @Override public void logMessage(@NonNull LogLine line) { - SERVER_LOGGER.log(ILogger.priority(line.priorityChar), line.formattedTagAndMessage()); + SERVER_LOGGER.log(line.priority, line.formattedTagAndMessage()); } @Override @@ -316,12 +316,15 @@ public class GradleBuildService extends Service implements BuildService, IToolin isBuildInProgress = true; return server - .executeTasks(new TaskExecutionMessage(":", Arrays.asList(tasks), getGradleInstallationPath())) + .executeTasks( + new TaskExecutionMessage(":", Arrays.asList(tasks), getGradleInstallationPath())) .thenApply(this::markBuildAsFinished); } private String getGradleInstallationPath() { - return StudioApp.getInstance().getPrefManager().getString(BuildPreferences.KEY_CUSTOM_GRADLE_INSTALLATION, ""); + return StudioApp.getInstance() + .getPrefManager() + .getString(BuildPreferences.KEY_CUSTOM_GRADLE_INSTALLATION, ""); } @NonNull @@ -338,7 +341,9 @@ public class GradleBuildService extends Service implements BuildService, IToolin isBuildInProgress = true; return server - .executeTasks(new TaskExecutionMessage(projectPath, Arrays.asList(tasks), getGradleInstallationPath())) + .executeTasks( + new TaskExecutionMessage( + projectPath, Arrays.asList(tasks), getGradleInstallationPath())) .thenApply(this::markBuildAsFinished); } @@ -398,7 +403,7 @@ public class GradleBuildService extends Service implements BuildService, IToolin return null; } - return new EventListener() { + return new EventListener() { @SuppressWarnings("ConstantConditions") @Override diff --git a/app/src/main/java/com/itsaky/androidide/syntax/colorschemes/SchemeAndroidIDE.java b/app/src/main/java/com/itsaky/androidide/syntax/colorschemes/SchemeAndroidIDE.java index 8a2718be8..254ce80a7 100755 --- a/app/src/main/java/com/itsaky/androidide/syntax/colorschemes/SchemeAndroidIDE.java +++ b/app/src/main/java/com/itsaky/androidide/syntax/colorschemes/SchemeAndroidIDE.java @@ -17,11 +17,6 @@ */ package com.itsaky.androidide.syntax.colorschemes; -import static com.itsaky.androidide.models.LogLine.DEBUG; -import static com.itsaky.androidide.models.LogLine.ERROR; -import static com.itsaky.androidide.models.LogLine.INFO; -import static com.itsaky.androidide.models.LogLine.WARNING; - import android.graphics.Color; import io.github.rosemoe.sora.lang.styling.TextStyle; @@ -117,38 +112,6 @@ public class SchemeAndroidIDE extends EditorColorScheme { return TextStyle.makeStyle(id, true); } - /** - * Make style for the given log priority. - * - * @param priority The priority. - * @return The style. - */ - public static long forLogPriority(int priority) { - return get(getLogPriorityId(priority)); - } - - /** - * Get the appropriate color id for the given log line priority. - * - * @param priority The log line priority. - * @return The color id. - */ - public static int getLogPriorityId(int priority) { - if (priority == ERROR) { - return LOG_ERROR; - } - - if (priority == WARNING) { - return LOG_WARNING; - } - - if (priority == INFO) { - return LOG_INFO; - } - - return DEBUG; - } - @Override public void applyDefault() { // Apply default colors diff --git a/app/src/main/res/drawable/bg_log_search_field.xml b/app/src/main/res/drawable/bg_log_search_field.xml new file mode 100644 index 000000000..5164b8dc1 --- /dev/null +++ b/app/src/main/res/drawable/bg_log_search_field.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_log.xml b/app/src/main/res/layout/fragment_log.xml index 494c43e0b..eab23e095 100644 --- a/app/src/main/res/layout/fragment_log.xml +++ b/app/src/main/res/layout/fragment_log.xml @@ -14,7 +14,10 @@ ~ You should have received a copy of the GNU General Public License ~ along with AndroidIDE. If not, see . --> - diff --git a/app/src/main/res/layout/fragment_log_view.xml b/app/src/main/res/layout/fragment_log_view.xml deleted file mode 100644 index 6f1a69c2a..000000000 --- a/app/src/main/res/layout/fragment_log_view.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index cbbb9b42d..e09634f45 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -26,13 +26,12 @@ mm - + Verbose Debug Info Warning Error - Fatal \ No newline at end of file diff --git a/build-tools/jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/RemoteEndpoint.java b/build-tools/jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/RemoteEndpoint.java index 6d684a02b..60ee6f902 100644 --- a/build-tools/jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/RemoteEndpoint.java +++ b/build-tools/jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/RemoteEndpoint.java @@ -139,9 +139,11 @@ public class RemoteEndpoint try { out.consume(notificationMessage); } catch (Exception exception) { - int logLevel = - JsonRpcException.indicatesStreamClosed(exception) ? ILogger.INFO : ILogger.WARNING; - LOG.log(logLevel, "Failed to send notification message.", exception); + ILogger.Priority priority = + JsonRpcException.indicatesStreamClosed(exception) + ? ILogger.Priority.INFO + : ILogger.Priority.WARNING; + LOG.log(priority, "Failed to send notification message.", exception); } } diff --git a/build-tools/logger/src/main/java/com/itsaky/androidide/models/LogLine.java b/build-tools/logger/src/main/java/com/itsaky/androidide/models/LogLine.java index fb3426a43..55cc22d48 100644 --- a/build-tools/logger/src/main/java/com/itsaky/androidide/models/LogLine.java +++ b/build-tools/logger/src/main/java/com/itsaky/androidide/models/LogLine.java @@ -17,29 +17,12 @@ */ package com.itsaky.androidide.models; +import com.itsaky.androidide.utils.ILogger; + +import java.util.Objects; + public class LogLine { - // It makes things easier in LogLanguageImpl - public static int INFO; - public static int DEBUG; - public static int ERROR; - public static int WARNING; - - static { - try { - final var klass = Class.forName("com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE"); - INFO = klass.getField("LOG_INFO").getInt(null); - DEBUG = klass.getField("LOG_DEBUG").getInt(null); - ERROR = klass.getField("LOG_ERROR").getInt(null); - WARNING = klass.getField("LOG_WARNING").getInt(null); - } catch (Throwable err) { - INFO = 0; - DEBUG = 1; - ERROR = 2; - WARNING = 3; - } - } - public String unformatted; public String date; public String time; @@ -47,35 +30,34 @@ public class LogLine { public String tid; public String tag; public String message; - public char priorityChar; - public int priority; + public ILogger.Priority priority; public boolean formatted; // For JSONRpc @SuppressWarnings("unused") protected LogLine() {} - public LogLine(char priorityChar, String tag, String message) { - this("", "", "", "", priorityChar, tag, message); + public LogLine(ILogger.Priority priority, String tag, String message) { + this(priority, "", "", "", "", tag, message); } public LogLine( + ILogger.Priority priority, String date, String time, String pid, String tid, - char priorityChar, String tag, String message) { - this(date, time, pid, tid, priorityChar, tag, message, true); + this(priority, date, time, pid, tid, tag, message, true); } public LogLine( + ILogger.Priority priority, String date, String time, String pid, String tid, - char priorityChar, String tag, String message, boolean formatted) { @@ -83,40 +65,31 @@ public class LogLine { this.time = time; this.pid = pid; this.tid = tid; - this.priorityChar = priorityChar; this.tag = tag; this.message = message; - this.priority = parsePriority(priorityChar); + this.priority = priority; this.formatted = formatted; } - private int parsePriority(char s) { - final var c = Character.toLowerCase(s); - if (c == 'w') { - return WARNING; - } else if (c == 'e') { - return ERROR; - } else if (c == 'i') { - return INFO; - } else { - return DEBUG; - } - } - public LogLine(String unformatted) { this.unformatted = unformatted; this.formatted = false; } + private static ILogger.Priority parsePriority(char s) { + return ILogger.priority(Character.toUpperCase(s)); + } + public static LogLine forLogString(final String log) { try { final var split = log.split("\\s", 7); return new LogLine( + parsePriority(split[4].charAt(0)), split[0], // date split[1], // time split[2], // process id split[3], // thread id - split[4].charAt(0), // priority + // priority split[5], // tag split[6] // message ); @@ -128,7 +101,9 @@ public class LogLine { @Override public String toString() { return this.formatted - ? String.format("%s %s %s/%s %s/%s %s", date, time, pid, tid, priorityChar, tag, message) + ? String.format( + "%s %s %s/%s %s/%s %s", + date, time, pid, tid, ILogger.priorityChar(priority), tag, message) : this.unformatted; } @@ -149,7 +124,8 @@ public class LogLine { public String toSimpleString() { return this.formatted - ? String.format("%-25s %-2s %s", trimIfNeeded(tag, 25), priorityChar, message) + ? String.format( + "%-25s %-2s %s", trimIfNeeded(tag, 25), ILogger.priorityChar(priority), message) : this.unformatted; } @@ -158,4 +134,29 @@ public class LogLine { ? String.format("%-25s %s", trimIfNeeded(tag, 25), message) : this.unformatted; } -} \ No newline at end of file + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final LogLine logLine = (LogLine) o; + return formatted == logLine.formatted + && Objects.equals(unformatted, logLine.unformatted) + && Objects.equals(date, logLine.date) + && Objects.equals(time, logLine.time) + && Objects.equals(pid, logLine.pid) + && Objects.equals(tid, logLine.tid) + && Objects.equals(tag, logLine.tag) + && Objects.equals(message, logLine.message) + && priority == logLine.priority; + } + + @Override + public int hashCode() { + return Objects.hash(unformatted, date, time, pid, tid, tag, message, priority, formatted); + } +} diff --git a/build-tools/logger/src/main/java/com/itsaky/androidide/utils/AndroidLogger.java b/build-tools/logger/src/main/java/com/itsaky/androidide/utils/AndroidLogger.java index 084882ebd..46685374b 100644 --- a/build-tools/logger/src/main/java/com/itsaky/androidide/utils/AndroidLogger.java +++ b/build-tools/logger/src/main/java/com/itsaky/androidide/utils/AndroidLogger.java @@ -31,7 +31,7 @@ public class AndroidLogger extends ILogger { } @Override - protected void doLog(int priority, String message) { + protected void doLog(Priority priority, String message) { switch (priority) { case ERROR: Log.e(TAG, message); diff --git a/build-tools/logger/src/main/java/com/itsaky/androidide/utils/ILogger.java b/build-tools/logger/src/main/java/com/itsaky/androidide/utils/ILogger.java index 4e5de1cf6..7de144ada 100644 --- a/build-tools/logger/src/main/java/com/itsaky/androidide/utils/ILogger.java +++ b/build-tools/logger/src/main/java/com/itsaky/androidide/utils/ILogger.java @@ -48,11 +48,15 @@ import java.util.Objects; */ public abstract class ILogger { - public static final int DEBUG = 0; - public static final int WARNING = 1; - public static final int ERROR = 2; - public static final int INFO = 3; - public static final int VERBOSE = 4; + /** Logging priority. */ + public enum Priority { + DEBUG, + WARNING, + ERROR, + INFO, + VERBOSE + } + private static final String MSG_SEPARATOR = " "; // Separate messages with a space. private static final List logListeners = new ArrayList<>(); private static ILogger instance; @@ -86,52 +90,21 @@ public abstract class ILogger { return createInstance(tag); } - public static String priorityText(int priority) { - switch (priority) { - case DEBUG: - return "DEBUG"; - case INFO: - return "INFO"; - case VERBOSE: - return "VERBOSE"; - case ERROR: - return "ERROR"; - case WARNING: - return "WARNING"; - default: - return ""; - } + public static String priorityText(Priority priority) { + return priority.name(); } - public static char priorityChar(int priority) { - switch (priority) { - case INFO: - return 'I'; - case VERBOSE: - return 'V'; - case ERROR: - return 'E'; - case WARNING: - return 'W'; - default: - return 'D'; - } + public static char priorityChar(Priority priority) { + return Character.toUpperCase(priorityText(priority).charAt(0)); } - public static int priority(char priorityChar) { - switch (priorityChar) { - case 'I': - return INFO; - case 'V': - return VERBOSE; - case 'E': - return ERROR; - case 'W': - return WARNING; - case 'D': - default: - return DEBUG; + public static Priority priority(char priorityChar) { + for (var priority : Priority.values()) { + if (priorityChar(priority) == priorityChar) { + return priority; + } } + throw new IllegalArgumentException("Invalid priority character: " + priorityChar); } /** @@ -141,7 +114,7 @@ public abstract class ILogger { * @return This logger instance. */ public ILogger error(Object... messages) { - return log(ERROR, messages); + return log(Priority.ERROR, messages); } /** @@ -151,12 +124,12 @@ public abstract class ILogger { * @param messages The messages to log. * @return This logger instance. */ - public ILogger log(int priority, Object... messages) { + public ILogger log(Priority priority, Object... messages) { logAndNotify(priority, generateMessage(messages)); return this; } - private void logAndNotify(int priority, String msg) { + private void logAndNotify(Priority priority, String msg) { doLog(priority, msg); for (final var listener : logListeners) { listener.log(priority, TAG, msg); @@ -183,13 +156,13 @@ public abstract class ILogger { * * @param priority The priority for this log message. * @param message The full generated message for this log. Might contain new lines. - * @see ILogger#DEBUG - * @see ILogger#ERROR - * @see ILogger#WARNING - * @see ILogger#VERBOSE - * @see ILogger#INFO + * @see ILogger.Priority#DEBUG + * @see ILogger.Priority#ERROR + * @see ILogger.Priority#WARNING + * @see ILogger.Priority#VERBOSE + * @see ILogger.Priority#INFO */ - protected abstract void doLog(int priority, String message); + protected abstract void doLog(Priority priority, String message); /** * Log warning messages. @@ -198,7 +171,7 @@ public abstract class ILogger { * @return This logger instance. */ public ILogger warn(Object... messages) { - return log(WARNING, messages); + return log(Priority.WARNING, messages); } /** @@ -208,7 +181,7 @@ public abstract class ILogger { * @return This logger instance. */ public ILogger verbose(Object... messages) { - return log(VERBOSE, messages); + return log(Priority.VERBOSE, messages); } /** @@ -218,7 +191,7 @@ public abstract class ILogger { * @return This logger instance. */ public ILogger info(Object... messages) { - return log(INFO, messages); + return log(Priority.INFO, messages); } /** Logs the name of method and class which calls this method. */ @@ -233,7 +206,7 @@ public abstract class ILogger { * @return This logger instance. */ public ILogger debug(Object... messages) { - return log(DEBUG, messages); + return log(Priority.DEBUG, messages); } protected String getCallerClassDescription() { @@ -254,6 +227,6 @@ public abstract class ILogger { /** A listener which can be used to listen to log events. */ public interface LogListener { - void log(int priority, String tag, String message); + void log(Priority priority, String tag, String message); } } diff --git a/build-tools/logger/src/main/java/com/itsaky/androidide/utils/JvmLogger.java b/build-tools/logger/src/main/java/com/itsaky/androidide/utils/JvmLogger.java index fc8d37c00..5e6bb9408 100644 --- a/build-tools/logger/src/main/java/com/itsaky/androidide/utils/JvmLogger.java +++ b/build-tools/logger/src/main/java/com/itsaky/androidide/utils/JvmLogger.java @@ -33,8 +33,8 @@ public class JvmLogger extends ILogger { } @Override - protected void doLog(int priority, String message) { - final var log = new LogLine(priorityChar(priority), TAG, message); + protected void doLog(Priority priority, String message) { + final var log = new LogLine(priority, TAG, message); if (interceptor != null) { interceptor.onLog(log); } else { diff --git a/build-tools/tooling-api-impl/src/test/test-home/.androidide/init/model.jar b/build-tools/tooling-api-impl/src/test/test-home/.androidide/init/model.jar index 47c5ef43c..2bffc1149 100644 Binary files a/build-tools/tooling-api-impl/src/test/test-home/.androidide/init/model.jar and b/build-tools/tooling-api-impl/src/test/test-home/.androidide/init/model.jar differ diff --git a/lsp/testing/src/main/java/com/itsaky/lsp/api/util/ReflectiveLogListener.kt b/lsp/testing/src/main/java/com/itsaky/lsp/api/util/ReflectiveLogListener.kt index 081ebaa56..e7d81e824 100644 --- a/lsp/testing/src/main/java/com/itsaky/lsp/api/util/ReflectiveLogListener.kt +++ b/lsp/testing/src/main/java/com/itsaky/lsp/api/util/ReflectiveLogListener.kt @@ -17,14 +17,15 @@ package com.itsaky.lsp.api.util import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.utils.ILogger.Priority -/** - * @author Akash Yadav - */ +/** @author Akash Yadav */ class ReflectiveLogListener(private val receiver: Class) : ILogger.LogListener { - override fun log(priority: Int, tag: String, message: String) { - val method = receiver.getDeclaredMethod("log", Int::class.java, String::class.java, String::class.java) + override fun log(priority: Priority, tag: String, message: String) { + val method = + receiver.getDeclaredMethod( + "log", Priority::class.java, String::class.java, String::class.java) method.isAccessible = true method.invoke(null, priority, tag, message) } -} \ No newline at end of file +}