ارسال بيانات التسجيل الى firebase وحفظها داخل SharedPreferences
في هذة المقالة سوف نشرح معكم كيف يمكنك ارسال بيانات التسجيل في الفايربيز وتخزينها ايضا بداخل الSharedPreferences لكي يصبح دائما الاميل والرقم السري الخاصين بالمستخدم مسجلين بشكل دائم ولا يحتاج في كل مره الى اعادة كتابتهم الا عندما يقوم بتسجيل الخروج من التطبيق وفي هذة الحالة سوف يحتاج الى كتابة الاميل والرقم السري مره اخر ولكن اذا لم يقم باي عملية تسجيل خروج من التطبيق سيبقى محتفظ على بياناته داخل الهاتف ولن يطلب منه ادخال الاميل او الرقم السري مره اخرى .
تطوير تطبيقات ليس من الامور السهله التي يستطيع الجميع احترافيها وخاصة تطوير تطبيقات الاندرويد لان العملية تطلب منك تعلم احدى لغات البرمجة جافا او كوتلن لكي تتمكن من تطوير تطبيقات الهواتف الذكية ولهذا ننصحك بتعلمها وهي مصدر دخل جيد جدا ومطلوبة بكثرة ويمكنك بعد تطوير تطبيقات الموبايل وعمل مشاريع خاصة بك البحث عن شركة تطوير تطبيقات الجوال والعمل بها حتى تكتسب خبره و مالل في نفس الوقت او يمكنك العمل اونلاين من خلال احد مواقع الفري لانسر والتي يتم طلب فيها اعمال البرمجة بشكل يومي تقريبا وباسعار ومبالغ محترمه يستطيع مطوري تطبيقات الاندرويد التفاوض مع الشخص والقيام بالخدمه .
الامر لا يقتصر فقط على مجال .تطوير تطبيقات الموبايل فهنالك مجال برمجة تطبيقات سطح المكتب و التصميم وغيره من المجالات التي تستطيع تعلمها وتجلب لك الاموال ولكن اذا كنت تفضل مجال البرمجة فانصحك بالبدء في دورة جافا ولقد سبق وان قدمنا لكم كورس بسيط في لغة جافا في قسم java حيث شرحنا لكم كيف تقوم بكتابة اول كود لك وكيف تعمل هذة اللغة والكثير عنها انصحك بقرائتها للافادة , يتمتع مبرمج جافا بامكانية تطوير وبرمجة تطبيقات سطح المكتب وتطوير تطبيقات الاندرويد ومواقع الويب .
انشاء كلاس Constants لتخزين البيانات
في هذا الكلاس سوف يتم تخزين كل المتغيرات التي سوف نقوم بها في هذا التطبيق ودائما سوف تلاحظ اننا نضيف عنصر جديد دائما وهذا يوفر علينا كتابة الاسم في كل مره على سبيل المثال كما تعلم انه لكي ترسل او تستقبل اي عنصر يكون عن طريق key و value ويجب ان يكون الkey بنفس سياق المفتاح المرسل بواسطته ولذلك سوف نحل هذة المشكلة بأننا سوف نضع لكل عنصر اسم معين ونستخدمه بدلا من كتابة الkey الخاص به في كل مره وهذا يوفر علينا الكثير من الوقت وتقليل نسبة الخطأ .
Constants Class
public class Constants {
public static final String KEY_COLLECTION_USERS = "user";
public static final String KEY_NAME = "name";
public static final String KEY_EMAIL = "email";
public static final String KEY_PASSWORD = "password";
public static final String KEY_PREFERENCE_NAME = "chatAppPreference";
public static final String KEY_IS_SIGNED_IN = "isSignedIn";
public static final String KEY_USER_ID = "userId";
public static final String KEY_IMAGE = "image";
}
انشاء كلاس PreferenceManager لحفظ البيانات
هذا الكلاس هو المسؤول عن عملية حفظ البيانات داخل الذاكرة الخاصه بهاتف المستخدم , بمعنى انه اذا قام باي عملية وقمنا بتخزينها داخل الPreference سابقى محفوظه في جهازه بمعنى لو قمنا بحفظ بيانات الدخول الخاصه به في جهازه سيتم الاحتفاظ به في جاهز المستخدم وفي كل مره يفتح التطبيق لن يطلب منه التسجيل او حتى تسجيل الدخول لان البيانات محفوظه عكس ان نقوم بهذة العملية من خلال الfirebase , لان هذا يطلب من المستخدم توفر الانترنت لكي يتمكن من معرفة البيانات وفتح التطبيق دون الاميل والرقم السري
PreferenceManager Class
public class PreferenceManager {
private final SharedPreferences sharedPreferences;
public PreferenceManager(Context context) {
sharedPreferences = context.getSharedPreferences(Constants.KEY_PREFERENCE_NAME , Context.MODE_PRIVATE);
}
public void putBoolean(String key , Boolean value) {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean(key , value);
editor.apply();
}
public Boolean getBoolean(String key) {
return sharedPreferences.getBoolean(key , false);
}
public void putString (String key , String value) {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(key , value);
editor.apply();
}
public String getString(String key) {
return sharedPreferences.getString(key , null);
}
public void clear() {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.clear();
editor.apply();
}
}
انشاء methode لعمل validations للبيانات
في كلاس تسجيل الدخول نحتاج ان نقوم بعمل اختبار للبيانات التي يدخلها المستخدم للتاكد من سلامتها وانها تعمل بشكل جيد دون مشاكل وان كلمة المرور ايضا متطابقه , مثال على ذلك الرقم السري واعادة الرقم السري متطابق والاميل غير موجود من قبل في قواعد البيانات وان البيانات غير فارغه ولذلك سوف نقوم بكتابة كل هذة الاحتمالات داخل ميثود .
validations methode
private void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
private Boolean isValidSignUpDetails() {
if (encodeImage == null) {
showToast("Select Image profile");
return false;
} else if (binding.inputName.getText().toString().isEmpty()) {
showToast("Please enter your name");
return false;
} else if (binding.inputEmail.getText().toString().isEmpty()) {
showToast("Please enter your Email");
return false;
// matches email .
} else if (!Patterns.EMAIL_ADDRESS.matcher(binding.inputEmail.getText().toString()).matches()) {
showToast("Enter valid Email");
return false;
} else if (binding.inputPassword.getText().toString().isEmpty()) {
showToast("Please enter your Password");
return false;
} else if (binding.inputRepassword.getText().toString().isEmpty()) {
showToast("Confirm your password");
return false;
} else if (!binding.inputRepassword.getText().toString().equals(binding.inputRepassword.getText().toString())) {
showToast("password & Confirm password must be same");
return false;
} else {
return true;
}
}
انشاء ProgressBar للتسجيل
لكي نقوم بعمل ProgressBar يقوم بالعمل عندما يتم النقر على تسجيل يوجد اولا ان نقوم بتصميمه داخل ملفات xml وهي لغة التصميم المتعارف عليها في تطوير تطبيقات الاندرويد , وفي هذا الكود قمنا بعمل الزر الخاص بتسجيل البيانات والProgressBar وقمنا بجعله مخفي الى ان يتم النقر على الزر ويختفي الزر ويظهر الProgressBar .
sign_up xml
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_20sdp"
android:animateLayoutChanges="true">
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_Sign_up"
android:layout_width="match_parent"
android:layout_height="@dimen/_50sdp"
android:text="@string/sign_up"
android:textColor="@color/white"
android:textSize="@dimen/_13ssp"
android:textStyle="bold"
app:cornerRadius="@dimen/_8sdp" />
<ProgressBar
android:id="@+id/progress"
android:layout_width="@dimen/_25sdp"
android:layout_height="@dimen/_25sdp"
android:layout_gravity="center"
android:visibility="visible" />
</FrameLayout>
كود ProgressBar داخل class
في هذا الجزء سوف نقوم بعمل كود للProgressBar وهو يقوم باخفاء الزر واظهار الProgressBar عندما يتم النقر عليه والعكس اذا لم يتم النقر عليه او اذا فشلت العملية .
sign_up class
protected void loading (Boolean isLoading) {
if (isLoading) {
binding.btnSignUp.setVisibility(View.INVISIBLE);
binding.progress.setVisibility(View.VISIBLE);
} else {
binding.progress.setVisibility(View.INVISIBLE);
binding.btnSignUp.setVisibility(View.VISIBLE);
}
}
}
تحويل الصورة الى encode Image و وتخزين عنوان الصورة
في هذا الكود سوف فتح المعرض واختيار صورة من داخله بمقاسات وابعاد معينه للصورة , وتخزين عنوان الصورة داخل uri
encodeimage
private String encodeImage(Bitmap bitmap) {
int previewWidth = 150;
int previewHeight = bitmap.getHeight() * previewWidth / bitmap.getWidth();
Bitmap previewBitmap = Bitmap.createScaledBitmap(bitmap , previewWidth , previewHeight , false);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
previewBitmap.compress(Bitmap.CompressFormat.JPEG , 50 , byteArrayOutputStream);
byte[] bytes = byteArrayOutputStream.toByteArray();
return Base64.encodeToString(bytes , Base64.DEFAULT);
}
private final ActivityResultLauncher<Intent> pickImage = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult() , result -> {
if (result.getResultCode() == RESULT_OK) {
if (result.getData() != null) {
Uri imageUri = result.getData().getData();
try{
InputStream inputStream = getContentResolver().openInputStream(imageUri);
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
binding.imageProfile.setImageBitmap(bitmap);
binding.textAddImage.setVisibility(View.GONE);
encodeImage = encodeImage(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}
);
ارسال البيانات الى الفايربيز و الShared Preference
في هذا الجزء سوف نقوم بارسال بيانات المستخدم الى firebase لكي يتم حفظها بقواعد البيانات وهذا في حالة اذا كانت البيانات صحيحة وايضا سوف نقوم بحفظها داخل Shared Preference , لكي يمكن المستخدم من تخزين البيانات وامكانية تسجيل الدخول من تلقاء نفسه في المره المقبلة دون الحاجه الى التسجيل مره اخرى .
sign_up to firebase
private void sign_up() {
loading(true);
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
HashMap<String , Object> user = new HashMap<>();
user.put(Constants.KEY_NAME , binding.inputName.getText().toString());
user.put(Constants.KEY_EMAIL , binding.inputEmail.getText().toString());
user.put(Constants.KEY_PASSWORD , binding.inputPassword.getText().toString());
user.put(Constants.KEY_IMAGE , encodeImage);
firestore.collection(Constants.KEY_COLLECTION_USERS).add(user).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(DocumentReference documentReference) {
loading(false);
preferenceManager.putBoolean(Constants.KEY_IS_SIGNED_IN , true);
preferenceManager.putString(Constants.KEY_USER_ID , documentReference.getId());
preferenceManager.putString(Constants.KEY_NAME , binding.inputName.getText().toString());
preferenceManager.putString(Constants.KEY_IMAGE , encodeImage);
Intent intent = new Intent(getApplicationContext() , MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
loading(false);
showToast(e.getMessage());
}
});
}
الانتقال الى المعرض لاختيار الصورة وارسال البيانات بعد التاكد من صحتها الى firebase
في هذا الجزء سوف نقوم بعمل الانتقالات داخل التطبيق بمعنى العملية التي تحتاج عند النقر على زر التسجيل وهي بكل بساطة التاكد من البيانات وتشغيل الProgressBar والعملية التي تحدث عند النقر على اختيار صورة وهي فتح الاستوديو او عمل انتقال للموقع الحالي الى الالبوم الخاص بهاتف المستخدم لاختيار صورة من داخله .
set_Listeners methode
private void set_Listeners() {
binding.signIn.setOnClickListener(v -> onBackPressed());
binding.btnSignUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isValidSignUpDetails()) {
sign_up();
}
}
});
binding.layoutImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent (Intent.ACTION_PICK , MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
pickImage.launch(intent);
}
});
}