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 nazmul.storagesampletest; 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.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.ImageView; import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; 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.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; /** * Activity to upload and download photos from Firebase Storage. * * See {@link MyUploadService} for upload example. * See {@link MyDownloadService} for download example. */ public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final String TAG = "Storage#MainActivity"; private static final int RC_TAKE_PICTURE = 101; private static final int REQUEST_IMAGE_CAPTURE = 1; private DatabaseReference mDatabase; private static final String KEY_FILE_URI = "key_file_uri"; private static final String KEY_DOWNLOAD_URL = "key_download_url"; private BroadcastReceiver mBroadcastReceiver; private ProgressDialog mProgressDialog; private FirebaseAuth mAuth; private Uri mDownloadUrl = null; private Uri mFileUri = null; ImageView camera; private String foodPhotoPath; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView imageView = (ImageView) findViewById(R.id.imageTest); camera = (ImageView) findViewById(R.id.cameraPhoto); Glide.with(this).load( "https://firebasestorage.googleapis.com/v0/b/fir-demo-375a1.appspot.com/o/photos%2Fimage%3A51?alt=media&token=b6c6863a-5225-48ca-9d36-4b7efdcbae98") .into(imageView); // Initialize Firebase Auth mAuth = FirebaseAuth.getInstance(); mDatabase = FirebaseDatabase.getInstance().getReference(); // 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); } onNewIntent(getIntent()); // Local broadcast receiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "onReceive:" + intent); hideProgressDialog(); switch (intent.getAction()) { case MyDownloadService.DOWNLOAD_COMPLETED: // Get number of bytes downloaded 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, intent.getStringExtra(MyDownloadService.EXTRA_DOWNLOAD_PATH))); break; case MyDownloadService.DOWNLOAD_ERROR: // Alert failure showMessageDialog("Error", String.format(Locale.getDefault(), "Failed to download from %s", intent.getStringExtra(MyDownloadService.EXTRA_DOWNLOAD_PATH))); break; case MyUploadService.UPLOAD_COMPLETED: case MyUploadService.UPLOAD_ERROR: onUploadResultIntent(intent); break; } } }; } @Override public void onNewIntent(Intent intent) { super.onNewIntent(intent); // Check if this Activity was launched by clicking on an upload notification if (intent.hasExtra(MyUploadService.EXTRA_DOWNLOAD_URL)) { onUploadResultIntent(intent); } } @Override public void onStart() { super.onStart(); updateUI(mAuth.getCurrentUser()); // Register receiver for uploads and downloads LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this); manager.registerReceiver(mBroadcastReceiver, MyDownloadService.getIntentFilter()); manager.registerReceiver(mBroadcastReceiver, MyUploadService.getIntentFilter()); } @Override public void onStop() { super.onStop(); // Unregister download receiver LocalBroadcastManager.getInstance(this).unregisterReceiver(mBroadcastReceiver); } @Override public void onSaveInstanceState(Bundle 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) { mFileUri = data.getData(); if (mFileUri != null) { uploadFromUri(mFileUri); } else { Log.w(TAG, "File URI is null"); } } else { Toast.makeText(this, "Taking picture failed.", Toast.LENGTH_SHORT).show(); } } else if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { setPic(); if (mFileUri != null) { uploadFromUri(mFileUri); } } } private void setPic() { // Get the dimensions of the View int targetW = camera.getWidth(); int targetH = camera.getHeight(); // Get the dimensions of the bitmap BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inJustDecodeBounds = true; BitmapFactory.decodeFile(foodPhotoPath, bmOptions); int photoW = bmOptions.outWidth; int photoH = bmOptions.outHeight; // Determine how much to scale down the image int scaleFactor = Math.min(photoW / targetW, photoH / targetH); // Decode the image file into a Bitmap sized to fill the View bmOptions.inJustDecodeBounds = false; bmOptions.inSampleSize = scaleFactor; Bitmap mBitmap = BitmapFactory.decodeFile(foodPhotoPath, bmOptions); camera.setImageBitmap(mBitmap); } private void uploadFromUri(Uri fileUri) { Log.d(TAG, "uploadFromUri:src:" + fileUri.toString()); // Save the File URI mFileUri = fileUri; // Clear the last download, if any updateUI(mAuth.getCurrentUser()); mDownloadUrl = null; // Start MyUploadService to upload the file, so that the file is uploaded // even if this Activity is killed or put in the background startService(new Intent(this, MyUploadService.class).putExtra(MyUploadService.EXTRA_FILE_URI, fileUri) .setAction(MyUploadService.ACTION_UPLOAD)); // Show loading spinner showProgressDialog(getString(R.string.progress_uploading)); } private void beginDownload() { // Get path String path = "photos/" + mFileUri.getLastPathSegment(); // Kick off MyDownloadService to download the file Intent intent = new Intent(this, MyDownloadService.class) .putExtra(MyDownloadService.EXTRA_DOWNLOAD_PATH, path).setAction(MyDownloadService.ACTION_DOWNLOAD); startService(intent); // Show loading spinner showProgressDialog(getString(R.string.progress_downloading)); } private void launchCamera() { Log.d(TAG, "launchCamera"); // Pick an image from storage Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); startActivityForResult(intent, RC_TAKE_PICTURE); } private void signInAnonymously() { // Sign in anonymously. Authentication is required to read or write from Firebase Storage. showProgressDialog(getString(R.string.progress_auth)); 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 onUploadResultIntent(Intent intent) { // Got a new intent from MyUploadService with a success or failure mDownloadUrl = intent.getParcelableExtra(MyUploadService.EXTRA_DOWNLOAD_URL); mFileUri = intent.getParcelableExtra(MyUploadService.EXTRA_FILE_URI); updateUI(mAuth.getCurrentUser()); } 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(String caption) { if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(this); mProgressDialog.setIndeterminate(true); } mProgressDialog.setMessage(caption); 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) { launchCamera(); } else if (i == R.id.button_sign_in) { signInAnonymously(); } else if (i == R.id.button_download) { beginDownload(); } } public void save(View view) { FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference myRef = database.getReference("message"); myRef.setValue(mDownloadUrl.toString()); } public void launchCamera(View view) { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // Ensure that there's a camera activity to handle the intent if (takePictureIntent.resolveActivity(getPackageManager()) != null) { // Create the File where the photo should go File photoFile = null; try { photoFile = createImageFile(); } catch (IOException ex) { Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); } // Continue only if the File was successfully created if (photoFile != null) { takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } } } private File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); File image = File.createTempFile(imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); foodPhotoPath = image.getAbsolutePath(); mFileUri = Uri.fromFile(image); return image; } }