1/* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.gallery3d.filtershow; 18 19import android.content.Context; 20import android.text.Html; 21import android.view.MenuItem; 22import android.view.View; 23import android.view.View.OnClickListener; 24import android.view.ViewPropertyAnimator; 25import android.widget.PopupMenu; 26import android.widget.TextView; 27 28import com.android.gallery3d.R; 29import com.android.gallery3d.filtershow.filters.ImageFilter; 30import com.android.gallery3d.filtershow.filters.ImageFilterBwFilter; 31import com.android.gallery3d.filtershow.filters.ImageFilterContrast; 32import com.android.gallery3d.filtershow.filters.ImageFilterCurves; 33import com.android.gallery3d.filtershow.filters.ImageFilterExposure; 34import com.android.gallery3d.filtershow.filters.ImageFilterHue; 35import com.android.gallery3d.filtershow.filters.ImageFilterRedEye; 36import com.android.gallery3d.filtershow.filters.ImageFilterSaturated; 37import com.android.gallery3d.filtershow.filters.ImageFilterShadows; 38import com.android.gallery3d.filtershow.filters.ImageFilterSharpen; 39import com.android.gallery3d.filtershow.filters.ImageFilterTinyPlanet; 40import com.android.gallery3d.filtershow.filters.ImageFilterVibrance; 41import com.android.gallery3d.filtershow.filters.ImageFilterVignette; 42import com.android.gallery3d.filtershow.filters.ImageFilterWBalance; 43import com.android.gallery3d.filtershow.imageshow.ImageCrop; 44import com.android.gallery3d.filtershow.imageshow.ImageShow; 45import com.android.gallery3d.filtershow.presets.ImagePreset; 46import com.android.gallery3d.filtershow.ui.FramedTextButton; 47import com.android.gallery3d.filtershow.ui.ImageCurves; 48 49import java.util.HashMap; 50import java.util.Vector; 51 52public class PanelController implements OnClickListener { 53 private static int PANEL = 0; 54 private static int COMPONENT = 1; 55 private static int VERTICAL_MOVE = 0; 56 private static int HORIZONTAL_MOVE = 1; 57 private static final int ANIM_DURATION = 200; 58 private static final String LOGTAG = "PanelController"; 59 private boolean mDisableFilterButtons = false; 60 61 class Panel { 62 private final View mView; 63 private final View mContainer; 64 private int mPosition = 0; 65 private final Vector<View> mSubviews = new Vector<View>(); 66 67 public Panel(View view, View container, int position) { 68 mView = view; 69 mContainer = container; 70 mPosition = position; 71 } 72 73 public void addView(View view) { 74 mSubviews.add(view); 75 } 76 77 public int getPosition() { 78 return mPosition; 79 } 80 81 public ViewPropertyAnimator unselect(int newPos, int move) { 82 ViewPropertyAnimator anim = mContainer.animate(); 83 mView.setSelected(false); 84 mContainer.setX(0); 85 mContainer.setY(0); 86 int delta = 0; 87 int w = mRowPanel.getWidth(); 88 int h = mRowPanel.getHeight(); 89 if (move == HORIZONTAL_MOVE) { 90 if (newPos > mPosition) { 91 delta = -w; 92 } else { 93 delta = w; 94 } 95 anim.x(delta); 96 } else if (move == VERTICAL_MOVE) { 97 anim.y(h); 98 } 99 anim.setDuration(ANIM_DURATION).withLayer().withEndAction(new Runnable() { 100 @Override 101 public void run() { 102 mContainer.setVisibility(View.GONE); 103 } 104 }); 105 return anim; 106 } 107 108 public ViewPropertyAnimator select(int oldPos, int move) { 109 mView.setSelected(true); 110 mContainer.setVisibility(View.VISIBLE); 111 mContainer.setX(0); 112 mContainer.setY(0); 113 ViewPropertyAnimator anim = mContainer.animate(); 114 int w = mRowPanel.getWidth(); 115 int h = mRowPanel.getHeight(); 116 if (move == HORIZONTAL_MOVE) { 117 if (oldPos < mPosition) { 118 mContainer.setX(w); 119 } else { 120 mContainer.setX(-w); 121 } 122 anim.x(0); 123 } else if (move == VERTICAL_MOVE) { 124 mContainer.setY(h); 125 anim.y(0); 126 } 127 anim.setDuration(ANIM_DURATION).withLayer(); 128 return anim; 129 } 130 } 131 132 class UtilityPanel { 133 private final Context mContext; 134 private final View mView; 135 private final TextView mTextView; 136 private boolean mSelected = false; 137 private String mEffectName = null; 138 private int mParameterValue = 0; 139 private boolean mShowParameterValue = false; 140 private View mAspectButton = null; 141 private View mCurvesButton = null; 142 boolean firstTimeCropDisplayed = true; 143 144 public UtilityPanel(Context context, View view, View textView, 145 View aspectButton, View curvesButton) { 146 mContext = context; 147 mView = view; 148 mTextView = (TextView) textView; 149 mAspectButton = aspectButton; 150 mCurvesButton = curvesButton; 151 } 152 153 public boolean selected() { 154 return mSelected; 155 } 156 157 public void setAspectButton(FramedTextButton button, int itemId) { 158 ImageCrop imageCrop = (ImageCrop) mCurrentImage; 159 switch (itemId) { 160 case R.id.crop_menu_1to1: { 161 String t = mContext.getString(R.string.aspect1to1_effect); 162 button.setText(t); 163 imageCrop.apply(1, 1); 164 imageCrop.setAspectString(t); 165 break; 166 } 167 case R.id.crop_menu_4to3: { 168 String t = mContext.getString(R.string.aspect4to3_effect); 169 button.setText(t); 170 imageCrop.apply(4, 3); 171 imageCrop.setAspectString(t); 172 break; 173 } 174 case R.id.crop_menu_3to4: { 175 String t = mContext.getString(R.string.aspect3to4_effect); 176 button.setText(t); 177 imageCrop.apply(3, 4); 178 imageCrop.setAspectString(t); 179 break; 180 } 181 case R.id.crop_menu_5to7: { 182 String t = mContext.getString(R.string.aspect5to7_effect); 183 button.setText(t); 184 imageCrop.apply(5, 7); 185 imageCrop.setAspectString(t); 186 break; 187 } 188 case R.id.crop_menu_7to5: { 189 String t = mContext.getString(R.string.aspect7to5_effect); 190 button.setText(t); 191 imageCrop.apply(7, 5); 192 imageCrop.setAspectString(t); 193 break; 194 } 195 case R.id.crop_menu_none: { 196 String t = mContext.getString(R.string.aspectNone_effect); 197 button.setText(t); 198 imageCrop.applyClear(); 199 imageCrop.setAspectString(t); 200 break; 201 } 202 case R.id.crop_menu_original: { 203 String t = mContext.getString(R.string.aspectOriginal_effect); 204 button.setText(t); 205 imageCrop.applyOriginal(); 206 imageCrop.setAspectString(t); 207 break; 208 } 209 } 210 imageCrop.invalidate(); 211 } 212 213 public void showAspectButtons() { 214 if (mAspectButton != null) 215 mAspectButton.setVisibility(View.VISIBLE); 216 } 217 218 public void hideAspectButtons() { 219 if (mAspectButton != null) 220 mAspectButton.setVisibility(View.GONE); 221 } 222 223 public void showCurvesButtons() { 224 if (mCurvesButton != null) 225 mCurvesButton.setVisibility(View.VISIBLE); 226 } 227 228 public void hideCurvesButtons() { 229 if (mCurvesButton != null) 230 mCurvesButton.setVisibility(View.GONE); 231 } 232 233 public void onNewValue(int value) { 234 mParameterValue = value; 235 updateText(); 236 } 237 238 public void setEffectName(String effectName) { 239 mEffectName = effectName; 240 setShowParameter(true); 241 } 242 243 public void setShowParameter(boolean s) { 244 mShowParameterValue = s; 245 updateText(); 246 } 247 248 public void updateText() { 249 String apply = mContext.getString(R.string.apply_effect); 250 if (mShowParameterValue) { 251 mTextView.setText(Html.fromHtml(apply + " " + mEffectName + " " 252 + mParameterValue)); 253 } else { 254 mTextView.setText(Html.fromHtml(apply + " " + mEffectName)); 255 } 256 } 257 258 public ViewPropertyAnimator unselect() { 259 ViewPropertyAnimator anim = mView.animate(); 260 mView.setX(0); 261 mView.setY(0); 262 int h = mRowPanel.getHeight(); 263 anim.y(-h); 264 anim.setDuration(ANIM_DURATION).withLayer().withEndAction(new Runnable() { 265 @Override 266 public void run() { 267 mView.setVisibility(View.GONE); 268 } 269 }); 270 mSelected = false; 271 return anim; 272 } 273 274 public ViewPropertyAnimator select() { 275 mView.setVisibility(View.VISIBLE); 276 int h = mRowPanel.getHeight(); 277 mView.setX(0); 278 mView.setY(-h); 279 updateText(); 280 ViewPropertyAnimator anim = mView.animate(); 281 anim.y(0); 282 anim.setDuration(ANIM_DURATION).withLayer(); 283 mSelected = true; 284 return anim; 285 } 286 } 287 288 class ViewType { 289 private final int mType; 290 private final View mView; 291 292 public ViewType(View view, int type) { 293 mView = view; 294 mType = type; 295 } 296 297 public int type() { 298 return mType; 299 } 300 } 301 302 private final HashMap<View, Panel> mPanels = new HashMap<View, Panel>(); 303 private final HashMap<View, ViewType> mViews = new HashMap<View, ViewType>(); 304 private final Vector<View> mImageViews = new Vector<View>(); 305 private View mCurrentPanel = null; 306 private View mRowPanel = null; 307 private UtilityPanel mUtilityPanel = null; 308 private ImageShow mMasterImage = null; 309 private ImageShow mCurrentImage = null; 310 private FilterShowActivity mActivity = null; 311 312 public void setActivity(FilterShowActivity activity) { 313 mActivity = activity; 314 } 315 316 public void addView(View view) { 317 view.setOnClickListener(this); 318 mViews.put(view, new ViewType(view, COMPONENT)); 319 } 320 321 public void addPanel(View view, View container, int position) { 322 mPanels.put(view, new Panel(view, container, position)); 323 view.setOnClickListener(this); 324 mViews.put(view, new ViewType(view, PANEL)); 325 } 326 327 public void addComponent(View aPanel, View component) { 328 Panel panel = mPanels.get(aPanel); 329 if (panel == null) { 330 return; 331 } 332 panel.addView(component); 333 component.setOnClickListener(this); 334 mViews.put(component, new ViewType(component, COMPONENT)); 335 } 336 337 public void addImageView(View view) { 338 mImageViews.add(view); 339 ImageShow imageShow = (ImageShow) view; 340 imageShow.setPanelController(this); 341 } 342 343 public void resetParameters() { 344 showPanel(mCurrentPanel); 345 if (mCurrentImage != null) { 346 mCurrentImage.resetParameter(); 347 mCurrentImage.select(); 348 } 349 if (mDisableFilterButtons) { 350 mActivity.enableFilterButtons(); 351 mDisableFilterButtons = false; 352 } 353 } 354 355 public boolean onBackPressed() { 356 if (mUtilityPanel == null || !mUtilityPanel.selected()) { 357 return true; 358 } 359 HistoryAdapter adapter = mMasterImage.getHistory(); 360 int position = adapter.undo(); 361 mMasterImage.onItemClick(position); 362 showPanel(mCurrentPanel); 363 mCurrentImage.select(); 364 if (mDisableFilterButtons) { 365 mActivity.enableFilterButtons(); 366 mActivity.resetHistory(); 367 mDisableFilterButtons = false; 368 } 369 return false; 370 } 371 372 public void onNewValue(int value) { 373 mUtilityPanel.onNewValue(value); 374 } 375 376 public void showParameter(boolean s) { 377 mUtilityPanel.setShowParameter(s); 378 } 379 380 public void setCurrentPanel(View panel) { 381 showPanel(panel); 382 } 383 384 public void setRowPanel(View rowPanel) { 385 mRowPanel = rowPanel; 386 } 387 388 public void setUtilityPanel(Context context, View utilityPanel, View textView, 389 View aspectButton, View curvesButton) { 390 mUtilityPanel = new UtilityPanel(context, utilityPanel, textView, 391 aspectButton, curvesButton); 392 } 393 394 public void setMasterImage(ImageShow imageShow) { 395 mMasterImage = imageShow; 396 } 397 398 @Override 399 public void onClick(View view) { 400 ViewType type = mViews.get(view); 401 if (type.type() == PANEL) { 402 showPanel(view); 403 } else if (type.type() == COMPONENT) { 404 showComponent(view); 405 } 406 } 407 408 public ImageShow showImageView(int id) { 409 ImageShow image = null; 410 for (View view : mImageViews) { 411 if (view.getId() == id) { 412 view.setVisibility(View.VISIBLE); 413 image = (ImageShow) view; 414 } else { 415 view.setVisibility(View.GONE); 416 } 417 } 418 return image; 419 } 420 421 public void showDefaultImageView() { 422 showImageView(R.id.imageShow).setShowControls(false); 423 mMasterImage.setCurrentFilter(null); 424 } 425 426 public void showPanel(View view) { 427 view.setVisibility(View.VISIBLE); 428 boolean removedUtilityPanel = false; 429 Panel current = mPanels.get(mCurrentPanel); 430 if (mUtilityPanel != null && mUtilityPanel.selected()) { 431 ViewPropertyAnimator anim1 = mUtilityPanel.unselect(); 432 removedUtilityPanel = true; 433 anim1.start(); 434 if (mCurrentPanel == view) { 435 ViewPropertyAnimator anim2 = current.select(-1, VERTICAL_MOVE); 436 anim2.start(); 437 showDefaultImageView(); 438 } 439 } 440 441 if (mCurrentPanel == view) { 442 return; 443 } 444 445 Panel panel = mPanels.get(view); 446 if (!removedUtilityPanel) { 447 int currentPos = -1; 448 if (current != null) { 449 currentPos = current.getPosition(); 450 } 451 ViewPropertyAnimator anim1 = panel.select(currentPos, HORIZONTAL_MOVE); 452 anim1.start(); 453 if (current != null) { 454 ViewPropertyAnimator anim2 = current.unselect(panel.getPosition(), HORIZONTAL_MOVE); 455 anim2.start(); 456 } 457 } else { 458 ViewPropertyAnimator anim = panel.select(-1, VERTICAL_MOVE); 459 anim.start(); 460 } 461 showDefaultImageView(); 462 mCurrentPanel = view; 463 } 464 465 public ImagePreset getImagePreset() { 466 return mMasterImage.getImagePreset(); 467 } 468 469 public ImageFilter setImagePreset(ImageFilter filter, String name) { 470 ImagePreset copy = new ImagePreset(getImagePreset()); 471 copy.add(filter); 472 copy.setHistoryName(name); 473 copy.setIsFx(false); 474 mMasterImage.setImagePreset(copy); 475 return filter; 476 } 477 478 public void ensureFilter(String name) { 479 ImagePreset preset = getImagePreset(); 480 ImageFilter filter = preset.getFilter(name); 481 if (filter != null) { 482 // If we already have a filter, we might still want 483 // to push it onto the history stack. 484 ImagePreset copy = new ImagePreset(getImagePreset()); 485 copy.setHistoryName(name); 486 mMasterImage.setImagePreset(copy); 487 filter = copy.getFilter(name); 488 } 489 490 if (filter == null && name.equalsIgnoreCase( 491 mCurrentImage.getContext().getString(R.string.curvesRGB))) { 492 filter = setImagePreset(new ImageFilterCurves(), name); 493 } 494 if (filter == null && name.equalsIgnoreCase( 495 mCurrentImage.getContext().getString(R.string.tinyplanet))) { 496 filter = setImagePreset(new ImageFilterTinyPlanet(), name); 497 } 498 if (filter == null 499 && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.vignette))) { 500 filter = setImagePreset(new ImageFilterVignette(), name); 501 } 502 if (filter == null 503 && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.sharpness))) { 504 filter = setImagePreset(new ImageFilterSharpen(), name); 505 } 506 if (filter == null 507 && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.contrast))) { 508 filter = setImagePreset(new ImageFilterContrast(), name); 509 } 510 if (filter == null 511 && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.saturation))) { 512 filter = setImagePreset(new ImageFilterSaturated(), name); 513 } 514 if (filter == null 515 && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.bwfilter))) { 516 filter = setImagePreset(new ImageFilterBwFilter(), name); 517 } 518 if (filter == null 519 && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.hue))) { 520 filter = setImagePreset(new ImageFilterHue(), name); 521 } 522 if (filter == null 523 && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.exposure))) { 524 filter = setImagePreset(new ImageFilterExposure(), name); 525 } 526 if (filter == null 527 && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.vibrance))) { 528 filter = setImagePreset(new ImageFilterVibrance(), name); 529 } 530 if (filter == null 531 && name.equalsIgnoreCase(mCurrentImage.getContext().getString( 532 R.string.shadow_recovery))) { 533 filter = setImagePreset(new ImageFilterShadows(), name); 534 } 535 if (filter == null 536 && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.redeye))) { 537 filter = setImagePreset(new ImageFilterRedEye(), name); 538 } 539 if (filter == null 540 && name.equalsIgnoreCase(mCurrentImage.getContext().getString(R.string.wbalance))) { 541 filter = setImagePreset(new ImageFilterWBalance(), name); 542 } 543 mMasterImage.setCurrentFilter(filter); 544 } 545 546 private void showCurvesPopupMenu(final ImageCurves curves, final FramedTextButton anchor) { 547 PopupMenu popupMenu = new PopupMenu(mCurrentImage.getContext(), anchor); 548 popupMenu.getMenuInflater().inflate(R.menu.filtershow_menu_curves, popupMenu.getMenu()); 549 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 550 @Override 551 public boolean onMenuItemClick(MenuItem item) { 552 curves.setChannel(item.getItemId()); 553 anchor.setTextFrom(item.getItemId()); 554 return true; 555 } 556 }); 557 popupMenu.show(); 558 } 559 560 private void showCropPopupMenu(final FramedTextButton anchor) { 561 PopupMenu popupMenu = new PopupMenu(mCurrentImage.getContext(), anchor); 562 popupMenu.getMenuInflater().inflate(R.menu.filtershow_menu_crop, popupMenu.getMenu()); 563 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 564 @Override 565 public boolean onMenuItemClick(MenuItem item) { 566 mUtilityPanel.setAspectButton(anchor, item.getItemId()); 567 return true; 568 } 569 }); 570 popupMenu.show(); 571 } 572 573 public void showComponent(View view) { 574 if (mUtilityPanel != null && !mUtilityPanel.selected()) { 575 Panel current = mPanels.get(mCurrentPanel); 576 ViewPropertyAnimator anim1 = current.unselect(-1, VERTICAL_MOVE); 577 anim1.start(); 578 if (mUtilityPanel != null) { 579 ViewPropertyAnimator anim2 = mUtilityPanel.select(); 580 anim2.start(); 581 } 582 } 583 584 if (view.getId() == R.id.pickCurvesChannel) { 585 ImageCurves curves = (ImageCurves) showImageView(R.id.imageCurves); 586 showCurvesPopupMenu(curves, (FramedTextButton) view); 587 return; 588 } 589 590 if (view.getId() == R.id.aspect) { 591 showCropPopupMenu((FramedTextButton) view); 592 return; 593 } 594 595 if (mCurrentImage != null) { 596 mCurrentImage.unselect(); 597 } 598 mUtilityPanel.hideAspectButtons(); 599 mUtilityPanel.hideCurvesButtons(); 600 switch (view.getId()) { 601 case R.id.tinyplanetButton: { 602 mCurrentImage = showImageView(R.id.imageTinyPlanet).setShowControls(true); 603 String ename = mCurrentImage.getContext().getString(R.string.tinyplanet); 604 mUtilityPanel.setEffectName(ename); 605 ensureFilter(ename); 606 if (!mDisableFilterButtons) { 607 mActivity.disableFilterButtons(); 608 mDisableFilterButtons = true; 609 } 610 break; 611 } 612 case R.id.straightenButton: { 613 mCurrentImage = showImageView(R.id.imageStraighten); 614 String ename = mCurrentImage.getContext().getString(R.string.straighten); 615 mUtilityPanel.setEffectName(ename); 616 break; 617 } 618 case R.id.cropButton: { 619 mCurrentImage = showImageView(R.id.imageCrop); 620 String ename = mCurrentImage.getContext().getString(R.string.crop); 621 mUtilityPanel.setEffectName(ename); 622 mUtilityPanel.setShowParameter(false); 623 if (mCurrentImage instanceof ImageCrop && mUtilityPanel.firstTimeCropDisplayed){ 624 ((ImageCrop) mCurrentImage).applyClear(); 625 mUtilityPanel.firstTimeCropDisplayed = false; 626 } 627 mUtilityPanel.showAspectButtons(); 628 break; 629 } 630 case R.id.rotateButton: { 631 mCurrentImage = showImageView(R.id.imageRotate); 632 String ename = mCurrentImage.getContext().getString(R.string.rotate); 633 mUtilityPanel.setEffectName(ename); 634 break; 635 } 636 case R.id.flipButton: { 637 mCurrentImage = showImageView(R.id.imageFlip); 638 String ename = mCurrentImage.getContext().getString(R.string.mirror); 639 mUtilityPanel.setEffectName(ename); 640 mUtilityPanel.setShowParameter(false); 641 break; 642 } 643 case R.id.vignetteButton: { 644 mCurrentImage = showImageView(R.id.imageShow).setShowControls(true); 645 String ename = mCurrentImage.getContext().getString(R.string.vignette); 646 mUtilityPanel.setEffectName(ename); 647 ensureFilter(ename); 648 break; 649 } 650 case R.id.curvesButtonRGB: { 651 ImageCurves curves = (ImageCurves) showImageView(R.id.imageCurves); 652 String ename = curves.getContext().getString(R.string.curvesRGB); 653 mUtilityPanel.setEffectName(ename); 654 mUtilityPanel.setShowParameter(false); 655 mUtilityPanel.showCurvesButtons(); 656 mCurrentImage = curves; 657 ensureFilter(ename); 658 break; 659 } 660 case R.id.sharpenButton: { 661 mCurrentImage = showImageView(R.id.imageZoom).setShowControls(true); 662 String ename = mCurrentImage.getContext().getString(R.string.sharpness); 663 mUtilityPanel.setEffectName(ename); 664 ensureFilter(ename); 665 break; 666 } 667 case R.id.contrastButton: { 668 mCurrentImage = showImageView(R.id.imageShow).setShowControls(true); 669 String ename = mCurrentImage.getContext().getString(R.string.contrast); 670 mUtilityPanel.setEffectName(ename); 671 ensureFilter(ename); 672 break; 673 } 674 case R.id.saturationButton: { 675 mCurrentImage = showImageView(R.id.imageShow).setShowControls(true); 676 String ename = mCurrentImage.getContext().getString(R.string.saturation); 677 mUtilityPanel.setEffectName(ename); 678 ensureFilter(ename); 679 break; 680 } 681 case R.id.bwfilterButton: { 682 mCurrentImage = showImageView(R.id.imageShow).setShowControls(true); 683 String ename = mCurrentImage.getContext().getString(R.string.bwfilter); 684 mUtilityPanel.setEffectName(ename); 685 ensureFilter(ename); 686 break; 687 } 688 case R.id.wbalanceButton: { 689 mCurrentImage = showImageView(R.id.imageShow).setShowControls(false); 690 String ename = mCurrentImage.getContext().getString(R.string.wbalance); 691 mUtilityPanel.setEffectName(ename); 692 mUtilityPanel.setShowParameter(false); 693 ensureFilter(ename); 694 break; 695 } 696 case R.id.hueButton: { 697 mCurrentImage = showImageView(R.id.imageShow).setShowControls(true); 698 String ename = mCurrentImage.getContext().getString(R.string.hue); 699 mUtilityPanel.setEffectName(ename); 700 ensureFilter(ename); 701 break; 702 } 703 case R.id.exposureButton: { 704 mCurrentImage = showImageView(R.id.imageShow).setShowControls(true); 705 String ename = mCurrentImage.getContext().getString(R.string.exposure); 706 mUtilityPanel.setEffectName(ename); 707 ensureFilter(ename); 708 break; 709 } 710 case R.id.vibranceButton: { 711 mCurrentImage = showImageView(R.id.imageShow).setShowControls(true); 712 String ename = mCurrentImage.getContext().getString(R.string.vibrance); 713 mUtilityPanel.setEffectName(ename); 714 ensureFilter(ename); 715 break; 716 } 717 case R.id.shadowRecoveryButton: { 718 mCurrentImage = showImageView(R.id.imageShow).setShowControls(true); 719 String ename = mCurrentImage.getContext().getString(R.string.shadow_recovery); 720 mUtilityPanel.setEffectName(ename); 721 ensureFilter(ename); 722 break; 723 } 724 case R.id.redEyeButton: { 725 mCurrentImage = showImageView(R.id.imageShow).setShowControls(true); 726 String ename = mCurrentImage.getContext().getString(R.string.redeye); 727 mUtilityPanel.setEffectName(ename); 728 ensureFilter(ename); 729 break; 730 } 731 case R.id.aspect: { 732 mUtilityPanel.showAspectButtons(); 733 break; 734 } 735 case R.id.applyEffect: { 736 if (mMasterImage.getCurrentFilter() instanceof ImageFilterTinyPlanet) { 737 mActivity.saveImage(); 738 } else { 739 if (mCurrentImage instanceof ImageCrop) { 740 ((ImageCrop) mCurrentImage).saveAndSetPreset(); 741 } 742 showPanel(mCurrentPanel); 743 } 744 break; 745 } 746 } 747 mCurrentImage.select(); 748 } 749} 750