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.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; 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.drawerlayout.widget.DrawerLayout; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; 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.Query; import com.google.firebase.database.ValueEventListener; import com.google.firebase.iid.FirebaseInstanceId; 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.Model.Category; import com.waterbase.foodifyServer.Common.Common; import com.waterbase.foodifyServer.Interface.ItemClickListener; import com.waterbase.foodifyServer.Model.Token; import com.waterbase.foodifyServer.ViewHolder.MenuViewHolder; 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; DrawerLayout drawer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setTitle("Menu Management"); setSupportActionBar(toolbar); //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(); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); //Set Name for user 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(); //Send token updateToken(FirebaseInstanceId.getInstance().getToken()); } private void updateToken(String token) { FirebaseDatabase db = FirebaseDatabase.getInstance(); DatabaseReference tokens = db.getReference("Tokens"); Token data = new Token(token, true); tokens.child(Common.currentUser.getPhone()).setValue(data); } 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 onResume() { super.onResume(); loadMenu(); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == Common.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"), Common.PICK_IMAGE_REQUEST); } private void loadMenu() { FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder() .setQuery(categories, Category.class) .build(); adapter = new FirebaseRecyclerAdapter(options) { @Override 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); viewHolder.setItemClickListener(new ItemClickListener() { @Override public void onClick(View view, int position, boolean isLongClick) { //send Category Id and Start new Activity Intent foodList = new Intent(Home.this, FoodList.class); foodList.putExtra("CategoryId", adapter.getRef(position).getKey()); startActivity(foodList); } }); } @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 protected void onStop() { super.onStop(); adapter.stopListening(); } @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { int id = item.getItemId(); 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); } else if(id == R.id.nav_message) { Intent banner = new Intent(Home.this, SendMessage.class); startActivity(banner); } DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); drawerLayout.closeDrawer(GravityCompat.START); return true; } @Override public boolean onContextItemSelected(@NonNull MenuItem item) { if(item.getTitle(). equals(Common.UPDATE)) { showUpdateDialog(adapter.getRef(item.getOrder()).getKey(), adapter.getItem(item.getOrder())); } else if(item.getTitle().equals(Common.DELETE)) { deleteCategory(adapter.getRef(item.getOrder()).getKey()); } return super.onContextItemSelected(item); } private void deleteCategory(String key) { //Get all food in category DatabaseReference foods = database.getReference("Foods"); Query foodInCategory = foods.orderByChild("menuId").equalTo(key); foodInCategory.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for(DataSnapshot postSnapShot: dataSnapshot.getChildren()) { postSnapShot.getRef().removeValue(); } } @Override public void onCancelled(DatabaseError databaseError) { } }); categories.child(key).removeValue(); Toast.makeText(this, "Xoá thành công!", Toast.LENGTH_SHORT).show(); } private void showUpdateDialog(String key, Category item) { AlertDialog.Builder alertDialog = new AlertDialog.Builder(Home.this); alertDialog.setTitle("Cập nhật 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); //Set default name edtName.setText(item.getName()); //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) { changeImage(item); } }); alertDialog.setView(add_menu_layout); alertDialog.setIcon(R.drawable.ic_baseline_shopping_cart_24); alertDialog.setPositiveButton("Cập nhật", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); //Update information item.setName(edtName.getText().toString()); categories.child(key).setValue(item); } }); alertDialog.setNegativeButton("Thoát", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); alertDialog.show(); } private void changeImage(Category item) { 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, "Đã cập nhật ảnh thành công!", Toast.LENGTH_SHORT).show(); imageFolder.getDownloadUrl().addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(Uri uri) { item.setImage(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 + "%"); } }); } } }