/* This file is part of BeepMe. BeepMe is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. BeepMe is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with BeepMe. If not, see <http://www.gnu.org/licenses/>. Copyright 2012-2014 Michael Glanznig http://beepme.yourexp.at */ package com.glanznig.beepme.view; import java.io.File; import java.lang.ref.WeakReference; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.Locale; import com.glanznig.beepme.BeeperApp; import com.glanznig.beepme.R; import com.glanznig.beepme.TagAutocompleteAdapter; import com.glanznig.beepme.data.Sample; import com.glanznig.beepme.data.Tag; import com.glanznig.beepme.db.SampleTable; import com.glanznig.beepme.helper.AsyncImageScaler; import com.glanznig.beepme.helper.PhotoUtils; import android.app.ActionBar; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Handler.Callback; import android.os.Message; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.AutoCompleteTextView; import android.widget.EditText; import android.widget.PopupMenu; import android.widget.TextView; import android.widget.Toast; public class NewSampleActivity extends Activity implements OnClickListener, PopupMenu.OnMenuItemClickListener, Callback { private static final String TAG = "NewSampleActivity"; private Sample sample = new Sample(); private SamplePhotoView photoView = null; private static class ImgLoadHandler extends Handler { WeakReference<SamplePhotoView> view; ImgLoadHandler(SamplePhotoView view) { this.view = new WeakReference<SamplePhotoView>(view); } @Override public void handleMessage(Message msg) { if (msg.what == PhotoUtils.MSG_PHOTO_LOADED) { Bitmap imageBitmap = (Bitmap)msg.obj; if (view.get() != null && imageBitmap != null) { view.get().setPhoto(imageBitmap); } } } } @Override public void onCreate(Bundle savedState) { super.onCreate(savedState); final LayoutInflater inflater = (LayoutInflater) getActionBar().getThemedContext().getSystemService(LAYOUT_INFLATER_SERVICE); final View customActionBarView = inflater.inflate(R.layout.actionbar_custom_done, null); customActionBarView.findViewById(R.id.actionbar_done).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { onClickDone(v); } }); // Show the custom action bar view and hide the normal Home icon and title. final ActionBar actionBar = getActionBar(); actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); actionBar.setCustomView(customActionBarView); setContentView(R.layout.new_sample); SampleTable st = new SampleTable(this.getApplicationContext()); if (savedState != null) { if (savedState.getLong("sampleId") != 0L) { sample = st.getSampleWithTags(savedState.getLong("sampleId")); } if (savedState.getLong("timestamp") != 0L) { sample.setTimestamp(new Date(savedState.getLong("timestamp"))); } if (savedState.getCharSequence("title") != null) { sample.setTitle(savedState.getCharSequence("title").toString()); } if (savedState.getCharSequence("description") != null) { sample.setDescription(savedState.getCharSequence("description").toString()); } if (savedState.getCharSequence("imgUri") != null) { sample.setPhotoUri(savedState.getCharSequence("imgUri").toString()); } if (savedState.getCharSequence("keyword") != null) { EditText keyword = (EditText)findViewById(R.id.new_sample_add_keyword); keyword.setText(savedState.getCharSequence("keyword")); } if (savedState.getStringArrayList("tagList") != null) { Iterator<String> i = savedState.getStringArrayList("tagList").iterator(); while (i.hasNext()) { Tag t = Tag.valueOf(i.next()); if (t != null) { sample.addTag(t); } } } } else { Bundle b = getIntent().getExtras(); if (b != null) { if (b.containsKey(getApplication().getClass().getPackage().getName() + ".Timestamp")) { long timestamp = b.getLong(getApplication().getClass().getPackage().getName() + ".Timestamp"); sample.setTimestamp(new Date(timestamp)); sample.setAccepted(true); sample = st.addSample(sample); } } } } @Override public void onResume() { super.onResume(); populateFields(); } private void populateFields() { photoView = (SamplePhotoView)findViewById(R.id.new_sample_photoview); //check if device has camera feature if (!PhotoUtils.isEnabled(NewSampleActivity.this)) { photoView.setVisibility(View.GONE); } else { photoView.setVisibility(View.VISIBLE); photoView.setOnMenuItemClickListener(NewSampleActivity.this); String thumbnailUri = PhotoUtils.getThumbnailUri(sample.getPhotoUri(), 48); if (thumbnailUri != null) { File thumb = new File(thumbnailUri); if (thumb.exists()) { ImgLoadHandler handler = new ImgLoadHandler(photoView); PhotoUtils.getAsyncBitmap(NewSampleActivity.this, thumbnailUri, handler); } } } setTitle(R.string.new_sample); if (sample.getTimestamp() != null) { TextView timestamp = (TextView)findViewById(R.id.new_sample_timestamp); DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); timestamp.setText(dateFormat.format(sample.getTimestamp())); } if (sample.getTitle() != null) { EditText titleWidget = (EditText)findViewById(R.id.new_sample_title); titleWidget.setText(sample.getTitle()); } if (sample.getDescription() != null) { EditText descriptionWidget = (EditText)findViewById(R.id.new_sample_description); descriptionWidget.setText(sample.getDescription()); } AutoCompleteTextView autocompleteTags = (AutoCompleteTextView)findViewById(R.id.new_sample_add_keyword); TagAutocompleteAdapter adapterKeywords = new TagAutocompleteAdapter(NewSampleActivity.this, R.layout.tag_autocomplete_list_row, 1); autocompleteTags.setAdapter(adapterKeywords); //after how many chars should auto-complete list appear? autocompleteTags.setThreshold(2); TagButtonContainer keywordHolder = (TagButtonContainer)findViewById(R.id.new_sample_keyword_container); keywordHolder.setVocabularyId(1); Iterator<Tag> i = sample.getTags().iterator(); Tag tag = null; while (i.hasNext()) { tag = i.next(); if (tag.getVocabularyId() == 1) { keywordHolder.addTagButton(tag.getName(), this); } } } public void onClickAddKeyword(View view) { TagButtonContainer tagHolder = (TagButtonContainer)findViewById(R.id.new_sample_keyword_container); EditText enteredTag = (EditText)findViewById(R.id.new_sample_add_keyword); if (enteredTag.getText().length() > 0) { Tag t = new Tag(); t.setVocabularyId(tagHolder.getVocabularyId()); t.setName(enteredTag.getText().toString().toLowerCase(Locale.getDefault())); if (sample.addTag(t)) { tagHolder.addTagButton(t.getName(), this); enteredTag.setText(""); } else { Toast.makeText(getApplicationContext(), R.string.new_sample_add_tag_error, Toast.LENGTH_SHORT).show(); } } } public void onClickRemoveTag(View view) { if (view instanceof TagButton) { TagButton btn = (TagButton)view; TagButtonContainer tagHolder = null; if (btn.getVocabularyId() == 1) { tagHolder = (TagButtonContainer)findViewById(R.id.new_sample_keyword_container); } Tag t = new Tag(); t.setName((btn.getText()).toString()); t.setVocabularyId(btn.getVocabularyId()); tagHolder.removeTagButton(btn); sample.removeTag(t); } } public void onClickDone(View view) { saveSample(); finish(); } public void saveSample() { BeeperApp app = (BeeperApp)getApplication(); EditText title = (EditText)findViewById(R.id.new_sample_title); EditText description = (EditText)findViewById(R.id.new_sample_description); sample.setTitle(title.getText().toString()); sample.setDescription(description.getText().toString()); sample.setUptimeId(app.getPreferences().getUptimeId()); // also save non-added keywords TagButtonContainer keywordTagHolder = (TagButtonContainer)findViewById(R.id.new_sample_keyword_container); EditText keyword = (EditText)findViewById(R.id.new_sample_add_keyword); if (keyword.getText().length() > 0) { Tag t = new Tag(); t.setVocabularyId(keywordTagHolder.getVocabularyId()); t.setName(keyword.getText().toString().toLowerCase(Locale.getDefault())); sample.addTag(t); } new SampleTable(this.getApplicationContext()).editSample(sample); app.setTimer(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case PhotoUtils.TAKE_PHOTO_INTENT: if (resultCode == Activity.RESULT_OK) { Handler handler = new Handler(NewSampleActivity.this); PhotoUtils.generateThumbnails(NewSampleActivity.this, sample.getPhotoUri(), handler); } else { sample.setPhotoUri(null); } break; case PhotoUtils.CHANGE_PHOTO_INTENT: if (resultCode == Activity.RESULT_OK) { if (PhotoUtils.swapPhoto(NewSampleActivity.this, sample.getTimestamp())) { Handler handler = new Handler(NewSampleActivity.this); PhotoUtils.regenerateThumbnails(NewSampleActivity.this, sample.getPhotoUri(), handler); } } else { PhotoUtils.deleteSwapPhoto(NewSampleActivity.this); } break; } } @Override public void onSaveInstanceState(Bundle savedState) { EditText title = (EditText)findViewById(R.id.new_sample_title); EditText description = (EditText)findViewById(R.id.new_sample_description); EditText keyword = (EditText)findViewById(R.id.new_sample_add_keyword); if (sample.getTimestamp() != null) { savedState.putLong("timestamp", sample.getTimestamp().getTime()); } savedState.putLong("sampleId", sample.getId()); savedState.putCharSequence("title", title.getText()); savedState.putCharSequence("description", description.getText()); savedState.putBoolean("accepted", sample.getAccepted()); savedState.putCharSequence("imgUri", sample.getPhotoUri()); if (keyword.getText().length() > 0) { savedState.putCharSequence("keyword", keyword.getText()); } if (sample.getTags().size() > 0) { Iterator<Tag> i = sample.getTags().iterator(); ArrayList<String> tags = new ArrayList<String>(); while (i.hasNext()) { tags.add(i.next().toString()); } savedState.putStringArrayList("tagList", tags); } } @Override public void onClick(View v) { if (v.getParent() instanceof TagButtonContainer) { onClickRemoveTag(v); } } @Override public void onBackPressed() { AlertDialog.Builder sampleSavedBuilder = new AlertDialog.Builder(NewSampleActivity.this); sampleSavedBuilder.setTitle(R.string.new_sample_back_warning_title); sampleSavedBuilder.setMessage(R.string.new_sample_back_warning_msg); sampleSavedBuilder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { NewSampleActivity.this.saveSample(); NewSampleActivity.this.finish(); } }); sampleSavedBuilder.setNegativeButton(R.string.no, null); sampleSavedBuilder.create().show(); } @Override public void onStop() { super.onStop(); if (NewSampleActivity.this.isFinishing()) { NewSampleActivity.this.saveSample(); } } @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.action_take_photo: Intent takePhoto = PhotoUtils.getTakePhotoIntent(NewSampleActivity.this, sample.getTimestamp()); if (takePhoto != null) { Bundle extras = takePhoto.getExtras(); Uri photoUri = (Uri)extras.get(PhotoUtils.EXTRA_KEY); sample.setPhotoUri(photoUri.getPath()); startActivityForResult(takePhoto, PhotoUtils.TAKE_PHOTO_INTENT); } break; case R.id.action_change_photo: Intent changePhoto = PhotoUtils.getChangePhotoIntent(NewSampleActivity.this); if (changePhoto != null) { startActivityForResult(changePhoto, PhotoUtils.CHANGE_PHOTO_INTENT); } break; case R.id.action_delete_photo: AlertDialog.Builder deleteBuilder = new AlertDialog.Builder(NewSampleActivity.this); deleteBuilder.setTitle(R.string.photo_delete_warning_title); deleteBuilder.setMessage(R.string.photo_delete_warning_msg); deleteBuilder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // delete photo on storage PhotoUtils.deletePhoto(NewSampleActivity.this, sample.getPhotoUri()); sample.setPhotoUri(null); photoView.unsetPhoto(); } }); deleteBuilder.setNegativeButton(R.string.no, null); deleteBuilder.create().show(); break; } return true; } @Override public boolean handleMessage(Message msg) { if (msg.what == AsyncImageScaler.MSG_SUCCESS) { Bitmap photoBitmap = (Bitmap)msg.obj; if (photoBitmap != null && msg.arg1 == 48) { photoView.setPhoto(photoBitmap); return true; } } if (msg.what == AsyncImageScaler.MSG_ERROR) { // error handling } return false; } }