تطبيق إعلانات بأندرويد و firebase الجزء الخامس
نظرة سريعة بالفيديو
1- إضافة ملف تفاصيل الإعلان
<?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 الخاص بهاد الملف
<?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- عرض تفاصيل الإعلان
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
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;
}
}