package com.mobeelizer.demos.activities;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import com.mobeelizer.demos.R;
import com.mobeelizer.demos.adapters.FileSyncAdapter;
import com.mobeelizer.demos.custom.EntityState;
import com.mobeelizer.demos.model.FileSyncEntity;
import com.mobeelizer.demos.utils.DataUtil;
import com.mobeelizer.demos.utils.UIUtils;
import com.mobeelizer.java.api.MobeelizerFile;
import com.mobeelizer.java.api.MobeelizerOperationError;
import com.mobeelizer.mobile.android.Mobeelizer;
import com.mobeelizer.mobile.android.api.MobeelizerOperationCallback;
import com.mobeelizer.mobile.android.api.MobeelizerSyncStatus;
public class PhotoSyncActivity extends BaseActivity<FileSyncEntity>
implements OnItemClickListener, MobeelizerOperationCallback {
private static final int TAKE_PHOTO = 0x100;
private static final int CHOOSE_PHOTO = 0x101;
private Button mAddButton, mSyncButton;
private ImageButton mInfoButton;
private ListView mList;
private FileSyncAdapter mAdapter;
private Dialog mSyncDialog = null;
@Override
return D_PHOTO_SYNC;
}
@Override
protected void onCreate(
final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.a_list_with_buttons);
initTitleBarViews();
setTitleBarTitle(R.string.titleBarPhotoSync);
mAddButton = (Button) findViewById(R.id.footerAdd);
mSyncButton = (Button) findViewById(R.id.footerSync);
mInfoButton = (ImageButton) findViewById(R.id.footerInfo);
mList = (ListView) findViewById(android.R.id.list);
mAddButton.setText(R.string.addPhoto);
mAddButton.setOnClickListener(getOnAddClickListener());
mSyncButton.setOnClickListener(getOnSyncClickListener());
mInfoButton.setOnClickListener(getOnInfoClickListener());
UIUtils.prepareClip(mAddButton);
UIUtils.prepareClip(mSyncButton);
List<FileSyncEntity> data = Mobeelizer.getDatabase().list(FileSyncEntity.class);
mAdapter = new FileSyncAdapter(this, data);
mAdapter.sort(new FileSyncEntity());
mList.setAdapter(mAdapter);
mList.setOnItemClickListener(this);
}
@Override
public void onActivityResult(
final int requestCode,
final int resultCode,
final Intent data) {
if ((requestCode == TAKE_PHOTO || requestCode == CHOOSE_PHOTO) && resultCode == RESULT_OK) {
MobeelizerFile photo;
File photoFile = null;
try {
photoFile = new File(getExternalFilesDir(null), "tmp_photo");
String filePath = null;
if (requestCode == TAKE_PHOTO) {
filePath = photoFile.getAbsolutePath();
} else {
Uri chosenImageUri = data.getData();
filePath = getRealPathFromURI(chosenImageUri);
}
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, opt);
opt.inJustDecodeBounds = false;
opt.inSampleSize = (int) Math.ceil(opt.outWidth / 600.0);
Bitmap scaled = BitmapFactory.decodeFile(filePath, opt);
Log.d("TEST", "Width: " + scaled.getWidth() + "\tHeight: " + scaled.getHeight());
photoFile.delete();
photoFile.createNewFile();
if (scaled.compress(CompressFormat.JPEG, 92, new BufferedOutputStream(new FileOutputStream(photoFile)))) {
scaled.recycle();
}
photo = Mobeelizer.createFile("photo", new BufferedInputStream(new FileInputStream(photoFile)));
FileSyncEntity fse = new FileSyncEntity();
fse.setPhoto(photo);
Mobeelizer.getDatabase().save(fse);
fse.setEntityState(EntityState.NEW_A);
mAdapter.add(fse);
mAdapter.notifyDataSetChanged();
mList.smoothScrollToPosition(mList.getCount() - 1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
photoFile.delete();
} catch (Exception e) {
}
}
}
}
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(contentUri, proj,
null,
null,
null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
@Override
public boolean (final Menu menu) {
MenuInflater mi = getMenuInflater();
mi.inflate(R.menu.examples, menu);
return true;
}
@Override
public boolean (final int featureId, final MenuItem item) {
switch (item.getItemId()) {
case R.id.m_next:
Intent i = new Intent(getApplicationContext(), PermissionsActivity.class);
startActivity(i);
finish();
return true;
default:
return super.onMenuItemSelected(featureId, item);
}
}
@Override
mAdapter.clear();
mAdapter.addAll(Mobeelizer.getDatabase().list(FileSyncEntity.class));
mAdapter.sort(new FileSyncEntity());
mAdapter.notifyDataSetChanged();
}
@Override
final List<FileSyncEntity> newList = Mobeelizer.getDatabase().list(FileSyncEntity.class);
final List<FileSyncEntity> oldList = mAdapter.getItems();
mergeLists(oldList, newList);
mAdapter.sort(new FileSyncEntity());
mAdapter.notifyDataSetChanged();
mList.setSelection(0);
if (mSyncDialog != null) {
mSyncDialog.dismiss();
}
}
@Override
public void onFailure(
final MobeelizerOperationError error) {
Bundle b = new Bundle();
b.putBoolean(BaseActivity.IS_INFO, false);
b.putInt(BaseActivity.TEXT_RES_ID, R.string.e_syncFailed);
if (mSyncDialog != null) {
mSyncDialog.dismiss();
}
PhotoSyncActivity.this.showDialog(BaseActivity.D_CUSTOM, b);
}
return new View.OnClickListener() {
@Override
public void onClick(
final View v) {
CharSequence[] items = { "Camera", "Photo gallery", "Random image" };
final boolean isEmulator = "google_sdk".equals(Build.PRODUCT) || "sdk".equals(Build.PRODUCT);
if (isEmulator) {
items = new CharSequence[] { "Photo gallery", "Random image" };
}
AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
builder.setTitle("Choose source:");
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(
final DialogInterface dialog,
final int item) {
if (isEmulator) {
if (item == 0) {
getImageFromGallery();
} else {
getRandomImage();
}
} else {
if (item == 0) {
getImageFromCamera();
} else if (item == 1) {
getImageFromGallery();
} else {
getRandomImage();
}
}
}
});
AlertDialog alert = builder.create();
alert.show();
}
};
}
try {
File photo = new File(getExternalFilesDir(null), "tmp_photo");
if (photo.exists()) {
photo.delete();
}
photo.createNewFile();
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
startActivityForResult(intent, TAKE_PHOTO);
} catch (IOException e) {
e.printStackTrace();
}
}
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, CHOOSE_PHOTO);
}
FileSyncEntity fse = new FileSyncEntity();
MobeelizerFile photo = Mobeelizer.createFile("photo", getResources().openRawResource(DataUtil.getRandomImage()));
fse.setPhoto(photo);
Mobeelizer.getDatabase().save(fse);
fse.setEntityState(EntityState.NEW_A);
mAdapter.add(fse);
mAdapter.sort(new FileSyncEntity());
mAdapter.notifyDataSetChanged();
mList.smoothScrollToPosition(mAdapter.getPosition(fse));
}
return new View.OnClickListener() {
@Override
public void onClick(
final View v) {
mSyncDialog = new Dialog(PhotoSyncActivity.this, R.style.MobeelizerDialogTheme);
mSyncDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
mSyncDialog.setContentView(R.layout.progress_dialog);
mSyncDialog.setCancelable(false);
mSyncDialog.show();
Mobeelizer.sync(PhotoSyncActivity.this);
}
};
}
return new View.OnClickListener() {
@Override
public void onClick(
final View v) {
showDialog(D_PHOTO_SYNC);
}
};
}
@Override
public void onItemClick(
final AdapterView<?> parent,
final View view,
final int position,
final long id) {
final MobeelizerFile photo = ((FileSyncEntity) parent.getItemAtPosition(position)).getPhoto();
Dialog dialog = new Dialog(this, R.style.MobeelizerDialogTheme);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.photo_dialog);
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
ImageView photoView = (ImageView) dialog.findViewById(R.id.dialogPhoto);
photoView.setImageDrawable(BitmapDrawable.createFromStream(photo.getInputStream(), photo.getName()));
dialog.show();
}
}