package com.google.android.diskusage.datasource.fast;
import com.google.android.diskusage.datasource.AppStatsCallback;
import com.google.android.diskusage.datasource.DataSource;
import com.google.android.diskusage.datasource.LegacyFile;
import com.google.android.diskusage.datasource.PkgInfo;
import com.google.android.diskusage.datasource.PortableFile;
import com.google.android.diskusage.datasource.StatFsSource;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.pm.IPackageStatsObserver;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageStats;
import android.os.Build;
import android.os.Environment;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class DefaultDataSource extends DataSource {
@Override
public InputStream getProc() throws IOException {
return new FileInputStream(new File("/proc/mounts"));
}
@Override
public int getAndroidVersion() {
return Integer.parseInt(Build.VERSION.SDK);
}
@Override
public List<PkgInfo> getInstalledPackages(PackageManager pm) {
final List<PackageInfo> installedPackages = pm.getInstalledPackages(
PackageManager.GET_META_DATA | PackageManager.GET_UNINSTALLED_PACKAGES);
List<PkgInfo> packageInfos = new ArrayList<PkgInfo>();
for (PackageInfo info : installedPackages) {
packageInfos.add(new PkgInfoImpl(info, pm));
}
return packageInfos;
}
@Override
public StatFsSource statFs(String mountPoint) {
return new StatFsSourceImpl(mountPoint);
}
@TargetApi(Build.VERSION_CODES.FROYO)
@Override
public PortableFile getExternalFilesDir(Context context) {
return PortableFileImpl.make(context.getExternalFilesDir(null));
}
@TargetApi(Build.VERSION_CODES.KITKAT)
@Override
public PortableFile[] getExternalFilesDirs(Context context) {
File[] externalFilesDirs = context.getExternalFilesDirs(null);
PortableFile[] result = new PortableFileImpl[externalFilesDirs.length];
for (int i = 0; i < externalFilesDirs.length; i++) {
result[i] = PortableFileImpl.make(externalFilesDirs[i]);
}
return result;
}
@Override
public InputStream createNativeScanner(
Context context, String path, boolean rootRequired)
throws IOException, InterruptedException {
return new NativeScannerStream.Factory(context).create(path, rootRequired);
}
@Override
public boolean isDeviceRooted() {
String pathEnv = System.getenv("PATH");
if (pathEnv != null) {
String[] searchPaths = pathEnv.split(":");
for (String path : searchPaths) {
if (path.length() == 0) {
continue;
}
String suPath = path + "/su";
File suFile = new File(suPath);
if (suFile.exists() && !suFile.isDirectory()) {
return true;
}
}
}
return new File("/system/bin/su").isFile()
|| new File("/system/xbin/su").isFile();
}
@Override
public LegacyFile createLegacyScanFile(String root) {
return LegacyFileImpl.createRoot(root);
}
@Override
public void getPackageSizeInfo(
PkgInfo pkgInfo,
Method getPackageSizeInfo,
PackageManager pm,
final AppStatsCallback callback) throws Exception {
getPackageSizeInfo.invoke(
pm,
pkgInfo.getPackageName(),
new IPackageStatsObserver.Stub() {
@Override
public void onGetStatsCompleted(
PackageStats pStats, boolean succeeded) {
callback.onGetStatsCompleted(
pStats != null ? new AppStatsImpl(pStats) : null, succeeded);
}
});
}
@Override
public PortableFile getExternalStorageDirectory() {
return PortableFileImpl.make(Environment.getExternalStorageDirectory());
}
@Override
public PortableFile getParentFile(PortableFile file) {
return PortableFileImpl.make(new File(file.getAbsolutePath()).getParentFile());
}
}