تطبيق إعلانات بأندرويد و firebase الجزء الرابع
نظرة سريعة بالفيديو
1- إضافة الإعلان لقاعدة البيانات
package com.example.belasri.hiresell;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.AppCompatEditText;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.UserInfo;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
import com.theartofdev.edmodo.cropper.CropImage;
import com.theartofdev.edmodo.cropper.CropImageView;
import java.util.ArrayList;
public class CreateAds extends AppCompatActivity {
private Spinner citieSpinner,catSpinner;
private AppCompatEditText titleEdit,descTitle,phoneEdit;
private Toolbar toolbar;
ImageButton imageButton;
private StorageReference storageReference;
private FirebaseDatabase database;
private DatabaseReference databaseReference;
private FirebaseAuth.AuthStateListener authStateListener;
private FirebaseAuth mAuth;
private static final int RESULT_IMAGE = 1;
Uri resultUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.create_ads);
mAuth = FirebaseAuth.getInstance();
storageReference = FirebaseStorage.getInstance().getReference();
databaseReference = database.getInstance().getReference().child("Ads");
checkIfLogged();
citieSpinner = (Spinner) findViewById(R.id.citySpinner);
catSpinner = (Spinner) findViewById(R.id.categorieSpinner);
toolbar = (Toolbar) findViewById(R.id.toolbar);
imageButton = (ImageButton) findViewById(R.id.image_uploaded);
titleEdit = (AppCompatEditText) findViewById(R.id.adtitle);
descTitle = (AppCompatEditText) findViewById(R.id.adbody);
phoneEdit = (AppCompatEditText) findViewById(R.id.userTel);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getCitites();
getCategories();
citieSpinner.setSelection(0);
catSpinner.setSelection(0);
}
@Override
protected void onStart() {
mAuth.addAuthStateListener(authStateListener);
super.onStart();
}
@Override
public void onBackPressed()
{
super.onBackPressed();
finish();
}
public void getCitites(){
ArrayList<String> cities = new ArrayList<>();
cities.add("Veuillez choisir une ville");
cities.add("Fés");
cities.add("Rabat");
cities.add("Casablanca");
cities.add("Taza");
cities.add("Tanger");
cities.add("Agadir");
cities.add("Oujda");
cities.add("Marrakech");
final ArrayAdapter<String> spinnnerArrayAdapter = new ArrayAdapter<String>(this,R.layout.spinner_item,cities){
@Override
public boolean isEnabled(int position){
if(position == 0)
{
// Disable the first item from Spinner
return false;
}
else
{
return true;
}
}
@Override
public View getDropDownView(int position, View convertView,ViewGroup parent) {
View view = super.getDropDownView(position, convertView, parent);
TextView tv = (TextView) view;
if(position==0) {
// Set the disable item text color
tv.setTextColor(Color.GRAY);
}
return view;
}
};
spinnnerArrayAdapter.setDropDownViewResource(R.layout.spinner_item);
citieSpinner.setAdapter(spinnnerArrayAdapter);
}
public void getCategories(){
ArrayList<String> categories = new ArrayList<>();
categories.add("Veuillez chosir une catégorie");
categories.add("Véhicules");
categories.add("Animaux");
categories.add("Immobilier");
categories.add("Informatique");
categories.add("Emplois");
categories.add("Vétements");
categories.add("Ventes divers");
final ArrayAdapter<String> spinnnerCatArrayAdapter = new ArrayAdapter<String>(this,R.layout.spinner_item,categories){
@Override
public boolean isEnabled(int position){
if(position == 0)
{
// Disable the first item from Spinner
return false;
}
else
{
return true;
}
}
@Override
public View getDropDownView(int position, View convertView,ViewGroup parent) {
View view = super.getDropDownView(position, convertView, parent);
TextView tv = (TextView) view;
if(position==0) {
// Set the disable item text color
tv.setTextColor(Color.GRAY);
}
return view;
}
};
spinnnerCatArrayAdapter.setDropDownViewResource(R.layout.spinner_item);
catSpinner.setAdapter(spinnnerCatArrayAdapter);
}
public void uploadAdImage(View view) {
Intent gallery = new Intent(Intent.ACTION_GET_CONTENT);
gallery.setType("image/*");
startActivityForResult(gallery,RESULT_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == RESULT_IMAGE && resultCode == RESULT_OK){
Uri imagePath = data.getData();
//make the user crop the image
CropImage.activity(imagePath).setGuidelines(CropImageView.Guidelines.ON)
.setAspectRatio(1,1)
.start(this);
}
//if image has successufully croped
if(requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE){
//get result
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if(resultCode == RESULT_OK){
resultUri = result.getUri();
imageButton.setImageURI(resultUri);
imageButton.setTag(resultUri);
}else if(resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE){
Exception error = result.getError();
}
}
}
public void checkIfLogged(){
authStateListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
if(firebaseAuth.getCurrentUser() == null) {
Intent loginIntent = new Intent(CreateAds.this,LoginActivity.class);
//prevent user from returning back
loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(loginIntent);
}
}
};
}
public void createNewAd(View view) {
final String title = titleEdit.getText().toString().trim();
final String desc = descTitle.getText().toString().trim();
final String phone = phoneEdit.getText().toString().trim();
if(!TextUtils.isEmpty(title) && !TextUtils.isEmpty(desc) && !TextUtils.isEmpty(phone)) {
StorageReference filePath = storageReference.child("images").child(resultUri.getLastPathSegment());
filePath.putFile(resultUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
@SuppressWarnings("VisibleForTests") Uri downloadUrl = taskSnapshot.getDownloadUrl();
UserInfo userInfo = mAuth.getCurrentUser();
Log.d("userInfo", userInfo.toString());
DatabaseReference newPost = databaseReference.push();
newPost.child("title").setValue(title);
newPost.child("description").setValue(desc);
newPost.child("imageUrl").setValue(downloadUrl.toString());
newPost.child("user_id").setValue(userInfo.getUid());
newPost.child("category").setValue(catSpinner.getSelectedItem().toString());
newPost.child("city").setValue(citieSpinner.getSelectedItem().toString());
Toast.makeText(CreateAds.this, "Annonce ajoutée avec succés", Toast.LENGTH_SHORT).show();
Intent home = new Intent(CreateAds.this, MainActivity.class);
home.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(home);
}
});
}else{
Toast.makeText(this, "Veuillez remplir tous les champs", Toast.LENGTH_SHORT).show();
}
}
}
2- استرجاع وعرض الإعلانات من قاعدة البيانات
package com.example.belasri.hiresell;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
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 com.firebase.ui.database.FirebaseRecyclerAdapter;
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 helpers.BottomNavigationViewHelper;
import models.AdInfo;
import models.SessionManager;
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, BottomNavigationView.OnNavigationItemSelectedListener{
private Toolbar toolbar;
private NavigationView navigationView;
private DrawerLayout drawerLayout;
private BottomNavigationView bottomNavigationView;
private FloatingActionButton createAd;
private BottomNavigationViewHelper bottomNavigationViewHelper;
private FirebaseAuth.AuthStateListener authStateListener;
private FirebaseAuth mAuth;
private TextView userHeaderName,userEmailName;
private ImageView HeaderProfileImage;
private DatabaseReference db;
private DatabaseReference adsDb;
private RecyclerView recyclerview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nav_drawer);
mAuth = FirebaseAuth.getInstance();
showMenu();
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottomNav);
bottomNavigationView.setOnNavigationItemSelectedListener(this);
bottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
navigationView = (NavigationView) findViewById(R.id.navView);
drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
createAd = (FloatingActionButton) findViewById(R.id.createBtn);
navigationView.setNavigationItemSelectedListener(this);
recyclerview = (RecyclerView) findViewById(R.id.recyclerView);
LinearLayoutManager linearManager = new LinearLayoutManager(this);
linearManager.setOrientation(linearManager.VERTICAL);
recyclerview.setLayoutManager(new GridLayoutManager(this,2));
recyclerview.setItemAnimator(new DefaultItemAnimator());
db = FirebaseDatabase.getInstance().getReference().child("profiles");
adsDb = FirebaseDatabase.getInstance().getReference().child("Ads");
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.open_drawer,R.string.close_drawer);
drawerLayout.setDrawerListener(toggle);
toggle.syncState();
showAds();
createNewAd();
}
@Override
protected void onStart() {
mAuth.addAuthStateListener(authStateListener);
super.onStart();
}
@Override
public void onBackPressed() {
if(drawerLayout.isDrawerOpen(GravityCompat.START)){
drawerLayout.closeDrawer(GravityCompat.START);
}else {
super.onBackPressed();
}
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
switch(id){
case R.id.home :
Intent homeIntent = new Intent(MainActivity.this,MainActivity.class);
startActivity(homeIntent);
break;
case R.id.fav :
Intent favsIntent = new Intent(MainActivity.this,FavActivity.class);
startActivity(favsIntent);
break;
case R.id.register :
Intent registerIntent = new Intent(MainActivity.this,RegisterActivity.class);
startActivity(registerIntent);
break;
case R.id.login :
Intent loginIntent = new Intent(MainActivity.this,LoginActivity.class);
startActivity(loginIntent);
break;
case R.id.profile :
Intent profileIntent = new Intent(MainActivity.this,ProfileActivity.class);
startActivity(profileIntent);
break;
case R.id.search :
Intent searchIntent = new Intent(MainActivity.this,SearchActivity.class);
startActivity(searchIntent);
break;
case R.id.logout :
mAuth.signOut();
Intent home = new Intent(MainActivity.this,MainActivity.class);
startActivity(home);
break;
}
drawerLayout.closeDrawer(GravityCompat.START);
return true;
}
public void createNewAd(){
createAd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent createAd = new Intent(MainActivity.this,CreateAds.class);
startActivity(createAd);
}
});
}
private void showAds(){
FirebaseRecyclerAdapter<AdInfo, AdsViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<AdInfo, AdsViewHolder>(
AdInfo.class,
R.layout.list_item,
AdsViewHolder.class,
adsDb
) {
@Override
protected void populateViewHolder(AdsViewHolder viewHolder, AdInfo model, int position) {
//get selected post id
final String ad_id = getRef(position).getKey().toString();
viewHolder.setTitle(model.getTitle());
viewHolder.setCity(model.getCity());
viewHolder.setImage(model.getImageUrl(),getApplicationContext());
viewHolder.view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent singlePost = new Intent(MainActivity.this,AdDetails.class);
singlePost.putExtra("ad_id",ad_id);
startActivity(singlePost);
}
});
}
};
recyclerview.setAdapter(firebaseRecyclerAdapter);
}
public static class AdsViewHolder extends RecyclerView.ViewHolder{
View view;
public AdsViewHolder(View itemView) {
super(itemView);
view = itemView;
}
public void setTitle(String title){
TextView adTitle = (TextView) view.findViewById(R.id.title);
adTitle.setText(title);
}
public void setCity(String city){
TextView adCity = (TextView) view.findViewById(R.id.city);
adCity.setText(city);
}
public void setImage(String image,Context ctx){
ImageView imageView = (ImageView) view.findViewById(R.id.image);
Picasso.with(ctx).load(image).into(imageView);
}
}
public void showMenu(){
authStateListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
if(firebaseAuth.getCurrentUser() == null){
navigationView.getMenu().findItem(R.id.register).setVisible(true);
navigationView.getMenu().findItem(R.id.login).setVisible(true);
navigationView.getMenu().findItem(R.id.logout).setVisible(false);
navigationView.getMenu().findItem(R.id.profile).setVisible(false);
//get header textviews
View header = navigationView.getHeaderView(0);
userHeaderName = header.findViewById(R.id.user_header_fullname);
userEmailName = header.findViewById(R.id.user_header_email);
HeaderProfileImage = header.findViewById(R.id.user_header_image);
HeaderProfileImage.setVisibility(View.INVISIBLE);
userHeaderName.setText("");
userEmailName.setText("");
}else{
navigationView.getMenu().findItem(R.id.register).setVisible(false);
navigationView.getMenu().findItem(R.id.login).setVisible(false);
navigationView.getMenu().findItem(R.id.logout).setVisible(true);
navigationView.getMenu().findItem(R.id.profile).setVisible(true);
//get header textviews
View header = navigationView.getHeaderView(0);
userHeaderName = header.findViewById(R.id.user_header_fullname);
userEmailName = header.findViewById(R.id.user_header_email);
HeaderProfileImage = header.findViewById(R.id.user_header_image);
db.child(mAuth.getCurrentUser().getUid()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String fullname = (String) dataSnapshot.child("fullname").getValue();
String email = mAuth.getCurrentUser().getEmail();
String image = (String) dataSnapshot.child("image_url").getValue();
if(image != null) {
Picasso.with(MainActivity.this).load(image).into(HeaderProfileImage);
}else {
HeaderProfileImage.setImageResource(R.drawable.abc56789);
}
userHeaderName.setText(fullname);
userEmailName.setText(email);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
};
}
}
3- كيفاش ن activer onItemClick ديال recycler view
package helpers;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import com.example.belasri.hiresell.R;
/**
* Created by belasri on 17/12/2017.
*/
public class RecyclerViewItemClick {
private final RecyclerView mRecyclerView;
private OnItemClickListener mOnItemClickListener;
private OnItemLongClickListener mOnItemLongClickListener;
private View.OnClickListener mOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
mOnItemClickListener.onItemClicked(mRecyclerView, holder.getAdapterPosition(), v);
}
}
};
private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (mOnItemLongClickListener != null) {
RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
mOnItemLongClickListener.onItemLongClicked(mRecyclerView, holder.getAdapterPosition(), v);
}
return false;
}
};
private RecyclerView.OnChildAttachStateChangeListener mAttachListener
= new RecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
if (mOnItemClickListener != null) {
view.setOnClickListener(mOnClickListener);
}
if (mOnItemLongClickListener != null) {
view.setOnLongClickListener(mOnLongClickListener);
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
}
};
private RecyclerViewItemClick(RecyclerView recyclerView) {
mRecyclerView = recyclerView;
mRecyclerView.setTag(R.id.item_click_support, this);
mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener);
}
public static RecyclerViewItemClick addTo(RecyclerView view) {
RecyclerViewItemClick support = (RecyclerViewItemClick) view.getTag(R.id.item_click_support);
if (support == null) {
support = new RecyclerViewItemClick(view);
}
return support;
}
public static RecyclerViewItemClick removeFrom(RecyclerView view) {
RecyclerViewItemClick support = (RecyclerViewItemClick) view.getTag(R.id.item_click_support);
if (support != null) {
support.detach(view);
}
return support;
}
public RecyclerViewItemClick setOnItemClickListener(OnItemClickListener listener) {
mOnItemClickListener = listener;
return this;
}
public RecyclerViewItemClick setOnItemLongClickListener(OnItemLongClickListener listener) {
mOnItemLongClickListener = listener;
return this;
}
private void detach(RecyclerView view) {
view.removeOnChildAttachStateChangeListener(mAttachListener);
view.setTag(R.id.item_click_support, null);
}
public interface OnItemClickListener {
void onItemClicked(RecyclerView recyclerView, int position, View v);
}
public interface OnItemLongClickListener {
void onItemLongClicked(RecyclerView recyclerView, int position, View v);
}
}
4- إضافة الملف ids.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="item_click_support" type="id" />
</resources>
5- كيفاش نغير شكل ل icones فل bottom navigation menu
package helpers;
import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import android.util.Log;
import java.lang.reflect.Field;
/**
* Created by belasri on 29/11/2017.
*/
public class BottomNavigationViewHelper {
public static void disableShiftMode(BottomNavigationView view) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
try {
Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
shiftingMode.setAccessible(true);
shiftingMode.setBoolean(menuView, false);
shiftingMode.setAccessible(false);
for (int i = 0; i < menuView.getChildCount(); i++) {
BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
//noinspection RestrictedApi
item.setShiftingMode(false);
// set once again checked value, so view will be updated
//noinspection RestrictedApi
item.setChecked(item.getItemData().isChecked());
}
} catch (NoSuchFieldException e) {
Log.e("BNVHelper", "Unable to get shift mode field", e);
} catch (IllegalAccessException e) {
Log.e("BNVHelper", "Unable to change value of shift mode", e);
}
}
}