From d2872f6b0437a8b0f420436fcaaf987174c0b33a Mon Sep 17 00:00:00 2001 From: phanhuuloi27 <73208452+Nezumi2711@users.noreply.github.com> Date: Thu, 30 Jun 2022 08:05:35 +0700 Subject: [PATCH] Update Firebase ServerApp --- .../main/java/com/waterbase/foodify/Home.java | 15 --- Foodify/app/src/main/res/menu/home.xml | 11 -- FoodifyServer/app/build.gradle | 15 ++- .../app/src/main/AndroidManifest.xml | 5 +- .../foodifyServer/BannerActivity.java | 107 ++++++++++++++++++ .../com/waterbase/foodifyServer/FoodList.java | 47 +++++--- .../com/waterbase/foodifyServer/Home.java | 41 +++++-- .../waterbase/foodifyServer/Model/Banner.java | 38 +++++++ .../waterbase/foodifyServer/OrderStatus.java | 44 +++++-- .../ViewHolder/BannerViewHolder.java | 36 ++++++ .../res/drawable/ic_baseline_laptop_24.xml | 5 + .../src/main/res/layout/activity_banner.xml | 28 +++++ .../app/src/main/res/layout/banner_layout.xml | 33 ++++++ .../main/res/menu/activity_main_drawer.xml | 6 +- FoodifyServer/app/src/main/res/menu/home.xml | 9 -- 15 files changed, 357 insertions(+), 83 deletions(-) delete mode 100644 Foodify/app/src/main/res/menu/home.xml create mode 100644 FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/BannerActivity.java create mode 100644 FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Model/Banner.java create mode 100644 FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/ViewHolder/BannerViewHolder.java create mode 100644 FoodifyServer/app/src/main/res/drawable/ic_baseline_laptop_24.xml create mode 100644 FoodifyServer/app/src/main/res/layout/activity_banner.xml create mode 100644 FoodifyServer/app/src/main/res/layout/banner_layout.xml delete mode 100644 FoodifyServer/app/src/main/res/menu/home.xml diff --git a/Foodify/app/src/main/java/com/waterbase/foodify/Home.java b/Foodify/app/src/main/java/com/waterbase/foodify/Home.java index 9d4218c..ad928c0 100644 --- a/Foodify/app/src/main/java/com/waterbase/foodify/Home.java +++ b/Foodify/app/src/main/java/com/waterbase/foodify/Home.java @@ -307,21 +307,6 @@ public class Home extends AppCompatActivity implements NavigationView.OnNavigati recyler_menu.scheduleLayoutAnimation(); } - @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; - } - - @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { - if (item.getItemId() == R.id.refresh) - loadMenu(); - - return super.onOptionsItemSelected(item); - } - @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { int id = item.getItemId(); diff --git a/Foodify/app/src/main/res/menu/home.xml b/Foodify/app/src/main/res/menu/home.xml deleted file mode 100644 index 5336e7e..0000000 --- a/Foodify/app/src/main/res/menu/home.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - \ No newline at end of file diff --git a/FoodifyServer/app/build.gradle b/FoodifyServer/app/build.gradle index a58eb35..46ab543 100644 --- a/FoodifyServer/app/build.gradle +++ b/FoodifyServer/app/build.gradle @@ -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' } diff --git a/FoodifyServer/app/src/main/AndroidManifest.xml b/FoodifyServer/app/src/main/AndroidManifest.xml index a36fc99..1ac27f1 100644 --- a/FoodifyServer/app/src/main/AndroidManifest.xml +++ b/FoodifyServer/app/src/main/AndroidManifest.xml @@ -16,6 +16,9 @@ android:supportsRtl="true" android:theme="@style/Theme.FoodifyServer" tools:targetApi="31"> + @@ -71,7 +74,6 @@ - @@ -79,7 +81,6 @@ - \ No newline at end of file diff --git a/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/BannerActivity.java b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/BannerActivity.java new file mode 100644 index 0000000..7141de0 --- /dev/null +++ b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/BannerActivity.java @@ -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 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 allBanner = new FirebaseRecyclerOptions.Builder() + .setQuery(banners, Banner.class) + .build(); + + adapter = new FirebaseRecyclerAdapter(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() { + + } +} \ No newline at end of file diff --git a/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/FoodList.java b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/FoodList.java index 3c22c33..861dd7b 100644 --- a/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/FoodList.java +++ b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/FoodList.java @@ -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.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 options = new FirebaseRecyclerOptions.Builder() + .setQuery(listFoodByCategoryId, Food.class) + .build(); + + adapter = new FirebaseRecyclerAdapter(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); diff --git a/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Home.java b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Home.java index fd48dfb..ed1ab03 100644 --- a/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Home.java +++ b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Home.java @@ -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.class, - R.layout.menu_item, - MenuViewHolder.class, - categories - ) { + + FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder() + .setQuery(categories, Category.class) + .build(); + + adapter = new FirebaseRecyclerAdapter(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); diff --git a/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Model/Banner.java b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Model/Banner.java new file mode 100644 index 0000000..e3a9862 --- /dev/null +++ b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Model/Banner.java @@ -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; + } +} diff --git a/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/OrderStatus.java b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/OrderStatus.java index 5a1a3bf..fb4f3cf 100644 --- a/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/OrderStatus.java +++ b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/OrderStatus.java @@ -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.class, - R.layout.order_layout, - OrderViewHolder.class, - requests - ) { + + FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder() + .setQuery(requests, Request.class) + .build(); + + adapter = new FirebaseRecyclerAdapter(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(); diff --git a/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/ViewHolder/BannerViewHolder.java b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/ViewHolder/BannerViewHolder.java new file mode 100644 index 0000000..9918d28 --- /dev/null +++ b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/ViewHolder/BannerViewHolder.java @@ -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); + } +} diff --git a/FoodifyServer/app/src/main/res/drawable/ic_baseline_laptop_24.xml b/FoodifyServer/app/src/main/res/drawable/ic_baseline_laptop_24.xml new file mode 100644 index 0000000..071cc11 --- /dev/null +++ b/FoodifyServer/app/src/main/res/drawable/ic_baseline_laptop_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/FoodifyServer/app/src/main/res/layout/activity_banner.xml b/FoodifyServer/app/src/main/res/layout/activity_banner.xml new file mode 100644 index 0000000..e6cb18f --- /dev/null +++ b/FoodifyServer/app/src/main/res/layout/activity_banner.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/FoodifyServer/app/src/main/res/layout/banner_layout.xml b/FoodifyServer/app/src/main/res/layout/banner_layout.xml new file mode 100644 index 0000000..09eaccc --- /dev/null +++ b/FoodifyServer/app/src/main/res/layout/banner_layout.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/FoodifyServer/app/src/main/res/menu/activity_main_drawer.xml b/FoodifyServer/app/src/main/res/menu/activity_main_drawer.xml index 30bcb55..3904ce2 100644 --- a/FoodifyServer/app/src/main/res/menu/activity_main_drawer.xml +++ b/FoodifyServer/app/src/main/res/menu/activity_main_drawer.xml @@ -5,9 +5,9 @@ + android:id="@+id/nav_banner" + android:icon="@drawable/ic_baseline_laptop_24" + android:title="Banner" /> - - - \ No newline at end of file