/** * @author AnderWeb <anderweb@gmail.com> * **/ package cn.walcl.ulauncher; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import cn.walcl.ulauncher.actions.LauncherActions; import cn.walcl.ulauncher.actions.RunActionActivity; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.ComponentName; import android.content.DialogInterface; import android.content.Intent; import android.content.Intent.ShortcutIconResource; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.os.Parcelable; import android.view.View; import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ListAdapter; import android.widget.TextView; public class CustomShirtcutActivity extends Activity implements OnClickListener { private static final String ACTION_ADW_PICK_ICON="org.adw.launcher.icons.ACTION_PICK_ICON"; public static final String EXTRA_APPLICATIONINFO = "EXTRA_APPLICATIONINFO"; public static final String EXTRA_DRAWERINFO = "EXTRA_DRAWERINFO"; private static final int PICK_CUSTOM_ICON=1; private static final int PICK_STANDARD_MENU=2; private static final int PICK_STANDARD_SHORTCUT=3; private static final int PICK_STANDARD_APPLICATION=4; private static final int PICK_CUSTOM_PICTURE=5; private static final int PICK_FROM_ICON_PACK=6; private static final int DIALOG_ICON_TYPE=1; private Button btPickActivity; private ImageButton btPickIcon; private Button btOk; private Button btRevert; private EditText edLabel; private TextView tvHead; //private ActivityInfo mInfo; private Bitmap mBitmap; PackageManager mPackageManager; private Intent mIntent; private int mIconSize; private boolean isDrawerInfo; private IconCache mIconCache; private LauncherApplication launcherApp; @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable("mBitmap", mBitmap); outState.putParcelable("mIntent", mIntent); outState.putInt("mIconSize", mIconSize); outState.putBoolean("btOk_enabled", btOk.isEnabled()); outState.putBoolean("btPickIcon_enabled", btPickIcon.isEnabled()); outState.putCharSequence("btPickActivity_text", btPickActivity.getText()); outState.putBoolean("isDrawerInfo", isDrawerInfo); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { if (savedInstanceState != null && savedInstanceState.size() >= 7) { mBitmap = savedInstanceState.getParcelable("mBitmap"); mIntent = savedInstanceState.getParcelable("mIntent"); mIconSize = savedInstanceState.getInt("mIconResource"); if (mBitmap != null) btPickIcon.setImageBitmap(mBitmap); btPickActivity.setText(savedInstanceState.getCharSequence("btPickActivity_text")); btPickIcon.setEnabled(savedInstanceState.getBoolean("btPickIcon_enabled")); btOk.setEnabled(savedInstanceState.getBoolean("btOk_enabled")); isDrawerInfo = savedInstanceState.getBoolean("isDrawerInfo"); } super.onRestoreInstanceState(savedInstanceState); }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); launcherApp = (LauncherApplication)this.getApplication(); mIconCache = launcherApp.getIconCache(); setContentView(R.layout.custom_shirtcuts); btPickActivity=(Button) findViewById(R.id.pick_activity); btPickActivity.setOnClickListener(this); btPickIcon=(ImageButton) findViewById(R.id.pick_icon); btPickIcon.setOnClickListener(this); btPickIcon.setEnabled(false); btOk=(Button) findViewById(R.id.shirtcut_ok); btOk.setEnabled(false); btOk.setOnClickListener(this); btRevert=(Button) findViewById(R.id.shirtcut_revert); btRevert.setOnClickListener(this); edLabel=(EditText) findViewById(R.id.shirtcut_label); tvHead=(TextView)findViewById(R.id.header); mPackageManager=getPackageManager(); mIconSize=(int) getResources().getDimension(android.R.dimen.app_icon_size); loadFromShortcutInfo(getShortcutInfo()); } private IconItemInfo getShortcutInfo() { final Intent intent = getIntent(); if (intent != null && intent.getAction() != null && intent.getAction().equals(Intent.ACTION_EDIT) && intent.hasExtra(EXTRA_APPLICATIONINFO)) { long id = intent.getLongExtra(EXTRA_APPLICATIONINFO, 0); ItemInfo info = null; if ( intent.hasExtra(EXTRA_DRAWERINFO) ) { btRevert.setVisibility(View.VISIBLE); btPickActivity.setVisibility(View.GONE); isDrawerInfo = true; List<ShortcutInfo> apps = launcherApp.getAppDB().getApps(new long[] {id}); if ( apps.size() == 1 ) { info = apps.get(0); } } else { info = launcherApp.getModel().getItemInfoById(id); } if (info instanceof IconItemInfo) return (IconItemInfo)info; } return null; } private void loadFromShortcutInfo(IconItemInfo info) { if (info == null) return; edLabel.setText(info.getTitle(mIconCache)); if (info instanceof ShortcutInfo) mIntent = ((ShortcutInfo)info).intent; else { btPickActivity.setVisibility(View.GONE); tvHead.setText(getString(R.string.shirtcut_header_folder)); } btPickIcon.setImageBitmap(info.getIcon(mIconCache)); btPickIcon.setEnabled(true); btOk.setEnabled(true); if (mIntent != null) { ComponentName component = mIntent.getComponent(); if (component != null) { if (component.getClassName().equals(RunActionActivity.class.getName()) && mIntent.getAction().equals(RunActionActivity.ACTION_LAUNCHERACTION)){ } else { ActivityInfo activityInfo = null; try { activityInfo = mPackageManager.getActivityInfo(component, 0); } catch (NameNotFoundException e) { } String title=null; if (activityInfo != null) { title = activityInfo.loadLabel(mPackageManager).toString(); if (title == null) { title = activityInfo.name; } btPickActivity.setText(title); } } } else btPickActivity.setText(info.getTitle(mIconCache)); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode==RESULT_OK){ switch (requestCode) { case PICK_CUSTOM_PICTURE: mBitmap = (Bitmap) data.getParcelableExtra("data"); if(mBitmap!=null){ if(mBitmap.getWidth()>mIconSize) mBitmap = Bitmap.createScaledBitmap(mBitmap, mIconSize, mIconSize, true); btPickIcon.setImageBitmap(mBitmap); } break; case PICK_CUSTOM_ICON: Uri photoUri = data.getData(); try { InputStream is = getContentResolver().openInputStream( photoUri); BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeStream(is, null, opts); BitmapFactory.Options ops2 = new BitmapFactory.Options(); int width = mIconSize; float w = opts.outWidth; //int scale = Math.round(w / width); int scale = (int) (w / width); ops2.inSampleSize = scale; is = getContentResolver().openInputStream(photoUri); mBitmap = BitmapFactory.decodeStream(is, null, ops2); if(mBitmap!=null){ if(mBitmap.getWidth()>mIconSize) mBitmap = Bitmap.createScaledBitmap(mBitmap, mIconSize, mIconSize, true); btPickIcon.setImageBitmap(mBitmap); } } catch (Exception e) { e.printStackTrace(); } break; case PICK_FROM_ICON_PACK: mBitmap = (Bitmap) data.getParcelableExtra("icon"); if(mBitmap!=null){ if(mBitmap.getWidth()>mIconSize) mBitmap = Bitmap.createScaledBitmap(mBitmap, mIconSize, mIconSize, true); btPickIcon.setImageBitmap(mBitmap); } break; case PICK_STANDARD_MENU: String applicationName = getResources().getString(R.string.group_applications); String activitiesName=getResources().getString(R.string.shirtcuts_activity); String launcheractionsName = getResources().getString(R.string.launcher_actions); String shortcutName = data.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); startActivityForResult(pickIntent, PICK_STANDARD_APPLICATION); } else if (activitiesName != null && activitiesName.equals(shortcutName)) { Intent picker=new Intent(); picker.setClass(this, ActivityPickerActivity.class); startActivityForResult(picker,PICK_STANDARD_SHORTCUT); } else if (launcheractionsName != null && launcheractionsName.equals(shortcutName)) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(getString(R.string.launcher_actions)); final ListAdapter adapter = LauncherActions.getInstance().getSelectActionAdapter(); builder.setAdapter(adapter, new Dialog.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { LauncherActions.Action action = (LauncherActions.Action)adapter.getItem(which); Intent result = new Intent(); result.putExtra(Intent.EXTRA_SHORTCUT_NAME, action.getName()); result.putExtra(Intent.EXTRA_SHORTCUT_INTENT, LauncherActions.getInstance().getIntentForAction(action)); ShortcutIconResource iconResource = new ShortcutIconResource(); iconResource.packageName = CustomShirtcutActivity.this.getPackageName(); iconResource.resourceName = getResources().getResourceName(action.getIconResourceId()); result.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource); onActivityResult(PICK_STANDARD_SHORTCUT, RESULT_OK, result); } }); builder.create().show(); } else { startActivityForResult(data, PICK_STANDARD_SHORTCUT); } break; case PICK_STANDARD_APPLICATION: if(mBitmap!=null){ mBitmap.recycle(); mBitmap=null; } ComponentName component = data.getComponent(); ActivityInfo activityInfo = null; try { activityInfo = mPackageManager.getActivityInfo(component, 0 /* no flags */); } catch (NameNotFoundException e) { } String title=null; if (activityInfo != null) { title = activityInfo.loadLabel(mPackageManager).toString(); if (title == null) { title = activityInfo.name; } mIntent=data; btPickActivity.setText(title); mBitmap = null; btPickIcon.setImageDrawable(activityInfo.loadIcon(mPackageManager)); btPickIcon.setEnabled(true); btOk.setEnabled(true); edLabel.setText(title); } break; case PICK_STANDARD_SHORTCUT: if(mBitmap!=null){ mBitmap.recycle(); mBitmap=null; } Intent intent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT); String name = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME); Bitmap bitmap = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON); Drawable icon = null; if (bitmap != null) { icon = new FastBitmapDrawable(Bitmap.createScaledBitmap(bitmap, mIconSize, mIconSize, true)); mBitmap=bitmap; } else { Parcelable extra = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE); if (extra != null && extra instanceof ShortcutIconResource) { try { ShortcutIconResource iconResource = (ShortcutIconResource) extra; Resources resources = mPackageManager.getResourcesForApplication( iconResource.packageName); final int id = resources.getIdentifier(iconResource.resourceName, null, null); icon = resources.getDrawable(id); mBitmap = Utilities.createIconBitmap(icon, this); } catch (Exception e) { } } } if (icon == null) { icon = getPackageManager().getDefaultActivityIcon(); } mIntent=intent; btPickActivity.setText(name); btPickIcon.setImageDrawable(icon); btPickIcon.setEnabled(true); btOk.setEnabled(true); edLabel.setText(name); break; default: break; } } } @Override public void onClick(View v) { if(v.equals(btPickActivity)){ Bundle bundle = new Bundle(); ArrayList<String> shortcutNames = new ArrayList<String>(); shortcutNames.add(getString(R.string.group_applications)); shortcutNames.add(getString(R.string.shirtcuts_activity)); shortcutNames.add(getString(R.string.launcher_actions)); bundle.putStringArrayList(Intent.EXTRA_SHORTCUT_NAME, shortcutNames); ArrayList<ShortcutIconResource> shortcutIcons = new ArrayList<ShortcutIconResource>(); shortcutIcons.add(ShortcutIconResource.fromContext(CustomShirtcutActivity.this, R.drawable.ic_launcher_application)); shortcutIcons.add(ShortcutIconResource.fromContext(CustomShirtcutActivity.this, R.drawable.ic_launcher_home)); shortcutIcons.add(ShortcutIconResource.fromContext(CustomShirtcutActivity.this, R.drawable.ic_launcher_home)); bundle.putParcelableArrayList(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, shortcutIcons); Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY); pickIntent.putExtra(Intent.EXTRA_INTENT, new Intent(Intent.ACTION_CREATE_SHORTCUT)); pickIntent.putExtras(bundle); startActivityForResult(pickIntent, PICK_STANDARD_MENU); }else if(v.equals(btPickIcon)){ showDialog(DIALOG_ICON_TYPE); }else if(v.equals(btOk)){ Intent mReturnData = new Intent(); if (mIntent != null) mReturnData.putExtra(Intent.EXTRA_SHORTCUT_INTENT, mIntent); mReturnData.putExtra(Intent.EXTRA_SHORTCUT_NAME, edLabel.getText().toString()); Intent intent = getIntent(); if (intent != null && intent.getAction() != null && intent.getAction().equals(Intent.ACTION_EDIT) && intent.hasExtra(EXTRA_APPLICATIONINFO)) { long id = intent.getLongExtra(EXTRA_APPLICATIONINFO, 0); mReturnData.putExtra(EXTRA_APPLICATIONINFO, id); } if (mBitmap != null) mReturnData.putExtra(Intent.EXTRA_SHORTCUT_ICON, mBitmap); if ( isDrawerInfo) mReturnData.putExtra(EXTRA_DRAWERINFO, true); setResult(RESULT_OK,mReturnData); finish(); }else if(v.equals(btRevert)){ Intent mReturnData = new Intent(); if (mIntent != null) mReturnData.putExtra(Intent.EXTRA_SHORTCUT_INTENT, mIntent); mReturnData.putExtra(Intent.EXTRA_SHORTCUT_NAME, (String) null); Intent intent = getIntent(); if (intent != null && intent.getAction() != null && intent.getAction().equals(Intent.ACTION_EDIT) && intent.hasExtra(EXTRA_APPLICATIONINFO)) { long id = intent.getLongExtra(EXTRA_APPLICATIONINFO, 0); mReturnData.putExtra(EXTRA_APPLICATIONINFO, id); } mReturnData.putExtra(Intent.EXTRA_SHORTCUT_ICON, (Bitmap) null); if ( isDrawerInfo) mReturnData.putExtra(EXTRA_DRAWERINFO, true); setResult(RESULT_OK,mReturnData); finish(); } } @Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_ICON_TYPE: return new IconTypeDialog().createDialog(); default: break; } return super.onCreateDialog(id); } protected class IconTypeDialog implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { private ArrayAdapter<String> mAdapter; Dialog createDialog() { mAdapter = new ArrayAdapter<String>(CustomShirtcutActivity.this, R.layout.add_list_item); mAdapter.add(getString(R.string.shirtcuts_select_picture)); mAdapter.add(getString(R.string.shirtcuts_crop_picture)); mAdapter.add(getString(R.string.shirtcuts_icon_packs)); final AlertDialog.Builder builder = new AlertDialog.Builder(CustomShirtcutActivity.this); builder.setTitle(getString(R.string.shirtcuts_select_icon_type)); builder.setAdapter(mAdapter, this); builder.setInverseBackgroundForced(false); AlertDialog dialog = builder.create(); dialog.setOnCancelListener(this); dialog.setOnDismissListener(this); return dialog; } public void onCancel(DialogInterface dialog) { cleanup(); } public void onDismiss(DialogInterface dialog) { } private void cleanup() { } public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: //Select icon Intent pickerIntent=new Intent(Intent.ACTION_PICK); pickerIntent.setType("image/*"); startActivityForResult(Intent.createChooser(pickerIntent, "Select icon"), PICK_CUSTOM_ICON); break; case 1: //Crop picture int width; int height; Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); width = height=mIconSize; intent.putExtra("crop", "true"); intent.putExtra("outputX", width); intent.putExtra("outputY", height); intent.putExtra("aspectX", width); intent.putExtra("aspectY", height); intent.putExtra("noFaceDetection", true); intent.putExtra("return-data", true); startActivityForResult(intent, PICK_CUSTOM_PICTURE); break; case 2: //Icon packs Intent packIntent=new Intent(ACTION_ADW_PICK_ICON); startActivityForResult(Intent.createChooser(packIntent, getString(R.string.shirtcuts_select_icon_pack)), PICK_FROM_ICON_PACK); break; default: break; } cleanup(); } } }