FilterShowActivity.java revision ec29b73d77a8ff2f000eb04d662d85d63d8f8d09
10d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 20d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardpackage com.android.gallery3d.filtershow; 30d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 40d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.annotation.TargetApi; 59594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroardimport android.app.ActionBar; 60d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.app.Activity; 7ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescuimport android.app.ProgressDialog; 80ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.content.ContentValues; 90d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.content.Intent; 100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.content.res.Resources; 110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.drawable.Drawable; 1292e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.net.Uri; 1392e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.os.Bundle; 140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.util.Log; 150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.util.TypedValue; 160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.Menu; 179594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroardimport android.view.MenuItem; 180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.MotionEvent; 190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View; 200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View.OnClickListener; 210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View.OnTouchListener; 220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.AdapterView; 230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.AdapterView.OnItemClickListener; 240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.ImageButton; 250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.LinearLayout; 260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.widget.ListView; 2792e2341248e99c691f38820503984bc5e2f18811nicolasroardimport android.widget.SeekBar; 280ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.widget.ShareActionProvider; 290ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardimport android.widget.ShareActionProvider.OnShareTargetSelectedListener; 300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 3192e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.R; 3292e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.cache.ImageLoader; 3392e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilter; 3492e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilterBorder; 3592e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilterRS; 3692e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageBorder; 3792e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageShow; 3892e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageSmallFilter; 3992e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageStraighten; 4092e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.imageshow.ImageZoom; 4192e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.presets.ImagePreset; 4292e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.presets.ImagePresetBW; 4392e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.presets.ImagePresetBWBlue; 4492e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.presets.ImagePresetBWGreen; 4592e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.presets.ImagePresetBWRed; 4692e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.presets.ImagePresetOld; 4792e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.presets.ImagePresetSaturated; 4892e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.presets.ImagePresetXProcessing; 4992e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.provider.SharedImageProvider; 5092e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.tools.SaveCopyTask; 5192e2341248e99c691f38820503984bc5e2f18811nicolasroardimport com.android.gallery3d.filtershow.ui.ImageCurves; 5292e2341248e99c691f38820503984bc5e2f18811nicolasroard 5392e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.io.File; 54ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescuimport java.lang.ref.WeakReference; 5592e2341248e99c691f38820503984bc5e2f18811nicolasroardimport java.util.Vector; 5692e2341248e99c691f38820503984bc5e2f18811nicolasroard 570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard@TargetApi(16) 580ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroardpublic class FilterShowActivity extends Activity implements OnItemClickListener, 590ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard OnShareTargetSelectedListener { 600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 6192e2341248e99c691f38820503984bc5e2f18811nicolasroard private final PanelController mPanelController = new PanelController(); 620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private ImageLoader mImageLoader = null; 630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private ImageShow mImageShow = null; 640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private ImageCurves mImageCurves = null; 650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private ImageBorder mImageBorders = null; 660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private ImageStraighten mImageStraighten = null; 675448bf8095483574649afcc2add7f153670c7450nicolasroard private ImageZoom mImageZoom = null; 680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private View mListFx = null; 700d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private View mListBorders = null; 710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private View mListGeometry = null; 720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private View mListColors = null; 7392e2341248e99c691f38820503984bc5e2f18811nicolasroard private View mListFilterButtons = null; 740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 750d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private ImageButton mFxButton = null; 760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private ImageButton mBorderButton = null; 770d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private ImageButton mGeometryButton = null; 780d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private ImageButton mColorsButton = null; 790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private static final int SELECT_PICTURE = 1; 810d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private static final String LOGTAG = "FilterShowActivity"; 8292e2341248e99c691f38820503984bc5e2f18811nicolasroard protected static final boolean ANIMATE_PANELS = true; 830d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 840d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private boolean mShowingHistoryPanel = false; 85bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard private boolean mShowingImageStatePanel = false; 86bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard 8792e2341248e99c691f38820503984bc5e2f18811nicolasroard private final Vector<ImageShow> mImageViews = new Vector<ImageShow>(); 8892e2341248e99c691f38820503984bc5e2f18811nicolasroard private final Vector<View> mListViews = new Vector<View>(); 8992e2341248e99c691f38820503984bc5e2f18811nicolasroard private final Vector<ImageButton> mBottomPanelButtons = new Vector<ImageButton>(); 900d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 910ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard private ShareActionProvider mShareActionProvider; 920ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard private File mSharedOutputFile = null; 930ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 940ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard private boolean mSharingImage = false; 950ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 96ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu private WeakReference<ProgressDialog> mSavingProgressDialog; 97ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu 980d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard @Override 990d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void onCreate(Bundle savedInstanceState) { 1000d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard super.onCreate(savedInstanceState); 1010d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 1025448bf8095483574649afcc2add7f153670c7450nicolasroard ImageFilterRS.setRenderScriptContext(this); 1035448bf8095483574649afcc2add7f153670c7450nicolasroard 1040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard setContentView(R.layout.filtershow_activity); 1059594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard ActionBar actionBar = getActionBar(); 106786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 107786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard actionBar.setCustomView(R.layout.filtershow_actionbar); 108786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard 109786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard actionBar.getCustomView().setOnClickListener(new OnClickListener() { 110786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard @Override 111786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard public void onClick(View view) { 112786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard saveImage(); 113786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard } 114786fe6476e4ccf4b98489ff69d8ef439533cdc2anicolasroard }); 1150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 1160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageLoader = new ImageLoader(getApplicationContext()); 1170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 1180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard LinearLayout listFilters = (LinearLayout) findViewById(R.id.listFilters); 1190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard LinearLayout listBorders = (LinearLayout) findViewById(R.id.listBorders); 1200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 1210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageShow = (ImageShow) findViewById(R.id.imageShow); 1220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageCurves = (ImageCurves) findViewById(R.id.imageCurves); 1230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageBorders = (ImageBorder) findViewById(R.id.imageBorder); 1240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageStraighten = (ImageStraighten) findViewById(R.id.imageStraighten); 1255448bf8095483574649afcc2add7f153670c7450nicolasroard mImageZoom = (ImageZoom) findViewById(R.id.imageZoom); 1260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 1270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageViews.add(mImageShow); 1280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageViews.add(mImageCurves); 1290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageViews.add(mImageBorders); 1300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageViews.add(mImageStraighten); 1315448bf8095483574649afcc2add7f153670c7450nicolasroard mImageViews.add(mImageZoom); 1320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 1330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mListFx = findViewById(R.id.fxList); 1340d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mListBorders = findViewById(R.id.bordersList); 13592e2341248e99c691f38820503984bc5e2f18811nicolasroard mListGeometry = findViewById(R.id.geometryList); 13692e2341248e99c691f38820503984bc5e2f18811nicolasroard mListFilterButtons = findViewById(R.id.filterButtonsList); 1370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mListColors = findViewById(R.id.colorsFxList); 1380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mListViews.add(mListFx); 1390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mListViews.add(mListBorders); 1400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mListViews.add(mListGeometry); 14192e2341248e99c691f38820503984bc5e2f18811nicolasroard mListViews.add(mListFilterButtons); 1420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mListViews.add(mListColors); 1430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 1440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mFxButton = (ImageButton) findViewById(R.id.fxButton); 1450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mBorderButton = (ImageButton) findViewById(R.id.borderButton); 1460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mGeometryButton = (ImageButton) findViewById(R.id.geometryButton); 1470d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mColorsButton = (ImageButton) findViewById(R.id.colorsButton); 14892e2341248e99c691f38820503984bc5e2f18811nicolasroard 14992e2341248e99c691f38820503984bc5e2f18811nicolasroard mImageShow.setImageLoader(mImageLoader); 15092e2341248e99c691f38820503984bc5e2f18811nicolasroard mImageCurves.setImageLoader(mImageLoader); 15192e2341248e99c691f38820503984bc5e2f18811nicolasroard mImageCurves.setMaster(mImageShow); 15292e2341248e99c691f38820503984bc5e2f18811nicolasroard mImageBorders.setImageLoader(mImageLoader); 15392e2341248e99c691f38820503984bc5e2f18811nicolasroard mImageBorders.setMaster(mImageShow); 15492e2341248e99c691f38820503984bc5e2f18811nicolasroard mImageStraighten.setImageLoader(mImageLoader); 15592e2341248e99c691f38820503984bc5e2f18811nicolasroard mImageStraighten.setMaster(mImageShow); 15692e2341248e99c691f38820503984bc5e2f18811nicolasroard mImageZoom.setImageLoader(mImageLoader); 15792e2341248e99c691f38820503984bc5e2f18811nicolasroard mImageZoom.setMaster(mImageShow); 15892e2341248e99c691f38820503984bc5e2f18811nicolasroard 15992e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addImageView(findViewById(R.id.imageShow)); 16092e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addImageView(findViewById(R.id.imageCurves)); 16192e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addImageView(findViewById(R.id.imageBorder)); 16292e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addImageView(findViewById(R.id.imageStraighten)); 16392e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addImageView(findViewById(R.id.imageZoom)); 16492e2341248e99c691f38820503984bc5e2f18811nicolasroard 16592e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addPanel(mFxButton, mListFx, 0); 16692e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addPanel(mBorderButton, mListBorders, 1); 16792e2341248e99c691f38820503984bc5e2f18811nicolasroard 16892e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addPanel(mGeometryButton, mListGeometry, 2); 16992e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addComponent(mGeometryButton, findViewById(R.id.straightenButton)); 17092e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addComponent(mGeometryButton, findViewById(R.id.cropButton)); 17192e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addComponent(mGeometryButton, findViewById(R.id.rotateButton)); 17292e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addComponent(mGeometryButton, findViewById(R.id.flipButton)); 17392e2341248e99c691f38820503984bc5e2f18811nicolasroard 17492e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addPanel(mColorsButton, mListColors, 3); 17592e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addComponent(mColorsButton, findViewById(R.id.vignetteButton)); 17692e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addComponent(mColorsButton, findViewById(R.id.curvesButtonRGB)); 17792e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addComponent(mColorsButton, findViewById(R.id.sharpenButton)); 17892e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addComponent(mColorsButton, findViewById(R.id.vibranceButton)); 17992e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addComponent(mColorsButton, findViewById(R.id.contrastButton)); 18092e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addComponent(mColorsButton, findViewById(R.id.saturationButton)); 18192e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addComponent(mColorsButton, findViewById(R.id.tintButton)); 18292e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addComponent(mColorsButton, findViewById(R.id.exposureButton)); 18392e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addComponent(mColorsButton, findViewById(R.id.shadowRecoveryButton)); 18492e2341248e99c691f38820503984bc5e2f18811nicolasroard 18592e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addView(findViewById(R.id.resetEffect)); 18692e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.addView(findViewById(R.id.applyEffect)); 18792e2341248e99c691f38820503984bc5e2f18811nicolasroard 18892e2341248e99c691f38820503984bc5e2f18811nicolasroard findViewById(R.id.compareWithOriginalImage).setOnTouchListener(createOnTouchShowOriginalButton()); 1890d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 1900d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard findViewById(R.id.resetOperationsButton).setOnClickListener( 1910d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard createOnClickResetOperationsButton()); 1920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 1930d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard ListView operationsList = (ListView) findViewById(R.id.operationsList); 194bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard operationsList.setAdapter(mImageShow.getHistoryAdapter()); 1950d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard operationsList.setOnItemClickListener(this); 196bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard ListView imageStateList = (ListView) findViewById(R.id.imageStateList); 197bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard imageStateList.setAdapter(mImageShow.getImageStateAdapter()); 198bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard mImageLoader.setAdapter((HistoryAdapter) mImageShow.getHistoryAdapter()); 1990d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 2000d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard fillListImages(listFilters); 2010d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard fillListBorders(listBorders); 2020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 20392e2341248e99c691f38820503984bc5e2f18811nicolasroard SeekBar seekBar = (SeekBar) findViewById(R.id.filterSeekBar); 20492e2341248e99c691f38820503984bc5e2f18811nicolasroard seekBar.setMax(200); 20592e2341248e99c691f38820503984bc5e2f18811nicolasroard mImageShow.setSeekBar(seekBar); 20692e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.setRowPanel(findViewById(R.id.secondRowPanel)); 20792e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.setUtilityPanel(findViewById(R.id.filterButtonsList), 20892e2341248e99c691f38820503984bc5e2f18811nicolasroard findViewById(R.id.compareWithOriginalImage), 20992e2341248e99c691f38820503984bc5e2f18811nicolasroard findViewById(R.id.applyEffect)); 21092e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.setMasterImage(mImageShow); 21192e2341248e99c691f38820503984bc5e2f18811nicolasroard mPanelController.setCurrentPanel(mFxButton); 2120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 2130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Intent intent = getIntent(); 2140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard String data = intent.getDataString(); 2150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (data != null) { 2160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Uri uri = Uri.parse(data); 2170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageLoader.loadBitmap(uri); 2180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } else { 2190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard pickImage(); 2200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 2210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 2220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 223ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu private void showSavingProgress() { 224ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu ProgressDialog progress; 225ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu if (mSavingProgressDialog != null) { 226ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu progress = mSavingProgressDialog.get(); 227ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu if (progress != null) { 228ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu progress.show(); 229ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu return; 230ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu } 231ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu } 232ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu // TODO: Allow cancellation of the saving process 233ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu progress = ProgressDialog.show(this, "", getString(R.string.saving_image), true, false); 234ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu mSavingProgressDialog = new WeakReference<ProgressDialog>(progress); 235ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu } 236ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu 237ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu private void hideSavingProgress() { 238ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu if (mSavingProgressDialog != null) { 239ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu ProgressDialog progress = mSavingProgressDialog.get(); 240ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu if (progress != null) progress.dismiss(); 241ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu } 242ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu } 243ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu 2440ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public void completeSaveImage(Uri saveUri) { 2450ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard if (mSharingImage && mSharedOutputFile != null) { 2460ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard // Image saved, we unblock the content provider 2470ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI, 2480ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri.encode(mSharedOutputFile.getAbsolutePath())); 2490ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard ContentValues values = new ContentValues(); 2500ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard values.put(SharedImageProvider.PREPARE, false); 2510ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard getContentResolver().insert(uri, values); 2520ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 2530ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard setResult(RESULT_OK, new Intent().setData(saveUri)); 254ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu hideSavingProgress(); 2550ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard finish(); 2560ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 2570ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 2580ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard @Override 2590ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard public boolean onShareTargetSelected(ShareActionProvider arg0, Intent arg1) { 26092e2341248e99c691f38820503984bc5e2f18811nicolasroard // First, let's tell the SharedImageProvider that it will need to wait 26192e2341248e99c691f38820503984bc5e2f18811nicolasroard // for the image 2620ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI, 2630ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri.encode(mSharedOutputFile.getAbsolutePath())); 2640ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard ContentValues values = new ContentValues(); 2650ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard values.put(SharedImageProvider.PREPARE, true); 2660ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard getContentResolver().insert(uri, values); 2670ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mSharingImage = true; 2680ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 2690ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard // Process and save the image in the background. 270ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu showSavingProgress(); 2710ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mImageShow.saveImage(this, mSharedOutputFile); 2720ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard return true; 2730ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 2740ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 2750ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard private Intent getDefaultShareIntent() { 2760ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Intent intent = new Intent(Intent.ACTION_SEND); 2770ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 2780ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 2790ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard intent.setType(SharedImageProvider.MIME_TYPE); 2800ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mSharedOutputFile = SaveCopyTask.getNewFile(this, mImageLoader.getUri()); 2810ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI, 2820ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard Uri.encode(mSharedOutputFile.getAbsolutePath())); 2830ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard intent.putExtra(Intent.EXTRA_STREAM, uri); 2840ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard return intent; 2850ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard } 2860ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard 2879594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard @Override 2889594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard public boolean onCreateOptionsMenu(Menu menu) { 2899594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard getMenuInflater().inflate(R.menu.filtershow_activity_menu, menu); 290bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard MenuItem showHistory = menu.findItem(R.id.operationsButton); 2919594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard if (mShowingHistoryPanel) { 292bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard showHistory.setTitle(R.string.hide_history_panel); 293bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } else { 294bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard showHistory.setTitle(R.string.show_history_panel); 295bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } 296bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard MenuItem showState = menu.findItem(R.id.showImageStateButton); 297bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard if (mShowingImageStatePanel) { 298bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard showState.setTitle(R.string.hide_imagestate_panel); 2999594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } else { 300bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard showState.setTitle(R.string.show_imagestate_panel); 3019594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 3020ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share) 3030ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard .getActionProvider(); 3040ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mShareActionProvider.setShareIntent(getDefaultShareIntent()); 3050ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mShareActionProvider.setOnShareTargetSelectedListener(this); 3069594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard return true; 3079594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 3089594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard 30992e2341248e99c691f38820503984bc5e2f18811nicolasroard @Override 3109594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard public boolean onOptionsItemSelected(MenuItem item) { 3119594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard switch (item.getItemId()) { 3129594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard case R.id.undoButton: { 3139594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard HistoryAdapter adapter = (HistoryAdapter) mImageShow 314bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard .getHistoryAdapter(); 3159594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard int position = adapter.undo(); 3169594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard mImageShow.onItemClick(position); 3179594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard mImageShow.showToast("Undo"); 3189594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard invalidateViews(); 3199594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard return true; 3209594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 3219594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard case R.id.redoButton: { 3229594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard HistoryAdapter adapter = (HistoryAdapter) mImageShow 323bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard .getHistoryAdapter(); 3249594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard int position = adapter.redo(); 3259594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard mImageShow.onItemClick(position); 3269594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard mImageShow.showToast("Redo"); 3279594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard invalidateViews(); 3289594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard return true; 3299594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 330f47e790e3f3553f69abe054eec20bd7585118843nicolasroard case R.id.resetHistoryButton: { 331f47e790e3f3553f69abe054eec20bd7585118843nicolasroard resetHistory(); 332f47e790e3f3553f69abe054eec20bd7585118843nicolasroard return true; 333f47e790e3f3553f69abe054eec20bd7585118843nicolasroard } 334bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard case R.id.showImageStateButton: { 335bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard toggleImageStatePanel(); 336bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard return true; 337bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } 3389594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard case R.id.operationsButton: { 3399594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard toggleHistoryPanel(); 3409594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard return true; 3419594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 3429594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard case android.R.id.home: { 3439594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard saveImage(); 3449594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard return true; 3459594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 3469594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 3479594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard return false; 3489594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 3499594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard 3500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private void fillListImages(LinearLayout listFilters) { 3510d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // TODO: use listview 3520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // TODO: load the filters straight from the filesystem 3530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard ImagePreset[] preset = new ImagePreset[9]; 3540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard int p = 0; 3550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard preset[p++] = new ImagePreset(); 3560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard preset[p++] = new ImagePresetSaturated(); 3570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard preset[p++] = new ImagePresetOld(); 3580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard preset[p++] = new ImagePresetXProcessing(); 3590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard preset[p++] = new ImagePresetBW(); 3600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard preset[p++] = new ImagePresetBWRed(); 3610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard preset[p++] = new ImagePresetBWGreen(); 3620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard preset[p++] = new ImagePresetBWBlue(); 3630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 3640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard for (int i = 0; i < p; i++) { 3650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard ImageSmallFilter filter = new ImageSmallFilter(getBaseContext()); 3660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard preset[i].setIsFx(true); 3670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard filter.setImagePreset(preset[i]); 3680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard filter.setController(this); 3690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard filter.setImageLoader(mImageLoader); 3700d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard listFilters.addView(filter); 3710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 3720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 3730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // Default preset (original) 3740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageShow.setImagePreset(preset[0]); 3750d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 3760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 3770d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private void fillListBorders(LinearLayout listBorders) { 3780d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // TODO: use listview 3790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // TODO: load the borders straight from the filesystem 3800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard int p = 0; 3810d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard ImageFilter[] borders = new ImageFilter[8]; 3820d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard borders[p++] = new ImageFilterBorder(null); 3830d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 3840d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Drawable npd3 = getResources().getDrawable(R.drawable.filtershow_border_film3); 3850d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard borders[p++] = new ImageFilterBorder(npd3); 3860d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Drawable npd = getResources().getDrawable( 3870d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard R.drawable.filtershow_border_scratch3); 3880d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard borders[p++] = new ImageFilterBorder(npd); 3890d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Drawable npd2 = getResources().getDrawable(R.drawable.filtershow_border_black); 3900d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard borders[p++] = new ImageFilterBorder(npd2); 3910d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Drawable npd6 = getResources().getDrawable( 3920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard R.drawable.filtershow_border_rounded_black); 3930d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard borders[p++] = new ImageFilterBorder(npd6); 3940d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Drawable npd4 = getResources().getDrawable(R.drawable.filtershow_border_white); 3950d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard borders[p++] = new ImageFilterBorder(npd4); 3960d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Drawable npd5 = getResources().getDrawable( 3970d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard R.drawable.filtershow_border_rounded_white); 3980d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard borders[p++] = new ImageFilterBorder(npd5); 3990d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 4000d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard for (int i = 0; i < p; i++) { 4010d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard ImageSmallFilter filter = new ImageSmallFilter(getBaseContext()); 4020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard filter.setImageFilter(borders[i]); 4030d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard filter.setController(this); 4040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard filter.setImageLoader(mImageLoader); 405bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard filter.setShowTitle(false); 4060d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard listBorders.addView(filter); 4070d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 4100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // ////////////////////////////////////////////////////////////////////////////// 4110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // Some utility functions 41292e2341248e99c691f38820503984bc5e2f18811nicolasroard // TODO: finish the cleanup. 4130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 4140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void showOriginalViews(boolean value) { 4150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard for (ImageShow views : mImageViews) { 4160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard views.showOriginal(value); 4170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 4200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void invalidateViews() { 4210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard for (ImageShow views : mImageViews) { 4220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard views.invalidate(); 4230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 4260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void hideListViews() { 4270d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard for (View view : mListViews) { 4280d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard view.setVisibility(View.GONE); 4290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 4320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void hideImageViews() { 4330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageShow.setShowControls(false); // reset 4340d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard for (View view : mImageViews) { 4350d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard view.setVisibility(View.GONE); 4360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4370d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 4390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void unselectBottomPanelButtons() { 4400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard for (ImageButton button : mBottomPanelButtons) { 4410d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard button.setSelected(false); 4420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 4450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void unselectPanelButtons(Vector<ImageButton> buttons) { 4460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard for (ImageButton button : buttons) { 4470d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard button.setSelected(false); 4480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 4510d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // ////////////////////////////////////////////////////////////////////////////// 4520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // Click handlers for the top row buttons 4530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 4540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private OnTouchListener createOnTouchShowOriginalButton() { 4550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard return new View.OnTouchListener() { 4560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard @Override 4570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public boolean onTouch(View v, MotionEvent event) { 4580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard boolean show = false; 4590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if ((event.getActionMasked() != MotionEvent.ACTION_UP) 4600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard || (event.getActionMasked() == MotionEvent.ACTION_CANCEL)) { 4610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard show = true; 4620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard showOriginalViews(show); 4640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard return true; 4650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard }; 4670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 4680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 4690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // ////////////////////////////////////////////////////////////////////////////// 470bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard // imageState panel... 471bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard 472bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard private void toggleImageStatePanel() { 473bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard final View view = findViewById(R.id.mainPanel); 474bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard final View viewList = findViewById(R.id.imageStatePanel); 475bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard 476bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard if (mShowingHistoryPanel) { 477bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard findViewById(R.id.historyPanel).setVisibility(View.INVISIBLE); 478bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard mShowingHistoryPanel = false; 479bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } 480bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard 481bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard if (!mShowingImageStatePanel) { 482bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard mShowingImageStatePanel = true; 483bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard view.animate().setDuration(200).x(-viewList.getWidth()) 484bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard .withLayer().withEndAction(new Runnable() { 48592e2341248e99c691f38820503984bc5e2f18811nicolasroard @Override 486bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard public void run() { 487bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard viewList.setAlpha(0); 488bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard viewList.setVisibility(View.VISIBLE); 489bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard viewList.animate().setDuration(100) 490bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard .alpha(1.0f).start(); 491bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } 492bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard }).start(); 493bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } else { 494bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard mShowingImageStatePanel = false; 495bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard viewList.setVisibility(View.INVISIBLE); 496bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard view.animate().setDuration(200).x(0).withLayer() 497bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard .start(); 498bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } 499bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard invalidateOptionsMenu(); 500bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } 501bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard 502bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard // ////////////////////////////////////////////////////////////////////////////// 5030d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // history panel... 5040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 5059594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard private void toggleHistoryPanel() { 5069594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard final View view = findViewById(R.id.mainPanel); 5079594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard final View viewList = findViewById(R.id.historyPanel); 508bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard 509bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard if (mShowingImageStatePanel) { 510bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard findViewById(R.id.imageStatePanel).setVisibility(View.INVISIBLE); 511bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard mShowingImageStatePanel = false; 512bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } 513bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard 5149594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard if (!mShowingHistoryPanel) { 5159594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard mShowingHistoryPanel = true; 5169594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard view.animate().setDuration(200).x(-viewList.getWidth()) 5179594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard .withLayer().withEndAction(new Runnable() { 51892e2341248e99c691f38820503984bc5e2f18811nicolasroard @Override 5199594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard public void run() { 5209594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard viewList.setAlpha(0); 5219594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard viewList.setVisibility(View.VISIBLE); 5229594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard viewList.animate().setDuration(100) 5239594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard .alpha(1.0f).start(); 5249594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 5259594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard }).start(); 5269594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } else { 5279594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard mShowingHistoryPanel = false; 5289594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard viewList.setVisibility(View.INVISIBLE); 5299594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard view.animate().setDuration(200).x(0).withLayer() 530bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard .start(); 5319594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 5329594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard invalidateOptionsMenu(); 5339594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 5340d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 5359594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard private void resetHistory() { 5369594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard HistoryAdapter adapter = (HistoryAdapter) mImageShow 537bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard .getHistoryAdapter(); 5389594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard adapter.reset(); 5399594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard ImagePreset original = new ImagePreset(adapter.getItem(0)); 5409594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard mImageShow.setImagePreset(original); 5419594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard invalidateViews(); 5420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 5430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 5440d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // reset button in the history panel. 5450d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private OnClickListener createOnClickResetOperationsButton() { 5460d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard return new View.OnClickListener() { 5470d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard @Override 5480d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void onClick(View v) { 5499594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard resetHistory(); 5500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 5510d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard }; 5520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 5530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 5540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // ////////////////////////////////////////////////////////////////////////////// 5550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 5560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public float getPixelsFromDip(float value) { 5570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Resources r = getResources(); 5580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, 5590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard r.getDisplayMetrics()); 5600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 5610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 5620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void useImagePreset(ImagePreset preset) { 5630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (preset == null) { 5640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard return; 5650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 5660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard ImagePreset copy = new ImagePreset(preset); 5670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageShow.setImagePreset(copy); 5680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (preset.isFx()) { 5690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // if it's an FX we rest the curve adjustment too 5700d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageCurves.resetCurve(); 5710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 5720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard invalidateViews(); 5730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 5740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 5750d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void useImageFilter(ImageFilter imageFilter) { 5760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (imageFilter == null) { 5770d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard return; 5780d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 5790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard ImagePreset oldPreset = mImageShow.getImagePreset(); 5800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard ImagePreset copy = new ImagePreset(oldPreset); 5810d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard // TODO: use a numerical constant instead. 582bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard if (imageFilter.getName().equalsIgnoreCase("Border")) { 5830d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard copy.remove("Border"); 5840d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard copy.setHistoryName("Border"); 5850d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 5860d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard copy.add(imageFilter); 587bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard mImageShow.setImagePreset(copy); 5880d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard invalidateViews(); 5890d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 5900d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 5910d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard @Override 5920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void onItemClick(AdapterView<?> parent, View view, int position, 5930d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard long id) { 5940d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageShow.onItemClick(position); 5950d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard invalidateViews(); 5960d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 5970d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 5980d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void pickImage() { 5990d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Intent intent = new Intent(); 6000d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard intent.setType("image/*"); 6010d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard intent.setAction(Intent.ACTION_GET_CONTENT); 6020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard startActivityForResult(Intent.createChooser(intent, getString(R.string.select_image)), 6030d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard SELECT_PICTURE); 6040d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 6050d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 60692e2341248e99c691f38820503984bc5e2f18811nicolasroard @Override 6070d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void onActivityResult(int requestCode, int resultCode, Intent data) { 6080d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Log.v(LOGTAG, "onActivityResult"); 6090d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (resultCode == RESULT_OK) { 6100d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (requestCode == SELECT_PICTURE) { 6110d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Uri selectedImageUri = data.getData(); 6120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageLoader.loadBitmap(selectedImageUri); 6130d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 6140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 6150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 6160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 6170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void saveImage() { 618ec29b73d77a8ff2f000eb04d662d85d63d8f8d09Bobby Georgescu showSavingProgress(); 6190ee91a2b74808fa3f51d370daaddf99f588d72efnicolasroard mImageShow.saveImage(this, null); 6200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 6210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 6220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard static { 623e3f9f579d73af613a33ba1d0a93dc101ea671a69nicolasroard System.loadLibrary("jni_filtershow_filters"); 6240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 6250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 6260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard} 627