package br.com.nglauber.livrosfirebase; import android.app.ProgressDialog; import android.content.Intent; import android.databinding.DataBindingUtil; import android.databinding.ObservableArrayList; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.text.format.DateFormat; import android.view.MenuItem; import android.view.View; import android.widget.CompoundButton; import android.widget.Toast; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.database.ChildEventListener; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.storage.FirebaseStorage; import com.google.firebase.storage.StorageReference; import com.google.firebase.storage.UploadTask; import java.io.File; import java.util.Date; import br.com.nglauber.livrosfirebase.databinding.ActivityDetailEditBinding; import br.com.nglauber.livrosfirebase.model.Book; import br.com.nglauber.livrosfirebase.model.MediaType; import br.com.nglauber.livrosfirebase.model.Publisher; import br.com.nglauber.livrosfirebase.utils.Constants; import br.com.nglauber.livrosfirebase.utils.Permission; public class DetailEditActivity extends BaseActivity { public static final String EXTRA_BOOK = "livro"; private static final int RC_CAMERA = 0; private DatabaseReference mBooksNodeRef; private DatabaseReference mPublishersNodeRef; private StorageReference mStorageRef; private ActivityDetailEditBinding mBinding; private boolean mIsNewBook; private File mTempImagePath; private ProgressDialog mProgress; @Override protected void init() { mBinding = DataBindingUtil.setContentView(this, R.layout.activity_detail_edit); setSupportActionBar(mBinding.toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); final Book book = (Book)getIntent().getSerializableExtra(EXTRA_BOOK); mIsNewBook = (book == null); if (mIsNewBook) { mBinding.setBook(new Book()); } else { mBinding.setBook(book); } mBinding.setPresenter(this); mBinding.content.setPublishers(new ObservableArrayList<Publisher>()); initFirebase(); loadPublishers(); } @Override protected void onActivityResult( int requestCode, int resultCode, Intent data) { super.onActivityResult( requestCode, resultCode, data); if (resultCode == RESULT_OK && requestCode == 0) { mBinding.getBook().setCoverUrl("file://"+ mTempImagePath.getAbsolutePath()); } } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home){ finish(); } return super.onOptionsItemSelected(item); } public void clickSaveBook(View view) { mProgress = ProgressDialog.show(this, null, getString(R.string.text_message_saving_book)); if (mTempImagePath != null && mTempImagePath.exists()) { uploadCoverAndSaveBook(); } else { saveBook(); } } private void uploadCoverAndSaveBook() { StorageReference capaRef = mStorageRef.child(mTempImagePath.getName()); UploadTask uploadTask = capaRef.putFile(Uri.fromFile(mTempImagePath)); uploadTask.addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { mProgress.hide(); Toast.makeText(DetailEditActivity.this, R.string.text_message_saving_book_error, Toast.LENGTH_SHORT).show(); } }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { if (mTempImagePath != null && mTempImagePath.exists()) mTempImagePath.delete(); Uri downloadUrl = taskSnapshot.getDownloadUrl(); mBinding.getBook().setCoverUrl(downloadUrl.toString()); saveBook(); } }); } private void saveBook(){ mProgress.dismiss(); Book book = mBinding.getBook(); if (mIsNewBook) { mBooksNodeRef.push().setValue(book); } else { mBooksNodeRef.child(book.getId()).setValue(book); } finish(); } public void clickTakePhoto(View view) { if (Permission.hasStoragePermission(this)) { String fileName = DateFormat.format(Constants.TEMP_FILE_FORMAT, new Date()).toString(); mTempImagePath = new File( Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), fileName +".jpg"); Intent it = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); it.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTempImagePath)); startActivityForResult(it, RC_CAMERA); } else { Permission.requestStoragePermission(this, 0); } } public void onMediaTypeChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { if (buttonView == mBinding.content.radioMediaEbook) { mBinding.getBook().setMediaTypeValue(MediaType.EBOOK); } else if (buttonView == mBinding.content.radioMediaPaper) { mBinding.getBook().setMediaTypeValue(MediaType.PAPER); } } } private void initFirebase() { FirebaseDatabase database = FirebaseDatabase.getInstance(); mBooksNodeRef = database.getReference(Constants.BOOK_REFERENCE).child(getAuth().getCurrentUser().getUid()); mPublishersNodeRef = database.getReference(Constants.PUBLISHERS_REFERENCE); FirebaseStorage storage = FirebaseStorage.getInstance(); mStorageRef = storage.getReferenceFromUrl(Constants.STORAGE_REFERENCE_URL ).child("images"); } private void loadPublishers() { mPublishersNodeRef.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { Publisher publisher = dataSnapshot.getValue(Publisher.class); publisher.setId(dataSnapshot.getKey()); mBinding.content.getPublishers().add(publisher); mBinding.content.spinnerPublisher.setSelection( mBinding.content.getPublishers().indexOf( mBinding.getBook().getPublisher())); } @Override public void onChildChanged(DataSnapshot dataSnapshot, String s) { Publisher publisher = dataSnapshot.getValue(Publisher.class); publisher.setId(dataSnapshot.getKey()); for (Publisher p : mBinding.content.getPublishers()) { if (p.getId().equals(publisher.getId())) { p.setName(publisher.getName()); break; } } } @Override public void onChildRemoved(DataSnapshot dataSnapshot) { Publisher publisher = dataSnapshot.getValue(Publisher.class); publisher.setId(dataSnapshot.getKey()); for (int i = 0; i < mBinding.content.getPublishers().size(); i++) { if (mBinding.content.getPublishers().get(i).getId().equals(publisher.getId())) { mBinding.content.getPublishers().remove(i); break; } } } @Override public void onChildMoved(DataSnapshot dataSnapshot, String s) { // Ignore... } @Override public void onCancelled(DatabaseError databaseError) { // Ignore } }); } }