/*
* CatSaver
* Copyright (C) 2015 HiHex Ltd.
*
* This program 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.
*
* This program 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
* this program. If not, see <http://www.gnu.org/licenses/>.
*
*
*/
package hihex.cs;
import android.content.Context;
import android.content.SharedPreferences;
import com.google.common.base.Charsets;
import com.google.common.io.CharStreams;
import com.google.common.io.Closeables;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.regex.Pattern;
/**
* Persistent preferences
*/
public final class Preferences {
public static final String SHARED_PREFS_FILTER_KEY = "filter";
public static final String SHARED_PREFS_PURGE_FILESIZE_KEY = "purge_filesize";
public static final String SHARED_PREFS_PURGE_DURATION_KEY = "purge_duration";
public static final String SHARED_PREFS_SHOW_INDICATOR_KEY = "show_indicator";
public static final String SHARED_PREFS_RUN_ON_BOOT_KEY = "run_on_boot";
public static final String SHARED_PREFS_LOG_FILTER_KEY = "log_filter";
public static final String SHARED_PREFS_SPLIT_SIZE_KEY = "split_size";
/**
* The preferences.
*/
public final SharedPreferences mSharedPreferences;
private final Context mContext;
/**
* The active process-name filter.
*/
private volatile Pattern mFilter;
private volatile String mRawLogFilter;
private volatile boolean mHasDefaultLogFilter;
private volatile LogEntryFilter mLogFilter;
private volatile long mPurgeFilesize;
private volatile long mPurgeDuration;
private volatile long mSplitSize;
private static SharedPreferences getSharedPreferences(final Context context) {
return context.getSharedPreferences("default", Context.MODE_PRIVATE);
}
public Preferences(final Context context) {
mContext = context;
mSharedPreferences = getSharedPreferences(context);
final String filter = mSharedPreferences.getString(SHARED_PREFS_FILTER_KEY, "^(com\\.)?hihex\\.(?!cs$)");
mFilter = Pattern.compile(filter);
mPurgeFilesize = mSharedPreferences.getLong(SHARED_PREFS_PURGE_FILESIZE_KEY, -1);
mPurgeDuration = mSharedPreferences.getLong(SHARED_PREFS_PURGE_DURATION_KEY, -1);
mSplitSize = mSharedPreferences.getLong(SHARED_PREFS_SPLIT_SIZE_KEY, 32768);
readLogFilter();
}
private String readDefaultLogFilter() {
final InputStream stream = mContext.getResources().openRawResource(R.raw.default_filter_config);
final Reader reader = new InputStreamReader(stream, Charsets.UTF_8);
try {
return CharStreams.toString(reader);
} catch (final IOException e) {
// Should not happen
throw new RuntimeException(e);
} finally {
Closeables.closeQuietly(reader);
}
}
private void readLogFilter() {
String logFilter = mSharedPreferences.getString(SHARED_PREFS_LOG_FILTER_KEY, null);
if (logFilter != null) {
mHasDefaultLogFilter = false;
} else {
mHasDefaultLogFilter = true;
logFilter = readDefaultLogFilter();
}
mRawLogFilter = logFilter;
mLogFilter = LogEntryFilter.parse(logFilter);
}
public Pattern getFilter() {
return mFilter;
}
public long getPurgeFilesize() {
return mPurgeFilesize;
}
public long getSplitSize() {
return mSplitSize;
}
public long getPurgeDuration() {
return mPurgeDuration;
}
public boolean shouldShowIndicator() {
return mSharedPreferences.getBoolean(SHARED_PREFS_SHOW_INDICATOR_KEY, true);
}
public static boolean shouldRunOnBoot(final Context context) {
final SharedPreferences sharedPreferences = getSharedPreferences(context);
return sharedPreferences.getBoolean(SHARED_PREFS_RUN_ON_BOOT_KEY, true);
}
public boolean shouldRunOnBoot() {
return mSharedPreferences.getBoolean(SHARED_PREFS_RUN_ON_BOOT_KEY, true);
}
public void updateSettings(final Pattern filter,
final long purgeFilesize,
final long purgeDuration,
final boolean shouldShowIndicator,
final boolean shouldRunOnBoot,
final long splitSize) {
mFilter = filter;
mPurgeFilesize = purgeFilesize;
mSplitSize = splitSize;
mPurgeDuration = purgeDuration;
final SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putString(SHARED_PREFS_FILTER_KEY, filter.pattern());
editor.putLong(SHARED_PREFS_PURGE_FILESIZE_KEY, purgeFilesize);
editor.putLong(SHARED_PREFS_PURGE_DURATION_KEY, purgeDuration);
editor.putBoolean(SHARED_PREFS_SHOW_INDICATOR_KEY, shouldShowIndicator);
editor.putBoolean(SHARED_PREFS_RUN_ON_BOOT_KEY, shouldRunOnBoot);
editor.putLong(SHARED_PREFS_SPLIT_SIZE_KEY, splitSize);
editor.apply();
Events.bus.post(new Events.PreferencesUpdated(this));
//removeExpiredLogs();
//eventBus.post(new Events.RecordIndicatorVisibility(shouldShowIndicator));
}
public void updateFilters(final Pattern filter, String logFilter) {
if (logFilter == null) {
mHasDefaultLogFilter = true;
mRawLogFilter = readDefaultLogFilter();
mLogFilter = LogEntryFilter.parse(mRawLogFilter);
} else {
mLogFilter = LogEntryFilter.parse(logFilter);
mHasDefaultLogFilter = false;
mRawLogFilter = logFilter;
}
mFilter = filter;
final SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putString(SHARED_PREFS_FILTER_KEY, filter.pattern());
editor.putString(SHARED_PREFS_LOG_FILTER_KEY, logFilter);
editor.apply();
Events.bus.post(new Events.PreferencesUpdated(this));
}
public String getRawLogFilter() {
return mRawLogFilter;
}
public boolean hasDefaultLogFilter() {
return mHasDefaultLogFilter;
}
public LogEntryFilter getLogFilter() {
return mLogFilter;
}
}