diff --git a/app/build.gradle b/app/build.gradle index f68e60b..fd68971 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -48,6 +48,8 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'com.google.firebase:firebase-auth:21.1.0' implementation 'com.google.firebase:firebase-storage:20.1.0' + implementation 'com.google.android.gms:play-services-auth:20.4.1' + implementation 'com.google.android.gms:play-services-auth-api-phone:18.0.1' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' diff --git a/app/src/main/java/com/capstone/foodify/Activity/AccountAndProfileActivity.java b/app/src/main/java/com/capstone/foodify/Activity/AccountAndProfileActivity.java index 7354aa5..1c62de1 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/AccountAndProfileActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/AccountAndProfileActivity.java @@ -146,8 +146,6 @@ public class AccountAndProfileActivity extends AppCompatActivity { deleteOldImage(); updateUser(uri.toString()); - - Toast.makeText(AccountAndProfileActivity.this, "Upload ảnh thành công!", Toast.LENGTH_SHORT).show(); } }); } @@ -171,7 +169,7 @@ public class AccountAndProfileActivity extends AppCompatActivity { storageReference.delete().addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { - Toast.makeText(AccountAndProfileActivity.this, "Delete old image successfully!", Toast.LENGTH_SHORT).show(); + } }).addOnFailureListener(new OnFailureListener() { @Override diff --git a/app/src/main/java/com/capstone/foodify/Activity/SignUpActivity.java b/app/src/main/java/com/capstone/foodify/Activity/SignUpActivity.java index b5e813a..301e36b 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/SignUpActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/SignUpActivity.java @@ -319,9 +319,10 @@ public class SignUpActivity extends AppCompatActivity { private void signUp(User user){ FirebaseAuth auth = FirebaseAuth.getInstance(); + auth.setLanguageCode("vi"); PhoneAuthOptions options = PhoneAuthOptions.newBuilder(auth) .setPhoneNumber(Common.PHONE_CODE + edt_phone.getText().toString()) - .setTimeout(60L, TimeUnit.SECONDS) + .setTimeout(0L, TimeUnit.SECONDS) .setActivity(this) .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() { @Override diff --git a/app/src/main/java/com/capstone/foodify/Activity/VerifyAccountActivity.java b/app/src/main/java/com/capstone/foodify/Activity/VerifyAccountActivity.java index 1b8cb96..b8b1a6d 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/VerifyAccountActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/VerifyAccountActivity.java @@ -1,25 +1,37 @@ package com.capstone.foodify.Activity; -import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatActivity; -import androidx.constraintlayout.widget.ConstraintLayout; - +import android.Manifest; +import android.app.Activity; import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; import android.os.Bundle; import android.os.CountDownTimer; import android.text.Editable; import android.text.TextWatcher; -import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import androidx.activity.result.ActivityResult; +import androidx.activity.result.ActivityResultCallback; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + import com.capstone.foodify.API.FoodApi; import com.capstone.foodify.Common; import com.capstone.foodify.Model.User; import com.capstone.foodify.R; +import com.capstone.foodify.SmsBroadcastReceiver; +import com.google.android.gms.auth.api.phone.SmsRetriever; +import com.google.android.gms.auth.api.phone.SmsRetrieverClient; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.android.material.button.MaterialButton; @@ -29,10 +41,10 @@ import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.PhoneAuthCredential; import com.google.firebase.auth.PhoneAuthOptions; import com.google.firebase.auth.PhoneAuthProvider; -import com.saadahmedsoft.popupdialog.PopupDialog; -import com.saadahmedsoft.popupdialog.Styles; import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import retrofit2.Call; import retrofit2.Callback; @@ -40,7 +52,8 @@ import retrofit2.Response; public class VerifyAccountActivity extends AppCompatActivity { private static final String PHONE_CODE = "+84"; - + ActivityResultLauncher activityResultLauncher; + SmsBroadcastReceiver smsBroadcastReceiver; private EditText inputCode1, inputCode2, inputCode3, inputCode4, inputCode5, inputCode6; ImageView close_image; MaterialButton confirm_code; @@ -57,6 +70,24 @@ public class VerifyAccountActivity extends AppCompatActivity { initComponent(); + //Auto fill OTP Code + requestSMSPermission(); + startSmartUserContent(); + activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), + new ActivityResultCallback() { + @Override + public void onActivityResult(ActivityResult result) { + if(result.getResultCode() == Activity.RESULT_OK){ + Intent data = result.getData(); + + if(data != null){ + String message = data.getStringExtra(SmsRetriever.EXTRA_SMS_MESSAGE); + getOtpFromMessage(message); + } + } + } + }); + //Get code if(getIntent() != null){ verificationId = getIntent().getStringExtra("verificationId"); @@ -85,6 +116,7 @@ public class VerifyAccountActivity extends AppCompatActivity { @Override public void onClick(View v) { startActivity(new Intent(VerifyAccountActivity.this, SignUpActivity.class)); + finish(); } }); @@ -113,6 +145,26 @@ public class VerifyAccountActivity extends AppCompatActivity { }); } + private void getOtpFromMessage(String message) { + Pattern otpPattern = Pattern.compile("(|^)\\d{6}"); + Matcher matcher = otpPattern.matcher(message); + if (matcher.find()) { + Double otp = Double.parseDouble(matcher.group(0)); + + inputCode6.setText(String.valueOf(otp % 10)); + otp = otp / 10; + inputCode5.setText(String.valueOf(otp % 10)); + otp = otp / 10; + inputCode4.setText(String.valueOf(otp % 10)); + otp = otp / 10; + inputCode3.setText(String.valueOf(otp % 10)); + otp = otp / 10; + inputCode2.setText(String.valueOf(otp % 10)); + otp = otp / 10; + inputCode1.setText(String.valueOf(otp % 10)); + } + } + private void showResendCode(){ resendCodeTextButton.setVisibility(View.VISIBLE); @@ -196,6 +248,7 @@ public class VerifyAccountActivity extends AppCompatActivity { //Create user success; Toast.makeText(VerifyAccountActivity.this, "Tạo tài khoản thành công!", Toast.LENGTH_SHORT).show(); startActivity(new Intent(VerifyAccountActivity.this, SignInActivity.class)); + finish(); } @Override @@ -323,6 +376,44 @@ public class VerifyAccountActivity extends AppCompatActivity { }); } + private void requestSMSPermission() + { + String permission = Manifest.permission.RECEIVE_SMS; + + int grant = ContextCompat.checkSelfPermission(this, permission); + if(grant != PackageManager.PERMISSION_GRANTED){ + String[] permission_list = new String[1]; + permission_list[0] = permission; + + ActivityCompat.requestPermissions(this, permission_list, 1); + } + } + + private void startSmartUserContent(){ + + SmsRetrieverClient client = SmsRetriever.getClient(this); + client.startSmsUserConsent(null); + } + + private void registerBroadcastReceiver(){ + smsBroadcastReceiver = new SmsBroadcastReceiver(); + + smsBroadcastReceiver.smsBroadcastReceiverListener = new SmsBroadcastReceiver.SmsBroadcastReceiverListener() { + @Override + public void onSuccess(Intent intent) { + activityResultLauncher.launch(intent); + } + + @Override + public void onFailure() { + + } + }; + + IntentFilter intentFilter = new IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION); + registerReceiver(smsBroadcastReceiver, intentFilter); + } + private void initComponent() { confirm_code = (MaterialButton) findViewById(R.id.confirm_code); close_image = (ImageView) findViewById(R.id.close_image); @@ -341,4 +432,16 @@ public class VerifyAccountActivity extends AppCompatActivity { countDown = findViewById(R.id.textview_countdown); errorText = findViewById(R.id.errorText); } + + @Override + protected void onStart() { + super.onStart(); + registerBroadcastReceiver(); + } + + @Override + protected void onStop() { + super.onStop(); + unregisterReceiver(smsBroadcastReceiver); + } } \ No newline at end of file diff --git a/app/src/main/java/com/capstone/foodify/Fragment/ProfileFragment.java b/app/src/main/java/com/capstone/foodify/Fragment/ProfileFragment.java index 638ff14..e10b331 100644 --- a/app/src/main/java/com/capstone/foodify/Fragment/ProfileFragment.java +++ b/app/src/main/java/com/capstone/foodify/Fragment/ProfileFragment.java @@ -135,5 +135,12 @@ public class ProfileFragment extends Fragment { //Update user name on textview user_name.setText(Common.CURRENT_USER.getFullName()); + + //Set image for user + if(Common.CURRENT_USER.getImageUrl().isEmpty()){ + profile_avatar.setImageResource(R.drawable.profile_avatar); + } else { + Picasso.get().load(Common.CURRENT_USER.getImageUrl()).into(profile_avatar); + } } } \ No newline at end of file diff --git a/app/src/main/java/com/capstone/foodify/SmsBroadcastReceiver.java b/app/src/main/java/com/capstone/foodify/SmsBroadcastReceiver.java new file mode 100644 index 0000000..8967785 --- /dev/null +++ b/app/src/main/java/com/capstone/foodify/SmsBroadcastReceiver.java @@ -0,0 +1,43 @@ +package com.capstone.foodify; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; + +import com.google.android.gms.auth.api.phone.SmsRetriever; +import com.google.android.gms.common.api.CommonStatusCodes; +import com.google.android.gms.common.api.Status; + +public class SmsBroadcastReceiver extends BroadcastReceiver { + + public SmsBroadcastReceiverListener smsBroadcastReceiverListener; + + @Override + public void onReceive(Context context, Intent intent) { + + if(intent.getAction() == SmsRetriever.SMS_RETRIEVED_ACTION){ + Bundle extras = intent.getExtras(); + + Status smsRetrieverStatus = (Status) extras.get(SmsRetriever.EXTRA_STATUS); + + switch (smsRetrieverStatus.getStatusCode()){ + + case CommonStatusCodes.SUCCESS: + Intent messageIntent = extras.getParcelable(SmsRetriever.EXTRA_CONSENT_INTENT); + smsBroadcastReceiverListener.onSuccess(messageIntent); + break; + case CommonStatusCodes.TIMEOUT: + smsBroadcastReceiverListener.onFailure(); + break; + } + } + } + + public interface SmsBroadcastReceiverListener{ + + void onSuccess(Intent intent); + + void onFailure(); + } +}