diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c4d9d0c2..1e0ba27f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -25,18 +25,6 @@ android:name=".activities.HomeActivity" android:windowSoftInputMode="adjustNothing" android:exported="false" /> - - - - diff --git a/app/src/main/java/com/example/petstoremobile/activities/BaseActivity.java b/app/src/main/java/com/example/petstoremobile/activities/BaseActivity.java deleted file mode 100644 index d0cd6d38..00000000 --- a/app/src/main/java/com/example/petstoremobile/activities/BaseActivity.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.example.petstoremobile.activities; - -import android.content.Intent; -import android.view.Menu; -import android.view.MenuItem; - -import androidx.appcompat.app.AppCompatActivity; - -import com.example.petstoremobile.R; -import com.example.petstoremobile.activities.listactivities.AdoptionActivity; -import com.example.petstoremobile.activities.listactivities.AppointmentActivity; -import com.example.petstoremobile.activities.listactivities.InventoryActivity; -import com.example.petstoremobile.activities.listactivities.ProductActivity; - -public class BaseActivity extends AppCompatActivity { - //Inflate the shared menu - @Override - public boolean onCreateOptionsMenu(Menu menu){ - getMenuInflater().inflate(R.menu.menu_main, menu); - return true; - } - - //Handle menu clicks - @Override - public boolean onOptionsItemSelected(MenuItem item){ - if (item.getItemId() == R.id.menu_pets) { -// if (!(this instanceof PetActivity)) { -// startActivity(new Intent(this, PetActivity.class)); -// } - } else if (item.getItemId() == R.id.menu_adoption) { - if (!(this instanceof AdoptionActivity)) { - startActivity(new Intent(this, AdoptionActivity.class)); - } - } else if (item.getItemId() == R.id.menu_appointments) { - if (!(this instanceof AppointmentActivity)) { - startActivity(new Intent(this, AppointmentActivity.class)); - } - } else if (item.getItemId() == R.id.menu_inventory) { - if (!(this instanceof InventoryActivity)) { - startActivity(new Intent(this, InventoryActivity.class)); - } - } else if (item.getItemId() == R.id.menu_products) { - if (!(this instanceof ProductActivity)) { - startActivity(new Intent(this, ProductActivity.class)); - } - } - return super.onOptionsItemSelected(item); - } - -} diff --git a/app/src/main/java/com/example/petstoremobile/activities/HomeActivity.java b/app/src/main/java/com/example/petstoremobile/activities/HomeActivity.java index a131750c..43040cae 100644 --- a/app/src/main/java/com/example/petstoremobile/activities/HomeActivity.java +++ b/app/src/main/java/com/example/petstoremobile/activities/HomeActivity.java @@ -1,10 +1,10 @@ package com.example.petstoremobile.activities; -import android.content.Intent; import android.os.Bundle; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.ContextCompat; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; @@ -18,6 +18,7 @@ import com.google.android.material.bottomnavigation.BottomNavigationView; public class HomeActivity extends AppCompatActivity { + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -37,7 +38,7 @@ public class HomeActivity extends AppCompatActivity { loadFragment(new ListFragment()); bottomNav.setSelectedItemId(R.id.nav_list); - //when an item in the bar is selected, load the corresponding fragment + //when an item in the bar is selected, load the corresponding fragment //TODO REPLACE THIS WITH DRAWER MENU bottomNav.setOnItemSelectedListener(item -> { if (item.getItemId() == R.id.nav_list) { diff --git a/app/src/main/java/com/example/petstoremobile/activities/MainActivity.java b/app/src/main/java/com/example/petstoremobile/activities/MainActivity.java index e3f23b16..c57caec1 100644 --- a/app/src/main/java/com/example/petstoremobile/activities/MainActivity.java +++ b/app/src/main/java/com/example/petstoremobile/activities/MainActivity.java @@ -9,6 +9,7 @@ import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.ContextCompat; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; @@ -28,6 +29,7 @@ public class MainActivity extends AppCompatActivity { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); setContentView(R.layout.activity_main); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); diff --git a/app/src/main/java/com/example/petstoremobile/activities/listactivities/AdoptionActivity.java b/app/src/main/java/com/example/petstoremobile/activities/listactivities/AdoptionActivity.java deleted file mode 100644 index 93db1aec..00000000 --- a/app/src/main/java/com/example/petstoremobile/activities/listactivities/AdoptionActivity.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.example.petstoremobile.activities.listactivities; - -import android.os.Bundle; - -import androidx.activity.EdgeToEdge; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; - -import com.example.petstoremobile.R; -import com.example.petstoremobile.activities.BaseActivity; - -public class AdoptionActivity extends BaseActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - EdgeToEdge.enable(this); - setContentView(R.layout.activity_adoption); - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { - Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); - return insets; - }); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/petstoremobile/activities/listactivities/AppointmentActivity.java b/app/src/main/java/com/example/petstoremobile/activities/listactivities/AppointmentActivity.java deleted file mode 100644 index eefada95..00000000 --- a/app/src/main/java/com/example/petstoremobile/activities/listactivities/AppointmentActivity.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.example.petstoremobile.activities.listactivities; - -import android.os.Bundle; - -import androidx.activity.EdgeToEdge; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; - -import com.example.petstoremobile.R; -import com.example.petstoremobile.activities.BaseActivity; - -public class AppointmentActivity extends BaseActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - EdgeToEdge.enable(this); - setContentView(R.layout.activity_appointments); - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { - Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); - return insets; - }); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/petstoremobile/activities/listactivities/InventoryActivity.java b/app/src/main/java/com/example/petstoremobile/activities/listactivities/InventoryActivity.java deleted file mode 100644 index 08556ad2..00000000 --- a/app/src/main/java/com/example/petstoremobile/activities/listactivities/InventoryActivity.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.example.petstoremobile.activities.listactivities; - -import android.os.Bundle; - -import androidx.activity.EdgeToEdge; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; - -import com.example.petstoremobile.R; -import com.example.petstoremobile.activities.BaseActivity; - -public class InventoryActivity extends BaseActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - EdgeToEdge.enable(this); - setContentView(R.layout.activity_inventory); - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { - Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); - return insets; - }); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/petstoremobile/activities/listactivities/ProductActivity.java b/app/src/main/java/com/example/petstoremobile/activities/listactivities/ProductActivity.java deleted file mode 100644 index 19241c0b..00000000 --- a/app/src/main/java/com/example/petstoremobile/activities/listactivities/ProductActivity.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.example.petstoremobile.activities.listactivities; - -import android.os.Bundle; - -import androidx.activity.EdgeToEdge; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; - -import com.example.petstoremobile.R; -import com.example.petstoremobile.activities.BaseActivity; - -public class ProductActivity extends BaseActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - EdgeToEdge.enable(this); - setContentView(R.layout.activity_products); - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { - Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); - return insets; - }); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/petstoremobile/fragments/ListFragment.java b/app/src/main/java/com/example/petstoremobile/fragments/ListFragment.java index b7dd1582..5e212f90 100644 --- a/app/src/main/java/com/example/petstoremobile/fragments/ListFragment.java +++ b/app/src/main/java/com/example/petstoremobile/fragments/ListFragment.java @@ -2,19 +2,15 @@ package com.example.petstoremobile.fragments; import android.os.Bundle; -import androidx.annotation.NonNull; -import androidx.core.view.MenuProvider; +import androidx.core.view.GravityCompat; +import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.Fragment; import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import androidx.lifecycle.Lifecycle; - +import android.widget.LinearLayout; import com.example.petstoremobile.R; @@ -25,46 +21,82 @@ import com.example.petstoremobile.fragments.listfragments.SupplierFragment; //The Fragment for the displaying the list of entities to be viewed public class ListFragment extends Fragment { + private DrawerLayout drawerLayout; + private LinearLayout drawerPets, drawerServices, drawerSuppliers; + private View touchBlocker; + + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_list, container, false); + //get controls from the layout + drawerLayout = view.findViewById(R.id.drawerLayout); + drawerPets = view.findViewById(R.id.drawerPets); + drawerServices = view.findViewById(R.id.drawerServices); + drawerSuppliers = view.findViewById(R.id.drawerSuppliers); + + //needed to disable touches on the innerContainer while the drawer is open + touchBlocker = view.findViewById(R.id.touchBlocker); + //Display pets fragment by default if (savedInstanceState == null) { loadFragment(new PetFragment()); } - //create a menu for the user to select what entity to view - requireActivity().addMenuProvider(new MenuProvider() { + //add Listeners to the drawer so user won't be able to interact with the innerContainer (the list fragments) + //while the drawer is open + drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() { - //inflate the menu + //When the drawer is opened, disable touches on the background @Override - public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) { - menuInflater.inflate(R.menu.menu_main, menu); + public void onDrawerOpened(View drawerView) { + touchBlocker.setVisibility(View.VISIBLE); + touchBlocker.setClickable(true); } - //handle menu clicks + //When the drawer is closed, enable touches again @Override - public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { - //check what menu item is selected and load the corresponding fragment - if (menuItem.getItemId() == R.id.menu_pets) { - loadFragment(new PetFragment()); - return true; - } else if (menuItem.getItemId() == R.id.menu_services) { - loadFragment(new ServiceFragment()); - return true; - } else if (menuItem.getItemId() == R.id.menu_suppliers) { - loadFragment(new SupplierFragment()); - return true; - } - return false; + public void onDrawerClosed(View drawerView) { + touchBlocker.setVisibility(View.GONE); + touchBlocker.setClickable(false); } - }, getViewLifecycleOwner(), Lifecycle.State.RESUMED); + + //unused methods + @Override + public void onDrawerSlide(View drawerView, float slideOffset) {} + @Override + public void onDrawerStateChanged(int newState) {} + }); + + // Click listeners for each drawer + //Pets + drawerPets.setOnClickListener(v -> { + loadFragment(new PetFragment()); + drawerLayout.closeDrawers(); + }); + + //Services + drawerServices.setOnClickListener(v -> { + loadFragment(new ServiceFragment()); + drawerLayout.closeDrawers(); + }); + + //Suppliers + drawerSuppliers.setOnClickListener(v -> { + loadFragment(new SupplierFragment()); + drawerLayout.closeDrawers(); + }); return view; } + //helper function to open the drawer + public void openDrawer() { + drawerLayout.openDrawer(GravityCompat.START); + } + // helper function to load the fragment into the display public void loadFragment(Fragment fragment) { getChildFragmentManager() diff --git a/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PetFragment.java b/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PetFragment.java index 1120f78f..d436538e 100644 --- a/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PetFragment.java +++ b/app/src/main/java/com/example/petstoremobile/fragments/listfragments/PetFragment.java @@ -9,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageButton; import com.example.petstoremobile.R; import com.example.petstoremobile.adapters.PetAdapter; @@ -24,6 +25,7 @@ public class PetFragment extends Fragment implements PetAdapter.OnPetClickListen private List petList = new ArrayList<>(); private PetAdapter adapter; + private ImageButton hamburger; //load pet view @Override @@ -31,6 +33,8 @@ public class PetFragment extends Fragment implements PetAdapter.OnPetClickListen Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_pet, container, false); + hamburger = view.findViewById(R.id.btnHamburger); + loadPetData(); //TODO: Replace this with actual data when backend is working setupRecyclerView(view); @@ -38,6 +42,15 @@ public class PetFragment extends Fragment implements PetAdapter.OnPetClickListen FloatingActionButton fabAddPet = view.findViewById(R.id.fabAddPet); fabAddPet.setOnClickListener(v -> openPetDetails(-1)); + //Make the hamburger button open the drawer from listFragment + hamburger.setOnClickListener(v -> { + ListFragment listFragment = (ListFragment) getParentFragment(); + //if list fragment is found then use its helper function to open the drawer + if (listFragment != null) { + listFragment.openDrawer(); + } + }); + return view; } diff --git a/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ServiceFragment.java b/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ServiceFragment.java index e68b049d..17426a95 100644 --- a/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ServiceFragment.java +++ b/app/src/main/java/com/example/petstoremobile/fragments/listfragments/ServiceFragment.java @@ -9,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageButton; import com.example.petstoremobile.R; import com.example.petstoremobile.adapters.ServiceAdapter; @@ -24,6 +25,7 @@ public class ServiceFragment extends Fragment implements ServiceAdapter.OnServic private List serviceList = new ArrayList<>(); private ServiceAdapter adapter; + private ImageButton hamburger; //load service view @Override @@ -31,6 +33,8 @@ public class ServiceFragment extends Fragment implements ServiceAdapter.OnServic Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_service, container, false); + hamburger = view.findViewById(R.id.btnHamburger); + loadServiceData(); //TODO: Replace this with actual data when backend is working setupRecyclerView(view); @@ -38,6 +42,15 @@ public class ServiceFragment extends Fragment implements ServiceAdapter.OnServic FloatingActionButton fabAddService = view.findViewById(R.id.fabAddService); fabAddService.setOnClickListener(v -> openServiceDetails(-1)); + //Make the hamburger button open the drawer from listFragment + hamburger.setOnClickListener(v -> { + ListFragment listFragment = (ListFragment) getParentFragment(); + //if list fragment is found then use its helper function to open the drawer + if (listFragment != null) { + listFragment.openDrawer(); + } + }); + return view; } diff --git a/app/src/main/java/com/example/petstoremobile/fragments/listfragments/SupplierFragment.java b/app/src/main/java/com/example/petstoremobile/fragments/listfragments/SupplierFragment.java index d962408f..0e12dcd4 100644 --- a/app/src/main/java/com/example/petstoremobile/fragments/listfragments/SupplierFragment.java +++ b/app/src/main/java/com/example/petstoremobile/fragments/listfragments/SupplierFragment.java @@ -9,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageButton; import com.example.petstoremobile.R; import com.example.petstoremobile.adapters.SupplierAdapter; @@ -24,6 +25,7 @@ public class SupplierFragment extends Fragment implements SupplierAdapter.OnSupp private List supplierList = new ArrayList<>(); private SupplierAdapter adapter; + private ImageButton hamburger; //load supplier view @Override @@ -31,6 +33,8 @@ public class SupplierFragment extends Fragment implements SupplierAdapter.OnSupp Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_supplier, container, false); + hamburger = view.findViewById(R.id.btnHamburger); + loadSupplierData(); //TODO: Replace this with actual data when backend is working setupRecyclerView(view); @@ -38,6 +42,15 @@ public class SupplierFragment extends Fragment implements SupplierAdapter.OnSupp FloatingActionButton fabAddSupplier = view.findViewById(R.id.fabAddSupplier); fabAddSupplier.setOnClickListener(v -> openSupplierDetails(-1)); + //Make the hamburger button open the drawer from listFragment + hamburger.setOnClickListener(v -> { + ListFragment listFragment = (ListFragment) getParentFragment(); + //if list fragment is found then use its helper function to open the drawer + if (listFragment != null) { + listFragment.openDrawer(); + } + }); + return view; } diff --git a/app/src/main/res/color/bottom_nav_colors.xml b/app/src/main/res/color/bottom_nav_colors.xml new file mode 100644 index 00000000..c170f0da --- /dev/null +++ b/app/src/main/res/color/bottom_nav_colors.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/baseline_menu_36.xml b/app/src/main/res/drawable/baseline_menu_36.xml new file mode 100644 index 00000000..f25be2a9 --- /dev/null +++ b/app/src/main/res/drawable/baseline_menu_36.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/activity_adoption.xml b/app/src/main/res/layout/activity_adoption.xml deleted file mode 100644 index 59413945..00000000 --- a/app/src/main/res/layout/activity_adoption.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_appointments.xml b/app/src/main/res/layout/activity_appointments.xml deleted file mode 100644 index c58bd08d..00000000 --- a/app/src/main/res/layout/activity_appointments.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index c45269b2..c7b9f3ea 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -4,7 +4,8 @@ android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical"> + android:orientation="vertical" + android:background="@color/background_grey"> + android:background="@color/primary_dark" + app:itemIconTint="@color/bottom_nav_colors" + app:itemTextColor="@color/bottom_nav_colors" + app:menu="@menu/bottom_nav_menu"/> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_inventory.xml b/app/src/main/res/layout/activity_inventory.xml deleted file mode 100644 index 0d4d537a..00000000 --- a/app/src/main/res/layout/activity_inventory.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 1022551e..afe1e884 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,73 +1,111 @@ + android:background="@color/primary_dark"> - + - + - + - + + + + + + + android:orientation="vertical" + android:layout_weight="0.2" + android:background="@color/white" + android:padding="32dp"> - + -