/*
* Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.filemanager.tasks;
import android.content.Context;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffColorFilter;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ImageView;
import android.widget.ProgressBar;
import com.cyanogenmod.filemanager.model.DiskUsage;
import com.cyanogenmod.filemanager.model.MountPoint;
import com.cyanogenmod.filemanager.ui.ThemeManager;
import com.cyanogenmod.filemanager.ui.ThemeManager.Theme;
import com.cyanogenmod.filemanager.util.MountPointHelper;
/**
* A class for recovery information about filesystem status (mount point, disk usage, ...).
*/
public class FilesystemAsyncTask extends AsyncTask<String, Integer, Boolean> {
private static final String TAG = "FilesystemAsyncTask"; //$NON-NLS-1$
/**
* @hide
*/
final Context mContext;
/**
* @hide
*/
final ImageView mMountPointInfo;
/**
* @hide
*/
final ProgressBar mDiskUsageInfo;
/**
* @hide
*/
final int mFreeDiskSpaceWarningLevel;
private boolean mRunning;
/**
* @hide
*/
static int sColorFilterNormal;
/**
* Constructor of <code>FilesystemAsyncTask</code>.
*
* @param context The current context
* @param mountPointInfo The mount point info view
* @param diskUsageInfo The mount point info view
* @param freeDiskSpaceWarningLevel The free disk space warning level
*/
public FilesystemAsyncTask(
Context context, ImageView mountPointInfo,
ProgressBar diskUsageInfo, int freeDiskSpaceWarningLevel) {
super();
this.mContext = context;
this.mMountPointInfo = mountPointInfo;
this.mDiskUsageInfo = diskUsageInfo;
this.mFreeDiskSpaceWarningLevel = freeDiskSpaceWarningLevel;
this.mRunning = false;
}
/**
* Method that returns if there is a task running.
*
* @return boolean If there is a task running
*/
public boolean isRunning() {
return this.mRunning;
}
/**
* {@inheritDoc}
*/
@Override
protected Boolean doInBackground(String... params) {
//Running
this.mRunning = true;
//Extract the directory from arguments
String dir = params[0];
//Extract filesystem mount point from directory
if (isCancelled()) {
return Boolean.TRUE;
}
final MountPoint mp = MountPointHelper.getMountPointFromDirectory(dir);
if (mp == null) {
//There is no information about
if (isCancelled()) {
return Boolean.TRUE;
}
this.mMountPointInfo.post(new Runnable() {
@Override
public void run() {
Theme theme = ThemeManager.getCurrentTheme(FilesystemAsyncTask.this.mContext);
theme.setImageDrawable(
FilesystemAsyncTask.this.mContext,
FilesystemAsyncTask.this.mMountPointInfo,
"filesystem_warning_drawable"); //$NON-NLS-1$
FilesystemAsyncTask.this.mMountPointInfo.setTag(null);
}
});
} else {
//Set image icon an save the mount point info
if (isCancelled()) {
return Boolean.TRUE;
}
this.mMountPointInfo.post(new Runnable() {
@Override
public void run() {
String resource =
MountPointHelper.isReadOnly(mp)
? "filesystem_locked_drawable" //$NON-NLS-1$
: "filesystem_unlocked_drawable"; //$NON-NLS-1$
Theme theme = ThemeManager.getCurrentTheme(FilesystemAsyncTask.this.mContext);
theme.setImageDrawable(
FilesystemAsyncTask.this.mContext,
FilesystemAsyncTask.this.mMountPointInfo,
resource);
FilesystemAsyncTask.this.mMountPointInfo.setTag(mp);
}
});
//Load information about disk usage
if (isCancelled()) {
return Boolean.TRUE;
}
this.mDiskUsageInfo.post(new Runnable() {
@Override
public void run() {
DiskUsage du = null;
try {
du = MountPointHelper.getMountPointDiskUsage(mp);
} catch (Exception e) {
Log.e(TAG, "Failed to retrieve disk usage information", e); //$NON-NLS-1$
du = new DiskUsage(
mp.getMountPoint(), 0, 0, 0);
}
int usage = 0;
if (du != null && du.getTotal() != 0) {
usage = (int)(du.getUsed() * 100 / du.getTotal());
FilesystemAsyncTask.this.mDiskUsageInfo.setProgress(usage);
FilesystemAsyncTask.this.mDiskUsageInfo.setTag(du);
} else {
usage = du == null ? 0 : 100;
FilesystemAsyncTask.this.mDiskUsageInfo.setProgress(usage);
FilesystemAsyncTask.this.mDiskUsageInfo.setTag(null);
}
// Advise about diskusage (>=mFreeDiskSpaceWarningLevel) with other color
Theme theme = ThemeManager.getCurrentTheme(FilesystemAsyncTask.this.mContext);
int filter =
usage >= FilesystemAsyncTask.this.mFreeDiskSpaceWarningLevel ?
theme.getColor(
FilesystemAsyncTask.this.mContext,
"disk_usage_filter_warning_color") : //$NON-NLS-1$
theme.getColor(
FilesystemAsyncTask.this.mContext,
"disk_usage_filter_normal_color"); //$NON-NLS-1$
FilesystemAsyncTask.this.mDiskUsageInfo.
getProgressDrawable().setColorFilter(
new PorterDuffColorFilter(filter, Mode.MULTIPLY));
}
});
}
return Boolean.TRUE;
}
/**
* {@inheritDoc}
*/
@Override
protected void onPostExecute(Boolean result) {
this.mRunning = false;
}
/**
* {@inheritDoc}
*/
@Override
protected void onCancelled(Boolean result) {
this.mRunning = false;
super.onCancelled(result);
}
/**
* {@inheritDoc}
*/
@Override
protected void onCancelled() {
this.mRunning = false;
super.onCancelled();
}
}