From d1675643e5623dc6547365ed19f889caa1c752cd Mon Sep 17 00:00:00 2001 From: Alex <78383757+Lextical@users.noreply.github.com> Date: Mon, 2 Mar 2026 13:43:20 -0700 Subject: [PATCH] initial commit --- .gitignore | 15 ++ .idea/.gitignore | 3 + .idea/AndroidProjectSystem.xml | 6 + .idea/compiler.xml | 6 + .idea/deploymentTargetSelector.xml | 18 ++ .idea/deviceManager.xml | 13 + .idea/gradle.xml | 19 ++ .idea/migrations.xml | 10 + .idea/misc.xml | 9 + .idea/runConfigurations.xml | 17 ++ .idea/studiobot.xml | 6 + .idea/vcs.xml | 6 + app/.gitignore | 1 + app/build.gradle.kts | 46 ++++ app/proguard-rules.pro | 21 ++ .../ExampleInstrumentedTest.java | 26 ++ app/src/main/AndroidManifest.xml | 55 ++++ .../activities/AdoptionActivity.java | 26 ++ .../activities/AppointmentActivity.java | 25 ++ .../activities/BaseActivity.java | 54 ++++ .../activities/InventoryActivity.java | 26 ++ .../activities/MainActivity.java | 71 +++++ .../activities/PetActivity.java | 66 +++++ .../activities/ProductActivity.java | 25 ++ .../activities/ServiceActivity.java | 65 +++++ .../activities/SupplierActivity.java | 68 +++++ .../detailactivites/PetDetailActivity.java | 127 +++++++++ .../ServiceDetailActivity.java | 104 ++++++++ .../SupplierDetailActivity.java | 104 ++++++++ .../petstoremobile/adapters/PetAdapter.java | 86 ++++++ .../adapters/ServiceAdapter.java | 77 ++++++ .../adapters/SupplierAdapter.java | 78 ++++++ .../example/petstoremobile/models/Pet.java | 79 ++++++ .../petstoremobile/models/Service.java | 59 ++++ .../petstoremobile/models/Supplier.java | 70 +++++ .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++ .../res/drawable/ic_launcher_foreground.xml | 30 +++ app/src/main/res/layout/activity_adoption.xml | 19 ++ .../main/res/layout/activity_appointments.xml | 19 ++ .../main/res/layout/activity_inventory.xml | 19 ++ app/src/main/res/layout/activity_main.xml | 72 +++++ .../main/res/layout/activity_pet_detail.xml | 194 ++++++++++++++ app/src/main/res/layout/activity_pets.xml | 28 ++ app/src/main/res/layout/activity_products.xml | 19 ++ .../res/layout/activity_service_detail.xml | 155 +++++++++++ app/src/main/res/layout/activity_services.xml | 25 ++ app/src/main/res/layout/activity_supplier.xml | 25 ++ .../res/layout/activity_supplier_detail.xml | 174 ++++++++++++ app/src/main/res/layout/item_pet.xml | 84 ++++++ app/src/main/res/layout/item_service.xml | 63 +++++ app/src/main/res/layout/item_supplier.xml | 62 +++++ app/src/main/res/menu/menu_main.xml | 32 +++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 + app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes app/src/main/res/values-night/themes.xml | 7 + app/src/main/res/values/colors.xml | 5 + app/src/main/res/values/strings.xml | 3 + app/src/main/res/values/themes.xml | 9 + app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 ++ .../petstoremobile/ExampleUnitTest.java | 17 ++ build.gradle.kts | 4 + gradle.properties | 21 ++ gradle/libs.versions.toml | 22 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 45457 bytes gradle/wrapper/gradle-wrapper.properties | 9 + gradlew | 251 ++++++++++++++++++ gradlew.bat | 94 +++++++ settings.gradle.kts | 24 ++ 79 files changed, 3187 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/AndroidProjectSystem.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/deploymentTargetSelector.xml create mode 100644 .idea/deviceManager.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/migrations.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 .idea/studiobot.xml create mode 100644 .idea/vcs.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle.kts create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/example/petstoremobile/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/example/petstoremobile/activities/AdoptionActivity.java create mode 100644 app/src/main/java/com/example/petstoremobile/activities/AppointmentActivity.java create mode 100644 app/src/main/java/com/example/petstoremobile/activities/BaseActivity.java create mode 100644 app/src/main/java/com/example/petstoremobile/activities/InventoryActivity.java create mode 100644 app/src/main/java/com/example/petstoremobile/activities/MainActivity.java create mode 100644 app/src/main/java/com/example/petstoremobile/activities/PetActivity.java create mode 100644 app/src/main/java/com/example/petstoremobile/activities/ProductActivity.java create mode 100644 app/src/main/java/com/example/petstoremobile/activities/ServiceActivity.java create mode 100644 app/src/main/java/com/example/petstoremobile/activities/SupplierActivity.java create mode 100644 app/src/main/java/com/example/petstoremobile/activities/detailactivites/PetDetailActivity.java create mode 100644 app/src/main/java/com/example/petstoremobile/activities/detailactivites/ServiceDetailActivity.java create mode 100644 app/src/main/java/com/example/petstoremobile/activities/detailactivites/SupplierDetailActivity.java create mode 100644 app/src/main/java/com/example/petstoremobile/adapters/PetAdapter.java create mode 100644 app/src/main/java/com/example/petstoremobile/adapters/ServiceAdapter.java create mode 100644 app/src/main/java/com/example/petstoremobile/adapters/SupplierAdapter.java create mode 100644 app/src/main/java/com/example/petstoremobile/models/Pet.java create mode 100644 app/src/main/java/com/example/petstoremobile/models/Service.java create mode 100644 app/src/main/java/com/example/petstoremobile/models/Supplier.java create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/layout/activity_adoption.xml create mode 100644 app/src/main/res/layout/activity_appointments.xml create mode 100644 app/src/main/res/layout/activity_inventory.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_pet_detail.xml create mode 100644 app/src/main/res/layout/activity_pets.xml create mode 100644 app/src/main/res/layout/activity_products.xml create mode 100644 app/src/main/res/layout/activity_service_detail.xml create mode 100644 app/src/main/res/layout/activity_services.xml create mode 100644 app/src/main/res/layout/activity_supplier.xml create mode 100644 app/src/main/res/layout/activity_supplier_detail.xml create mode 100644 app/src/main/res/layout/item_pet.xml create mode 100644 app/src/main/res/layout/item_service.xml create mode 100644 app/src/main/res/layout/item_supplier.xml create mode 100644 app/src/main/res/menu/menu_main.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/test/java/com/example/petstoremobile/ExampleUnitTest.java create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle.kts diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..aa724b77 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..26d33521 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/AndroidProjectSystem.xml b/.idea/AndroidProjectSystem.xml new file mode 100644 index 00000000..4a53bee8 --- /dev/null +++ b/.idea/AndroidProjectSystem.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 00000000..b86273d9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 00000000..89da0994 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/deviceManager.xml b/.idea/deviceManager.xml new file mode 100644 index 00000000..91f95584 --- /dev/null +++ b/.idea/deviceManager.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 00000000..639c779c --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 00000000..f8051a6f --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..b2c751a3 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 00000000..16660f1d --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/.idea/studiobot.xml b/.idea/studiobot.xml new file mode 100644 index 00000000..539e3b80 --- /dev/null +++ b/.idea/studiobot.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..94a25f7f --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 00000000..0bb9af18 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,46 @@ +plugins { + alias(libs.plugins.android.application) +} + +android { + namespace = "com.example.petstoremobile" + compileSdk { + version = release(36) + } + + defaultConfig { + applicationId = "com.example.petstoremobile" + minSdk = 24 + targetSdk = 36 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } +} + +dependencies { + implementation(libs.appcompat) + implementation(libs.material) + implementation(libs.activity) + implementation(libs.constraintlayout) + implementation("com.google.android.material:material:1.11.0") + implementation("androidx.viewpager2:viewpager2:1.1.0") + testImplementation(libs.junit) + androidTestImplementation(libs.ext.junit) + androidTestImplementation(libs.espresso.core) +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/petstoremobile/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/petstoremobile/ExampleInstrumentedTest.java new file mode 100644 index 00000000..5d5e008b --- /dev/null +++ b/app/src/androidTest/java/com/example/petstoremobile/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.petstoremobile; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.example.petstoremobile", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..9c70dc38 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/petstoremobile/activities/AdoptionActivity.java b/app/src/main/java/com/example/petstoremobile/activities/AdoptionActivity.java new file mode 100644 index 00000000..df066a91 --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/activities/AdoptionActivity.java @@ -0,0 +1,26 @@ +package com.example.petstoremobile.activities; + +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.example.petstoremobile.R; + +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/AppointmentActivity.java b/app/src/main/java/com/example/petstoremobile/activities/AppointmentActivity.java new file mode 100644 index 00000000..e8933cf9 --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/activities/AppointmentActivity.java @@ -0,0 +1,25 @@ +package com.example.petstoremobile.activities; + +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; + +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/BaseActivity.java b/app/src/main/java/com/example/petstoremobile/activities/BaseActivity.java new file mode 100644 index 00000000..7d9b22fc --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/activities/BaseActivity.java @@ -0,0 +1,54 @@ +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; + +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_services) { + if (!(this instanceof ServiceActivity)) { + startActivity(new Intent(this, ServiceActivity.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)); + } + } else if (item.getItemId() == R.id.menu_suppliers) { + if (!(this instanceof SupplierActivity)) { + startActivity(new Intent(this, SupplierActivity.class)); + } + } + return super.onOptionsItemSelected(item); + } + +} diff --git a/app/src/main/java/com/example/petstoremobile/activities/InventoryActivity.java b/app/src/main/java/com/example/petstoremobile/activities/InventoryActivity.java new file mode 100644 index 00000000..00382e2f --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/activities/InventoryActivity.java @@ -0,0 +1,26 @@ +package com.example.petstoremobile.activities; + +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.example.petstoremobile.R; + +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/MainActivity.java b/app/src/main/java/com/example/petstoremobile/activities/MainActivity.java new file mode 100644 index 00000000..c531b272 --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/activities/MainActivity.java @@ -0,0 +1,71 @@ +package com.example.petstoremobile.activities; + +import android.content.Intent; +import android.os.Bundle; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.example.petstoremobile.R; + +public class MainActivity extends AppCompatActivity { + + private EditText etUser; + private EditText etPassword; + private Button btnLogin; + private TextView tvLoginStatus; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + 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); + return insets; + }); + + //get all controls from layout + tvLoginStatus = findViewById(R.id.tvLoginStatus); + etUser = findViewById(R.id.etUser); + etPassword = findViewById(R.id.etPassword); + btnLogin = findViewById(R.id.btnLogin); + //clear login status + tvLoginStatus.setText(""); + + //Set click listener for login button + btnLogin.setOnClickListener(v -> { + //Get user name and password from text fields + String username = etUser.getText().toString(); + String password = etPassword.getText().toString(); + + //check if fields are empty + if (username.isEmpty() || password.isEmpty()) { + Toast.makeText(this, "Please enter username and password", Toast.LENGTH_SHORT).show(); + tvLoginStatus.setText("Please enter username and password"); + return; + } + + //check if username and password are correct + if (username.equals("admin") && password.equals("admin")) { + Intent intent = new Intent(this, PetActivity.class); + startActivity(intent); + Toast.makeText(this, "Login successful", Toast.LENGTH_SHORT).show(); + finish(); + } + else { + Toast.makeText(this, "Login failed", Toast.LENGTH_SHORT).show(); + tvLoginStatus.setText("Login failed"); + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/petstoremobile/activities/PetActivity.java b/app/src/main/java/com/example/petstoremobile/activities/PetActivity.java new file mode 100644 index 00000000..12530cab --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/activities/PetActivity.java @@ -0,0 +1,66 @@ +package com.example.petstoremobile.activities; + +import android.content.Intent; +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.petstoremobile.R; +import com.example.petstoremobile.activities.detailactivites.PetDetailActivity; +import com.example.petstoremobile.adapters.PetAdapter; +import com.example.petstoremobile.models.Pet; +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +import java.util.ArrayList; +import java.util.List; + +public class PetActivity extends BaseActivity { + + private List petList = new ArrayList<>(); + private PetAdapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_pets); + 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; + }); + + loadPetData(); //TODO: Replace this with actual data when backend is working + setupRecyclerView(); + + // Add button opens the add dialog + FloatingActionButton fabAddPet = findViewById(R.id.fabAddPet); + fabAddPet.setOnClickListener(v -> { + Intent intent = new Intent(this, PetDetailActivity.class); + startActivity(intent); + }); + } + + // Loads hardcoded sample data for now TODO: REPLACE THIS WITH A METHOD THAT GETS DATA FROM THE DATABASE + private void loadPetData() { + petList.add(new Pet(1, "Buddy", "Dog", "Labrador", 2, "Available", 500.00)); + petList.add(new Pet(2, "Milo", "Cat", "Persian", 1, "Available", 300.00)); + petList.add(new Pet(3, "Charlie", "Dog", "Golden Retriever", 3, "Available", 550.00)); + petList.add(new Pet(4, "Luna", "Cat", "Siamese", 2, "Adopted", 350.00)); + petList.add(new Pet(5, "Max", "Dog", "Beagle", 1, "Available", 450.00)); + petList.add(new Pet(6, "Bella", "Cat", "Maine Coon", 4, "Available", 400.00)); + } + + //set up the recyclerview and adapter + private void setupRecyclerView() { + RecyclerView recyclerView = findViewById(R.id.recyclerViewPets); + adapter = new PetAdapter(petList, this); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + recyclerView.setAdapter(adapter); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/petstoremobile/activities/ProductActivity.java b/app/src/main/java/com/example/petstoremobile/activities/ProductActivity.java new file mode 100644 index 00000000..ae481e3c --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/activities/ProductActivity.java @@ -0,0 +1,25 @@ +package com.example.petstoremobile.activities; + +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; + +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/activities/ServiceActivity.java b/app/src/main/java/com/example/petstoremobile/activities/ServiceActivity.java new file mode 100644 index 00000000..07f105d9 --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/activities/ServiceActivity.java @@ -0,0 +1,65 @@ +package com.example.petstoremobile.activities; + +import android.content.Intent; +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.petstoremobile.R; +import com.example.petstoremobile.activities.detailactivites.ServiceDetailActivity; +import com.example.petstoremobile.adapters.ServiceAdapter; +import com.example.petstoremobile.models.Service; +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +import java.util.ArrayList; +import java.util.List; + +public class ServiceActivity extends BaseActivity { + + private List serviceList = new ArrayList<>(); + private ServiceAdapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_services); + 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; + }); + + loadServiceData(); + setupRecyclerView(); + + // Add button opens the add dialog + FloatingActionButton fabAddService = findViewById(R.id.fabAddService); + fabAddService.setOnClickListener(v -> { + Intent intent = new Intent(this, ServiceDetailActivity.class); + startActivity(intent); + }); + } + + // Loads hardcoded sample data for now TODO: REPLACE THIS WITH A METHOD THAT GETS DATA FROM THE DATABASE + private void loadServiceData() { + serviceList.add(new Service(1, "Pet Grooming", "Full grooming service", 60, 40.00)); + serviceList.add(new Service(2, "Nail Trimming", "Quick nail trim", 15, 10.00)); + serviceList.add(new Service(3, "Bath and Brush", "Bathing and brushing service", 45, 30.00)); + serviceList.add(new Service(4, "Veterinary Checkup", "Complete health examination", 30, 75.00)); + serviceList.add(new Service(5, "Teeth Cleaning", "Professional dental cleaning", 90, 100.00)); + } + + // Set up the RecyclerView and adapter + private void setupRecyclerView() { + RecyclerView recyclerView = findViewById(R.id.recyclerViewServices); + adapter = new ServiceAdapter(serviceList, this); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + recyclerView.setAdapter(adapter); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/petstoremobile/activities/SupplierActivity.java b/app/src/main/java/com/example/petstoremobile/activities/SupplierActivity.java new file mode 100644 index 00000000..0b0f7f57 --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/activities/SupplierActivity.java @@ -0,0 +1,68 @@ +package com.example.petstoremobile.activities; + +import android.content.Intent; +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.petstoremobile.R; +import com.example.petstoremobile.activities.detailactivites.SupplierDetailActivity; +import com.example.petstoremobile.adapters.SupplierAdapter; +import com.example.petstoremobile.models.Supplier; +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +import java.util.ArrayList; +import java.util.List; + +public class SupplierActivity extends BaseActivity { + + private List supplierList = new ArrayList<>(); + private SupplierAdapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_supplier); + + if (findViewById(R.id.main) != null) { + 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; + }); + } + + loadSupplierData(); //TODO: Replace this with actual data when backend is working + setupRecyclerView(); + + // Add button opens the add dialog + FloatingActionButton fabAddSupplier = findViewById(R.id.fabAddSupplier); + fabAddSupplier.setOnClickListener(v -> { + Intent intent = new Intent(this, SupplierDetailActivity.class); + startActivity(intent); + }); + } + + // Loads hardcoded sample data for now TODO: REPLACE THIS WITH A METHOD THAT GETS DATA FROM THE DATABASE + private void loadSupplierData() { + supplierList.add(new Supplier(1, "PetCare Inc.", "John", "Doe", "john@petcare.com", "888-555-0101")); + supplierList.add(new Supplier(2, "Happy Tails", "Jane", "Smith", "jane@happytails.com", "888-555-0102")); + supplierList.add(new Supplier(3, "Animal Supplies Co.", "Mike", "Brown", "mike@animalsupplies.com", "888-555-0103")); + supplierList.add(new Supplier(4, "Groomers Choice", "Sarah", "Wilson", "sarah@groomerschoice.com", "888-555-0104")); + supplierList.add(new Supplier(5, "Healthy Pets", "Robert", "Miller", "robert@healthypets.com", "888-555-0105")); + } + + // set up the recyclerview and adapter + private void setupRecyclerView() { + RecyclerView recyclerView = findViewById(R.id.recyclerViewSuppliers); + adapter = new SupplierAdapter(supplierList, this); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + recyclerView.setAdapter(adapter); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/petstoremobile/activities/detailactivites/PetDetailActivity.java b/app/src/main/java/com/example/petstoremobile/activities/detailactivites/PetDetailActivity.java new file mode 100644 index 00000000..b605978d --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/activities/detailactivites/PetDetailActivity.java @@ -0,0 +1,127 @@ +package com.example.petstoremobile.activities.detailactivites; + +import android.os.Bundle; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.example.petstoremobile.R; + +public class PetDetailActivity extends AppCompatActivity { + + private TextView tvMode, tvPetId; + private EditText etPetName, etPetSpecies, etPetBreed, etPetAge, etPetPrice; + private Spinner spinnerPetStatus; + private Button btnSavePet, btnDeletePet, btnBack; + private int petId; + private boolean isEditing = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_pet_detail); + 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; + }); + + //set up spinner and get controls from layout + initViews(); + setupSpinner(); + handleIntent(); + + btnBack.setOnClickListener(v -> finish()); + btnSavePet.setOnClickListener(v -> savePet()); + btnDeletePet.setOnClickListener(v -> deletePet()); + } + + //get controls from layout + private void initViews() { + tvMode = findViewById(R.id.tvMode); + tvPetId = findViewById(R.id.tvPetId); + etPetName = findViewById(R.id.etPetName); + etPetSpecies = findViewById(R.id.etPetSpecies); + etPetBreed = findViewById(R.id.etPetBreed); + etPetAge = findViewById(R.id.etPetAge); + etPetPrice = findViewById(R.id.etPetPrice); + spinnerPetStatus = findViewById(R.id.spinnerPetStatus); + btnSavePet = findViewById(R.id.btnSavePet); + btnDeletePet = findViewById(R.id.btnDeletePet); + btnBack = findViewById(R.id.btnBack); + } + + //set up the spinner menu for pet status + private void setupSpinner() { + ArrayAdapter adapter = new ArrayAdapter<>(this, + android.R.layout.simple_spinner_item, + new String[]{"Available", "Adopted"}); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerPetStatus.setAdapter(adapter); + } + + //check if pet is being edited or added and show the view accordingly + private void handleIntent() { + // Pet is being edited + if (getIntent().hasExtra("petId")) { + // Get pet data from intent and populate fields + isEditing = true; + petId = getIntent().getIntExtra("petId", -1); + tvMode.setText("Edit Pet"); + tvPetId.setText("ID: " + petId); + etPetName.setText(getIntent().getStringExtra("petName")); + etPetSpecies.setText(getIntent().getStringExtra("petSpecies")); + etPetBreed.setText(getIntent().getStringExtra("petBreed")); + etPetAge.setText(String.valueOf(getIntent().getIntExtra("petAge", 0))); + etPetPrice.setText(String.valueOf(getIntent().getDoubleExtra("petPrice", 0.0))); + + // Set spinner selection based on pet status + String status = getIntent().getStringExtra("petStatus"); + if ("Available".equals(status)) { + spinnerPetStatus.setSelection(0); + } else { + spinnerPetStatus.setSelection(1); + } + + //Delete button is visible when editing + btnDeletePet.setVisibility(View.VISIBLE); + } else { + // Pet is being added + // Set default values for add a new pet + isEditing = false; + tvMode.setText("Add Pet"); + tvPetId.setVisibility(View.GONE); + btnDeletePet.setVisibility(View.GONE); + btnSavePet.setText("Add"); + } + } + + //TODO: Method to Update or Add a pet + private void savePet() { + if (isEditing) { + // TODO: Update pet + Toast.makeText(this, "Save functionality not yet implemented with DB", Toast.LENGTH_SHORT).show(); + } else { + // TODO: Add new pet + Toast.makeText(this, "Save functionality not yet implemented with DB", Toast.LENGTH_SHORT).show(); + } + finish(); + } + + //TODO: Method to Delete a pet + private void deletePet() { + Toast.makeText(this, "Delete functionality not yet implemented with DB", Toast.LENGTH_SHORT).show(); + finish(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/petstoremobile/activities/detailactivites/ServiceDetailActivity.java b/app/src/main/java/com/example/petstoremobile/activities/detailactivites/ServiceDetailActivity.java new file mode 100644 index 00000000..c40084df --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/activities/detailactivites/ServiceDetailActivity.java @@ -0,0 +1,104 @@ +package com.example.petstoremobile.activities.detailactivites; + +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.example.petstoremobile.R; + +public class ServiceDetailActivity extends AppCompatActivity { + private TextView tvMode, tvServiceId; + private EditText etServiceName, etServiceDesc, etServiceDuration, etServicePrice; + private Button btnSaveService, btnDeleteService, btnBack; + private int serviceId; + private boolean isEditing = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_service_detail); + 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; + }); + + initViews(); + handleIntent(); + + //Set clicks listener for each button + btnBack.setOnClickListener(v -> finish()); + btnSaveService.setOnClickListener(v -> saveService()); + btnDeleteService.setOnClickListener(v -> deleteService()); + } + + //get controls form layout + private void initViews() { + tvMode = findViewById(R.id.tvMode); + tvServiceId = findViewById(R.id.tvServiceId); + etServiceName = findViewById(R.id.etServiceName); + etServiceDesc = findViewById(R.id.etServiceDesc); + etServiceDuration = findViewById(R.id.etServiceDuration); + etServicePrice = findViewById(R.id.etServicePrice); + btnSaveService = findViewById(R.id.btnSaveService); + btnDeleteService = findViewById(R.id.btnDeleteService); + btnBack = findViewById(R.id.btnBack); + } + + //check if service is being edited or added and show the view accordingly + private void handleIntent() { + // Service is being edited + if (getIntent().hasExtra("serviceId")) { + // Get service data from intent and populate fields + isEditing = true; + serviceId = getIntent().getIntExtra("serviceId", -1); + tvMode.setText("Edit Service"); + tvServiceId.setText("ID: " + serviceId); + etServiceName.setText(getIntent().getStringExtra("serviceName")); + etServiceDesc.setText(getIntent().getStringExtra("serviceDesc")); + etServiceDuration.setText(String.valueOf(getIntent().getIntExtra("serviceDuration", 0))); + etServicePrice.setText(String.valueOf(getIntent().getDoubleExtra("servicePrice", 0.0))); + + //Delete button is visible when editing + btnDeleteService.setVisibility(View.VISIBLE); + } else { + // Service is being added + // Set default values for add a new service + isEditing = false; + tvMode.setText("Add Service"); + tvServiceId.setVisibility(View.GONE); + btnDeleteService.setVisibility(View.GONE); + btnSaveService.setText("Add"); + } + } + + //TODO: Method to Update or Add a service + private void saveService() { + if (isEditing) { + // TODO: Update service + Toast.makeText(this, "Save functionality not yet implemented with DB", Toast.LENGTH_SHORT).show(); + } else { + // TODO: Add new service + Toast.makeText(this, "Save functionality not yet implemented with DB", Toast.LENGTH_SHORT).show(); + } + finish(); + } + + //TODO: Method to Delete a service + private void deleteService() { + Toast.makeText(this, "Delete functionality not yet implemented with DB", Toast.LENGTH_SHORT).show(); + finish(); + } +} + + diff --git a/app/src/main/java/com/example/petstoremobile/activities/detailactivites/SupplierDetailActivity.java b/app/src/main/java/com/example/petstoremobile/activities/detailactivites/SupplierDetailActivity.java new file mode 100644 index 00000000..fbd8b0a1 --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/activities/detailactivites/SupplierDetailActivity.java @@ -0,0 +1,104 @@ +package com.example.petstoremobile.activities.detailactivites; + +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.example.petstoremobile.R; + +public class SupplierDetailActivity extends AppCompatActivity { + private TextView tvMode, tvSupId; + private EditText etSupCompany, etSupContactFirstName, etSupContactLastName, etSupEmail, etSupPhone; + private Button btnSaveSupplier, btnDeleteSupplier, btnBack; + private int supId; + private boolean isEditing = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_supplier_detail); + 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; + }); + + initViews(); + handleIntent(); + + //Set clicks listener for each button + btnBack.setOnClickListener(v -> finish()); + btnSaveSupplier.setOnClickListener(v -> saveSupplier()); + btnDeleteSupplier.setOnClickListener(v -> deleteSupplier()); + } + + //get controls form layout + private void initViews() { + tvMode = findViewById(R.id.tvMode); + tvSupId = findViewById(R.id.tvSupId); + etSupCompany = findViewById(R.id.etSupCompany); + etSupContactFirstName = findViewById(R.id.etSupContactFirstName); + etSupContactLastName = findViewById(R.id.etSupContactLastName); + etSupEmail = findViewById(R.id.etSupEmail); + etSupPhone = findViewById(R.id.etSupPhone); + btnSaveSupplier = findViewById(R.id.btnSaveSupplier); + btnDeleteSupplier = findViewById(R.id.btnDeleteSupplier); + btnBack = findViewById(R.id.btnBack); + } + + //check if supplier is being edited or added and show the view accordingly + private void handleIntent() { + // Supplier is being edited + if (getIntent().hasExtra("supId")) { + // Get supplier data from intent and populate fields + isEditing = true; + supId = getIntent().getIntExtra("supId", -1); + tvMode.setText("Edit Supplier"); + tvSupId.setText("ID: " + supId); + etSupCompany.setText(getIntent().getStringExtra("supCompany")); + etSupContactFirstName.setText(getIntent().getStringExtra("supContactFirstName")); + etSupContactLastName.setText(getIntent().getStringExtra("supContactLastName")); + etSupEmail.setText(getIntent().getStringExtra("supEmail")); + etSupPhone.setText(getIntent().getStringExtra("supPhone")); + + //Delete button is visible when editing + btnDeleteSupplier.setVisibility(View.VISIBLE); + } else { + // Supplier is being added + // Set default values for add a new supplier + isEditing = false; + tvMode.setText("Add Supplier"); + tvSupId.setVisibility(View.GONE); + btnDeleteSupplier.setVisibility(View.GONE); + btnSaveSupplier.setText("Add"); + } + } + + //TODO: Method to Update or Add a supplier + private void saveSupplier() { + if (isEditing) { + // TODO: Update supplier + Toast.makeText(this, "Save functionality not yet implemented with DB", Toast.LENGTH_SHORT).show(); + } else { + // TODO: Add new supplier + Toast.makeText(this, "Save functionality not yet implemented with DB", Toast.LENGTH_SHORT).show(); + } + finish(); + } + + //TODO: Method to Delete a supplier + private void deleteSupplier() { + Toast.makeText(this, "Delete functionality not yet implemented with DB", Toast.LENGTH_SHORT).show(); + finish(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/petstoremobile/adapters/PetAdapter.java b/app/src/main/java/com/example/petstoremobile/adapters/PetAdapter.java new file mode 100644 index 00000000..0974c09a --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/adapters/PetAdapter.java @@ -0,0 +1,86 @@ +package com.example.petstoremobile.adapters; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import com.example.petstoremobile.R; +import com.example.petstoremobile.activities.detailactivites.PetDetailActivity; +import com.example.petstoremobile.models.Pet; +import java.util.List; + +public class PetAdapter extends RecyclerView.Adapter { + + private List petList; + private Context context; + + //Constructor + public PetAdapter(List petList, Context context) { + this.petList = petList; + this.context = context; + } + + // Get the controls of each row in recycler view + public static class PetViewHolder extends RecyclerView.ViewHolder { + TextView tvPetName, tvPetSpeciesBreed, tvPetAge, tvPetPrice, tvPetStatus; + + public PetViewHolder(@NonNull View v) { + super(v); + tvPetName = v.findViewById(R.id.tvPetName); + tvPetSpeciesBreed = v.findViewById(R.id.tvPetSpeciesBreed); + tvPetAge = v.findViewById(R.id.tvPetAge); + tvPetPrice = v.findViewById(R.id.tvPetPrice); + tvPetStatus = v.findViewById(R.id.tvPetStatus); + } + } + + // Create a new row view + @NonNull + @Override + public PetViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View v = LayoutInflater.from(context).inflate(R.layout.item_pet, parent, false); + return new PetViewHolder(v); + } + + //populate the row with pet data + @Override + public void onBindViewHolder(@NonNull PetViewHolder holder, int position) { + Pet pet = petList.get(position); + + holder.tvPetName.setText(pet.getPetName()); + holder.tvPetSpeciesBreed.setText(pet.getPetSpecies() + " - " + pet.getPetBreed()); + holder.tvPetAge.setText("Age: " + pet.getPetAge() + " yr(s)"); + holder.tvPetPrice.setText("$" + String.format("%.2f", pet.getPetPrice())); + holder.tvPetStatus.setText(pet.getPetStatus()); + + //Set the status color depending on availability. If available, green, otherwise red + if (pet.getPetStatus().equals("Available")) { + holder.tvPetStatus.setBackgroundColor(Color.parseColor("#4CAF50")); + } else { + holder.tvPetStatus.setBackgroundColor(Color.parseColor("#F44336")); + } + + //Set click listener for each row + holder.itemView.setOnClickListener(v -> { + Intent intent = new Intent(context, PetDetailActivity.class); + intent.putExtra("petId", pet.getPetId()); + intent.putExtra("petName", pet.getPetName()); + intent.putExtra("petSpecies", pet.getPetSpecies()); + intent.putExtra("petBreed", pet.getPetBreed()); + intent.putExtra("petAge", pet.getPetAge()); + intent.putExtra("petPrice", pet.getPetPrice()); + intent.putExtra("petStatus", pet.getPetStatus()); + context.startActivity(intent); + }); + } + + @Override + public int getItemCount() { + return petList.size(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/petstoremobile/adapters/ServiceAdapter.java b/app/src/main/java/com/example/petstoremobile/adapters/ServiceAdapter.java new file mode 100644 index 00000000..8307b3b4 --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/adapters/ServiceAdapter.java @@ -0,0 +1,77 @@ +package com.example.petstoremobile.adapters; + +import android.content.Context; +import android.content.Intent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.petstoremobile.R; +import com.example.petstoremobile.activities.detailactivites.ServiceDetailActivity; +import com.example.petstoremobile.models.Service; + +import java.util.List; + +public class ServiceAdapter extends RecyclerView.Adapter { + private List serviceList; + private Context context; + + //Constructor + public ServiceAdapter(List serviceList, Context context) { + this.serviceList = serviceList; + this.context = context; + } + + //Get controls of each row in recycler view + public static class ServiceViewHolder extends RecyclerView.ViewHolder { + TextView tvServiceName, tvServiceDesc, tvServiceDuration, tvServicePrice; + + public ServiceViewHolder(@NonNull View v) { + super(v); + tvServiceName = v.findViewById(R.id.tvServiceName); + tvServiceDesc = v.findViewById(R.id.tvServiceDesc); + tvServiceDuration = v.findViewById(R.id.tvServiceDuration); + tvServicePrice = v.findViewById(R.id.tvServicePrice); + } + } + + //Create a new row view + @NonNull + @Override + public ServiceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View v = LayoutInflater.from(context).inflate(R.layout.item_service, parent, false); + return new ServiceViewHolder(v); + } + + //Populate the row with service data + @Override + public void onBindViewHolder(@NonNull ServiceViewHolder holder, int position) { + Service service = serviceList.get(position); + + holder.tvServiceName.setText(service.getServiceName()); + holder.tvServiceDesc.setText(service.getServiceDesc()); + holder.tvServiceDuration.setText("Duration: " + service.getServiceDuration() + " min"); + holder.tvServicePrice.setText("$" + String.format("%.2f", service.getServicePrice())); + + //Set click listener for each row + holder.itemView.setOnClickListener(v -> { + Intent intent = new Intent(context, ServiceDetailActivity.class); + intent.putExtra("serviceId", service.getServiceId()); + intent.putExtra("serviceName", service.getServiceName()); + intent.putExtra("serviceDesc", service.getServiceDesc()); + intent.putExtra("serviceDuration", service.getServiceDuration()); + intent.putExtra("servicePrice", service.getServicePrice()); + context.startActivity(intent); + }); + } + + @Override + public int getItemCount() { + return serviceList.size(); + } + +} diff --git a/app/src/main/java/com/example/petstoremobile/adapters/SupplierAdapter.java b/app/src/main/java/com/example/petstoremobile/adapters/SupplierAdapter.java new file mode 100644 index 00000000..3af54dc5 --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/adapters/SupplierAdapter.java @@ -0,0 +1,78 @@ +package com.example.petstoremobile.adapters; + +import android.content.Context; +import android.content.Intent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.petstoremobile.R; +import com.example.petstoremobile.activities.detailactivites.SupplierDetailActivity; +import com.example.petstoremobile.models.Supplier; + +import java.util.List; + +public class SupplierAdapter extends RecyclerView.Adapter { + private List supplierList; + private Context context; + + //Constructor + public SupplierAdapter(List supplierList, Context context) { + this.supplierList = supplierList; + this.context = context; + } + + //Get controls of each row in recycler view + public static class SupplierViewHolder extends RecyclerView.ViewHolder { + TextView tvSupCompany, tvSupContactName, tvSupEmail, tvSupPhone; + + public SupplierViewHolder(@NonNull View v) { + super(v); + tvSupCompany = v.findViewById(R.id.tvSupCompany); + tvSupContactName = v.findViewById(R.id.tvSupContactName); + tvSupEmail = v.findViewById(R.id.tvSupEmail); + tvSupPhone = v.findViewById(R.id.tvSupPhone); + } + } + + //Create a new row view + @NonNull + @Override + public SupplierViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View v = LayoutInflater.from(context).inflate(R.layout.item_supplier, parent, false); + return new SupplierViewHolder(v); + } + + //Populate the row with supplier data + @Override + public void onBindViewHolder(@NonNull SupplierViewHolder holder, int position) { + Supplier supplier = supplierList.get(position); + + holder.tvSupCompany.setText(supplier.getSupCompany()); + holder.tvSupContactName.setText(supplier.getSupContactFirstName() + " " + supplier.getSupContactLastName()); + holder.tvSupEmail.setText(supplier.getSupEmail()); + holder.tvSupPhone.setText(supplier.getSupPhone()); + + //Set click listener for each row + holder.itemView.setOnClickListener(v -> { + Intent intent = new Intent(context, SupplierDetailActivity.class); + intent.putExtra("supId", supplier.getSupId()); + intent.putExtra("supCompany", supplier.getSupCompany()); + intent.putExtra("supContactFirstName", supplier.getSupContactFirstName()); + intent.putExtra("supContactLastName", supplier.getSupContactLastName()); + intent.putExtra("supEmail", supplier.getSupEmail()); + intent.putExtra("supPhone", supplier.getSupPhone()); + context.startActivity(intent); + }); + } + + @Override + public int getItemCount() { + return supplierList.size(); + } + +} diff --git a/app/src/main/java/com/example/petstoremobile/models/Pet.java b/app/src/main/java/com/example/petstoremobile/models/Pet.java new file mode 100644 index 00000000..22249bad --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/models/Pet.java @@ -0,0 +1,79 @@ +package com.example.petstoremobile.models; + +public class Pet { + private int petId; + private String petName; + private String petSpecies; + private String petBreed; + private int petAge; + private String petStatus; + private double petPrice; + + //constructor + public Pet(int petId, String petName, String petSpecies, String petBreed, int petAge, String petStatus, double petPrice) { + this.petId = petId; + this.petName = petName; + this.petSpecies = petSpecies; + this.petBreed = petBreed; + this.petAge = petAge; + this.petStatus = petStatus; + this.petPrice = petPrice; + } + + //getter and setters + public int getPetId() { + return petId; + } + +// public void setPetId(int petId) { +// this.petId = petId; +// } + + public String getPetName() { + return petName; + } + + public void setPetName(String petName) { + this.petName = petName; + } + + public String getPetSpecies() { + return petSpecies; + } + + public void setPetSpecies(String petSpecies) { + this.petSpecies = petSpecies; + } + + public String getPetBreed() { + return petBreed; + } + + public void setPetBreed(String petBreed) { + this.petBreed = petBreed; + } + + public int getPetAge() { + return petAge; + } + + public void setPetAge(int petAge) { + this.petAge = petAge; + } + + public String getPetStatus() { + return petStatus; + } + + public void setPetStatus(String petStatus) { + this.petStatus = petStatus; + } + + public double getPetPrice() { + return petPrice; + } + + public void setPetPrice(double petPrice) { + this.petPrice = petPrice; + } +} diff --git a/app/src/main/java/com/example/petstoremobile/models/Service.java b/app/src/main/java/com/example/petstoremobile/models/Service.java new file mode 100644 index 00000000..46485c3d --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/models/Service.java @@ -0,0 +1,59 @@ +package com.example.petstoremobile.models; + +public class Service { + private int serviceId; + private String serviceName; + private String serviceDesc; + private int serviceDuration; + private double servicePrice; + + // Constructor + public Service(int serviceId, String serviceName, String serviceDesc, int serviceDuration, double servicePrice) { + this.serviceId = serviceId; + this.serviceName = serviceName; + this.serviceDesc = serviceDesc; + this.serviceDuration = serviceDuration; + this.servicePrice = servicePrice; + } + + //getter and setters + public int getServiceId() { + return serviceId; + } + +// public void setServiceId(int serviceId) { +// this.serviceId = serviceId; +// } + + public String getServiceName() { + return serviceName; + } + + public void setServiceName(String serviceName) { + this.serviceName = serviceName; + } + + public String getServiceDesc() { + return serviceDesc; + } + + public void setServiceDesc(String serviceDesc) { + this.serviceDesc = serviceDesc; + } + + public int getServiceDuration() { + return serviceDuration; + } + + public void setServiceDuration(int serviceDuration) { + this.serviceDuration = serviceDuration; + } + + public double getServicePrice() { + return servicePrice; + } + + public void setServicePrice(double servicePrice) { + this.servicePrice = servicePrice; + } +} diff --git a/app/src/main/java/com/example/petstoremobile/models/Supplier.java b/app/src/main/java/com/example/petstoremobile/models/Supplier.java new file mode 100644 index 00000000..755432f2 --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/models/Supplier.java @@ -0,0 +1,70 @@ +package com.example.petstoremobile.models; + +public class Supplier { + private int supId; + private String supCompany; + private String supContactFirstName; + private String supContactLastName; + private String supEmail; + private String supPhone; + + // Constructor + public Supplier(int supId, String supCompany, String supContactFirstName, String supContactLastName, String supEmail, String supPhone) { + this.supId = supId; + this.supCompany = supCompany; + this.supContactFirstName = supContactFirstName; + this.supContactLastName = supContactLastName; + this.supEmail = supEmail; + this.supPhone = supPhone; + } + + //getter and setters + + public int getSupId() { + return supId; + } + +// public void setSupId(int supId) { +// this.supId = supId; +// } + + public String getSupCompany() { + return supCompany; + } + + public void setSupCompany(String supCompany) { + this.supCompany = supCompany; + } + + public String getSupContactFirstName() { + return supContactFirstName; + } + + public void setSupContactFirstName(String supContactFirstName) { + this.supContactFirstName = supContactFirstName; + } + + public String getSupContactLastName() { + return supContactLastName; + } + + public void setSupContactLastName(String supContactLastName) { + this.supContactLastName = supContactLastName; + } + + public String getSupEmail() { + return supEmail; + } + + public void setSupEmail(String supEmail) { + this.supEmail = supEmail; + } + + public String getSupPhone() { + return supPhone; + } + + public void setSupPhone(String supPhone) { + this.supPhone = supPhone; + } +} diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..07d5da9c --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000..2b068d11 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_adoption.xml b/app/src/main/res/layout/activity_adoption.xml new file mode 100644 index 00000000..d896813f --- /dev/null +++ b/app/src/main/res/layout/activity_adoption.xml @@ -0,0 +1,19 @@ + + + + + \ 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 new file mode 100644 index 00000000..116c3932 --- /dev/null +++ b/app/src/main/res/layout/activity_appointments.xml @@ -0,0 +1,19 @@ + + + + + \ 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 new file mode 100644 index 00000000..a2e7f2cd --- /dev/null +++ b/app/src/main/res/layout/activity_inventory.xml @@ -0,0 +1,19 @@ + + + + + \ 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 new file mode 100644 index 00000000..2baeba2a --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + +