FilterShowActivity.java revision d7899c56b8df278dfd6720ae11eadc2f89fe8094
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.addView(findViewById(R.id.applyEffect)); 312 mPanelController.addView(findViewById(R.id.pickCurvesChannel)); 313 mPanelController.addView(findViewById(R.id.aspect)); 314 findViewById(R.id.resetOperationsButton).setOnClickListener( 315 createOnClickResetOperationsButton()); 316 317 ListView operationsList = (ListView) findViewById(R.id.operationsList); 318 operationsList.setAdapter(mImageShow.getHistory()); 319 operationsList.setOnItemClickListener(this); 320 ListView imageStateList = (ListView) findViewById(R.id.imageStateList); 321 imageStateList.setAdapter(mImageShow.getImageStateAdapter()); 322 mImageLoader.setAdapter(mImageShow.getHistory()); 323 324 fillListImages(listFilters); 325 fillListBorders(listBorders); 326 327 SeekBar seekBar = (SeekBar) findViewById(R.id.filterSeekBar); 328 seekBar.setMax(SEEK_BAR_MAX); 329 330 mImageShow.setSeekBar(seekBar); 331 mImageZoom.setSeekBar(seekBar); 332 mPanelController.setRowPanel(findViewById(R.id.secondRowPanel)); 333 mPanelController.setUtilityPanel(this, findViewById(R.id.filterButtonsList), 334 findViewById(R.id.applyEffect), findViewById(R.id.aspect), 335 findViewById(R.id.pickCurvesChannel)); 336 mPanelController.setMasterImage(mImageShow); 337 mPanelController.setCurrentPanel(mFxButton); 338 Intent intent = getIntent(); 339 String data = intent.getDataString(); 340 if (data != null) { 341 Uri uri = Uri.parse(data); 342 mImageLoader.loadBitmap(uri, getScreenImageSize()); 343 } else { 344 pickImage(); 345 } 346 347 String action = intent.getAction(); 348 if (action == CROP_ACTION){ 349 mPanelController.showComponent(findViewById(R.id.cropButton)); 350 } 351 352 } 353 354 private int getScreenImageSize() { 355 DisplayMetrics metrics = new DisplayMetrics(); 356 Display display = getWindowManager().getDefaultDisplay(); 357 Point size = new Point(); 358 display.getSize(size); 359 display.getMetrics(metrics); 360 int msize = Math.min(size.x, size.y); 361 return (133 * msize) / metrics.densityDpi; 362 } 363 364 private void showSavingProgress(String albumName) { 365 ProgressDialog progress; 366 if (mSavingProgressDialog != null) { 367 progress = mSavingProgressDialog.get(); 368 if (progress != null) { 369 progress.show(); 370 return; 371 } 372 } 373 // TODO: Allow cancellation of the saving process 374 String progressText; 375 if (albumName == null) { 376 progressText = getString(R.string.saving_image); 377 } else { 378 progressText = getString(R.string.filtershow_saving_image, albumName); 379 } 380 progress = ProgressDialog.show(this, "", progressText, true, false); 381 mSavingProgressDialog = new WeakReference<ProgressDialog>(progress); 382 } 383 384 private void hideSavingProgress() { 385 if (mSavingProgressDialog != null) { 386 ProgressDialog progress = mSavingProgressDialog.get(); 387 if (progress != null) 388 progress.dismiss(); 389 } 390 } 391 392 public void completeSaveImage(Uri saveUri) { 393 if (mSharingImage && mSharedOutputFile != null) { 394 // Image saved, we unblock the content provider 395 Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI, 396 Uri.encode(mSharedOutputFile.getAbsolutePath())); 397 ContentValues values = new ContentValues(); 398 values.put(SharedImageProvider.PREPARE, false); 399 getContentResolver().insert(uri, values); 400 } 401 setResult(RESULT_OK, new Intent().setData(saveUri)); 402 hideSavingProgress(); 403 finish(); 404 } 405 406 @Override 407 public boolean onShareTargetSelected(ShareActionProvider arg0, Intent arg1) { 408 // First, let's tell the SharedImageProvider that it will need to wait 409 // for the image 410 Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI, 411 Uri.encode(mSharedOutputFile.getAbsolutePath())); 412 ContentValues values = new ContentValues(); 413 values.put(SharedImageProvider.PREPARE, true); 414 getContentResolver().insert(uri, values); 415 mSharingImage = true; 416 417 // Process and save the image in the background. 418 showSavingProgress(null); 419 mImageShow.saveImage(this, mSharedOutputFile); 420 return true; 421 } 422 423 private Intent getDefaultShareIntent() { 424 Intent intent = new Intent(Intent.ACTION_SEND); 425 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 426 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 427 intent.setType(SharedImageProvider.MIME_TYPE); 428 mSharedOutputFile = SaveCopyTask.getNewFile(this, mImageLoader.getUri()); 429 Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI, 430 Uri.encode(mSharedOutputFile.getAbsolutePath())); 431 intent.putExtra(Intent.EXTRA_STREAM, uri); 432 return intent; 433 } 434 435 @Override 436 public boolean onCreateOptionsMenu(Menu menu) { 437 getMenuInflater().inflate(R.menu.filtershow_activity_menu, menu); 438 MenuItem showHistory = menu.findItem(R.id.operationsButton); 439 if (mShowingHistoryPanel) { 440 showHistory.setTitle(R.string.hide_history_panel); 441 } else { 442 showHistory.setTitle(R.string.show_history_panel); 443 } 444 MenuItem showState = menu.findItem(R.id.showImageStateButton); 445 if (mShowingImageStatePanel) { 446 showState.setTitle(R.string.hide_imagestate_panel); 447 } else { 448 showState.setTitle(R.string.show_imagestate_panel); 449 } 450 mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share) 451 .getActionProvider(); 452 mShareActionProvider.setShareIntent(getDefaultShareIntent()); 453 mShareActionProvider.setOnShareTargetSelectedListener(this); 454 return true; 455 } 456 457 @Override 458 public void onPause() { 459 super.onPause(); 460 if (mShareActionProvider != null) { 461 mShareActionProvider.setOnShareTargetSelectedListener(null); 462 } 463 } 464 465 @Override 466 public void onResume() { 467 super.onResume(); 468 if (mShareActionProvider != null) { 469 mShareActionProvider.setOnShareTargetSelectedListener(this); 470 } 471 } 472 473 @Override 474 public boolean onOptionsItemSelected(MenuItem item) { 475 switch (item.getItemId()) { 476 case R.id.undoButton: { 477 HistoryAdapter adapter = mImageShow.getHistory(); 478 int position = adapter.undo(); 479 mImageShow.onItemClick(position); 480 mImageShow.showToast("Undo"); 481 invalidateViews(); 482 return true; 483 } 484 case R.id.redoButton: { 485 HistoryAdapter adapter = mImageShow.getHistory(); 486 int position = adapter.redo(); 487 mImageShow.onItemClick(position); 488 mImageShow.showToast("Redo"); 489 invalidateViews(); 490 return true; 491 } 492 case R.id.resetHistoryButton: { 493 resetHistory(); 494 return true; 495 } 496 case R.id.showImageStateButton: { 497 toggleImageStatePanel(); 498 return true; 499 } 500 case R.id.operationsButton: { 501 toggleHistoryPanel(); 502 return true; 503 } 504 case android.R.id.home: { 505 saveImage(); 506 return true; 507 } 508 } 509 return false; 510 } 511 512 private void fillListImages(LinearLayout listFilters) { 513 // TODO: use listview 514 // TODO: load the filters straight from the filesystem 515 516 ImageFilterFx[] fxArray = new ImageFilterFx[18]; 517 int p = 0; 518 519 int[] drawid = { 520 R.drawable.filtershow_fx_0005_punch, 521 R.drawable.filtershow_fx_0000_vintage, 522 R.drawable.filtershow_fx_0004_bw_contrast, 523 R.drawable.filtershow_fx_0002_bleach, 524 R.drawable.filtershow_fx_0001_instant, 525 R.drawable.filtershow_fx_0007_washout, 526 R.drawable.filtershow_fx_0003_blue_crush, 527 R.drawable.filtershow_fx_0008_washout_color, 528 R.drawable.filtershow_fx_0006_x_process 529 }; 530 531 int[] fxNameid = { 532 R.string.ffx_punch, 533 R.string.ffx_vintage, 534 R.string.ffx_bw_contrast, 535 R.string.ffx_bleach, 536 R.string.ffx_instant, 537 R.string.ffx_washout, 538 R.string.ffx_blue_crush, 539 R.string.ffx_washout_color, 540 R.string.ffx_x_process 541 }; 542 543 ImagePreset preset = new ImagePreset(); // empty 544 ImageSmallFilter filter = new ImageSmallFilter(this); 545 546 filter.setSelected(true); 547 mCurrentImageSmallFilter = filter; 548 549 filter.setImageFilter(new ImageFilterFx(null,getString(R.string.none))); 550 551 filter.setController(this); 552 filter.setImageLoader(mImageLoader); 553 listFilters.addView(filter); 554 ImageSmallFilter previousFilter = filter; 555 556 BitmapFactory.Options o = new BitmapFactory.Options(); 557 o.inScaled = false; 558 559 for (int i = 0; i < drawid.length; i++) { 560 Bitmap b = BitmapFactory.decodeResource(getResources(), drawid[i], o); 561 fxArray[p++] = new ImageFilterFx(b, getString(fxNameid[i])); 562 } 563 564 for (int i = 0; i < p; i++) { 565 filter = new ImageSmallFilter(this); 566 filter.setImageFilter(fxArray[i]); 567 filter.setController(this); 568 filter.setImageLoader(mImageLoader); 569 listFilters.addView(filter); 570 previousFilter = filter; 571 } 572 573 // Default preset (original) 574 mImageShow.setImagePreset(preset); 575 } 576 577 private void fillListBorders(LinearLayout listBorders) { 578 // TODO: use listview 579 // TODO: load the borders straight from the filesystem 580 int p = 0; 581 ImageFilter[] borders = new ImageFilter[7]; 582 borders[p++] = new ImageFilterBorder(null); 583 584 Drawable npd1 = getResources().getDrawable(R.drawable.filtershow_border_4x5); 585 borders[p++] = new ImageFilterBorder(npd1); 586 Drawable npd2 = getResources().getDrawable(R.drawable.filtershow_border_brush); 587 borders[p++] = new ImageFilterBorder(npd2); 588 borders[p++] = new ImageFilterParametricBorder(Color.BLACK, mImageBorderSize, 0); 589 borders[p++] = new ImageFilterParametricBorder(Color.BLACK, mImageBorderSize, 590 mImageBorderSize); 591 borders[p++] = new ImageFilterParametricBorder(Color.WHITE, mImageBorderSize, 0); 592 borders[p++] = new ImageFilterParametricBorder(Color.WHITE, mImageBorderSize, 593 mImageBorderSize); 594 595 ImageSmallFilter previousFilter = null; 596 for (int i = 0; i < p; i++) { 597 ImageSmallBorder filter = new ImageSmallBorder(this); 598 filter.setImageFilter(borders[i]); 599 filter.setController(this); 600 filter.setBorder(true); 601 filter.setImageLoader(mImageLoader); 602 filter.setShowTitle(false); 603 listBorders.addView(filter); 604 previousFilter = filter; 605 } 606 } 607 608 // ////////////////////////////////////////////////////////////////////////////// 609 // Some utility functions 610 // TODO: finish the cleanup. 611 612 public void showOriginalViews(boolean value) { 613 for (ImageShow views : mImageViews) { 614 views.showOriginal(value); 615 } 616 } 617 618 public void invalidateViews() { 619 for (ImageShow views : mImageViews) { 620 views.invalidate(); 621 views.updateImage(); 622 } 623 } 624 625 public void hideListViews() { 626 for (View view : mListViews) { 627 view.setVisibility(View.GONE); 628 } 629 } 630 631 public void hideImageViews() { 632 mImageShow.setShowControls(false); // reset 633 for (View view : mImageViews) { 634 view.setVisibility(View.GONE); 635 } 636 } 637 638 public void unselectBottomPanelButtons() { 639 for (ImageButton button : mBottomPanelButtons) { 640 button.setSelected(false); 641 } 642 } 643 644 public void unselectPanelButtons(Vector<ImageButton> buttons) { 645 for (ImageButton button : buttons) { 646 button.setSelected(false); 647 } 648 } 649 650 // ////////////////////////////////////////////////////////////////////////////// 651 // imageState panel... 652 653 public boolean isShowingHistoryPanel() { 654 return mShowingHistoryPanel; 655 } 656 657 private void toggleImageStatePanel() { 658 final View view = findViewById(R.id.mainPanel); 659 final View viewList = findViewById(R.id.imageStatePanel); 660 661 if (mShowingHistoryPanel) { 662 findViewById(R.id.historyPanel).setVisibility(View.INVISIBLE); 663 mShowingHistoryPanel = false; 664 } 665 666 if (!mShowingImageStatePanel) { 667 mShowingImageStatePanel = true; 668 view.animate().setDuration(200).x(-viewList.getWidth()) 669 .withLayer().withEndAction(new Runnable() { 670 @Override 671 public void run() { 672 viewList.setAlpha(0); 673 viewList.setVisibility(View.VISIBLE); 674 viewList.animate().setDuration(100) 675 .alpha(1.0f).start(); 676 } 677 }).start(); 678 } else { 679 mShowingImageStatePanel = false; 680 viewList.setVisibility(View.INVISIBLE); 681 view.animate().setDuration(200).x(0).withLayer() 682 .start(); 683 } 684 invalidateOptionsMenu(); 685 } 686 687 // ////////////////////////////////////////////////////////////////////////////// 688 // history panel... 689 690 public void toggleHistoryPanel() { 691 final View view = findViewById(R.id.mainPanel); 692 final View viewList = findViewById(R.id.historyPanel); 693 694 if (mShowingImageStatePanel) { 695 findViewById(R.id.imageStatePanel).setVisibility(View.INVISIBLE); 696 mShowingImageStatePanel = false; 697 } 698 699 if (!mShowingHistoryPanel) { 700 mShowingHistoryPanel = true; 701 view.animate().setDuration(200).x(-viewList.getWidth()) 702 .withLayer().withEndAction(new Runnable() { 703 @Override 704 public void run() { 705 viewList.setAlpha(0); 706 viewList.setVisibility(View.VISIBLE); 707 viewList.animate().setDuration(100) 708 .alpha(1.0f).start(); 709 } 710 }).start(); 711 } else { 712 mShowingHistoryPanel = false; 713 viewList.setVisibility(View.INVISIBLE); 714 view.animate().setDuration(200).x(0).withLayer() 715 .start(); 716 } 717 invalidateOptionsMenu(); 718 } 719 720 private void resetHistory() { 721 HistoryAdapter adapter = mImageShow.getHistory(); 722 adapter.reset(); 723 ImagePreset original = new ImagePreset(adapter.getItem(0)); 724 mImageShow.setImagePreset(original); 725 mPanelController.resetParameters(); 726 invalidateViews(); 727 } 728 729 // reset button in the history panel. 730 private OnClickListener createOnClickResetOperationsButton() { 731 return new View.OnClickListener() { 732 @Override 733 public void onClick(View v) { 734 resetHistory(); 735 } 736 }; 737 } 738 739 @Override 740 public void onBackPressed() { 741 if (mPanelController.onBackPressed()) { 742 saveImage(); 743 } 744 } 745 746 public void cannotLoadImage() { 747 CharSequence text = getString(R.string.cannot_load_image); 748 Toast toast = Toast.makeText(this, text, Toast.LENGTH_SHORT); 749 toast.show(); 750 finish(); 751 } 752 753 // ////////////////////////////////////////////////////////////////////////////// 754 755 public float getPixelsFromDip(float value) { 756 Resources r = getResources(); 757 return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, 758 r.getDisplayMetrics()); 759 } 760 761 public void useImagePreset(ImageSmallFilter imageSmallFilter, ImagePreset preset) { 762 if (preset == null) { 763 return; 764 } 765 766 if (mCurrentImageSmallFilter != null) { 767 mCurrentImageSmallFilter.setSelected(false); 768 } 769 mCurrentImageSmallFilter = imageSmallFilter; 770 mCurrentImageSmallFilter.setSelected(true); 771 772 ImagePreset copy = new ImagePreset(preset); 773 mImageShow.setImagePreset(copy); 774 if (preset.isFx()) { 775 // if it's an FX we rest the curve adjustment too 776 mImageCurves.resetCurve(); 777 } 778 invalidateViews(); 779 } 780 781 public void useImageFilter(ImageSmallFilter imageSmallFilter, ImageFilter imageFilter, 782 boolean setBorder) { 783 if (imageFilter == null) { 784 return; 785 } 786 787 if (mCurrentImageSmallFilter != null) { 788 mCurrentImageSmallFilter.setSelected(false); 789 } 790 mCurrentImageSmallFilter = imageSmallFilter; 791 mCurrentImageSmallFilter.setSelected(true); 792 793 ImagePreset oldPreset = mImageShow.getImagePreset(); 794 ImagePreset copy = new ImagePreset(oldPreset); 795 // TODO: use a numerical constant instead. 796 797 copy.add(imageFilter); 798 799 mImageShow.setImagePreset(copy); 800 invalidateViews(); 801 } 802 803 @Override 804 public void onItemClick(AdapterView<?> parent, View view, int position, 805 long id) { 806 mImageShow.onItemClick(position); 807 invalidateViews(); 808 } 809 810 public void pickImage() { 811 Intent intent = new Intent(); 812 intent.setType("image/*"); 813 intent.setAction(Intent.ACTION_GET_CONTENT); 814 startActivityForResult(Intent.createChooser(intent, getString(R.string.select_image)), 815 SELECT_PICTURE); 816 } 817 818 @Override 819 public void onActivityResult(int requestCode, int resultCode, Intent data) { 820 Log.v(LOGTAG, "onActivityResult"); 821 if (resultCode == RESULT_OK) { 822 if (requestCode == SELECT_PICTURE) { 823 Uri selectedImageUri = data.getData(); 824 mImageLoader.loadBitmap(selectedImageUri, getScreenImageSize()); 825 } 826 } 827 } 828 829 public void saveImage() { 830 if (mImageShow.hasModifications()) { 831 // Get the name of the album, to which the image will be saved 832 File saveDir = SaveCopyTask.getFinalSaveDirectory(this, mImageLoader.getUri()); 833 int bucketId = GalleryUtils.getBucketId(saveDir.getPath()); 834 String albumName = LocalAlbum.getLocalizedName(getResources(), bucketId, null); 835 showSavingProgress(albumName); 836 mImageShow.saveImage(this, null); 837 } else { 838 finish(); 839 } 840 } 841 842 static { 843 System.loadLibrary("jni_filtershow_filters"); 844 } 845 846} 847