From 178cbf627c6b94f0fc1f15c8312bc04082b4099d Mon Sep 17 00:00:00 2001 From: phanhuuloi27 <73208452+Nezumi2711@users.noreply.github.com> Date: Sun, 5 Jun 2022 11:51:50 +0700 Subject: [PATCH] Create New Category --- FoodifyServer/app/build.gradle | 6 + .../foodifyServer/Common/Category.java | 30 +++ .../com/waterbase/foodifyServer/Home.java | 196 +++++++++++++++++- .../Interface/ItemClickListener.java | 7 + .../ViewHolder/MenuViewHolder.java | 35 ++++ .../main/res/layout/add_new_menu_layout.xml | 79 +++++++ .../app/src/main/res/layout/app_bar_home.xml | 1 + .../app/src/main/res/layout/menu_item.xml | 32 +++ .../app/src/main/res/values/colors.xml | 7 + 9 files changed, 392 insertions(+), 1 deletion(-) create mode 100644 FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Common/Category.java create mode 100644 FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Interface/ItemClickListener.java create mode 100644 FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/ViewHolder/MenuViewHolder.java create mode 100644 FoodifyServer/app/src/main/res/layout/add_new_menu_layout.xml create mode 100644 FoodifyServer/app/src/main/res/layout/menu_item.xml diff --git a/FoodifyServer/app/build.gradle b/FoodifyServer/app/build.gradle index 79ea59b..238cb9c 100644 --- a/FoodifyServer/app/build.gradle +++ b/FoodifyServer/app/build.gradle @@ -47,6 +47,12 @@ dependencies { //Add library implementation 'com.google.firebase:firebase-core:10.2.0' implementation 'com.google.firebase:firebase-database:10.2.0' + implementation 'com.firebaseui:firebase-ui-database:1.2.0' + implementation 'com.squareup.picasso:picasso:2.5.2' + implementation 'com.google.firebase:firebase-auth:10.2.0' + implementation 'com.google.firebase:firebase-storage:10.2.0' + implementation 'com.github.jd-alexander:android-flat-button:v1.1' + implementation 'com.rengwuxian.materialedittext:library:2.1.4' } apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Common/Category.java b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Common/Category.java new file mode 100644 index 0000000..b20615c --- /dev/null +++ b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Common/Category.java @@ -0,0 +1,30 @@ +package com.waterbase.foodifyServer.Common; + +public class Category { + private String Name; + private String Image; + + public Category() { + } + + public Category(String name, String image) { + Name = name; + Image = image; + } + + public String getName() { + return Name; + } + + public void setName(String name) { + Name = name; + } + + public String getImage() { + return Image; + } + + public void setImage(String image) { + Image = image; + } +} 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 a39dcae..848dd57 100644 --- a/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Home.java +++ b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Home.java @@ -1,17 +1,27 @@ package com.waterbase.foodifyServer; +import android.app.ProgressDialog; +import android.content.DialogInterface; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; +import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.Menu; import android.widget.TextView; +import android.widget.Toast; +import com.firebase.ui.database.FirebaseRecyclerAdapter; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.snackbar.Snackbar; import com.google.android.material.navigation.NavigationView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBarDrawerToggle; +import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.Toolbar; import androidx.core.view.GravityCompat; import androidx.navigation.NavController; @@ -20,14 +30,52 @@ import androidx.navigation.ui.AppBarConfiguration; import androidx.navigation.ui.NavigationUI; import androidx.drawerlayout.widget.DrawerLayout; import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import com.google.firebase.database.DatabaseReference; +import com.google.firebase.database.FirebaseDatabase; +import com.google.firebase.storage.FirebaseStorage; +import com.google.firebase.storage.OnProgressListener; +import com.google.firebase.storage.StorageReference; +import com.google.firebase.storage.UploadTask; +import com.rengwuxian.materialedittext.MaterialEditText; +import com.squareup.picasso.Picasso; +import com.waterbase.foodifyServer.Common.Category; import com.waterbase.foodifyServer.Common.Common; +import com.waterbase.foodifyServer.ViewHolder.MenuViewHolder; import com.waterbase.foodifyServer.databinding.ActivityHomeBinding; +import java.util.UUID; + +import info.hoang8f.widget.FButton; + public class Home extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{ TextView txtFullName; + //Firebase + FirebaseDatabase database; + DatabaseReference categories; + FirebaseStorage storage; + StorageReference storageReference; + FirebaseRecyclerAdapter adapter; + + //View + RecyclerView recycler_menu; + RecyclerView.LayoutManager layoutManager; + + //Add new Menu Layout + MaterialEditText edtName; + FButton btnUpload, btnSelect; + + Category newCategory; + + Uri saveUri; + private final int PICK_IMAGE_REQUEST = 71; + + DrawerLayout drawer; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -38,7 +86,18 @@ public class Home extends AppCompatActivity implements NavigationView.OnNavigati toolbar.setTitle("Menu Management"); setSupportActionBar(toolbar); - DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + //Init database + database = FirebaseDatabase.getInstance(); + categories = database.getReference("Category"); + storage = FirebaseStorage.getInstance(); + storageReference = storage.getReference(); + + FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fab); + fab.setOnClickListener((view) -> { + showDialog(); + }); + + drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.app_name, R.string.app_name); drawer.setDrawerListener(toggle); toggle.syncState(); @@ -49,9 +108,144 @@ public class Home extends AppCompatActivity implements NavigationView.OnNavigati View headerView = navigationView.getHeaderView(0); txtFullName = (TextView) headerView.findViewById(R.id.txtFullName); txtFullName.setText(Common.currentUser.getName()); + + //Init View + recycler_menu = (RecyclerView) findViewById(R.id.recyler_menu); + recycler_menu.setHasFixedSize(true); + layoutManager = new LinearLayoutManager(this); + recycler_menu.setLayoutManager(layoutManager); + + loadMenu(); } + private void showDialog() { + AlertDialog.Builder alertDialog = new AlertDialog.Builder(Home.this); + alertDialog.setTitle("Thêm danh mục:"); + alertDialog.setMessage("Vui lòng điền đầy đủ thông tin"); + + LayoutInflater inflater = this.getLayoutInflater(); + View add_menu_layout = inflater.inflate(R.layout.add_new_menu_layout, null); + + edtName = add_menu_layout.findViewById(R.id.edtName); + btnSelect = add_menu_layout.findViewById(R.id.btnSelect); + btnUpload = add_menu_layout.findViewById(R.id.btnUpload); + + //Event for button + btnSelect.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + chooseImage(); //Let user select image from Gallery and save Uri of this image + } + }); + + btnUpload.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + uploadImage(); + } + }); + + alertDialog.setView(add_menu_layout); + alertDialog.setIcon(R.drawable.ic_baseline_shopping_cart_24); + + alertDialog.setPositiveButton("Thêm", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + + //Upload new category + if(newCategory != null) { + categories.push().setValue(newCategory); + Snackbar.make(drawer, "Danh mục " + newCategory.getName() + " đã được thêm", Snackbar.LENGTH_SHORT) + .show(); + } + } + }); + + alertDialog.setNegativeButton("Thoát", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + alertDialog.show(); + } + + private void uploadImage() { + if(saveUri != null) { + ProgressDialog mDialog = new ProgressDialog(this); + mDialog.setMessage("Đang tải lên...."); + mDialog.show(); + + String imageName = UUID.randomUUID().toString(); + StorageReference imageFolder = storageReference.child("/images/" + imageName); + imageFolder.putFile(saveUri) + .addOnSuccessListener(new OnSuccessListener() { + @Override + public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { + mDialog.dismiss(); + Toast.makeText(Home.this, "Đã tải lên thành công!", Toast.LENGTH_SHORT).show(); + imageFolder.getDownloadUrl().addOnSuccessListener(new OnSuccessListener() { + @Override + public void onSuccess(Uri uri) { + //Set value for new Category if image upload and we can get download link + newCategory = new Category(edtName.getText().toString(), uri.toString()); + + } + }); + } + }) + .addOnFailureListener((e) -> { + mDialog.dismiss(); + Toast.makeText(Home.this, e.getMessage(), Toast.LENGTH_SHORT).show(); + }) + .addOnProgressListener(new OnProgressListener() { + @Override + public void onProgress(UploadTask.TaskSnapshot taskSnapshot) { + double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount()); + mDialog.setMessage("Đang tải " + progress + "%"); + } + }); + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + if(requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK + && data != null && data.getData() != null) { + saveUri = data.getData(); + btnSelect.setText("Ảnh đã được chọn!"); + } + } + + private void chooseImage() { + Intent intent = new Intent(); + intent.setType("image/*"); + intent.setAction(Intent.ACTION_GET_CONTENT); + startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST); + } + + private void loadMenu() { + adapter = new FirebaseRecyclerAdapter( + Category.class, + R.layout.menu_item, + MenuViewHolder.class, + categories + ) { + @Override + protected void populateViewHolder(MenuViewHolder viewHolder, Category model, int i) { + viewHolder.txtMenuName.setText(model.getName()); + Picasso.with(Home.this).load(model.getImage()).into(viewHolder.imageView); + } + }; + + 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. diff --git a/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Interface/ItemClickListener.java b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Interface/ItemClickListener.java new file mode 100644 index 0000000..3d7d11e --- /dev/null +++ b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/Interface/ItemClickListener.java @@ -0,0 +1,7 @@ +package com.waterbase.foodifyServer.Interface; + +import android.view.View; + +public interface ItemClickListener { + void onClick(View view, int position, boolean isLongClick); +} diff --git a/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/ViewHolder/MenuViewHolder.java b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/ViewHolder/MenuViewHolder.java new file mode 100644 index 0000000..4c42866 --- /dev/null +++ b/FoodifyServer/app/src/main/java/com/waterbase/foodifyServer/ViewHolder/MenuViewHolder.java @@ -0,0 +1,35 @@ +package com.waterbase.foodifyServer.ViewHolder; + +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.recyclerview.widget.RecyclerView; + +import com.waterbase.foodifyServer.Interface.ItemClickListener; +import com.waterbase.foodifyServer.R; + +public class MenuViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ + public TextView txtMenuName; + public ImageView imageView; + + private ItemClickListener itemClickListener; + + public MenuViewHolder(View itemView) { + super(itemView); + + txtMenuName = (TextView) itemView.findViewById(R.id.menu_name); + imageView = (ImageView) itemView.findViewById(R.id.menu_image); + + itemView.setOnClickListener(this); + } + + public void setItemClickListener(ItemClickListener itemClickListener) { + this.itemClickListener = itemClickListener; + } + + @Override + public void onClick(View v) { + itemClickListener.onClick(v, getAdapterPosition(), false); + } +} diff --git a/FoodifyServer/app/src/main/res/layout/add_new_menu_layout.xml b/FoodifyServer/app/src/main/res/layout/add_new_menu_layout.xml new file mode 100644 index 0000000..af4ff14 --- /dev/null +++ b/FoodifyServer/app/src/main/res/layout/add_new_menu_layout.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FoodifyServer/app/src/main/res/layout/app_bar_home.xml b/FoodifyServer/app/src/main/res/layout/app_bar_home.xml index 980d6eb..353dfe1 100644 --- a/FoodifyServer/app/src/main/res/layout/app_bar_home.xml +++ b/FoodifyServer/app/src/main/res/layout/app_bar_home.xml @@ -23,6 +23,7 @@ + + + + + + + + + + \ No newline at end of file diff --git a/FoodifyServer/app/src/main/res/values/colors.xml b/FoodifyServer/app/src/main/res/values/colors.xml index f373b4d..1f01711 100644 --- a/FoodifyServer/app/src/main/res/values/colors.xml +++ b/FoodifyServer/app/src/main/res/values/colors.xml @@ -8,6 +8,13 @@ #FF000000 #FFFFFFFF + #FF5353 + #00251a + #39796b + + #39796b + #A9d440 + #7f333639 #0e0d0e \ No newline at end of file