blob: c15a5963f645730dc4176e91ad1cd77e664637bf [file] [log] [blame]
/*
* Copyright (C) 2020 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.hybridhotseat;
import android.content.Context;
import android.os.Handler;
import android.util.Log;
import com.android.launcher3.logging.FileLog;
import com.android.launcher3.util.Executors;
import com.android.launcher3.util.MainThreadInitializedObject;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* Helper class to allow hot seat file logging
*/
public class HotseatFileLog {
public static final int LOG_DAYS = 10;
private static final String FILE_NAME_PREFIX = "hotseat-log-";
private static final DateFormat DATE_FORMAT =
DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
public static final MainThreadInitializedObject<HotseatFileLog> INSTANCE =
new MainThreadInitializedObject<>(HotseatFileLog::new);
private final Handler mHandler = new Handler(
Executors.createAndStartNewLooper("hotseat-logger"));
private final File mLogsDir;
private PrintWriter mCurrentWriter;
private String mFileName;
private HotseatFileLog(Context context) {
mLogsDir = context.getFilesDir();
}
/**
* Prints log values to disk
*/
public void log(String tag, String msg) {
String out = String.format("%s %s %s", DATE_FORMAT.format(new Date()), tag, msg);
mHandler.post(() -> {
synchronized (this) {
PrintWriter writer = getWriter();
if (writer != null) {
writer.println(out);
}
}
});
}
private PrintWriter getWriter() {
String fName = FILE_NAME_PREFIX + (LOG_DAYS % 10);
if (fName.equals(mFileName)) return mCurrentWriter;
Calendar cal = Calendar.getInstance();
boolean append = false;
File logFile = new File(mLogsDir, fName);
if (logFile.exists()) {
Calendar modifiedTime = Calendar.getInstance();
modifiedTime.setTimeInMillis(logFile.lastModified());
// If the file was modified more that 36 hours ago, purge the file.
// We use instead of 24 to account for day-365 followed by day-1
modifiedTime.add(Calendar.HOUR, 36);
append = cal.before(modifiedTime);
}
if (mCurrentWriter != null) {
mCurrentWriter.close();
}
try {
mCurrentWriter = new PrintWriter(new FileWriter(logFile, append));
mFileName = fName;
} catch (Exception ex) {
Log.e("HotseatLogs", "Error writing logs to file", ex);
closeWriter();
}
return mCurrentWriter;
}
private synchronized void closeWriter() {
mFileName = null;
if (mCurrentWriter != null) {
mCurrentWriter.close();
}
mCurrentWriter = null;
}
/**
* Returns a list of all log files
*/
public synchronized File[] getLogFiles() {
File[] files = new File[LOG_DAYS + FileLog.LOG_DAYS];
//include file log files here
System.arraycopy(FileLog.getLogFiles(), 0, files, 0, FileLog.LOG_DAYS);
closeWriter();
for (int i = 0; i < LOG_DAYS; i++) {
files[FileLog.LOG_DAYS + i] = new File(mLogsDir, FILE_NAME_PREFIX + i);
}
return files;
}
}