/* * Copyright (C) 2014 SlimRoms Project * * 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.android.settings.slim.util; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Fragment; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.Intent.ShortcutIconResource; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Parcelable; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.TextView; import com.android.settings.slim.util.ShortcutPickerHelper.AppExpandableAdapter.GroupInfo; import com.android.settings.R; import com.android.internal.util.slim.AppHelper; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class ShortcutPickerHelper { public static final int REQUEST_PICK_SHORTCUT = 100; public static final int REQUEST_PICK_APPLICATION = 101; public static final int REQUEST_CREATE_SHORTCUT = 102; private Activity mParent; private AlertDialog mAlertDialog; private OnPickListener mListener; private PackageManager mPackageManager; private int lastFragmentId; public interface OnPickListener { void shortcutPicked(String uri, String friendlyName, Bitmap bmp, boolean isApplication); } public ShortcutPickerHelper(Activity parent, OnPickListener listener) { mParent = parent; mPackageManager = mParent.getPackageManager(); mListener = listener; } public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { switch (requestCode) { case REQUEST_PICK_APPLICATION: completeSetCustomApp(data); break; case REQUEST_CREATE_SHORTCUT: completeSetCustomShortcut(data); break; case REQUEST_PICK_SHORTCUT: processShortcut(data, REQUEST_PICK_APPLICATION, REQUEST_CREATE_SHORTCUT); break; } } } public void pickShortcut(int fragmentId) { pickShortcut(fragmentId, false); } public void pickShortcut(int fragmentId, boolean fullAppsOnly) { pickShortcut(fragmentId, fullAppsOnly, false, false); } public void pickShortcut(int fragmentId, boolean fullAppsOnly, boolean newAction, boolean reassignAction) { lastFragmentId = fragmentId; if (fullAppsOnly) { Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY); pickIntent.putExtra(Intent.EXTRA_INTENT, mainIntent); startFragmentOrActivity(pickIntent, REQUEST_PICK_APPLICATION); } else { Bundle bundle = new Bundle(); ArrayList<String> shortcutNames = new ArrayList<String>(); shortcutNames.add(mParent.getString(R.string.shortcut_picker_applications_title)); shortcutNames.add(mParent.getString(R.string.shortcut_picker_activities_title)); bundle.putStringArrayList(Intent.EXTRA_SHORTCUT_NAME, shortcutNames); ArrayList<ShortcutIconResource> shortcutIcons = new ArrayList<ShortcutIconResource>(); shortcutIcons.add(ShortcutIconResource.fromContext(mParent, android.R.drawable.sym_def_app_icon)); shortcutIcons.add(ShortcutIconResource.fromContext(mParent, R.drawable.activities_icon)); bundle.putParcelableArrayList(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, shortcutIcons); CharSequence title; if (newAction) { title = mParent.getText( R.string.shortcut_picker_choose_new_action); } else if (reassignAction) { title = mParent.getText( R.string.shortcut_picker_reassign_action); } else { title = mParent.getText( R.string.shortcut_picker_choose_action); } Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY); pickIntent.putExtra(Intent.EXTRA_INTENT, new Intent(Intent.ACTION_CREATE_SHORTCUT)); pickIntent.putExtra(Intent.EXTRA_TITLE, title); pickIntent.putExtras(bundle); startFragmentOrActivity(pickIntent, REQUEST_PICK_SHORTCUT); } } private void startFragmentOrActivity(Intent pickIntent, int requestCode) { if (lastFragmentId == 0) { mParent.startActivityForResult(pickIntent, requestCode); } else { Fragment cFrag = mParent.getFragmentManager().findFragmentById(lastFragmentId); if (cFrag != null) { mParent.startActivityFromFragment(cFrag, pickIntent, requestCode); } } } private void processShortcut(Intent intent, int requestCodeApplication, int requestCodeShortcut) { // Handle case where user selected "Applications" String applicationName = mParent.getResources().getString(R.string.shortcut_picker_applications_title); String application2name = mParent.getString(R.string.shortcut_picker_activities_title); String shortcutName = intent.getStringExtra(Intent.EXTRA_SHORTCUT_NAME); if (applicationName != null && applicationName.equals(shortcutName)) { Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY); pickIntent.putExtra(Intent.EXTRA_INTENT, mainIntent); pickIntent.putExtra(Intent.EXTRA_TITLE, mParent.getText( R.string.shortcut_picker_select_app_title)); startFragmentOrActivity(pickIntent, requestCodeApplication); } else if (application2name != null && application2name.equals(shortcutName)){ final List<PackageInfo> pInfos = mPackageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES); ExpandableListView appListView = new ExpandableListView(mParent); AppExpandableAdapter appAdapter = new AppExpandableAdapter(pInfos, mParent); appListView.setAdapter(appAdapter); appListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { Intent shortIntent = new Intent(Intent.ACTION_MAIN); String pkgName = ((GroupInfo)parent.getExpandableListAdapter().getGroup(groupPosition)) .info.packageName; String actName = ((GroupInfo)parent.getExpandableListAdapter().getGroup(groupPosition)) .info.activities[childPosition].name; shortIntent.setClassName(pkgName, actName); completeSetCustomApp(shortIntent); mAlertDialog.dismiss(); return true; } }); Builder builder = new Builder(mParent, com.android.internal.R.style.Theme_DeviceDefault_Dialog_Alert); builder.setView(appListView); mAlertDialog = builder.create(); mAlertDialog.setTitle(mParent.getString(R.string.shortcut_picker_select_activity_title)); mAlertDialog.show(); mAlertDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { } }); } else { startFragmentOrActivity(intent, requestCodeShortcut); } } public class AppExpandableAdapter extends BaseExpandableListAdapter { ArrayList<GroupInfo> allList = new ArrayList<GroupInfo>(); final int groupPadding; public class LabelCompare implements Comparator<GroupInfo>{ @Override public int compare(GroupInfo item1, GroupInfo item2) { String rank1 = item1.label.toLowerCase(); String rank2 = item2.label.toLowerCase(); int result = rank1.compareTo(rank2); if(result == 0) { return 0; } else if(result < 0) { return -1; } else { return +1; } } } class GroupInfo { String label; PackageInfo info; GroupInfo (String l, PackageInfo p) { label = l; info = p; } } public AppExpandableAdapter(List<PackageInfo> pInfos, Context context) { for (PackageInfo i : pInfos) { allList.add(new GroupInfo(i.applicationInfo.loadLabel(mPackageManager).toString(), i)); } Collections.sort(allList, new LabelCompare()); groupPadding = context.getResources().getDimensionPixelSize(R.dimen.shortcut_picker_left_padding); } public String getChild(int groupPosition, int childPosition) { return allList.get(groupPosition).info.activities[childPosition].name; } public long getChildId(int groupPosition, int childPosition) { return childPosition; } public int getChildrenCount(int groupPosition) { if (allList.get(groupPosition).info.activities != null) { return allList.get(groupPosition).info.activities.length; } else { return 0; } } public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { if (convertView == null) { convertView = View.inflate(mParent, android.R.layout.simple_list_item_1, null); convertView.setPadding(groupPadding, 0, 0, 0); } TextView textView = (TextView)convertView.findViewById(android.R.id.text1); textView.setText(getChild(groupPosition, childPosition).replaceFirst(allList.get(groupPosition).info.packageName + ".", "")); return convertView; } public GroupInfo getGroup(int groupPosition) { return allList.get(groupPosition); } public int getGroupCount() { return allList.size(); } public long getGroupId(int groupPosition) { return groupPosition; } public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { if (convertView == null) { convertView = View.inflate(mParent, android.R.layout.simple_list_item_1, null); convertView.setPadding(groupPadding, 0, 0, 0); } TextView textView = (TextView)convertView.findViewById(android.R.id.text1); textView.setText(getGroup(groupPosition).label); return convertView; } public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } public boolean hasStableIds() { return true; } } private void completeSetCustomApp(Intent data) { mListener.shortcutPicked(data.toUri(0), AppHelper.getFriendlyActivityName(mParent, mPackageManager, data, false), null, true); } private void completeSetCustomShortcut(Intent data) { Intent intent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT); /* preserve shortcut name, we want to restore it later */ intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, data.getStringExtra( Intent.EXTRA_SHORTCUT_NAME)); String appUri = intent.toUri(0); appUri = appUri.replaceAll("com.android.contacts.action.QUICK_CONTACT", "android.intent.action.VIEW"); // Check if icon is present Bitmap bmp = null; Parcelable extra = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON); if (extra != null && extra instanceof Bitmap) { bmp = (Bitmap) extra; } // No icon till now check if icon resource is present if (bmp == null) { extra = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE); if (extra != null && extra instanceof Intent.ShortcutIconResource) { try { Intent.ShortcutIconResource iconResource = (ShortcutIconResource) extra; Resources resources = mPackageManager.getResourcesForApplication(iconResource.packageName); final int id = resources.getIdentifier(iconResource.resourceName, null, null); bmp = BitmapFactory.decodeResource(resources, id); } catch (Exception e) { e.printStackTrace(); } } } mListener.shortcutPicked(appUri, AppHelper.getFriendlyShortcutName(mParent, mPackageManager, intent), bmp, false); } }