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.google.firebase.quickstart.firebasestorage.java; import android.app.ProgressDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; 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.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.quickstart.firebasestorage.R; 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 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; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Initialize Firebase Auth mAuth = FirebaseAuth.getInstance(); // Click listeners findViewById(R.id.buttonCamera).setOnClickListener(this); findViewById(R.id.buttonSignIn).setOnClickListener(this); findViewById(R.id.buttonDownload).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) { 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) { 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(); } } } 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_OPEN_DOCUMENT); 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.layoutSignin).setVisibility(View.GONE); findViewById(R.id.layoutStorage).setVisibility(View.VISIBLE); } else { findViewById(R.id.layoutSignin).setVisibility(View.VISIBLE); findViewById(R.id.layoutStorage).setVisibility(View.GONE); } // Download URL and Download button if (mDownloadUrl != null) { ((TextView) findViewById(R.id.pictureDownloadUri)).setText(mDownloadUrl.toString()); findViewById(R.id.layoutDownload).setVisibility(View.VISIBLE); } else { ((TextView) findViewById(R.id.pictureDownloadUri)).setText(null); findViewById(R.id.layoutDownload).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.buttonCamera) { launchCamera(); } else if (i == R.id.buttonSignIn) { signInAnonymously(); } else if (i == R.id.buttonDownload) { beginDownload(); } } }