package com.rafali.flickruploader.ui.activity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.androidannotations.annotations.Background;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.UiThread;
import org.androidannotations.annotations.ViewById;
import org.slf4j.LoggerFactory;
import uk.co.senab.bitmapcache.CacheableBitmapDrawable;
import uk.co.senab.bitmapcache.CacheableImageView;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.google.common.collect.Lists;
import com.rafali.common.STR;
import com.rafali.common.ToolString;
import com.rafali.flickruploader.api.FlickrApi;
import com.rafali.flickruploader.enums.VIEW_SIZE;
import com.rafali.flickruploader.model.FlickrSet;
import com.rafali.flickruploader.model.Folder;
import com.rafali.flickruploader.model.Media;
import com.rafali.flickruploader.tool.Utils;
import com.rafali.flickruploader2.R;
@EActivity(R.layout.auto_upload_folders_activity)
public class AutoUploadFoldersActivity extends AppCompatActivity implements OnItemClickListener {
private static final String DEFAULT_SET = "Default set (" + STR.instantUpload + ")";
private static final String PREVIOUS_SET = "Existing set: ";
private static final String EXISTING_SET = "Existing set…";
private static final String NEW_SET = "New set…";
private static final String DISABLE_AUTO_UPLOAD = "Disable auto-upload";
static final org.slf4j.Logger LOG = LoggerFactory.getLogger(FlickrUploaderActivity.class);
AutoUploadFoldersActivity activity = this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
load();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
@ViewById(R.id.list_view)
ListView listView;
@ViewById(R.id.loading)
TextView loading;
private Map<String, FlickrSet> cachedPhotoSets;
@Background
void load() {
folders = new ArrayList<Folder>(Utils.getFolders(true).values());
Collections.sort(folders, new Comparator<Folder>() {
@Override
public int compare(Folder lhs, Folder rhs) {
return rhs.getSize() - lhs.getSize();
}
});
render();
cachedPhotoSets = FlickrApi.getPhotoSets(true);
refresh();
}
@UiThread
void refresh() {
for (int i = 0; i < listView.getChildCount(); i++) {
View view = listView.getChildAt(i);
renderImageView(view);
}
}
@UiThread
void render() {
if (loading != null) {
((ViewGroup) loading.getParent()).removeView(loading);
loading = null;
}
if (folders != null && listView != null) {
listView.setAdapter(new PhotoAdapter());
listView.setOnItemClickListener(this);
}
}
List<Folder> folders;
class PhotoAdapter extends BaseAdapter {
public PhotoAdapter() {
}
@Override
public int getCount() {
return folders.size();
}
@Override
public Object getItem(int position) {
return folders.get(position);
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Object item = getItem(position);
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.folder_list_thumb, parent, false);
convertView.setTag(R.id.image_view, convertView.findViewById(R.id.image_view));
convertView.setTag(R.id.title, convertView.findViewById(R.id.title));
convertView.setTag(R.id.size, convertView.findViewById(R.id.size));
convertView.setTag(R.id.sub_title, convertView.findViewById(R.id.sub_title));
}
if (convertView.getTag() != item) {
convertView.setTag(item);
renderImageView(convertView);
}
return convertView;
}
}
String previousSet;
@Override
public void onItemClick(final AdapterView<?> arg0, final View convertView, final int arg2, final long arg3) {
if (Utils.isPremium() || Utils.isTrial()) {
if (convertView.getTag() instanceof Folder) {
final Folder folder = (Folder) convertView.getTag();
String title = "Auto-upload " + folder.getName() + " to";
ArrayList<String> itemsList = Lists.newArrayList(DEFAULT_SET, NEW_SET, EXISTING_SET);
if (previousSet != null) {
itemsList.add(PREVIOUS_SET + previousSet);
}
if (folder.isAutoUploaded()) {
itemsList.add(DISABLE_AUTO_UPLOAD);
}
final String[] items = itemsList.toArray(new String[0]);
new AlertDialog.Builder(this).setTitle(title).setPositiveButton(null, null).setNegativeButton(null, null).setCancelable(true).setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String item = items[which];
LOG.debug(item);
if (which <= 2) {
if (item.equals(DEFAULT_SET)) {
setAutoUploaded(folder, STR.instantUpload);
} else if (item.equals(NEW_SET)) {
FlickrUploaderActivity.showNewSetDialog(activity, folder.getName(), new Utils.Callback<String>() {
@Override
public void onResult(String result) {
LOG.debug(result);
if (ToolString.isNotBlank(result)) {
setAutoUploaded(folder, result);
}
}
});
} else if (item.equals(EXISTING_SET)) {
Utils.showExistingSetDialog(activity, new Utils.Callback<String>() {
@Override
public void onResult(String result) {
previousSet = result;
setAutoUploaded(folder, result);
}
}, cachedPhotoSets);
} else {
LOG.error("unknown item:" + item);
}
} else {
if (item.equals(DISABLE_AUTO_UPLOAD)) {
setAutoUploaded(folder, null);
} else if (previousSet != null && item.contains(PREVIOUS_SET) && item.contains(previousSet)) {
setAutoUploaded(folder, previousSet);
} else {
LOG.error("unknown item:" + item);
}
}
}
}).show();
}
} else {
Utils.showPremiumDialog(activity, new Utils.Callback<Boolean>() {
@Override
public void onResult(Boolean result) {
if (result) {
onItemClick(arg0, convertView, arg2, arg3);
}
}
});
}
}
@Background
void setAutoUploaded(Folder folder, String setTitle) {
folder.setFlickrSetTitle(setTitle);
folder.save();
refresh();
}
ProgressDialog progressDialog;
@UiThread
void showLoading(String title, String message) {
if (progressDialog == null) {
progressDialog = new ProgressDialog(this);
}
progressDialog.setTitle(title);
progressDialog.setMessage(message);
progressDialog.setIndeterminate(true);
progressDialog.show();
}
@UiThread
void hideLoading() {
if (progressDialog != null) {
progressDialog.dismiss();
}
}
ExecutorService executorService = Executors.newSingleThreadExecutor();
private void renderImageView(final View convertView) {
if (convertView.getTag() instanceof Folder) {
final Folder folder = (Folder) convertView.getTag();
final CacheableImageView imageView = (CacheableImageView) convertView.getTag(R.id.image_view);
((TextView) convertView.getTag(R.id.title)).setText(folder.getName());
((TextView) convertView.getTag(R.id.size)).setText("(" + folder.getSize() + ")");
String summary;
TextView subTitle = (TextView) convertView.getTag(R.id.sub_title);
String photoSetTitle = folder.getFlickrSetTitle();
if (ToolString.isBlank(photoSetTitle)) {
summary = "not monitored";
subTitle.setTextColor(getResources().getColor(R.color.midgray));
} else {
summary = "⇒ Flickr (" + photoSetTitle + ")";
subTitle.setTextColor(Color.WHITE);
}
subTitle.setText(summary);
final Media media = folder.getMedia();
imageView.setTag(media);
if (media == null) {
imageView.setImageDrawable(null);
} else {
final CacheableBitmapDrawable wrapper = Utils.getCache().getFromMemoryCache(media.getPath() + "_" + VIEW_SIZE.small);
if (wrapper != null && !wrapper.getBitmap().isRecycled()) {
// The cache has it, so just display it
imageView.setImageDrawable(wrapper);
} else {
imageView.setImageDrawable(null);
}
executorService.submit(new Runnable() {
@Override
public void run() {
if (imageView.getTag() == media) {
final CacheableBitmapDrawable bitmapDrawable;
if (wrapper != null && !wrapper.getBitmap().isRecycled()) {
bitmapDrawable = wrapper;
} else {
Bitmap bitmap = Utils.getBitmap(media, VIEW_SIZE.small);
if (bitmap != null) {
bitmapDrawable = Utils.getCache().put(media.getPath() + "_" + VIEW_SIZE.small, bitmap);
} else {
bitmapDrawable = null;
}
}
runOnUiThread(new Runnable() {
@Override
public void run() {
if (imageView.getTag() == media) {
if (wrapper != bitmapDrawable) {
imageView.setImageDrawable(bitmapDrawable);
}
}
}
});
}
}
});
}
}
}
}