ارسال بيانات التسجيل الى firebase وحفظها داخل SharedPreferences لبناء تطبيق محادثه بالفايربيز

ارسال بيانات التسجيل الى firebase وحفظها داخل SharedPreferences

ارسال بيانات التسجيل الى firebase وحفظها داخل SharedPreferences

في هذة المقالة سوف نشرح معكم كيف يمكنك ارسال بيانات التسجيل في الفايربيز وتخزينها ايضا بداخل الSharedPreferences لكي يصبح دائما الاميل والرقم السري الخاصين بالمستخدم مسجلين بشكل دائم ولا يحتاج في كل مره الى اعادة كتابتهم الا عندما يقوم بتسجيل الخروج من التطبيق وفي هذة الحالة سوف يحتاج الى كتابة الاميل والرقم السري مره اخر ولكن اذا لم يقم باي عملية تسجيل خروج من التطبيق سيبقى محتفظ على بياناته داخل الهاتف ولن يطلب منه ادخال الاميل او الرقم السري مره اخرى .


تطوير تطبيقات ليس من الامور السهله التي يستطيع الجميع احترافيها وخاصة تطوير تطبيقات الاندرويد لان العملية تطلب منك تعلم احدى لغات البرمجة جافا او كوتلن لكي تتمكن من تطوير تطبيقات الهواتف الذكية ولهذا ننصحك بتعلمها وهي مصدر دخل جيد جدا ومطلوبة بكثرة ويمكنك بعد تطوير تطبيقات الموبايل وعمل مشاريع خاصة بك البحث عن شركة تطوير تطبيقات الجوال والعمل بها حتى تكتسب خبره و مالل في نفس الوقت او يمكنك العمل اونلاين من خلال احد مواقع الفري لانسر والتي يتم طلب فيها اعمال البرمجة بشكل يومي تقريبا وباسعار ومبالغ محترمه يستطيع مطوري تطبيقات الاندرويد التفاوض مع الشخص والقيام بالخدمه .


الامر لا يقتصر فقط على مجال .تطوير تطبيقات الموبايل فهنالك مجال برمجة تطبيقات سطح المكتب و التصميم وغيره من المجالات التي تستطيع تعلمها وتجلب لك الاموال ولكن اذا كنت تفضل مجال البرمجة فانصحك بالبدء في دورة جافا ولقد سبق وان قدمنا لكم كورس بسيط في لغة جافا في قسم java حيث شرحنا لكم كيف تقوم بكتابة اول كود لك وكيف تعمل هذة اللغة والكثير عنها انصحك بقرائتها للافادة , يتمتع مبرمج جافا بامكانية تطوير وبرمجة تطبيقات سطح المكتب وتطوير تطبيقات الاندرويد ومواقع الويب .


انشاء كلاس Constants لتخزين البيانات 

في هذا الكلاس سوف يتم تخزين كل المتغيرات التي سوف نقوم بها في هذا التطبيق ودائما سوف تلاحظ اننا نضيف عنصر جديد دائما وهذا يوفر علينا كتابة الاسم في كل مره على سبيل المثال كما تعلم انه لكي ترسل او تستقبل اي عنصر يكون عن طريق key و value ويجب ان يكون الkey بنفس سياق المفتاح المرسل بواسطته ولذلك سوف نحل هذة المشكلة بأننا سوف نضع لكل عنصر اسم معين ونستخدمه بدلا من كتابة الkey الخاص به في كل مره وهذا يوفر علينا الكثير من الوقت وتقليل نسبة الخطأ .


انشاء كلاس Constants لتخزين البيانات

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 والعملية التي تحدث عند النقر على اختيار صورة وهي فتح الاستوديو او عمل انتقال للموقع الحالي الى الالبوم الخاص بهاتف المستخدم لاختيار صورة من داخله .


الانتقال الى المعرض لاختيار الصورة وارسال البيانات بعد التاكد من صحتها الى firebase


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);

            }
        });
    }
    


تعليقات