Skip to content

Instantly share code, notes, and snippets.

@pedromaironi
Created February 28, 2021 01:09
Show Gist options
  • Save pedromaironi/6aee75935ff773a572e47ffd22d555a2 to your computer and use it in GitHub Desktop.
Save pedromaironi/6aee75935ff773a572e47ffd22d555a2 to your computer and use it in GitHub Desktop.
package com.pedrodev.appchat.activities;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;
import android.Manifest;
import android.app.AlertDialog;
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.webkit.MimeTypeMap;
import android.webkit.URLUtil;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.android.material.textfield.TextInputEditText;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestoreException;
import com.google.firebase.firestore.ListenerRegistration;
import com.pedrodev.appchat.R;
import com.pedrodev.appchat.models.User;
import com.pedrodev.appchat.providers.AuthProvider;
import com.pedrodev.appchat.providers.VersionProvider;
import com.pedrodev.appchat.providers.UsersProvider;
import java.io.File;
import java.lang.reflect.Method;
import dmax.dialog.SpotsDialog;
public class MainActivity extends AppCompatActivity{
TextView mTextViewRegister;
TextInputEditText mTextInputEmail;
TextInputEditText mTextInputPassword;
Button mButtonLogin;
AuthProvider mAuthProvider;
SignInButton mButtonGoogle;
GoogleSignInClient mGoogleSignInClient;
UsersProvider mUsersProvider;
VersionProvider mVersionProvider;
private final int REQUEST_CODE_GOOGLE = 1;
AlertDialog mDialog;
AlertDialog dialog;
DownloadManager mDowloadManager;
long enqueue;
static String DOWNLOAD_URL = "";
DownloadManager.Request request;
final int WRITE_EXTERNAL_STORAGE_REQUEST_CODE = 95;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextViewRegister = findViewById(R.id.btnRegisterHere);
mTextInputEmail = findViewById(R.id.textInputEmail);
mTextInputPassword = findViewById(R.id.textInputPassword);
mButtonLogin = findViewById(R.id.btnLogin);
mButtonGoogle = findViewById(R.id.signInButtonGoogle);
mAuthProvider = new AuthProvider();
mDialog = new SpotsDialog.Builder()
.setContext(this)
.setMessage("Espere un momento")
.setCancelable(false).build();
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
mUsersProvider = new UsersProvider();
mButtonGoogle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
signInGoogle();
}
});
mButtonLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
login();
}
});
mTextViewRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, RegisterActivity.class);
startActivity(intent);
}
});
// Update app - check the version
mVersionProvider = new VersionProvider();
UpdateApp();
}
public void UpdateApp() {
mVersionProvider.getVersion().addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.exists()) {
try {
int versionCode = 0;
String versionName = "";
String _versionCodeFB = snapshot.child("Version").child("versionApp").getValue(String.class);
String _versionNameFB = snapshot.child("Version").child("versionName").getValue(String.class);
String _urlApkFB = snapshot.child("Version").child("urlApk").getValue(String.class);
/* Get android:versionName */
versionName = MainActivity.this.getPackageManager().getPackageInfo(MainActivity.this.getPackageName(), 0).versionName;
/* Get android:versionCode*/
versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
if (!(String.valueOf(versionCode).equals(_versionCodeFB)
&& (versionName.equals(_versionNameFB)))){
DOWNLOAD_URL = _urlApkFB;
checkPermissionsUsers();
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(MainActivity.this, "Error"
, Toast.LENGTH_SHORT).show();
}
});
}
private void checkPermissionsUsers() {
dialog = new AlertDialog.Builder(MainActivity.this)
.setTitle("New version available")
.setMessage("Please, update app to new version to continue reposting.")
.setPositiveButton("Update",
new DialogInterface.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onClick(DialogInterface dialog, int which) {
// Check if the write permission is already available
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP){
// Permission granted
DownloadApk();
}else {
// Permissions requested when needed
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){
//DownloadApk();
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://app.sysnotes.net"));
startActivity(browserIntent);
}else {
// Permissions for Write external storage
// Provide an aditional rationale to the user if the permission was not granted
// and the user would benefit from additional context for the use of the permission
if(shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)){
Toast.makeText(MainActivity.this, "Downloads permissions is needed to download apk",
Toast.LENGTH_SHORT).show();
}
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
}
}
}
}).setNegativeButton("No, thanks",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// finish();
}
}).create();
dialog.show();
//BroadcastReceiver receiver =
}
private void DownloadApk() {
mDowloadManager = (DownloadManager) MainActivity.this.getSystemService(Context.DOWNLOAD_SERVICE);
request = new DownloadManager.Request(Uri.parse(DOWNLOAD_URL));
String fileExtension = MimeTypeMap.getFileExtensionFromUrl(DOWNLOAD_URL);
Log.e("File extension", fileExtension);
final String name = URLUtil.guessFileName(DOWNLOAD_URL, null, fileExtension);
Log.e("File name", fileExtension);
request.setDestinationInExternalPublicDir("/apk", name);
String h = request.setDestinationInExternalPublicDir("/apk", name).toString();
Log.e("Destino del Archivo: ", h);
enqueue = mDowloadManager.enqueue(request);
Log.e("Enqueue: ", String.valueOf(enqueue));
//BroadcastReceiver();
}
private void BroadcastReceiver(){
BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
assert action != null;
Log.e("Action: ", action);
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
// String TypeMedia = mDowloadManager.getMimeTypeForDownloadedFile(0);
Log.e("Intent: ", String.valueOf(intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0)));
if (intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0) == -1) {
finish();
}
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(enqueue);
Cursor cursor = mDowloadManager.query(query);
Log.e("cursor: ", String.valueOf(mDowloadManager.query(query)));
if (cursor.moveToFirst()) {
int columIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
if
(DownloadManager.STATUS_SUCCESSFUL == cursor.getInt(columIndex)) {
String uriString = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
startActivity(new Intent(Environment.DIRECTORY_DOWNLOADS));
// To Open App
/* File file = new File(uriString);
Log.e("Uri: ", uriString);
Log.e("file: ", file.getAbsolutePath());
Intent promptInstall = new Intent();
promptInstall.setAction(android.content.Intent.ACTION_VIEW);
promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
promptInstall.setDataAndType(Uri.parse("file:///storage/emulated/0/Download/SocialMedia1-0-0-1.apk"),
"application/vnd.android.package-archive");
startActivity(promptInstall);
Log.e("PromptInstall: " + promptInstall, String.valueOf(cursor));
// promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//promptInstall.setDataAndType(Uri.parse(uriString), "/apk");
//promptInstall.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageState(new File("/download/" + name)))), "application/vnd.android.package-archive");
// promptInstall.setDataAndType(Uri.parse(uriString),
// "application/vnd.android.package-archive");}*/
}
}
}
}
};
MainActivity.this.registerReceiver(mBroadcastReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
// Handle the response
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull
int[] grantResults) {
if(requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE){
// received permission result for write permissions
//Check if the only required permission has been granted
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
// Camera permission has been granted
DownloadApk();
} else {
Toast.makeText(MainActivity.this, "Permission was not granted", Toast.LENGTH_LONG).show();
}
}else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
@Override
protected void onStart() {
super.onStart();
if (mAuthProvider.getUserSession() != null) {
Intent intent = new Intent(MainActivity.this, HomeActivity.class );
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
@Override
protected void onPause() {
super.onPause();
if (dialog != null){
dialog.dismiss();
dialog = null;
}
}
@Override
public void onDestroy(){
super.onDestroy();
if ( dialog !=null && dialog.isShowing() ){
dialog.cancel();
}
}
private void signInGoogle() {
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, REQUEST_CODE_GOOGLE);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
if (requestCode == REQUEST_CODE_GOOGLE) {
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
// Google Sign In was successful, authenticate with Firebase
GoogleSignInAccount account = task.getResult(ApiException.class);
firebaseAuthWithGoogle(account);
} catch (ApiException e) {
// Google Sign In failed, update UI appropriately
Log.w("ERROR", "Google sign in failed", e);
// ...
}
}
}
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
mDialog.show();
mAuthProvider.googleLogin(acct).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
String id = mAuthProvider.getUid();
checkUserExist(id);
}
else {
mDialog.dismiss();
// If sign in fails, display a message to the user.
Log.w("ERROR", "signInWithCredential:failure", task.getException());
Toast.makeText(MainActivity.this, "No se pudo iniciar sesion con google", Toast.LENGTH_SHORT).show();
}
// ...
}
});
}
private void checkUserExist(final String id) {
mUsersProvider.getUser(id).addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
if (documentSnapshot.exists()) {
mDialog.dismiss();
Intent intent = new Intent(MainActivity.this, HomeActivity.class);
startActivity(intent);
}
else {
String email = mAuthProvider.getEmail();
User user = new User();
user.setEmail(email);
user.setId(id);
mUsersProvider.create(user).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
mDialog.dismiss();
if (task.isSuccessful()) {
Intent intent = new Intent(MainActivity.this, CompleteProfileActivity.class);
startActivity(intent);
}
else {
Toast.makeText(MainActivity.this, "No se pudo almacenar la informacion del usuario", Toast.LENGTH_SHORT).show();
}
}
});
}
}
});
}
private void login() {
String email = mTextInputEmail.getText().toString();
String password = mTextInputPassword.getText().toString();
mDialog.show();
if(!email.isEmpty()){
}
mAuthProvider.login(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
mDialog.dismiss();
if (task.isSuccessful()) {
Intent intent = new Intent(MainActivity.this, HomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
else {
Toast.makeText(MainActivity.this, "El email o la contraseña que ingresaste no son correctas", Toast.LENGTH_LONG).show();
}
}
});
Log.d("CAMPO", "email: " + email);
Log.d("CAMPO", "password: " + password);
}
/*
private void UpdateApp(){
final FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
// set in-app defaults
Map<String, Object> remoteConfigDefaults = new HashMap();
remoteConfigDefaults.put(ForceUpdateChecker.KEY_UPDATE_REQUIRED, false);
remoteConfigDefaults.put(ForceUpdateChecker.KEY_CURRENT_VERSION, "1.0.0");
remoteConfigDefaults.put(ForceUpdateChecker.KEY_UPDATE_URL,
"https://firebasestorage.googleapis.com/v0/b/appchat-ba012.appspot.com/o/SocialMedia1-0-0.apk?alt=media&token=fcbee2f3-0083-4cfd-8b27-2916631d21ae");
firebaseRemoteConfig.setDefaultsAsync(remoteConfigDefaults);
firebaseRemoteConfig.fetch(60) // fetch every minutes
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Log.d(TAG, "remote config is fetched.");
firebaseRemoteConfig.fetchAndActivate();
}
}
});
}
@Override
public void onUpdateNeeded(final String updateUrl) {
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("New version available")
.setMessage("Please, update app to new version to continue reposting.")
.setPositiveButton("Update",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
redirectStore(updateUrl);
}
}).setNegativeButton("No, thanks",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).create();
dialog.show();
}
private void redirectStore(String updateUrl) {
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(updateUrl));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}*/
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment