package eu.geopaparazzi.core.maptools.resourceviews;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.TextView;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import eu.geopaparazzi.library.core.ResourcesManager;
import eu.geopaparazzi.library.database.GPLog;
import eu.geopaparazzi.library.images.ImageUtilities;
import eu.geopaparazzi.library.util.AppsUtilities;
import eu.geopaparazzi.library.util.GPDialogs;
import eu.geopaparazzi.library.util.LibraryConstants;
import eu.geopaparazzi.spatialite.database.spatial.activities.camera.CameraDbActivity;
import eu.geopaparazzi.spatialite.database.spatial.core.resourcestorage.AbstractResource;
import eu.geopaparazzi.spatialite.database.spatial.core.resourcestorage.BlobResource;
import eu.geopaparazzi.spatialite.database.spatial.core.resourcestorage.ExternalResource;
import eu.geopaparazzi.spatialite.database.spatial.core.resourcestorage.ResourceStorage;
import eu.geopaparazzi.core.R;
import eu.geopaparazzi.core.maptools.FeaturePagerActivity;
/**
* Activity to manage images associated to a vector feature.
* Shows existing images on a grid and offers a button to take new
* pictures.
*
* @author Cesar Martinez Izquierdo (www.scolab.es)
*/
public class ResourceBrowser extends AppCompatActivity {
private static final int CAMERA_RETURN_CODE = 667;
private GridView gridView;
private ImageGridViewAdapter<ImageItem> gridAdapter;
private ArrayList<ImageItem> imageItems = new ArrayList<ImageItem>();
private ResourceStorage storage;
private long rowId = -1;
private TextView numImagesView;
private File imageSaveFolder;
public final static String TABLEVIEW_EXTRA_MESSAGE = "eu.hydrologis.geopaparazzi.maptools.resourceviews.TABLEVIEW";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_resource_browser);
Toolbar toolbar = (Toolbar) findViewById(eu.geopaparazzi.mapsforge.R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Intent origIntent = getIntent();
String tableName = origIntent.getStringExtra(FeaturePagerActivity.TABLENAME_EXTRA_MESSAGE);
String dbPath = origIntent.getStringExtra(FeaturePagerActivity.DBPATH_EXTRA_MESSAGE);
String rowIdStr = origIntent.getStringExtra(FeaturePagerActivity.ROWID_EXTRA_MESSAGE);
if (rowIdStr!=null) {
try {
rowId = Long.parseLong(rowIdStr);
}
catch(NumberFormatException ex) {}
}
storage = ResourceStorage.getStorage(tableName, dbPath);
try {
imageSaveFolder = new File(ResourcesManager.getInstance(this).getApplicationSupporterDir(), "sqlite_res");
if (!imageSaveFolder.exists()) {
imageSaveFolder.mkdirs();
}
} catch(Exception exc) {};
gridView = (GridView) findViewById(R.id.resourcesGridView);
numImagesView = (TextView) findViewById(R.id.numImages);
refreshBlobThumbnails(imageItems);
gridAdapter = new ImageGridViewAdapter<ImageItem>(this, R.layout.fragment_image_item, imageItems);
gridView.setAdapter(gridAdapter);
gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
ImageItem item = (ImageItem) parent.getItemAtPosition(position);
removeImage(item);
return true;
}
});
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ImageItem item = (ImageItem) parent.getItemAtPosition(position);
showImage(item);
}
});
}
protected void removeImage(ImageItem item) {
final AbstractResource res = item.getResource();
final ImageItem theItem = item;
GPDialogs.yesNoMessageDialog(ResourceBrowser.this, getString(R.string.confirm_remove_image), new Runnable() {
@Override
public void run() {
storage.deleteResource(res);
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
gridAdapter.remove(theItem);
} catch (Exception e) {
GPLog.error(this, null, e);
}
}
});
}
}, null);
}
protected void showImage(ImageItem item) {
try {
final AbstractResource res = item.getResource();
if (res instanceof BlobResource) {
BlobResource blobRes = (BlobResource) res;
// the item resource only contains the thumbnail,
// so we need to get the complete resource
BlobResource completeRes = storage.getBlobResource(res.getId());
AppsUtilities.showImage(completeRes.getBlob(), blobRes.getName(), this);
}
else {
ExternalResource extRes = (ExternalResource) res;
File image = new File(imageSaveFolder, extRes.getPath());
AppsUtilities.showImage(image, this);
}
} catch (Exception e) {
GPLog.error(this, null, e);
}
}
protected void startCameraActivity() {
Intent intent = new Intent(ResourceBrowser.this, CameraDbActivity.class);
try {
intent.putExtra(LibraryConstants.PREFS_KEY_CAMERA_IMAGESAVEFOLDER, imageSaveFolder.toString());
intent.putExtra(CameraDbActivity.DBPATH_EXTRA_MESSAGE, storage.getDbFile());
intent.putExtra(CameraDbActivity.TABLENAME_EXTRA_MESSAGE, storage.getTableName());
intent.putExtra(CameraDbActivity.ROWID_EXTRA_MESSAGE, this.rowId);
ResourceBrowser.this.startActivityForResult(intent, CAMERA_RETURN_CODE);
} catch (Exception e) {
e.printStackTrace();
}
}
private ArrayList<ImageItem> refreshExternalImages(ArrayList<ImageItem> imageItems) {
imageItems.clear();
List<ExternalResource> resources = storage.getExternalResources(rowId, AbstractResource.ResourceType.EXTERNAL_IMAGE);
int i=0;
for (ExternalResource r: resources) {
String imgPath = r.getPath();
File imgFile = new File(imgPath);
String absPath;
if (imgFile.isAbsolute()) {
absPath = imgFile.getAbsolutePath();
}
else {
absPath = new File(imageSaveFolder, r.getPath()).getAbsolutePath();
}
Bitmap bitmap = ImageUtilities.decodeSampledBitmapFromFile(absPath, 100, 100);
imageItems.add(new ImageItem(bitmap, "Image#" + i++, r));
}
String text = getResources().getQuantityString(R.plurals.n_images, imageItems.size(), imageItems.size());
numImagesView.setText(text);
return imageItems;
}
private ArrayList<ImageItem> refreshBlobThumbnails(ArrayList<ImageItem> imageItems) {
imageItems.clear();
List<BlobResource> resources = storage.getBlobThumbnails(rowId, AbstractResource.ResourceType.BLOB_IMAGE);
int i=0;
for (BlobResource r: resources) {
Bitmap bitmap = BitmapFactory.decodeByteArray(r.getThumbnail(), 0, r.getThumbnail().length);
imageItems.add(new ImageItem(bitmap, "Image#" + i++, r));
}
String text = getResources().getQuantityString(R.plurals.n_images, imageItems.size(), imageItems.size());
numImagesView.setText(text);
return imageItems;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_capturepicture, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.capture_picture) {
startCameraActivity();
return true;
}
else if (item.getItemId() == android.R.id.home) {
finish();
}
return false;
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (CAMERA_RETURN_CODE == requestCode) {
if(resultCode == RESULT_OK){
if (data.getBooleanExtra(LibraryConstants.OBJECT_EXISTS, false)) {
refreshBlobThumbnails(imageItems);
gridAdapter.notifyDataSetChanged();
}
}
}
}
}