/* * 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; } }