Java tutorial
/** * Copyright 2016 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.rerum.beans; import android.Manifest; import android.app.ProgressDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.v4.content.FileProvider; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.storage.FirebaseStorage; import com.google.firebase.storage.StorageReference; import com.google.firebase.storage.UploadTask; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Locale; import java.util.UUID; import pub.devrel.easypermissions.AfterPermissionGranted; import pub.devrel.easypermissions.EasyPermissions; public class StorageActivity extends AppCompatActivity implements View.OnClickListener, EasyPermissions.PermissionCallbacks { private static final String TAG = "Storage#MainActivity"; private static final int RC_TAKE_PICTURE = 101; private static final int RC_STORAGE_PERMS = 102; private static final String KEY_FILE_URI = "key_file_uri"; private static final String KEY_DOWNLOAD_URL = "key_download_url"; private final int SELECT_PHOTO = 2; private BroadcastReceiver mDownloadReceiver; private ProgressDialog mProgressDialog; private FirebaseAuth mAuth; private Uri mDownloadUrl = null; private Uri mFileUri = null; // [START declare_ref] private StorageReference mStorageRef; // [END declare_ref] @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_storage); // Initialize Firebase Auth mAuth = FirebaseAuth.getInstance(); // Initialize Firebase Storage Ref // [START get_storage_ref] mStorageRef = FirebaseStorage.getInstance().getReference(); // [END get_storage_ref] // Click listeners findViewById(R.id.button_camera).setOnClickListener(this); findViewById(R.id.button_sign_in).setOnClickListener(this); findViewById(R.id.button_download).setOnClickListener(this); // Restore instance state if (savedInstanceState != null) { mFileUri = savedInstanceState.getParcelable(KEY_FILE_URI); mDownloadUrl = savedInstanceState.getParcelable(KEY_DOWNLOAD_URL); } // Download receiver mDownloadReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "downloadReceiver:onReceive:" + intent); hideProgressDialog(); if (MyDownloadService.ACTION_COMPLETED.equals(intent.getAction())) { String path = intent.getStringExtra(MyDownloadService.EXTRA_DOWNLOAD_PATH); long numBytes = intent.getLongExtra(MyDownloadService.EXTRA_BYTES_DOWNLOADED, 0); // Alert success showMessageDialog(getString(R.string.success), String.format(Locale.getDefault(), "%d bytes downloaded from %s", numBytes, path)); } if (MyDownloadService.ACTION_ERROR.equals(intent.getAction())) { String path = intent.getStringExtra(MyDownloadService.EXTRA_DOWNLOAD_PATH); // Alert failure showMessageDialog("Error", String.format(Locale.getDefault(), "Failed to download from %s", path)); } } }; } @Override public void onStart() { super.onStart(); updateUI(mAuth.getCurrentUser()); // Register download receiver LocalBroadcastManager.getInstance(this).registerReceiver(mDownloadReceiver, MyDownloadService.getIntentFilter()); } @Override public void onStop() { super.onStop(); // Unregister download receiver LocalBroadcastManager.getInstance(this).unregisterReceiver(mDownloadReceiver); } @Override public void onSaveInstanceState(Bundle out) { super.onSaveInstanceState(out); out.putParcelable(KEY_FILE_URI, mFileUri); out.putParcelable(KEY_DOWNLOAD_URL, mDownloadUrl); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(TAG, "onActivityResult:" + requestCode + ":" + resultCode + ":" + data); if (requestCode == RC_TAKE_PICTURE) { if (resultCode == RESULT_OK) { if (mFileUri != null) { uploadFromUri(mFileUri); } else { Log.w(TAG, "File URI is null"); } } else { Toast.makeText(this, "Taking picture failed.", Toast.LENGTH_SHORT).show(); } } if (requestCode == SELECT_PHOTO) { if (resultCode == RESULT_OK) { try { final Uri imageUri = data.getData(); final InputStream imageStream = getContentResolver().openInputStream(imageUri); final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream); //imageView.setImageBitmap(selectedImage); uploadFromUri(imageUri); } catch (FileNotFoundException e) { e.printStackTrace(); } } } } // [START upload_from_uri] private void uploadFromUri(Uri fileUri) { Log.d(TAG, "uploadFromUri:src:" + fileUri.toString()); // [START get_child_ref] // Get a reference to store file at photos/<FILENAME>.jpg final StorageReference photoRef = mStorageRef.child("photos").child(fileUri.getLastPathSegment()); // [END get_child_ref] // Upload file to Firebase Storage // [START_EXCLUDE] showProgressDialog(); // [END_EXCLUDE] Log.d(TAG, "uploadFromUri:dst:" + photoRef.getPath()); photoRef.putFile(fileUri).addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { // Upload succeeded Log.d(TAG, "uploadFromUri:onSuccess"); // Get the public download URL mDownloadUrl = taskSnapshot.getMetadata().getDownloadUrl(); // [START_EXCLUDE] hideProgressDialog(); updateUI(mAuth.getCurrentUser()); // [END_EXCLUDE] } }).addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { // Upload failed Log.w(TAG, "uploadFromUri:onFailure", exception); mDownloadUrl = null; // [START_EXCLUDE] hideProgressDialog(); Toast.makeText(StorageActivity.this, "Error: upload failed", Toast.LENGTH_SHORT).show(); updateUI(mAuth.getCurrentUser()); // [END_EXCLUDE] } }); } // [END upload_from_uri] @AfterPermissionGranted(RC_STORAGE_PERMS) private void launchCamera() { Log.d(TAG, "launchCamera"); // Check that we have permission to read images from external storage. String perm = Manifest.permission.WRITE_EXTERNAL_STORAGE; if (!EasyPermissions.hasPermissions(this, perm)) { EasyPermissions.requestPermissions(this, getString(R.string.rationale_storage), RC_STORAGE_PERMS, perm); return; } // Choose file storage location, must be listed in res/xml/file_paths.xml File dir = new File(Environment.getExternalStorageDirectory() + "/photos"); File file = new File(dir, UUID.randomUUID().toString() + ".jpg"); try { // Create directory if it does not exist. if (!dir.exists()) { dir.mkdir(); } boolean created = file.createNewFile(); Log.d(TAG, "file.createNewFile:" + file.getAbsolutePath() + ":" + created); } catch (IOException e) { Log.e(TAG, "file.createNewFile" + file.getAbsolutePath() + ":FAILED", e); } // Create content:// URI for file, required since Android N // See: https://developer.android.com/reference/android/support/v4/content/FileProvider.html mFileUri = FileProvider.getUriForFile(this, "com.google.firebase.quickstart.firebasestorage.fileprovider", file); // Create and launch the intent Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mFileUri); startActivityForResult(takePictureIntent, RC_TAKE_PICTURE); } private void signInAnonymously() { // Sign in anonymously. Authentication is required to read or write from Firebase Storage. showProgressDialog(); mAuth.signInAnonymously().addOnSuccessListener(this, new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { Log.d(TAG, "signInAnonymously:SUCCESS"); hideProgressDialog(); updateUI(authResult.getUser()); } }).addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { Log.e(TAG, "signInAnonymously:FAILURE", exception); hideProgressDialog(); updateUI(null); } }); } private void beginDownload() { // Get path String path = "photos/" + mFileUri.getLastPathSegment(); // Kick off download service Intent intent = new Intent(this, MyDownloadService.class); intent.setAction(MyDownloadService.ACTION_DOWNLOAD); intent.putExtra(MyDownloadService.EXTRA_DOWNLOAD_PATH, path); startService(intent); // Show loading spinner showProgressDialog(); } private void updateUI(FirebaseUser user) { // Signed in or Signed out if (user != null) { findViewById(R.id.layout_signin).setVisibility(View.GONE); findViewById(R.id.layout_storage).setVisibility(View.VISIBLE); } else { findViewById(R.id.layout_signin).setVisibility(View.VISIBLE); findViewById(R.id.layout_storage).setVisibility(View.GONE); } // Download URL and Download button if (mDownloadUrl != null) { ((TextView) findViewById(R.id.picture_download_uri)).setText(mDownloadUrl.toString()); findViewById(R.id.layout_download).setVisibility(View.VISIBLE); } else { ((TextView) findViewById(R.id.picture_download_uri)).setText(null); findViewById(R.id.layout_download).setVisibility(View.GONE); } } private void showMessageDialog(String title, String message) { AlertDialog ad = new AlertDialog.Builder(this).setTitle(title).setMessage(message).create(); ad.show(); } private void showProgressDialog() { if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(this); mProgressDialog.setMessage("Loading..."); mProgressDialog.setIndeterminate(true); } mProgressDialog.show(); } private void hideProgressDialog() { if (mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.dismiss(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int i = item.getItemId(); if (i == R.id.action_logout) { FirebaseAuth.getInstance().signOut(); updateUI(null); return true; } else { return super.onOptionsItemSelected(item); } } @Override public void onClick(View v) { int i = v.getId(); if (i == R.id.button_camera) { Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); startActivityForResult(photoPickerIntent, SELECT_PHOTO); //launchCamera(); } else if (i == R.id.button_sign_in) { signInAnonymously(); } else if (i == R.id.button_download) { beginDownload(); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } @Override public void onPermissionsGranted(int requestCode, List<String> perms) { } @Override public void onPermissionsDenied(int requestCode, List<String> perms) { } }