/*
* 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.util;
import android.util.Log;
import com.cyanogenmod.filemanager.FileManagerApplication;
import com.cyanogenmod.filemanager.commands.MountExecutable;
import com.cyanogenmod.filemanager.console.Console;
import com.cyanogenmod.filemanager.model.DiskUsage;
import com.cyanogenmod.filemanager.model.FileSystemObject;
import com.cyanogenmod.filemanager.model.MountPoint;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* A helper class with useful methods for deal with mount points.
*/
public final class MountPointHelper {
private static final String TAG = "MountPointHelper"; //$NON-NLS-1$
private static final List<String> RESTRICTED_FS_TYPE = Arrays.asList(new String[]{
"devpts", //$NON-NLS-1$
"proc", //$NON-NLS-1$
"sysfs", //$NON-NLS-1$
"debugfs", //$NON-NLS-1$
"cgroup", //$NON-NLS-1$
"tmpfs" //$NON-NLS-1$
});
private static final long MAX_CACHED_TIME = 60000L * 5;
private static List<MountPoint> sMountPoints;
private static long sLastCachedTime;
/**
* Constructor of <code>MountPointHelper</code>.
*/
private MountPointHelper() {
super();
}
/**
* Method that retrieve the mount point information for a directory.
*
* @param dir The directory of which recovers his mount point information
* @return MountPoint The mount point information
*/
public static MountPoint getMountPointFromDirectory(FileSystemObject dir) {
return getMountPointFromDirectory(dir.getFullPath());
}
/**
* Method that retrieve the mount point information for a directory.
*
* @param dir The directory of which recovers his mount point information
* @return MountPoint The mount point information
*/
public static MountPoint getMountPointFromDirectory(String dir) {
try {
return getMountPointFromDirectory(FileManagerApplication.getBackgroundConsole(), dir);
} catch (Exception e) {
Log.e(TAG, "Failed to retrieve mount point information.", e); //$NON-NLS-1$
}
return null;
}
/**
* Method that retrieve the mount point information for a directory.
*
* @param console The console in which realize the operation
* @param dir The directory of which recovers his mount point information
* @return MountPoint The mount point information
*/
public synchronized static MountPoint getMountPointFromDirectory(Console console, String dir) {
try {
// For non-rooted devices, which console is java and runs under a chrooted
// device, mount point info mustn't be a main objective. Caching the status
// should be enough and operation runs smoothly.
// Refresh mount points after some time (5 minutes should be enough)
long now = System.currentTimeMillis();
if (sMountPoints == null || (now - sLastCachedTime) > MAX_CACHED_TIME ||
FileManagerApplication.isDeviceRooted()) {
//Retrieve the mount points
List<MountPoint> mps =
CommandHelper.getMountPoints(null, console);
sMountPoints = mps;
sLastCachedTime = now;
}
//Sort mount points in reverse order, needed for avoid
//found an incorrect mount point that matches the name
Collections.sort(sMountPoints, new Comparator<MountPoint>() {
@Override
public int compare(MountPoint lhs, MountPoint rhs) {
return lhs.compareTo(rhs) * -1;
}
});
//Search for the mount point information
int cc = sMountPoints.size();
for (int i = 0; i < cc; i++) {
MountPoint mp = sMountPoints.get(i);
if (dir.startsWith(mp.getMountPoint())) {
return mp;
}
}
} catch (Exception e) {
Log.e(TAG, "Failed to retrieve the mount point information", e); //$NON-NLS-1$
}
//No mount point found
return null;
}
/**
* Method that retrieve information about the disk usage of the mount point.
*
* @param mp The mount point
* @return DiskUsage The disk usage information
*/
public static DiskUsage getMountPointDiskUsage(MountPoint mp) {
return getMountPointDiskUsage(FileManagerApplication.getBackgroundConsole(), mp);
}
/**
* Method that retrieve information about the disk usage of the mount point.
*
* @param console The console in which realize the operation
* @param mp The mount point
* @return DiskUsage The disk usage information
*/
public static DiskUsage getMountPointDiskUsage(Console console, MountPoint mp) {
try {
//Retrieve the mount points
return CommandHelper.getDiskUsage(null, mp.getMountPoint(), console);
} catch (Exception e) {
Log.e(TAG,
String.format("Fail to load disk usage of mount point: %s", //$NON-NLS-1$
mp.getMountPoint()), e);
}
//No mount point found
return null;
}
/**
* Method that returns if the filesystem is mounted as readonly.
*
* @param mp The mount point to check
* @return boolean If the mount point is mounted as readonly
*/
public static boolean isReadOnly(MountPoint mp) {
try {
return mp.getOptions().startsWith(MountExecutable.READONLY);
} catch (Exception e) {
Log.e(TAG, "Method \"isReadOnly\" failed.", e); //$NON-NLS-1$
}
//On fail is more secure consider it as read-only
return true;
}
/**
* Method that returns if the filesystem is mounted as read-write.
*
* @param mp The mount point to check
* @return boolean If the mount point is mounted as read-write
*/
public static boolean isReadWrite(MountPoint mp) {
try {
return mp.getOptions().startsWith(MountExecutable.READWRITE);
} catch (Exception e) {
Log.e(TAG, "Method \"isReadWrite\" failed.", e); //$NON-NLS-1$
}
//On fail is more secure consider it as read-only
return false;
}
/**
* Method that returns if a filesystem is allowed to be mounted/unmounted (rw/ro).
*
* @param mp The mount point to check
* @return boolean If the mount point can be mounted/unmount (rw/ro)
*/
public static boolean isMountAllowed(MountPoint mp) {
return !RESTRICTED_FS_TYPE.contains(mp.getType());
}
}