FilterShowActivity.java revision 2576a29cccf1d96edeef071914e8b775c230e8e8
1 2package com.android.gallery3d.filtershow; 3 4import android.annotation.TargetApi; 5import android.app.ActionBar; 6import android.app.Activity; 7import android.app.ProgressDialog; 8import android.content.ContentValues; 9import android.content.Context; 10import android.content.Intent; 11import android.content.res.Resources; 12import android.graphics.Bitmap; 13import android.graphics.BitmapFactory; 14import android.graphics.Color; 15import android.graphics.Point; 16import android.graphics.drawable.Drawable; 17import android.net.Uri; 18import android.os.Bundle; 19import android.util.DisplayMetrics; 20import android.util.Log; 21import android.util.TypedValue; 22import android.view.Display; 23import android.view.Menu; 24import android.view.MenuItem; 25import android.view.View; 26import android.view.View.OnClickListener; 27import android.widget.AdapterView; 28import android.widget.AdapterView.OnItemClickListener; 29import android.widget.ImageButton; 30import android.widget.LinearLayout; 31import android.widget.ListView; 32import android.widget.SeekBar; 33import android.widget.ShareActionProvider; 34import android.widget.ShareActionProvider.OnShareTargetSelectedListener; 35import android.widget.Toast; 36 37import com.android.gallery3d.R; 38import com.android.gallery3d.data.LocalAlbum; 39import com.android.gallery3d.filtershow.cache.ImageLoader; 40import com.android.gallery3d.filtershow.filters.ImageFilter; 41import com.android.gallery3d.filtershow.filters.ImageFilterBorder; 42import com.android.gallery3d.filtershow.filters.ImageFilterContrast; 43import com.android.gallery3d.filtershow.filters.ImageFilterExposure; 44import com.android.gallery3d.filtershow.filters.ImageFilterFx; 45import com.android.gallery3d.filtershow.filters.ImageFilterHue; 46import com.android.gallery3d.filtershow.filters.ImageFilterParametricBorder; 47import com.android.gallery3d.filtershow.filters.ImageFilterRS; 48import com.android.gallery3d.filtershow.filters.ImageFilterSaturated; 49import com.android.gallery3d.filtershow.filters.ImageFilterShadows; 50import com.android.gallery3d.filtershow.filters.ImageFilterTinyPlanet; 51import com.android.gallery3d.filtershow.filters.ImageFilterVibrance; 52import com.android.gallery3d.filtershow.filters.ImageFilterVignette; 53import com.android.gallery3d.filtershow.filters.ImageFilterWBalance; 54import com.android.gallery3d.filtershow.imageshow.ImageBorder; 55import com.android.gallery3d.filtershow.imageshow.ImageCrop; 56import com.android.gallery3d.filtershow.imageshow.ImageFlip; 57import com.android.gallery3d.filtershow.imageshow.ImageRotate; 58import com.android.gallery3d.filtershow.imageshow.ImageShow; 59import com.android.gallery3d.filtershow.imageshow.ImageSmallBorder; 60import com.android.gallery3d.filtershow.imageshow.ImageSmallFilter; 61import com.android.gallery3d.filtershow.imageshow.ImageStraighten; 62import com.android.gallery3d.filtershow.imageshow.ImageWithIcon; 63import com.android.gallery3d.filtershow.imageshow.ImageZoom; 64import com.android.gallery3d.filtershow.presets.ImagePreset; 65import com.android.gallery3d.filtershow.provider.SharedImageProvider; 66import com.android.gallery3d.filtershow.tools.SaveCopyTask; 67import com.android.gallery3d.filtershow.ui.ImageButtonTitle; 68import com.android.gallery3d.filtershow.ui.ImageCurves; 69import com.android.gallery3d.filtershow.ui.Spline; 70import com.android.gallery3d.util.GalleryUtils; 71 72import java.io.File; 73import java.lang.ref.WeakReference; 74import java.util.Vector; 75 76@TargetApi(16) 77public class FilterShowActivity extends Activity implements OnItemClickListener, 78 OnShareTargetSelectedListener { 79 80 public static final String CROP_ACTION = "com.android.camera.action.CROP"; 81 private final PanelController mPanelController = new PanelController(); 82 private ImageLoader mImageLoader = null; 83 private ImageShow mImageShow = null; 84 private ImageCurves mImageCurves = null; 85 private ImageBorder mImageBorders = null; 86 private ImageStraighten mImageStraighten = null; 87 private ImageZoom mImageZoom = null; 88 private ImageCrop mImageCrop = null; 89 private ImageRotate mImageRotate = null; 90 private ImageFlip mImageFlip = null; 91 92 private View mListFx = null; 93 private View mListBorders = null; 94 private View mListGeometry = null; 95 private View mListColors = null; 96 private View mListFilterButtons = null; 97 98 private ImageButton mFxButton = null; 99 private ImageButton mBorderButton = null; 100 private ImageButton mGeometryButton = null; 101 private ImageButton mColorsButton = null; 102 103 private ImageSmallFilter mCurrentImageSmallFilter = null; 104 private static final int SELECT_PICTURE = 1; 105 private static final String LOGTAG = "FilterShowActivity"; 106 protected static final boolean ANIMATE_PANELS = true; 107 private static int mImageBorderSize = 40; 108 109 private boolean mShowingHistoryPanel = false; 110 private boolean mShowingImageStatePanel = false; 111 112 private final Vector<ImageShow> mImageViews = new Vector<ImageShow>(); 113 private final Vector<View> mListViews = new Vector<View>(); 114 private final Vector<ImageButton> mBottomPanelButtons = new Vector<ImageButton>(); 115 116 private ShareActionProvider mShareActionProvider; 117 private File mSharedOutputFile = null; 118 119 private boolean mSharingImage = false; 120 121 private WeakReference<ProgressDialog> mSavingProgressDialog; 122 private static final int SEEK_BAR_MAX = 600; 123 124 @Override 125 public void onCreate(Bundle savedInstanceState) { 126 super.onCreate(savedInstanceState); 127 128 ImageFilterRS.setRenderScriptContext(this); 129 130 ImageShow.setDefaultBackgroundColor(getResources().getColor(R.color.background_screen)); 131 // TODO: get those values from XML. 132 ImageShow.setTextSize((int) getPixelsFromDip(12)); 133 ImageShow.setTextPadding((int) getPixelsFromDip(10)); 134 ImageButtonTitle.setTextSize((int) getPixelsFromDip(12)); 135 ImageButtonTitle.setTextPadding((int) getPixelsFromDip(10)); 136 ImageSmallFilter.setMargin((int) getPixelsFromDip(3)); 137 ImageSmallFilter.setTextMargin((int) getPixelsFromDip(4)); 138 mImageBorderSize = (int) getPixelsFromDip(20); 139 Drawable curveHandle = getResources().getDrawable(R.drawable.camera_crop_holo); 140 int curveHandleSize = (int) getResources().getDimension(R.dimen.crop_indicator_size); 141 Spline.setCurveHandle(curveHandle, curveHandleSize); 142 Spline.setCurveWidth((int) getPixelsFromDip(3)); 143 144 setContentView(R.layout.filtershow_activity); 145 ActionBar actionBar = getActionBar(); 146 actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 147 actionBar.setCustomView(R.layout.filtershow_actionbar); 148 149 actionBar.getCustomView().setOnClickListener(new OnClickListener() { 150 @Override 151 public void onClick(View view) { 152 saveImage(); 153 } 154 }); 155 156 mImageLoader = new ImageLoader(this, getApplicationContext()); 157 158 LinearLayout listFilters = (LinearLayout) findViewById(R.id.listFilters); 159 LinearLayout listBorders = (LinearLayout) findViewById(R.id.listBorders); 160 LinearLayout listColors = (LinearLayout) findViewById(R.id.listColorsFx); 161 162 mImageShow = (ImageShow) findViewById(R.id.imageShow); 163 mImageCurves = (ImageCurves) findViewById(R.id.imageCurves); 164 mImageBorders = (ImageBorder) findViewById(R.id.imageBorder); 165 mImageStraighten = (ImageStraighten) findViewById(R.id.imageStraighten); 166 mImageZoom = (ImageZoom) findViewById(R.id.imageZoom); 167 mImageCrop = (ImageCrop) findViewById(R.id.imageCrop); 168 mImageRotate = (ImageRotate) findViewById(R.id.imageRotate); 169 mImageFlip = (ImageFlip) findViewById(R.id.imageFlip); 170 171 mImageViews.add(mImageShow); 172 mImageViews.add(mImageCurves); 173 mImageViews.add(mImageBorders); 174 mImageViews.add(mImageStraighten); 175 mImageViews.add(mImageZoom); 176 mImageViews.add(mImageCrop); 177 mImageViews.add(mImageRotate); 178 mImageViews.add(mImageFlip); 179 180 mListFx = findViewById(R.id.fxList); 181 mListBorders = findViewById(R.id.bordersList); 182 mListGeometry = findViewById(R.id.geometryList); 183 mListFilterButtons = findViewById(R.id.filterButtonsList); 184 mListColors = findViewById(R.id.colorsFxList); 185 mListViews.add(mListFx); 186 mListViews.add(mListBorders); 187 mListViews.add(mListGeometry); 188 mListViews.add(mListFilterButtons); 189 mListViews.add(mListColors); 190 191 mFxButton = (ImageButton) findViewById(R.id.fxButton); 192 mBorderButton = (ImageButton) findViewById(R.id.borderButton); 193 mGeometryButton = (ImageButton) findViewById(R.id.geometryButton); 194 mColorsButton = (ImageButton) findViewById(R.id.colorsButton); 195 196 mImageShow.setImageLoader(mImageLoader); 197 mImageCurves.setImageLoader(mImageLoader); 198 mImageCurves.setMaster(mImageShow); 199 mImageBorders.setImageLoader(mImageLoader); 200 mImageBorders.setMaster(mImageShow); 201 mImageStraighten.setImageLoader(mImageLoader); 202 mImageStraighten.setMaster(mImageShow); 203 mImageZoom.setImageLoader(mImageLoader); 204 mImageZoom.setMaster(mImageShow); 205 mImageCrop.setImageLoader(mImageLoader); 206 mImageCrop.setMaster(mImageShow); 207 mImageRotate.setImageLoader(mImageLoader); 208 mImageRotate.setMaster(mImageShow); 209 mImageFlip.setImageLoader(mImageLoader); 210 mImageFlip.setMaster(mImageShow); 211 212 mPanelController.addImageView(findViewById(R.id.imageShow)); 213 mPanelController.addImageView(findViewById(R.id.imageCurves)); 214 mPanelController.addImageView(findViewById(R.id.imageBorder)); 215 mPanelController.addImageView(findViewById(R.id.imageStraighten)); 216 mPanelController.addImageView(findViewById(R.id.imageCrop)); 217 mPanelController.addImageView(findViewById(R.id.imageRotate)); 218 mPanelController.addImageView(findViewById(R.id.imageFlip)); 219 mPanelController.addImageView(findViewById(R.id.imageZoom)); 220 221 mPanelController.addPanel(mFxButton, mListFx, 0); 222 mPanelController.addPanel(mBorderButton, mListBorders, 1); 223 224 mPanelController.addPanel(mGeometryButton, mListGeometry, 2); 225 mPanelController.addComponent(mGeometryButton, findViewById(R.id.straightenButton)); 226 mPanelController.addComponent(mGeometryButton, findViewById(R.id.cropButton)); 227 mPanelController.addComponent(mGeometryButton, findViewById(R.id.rotateButton)); 228 mPanelController.addComponent(mGeometryButton, findViewById(R.id.flipButton)); 229 230 mPanelController.addPanel(mColorsButton, mListColors, 3); 231 232 int[] recastIDs = { 233 R.id.tinyplanetButton, 234 R.id.vignetteButton, 235 R.id.vibranceButton, 236 R.id.contrastButton, 237 R.id.saturationButton, 238 R.id.shadowRecoveryButton, 239 R.id.wbalanceButton, 240 R.id.hueButton, 241 R.id.exposureButton, 242 R.id.shadowRecoveryButton 243 }; 244 ImageFilter[] filters = { 245 new ImageFilterTinyPlanet(), 246 new ImageFilterVignette(), 247 new ImageFilterVibrance(), 248 new ImageFilterContrast(), 249 new ImageFilterSaturated(), 250 new ImageFilterWBalance(), 251 new ImageFilterHue(), 252 new ImageFilterExposure(), 253 new ImageFilterShadows() 254 }; 255 256 for (int i = 0; i < filters.length; i++) { 257 258 ImageSmallFilter fView = new ImageSmallFilter(this); 259 View v = listColors.findViewById(recastIDs[i]); 260 int pos = listColors.indexOfChild(v); 261 listColors.removeView(v); 262 263 filters[i].setParameter(100); 264 if(v instanceof ImageButtonTitle) 265 filters[i].setName(((ImageButtonTitle) v).getText()); 266 fView.setImageFilter(filters[i]); 267 fView.setController(this); 268 fView.setImageLoader(mImageLoader); 269 fView.setId(recastIDs[i]); 270 mPanelController.addComponent(mColorsButton, fView); 271 listColors.addView(fView, pos); 272 } 273 274 int[] overlayIDs = { 275 R.id.sharpenButton, 276 R.id.curvesButtonRGB 277 }; 278 int[] overlayBitmaps = { 279 R.drawable.filtershow_button_colors_sharpen, 280 R.drawable.filtershow_button_colors_curve 281 }; 282 int []overlayNames = { 283 R.string.sharpness, 284 R.string.curvesRGB 285 }; 286 287 for (int i = 0; i < overlayIDs.length; i++) { 288 ImageWithIcon fView = new ImageWithIcon(this); 289 View v = listColors.findViewById(overlayIDs[i]); 290 int pos = listColors.indexOfChild(v); 291 listColors.removeView(v); 292 final int sid = overlayNames[i]; 293 ImageFilterExposure efilter = new ImageFilterExposure() { 294 { 295 mName = getString(sid); 296 } 297 }; 298 efilter.setParameter(-300); 299 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), 300 overlayBitmaps[i]); 301 302 fView.setIcon(bitmap); 303 fView.setImageFilter(efilter); 304 fView.setController(this); 305 fView.setImageLoader(mImageLoader); 306 fView.setId(overlayIDs[i]); 307 mPanelController.addComponent(mColorsButton, fView); 308 listColors.addView(fView, pos); 309 } 310 311 mPanelController.addComponent(mColorsButton, findViewById(R.id.tinyplanetButton)); 312 mPanelController.addComponent(mColorsButton, findViewById(R.id.curvesButtonRGB)); 313 mPanelController.addComponent(mColorsButton, findViewById(R.id.sharpenButton)); 314 mPanelController.addComponent(mColorsButton, findViewById(R.id.vibranceButton)); 315 mPanelController.addComponent(mColorsButton, findViewById(R.id.contrastButton)); 316 mPanelController.addComponent(mColorsButton, findViewById(R.id.saturationButton)); 317 mPanelController.addComponent(mColorsButton, findViewById(R.id.wbalanceButton)); 318 mPanelController.addComponent(mColorsButton, findViewById(R.id.hueButton)); 319 mPanelController.addComponent(mColorsButton, findViewById(R.id.exposureButton)); 320 mPanelController.addComponent(mColorsButton, findViewById(R.id.shadowRecoveryButton)); 321 322 mPanelController.addView(findViewById(R.id.applyEffect)); 323 mPanelController.addView(findViewById(R.id.pickCurvesChannel)); 324 mPanelController.addView(findViewById(R.id.aspect)); 325 findViewById(R.id.resetOperationsButton).setOnClickListener( 326 createOnClickResetOperationsButton()); 327 328 ListView operationsList = (ListView) findViewById(R.id.operationsList); 329 operationsList.setAdapter(mImageShow.getHistoryAdapter()); 330 operationsList.setOnItemClickListener(this); 331 ListView imageStateList = (ListView) findViewById(R.id.imageStateList); 332 imageStateList.setAdapter(mImageShow.getImageStateAdapter()); 333 mImageLoader.setAdapter((HistoryAdapter) mImageShow.getHistoryAdapter()); 334 335 fillListImages(listFilters); 336 fillListBorders(listBorders); 337 338 SeekBar seekBar = (SeekBar) findViewById(R.id.filterSeekBar); 339 seekBar.setMax(SEEK_BAR_MAX); 340 341 mImageShow.setSeekBar(seekBar); 342 mImageZoom.setSeekBar(seekBar); 343 mPanelController.setRowPanel(findViewById(R.id.secondRowPanel)); 344 mPanelController.setUtilityPanel(this, findViewById(R.id.filterButtonsList), 345 findViewById(R.id.applyEffect), findViewById(R.id.aspect)); 346 mPanelController.setMasterImage(mImageShow); 347 mPanelController.setCurrentPanel(mFxButton); 348 Intent intent = getIntent(); 349 String data = intent.getDataString(); 350 if (data != null) { 351 Uri uri = Uri.parse(data); 352 mImageLoader.loadBitmap(uri, getScreenImageSize()); 353 } else { 354 pickImage(); 355 } 356 357 String action = intent.getAction(); 358 if (action == CROP_ACTION){ 359 mPanelController.showComponent(findViewById(R.id.cropButton)); 360 } 361 362 } 363 364 private int getScreenImageSize() { 365 DisplayMetrics metrics = new DisplayMetrics(); 366 Display display = getWindowManager().getDefaultDisplay(); 367 Point size = new Point(); 368 display.getSize(size); 369 display.getMetrics(metrics); 370 int msize = Math.min(size.x, size.y); 371 return (133 * msize) / metrics.densityDpi; 372 } 373 374 private void showSavingProgress(String albumName) { 375 ProgressDialog progress; 376 if (mSavingProgressDialog != null) { 377 progress = mSavingProgressDialog.get(); 378 if (progress != null) { 379 progress.show(); 380 return; 381 } 382 } 383 // TODO: Allow cancellation of the saving process 384 String progressText; 385 if (albumName == null) { 386 progressText = getString(R.string.saving_image); 387 } else { 388 progressText = getString(R.string.filtershow_saving_image, albumName); 389 } 390 progress = ProgressDialog.show(this, "", progressText, true, false); 391 mSavingProgressDialog = new WeakReference<ProgressDialog>(progress); 392 } 393 394 private void hideSavingProgress() { 395 if (mSavingProgressDialog != null) { 396 ProgressDialog progress = mSavingProgressDialog.get(); 397 if (progress != null) 398 progress.dismiss(); 399 } 400 } 401 402 public void completeSaveImage(Uri saveUri) { 403 if (mSharingImage && mSharedOutputFile != null) { 404 // Image saved, we unblock the content provider 405 Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI, 406 Uri.encode(mSharedOutputFile.getAbsolutePath())); 407 ContentValues values = new ContentValues(); 408 values.put(SharedImageProvider.PREPARE, false); 409 getContentResolver().insert(uri, values); 410 } 411 setResult(RESULT_OK, new Intent().setData(saveUri)); 412 hideSavingProgress(); 413 finish(); 414 } 415 416 @Override 417 public boolean onShareTargetSelected(ShareActionProvider arg0, Intent arg1) { 418 // First, let's tell the SharedImageProvider that it will need to wait 419 // for the image 420 Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI, 421 Uri.encode(mSharedOutputFile.getAbsolutePath())); 422 ContentValues values = new ContentValues(); 423 values.put(SharedImageProvider.PREPARE, true); 424 getContentResolver().insert(uri, values); 425 mSharingImage = true; 426 427 // Process and save the image in the background. 428 showSavingProgress(null); 429 mImageShow.saveImage(this, mSharedOutputFile); 430 return true; 431 } 432 433 private Intent getDefaultShareIntent() { 434 Intent intent = new Intent(Intent.ACTION_SEND); 435 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 436 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 437 intent.setType(SharedImageProvider.MIME_TYPE); 438 mSharedOutputFile = SaveCopyTask.getNewFile(this, mImageLoader.getUri()); 439 Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI, 440 Uri.encode(mSharedOutputFile.getAbsolutePath())); 441 intent.putExtra(Intent.EXTRA_STREAM, uri); 442 return intent; 443 } 444 445 @Override 446 public boolean onCreateOptionsMenu(Menu menu) { 447 getMenuInflater().inflate(R.menu.filtershow_activity_menu, menu); 448 MenuItem showHistory = menu.findItem(R.id.operationsButton); 449 if (mShowingHistoryPanel) { 450 showHistory.setTitle(R.string.hide_history_panel); 451 } else { 452 showHistory.setTitle(R.string.show_history_panel); 453 } 454 MenuItem showState = menu.findItem(R.id.showImageStateButton); 455 if (mShowingImageStatePanel) { 456 showState.setTitle(R.string.hide_imagestate_panel); 457 } else { 458 showState.setTitle(R.string.show_imagestate_panel); 459 } 460 mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share) 461 .getActionProvider(); 462 mShareActionProvider.setShareIntent(getDefaultShareIntent()); 463 mShareActionProvider.setOnShareTargetSelectedListener(this); 464 return true; 465 } 466 467 @Override 468 public void onPause() { 469 super.onPause(); 470 if (mShareActionProvider != null) { 471 mShareActionProvider.setOnShareTargetSelectedListener(null); 472 } 473 } 474 475 @Override 476 public void onResume() { 477 super.onResume(); 478 if (mShareActionProvider != null) { 479 mShareActionProvider.setOnShareTargetSelectedListener(this); 480 } 481 } 482 483 @Override 484 public boolean onOptionsItemSelected(MenuItem item) { 485 switch (item.getItemId()) { 486 case R.id.undoButton: { 487 HistoryAdapter adapter = (HistoryAdapter) mImageShow 488 .getHistoryAdapter(); 489 int position = adapter.undo(); 490 mImageShow.onItemClick(position); 491 mImageShow.showToast("Undo"); 492 invalidateViews(); 493 return true; 494 } 495 case R.id.redoButton: { 496 HistoryAdapter adapter = (HistoryAdapter) mImageShow 497 .getHistoryAdapter(); 498 int position = adapter.redo(); 499 mImageShow.onItemClick(position); 500 mImageShow.showToast("Redo"); 501 invalidateViews(); 502 return true; 503 } 504 case R.id.resetHistoryButton: { 505 resetHistory(); 506 return true; 507 } 508 case R.id.showImageStateButton: { 509 toggleImageStatePanel(); 510 return true; 511 } 512 case R.id.operationsButton: { 513 toggleHistoryPanel(); 514 return true; 515 } 516 case android.R.id.home: { 517 saveImage(); 518 return true; 519 } 520 } 521 return false; 522 } 523 524 private void fillListImages(LinearLayout listFilters) { 525 // TODO: use listview 526 // TODO: load the filters straight from the filesystem 527 528 ImageFilterFx[] fxArray = new ImageFilterFx[18]; 529 int p = 0; 530 531 int[] drawid = { 532 R.drawable.filtershow_fx_0005_punch, 533 R.drawable.filtershow_fx_0000_vintage, 534 R.drawable.filtershow_fx_0004_bw_contrast, 535 R.drawable.filtershow_fx_0002_bleach, 536 R.drawable.filtershow_fx_0001_instant, 537 R.drawable.filtershow_fx_0007_washout, 538 R.drawable.filtershow_fx_0003_blue_crush, 539 R.drawable.filtershow_fx_0008_washout_color, 540 R.drawable.filtershow_fx_0006_x_process 541 }; 542 543 int[] fxNameid = { 544 R.string.ffx_punch, 545 R.string.ffx_vintage, 546 R.string.ffx_bw_contrast, 547 R.string.ffx_bleach, 548 R.string.ffx_instant, 549 R.string.ffx_washout, 550 R.string.ffx_blue_crush, 551 R.string.ffx_washout_color, 552 R.string.ffx_x_process 553 }; 554 555 ImagePreset preset = new ImagePreset(); // empty 556 ImageSmallFilter filter = new ImageSmallFilter(this); 557 558 filter.setSelected(true); 559 mCurrentImageSmallFilter = filter; 560 561 filter.setImageFilter(new ImageFilterFx(null,getString(R.string.none))); 562 563 filter.setController(this); 564 filter.setImageLoader(mImageLoader); 565 listFilters.addView(filter); 566 ImageSmallFilter previousFilter = filter; 567 568 BitmapFactory.Options o = new BitmapFactory.Options(); 569 o.inScaled = false; 570 571 for (int i = 0; i < drawid.length; i++) { 572 Bitmap b = BitmapFactory.decodeResource(getResources(), drawid[i], o); 573 fxArray[p++] = new ImageFilterFx(b, getString(fxNameid[i])); 574 } 575 576 for (int i = 0; i < p; i++) { 577 filter = new ImageSmallFilter(this); 578 filter.setImageFilter(fxArray[i]); 579 filter.setController(this); 580 filter.setImageLoader(mImageLoader); 581 listFilters.addView(filter); 582 previousFilter = filter; 583 } 584 585 // Default preset (original) 586 mImageShow.setImagePreset(preset); 587 } 588 589 private void fillListBorders(LinearLayout listBorders) { 590 // TODO: use listview 591 // TODO: load the borders straight from the filesystem 592 int p = 0; 593 ImageFilter[] borders = new ImageFilter[7]; 594 borders[p++] = new ImageFilterBorder(null); 595 596 Drawable npd1 = getResources().getDrawable(R.drawable.filtershow_border_4x5); 597 borders[p++] = new ImageFilterBorder(npd1); 598 Drawable npd2 = getResources().getDrawable(R.drawable.filtershow_border_brush); 599 borders[p++] = new ImageFilterBorder(npd2); 600 borders[p++] = new ImageFilterParametricBorder(Color.BLACK, mImageBorderSize, 0); 601 borders[p++] = new ImageFilterParametricBorder(Color.BLACK, mImageBorderSize, 602 mImageBorderSize); 603 borders[p++] = new ImageFilterParametricBorder(Color.WHITE, mImageBorderSize, 0); 604 borders[p++] = new ImageFilterParametricBorder(Color.WHITE, mImageBorderSize, 605 mImageBorderSize); 606 607 ImageSmallFilter previousFilter = null; 608 for (int i = 0; i < p; i++) { 609 ImageSmallBorder filter = new ImageSmallBorder(this); 610 filter.setImageFilter(borders[i]); 611 filter.setController(this); 612 filter.setBorder(true); 613 filter.setImageLoader(mImageLoader); 614 filter.setShowTitle(false); 615 listBorders.addView(filter); 616 previousFilter = filter; 617 } 618 } 619 620 // ////////////////////////////////////////////////////////////////////////////// 621 // Some utility functions 622 // TODO: finish the cleanup. 623 624 public void showOriginalViews(boolean value) { 625 for (ImageShow views : mImageViews) { 626 views.showOriginal(value); 627 } 628 } 629 630 public void invalidateViews() { 631 for (ImageShow views : mImageViews) { 632 views.invalidate(); 633 views.updateImage(); 634 } 635 } 636 637 public void hideListViews() { 638 for (View view : mListViews) { 639 view.setVisibility(View.GONE); 640 } 641 } 642 643 public void hideImageViews() { 644 mImageShow.setShowControls(false); // reset 645 for (View view : mImageViews) { 646 view.setVisibility(View.GONE); 647 } 648 } 649 650 public void unselectBottomPanelButtons() { 651 for (ImageButton button : mBottomPanelButtons) { 652 button.setSelected(false); 653 } 654 } 655 656 public void unselectPanelButtons(Vector<ImageButton> buttons) { 657 for (ImageButton button : buttons) { 658 button.setSelected(false); 659 } 660 } 661 662 // ////////////////////////////////////////////////////////////////////////////// 663 // imageState panel... 664 665 private void toggleImageStatePanel() { 666 final View view = findViewById(R.id.mainPanel); 667 final View viewList = findViewById(R.id.imageStatePanel); 668 669 if (mShowingHistoryPanel) { 670 findViewById(R.id.historyPanel).setVisibility(View.INVISIBLE); 671 mShowingHistoryPanel = false; 672 } 673 674 if (!mShowingImageStatePanel) { 675 mShowingImageStatePanel = true; 676 view.animate().setDuration(200).x(-viewList.getWidth()) 677 .withLayer().withEndAction(new Runnable() { 678 @Override 679 public void run() { 680 viewList.setAlpha(0); 681 viewList.setVisibility(View.VISIBLE); 682 viewList.animate().setDuration(100) 683 .alpha(1.0f).start(); 684 } 685 }).start(); 686 } else { 687 mShowingImageStatePanel = false; 688 viewList.setVisibility(View.INVISIBLE); 689 view.animate().setDuration(200).x(0).withLayer() 690 .start(); 691 } 692 invalidateOptionsMenu(); 693 } 694 695 // ////////////////////////////////////////////////////////////////////////////// 696 // history panel... 697 698 private void toggleHistoryPanel() { 699 final View view = findViewById(R.id.mainPanel); 700 final View viewList = findViewById(R.id.historyPanel); 701 702 if (mShowingImageStatePanel) { 703 findViewById(R.id.imageStatePanel).setVisibility(View.INVISIBLE); 704 mShowingImageStatePanel = false; 705 } 706 707 if (!mShowingHistoryPanel) { 708 mShowingHistoryPanel = true; 709 view.animate().setDuration(200).x(-viewList.getWidth()) 710 .withLayer().withEndAction(new Runnable() { 711 @Override 712 public void run() { 713 viewList.setAlpha(0); 714 viewList.setVisibility(View.VISIBLE); 715 viewList.animate().setDuration(100) 716 .alpha(1.0f).start(); 717 } 718 }).start(); 719 } else { 720 mShowingHistoryPanel = false; 721 viewList.setVisibility(View.INVISIBLE); 722 view.animate().setDuration(200).x(0).withLayer() 723 .start(); 724 } 725 invalidateOptionsMenu(); 726 } 727 728 private void resetHistory() { 729 HistoryAdapter adapter = (HistoryAdapter) mImageShow 730 .getHistoryAdapter(); 731 adapter.reset(); 732 ImagePreset original = new ImagePreset(adapter.getItem(0)); 733 mImageShow.setImagePreset(original); 734 mPanelController.resetParameters(); 735 invalidateViews(); 736 } 737 738 // reset button in the history panel. 739 private OnClickListener createOnClickResetOperationsButton() { 740 return new View.OnClickListener() { 741 @Override 742 public void onClick(View v) { 743 resetHistory(); 744 } 745 }; 746 } 747 748 @Override 749 public void onBackPressed() { 750 if (mPanelController.onBackPressed()) { 751 saveImage(); 752 } 753 } 754 755 public void cannotLoadImage() { 756 CharSequence text = getString(R.string.cannot_load_image); 757 Toast toast = Toast.makeText(this, text, Toast.LENGTH_SHORT); 758 toast.show(); 759 finish(); 760 } 761 762 // ////////////////////////////////////////////////////////////////////////////// 763 764 public float getPixelsFromDip(float value) { 765 Resources r = getResources(); 766 return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, 767 r.getDisplayMetrics()); 768 } 769 770 public void useImagePreset(ImageSmallFilter imageSmallFilter, ImagePreset preset) { 771 if (preset == null) { 772 return; 773 } 774 775 if (mCurrentImageSmallFilter != null) { 776 mCurrentImageSmallFilter.setSelected(false); 777 } 778 mCurrentImageSmallFilter = imageSmallFilter; 779 mCurrentImageSmallFilter.setSelected(true); 780 781 ImagePreset copy = new ImagePreset(preset); 782 mImageShow.setImagePreset(copy); 783 if (preset.isFx()) { 784 // if it's an FX we rest the curve adjustment too 785 mImageCurves.resetCurve(); 786 } 787 invalidateViews(); 788 } 789 790 public void useImageFilter(ImageSmallFilter imageSmallFilter, ImageFilter imageFilter, 791 boolean setBorder) { 792 if (imageFilter == null) { 793 return; 794 } 795 796 if (mCurrentImageSmallFilter != null) { 797 mCurrentImageSmallFilter.setSelected(false); 798 } 799 mCurrentImageSmallFilter = imageSmallFilter; 800 mCurrentImageSmallFilter.setSelected(true); 801 802 ImagePreset oldPreset = mImageShow.getImagePreset(); 803 ImagePreset copy = new ImagePreset(oldPreset); 804 // TODO: use a numerical constant instead. 805 806 copy.add(imageFilter); 807 808 mImageShow.setImagePreset(copy); 809 invalidateViews(); 810 } 811 812 @Override 813 public void onItemClick(AdapterView<?> parent, View view, int position, 814 long id) { 815 mImageShow.onItemClick(position); 816 invalidateViews(); 817 } 818 819 public void pickImage() { 820 Intent intent = new Intent(); 821 intent.setType("image/*"); 822 intent.setAction(Intent.ACTION_GET_CONTENT); 823 startActivityForResult(Intent.createChooser(intent, getString(R.string.select_image)), 824 SELECT_PICTURE); 825 } 826 827 @Override 828 public void onActivityResult(int requestCode, int resultCode, Intent data) { 829 Log.v(LOGTAG, "onActivityResult"); 830 if (resultCode == RESULT_OK) { 831 if (requestCode == SELECT_PICTURE) { 832 Uri selectedImageUri = data.getData(); 833 mImageLoader.loadBitmap(selectedImageUri, getScreenImageSize()); 834 } 835 } 836 } 837 838 public void saveImage() { 839 if (mImageShow.hasModifications()) { 840 // Get the name of the album, to which the image will be saved 841 File saveDir = SaveCopyTask.getFinalSaveDirectory(this, mImageLoader.getUri()); 842 int bucketId = GalleryUtils.getBucketId(saveDir.getPath()); 843 String albumName = LocalAlbum.getLocalizedName(getResources(), bucketId, null); 844 showSavingProgress(albumName); 845 mImageShow.saveImage(this, null); 846 } else { 847 finish(); 848 } 849 } 850 851 static { 852 System.loadLibrary("jni_filtershow_filters"); 853 } 854 855} 856