/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.launcher3.model; import android.util.Log; import androidx.annotation.Nullable; import java.util.ArrayList; /** * Helper logger that collects logs while {@code LoaderTask#run} executes and prints them all iff * an exception is caught in {@code LoaderTask#run}. */ public class LoaderMemoryLogger { private static final String TAG = "LoaderMemoryLogger"; private final ArrayList mLogEntries = new ArrayList<>(); protected LoaderMemoryLogger() {} protected void addLog(int logLevel, String tag, String log) { addLog(logLevel, tag, log, null); } protected void addLog( int logLevel, String tag, String log, Exception stackTrace) { switch (logLevel) { case Log.ASSERT: case Log.ERROR: case Log.DEBUG: case Log.INFO: case Log.VERBOSE: case Log.WARN: mLogEntries.add(new LogEntry(logLevel, tag, log, stackTrace)); break; default: throw new IllegalArgumentException("Invalid log level provided: " + logLevel); } } protected void clearLogs() { mLogEntries.clear(); } protected void printLogs() { for (LogEntry logEntry : mLogEntries) { String tag = String.format("%s: %s", TAG, logEntry.mLogTag); String logString = logEntry.mStackStrace == null ? logEntry.mLogString : String.format( "%s\n%s", logEntry.mLogString, Log.getStackTraceString(logEntry.mStackStrace)); Log.println(logEntry.mLogLevel, tag, logString); } clearLogs(); } private static class LogEntry { protected final int mLogLevel; protected final String mLogTag; protected final String mLogString; @Nullable protected final Exception mStackStrace; protected LogEntry( int logLevel, String logTag, String logString, @Nullable Exception stackStrace) { mLogLevel = logLevel; mLogTag = logTag; mLogString = logString; mStackStrace = stackStrace; } } }