تطبيق إعلانات بأندرويد و firebase الجزء الخامس

imadbelasri Android
AN

فهاد الجزء الخامس من تطبيق إعلانات بأندرويد و firebase غادي نكملو الملفات لي بقاونا غادي نشوفوا كيفاش نزيدو الملف الخاص بمشاهدة تفاصيل إعلان ضغط المستخدم عليه منبعد غادي نشوفوا كيفاش نزيدو واحد système  ديال لإضافة للقائمة المفضلة ولي غادي يمكن المستخدم من إضافة إعلان عجبو لل favoris ديالو.


نظرة سريعة بالفيديو


1- إضافة ملف تفاصيل الإعلان

فباش نزيد لملف لي غادي يمكن المستخدم من مشاهدة تفاصيل إعلان  كنمشي ل dossier java وكنزيد activity جديدة سميها AdDetails منبعد متزاد غادي تمشي ل dossier res/layout فيه غادي تلقى ملف تزاد سميتو activity_ad_details.xml فيه غادي يكون عندي الصورة ديال الإعلان والعنوان والتفاصيل والمعلومات الخاصة بالمستخدم وعندي image فيها قلب لي غادي تمكن المستخدم ملي يكليكي عليها يزيد لإعلان فالقائمة المفضلة وكل élément عندو id ديالو باش غادي نسترجعوه فل AdDetails.java وعندي واحد ل Bottom Navigation خاص بهاد الملف ولي غادي يمكن من اننا نتصالو او نصيفطو امايل او رسالة نصية لصاحب الإعلان غادي نزيدوه منبعد الكود ديال الملف هو :

                                                    
                                                        <?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    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:background="@color/white"
    tools:context="com.example.belasri.hiresell.AdDetails">
        <android.support.design.widget.AppBarLayout
            android:id="@+id/app_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fitsSystemWindows="true"
            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

            <android.support.design.widget.CollapsingToolbarLayout
                android:layout_width="match_parent"
                android:layout_height="350dp"
                android:fitsSystemWindows="true"
                app:contentScrim="@color/colorPrimary"
                app:expandedTitleTextAppearance="@android:color/transparent"
                app:layout_scrollFlags="scroll|exitUntilCollapsed">

                <include layout="@layout/toolbar"></include>

                <ImageView
                    android:id="@+id/adImage"
                    android:layout_marginTop="55dp"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:scaleType="centerCrop"
                    android:src="@drawable/layer"
                    app:layout_collapseMode="parallax" />
            </android.support.design.widget.CollapsingToolbarLayout>
        </android.support.design.widget.AppBarLayout>
        <android.support.design.widget.FloatingActionButton
            android:id="@+id/addAdToFav"
            android:elevation="6dp"
            android:src="@drawable/ic_favorite_border_black_24dp"
            android:tint="@color/colorPrimary"
            app:backgroundTint="@color/white"
            app:pressedTranslationZ="16dp"
            android:clickable="true"
            app:layout_anchor="@id/app_bar"
            app:layout_anchorGravity="bottom|right|end"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipToPadding="false"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">
            <android.support.v7.widget.CardView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="16dp"
                android:elevation="5dp"
                app:cardUseCompatPadding="true">
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical">
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:padding="5dp">
                        <de.hdodenhof.circleimageview.CircleImageView
                            android:id="@+id/profileImage"
                            android:layout_width="56dp"
                            android:layout_height="56dp"
                            android:contentDescription="@string/photo_de_profile"
                            android:scaleType="centerCrop"
                            android:src="@drawable/abc56789" />
                        <TextView
                            android:id="@+id/adUserFullname"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:padding="12dp"
                            android:textColor="#333"
                            android:textSize="20sp"
                            android:textStyle="bold" />
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:padding="12dp">
                        <ImageView
                            android:id="@+id/imageView"
                            android:layout_width="0dp"
                            android:layout_height="24dp"
                            android:layout_weight="1"
                            android:src="@drawable/tag" />
                        <TextView
                            android:id="@+id/adCat"
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:layout_gravity="center_vertical"
                            android:layout_weight="9"
                            android:padding="5dp"
                            android:text=""
                            android:textColor="#333"
                            android:textSize="14sp"
                            android:textStyle="bold" />
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:padding="12dp">
                        <ImageView
                            android:id="@+id/locationIcon"
                            android:layout_width="0dp"
                            android:layout_height="24dp"
                            android:layout_weight="1"
                            android:src="@drawable/position" />
                        <TextView
                            android:id="@+id/adCity"
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:layout_gravity="center_vertical"
                            android:layout_weight="9"
                            android:padding="4dp"
                            android:text=""
                            android:textColor="#333"
                            android:textSize="14sp"
                            android:textStyle="bold" />
                    </LinearLayout>
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="1dp"
                        android:background="@color/colorPrimaryDark"></View>
                    <TextView
                        android:id="@+id/adTitle"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="12dp"
                        android:padding="12dp"
                        android:textColor="#333"
                        android:textSize="20sp"
                        android:textStyle="bold" />
                    <TextView
                        android:id="@+id/adDesc"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="12dp"
                        android:lineSpacingMultiplier="1.5"
                        android:padding="12dp"
                        android:textSize="13sp" />
                </LinearLayout>
            </android.support.v7.widget.CardView>
        </android.support.v4.widget.NestedScrollView>
    <android.support.design.widget.BottomNavigationView
        android:id="@+id/AdDetaisBottomNav"
        android:background="@color/white"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:menu="@menu/ads_details_menu"
        android:elevation="5dp"
        android:layout_gravity="bottom"
        >
    </android.support.design.widget.BottomNavigationView>
</android.support.design.widget.CoordinatorLayout>
                                                    
                                                

2- إضافة ل bottom menu الخاص بهاد الملف

باش نزيد ل bottom menu غادي نمشي ل dossier res/layout ثم menu منبعد فيها زيد ملف عبارة عن ressource file سميه ل ads_details_menu.xml فيه غادي تكون ل menu لي لتحت فعندي ل items كل واحد عندو title و icon ف les icones غادي تلقاهم مع الكود سورس فالكود ديال الملف هو :

                                                        
                                                            <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/callAdUser"
        android:title="@string/call"
        android:orderInCategory="1"
        android:icon="@drawable/ic_phone_black_24dp"></item>
    <item
        android:id="@+id/SendSms"
        android:title="@string/sms"
        android:icon="@drawable/ic_message_black_24dp"
        android:orderInCategory="2"></item>
    <item
        android:id="@+id/SendEmail"
        android:title="@string/e_mail"
        android:icon="@drawable/ic_email_black_24dp"
        android:orderInCategory="3"></item>
</menu>
                                                        
                                                    

3- عرض تفاصيل الإعلان

كنمشي ل dossier java فيه عندي الملف AdDetails فيه كنزيد الكود لي كيسترجع les éléments لي زدنا فلملف activity_ad_details.xml من بعد كنسترجع la table لي سميتها Ads وكنسترجع ايضا la table profiles ول id ديال لإعلان لي جاني من MainActivity منبعد كاين ل fonction getData لي كتاخد ل id ديال الإعلان وكتقلب عليه ف la table Ads وكت afficher المعلومات الخاصة به ف les éléments ديالنا من بعد كنسترجع ل id ديال المستخدم وكنعطيه لل fonction setUserName لي كتسترجع المعلومات ديال المستخدم صاحب الإعلان وكتعرضها منبعد ملي كيكليكي المستخدم على القلب كتنفد ل fonction store لي كتزيد الإعلان فالقائمة المفضلة وهادشي غادي نشوفوه من بعد ثم كاين الكود الخاص بل Bottom Navigation ولي ملي كيكليكي المستخدم على appel كنعيط للمستخدم صاحب الإعلان أو sms كنصيفطلو sms أو email كنرسلو email الكود ملف هو :

                                                        
                                                            package com.example.belasri.hiresell;

import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.squareup.picasso.Picasso;

import java.util.UUID;

import helpers.BottomNavigationViewHelper;
import models.AdInfo;
import models.DataBaseHandler;
import models.SessionManager;

import static android.R.attr.category;
import static android.icu.lang.UCharacter.GraphemeClusterBreak.L;
import static com.example.belasri.hiresell.R.id.adtitle;

public class AdDetails extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener{
    private TextView adTitleText,adBodyText,adCityText,adUserFullname,adCatText;
    private ImageView userProfileImage,adImageView;
    private BottomNavigationView bottomNavigationView;
    private FloatingActionButton createAd;
    private BottomNavigationViewHelper bottomNavigationViewHelper;
    private String email;
    private String phone;
    private FirebaseDatabase database;
    private DatabaseReference reference,userRef;
    private FirebaseAuth mAuth;
    private String ad_id = null;
    private SessionManager session;
    private String user_stored;
    private DataBaseHandler dba;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ad_details);
        final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        bottomNavigationView = (BottomNavigationView) findViewById(R.id.AdDetaisBottomNav);
        bottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
        bottomNavigationView.setOnNavigationItemSelectedListener(this);
        adTitleText = (TextView) findViewById(R.id.adTitle);
        adBodyText = (TextView) findViewById(R.id.adDesc);
        adCityText = (TextView) findViewById(R.id.adCity);
        adUserFullname = (TextView) findViewById(R.id.adUserFullname);
        adCatText = (TextView) findViewById(R.id.adCat);
        adImageView = (ImageView) findViewById(R.id.adImage);
        userProfileImage = (ImageView) findViewById(R.id.profileImage);
        ad_id = getIntent().getStringExtra("ad_id");
        reference = FirebaseDatabase.getInstance().getReference().child("Ads");
        userRef = FirebaseDatabase.getInstance().getReference().child("profiles");
        mAuth = FirebaseAuth.getInstance();
        session = new SessionManager(this);
        dba =  new DataBaseHandler(this);
        createAd = (FloatingActionButton) findViewById(R.id.addAdToFav);
        setSupportActionBar(toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getData();
    }

    @Override
    protected void onStart() {
        super.onStart();
        checkIfFavourite();
    }

    @Override
    public void onBackPressed()
    {
        super.onBackPressed();
        finish();
    }
    private void getData(){
        reference.child(ad_id).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                final String adtitle = (String) dataSnapshot.child("title").getValue();
                final String adcity = (String) dataSnapshot.child("city").getValue();
                final String addescription = (String) dataSnapshot.child("description").getValue();
                final String  adimage = (String) dataSnapshot.child("imageUrl").getValue();
                String user_ad_id = (String) dataSnapshot.child("user_id").getValue();
                String category = (String) dataSnapshot.child("category").getValue();
                adCityText.setText(adcity);
                adBodyText.setText(addescription);
                adTitleText.setText(adtitle);
                adCatText.setText(category);
                createAd.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        storeFav(adtitle,addescription,adcity,adimage);
                    }
                });
                setToolbarTitle(adtitle);
                Picasso.with(AdDetails.this).load(adimage).into(adImageView);
                setUserName(user_ad_id);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
    public void setUserName(String userId){
        userRef.child(userId).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String name = (String) dataSnapshot.child("fullname").getValue();
                phone = (String) dataSnapshot.child("phone").getValue();
                email = (String) dataSnapshot.child("email").getValue();
                String image = (String) dataSnapshot.child("image_url").getValue();
                adUserFullname.setText(name);
                if(image != null) {
                    Picasso.with(AdDetails.this).load(image).into(userProfileImage);
                }else{
                    userProfileImage.setImageResource(R.drawable.abc56789);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
    private  void setToolbarTitle(String title) {
        getSupportActionBar().setTitle(title);
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        int id = item.getItemId();
        switch(id){
            case R.id.callAdUser :
                Intent callIntent = new Intent(Intent.ACTION_CALL);
                if(!phone.equals("")){
                    callIntent.setData(Uri.parse("tel:"+phone));
                    Log.d("useradphone",phone);
                }else{
                    Toast.makeText(this, "Aucun téléphone fournis", Toast.LENGTH_SHORT).show();
                }
                if(ActivityCompat.checkSelfPermission(this,android.Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED){
                    requestPermission();
                }else{
                    startActivity(callIntent);
                }
                break;
            case R.id.SendSms :
                Uri uri = Uri.parse("smsto:"+phone);
                Intent sendSmsIntent = new Intent(Intent.ACTION_SENDTO, uri);
                sendSmsIntent.putExtra("sms_body", "Sms à envoyer");
                startActivity(sendSmsIntent);
                break;
            case R.id.SendEmail :
                Intent sendEmail = new Intent(Intent.ACTION_SEND);
                sendEmail.setData(Uri.parse("email"));
                String[] userEmail = {email};
                sendEmail.putExtra(Intent.EXTRA_EMAIL,userEmail);
                sendEmail.putExtra(Intent.EXTRA_SUBJECT,"le sujet");
                sendEmail.putExtra(Intent.EXTRA_TEXT,"le contenu");
                sendEmail.setType("message/rfc822");
                Intent launchEmail = Intent.createChooser(sendEmail,"Envoyer");
                startActivity(launchEmail);
                break;
        }
        return true;
    }
    private void requestPermission(){
        ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.CALL_PHONE},1);
    }
    private void storeFav(String title,String desc,String city,String image){
        if(!dba.isFavourite(ad_id)){
            dba.addFav(title,desc,city,image,ad_id,getUserId());
            createAd.setImageResource(R.drawable.fav);
            Toast.makeText(this,title +  " ajoutée à vos favoris", Toast.LENGTH_SHORT).show();
            Log.d("favouritestored", dba.getFavs().get(0).getTitle());
        }else{
            dba.deleteFavourite(ad_id);
            createAd.setImageResource(R.drawable.ic_favorite_border_black_24dp);
            Toast.makeText(this,title +  " retirée de vos favoris", Toast.LENGTH_SHORT).show();
        }
    }
    private void checkIfFavourite(){
        if(dba.isFavourite(ad_id)){
            createAd.setImageResource(R.drawable.fav);
        }else{
            createAd.setImageResource(R.drawable.ic_favorite_border_black_24dp);
        }
    }
    private String getUserId(){
        if(mAuth.getCurrentUser() == null){
            String user_id;
            if(session.getData().equals("")){
                user_id = generateRandomUserId();
            }else{
                user_id = session.getData();
            }
            return user_id;
        }else{
            return  mAuth.getCurrentUser().getUid();
        }
    }
    private String generateRandomUserId(){
        String user_id = String.valueOf(UUID.randomUUID());
        return user_id;
    }
}
                                                        
                                                    

4- إضافة الملف constants.java

فباش نمكنوا المستخدم من أنه يزيد شي إعلان فالقائمة ديالو المفضلة فغادي نخدمو ب sqlite لي كيمكنا باش نزيدو قواعد بيانات locale يعني غير فالتطبيق ديالنا فغادي نمشي للمجلد java ثم models فيه زيد ملف جديد اختار java class سميه Constants.java فهاد الملف غادي يكونوا عندنا les variables لي غادي تكون فيهم إسم قاعدة البيانات la table  و les champs لي غادي ياخدو المعلومات الخاصة بالإعلان ول id ديال المستخدم الكود ديال الملف هو :

                                                        
                                                            package models;

/**
 * Created by belasri on 17/12/2017.
 */

public class Constants {
    public static final String DATABASE_NAME = "favourites";
    public static final int DATABASE_VERSION = 1;
    public static final String TABLE_NAME = "adsFavs";
    public static final String KEY_ID = "id";
    public static final String AD_TITLE = "title";
    public static final String AD_DESC = "desc";
    public static final String AD_CITY = "city";
    public static final String AD_IMAGE = "imageUrl";
    public static final String AD_ID = "AdId";
    public static final String USER_ID = "userID";
}
                                                        
                                                    

5- إضافة الملف DatabaseHandler.java

دائما فالمجلد models زيد ملف جديد اختار java class سميه DatabaseHandler.java فهاد الملف لي سبق شرحناه فدروس سابقة كاين les fonctions لي غادي نحتاج ففيه كن créer la base de données و la table وعندي les fonctions لي كي يزيدو إعلان ف la table ديال les favoris أو كيمسحوا منها بالإضافة لل fonction لي كت retourner les favoris كاملين الكود ديال الملف هو : 


                                                        
                                                            package models;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import java.util.ArrayList;

/**
 * Created by belasri on 17/12/2017.
 */

public class DataBaseHandler extends SQLiteOpenHelper {
    private ArrayList<AdInfo> adsList = new ArrayList<>();
    public DataBaseHandler(Context context) {
        super(context,Constants.DATABASE_NAME,null,Constants.DATABASE_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_TABLE = "CREATE TABLE "+ Constants.TABLE_NAME + "(" +
                Constants.KEY_ID + " INTEGER PRIMARY KEY ," + Constants.AD_TITLE + " TEXT ," +
                Constants.AD_DESC + " TEXT ,"+
                Constants.AD_CITY + " TEXT ," + Constants.AD_IMAGE + " TEXT," + Constants.USER_ID
                + " TEXT," + Constants.AD_ID + " TEXT);";
        db.execSQL(CREATE_TABLE);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(" DROP TABLE IF EXISTS" + Constants.TABLE_NAME);
        //create a new one
        onCreate(db);
    }
    //add fav
    public void addFav(String title,String desc,String city,String image,String ad_id,String user_id){
        SQLiteDatabase dba = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(Constants.AD_TITLE,title);
        values.put(Constants.AD_DESC,desc);
        values.put(Constants.AD_CITY,city);
        values.put(Constants.AD_ID,ad_id);
        values.put(Constants.AD_IMAGE,image);
        values.put(Constants.USER_ID,user_id);
        dba.insert(Constants.TABLE_NAME, null, values);
        Log.v("fav added", "yes");
        dba.close();
    }
    //delete fav
    public void deleteFavourite(String id){
        SQLiteDatabase dba = this.getReadableDatabase();
        dba.delete(Constants.TABLE_NAME, Constants.AD_ID + " = ? ", new String[]{String.valueOf(id)});
        dba.close();
    }
    //delete fav
    public Boolean isFavourite(String id){
        SQLiteDatabase dba = this.getReadableDatabase();
        String query = String.format("SELECT * FROM  adsFavs WHERE  AdId='%s';",id);
        Cursor cursor = dba.rawQuery(query,null);
        if(cursor.getCount() <= 0){
            cursor.close();
            return false;
        }
        cursor.close();
        return true;
    }
    public ArrayList<AdInfo> getFavs(){
        adsList.clear();
        SQLiteDatabase dba = this.getReadableDatabase();
        Cursor cursor = dba.query(Constants.TABLE_NAME,new String[]{Constants.KEY_ID,Constants.AD_TITLE,Constants.AD_CITY,Constants.AD_IMAGE,Constants.AD_ID,Constants.USER_ID},null,null,null,null,Constants.KEY_ID + " DESC ");
        if(cursor.moveToNext()){
            do {
                AdInfo adInfo = new AdInfo();
                adInfo.setTitle(cursor.getString(cursor.getColumnIndex(Constants.AD_TITLE)));
                adInfo.setCity(cursor.getString(cursor.getColumnIndex(Constants.AD_CITY)));
                adInfo.setAdId(cursor.getString(cursor.getColumnIndex(Constants.AD_ID)));
                adInfo.setImageUrl(cursor.getString(cursor.getColumnIndex(Constants.AD_IMAGE)));
                adsList.add(adInfo);
                Log.d("adInfo",adInfo.getAdId());
            }while(cursor.moveToNext());
        }
        cursor.close();
        dba.close();
        return adsList;
    }

}
                                                        
                                                    

دروس ذات صلة

AN

تطبيق إعلانات بأندرويد و firebase الجزء الأول

فهاد التطبيق الجديد من سلسلة أندرويد غادي نقادو تطبيق ديال إعلانات بحال avito فالمستخدم ديال التطبيق...


AN

تطبيق إعلانات بأندرويد و firebase الجزء الثاني

فهاد الجزء الثاني من تطبيق إعلانات بأندرويد و firebase غادي نكملو الملفات ديالنا غادي نكملو ملف...


AN

تطبيق إعلانات بأندرويد و firebase الجزء الثالت

فهاد الجزء الثالت من تطبيق إعلانات بأندرويد و firebase  غادي نكملو الملفات ديالنا فدبا غادي نزيدو ال...


AN

تطبيق إعلانات بأندرويد و firebase الجزء الرابع

فهاد الجزء الرابع من تطبيق إعلانات بأندرويد و firebase غادي نكملو الملف لي غادي يمكن المستخدم ل...


AN

تطبيق إعلانات بأندرويد و firebase الجزء السادس

فهاد الجزء السادس من تطبيق إعلانات بأندرويد و firebase غادي نشوفوا كيفاش نزيدو لملفات لي غادي يمكنوا...


AN

تطبيق إعلانات بأندرويد و firebase الجزء السابع

فهاد الجزء السابع من تطبيق إعلانات بأندرويد و firebase غادي نكملو الملفات ديالنا غادي نشوفوا كيفاش ن...


AN

تطبيق إعلانات بأندرويد و firebase الجزء الثامن

فهاد الجزء الثامن من تطبيق إعلانات بأندرويد و firebase غادي نكملو الملفات الخاصة بالبروفايل ديال الم...


AN

تطبيق إعلانات بأندرويد و firebase الجزء التاسع والأخير

فهاد الجزء الأخير من تطبيق إعلانات بأندرويد و firebase غادي نكملو الملفات لي بقاونا فغادي نشوفوا كيف...