package se.alexanderblom.delicious.ui;
import se.alexanderblom.delicious.BookmarkService;
import se.alexanderblom.delicious.DeliciousApplication;
import se.alexanderblom.delicious.R;
import se.alexanderblom.delicious.fragments.ProgressDialogFragment;
import se.alexanderblom.delicious.helpers.TitleFetcher;
import se.alexanderblom.delicious.util.DetachableResultReceiver;
import android.app.FragmentManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Patterns;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.MultiAutoCompleteTextView;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
public class AddBookmarkActivity extends BaseActivity implements DetachableResultReceiver.Receiver {
private static final String DIALOG_TAG = "saving_link";
private EditText urlView;
private EditText titleView;
private EditText notesView;
private MultiAutoCompleteTextView tagsView;
private CheckBox privateView;
private DetachableResultReceiver receiver;
private TitleFetcher titleFetcher;
private Drawable errorDrawable;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_bookmark);
setTitle(R.string.activity_add_bookmark_title);
// Enable up button
getActionBar().setHomeButtonEnabled(true);
errorDrawable = DeliciousApplication.getErrorDrawable();
titleFetcher = new TitleFetcher(this);
receiver = new DetachableResultReceiver(new Handler());
urlView = (EditText) findViewById(R.id.url);
titleView = (EditText) findViewById(R.id.title);
notesView = (EditText) findViewById(R.id.notes);
tagsView = (MultiAutoCompleteTextView) findViewById(R.id.tags);
privateView = (CheckBox) findViewById(R.id.mark_private);
// TODO: Implement tag suggestion
/*ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_dropdown_item, TAGS);
tagsView.setAdapter(adapter);
tagsView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());*/
// Enable user to press enter when done
tagsView.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
saveBookmark();
return true;
} else {
return false;
}
}
});
Intent intent = getIntent();
if (Intent.ACTION_SEND.equals(intent.getAction())) {
String url = intent.getStringExtra(Intent.EXTRA_TEXT);
String title = intent.getStringExtra(Intent.EXTRA_SUBJECT);
urlView.setText(url);
titleView.setText(title);
// Check were focus should go
if (TextUtils.isEmpty(url)) {
urlView.requestFocus();
} else if (TextUtils.isEmpty(title)) {
titleView.requestFocus();
} else {
// Focus tags because it can't be prefilled
tagsView.requestFocus();
}
}
// Fetch title if necessary
titleFetcher.maybeFetchTitle();
}
@Override
protected void onPause() {
super.onPause();
// Clear receiver so no leaks
receiver.setReceiver(null);
}
@Override
protected void onResume() {
super.onResume();
receiver.setReceiver(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_add_bookmark, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
startActivity(new Intent(this, MainActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_SINGLE_TOP
| Intent.FLAG_ACTIVITY_NEW_TASK));
finish();
case R.id.menu_cancel:
finish();
break;
case R.id.menu_save:
saveBookmark();
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
private boolean isValidBookmark() {
boolean valid = true;
String url = urlView.getText().toString();
String title = titleView.getText().toString();
if (TextUtils.isEmpty(url)) {
valid = false;
urlView.setError(getString(R.string.field_empty_error, getString(R.string.field_url)), errorDrawable);
} else if (!Patterns.WEB_URL.matcher(url).find()) {
valid = false;
urlView.setError(getString(R.string.field_url_error), errorDrawable);
}
if (TextUtils.isEmpty(title)) {
valid = false;
titleView.setError(getString(R.string.field_empty_error, getString(R.string.field_title)), errorDrawable);
}
return valid;
}
private void saveBookmark() {
if (!isValidBookmark()) {
return;
}
// Hide keyboard
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
FragmentManager fm = getFragmentManager();
ProgressDialogFragment dialog = ProgressDialogFragment.newInstance(getString(R.string.dialog_saving_message));
dialog.setCancelable(false);
dialog.show(fm, DIALOG_TAG);
String url = urlView.getText().toString().trim();
String title = titleView.getText().toString().trim();
String notes = notesView.getText().toString().trim();
String tags = tagsView.getText().toString().trim();
boolean markedPrivate = privateView.isChecked();
Intent intent = new Intent(BookmarkService.ACTION_SAVE_BOOKMARK, null, this, BookmarkService.class)
.putExtra(BookmarkService.EXTRA_URL, url)
.putExtra(BookmarkService.EXTRA_TITLE, title)
.putExtra(BookmarkService.EXTRA_NOTES, notes)
.putExtra(BookmarkService.EXTRA_TAGS, tags)
.putExtra(BookmarkService.EXTRA_SHARED, !markedPrivate)
.putExtra(BookmarkService.EXTRA_RECEIVER, receiver);
startService(intent);
}
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
if (resultCode == BookmarkService.RESULT_SUCCESSFULL) {
// Bookmark was successfully saved, we can safely exit
finish();
} else {
ProgressDialogFragment dialog = (ProgressDialogFragment) getFragmentManager().findFragmentByTag(DIALOG_TAG);
dialog.dismiss();
}
}
}