package com.hitherejoe.watchtower.ui.activity; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBar; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; import com.hitherejoe.watchtower.R; import com.hitherejoe.watchtower.WatchTowerApplication; import com.hitherejoe.watchtower.data.BusEvent; import com.hitherejoe.watchtower.data.DataManager; import com.hitherejoe.watchtower.data.model.Attachment; import com.hitherejoe.watchtower.data.model.Beacon; import com.hitherejoe.watchtower.data.model.Namespace; import com.hitherejoe.watchtower.data.remote.WatchTowerService; import com.hitherejoe.watchtower.util.DataUtils; import com.hitherejoe.watchtower.util.DialogFactory; import butterknife.Bind; import butterknife.ButterKnife; import retrofit.RetrofitError; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.subscriptions.CompositeSubscription; import timber.log.Timber; public class AddAttachmentActivity extends BaseActivity { @Bind(R.id.spinner_namespace) Spinner mNamespaceSpinner; @Bind(R.id.edit_text_data) EditText mAttachmentDataText; @Bind(R.id.text_data_error_message) TextView mDataErrorText; private DataManager mDataManager; private CompositeSubscription mSubscriptions; private static final String EXTRA_BEACON = "com.hitherejoe.watchtower.ui.activity.UpdateActivity.EXTRA_BEACON"; private Beacon mBeacon; private ProgressDialog mProgressDialog; ArrayAdapter<String> mSpinnerAdapter; public static Intent getStartIntent(Context context, Beacon beacon) { Intent intent = new Intent(context, AddAttachmentActivity.class); intent.putExtra(EXTRA_BEACON, beacon); return intent; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_attachment); ButterKnife.bind(this); mBeacon = getIntent().getParcelableExtra(EXTRA_BEACON); if (mBeacon == null) throw new IllegalArgumentException("Beacon is required!"); mSubscriptions = new CompositeSubscription(); mDataManager = WatchTowerApplication.get(this).getComponent().dataManager(); mSpinnerAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item); mNamespaceSpinner.setAdapter(mSpinnerAdapter); setupActionBar(); getNameSpacesIfNetworkAvailable(); } @Override protected void onDestroy() { super.onDestroy(); mSubscriptions.unsubscribe(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.add_attachment, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_done: validateAttachmentData(); return true; default: return super.onOptionsItemSelected(item); } } private void setupActionBar() { ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); } } private void getNameSpacesIfNetworkAvailable() { if (DataUtils.isNetworkAvailable(this)) { retrieveNamespaces(); } else { Dialog dialog = DialogFactory.createSimpleOkErrorDialog( this, getString(R.string.dialog_error_title), getString(R.string.dialog_error_no_connection) ); dialog.setCanceledOnTouchOutside(true); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { finish(); } }); dialog.show(); } } private void validateAttachmentData() { String data = mAttachmentDataText.getText().toString(); mDataErrorText.setVisibility(data.length() == 0 ? View.VISIBLE : View.GONE); if (data.length() == 0) { DialogFactory.createSimpleOkErrorDialog( this, getString(R.string.dialog_error_title), getString(R.string.dialog_error_blank_data) ).show(); } else if (data.contains(" ")) { DialogFactory.createSimpleOkErrorDialog( this, getString(R.string.dialog_error_title), getString(R.string.dialog_error_invalid_data) ).show(); } else if (data.length() > 0) { //TODO: For example purposes, allow more data types than text to be used Attachment attachment = new Attachment(); attachment.data = DataUtils.base64Encode(data.getBytes()); attachment.namespacedType = mNamespaceSpinner.getSelectedItem() + "/text"; addAttachment(attachment); } } private void retrieveNamespaces() { mProgressDialog = DialogFactory.createProgressDialog(this, R.string.progress_dialog_retrieving_namespaces); mProgressDialog.show(); mSubscriptions.add(mDataManager.getNamespaces() .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(mDataManager.getScheduler()) .subscribe(new Subscriber<WatchTowerService.NamespacesResponse>() { @Override public void onCompleted() { mProgressDialog.dismiss(); } @Override public void onError(Throwable error) { mProgressDialog.dismiss(); Timber.e("There was an error retrieving the namespaces " + error); if (error instanceof RetrofitError) { DialogFactory.createRetrofitErrorDialog( AddAttachmentActivity.this, (RetrofitError) error).show(); } else { DialogFactory.createSimpleErrorDialog( AddAttachmentActivity.this).show(); } } @Override public void onNext(WatchTowerService.NamespacesResponse namespacesResponse) { for (Namespace namespace : namespacesResponse.namespaces) { mSpinnerAdapter.add(namespace.namespaceName); } } })); } private void addAttachment(Attachment attachment) { if (DataUtils.isNetworkAvailable(this)) { showProgressDialog(R.string.progress_dialog_adding_attachment); mSubscriptions.add(mDataManager.createAttachment(mBeacon.beaconName, attachment) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(mDataManager.getScheduler()) .subscribe(new Subscriber<Attachment>() { @Override public void onCompleted() { mProgressDialog.dismiss(); WatchTowerApplication.get(AddAttachmentActivity.this) .getComponent().eventBus().post(new BusEvent.AttachmentAdded()); finish(); } @Override public void onError(Throwable error) { mProgressDialog.dismiss(); Timber.e("There was a problem adding the attachment " + error); if (error instanceof RetrofitError) { DialogFactory.createRetrofitErrorDialog( AddAttachmentActivity.this, (RetrofitError) error).show(); } else { DialogFactory.createSimpleErrorDialog( AddAttachmentActivity.this).show(); } } @Override public void onNext(Attachment attachment) { } })); } else { DialogFactory.createSimpleOkErrorDialog( this, getString(R.string.dialog_error_title), getString(R.string.dialog_error_no_connection) ).show(); } } private void showProgressDialog(int messageResourceId) { mProgressDialog = DialogFactory.createProgressDialog(this, messageResourceId); mProgressDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { mSubscriptions.unsubscribe(); } }); mProgressDialog.show(); } }