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; import androidx.navigation.Navigation; 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.Interface.ItemClickListener; 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); 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(); } 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); viewHolder.setItemClickListener(new ItemClickListener() { @Override public void onClick(View view, int position, boolean isLongClick) { } }); } }; 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; } @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { int id = item.getItemId(); 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) { 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 + "%"); } }); } } }