Update Firebase ServerApp

This commit is contained in:
phanhuuloi27
2022-06-30 08:05:35 +07:00
parent 3f65237418
commit d2872f6b04
15 changed files with 357 additions and 83 deletions
+9 -6
View File
@@ -46,22 +46,25 @@ dependencies {
//Add library
implementation 'com.google.firebase:firebase-core:11.8.0'
implementation 'com.google.firebase:firebase-database:11.8.0'
implementation 'com.firebaseui:firebase-ui-database:1.2.0'
implementation 'com.squareup.picasso:picasso:2.5.2'
implementation 'com.google.firebase:firebase-auth:11.8.0'
implementation 'com.google.firebase:firebase-storage:11.8.0'
implementation 'com.github.jd-alexander:android-flat-button:v1.1'
implementation 'com.rengwuxian.materialedittext:library:2.1.4'
implementation 'com.jaredrummler:material-spinner:1.1.0'
implementation 'com.google.android.gms:play-services-maps:11.8.0'
implementation 'com.google.android.gms:play-services:11.8.0'
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
//Firebase
implementation 'com.google.firebase:firebase-core:11.8.0'
implementation 'com.google.firebase:firebase-database:11.8.0'
implementation 'com.google.firebase:firebase-auth:11.8.0'
implementation 'com.google.firebase:firebase-storage:11.8.0'
implementation 'com.google.firebase:firebase-messaging:11.8.0'
implementation 'com.firebaseui:firebase-ui-database:3.2.0'
}
@@ -16,6 +16,9 @@
android:supportsRtl="true"
android:theme="@style/Theme.FoodifyServer"
tools:targetApi="31">
<activity
android:name=".BannerActivity"
android:exported="false" />
<activity
android:name=".OrderDetail"
android:exported="false" />
@@ -71,7 +74,6 @@
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<service
android:name=".Service.MyFirebaseMessaging"
android:exported="false">
@@ -79,7 +81,6 @@
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
</manifest>
@@ -0,0 +1,107 @@
package com.waterbase.foodifyServer;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.net.Uri;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
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.rengwuxian.materialedittext.MaterialEditText;
import com.squareup.picasso.Picasso;
import com.waterbase.foodifyServer.Model.Banner;
import com.waterbase.foodifyServer.ViewHolder.BannerViewHolder;
import info.hoang8f.widget.FButton;
public class BannerActivity extends AppCompatActivity {
RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;
RelativeLayout rootLayout;
FloatingActionButton fab;
//Firebase
FirebaseDatabase db;
DatabaseReference banners;
FirebaseStorage storage;
StorageReference storageReference;
FirebaseRecyclerAdapter<Banner, BannerViewHolder> adapter;
//Add new Banner
MaterialEditText edtName, edtFoodId;
FButton btnUpload, btnSelect;
Banner newBanner;
Uri filePath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_banner);
//Init firebase
db = FirebaseDatabase.getInstance();
banners = db.getReference("Banner");
storage = FirebaseStorage.getInstance();
storageReference = storage.getReference();
recyclerView = findViewById(R.id.recycler_banner);
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
rootLayout = findViewById(R.id.rootLayout);
fab = findViewById(R.id.fab);
fab.setOnClickListener((view) -> { showAddBanner(); });
loadListBanner();
}
private void loadListBanner() {
FirebaseRecyclerOptions<Banner> allBanner = new FirebaseRecyclerOptions.Builder<Banner>()
.setQuery(banners, Banner.class)
.build();
adapter = new FirebaseRecyclerAdapter<Banner, BannerViewHolder>(allBanner) {
@Override
protected void onBindViewHolder(@NonNull BannerViewHolder holder, int position, @NonNull Banner model) {
holder.banner_name.setText(model.getName());
Picasso.with(getBaseContext())
.load(model.getImage())
.into(holder.banner_image);
}
@NonNull
@Override
public BannerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return null;
}
};
adapter.startListening();
}
@Override
protected void onStop() {
super.onStop();
adapter.stopListening();
}
private void showAddBanner() {
}
}
@@ -16,15 +16,18 @@ import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.Toast;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.OnProgressListener;
import com.google.firebase.storage.StorageReference;
@@ -211,29 +214,41 @@ public class FoodList extends AppCompatActivity {
}
private void loadListFood(String categoryId) {
adapter = new FirebaseRecyclerAdapter<Food, FoodViewHolder>(
Food.class,
R.layout.food_item,
FoodViewHolder.class,
foodList.orderByChild("menuId").equalTo(categoryId)
) {
@Override
protected void populateViewHolder(FoodViewHolder viewHolder, Food model, int i) {
viewHolder.txtFoodName.setText(model.getName());
Picasso.with(getBaseContext()).load(model.getImage()).into(viewHolder.imageView);
viewHolder.setItemClickListener(new ItemClickListener() {
@Override
public void onClick(View view, int position, boolean isLongClick) {
//Code later
}
});
Query listFoodByCategoryId = foodList.orderByChild("menuId").equalTo(categoryId);
FirebaseRecyclerOptions<Food> options = new FirebaseRecyclerOptions.Builder<Food>()
.setQuery(listFoodByCategoryId, Food.class)
.build();
adapter = new FirebaseRecyclerAdapter<Food, FoodViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull FoodViewHolder viewHolder, int i, @NonNull Food model) {
viewHolder.txtFoodName.setText(model.getName());
Picasso.with(getBaseContext())
.load(model.getImage())
.into(viewHolder.imageView);
}
@NonNull
@Override
public FoodViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.food_item, parent, false);
return new FoodViewHolder(itemView);
}
};
adapter.startListening();
adapter.notifyDataSetChanged();
recyclerView.setAdapter(adapter);
}
@Override
protected void onStop() {
super.onStop();
adapter.stopListening();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
@@ -9,10 +9,12 @@ import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Menu;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
@@ -222,6 +224,12 @@ public class Home extends AppCompatActivity implements NavigationView.OnNavigati
}
}
@Override
protected void onResume() {
super.onResume();
loadMenu();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
@@ -241,14 +249,14 @@ public class Home extends AppCompatActivity implements NavigationView.OnNavigati
}
private void loadMenu() {
adapter = new FirebaseRecyclerAdapter<Category, MenuViewHolder>(
Category.class,
R.layout.menu_item,
MenuViewHolder.class,
categories
) {
FirebaseRecyclerOptions<Category> options = new FirebaseRecyclerOptions.Builder<Category>()
.setQuery(categories, Category.class)
.build();
adapter = new FirebaseRecyclerAdapter<Category, MenuViewHolder>(options) {
@Override
protected void populateViewHolder(MenuViewHolder viewHolder, Category model, int i) {
protected void onBindViewHolder(@NonNull MenuViewHolder viewHolder, int i, @NonNull Category model) {
viewHolder.txtMenuName.setText(model.getName());
Picasso.with(Home.this).load(model.getImage()).into(viewHolder.imageView);
@@ -262,17 +270,25 @@ public class Home extends AppCompatActivity implements NavigationView.OnNavigati
}
});
}
@NonNull
@Override
public MenuViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.menu_item, parent, false);
return new MenuViewHolder(itemView);
}
};
adapter.startListening();
adapter.notifyDataSetChanged(); //Refresh data if have data changed
recycler_menu.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.home, menu);
return true;
protected void onStop() {
super.onStop();
adapter.stopListening();
}
@Override
@@ -282,6 +298,9 @@ public class Home extends AppCompatActivity implements NavigationView.OnNavigati
if(id == R.id.nav_orders) {
Intent orders = new Intent(Home.this, OrderStatus.class);
startActivity(orders);
} else if(id == R.id.nav_banner) {
Intent banner = new Intent(Home.this, BannerActivity.class);
startActivity(banner);
}
DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
@@ -0,0 +1,38 @@
package com.waterbase.foodifyServer.Model;
public class Banner {
private String id, name, image;
public Banner(String id, String name, String image) {
this.id = id;
this.name = name;
this.image = image;
}
public Banner() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
}
@@ -13,9 +13,11 @@ import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
@@ -72,14 +74,14 @@ public class OrderStatus extends AppCompatActivity {
}
private void loadOrders() {
adapter = new FirebaseRecyclerAdapter<Request, OrderViewHolder>(
Request.class,
R.layout.order_layout,
OrderViewHolder.class,
requests
) {
FirebaseRecyclerOptions<Request> options = new FirebaseRecyclerOptions.Builder<Request>()
.setQuery(requests, Request.class)
.build();
adapter = new FirebaseRecyclerAdapter<Request, OrderViewHolder>(options) {
@Override
protected void populateViewHolder(OrderViewHolder viewHolder, Request model, int i) {
protected void onBindViewHolder(@NonNull OrderViewHolder viewHolder, int i, @NonNull Request model) {
viewHolder.txtOrderId.setText(adapter.getRef(i).getKey());
viewHolder.txtOrderStatus.setText(Common.coverCodeToStatus(model.getStatus()));
viewHolder.txtOrderAddress.setText(model.getAddress());
@@ -89,14 +91,14 @@ public class OrderStatus extends AppCompatActivity {
viewHolder.btnEdit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showUpdateDialog(adapter.getRef(i).getKey(), adapter.getItem(i));
showUpdateDialog(adapter.getRef(viewHolder.getAdapterPosition()).getKey(), adapter.getItem(viewHolder.getAdapterPosition()));
}
});
viewHolder.btnRemove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
deleteOrder(adapter.getRef(i).getKey());
deleteOrder(adapter.getRef(viewHolder.getAdapterPosition()).getKey());
}
});
@@ -105,7 +107,7 @@ public class OrderStatus extends AppCompatActivity {
public void onClick(View v) {
Intent orderDetail = new Intent(OrderStatus.this, OrderDetail.class);
Common.currentRequest = model;
orderDetail.putExtra("OrderId", adapter.getRef(i).getKey());
orderDetail.putExtra("OrderId", adapter.getRef(viewHolder.getAdapterPosition()).getKey());
startActivity(orderDetail);
}
});
@@ -119,11 +121,33 @@ public class OrderStatus extends AppCompatActivity {
}
});
}
@NonNull
@Override
public OrderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.order_layout, parent, false);
return new OrderViewHolder(itemView);
}
};
adapter.startListening();
adapter.notifyDataSetChanged();
recyclerView.setAdapter(adapter);
}
@Override
protected void onStop() {
super.onStop();
adapter.stopListening();
}
@Override
protected void onResume() {
super.onResume();
loadOrders();
}
private void deleteOrder(String key) {
requests.child(key).removeValue();
adapter.notifyDataSetChanged();
@@ -0,0 +1,36 @@
package com.waterbase.foodifyServer.ViewHolder;
import android.view.ContextMenu;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.waterbase.foodifyServer.Common.Common;
import com.waterbase.foodifyServer.Interface.ItemClickListener;
import com.waterbase.foodifyServer.R;
public class BannerViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener{
public TextView banner_name;
public ImageView banner_image;
public BannerViewHolder(@NonNull View itemView) {
super(itemView);
banner_name = itemView.findViewById(R.id.banner_name);
banner_image = itemView.findViewById(R.id.banner_image);
itemView.setOnCreateContextMenuListener(this);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
menu.setHeaderTitle("Tuỳ chọn:");
menu.add(0,0, getAdapterPosition(), Common.UPDATE);
menu.add(0,1, getAdapterPosition(), Common.DELETE);
}
}
@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M20,18c1.1,0 2,-0.9 2,-2V6c0,-1.1 -0.9,-2 -2,-2H4C2.9,4 2,4.9 2,6v10c0,1.1 0.9,2 2,2H0v2h24v-2H20zM4,6h16v10H4V6z"/>
</vector>
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:id="@+id/rootLayout"
tools:context=".BannerActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_banner"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_margin="@dimen/fab_margin"
android:backgroundTint="@color/white"
app:srcCompat="@drawable/ic_baseline_playlist_add_24"
/>
</RelativeLayout>
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="200dp"
app:cardElevation="4dp"
android:layout_marginBottom="8dp"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/banner_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop" />
<TextView
android:id="@+id/banner_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="#4f0e0d0e"
android:gravity="center"
android:text="Name of Banner"
android:textColor="@color/white"
android:textSize="20sp" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
@@ -5,9 +5,9 @@
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_menu"
android:icon="@drawable/ic_baseline_restaurant_24"
android:title="Menu" />
android:id="@+id/nav_banner"
android:icon="@drawable/ic_baseline_laptop_24"
android:title="Banner" />
<item
android:id="@+id/nav_cart"
android:icon="@drawable/ic_baseline_shopping_cart_24"
@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:title="@string/action_settings"
app:showAsAction="never" />
</menu>