/*
* This source is part of the
* _____ ___ ____
* __ / / _ \/ _ | / __/___ _______ _
* / // / , _/ __ |/ _/_/ _ \/ __/ _ `/
* \___/_/|_/_/ |_/_/ (_)___/_/ \_, /
* /___/
* repository.
*
* Copyright (C) 2015 Carmen Alvarez (c@rmen.ca)
*
* 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 ca.rmen.android.networkmonitor.app.dbops.backend.clean;
import android.app.ActivityManager;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.BaseColumns;
import ca.rmen.android.networkmonitor.Constants;
import ca.rmen.android.networkmonitor.R;
import ca.rmen.android.networkmonitor.app.dbops.ProgressListener;
import ca.rmen.android.networkmonitor.app.dbops.backend.DBOperation;
import ca.rmen.android.networkmonitor.provider.NetMonColumns;
import ca.rmen.android.networkmonitor.provider.NetMonProvider;
import ca.rmen.android.networkmonitor.util.Log;
/**
* Only keep the most recent X records: where X is determined by the
* preference set by the user.
*/
public class DBPurge implements DBOperation {
private static final String TAG = Constants.TAG + DBPurge.class.getSimpleName();
private final Context mContext;
private final int mNumRowsToKeep;
/**
* This task will delete data from the database, keeping at most numRowsToKeep rows.
*/
public DBPurge(Context context, int numRowsToKeep) {
mContext = context;
// For monkey tests we want to avoid clearing the whole log, otherwise the
// remaining tests will be uninteresting.
if (ActivityManager.isUserAMonkey()) mNumRowsToKeep = 500;
else
mNumRowsToKeep = numRowsToKeep;
}
/**
* Only keep the most recent X records: where X is determined by the
* preference set by the user.
*/
@Override
public void execute(ProgressListener listener) {
Log.v(TAG, "purgeDB");
if (mNumRowsToKeep == 0) {
int result = mContext.getContentResolver().delete(NetMonColumns.CONTENT_URI, null, null);
if (listener != null) listener.onComplete(mContext.getString(R.string.purge_notif_complete_content, result));
return;
}
if (mNumRowsToKeep < 0) {
return;
}
// Query the most recent X ids.
// Then find the oldest id from this query.
Uri uri = NetMonColumns.CONTENT_URI.buildUpon().appendQueryParameter(NetMonProvider.QUERY_PARAMETER_LIMIT, String.valueOf(mNumRowsToKeep)).build();
int oldestIdToKeep = -1;
Cursor cursor = mContext.getContentResolver().query(uri, new String[] { BaseColumns._ID }, null, null, BaseColumns._ID + " DESC");
if (cursor != null) {
try {
if (cursor.moveToLast()) {
oldestIdToKeep = cursor.getInt(0);
}
} finally {
cursor.close();
}
}
if (oldestIdToKeep > 0) {
Log.v(TAG, "Will delete rows before id=" + oldestIdToKeep);
int result = mContext.getContentResolver().delete(NetMonColumns.CONTENT_URI, BaseColumns._ID + " < ?",
new String[] { String.valueOf(oldestIdToKeep) });
Log.v(TAG, "Deleted " + result + " rows");
if (listener != null) listener.onComplete(mContext.getString(R.string.purge_notif_complete_content, result));
}
}
@Override
public void cancel() {
// nothing
}
}