حفظ التوكن والبيانات الخاص بالمستخدم وحذف البيانات عند تسجيل الخروج في تطبيق الشات
في هذا الدرس سوف نقوم بعمل تصميم لصفحة mainactivity وايضا سوف نقوم بحذف البيانات الخاصه بالمستخدم عند عملية تسجيل الخروج من التطبيق وهذا لكي لا تحدث مشاكل عند تسجيل الخروج من التطبيق , ايضا سوف نتعرف على كيفية حفظ التوكن الخاص بالمستخدم في عملية تسجيل الدخول وتحديث التوكن الخاص بالمستخدم عند عمل login للتطبيق
لغه جافا من اكثر اللغات التي عليها طلب سواء في التعلم او في سوق العمل , والسبب يرجع في انه يمكنك من خلالها تطوير تطبيقات الاندرويد و عمل برامج سطح المكتب من خلال هذه اللغه ايضا اغلب الجامعات تقوم بتدريس هذه اللغه وهي لغه تعد من اللغات الصعبه وليست من اللغات السهله ولكن اذا اتقنت هذه اللغه بشكل جيد سوف اخبرك انه يمكنك تعلم اي لغه برمجه اخرى جديده لان java لغه من اللغات الصعبه وايضا بها تفاصيل كثيره جدا عكس اللغات التي تظهر جديده وتقدم مميزات معينه مثل لغة دارت الخاصه بفلاتر وهي بيئة تطوير تطبيقات الاندرويد والايفون وسطح المكتب بكود واحد .
لغه python وهي من اللغات المطلوبه جدا في الذكاء الاصطناعي في سوق العمل هذة اللغه قوية في مجالها ولكنها غير قويه مثل الجافا او بمعنى اخر ليس بصعوبة الجافا . ويقصد بذلك اه يمكنك تعلم هذه اللغه ولكن سوف يصعب عليك تعلم الجافا بعدها لذلك حاول البدء بالجوبا او c++ او اي لغات البرمجه الصعبه لكي تستطيع فهم اي لغه تظهر بعد ذلك ونحن في موقعنا نقدم لكم الكثير والكثير من الاكواد البرمجيه المختلفه والمتنوعه. في لغه البايثون و في لغه الجافا وغيرها من اللغات الكثيره يحتوي الموقع الخاص بنا على العديد من البرامج والادوات والاكواد الخاصه للمطورين ويهدف موقعنا الى نشر ثقافه البرمجه لدي المحتوى العربي وذلك لان هذا المحتوى تقريبا مظلوم في هذا المجال و لا يوجد به الكثير من االاكواد والشروحات لذلك نعمل بكل جهدنا على توفير لكم كل ما تحتاجونه في مختلف لغات البرمجه وفي الشروحات و في تطوير تطبيقات الهواتف الذكيه.
تصميم صفحة activity_main
نقوم اولا ببناء صفحة الmain وهذا عبارة عن تصميم فقط ويمكنك عمل icon من الايقونات التي يوفرها لنا برنامج android studio بدلا من تحميل اي ايقونات خارجية وكل الايقونات المستخدمه في التطبيق عباره عن ايقونات من داخل برنامج الاندرويد ستوديو ولكن اذا كنت تريد ارفاق اي ملفات خارجية فلا مشكلة
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
android:background="@color/primary"
tools:context=".activities.MainActivity">
<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/imageProfile"
android:layout_width="@dimen/_30sdp"
android:layout_height="@dimen/_30sdp"
android:layout_margin="@dimen/_16sdp"
android:scaleType="centerCrop"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:riv_corner_radius="@dimen/_16sdp" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/image_signOut"
android:layout_width="@dimen/_30sdp"
android:layout_height="@dimen/_30sdp"
android:layout_margin="@dimen/_16sdp"
android:background="@drawable/background_icon"
android:padding="@dimen/_6sdp"
android:src="@drawable/ic_logout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/_8sdp"
android:layout_marginEnd="@dimen/_8sdp"
android:ellipsize="end"
android:gravity="center"
android:maxLines="1"
android:textColor="@color/white"
android:textSize="@dimen/_14ssp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/imageProfile"
app:layout_constraintEnd_toStartOf="@id/image_signOut"
app:layout_constraintStart_toEndOf="@id/imageProfile"
app:layout_constraintTop_toTopOf="@id/imageProfile" />
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="@dimen/_25sdp"
android:layout_height="@dimen/_25sdp"
android:layout_gravity="center"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="@dimen/_16sdp"
android:background="@drawable/background_content_bottom"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/imageProfile">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/conversationRecyclerview"
android:layout_width="match_parent"
android:clipToPadding="false"
android:orientation="vertical"
android:overScrollMode="never"
android:padding="@dimen/_20sdp"
android:visibility="gone"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:layout_height="wrap_content" />
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="@dimen/_25sdp"
android:layout_height="@dimen/_25sdp"
android:layout_gravity="center" />
</FrameLayout>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fa_new_chat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/_18sdp"
android:backgroundTint="@color/primary"
android:contentDescription="@string/app_name"
android:src="@drawable/ic_add"
android:tint="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
اضافة KEY_FCM_TOKEN داخل Constants
الان سوف تنتقل الى ملف Constants وتقوم بوضع بداخلة KEY_FCM_TOKEN وهو عبارة عن string يتم بداخله حفظ البيانات الخاص بالتوكن المخصص لكل مستخدم .
public static final String KEY_FCM_TOKEN = "fcmToken";
حذف التوكن عند عملية تسجيل الخروج والحصول عليه عند تسجيل الدخول
في طبيعة الحال عندما تريد عمل تسجيل خروج من اي تطبيق يتم حذف التوكن والبيانات المخزنة في جهازك لكي تتمكن من اتمام العملية بشكل جيد دون حدوث اي مشاكل في التطبيق وهذا ما سنقوم به عملية حذف البيانات عند اتمام عملية تسجيل الخروج من التطبيق
private void get_token() {
FirebaseMessaging.getInstance().getToken().addOnSuccessListener(this::updateToken);
}
// الحصول على توكن المستخدم
// عرض صورة المستخدم من الفايربيز وحفظها في الشيرد
private void get_image_from_preference () {
byte[] bytes = android.util.Base64.decode(preferenceManager.getString(Constants.KEY_IMAGE) , android.util.Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes , 0 , bytes.length);
binding.imageProfile.setImageBitmap(bitmap);
}
// ميثود لعرض التوست message
private void toast(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
// تحديث التوكن عند عملية تسجيل الدخول
private void updateToken(String token) {
// preferenceManager.putString(Constants.KEY_FCM_TOKEN , token);
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
DocumentReference documentReference = firestore.collection(Constants.KEY_COLLECTION_USERS).document(preferenceManager.getString(Constants.KEY_USER_ID));
documentReference.update(Constants.KEY_FCM_TOKEN , token).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
toast(getString(R.string.token_updated_successfully));
}
}) .addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
toast(e.getLocalizedMessage());
}
});
}
// الازرار والانتقالات داخل الصفحة
private void listener() {
binding.imageSignOut.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loading(true);
sign_out();
}
});
binding.faNewChat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(getApplicationContext() , UserActivity.class));
}
});
}