114 lines
4.0 KiB
Java
114 lines
4.0 KiB
Java
/*
|
|
* Copyright (C) 2013 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.inputmethod.research;
|
|
|
|
import android.content.Context;
|
|
import android.util.Log;
|
|
|
|
import java.io.File;
|
|
import java.io.FileFilter;
|
|
|
|
/**
|
|
* Manages log files.
|
|
*
|
|
* This class handles all aspects where and how research log data is stored. This includes
|
|
* generating log filenames in the correct place with the correct names, and cleaning up log files
|
|
* under this directory.
|
|
*/
|
|
public class ResearchLogDirectory {
|
|
public static final String TAG = ResearchLogDirectory.class.getSimpleName();
|
|
/* package */ static final String LOG_FILENAME_PREFIX = "researchLog";
|
|
private static final String FILENAME_SUFFIX = ".txt";
|
|
private static final String USER_RECORDING_FILENAME_PREFIX = "recording";
|
|
|
|
private static final ReadOnlyLogFileFilter sUploadableLogFileFilter =
|
|
new ReadOnlyLogFileFilter();
|
|
|
|
private final File mFilesDir;
|
|
|
|
static class ReadOnlyLogFileFilter implements FileFilter {
|
|
@Override
|
|
public boolean accept(final File pathname) {
|
|
return pathname.getName().startsWith(ResearchLogDirectory.LOG_FILENAME_PREFIX)
|
|
&& !pathname.canWrite();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Creates a new ResearchLogDirectory, creating the storage directory if it does not exist.
|
|
*/
|
|
public ResearchLogDirectory(final Context context) {
|
|
mFilesDir = getLoggingDirectory(context);
|
|
if (mFilesDir == null) {
|
|
throw new NullPointerException("No files directory specified");
|
|
}
|
|
if (!mFilesDir.exists()) {
|
|
mFilesDir.mkdirs();
|
|
}
|
|
}
|
|
|
|
private File getLoggingDirectory(final Context context) {
|
|
// TODO: Switch to using a subdirectory of getFilesDir().
|
|
return context.getFilesDir();
|
|
}
|
|
|
|
/**
|
|
* Get an array of log files that are ready for uploading.
|
|
*
|
|
* A file is ready for uploading if it is marked as read-only.
|
|
*
|
|
* @return the array of uploadable files
|
|
*/
|
|
public File[] getUploadableLogFiles() {
|
|
try {
|
|
return mFilesDir.listFiles(sUploadableLogFileFilter);
|
|
} catch (final SecurityException e) {
|
|
Log.e(TAG, "Could not cleanup log directory, permission denied", e);
|
|
return new File[0];
|
|
}
|
|
}
|
|
|
|
public void cleanupLogFilesOlderThan(final long time) {
|
|
try {
|
|
for (final File file : mFilesDir.listFiles()) {
|
|
final String filename = file.getName();
|
|
if ((filename.startsWith(LOG_FILENAME_PREFIX)
|
|
|| filename.startsWith(USER_RECORDING_FILENAME_PREFIX))
|
|
&& (file.lastModified() < time)) {
|
|
file.delete();
|
|
}
|
|
}
|
|
} catch (final SecurityException e) {
|
|
Log.e(TAG, "Could not cleanup log directory, permission denied", e);
|
|
}
|
|
}
|
|
|
|
public File getLogFilePath(final long time, final long nanoTime) {
|
|
return new File(mFilesDir, getUniqueFilename(LOG_FILENAME_PREFIX, time, nanoTime));
|
|
}
|
|
|
|
public File getUserRecordingFilePath(final long time, final long nanoTime) {
|
|
return new File(mFilesDir, getUniqueFilename(USER_RECORDING_FILENAME_PREFIX, time,
|
|
nanoTime));
|
|
}
|
|
|
|
private static String getUniqueFilename(final String prefix, final long time,
|
|
final long nanoTime) {
|
|
return prefix + "-" + time + "-" + nanoTime + FILENAME_SUFFIX;
|
|
}
|
|
}
|