package fr.neamar.kiss.result; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.PopupMenu; import android.widget.TextView; import android.widget.Toast; import java.net.URISyntaxException; import java.util.List; import fr.neamar.kiss.DataHandler; import fr.neamar.kiss.KissApplication; import fr.neamar.kiss.R; import fr.neamar.kiss.adapter.RecordAdapter; import fr.neamar.kiss.pojo.ShortcutsPojo; public class ShortcutsResult extends Result { private final ShortcutsPojo shortcutPojo; public ShortcutsResult(ShortcutsPojo shortcutPojo) { super(); this.pojo = this.shortcutPojo = shortcutPojo; } @Override public View display(final Context context, int position, View v) { if (v == null) v = inflateFromId(context, R.layout.item_shortcut); TextView appName = (TextView) v.findViewById(R.id.item_app_name); appName.setText(enrichText(shortcutPojo.displayName, context)); final ImageView shortcutIcon = (ImageView) v.findViewById(R.id.item_shortcut_icon); final ImageView appIcon = (ImageView) v.findViewById(R.id.item_app_icon); // Retrieve package icon for this shortcut final PackageManager packageManager = context.getPackageManager(); Drawable appDrawable = null; try { Intent intent = Intent.parseUri(shortcutPojo.intentUri, 0); List<ResolveInfo> packages = packageManager.queryIntentActivities(intent, 0); if(packages.size() > 0) { ResolveInfo mainPackage = packages.get(0); String packageName = mainPackage.activityInfo.applicationInfo.packageName; String activityName = mainPackage.activityInfo.name; ComponentName className = new ComponentName(packageName, activityName); appDrawable = context.getPackageManager().getActivityIcon(className); } } catch (NameNotFoundException e) { e.printStackTrace(); return v; } catch (URISyntaxException e) { e.printStackTrace(); return v; } if (shortcutPojo.icon != null) { BitmapDrawable drawable = new BitmapDrawable(context.getResources(), shortcutPojo.icon); shortcutIcon.setImageDrawable(drawable); appIcon.setImageDrawable(appDrawable); } else { // No icon for this shortcut, use app icon shortcutIcon.setImageDrawable(appDrawable); appIcon.setImageResource(android.R.drawable.ic_menu_send); } return v; } public Drawable getDrawable(Context context) { return new BitmapDrawable(context.getResources(), shortcutPojo.icon); } @Override protected void doLaunch(Context context, View v) { try { Intent intent = Intent.parseUri(shortcutPojo.intentUri, 0); if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { intent.setSourceBounds(v.getClipBounds()); } context.startActivity(intent); } catch (Exception e) { // Application was just removed? Toast.makeText(context, R.string.application_not_found, Toast.LENGTH_LONG).show(); } } @Override PopupMenu buildPopupMenu(Context context, RecordAdapter parent, View parentView) { return inflatePopupMenu(R.menu.menu_item_shortcut, context, parentView); } @Override Boolean popupMenuClickHandler(Context context, RecordAdapter parent, MenuItem item) { switch (item.getItemId()) { case R.id.item_app_uninstall: launchUninstall(context, shortcutPojo); // Also remove item, since it will be uninstalled parent.removeResult(this); return true; } return super.popupMenuClickHandler(context, parent, item); } private void launchUninstall(Context context, ShortcutsPojo shortcutPojo) { DataHandler dh = KissApplication.getDataHandler(context); if (dh != null) { dh.removeShortcut(shortcutPojo); } } }