package net.jimblackler.yourphotoswatch;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.wearable.Asset;
import com.google.android.gms.wearable.DataApi;
import com.google.android.gms.wearable.DataEventBuffer;
import com.google.android.gms.wearable.DataItem;
import com.google.android.gms.wearable.DataItemBuffer;
import com.google.android.gms.wearable.PutDataMapRequest;
import com.google.android.gms.wearable.PutDataRequest;
import com.google.android.gms.wearable.Wearable;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class BasePhotoSelectActivity extends Activity implements
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener,
DataApi.DataListener {
private GoogleApiClient googleApiClient;
private Map<String, PhotoListEntry> photosById = new HashMap<>();
private Set<String> enabledPhotos = new HashSet<>();
private PhotoRecyclerAdapter recyclerAdapter;
@Override
public void onConnected(Bundle bundle) {
Wearable.DataApi.addListener(googleApiClient, this);
Wearable.DataApi.getDataItems(googleApiClient).setResultCallback(new ResultCallback<DataItemBuffer>() {
@Override
public void onResult(DataItemBuffer dataItems) {
for (DataItem dataItem : dataItems) {
String[] parts = dataItem.getUri().getPath().split("/");
switch (parts[1]) {
case "image":
String photoId = parts[2];
enabledPhotos.add(photoId);
PhotoListEntry photoListEntry = photosById.get(photoId);
if (photoListEntry == null)
continue;
recyclerAdapter.notifyItemChanged(photoListEntry.getPosition());
break;
default:
break;
}
}
}
});
}
@Override
public void onConnectionSuspended(int i) {
Wearable.DataApi.removeListener(googleApiClient, this);
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Wearable.DataApi.removeListener(googleApiClient, this);
}
public void setEntries(List<? extends PhotoListEntry> entries) {
findViewById(R.id.progress).setVisibility(View.GONE);
photosById.clear();
if (entries == null) {
Toast.makeText(this, getString(R.string.network_error_message), Toast.LENGTH_LONG).show();
finish();
return;
}
for (PhotoListEntry entry : entries) {
photosById.put(entry.getId(), entry);
}
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list);
recyclerView.setHasFixedSize(true);
recyclerAdapter =
new PhotoRecyclerAdapter(entries, enabledPhotos,
new PhotoRecyclerAdapter.PhotoListEntryObserver() {
@Override
public void modified(final PhotoListEntry listEntry) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
if (googleApiClient.isConnected()) {
String path = "/image/" + listEntry.getId();
if (enabledPhotos.contains(listEntry.getId())) {
PutDataMapRequest dataMap = PutDataMapRequest.create(path);
Bitmap bitmap = listEntry.getBitmap(getContentResolver());
try {
AutoCropper autoCropper = new AutoCropper(BasePhotoSelectActivity.this);
bitmap = autoCropper.crop(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
dataMap.getDataMap().putAsset("photo", toAsset(bitmap));
dataMap.getDataMap().putLong("time", new Date().getTime());
PutDataRequest request = dataMap.asPutDataRequest();
Wearable.DataApi.putDataItem(googleApiClient, request);
} else {
Wearable.DataApi.deleteDataItems(googleApiClient, Uri.parse("wear:" + path));
}
}
return null;
}
}.execute();
}
});
recyclerView.setAdapter(recyclerAdapter);
LinearLayoutManager layout = new GridLayoutManager(this, 3);
recyclerView.setLayoutManager(layout);
recyclerView.setItemAnimator(new DefaultItemAnimator());
}
private static Asset toAsset(Bitmap bitmap) {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream);
return Asset.createFromBytes(byteStream.toByteArray());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(R.string.title_activity_select_pictures);
googleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
}
@Override
protected void onStart() {
super.onStart();
googleApiClient.connect();
}
@Override
protected void onStop() {
Wearable.DataApi.removeListener(googleApiClient, this);
super.onStop();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_select_pictures, menu);
int sortOrder = getIntent().getIntExtra("sort", R.id.oldest_first);
menu.findItem(sortOrder).setChecked(true);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.newest_first:
case R.id.oldest_first: {
Intent intent = new Intent(this, this.getClass());
intent.putExtra("sort", id);
finish();
startActivity(intent);
overridePendingTransition(0, 0);
break;
}
}
return super.onOptionsItemSelected(item);
}
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
}
}