package com.aptoide.amethyst.ui; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.pm.PackageManager; import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import com.aptoide.amethyst.R; import com.aptoide.amethyst.downloadmanager.DownloadUtils; import com.aptoide.amethyst.downloadmanager.model.FinishedApk; import com.aptoide.amethyst.utils.GlideUtils; import com.aptoide.models.ApkPermission; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created with IntelliJ IDEA. * User: rmateus * Date: 17-09-2013 * Time: 17:20 * To change this template use File | Settings | File Templates. */ public class PermissionsActivity extends Activity { static private ExecutorService executor = Executors.newFixedThreadPool(10); Context context; private FinishedApk apk; @Override protected void onCreate(Bundle savedInstanceState) { //Aptoide.getThemePicker().setAptoideTheme(this); super.onCreate(savedInstanceState); this.context = this; apk = getIntent().getParcelableExtra("apk"); ArrayList<String> permissionsList = getIntent().getStringArrayListExtra("permissions"); try { List<String> list = Arrays.asList(getPackageManager().getPackageInfo(apk.getApkid(), PackageManager.GET_PERMISSIONS).requestedPermissions); ArrayList<String> installedPermissionsList = new ArrayList<>(list); // Log.d("TAG", "Installed permissions: " + installedPermissionsList.size() + " " + installedPermissionsList); // Log.d("TAG", "apk permissions: " + permissionsList.size() + " " + permissionsList); permissionsList.removeAll(installedPermissionsList); // Log.d("TAG", "apk permissions 2: " + permissionsList.size() + " " + permissionsList); ArrayList<ApkPermission> descriptionList = permissions(context, permissionsList); if (!permissionsList.isEmpty() && !descriptionList.isEmpty()) { permissionsDialog(apk, descriptionList); } else { DownloadUtils.installWithRoot(apk); finish(); } } catch (PackageManager.NameNotFoundException e) { try { permissionsDialog(apk, permissions(context, permissionsList)); } catch (NullPointerException ignore) { DownloadUtils.installWithRoot(apk); finish(); } } catch (NullPointerException e) { DownloadUtils.installWithRoot(apk); finish(); } } public static ArrayList<ApkPermission> permissions(Context context, ArrayList<String> permissionArray) { PackageManager pm = context.getPackageManager(); CharSequence csPermissionGroupLabel; CharSequence csPermissionLabel; List<PermissionGroupInfo> lstGroups = pm.getAllPermissionGroups(0); ArrayList<ApkPermission> list = new ArrayList<>(); if (permissionArray != null) { for (int i = 0; i != permissionArray.size(); i++) { String permission = permissionArray.get(i); for (PermissionGroupInfo pgi : lstGroups) { try { List<PermissionInfo> lstPermissions = pm.queryPermissionsByGroup(pgi.name, 0); for (PermissionInfo pi : lstPermissions) { if (pi.name.equals(permission)) { csPermissionLabel = pi.loadLabel(pm); csPermissionGroupLabel = pgi.loadLabel(pm); list.add(new ApkPermission(csPermissionGroupLabel.toString(), csPermissionLabel.toString())); } } } catch (Exception ex) { ex.printStackTrace(); } } } Collections.sort(list, new Comparator<ApkPermission>() { @Override public int compare(ApkPermission lhs, ApkPermission rhs) { return lhs.getName().compareTo(rhs.getName()); } }); } return list; } private void permissionsDialog(final FinishedApk viewApk, ArrayList<ApkPermission> permissions) { View v = LayoutInflater.from(context).inflate(R.layout.app_permission, null); LinearLayout layout = (LinearLayout) v.findViewById(R.id.container); if (permissions != null) { if (!permissions.isEmpty()) { for (int i = 0; i < permissions.size(); i++) { ApkPermission permission = permissions.get(i); View permissionView = LayoutInflater.from(context).inflate(R.layout.row_permission, null); if (i == 0 || !permissions.get(i - 1).getName().equals(permission.getName())) { ((TextView) permissionView.findViewById(R.id.permission_name)).setText(permission.getName()); } else { permissionView.findViewById(R.id.permission_name).setVisibility(View.GONE); } ((TextView) permissionView.findViewById(R.id.permission_description)).setText(permission.getDescription()); layout.addView(permissionView); } } else { TextView tv = new TextView(context); tv.setPadding(10, 10, 10, 10); tv.setText(context.getString(R.string.no_permissions_required)); layout.addView(tv); } } final AlertDialog dialog = new AlertDialog.Builder(context).setView(v).create(); dialog.setTitle(context.getString(R.string.restore) + " " + viewApk.getName() + "?"); //dialog.setIcon(BitmapDrawable.createFromPath(ImageLoader.getInstance().getDiscCache().get(path).getAbsolutePath())); dialog.setButton(DialogInterface.BUTTON_POSITIVE, context.getString(android.R.string.yes), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { executor.submit(new Runnable() { @Override public void run() { DownloadUtils.installWithRoot(viewApk); } }); finish(); } }); dialog.setButton(DialogInterface.BUTTON_NEGATIVE, context.getString(android.R.string.no), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { finish(); } }); dialog.setCancelable(false); //dialog.show(); String path = viewApk.getIconPath(); GlideUtils.showDialogWithGlideLoadingIconFromCache(dialog, path, this); } }