/*
* Copyright 2012 Javier Pérez Pacheco and Francisco Díaz Rodriguez
* TweetTopics 2.0
* javielinux@gmail.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.javielinux.tweettopics2;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.res.Resources;
import android.graphics.*;
import android.media.ExifInterface;
import android.os.Bundle;
import android.os.Vibrator;
import android.preference.PreferenceManager;
import android.util.DisplayMetrics;
import android.util.FloatMath;
import android.util.Log;
import android.view.*;
import android.view.View.OnTouchListener;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import com.android.dataframework.DataFramework;
import com.javielinux.preferences.Preferences;
import com.javielinux.utils.ImageUtils;
import com.javielinux.utils.Utils;
import com.javielinux.zoom.WrapMotionEvent;
import org.xmlpull.v1.XmlPullParserException;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class AdjustImage extends BaseActivity implements OnTouchListener
{
private static final int OK_ID = Menu.FIRST;
private int screen_w = 320;
private int screen_h = 480;
private Bitmap mBitmap = null;
private float imageWidth = 0;
private float imageHeight = 0;
private ImageView mImage;
private Resources res;
private String file = "";
private String url = "";
private Matrix matrix = new Matrix();
private Matrix savedMatrix = new Matrix();
private float mScale = 1f;
static final int TYPE_ZOOM_NORMAL = 0;
static final int TYPE_ZOOM_VERTICAL = 1;
static final int TYPE_ZOOM_HORIZONTAL = 2;
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
static final int ZOOM_ONEFINGER = 3;
int mode = NONE;
PointF start = new PointF();
PointF mid = new PointF();
PointF startOneFinger = new PointF();
float oldDist = 1f;
private GestureDetector gd;
public void refreshTheme() {
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setTitle(R.string.title_prf_image_background);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
if (savedInstanceState != null) {
if (savedInstanceState.containsKey("file")) file = savedInstanceState.getString("file");
if (savedInstanceState.containsKey("url")) url = savedInstanceState.getString("url");
} else {
Bundle extras = getIntent().getExtras();
if (extras != null) {
file = (extras.containsKey("file")) ? extras.getString("file") : "";
url = (extras.containsKey("url")) ? extras.getString("url") : "";
} else {
file = "";
url = "";
}
}
try {
DataFramework.getInstance().open(this, Utils.packageName);
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
gd = new GestureDetector(new GestureDetector.SimpleOnGestureListener(){
@Override
public void onLongPress(MotionEvent e) {
PreferenceManager.setDefaultValues(AdjustImage.this, R.xml.preferences, false);
SharedPreferences preference = PreferenceManager.getDefaultSharedPreferences(AdjustImage.this);
if (preference.getBoolean("prf_zoom_one_finger", false)) {
((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(100);
mode = ZOOM_ONEFINGER;
startOneFinger.set(e.getX(), e.getY());
}
}
});
res = getResources();
mid.x = 0f;
mid.y = 0f;
DisplayMetrics dm = res.getDisplayMetrics();
screen_w = dm.widthPixels;
screen_h = dm.heightPixels;
if (!file.equals("")) {
mBitmap = BitmapFactory.decodeFile(file);
} else {
Log.d(Utils.TAG, url);
mBitmap = ImageUtils.getBitmap(url, screen_h);
}
if (mBitmap==null) {
Utils.showMessage(this, getString(R.string.problem_image));
finish();
}
imageWidth = mBitmap.getWidth();
imageHeight = mBitmap.getHeight();
FrameLayout fr = new FrameLayout(this);
mImage = new ImageView(this);
mImage.setImageBitmap(mBitmap);
float scrollX = (-(imageWidth/2))+(screen_w/2);
float scrollY = (-(imageHeight/2))+(screen_h/2);
mImage.setScaleType(ScaleType.MATRIX);
mImage.setOnTouchListener(this);
matrix.setTranslate(scrollX, scrollY);
if (!file.equals("")) {
try {
ExifInterface exif = new ExifInterface(file);
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
if (orientation==3) {
matrix.postRotate(180);
} else if (orientation==6) {
matrix.postRotate(90);
} else if (orientation==8) {
matrix.postRotate(270);
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
mImage.setImageMatrix(matrix);
fr.addView(mImage);
setContentView(fr, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
refreshTheme();
Utils.showMessage(this, getString(R.string.adjust_background));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, OK_ID, 0, R.string.save)
.setIcon(android.R.drawable.ic_menu_save);
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch(item.getItemId()) {
case OK_ID:
save();
return true;
}
return super.onMenuItemSelected(featureId, item);
}
private void save() {
Bitmap outBitmap = null;
try {
outBitmap = Bitmap.createBitmap(screen_w, screen_h, Bitmap.Config.RGB_565);
} catch (OutOfMemoryError e) {
try {
outBitmap = Bitmap.createBitmap(screen_w/2, screen_h/2, Bitmap.Config.RGB_565);
} catch (OutOfMemoryError e2) {
e2.printStackTrace();
}
}
if (outBitmap!=null) {
Canvas c = new Canvas(outBitmap);
c.drawColor(Color.BLACK);
c.drawBitmap(mBitmap, matrix, null);
FileOutputStream out;
try {
out = new FileOutputStream(Preferences.IMAGE_WALLPAPER);
outBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
outBitmap.recycle();
outBitmap = null;
System.gc();
Utils.showMessage(this, getString(R.string.correct_background));
setResult(RESULT_OK);
finish();
} else {
Utils.showMessage(this, getString(R.string.error_general));
}
}
@Override
public boolean onTouch(View v, MotionEvent rawEvent) {
WrapMotionEvent event = WrapMotionEvent.wrap(rawEvent);
ImageView view = (ImageView) v;
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
mode = DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);
} else if (mode == ZOOM) {
float newDist = spacing(event);
if (newDist > 10f) {
matrix.set(savedMatrix);
mScale = newDist / oldDist;
float scale_x = mScale;
float scale_y = mScale;
matrix.postScale(scale_x, scale_y, mid.x, mid.y);
}
} else if (mode == ZOOM_ONEFINGER) {
float y = startOneFinger.y - event.getY(0);
if ( (y > 10f) || (y < -10f) ) {
matrix.set(savedMatrix);
mScale = 1.0f + (y / (screen_h/2));
float scale_x = mScale;
float scale_y = mScale;
matrix.postScale(scale_x, scale_y, startOneFinger.x, startOneFinger.y);
}
}
break;
}
view.setImageMatrix(matrix);
gd.onTouchEvent(rawEvent);
return true;
}
private float spacing(WrapMotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
private void midPoint(PointF point, WrapMotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
@Override
protected void onDestroy() {
super.onDestroy();
mBitmap.recycle();
mBitmap = null;
DataFramework.getInstance().close();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("file", file);
outState.putString("url", url);
super.onSaveInstanceState(outState);
}
}