/**
* Copyright (c) 2013-2014, Rinc Liu (http://rincliu.com).
*
* 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.rincliu.library.util;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.provider.Settings;
import com.rincliu.library.R;
import com.rincliu.library.entity.RLAppInfo;
public class RLAppUtil {
public interface Listener {
public void onReceived(ArrayList<RLAppInfo> list);
}
/**
* @param context
* @param listener
* @return
*/
public static void getInstalledAppList(final Context context, final Listener listener) {
new AsyncTask<Object, Object, ArrayList<RLAppInfo>>() {
@Override
protected ArrayList<RLAppInfo> doInBackground(Object... params) {
PackageManager pManager = context.getPackageManager();
ArrayList<RLAppInfo> appList = new ArrayList<RLAppInfo>();
List<PackageInfo> packages = pManager.getInstalledPackages(0);
for (int i = 0; i < packages.size(); i++) {
PackageInfo pInfo = packages.get(i);
RLAppInfo app = new RLAppInfo();
app.setPackageName(pInfo.packageName);
app.setVersionName(pInfo.versionName);
app.setVersionCode(pInfo.versionCode);
app.setAppName(pInfo.applicationInfo.loadLabel(pManager).toString());
app.setAppIcon(pInfo.applicationInfo.loadIcon(pManager));
if ((pInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
app.setSys(false);
} else {
app.setSys(true);
}
app.setDataDir(pInfo.applicationInfo.dataDir);
app.setTargetSdkVersion(pInfo.applicationInfo.targetSdkVersion);
String os = null;
switch (app.getTargetSdkVersion()) {
case 1:
os = "Android 1.0(BASE)";
break;
case 2:
os = "Android 1.1(BASE_1_1)";
break;
case 3:
os = "Android 1.5(CUPCAKE)";
break;
case 4:
os = "Android 1.6(DONUT)";
break;
case 5:
os = "Android 2.0(ECLAIR)";
break;
case 6:
os = "Android 2.0.1(ECLAIR_0_1)";
break;
case 7:
os = "Android 2.1(ECLAIR_MR1)";
break;
case 8:
os = "Android 2.2(FROYO)";
break;
case 9:
os = "Android 2.3(GINGERBREAD)";
break;
case 10:
os = "Android 2.3.3(GINGERBREAD_MR1)";
break;
case 11:
os = "Android 3.0(HONEYCOMB)";
break;
case 12:
os = "Android 3.1(HONEYCOMB_MR1)";
break;
case 13:
os = "Android 3.2(HONEYCOMB_MR2)";
break;
case 14:
os = "Android 4.0(ICE_CREAM_SANDWICH)";
break;
case 15:
os = "Android 4.0.3(ICE_CREAM_SANDWICH_MR1)";
break;
case 16:
os = "Android 4.1(JELLY_BEAN)";
break;
case 17:
os = "Android 4.2(JELLY_BEAN_MR1)";
break;
}
app.setTargetOsVersion(os);
app.setProcessName(pInfo.applicationInfo.processName);
app.setPublicSourceDir(pInfo.applicationInfo.publicSourceDir);
app.setNativeLibDir(pInfo.applicationInfo.nativeLibraryDir);
app.setFirstInstallTime(pInfo.firstInstallTime);
app.setLastUpdateTime(pInfo.lastUpdateTime);
appList.add(app);
}
return appList;
}
@Override
public void onPostExecute(ArrayList<RLAppInfo> result) {
super.onPostExecute(result);
listener.onReceived(result);
}
}.execute();
}
/**
* @param context
* @param packageName
*/
@SuppressLint("InlinedApi")
public static void openSys(Context context, String packageName) {
Intent intent = new Intent();
final int apiLevel = Build.VERSION.SDK_INT;
if (apiLevel >= 9) {
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", packageName, null));
} else {
intent.setAction(Intent.ACTION_VIEW);
intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
String appPkgName = (apiLevel == 8 ? "pkg" : "com.android.settings.ApplicationPkgName");
intent.putExtra(appPkgName, packageName);
}
context.startActivity(intent);
}
/**
* @param context
* @param packageName
*/
public static void uninstall(Context context, String packageName) {
Uri uri = Uri.fromParts("package", packageName, null);
Intent it = new Intent(Intent.ACTION_DELETE, uri);
context.startActivity(it);
}
/**
* @param context
* @param packageName
*/
public static void clearCache(Context context, String packageName) {
Context pContext = null;
try {
pContext = context.createPackageContext(packageName, Context.CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
if (pContext == null) {
return;
}
if (pContext.getCacheDir() != null) {
File root1 = pContext.getCacheDir();
if (root1.exists() && RLSysUtil.requestRootPermission(root1.getPath())) {
for (String dir : root1.list()) {
RLFileUtil.deleteDir(new File(root1, dir));
}
RLUiUtil.toast(context, R.string.inner_cache_cleared);
} else {
RLUiUtil.toast(pContext, R.string.request_root_failed);
}
}
String path2 = null;
if (RLSysUtil.isExternalStorageAvailable() && (path2 = RLSysUtil.getExternalCacheDir(pContext)) != null) {
File root2 = new File(path2);
if (root2.exists() && RLSysUtil.requestRootPermission(root2.getPath())) {
for (String dir : root2.list()) {
RLFileUtil.deleteDir(new File(root2, dir));
}
RLUiUtil.toast(context, R.string.external_cache_cleared);
} else {
RLUiUtil.toast(pContext, R.string.request_root_failed);
}
}
}
/**
* @param context
* @param packageName
*/
public static void clearData(Context context, String packageName) {
Context pContext = null;
try {
pContext = context.createPackageContext(packageName, Context.CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
if (pContext == null) {
return;
}
if (pContext.getCacheDir() != null && pContext.getCacheDir().getParent() != null) {
String path1 = pContext.getCacheDir().getParent();
File root1 = new File(path1);
if (root1.exists() && RLSysUtil.requestRootPermission(path1)) {
for (String dir : root1.list()) {
RLFileUtil.deleteDir(new File(root1, dir));
}
RLUiUtil.toast(context, R.string.inner_data_cleared);
} else {
RLUiUtil.toast(pContext, R.string.request_root_failed);
}
}
String path2 = null;
if (RLSysUtil.isExternalStorageAvailable() && (path2 = RLSysUtil.getExternalCacheDir(pContext)) != null
&& new File(path2).getParent() != null) {
File root2 = new File(new File(path2).getParent());
if (root2.exists() && RLSysUtil.requestRootPermission(path2)) {
for (String dir : root2.list()) {
RLFileUtil.deleteDir(new File(root2, dir));
}
RLUiUtil.toast(context, R.string.external_data_cleared);
} else {
RLUiUtil.toast(pContext, R.string.request_root_failed);
}
}
}
/**
* @param context
* @param packageName
*/
public static void launch(Context context, String packageName) {
PackageManager pManager = context.getPackageManager();
Intent intent = pManager.getLaunchIntentForPackage(packageName);
if (intent != null) {
context.startActivity(intent);
} else {
RLUiUtil.toast(context, R.string.launch_app_failed);
}
}
}