/* * Copyright (C) 2014 Arpit Khurana <arpitkh96@gmail.com>, Vishal Nehra <vishalmeham2@gmail.com> * * This file is part of Amaze File Manager. * * Amaze File Manager is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.amaze.filemanager.adapters; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.graphics.Color; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.util.SparseBooleanArray; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.PopupMenu; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; import com.amaze.filemanager.R; import com.amaze.filemanager.filesystem.BaseFile; import com.amaze.filemanager.filesystem.RootHelper; import com.amaze.filemanager.fragments.AppsList; import com.amaze.filemanager.services.CopyService; import com.amaze.filemanager.services.DeleteTask; import com.amaze.filemanager.ui.LayoutElement; import com.amaze.filemanager.utils.Futils; import com.amaze.filemanager.utils.OpenMode; import com.amaze.filemanager.utils.PreferenceUtils; import com.amaze.filemanager.utils.ServiceWatcherUtil; import com.amaze.filemanager.utils.provider.UtilitiesProviderInterface; import com.amaze.filemanager.utils.theme.AppTheme; import java.io.File; import java.util.ArrayList; import java.util.List; public class AppsAdapter extends ArrayAdapter<LayoutElement> { private UtilitiesProviderInterface utilsProvider; Context context; List<LayoutElement> items; public SparseBooleanArray myChecked = new SparseBooleanArray(); AppsList app; public AppsAdapter(Context context, UtilitiesProviderInterface utilsProvider, int resourceId, AppsList app) { super(context, resourceId); this.utilsProvider = utilsProvider; this.context = context; this.app = app; /*for (int i = 0; i < items.size(); i++) { myChecked.put(i, false); }*/ } public void toggleChecked(int position) { if (myChecked.get(position)) { myChecked.put(position, false); } else { myChecked.put(position, true); } notifyDataSetChanged(); } public void toggleChecked(boolean b) { for (int i = 0; i < items.size(); i++) { myChecked.put(i, b); } notifyDataSetChanged(); } public List<Integer> getCheckedItemPositions() { List<Integer> checkedItemPositions = new ArrayList<Integer>(); for (int i = 0; i < myChecked.size(); i++) { if (myChecked.get(i)) { (checkedItemPositions).add(i); } } return checkedItemPositions; } public boolean areAllChecked() { boolean b = true; for (int i = 0; i < myChecked.size(); i++) { if (!myChecked.get(i)) { b = false; } } return b; } public void setData(List<LayoutElement> data) { clear(); if (data != null) { this.items = data; addAll(data); } } private class ViewHolder { ImageView apkIcon; TextView txtTitle; RelativeLayout rl; TextView txtDesc; ImageButton about; } public View getView(final int position, View convertView, ViewGroup parent) { final LayoutElement rowItem = getItem(position); View view; final int p = position; if (convertView == null) { LayoutInflater mInflater = (LayoutInflater) context .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); view = mInflater.inflate(R.layout.rowlayout, null); final ViewHolder vholder = new ViewHolder(); vholder.txtTitle = (TextView) view.findViewById(R.id.firstline); vholder.apkIcon = (ImageView) view.findViewById(R.id.apk_icon); vholder.rl = (RelativeLayout) view.findViewById(R.id.second); vholder.txtDesc= (TextView) view.findViewById(R.id.date); vholder.about=(ImageButton)view.findViewById(R.id.properties); vholder.apkIcon.setVisibility(View.VISIBLE); view.findViewById(R.id.generic_icon).setVisibility(View.GONE); view.findViewById(R.id.picture_icon).setVisibility(View.GONE); view.setTag(vholder); } else { view = convertView; } final ViewHolder holder = (ViewHolder) view.getTag(); holder.apkIcon.setImageDrawable(rowItem.getImageId()); app.ic.cancelLoad(holder.apkIcon); app.ic.loadDrawable(holder.apkIcon,(rowItem.getDesc()),null); if (holder.about != null) { if(utilsProvider.getAppTheme().equals(AppTheme.LIGHT)) holder.about.setColorFilter(Color.parseColor("#ff666666")); showPopup(holder.about,rowItem); } holder.txtTitle.setText(rowItem.getTitle()); // File f = new File(rowItem.getDesc()); holder.txtDesc.setText(rowItem.getSize()); holder.rl.setClickable(true); holder.rl.setOnClickListener(new View.OnClickListener() { public void onClick(View p1) { Intent i1 = app.getActivity().getPackageManager().getLaunchIntentForPackage(rowItem.getPermissions()); if (i1 != null) app.startActivity(i1); else Toast.makeText(app.getActivity(), app.getResources().getString(R.string.not_allowed), Toast.LENGTH_LONG).show(); // TODO: Implement this method } }); Boolean checked = myChecked.get(position); if (checked != null) { if (checked) { holder.rl.setBackgroundColor(Color.parseColor("#5f33b5e5")); } else { if (utilsProvider.getAppTheme().equals(AppTheme.LIGHT)) { holder.rl.setBackgroundResource(R.drawable.safr_ripple_white); } else { holder.rl.setBackgroundResource(R.drawable.safr_ripple_black); } } } return view; } void showPopup(View v,final LayoutElement rowItem){ final Futils utils = utilsProvider.getFutils(); v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { PopupMenu popupMenu = new PopupMenu(app.getActivity(), view); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.open: Intent i1 = app.getActivity().getPackageManager().getLaunchIntentForPackage(rowItem.getPermissions()); if (i1!= null) app.startActivity(i1); else Toast.makeText(app.getActivity(),app.getResources().getString(R.string.not_allowed), Toast.LENGTH_LONG).show(); return true; case R.id.share: ArrayList<File> arrayList2=new ArrayList<File>(); arrayList2.add(new File(rowItem.getDesc())); int color1= Color.parseColor(PreferenceUtils.getAccentString(app.Sp)); utils.shareFiles(arrayList2, app.getActivity(), utilsProvider.getAppTheme(), color1); return true; case R.id.unins: final BaseFile f1 = new BaseFile(rowItem.getDesc()); f1.setMode(OpenMode.ROOT); int color= Color.parseColor(PreferenceUtils.getAccentString(app.Sp)); if ((Integer.valueOf(rowItem.getSymlink().substring(0, rowItem.getSymlink().indexOf("_"))) & ApplicationInfo.FLAG_SYSTEM) != 0) { // system package if(app.Sp.getBoolean("rootmode",false)) { MaterialDialog.Builder builder1 = new MaterialDialog.Builder(app.getActivity()); builder1.theme(utilsProvider.getAppTheme().getMaterialDialogTheme()) .content(app.getResources().getString(R.string.unin_system_apk)) .title(app.getResources().getString(R.string.warning)) .negativeColor(color) .positiveColor(color) .negativeText(app.getResources().getString(R.string.no)) .positiveText(app.getResources().getString(R.string.yes)) .callback(new MaterialDialog.ButtonCallback() { @Override public void onNegative(MaterialDialog materialDialog) { materialDialog.cancel(); } @Override public void onPositive(MaterialDialog materialDialog) { ArrayList<BaseFile> files = new ArrayList<>(); if (Build.VERSION.SDK_INT >= 21) { String parent = f1.getParent(); if (!parent.equals("app") && !parent.equals("priv-app")) { BaseFile baseFile=new BaseFile(f1.getParent()); baseFile.setMode(OpenMode.ROOT); files.add(baseFile); } else files.add(f1); } else { files.add(f1); } new DeleteTask(app.getActivity().getContentResolver(), app.getActivity()).execute((files)); } }).build().show(); } else { Toast.makeText(app.getActivity(),app.getResources().getString(R.string.enablerootmde),Toast.LENGTH_SHORT).show(); } } else { app.unin(rowItem.getPermissions()); } return true; case R.id.play: Intent intent1 = new Intent(Intent.ACTION_VIEW); intent1.setData(Uri.parse("market://details?id=" + rowItem.getPermissions())); app.startActivity(intent1); return true; case R.id.properties: app.startActivity(new Intent( android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + rowItem.getPermissions()))); return true; case R.id.backup: Toast.makeText(app.getActivity(), app.getResources().getString( R.string.copyingapk) + Environment.getExternalStorageDirectory().getPath() + "/app_backup", Toast.LENGTH_LONG).show(); File f = new File(rowItem.getDesc()); ArrayList<BaseFile> ab = new ArrayList<>(); File dst = new File(Environment.getExternalStorageDirectory().getPath() + "/app_backup"); if(!dst.exists() || !dst.isDirectory())dst.mkdirs(); Intent intent = new Intent(app.getActivity(), CopyService.class); BaseFile baseFile=RootHelper.generateBaseFile(f,true); baseFile.setName(rowItem.getTitle() + "_" + rowItem.getSymlink().substring(rowItem.getSymlink().indexOf("_")+1) + ".apk"); ab.add(baseFile); intent.putParcelableArrayListExtra(CopyService.TAG_COPY_SOURCES, ab); intent.putExtra(CopyService.TAG_COPY_TARGET, dst.getPath()); intent.putExtra(CopyService.TAG_COPY_OPEN_MODE, 0); ServiceWatcherUtil.runService(app.getActivity(), intent); return true; } return false; } }); popupMenu.inflate(R.menu.app_options); popupMenu.show(); } }); } }