/** * */ package com.google.code.appsorganizer.chooseicon; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URI; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.Bitmap.CompressFormat; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore.Images.Media; import com.google.code.appsorganizer.R; import com.google.code.appsorganizer.appwidget.AppsOrganizerAppWidgetProvider; import com.google.code.appsorganizer.db.DatabaseHelper; import com.google.code.appsorganizer.dialogs.GenericDialogManager; import com.google.code.appsorganizer.dialogs.OnOkClickListener; import com.google.code.appsorganizer.dialogs.SimpleDialog; import com.google.code.appsorganizer.dialogs.SingleSelectDialog; import com.google.code.appsorganizer.model.Label; public final class SelectAppDialog extends SingleSelectDialog { private static final String ITEM_ID = "ITEM_ID"; private static final long serialVersionUID = 1L; private static final int DEFAULT_ICONS = 2; public static final int IMAGE_GALLERY = 10; public static final int ICON_PACK = 20; public static final int AND_EXPLORER = 30; private final SimpleDialog applicationNotFoundDialog; private final SimpleDialog selectImageDialog; private long itemId; private final DatabaseHelper dbHelper; public SelectAppDialog(GenericDialogManager dialogManager, DatabaseHelper dbHelper) { super(dialogManager, dialogManager.getString(R.string.choose_app), dialogManager.getString(R.string.alert_dialog_ok), new CharSequence[] { "Default icons", dialogManager.getString(R.string.Android_Image_Gallery), "AndExplorer", "Icon packs" }, 0); applicationNotFoundDialog = createApplicationNotFoundDialog(dialogManager); selectImageDialog = new SimpleDialog(dialogManager, dialogManager.getString(R.string.select_jpg_bmp_title), dialogManager .getString(R.string.select_jpg_bmp)); selectImageDialog.setShowNegativeButton(false); this.dbHelper = dbHelper; } @Override protected void onOkClick(DialogInterface dialog, int selectedItem) { if (selectedItem == 0) { Intent intent = new Intent(owner, ChooseIconActivity.class); intent.putExtra("groupId", itemId); owner.startActivityForResult(intent, DEFAULT_ICONS); } else if (selectedItem == 1) { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); owner.startActivityForResult(intent, IMAGE_GALLERY); } else if (selectedItem == 2) { try { openAndExplorerFileDialog(); } catch (ActivityNotFoundException e) { applicationNotFoundDialog.showDialog(); } } else { owner.startActivityForResult(new Intent(owner, IconPackActivity.class), ICON_PACK); } } private SimpleDialog createApplicationNotFoundDialog(GenericDialogManager dialogManager) { String title = owner.getString(R.string.Application_not_found); SimpleDialog applicationNotFoundDialog = new SimpleDialog(dialogManager, title, owner.getString(R.string.Application_not_found_message), new OnOkClickListener() { private static final long serialVersionUID = 1L; public void onClick(CharSequence charSequence, DialogInterface dialog, int which) { Intent emailIntent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("market://search?q=pname:lysesoft.andexplorer")); owner.startActivity(emailIntent); } }); applicationNotFoundDialog.setOkMessageText(owner.getString(R.string.Open_market)); applicationNotFoundDialog.setShowNegativeButton(true); return applicationNotFoundDialog; } private void openAndExplorerFileDialog() { Intent intent = new Intent(); intent.setAction(Intent.ACTION_PICK); Uri startDir = Uri.fromFile(new File("/sdcard")); intent.setDataAndType(startDir, "vnd.android.cursor.dir/lysesoft.andexplorer.file"); // Title intent.putExtra("explorer_title", "Select a file"); // Optional colors intent.putExtra("browser_title_background_color", "440000AA"); intent.putExtra("browser_title_foreground_color", "FFFFFFFF"); intent.putExtra("browser_list_background_color", "66000000"); intent.putExtra("browser_filter_extension_whitelist", "*.jpg,*.jpeg,*.png"); // Optional font scale intent.putExtra("browser_list_fontscale", "140%"); // Optional 0=simple list, 1 = list with filename and size, 2 = // list with filename, size and date. intent.putExtra("browser_list_layout", "2"); owner.startActivityForResult(intent, AND_EXPLORER); } public void showDialog(long itemId) { this.itemId = itemId; super.showDialog(); } public long getItemId() { return itemId; } public boolean onActivityResult(int requestCode, int resultCode, Intent intent) { boolean ret = false; if (resultCode == Activity.RESULT_OK) { switch (requestCode) { case DEFAULT_ICONS: int icon = intent.getIntExtra("icon", -1); dbHelper.labelDao.updateIcon(itemId, Label.convertToIconDb(icon), null); ret = true; break; case IMAGE_GALLERY: Uri uriImage = intent.getData(); if (uriImage != null) { try { byte[] byteArray = convertToByteArray(uriImage); dbHelper.labelDao.updateIcon(itemId, null, byteArray); ret = true; } catch (IOException e) { selectImageDialog.showDialog(); } } break; case AND_EXPLORER: Uri uri = intent.getData(); if (uri != null) { String path = uri.toString().toLowerCase(); String type = intent.getType(); if (type == null || (!type.equals("image/jpeg") && !type.equals("image/png"))) { selectImageDialog.showDialog(); } else if (path.startsWith("file://")) { File file = new File(URI.create(path)); Bitmap bitmap = getScaledImage(file); ByteArrayOutputStream os = new ByteArrayOutputStream(); bitmap.compress(CompressFormat.PNG, 100, os); dbHelper.labelDao.updateIcon(itemId, null, os.toByteArray()); ret = true; } } break; case ICON_PACK: byte[] image = intent.getByteArrayExtra("image"); dbHelper.labelDao.updateIcon(itemId, null, image); ret = true; break; } if (ret) { AppsOrganizerAppWidgetProvider.updateAppWidget(getOwner(), dbHelper.labelDao.queryById(itemId)); } } return ret; } private byte[] convertToByteArray(Uri uri) throws FileNotFoundException, IOException { Bitmap bm = Media.getBitmap(owner.getContentResolver(), uri); return convertToByteArray(bm); } public static byte[] convertToByteArray(Bitmap bm) { Bitmap bitmap = getScaledImage(bm); ByteArrayOutputStream os = new ByteArrayOutputStream(); bitmap.compress(CompressFormat.PNG, 100, os); return os.toByteArray(); } private static Bitmap getScaledImage(File file) { return getScaledImage(BitmapFactory.decodeFile(file.getAbsolutePath())); } private static Bitmap getScaledImage(Bitmap bitmapOrg) { int width = bitmapOrg.getWidth(); int height = bitmapOrg.getHeight(); // TODO impostare la dimensione in base alla risoluzione int newWidth = 72; int newHeight = 72; // calculate the scale - in this case = 0.4f float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // createa matrix for the manipulation Matrix matrix = new Matrix(); // resize the bit map matrix.postScale(scaleWidth, scaleHeight); // recreate the new Bitmap return Bitmap.createBitmap(bitmapOrg, 0, 0, width, height, matrix, true); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong(ITEM_ID, itemId); } @Override public void onRestoreInstanceState(Bundle state) { super.onRestoreInstanceState(state); itemId = state.getLong(ITEM_ID, -1); } }