From a70e6eba08b0c7800c290a869e7c449264164c31 Mon Sep 17 00:00:00 2001 From: Price Hiller Date: Fri, 5 Jul 2024 23:29:45 -0500 Subject: [PATCH] cs-3443: add lab3 --- Summer-2024/CS-3443/Labs/Lab3/.gitignore | 18 ++ Summer-2024/CS-3443/Labs/Lab3/Layout.puml | 70 +++++++ Summer-2024/CS-3443/Labs/Lab3/Layout.svg | 1 + Summer-2024/CS-3443/Labs/Lab3/README.org | 26 +++ Summer-2024/CS-3443/Labs/Lab3/UML.html | 38 ++++ Summer-2024/CS-3443/Labs/Lab3/app/.classpath | 6 + Summer-2024/CS-3443/Labs/Lab3/app/.gitignore | 1 + .../CS-3443/Labs/Lab3/app/build.gradle.kts | 43 ++++ .../CS-3443/Labs/Lab3/app/proguard-rules.pro | 21 ++ .../zfp106_lab3/ExampleInstrumentedTest.java | 26 +++ .../Lab3/app/src/main/AndroidManifest.xml | 26 +++ .../Lab3/app/src/main/assets/listings.csv | 8 + .../utsa/cs3443/zfp106_lab3/MainActivity.java | 104 ++++++++++ .../zfp106_lab3/model/CommercialProperty.java | 82 ++++++++ .../cs3443/zfp106_lab3/model/Listing.java | 97 +++++++++ .../cs3443/zfp106_lab3/model/Property.java | 90 +++++++++ .../model/ResidentialProperty.java | 85 ++++++++ .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++++++ .../res/drawable/ic_launcher_foreground.xml | 30 +++ .../Lab3/app/src/main/res/drawable/logo.jpeg | Bin 0 -> 32737 bytes .../app/src/main/res/layout/activity_main.xml | 66 +++++++ .../main/res/mipmap-anydpi/ic_launcher.xml | 6 + .../res/mipmap-anydpi/ic_launcher_round.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes .../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 + .../Lab3/app/src/main/res/values/colors.xml | 5 + .../Lab3/app/src/main/res/values/strings.xml | 3 + .../Lab3/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 ++ .../cs3443/zfp106_lab3/ExampleUnitTest.java | 17 ++ .../CS-3443/Labs/Lab3/build.gradle.kts | 4 + .../CS-3443/Labs/Lab3/gradle.properties | 21 ++ .../Labs/Lab3/gradle/libs.versions.toml | 22 +++ .../Lab3/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + Summer-2024/CS-3443/Labs/Lab3/gradlew | 185 ++++++++++++++++++ Summer-2024/CS-3443/Labs/Lab3/gradlew.bat | 89 +++++++++ .../CS-3443/Labs/Lab3/settings.gradle.kts | 23 +++ 48 files changed, 1443 insertions(+) create mode 100644 Summer-2024/CS-3443/Labs/Lab3/.gitignore create mode 100644 Summer-2024/CS-3443/Labs/Lab3/Layout.puml create mode 100644 Summer-2024/CS-3443/Labs/Lab3/Layout.svg create mode 100644 Summer-2024/CS-3443/Labs/Lab3/README.org create mode 100644 Summer-2024/CS-3443/Labs/Lab3/UML.html create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/.classpath create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/.gitignore create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/build.gradle.kts create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/proguard-rules.pro create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/androidTest/java/edu/utsa/cs3443/zfp106_lab3/ExampleInstrumentedTest.java create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/AndroidManifest.xml create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/assets/listings.csv create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/MainActivity.java create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/model/CommercialProperty.java create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/model/Listing.java create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/model/Property.java create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/model/ResidentialProperty.java create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/drawable/logo.jpeg create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/layout/activity_main.xml create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/mipmap-anydpi/ic_launcher.xml create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/values-night/themes.xml create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/values/colors.xml create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/values/strings.xml create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/values/themes.xml create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/xml/backup_rules.xml create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 Summer-2024/CS-3443/Labs/Lab3/app/src/test/java/edu/utsa/cs3443/zfp106_lab3/ExampleUnitTest.java create mode 100644 Summer-2024/CS-3443/Labs/Lab3/build.gradle.kts create mode 100644 Summer-2024/CS-3443/Labs/Lab3/gradle.properties create mode 100644 Summer-2024/CS-3443/Labs/Lab3/gradle/libs.versions.toml create mode 100644 Summer-2024/CS-3443/Labs/Lab3/gradle/wrapper/gradle-wrapper.jar create mode 100644 Summer-2024/CS-3443/Labs/Lab3/gradle/wrapper/gradle-wrapper.properties create mode 100755 Summer-2024/CS-3443/Labs/Lab3/gradlew create mode 100644 Summer-2024/CS-3443/Labs/Lab3/gradlew.bat create mode 100644 Summer-2024/CS-3443/Labs/Lab3/settings.gradle.kts diff --git a/Summer-2024/CS-3443/Labs/Lab3/.gitignore b/Summer-2024/CS-3443/Labs/Lab3/.gitignore new file mode 100644 index 0000000..f7ff4f7 --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/.gitignore @@ -0,0 +1,18 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.idea +.project +.settings +.externalNativeBuild +.cxx +local.properties diff --git a/Summer-2024/CS-3443/Labs/Lab3/Layout.puml b/Summer-2024/CS-3443/Labs/Lab3/Layout.puml new file mode 100644 index 0000000..872b461 --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/Layout.puml @@ -0,0 +1,70 @@ +@startuml +skinparam classAttributeIconSize 0 +abstract class Property { + -id: String + -address: String + -price: String + +<> Property(id: String, address: String, price: String) + +toString(): String + +setId(newId: String) + +getId(): String + +setAddress(newAddress: String) + +getAddress(): String + +setPrice(price: String) + +getPrice(): String +} + +skinparam classAttributeIconSize 0 +class CommercialProperty { + -id: String + -address: String + -price: String + -zone: String + -units: Integer + -parkingSpots: Integer + +<> CommercialProperty(id: String, address: String, price: String, zone: String, units: Integer, parkingSpots: Integer) + +setZone(newZone: String) + +getZone(): String + +setUnits(newUnits: Integer) + +getUnits(): Integer + +setParkingSpots(newParkingSpots: Integer) + +getParkingSpots(): Integer +} + +skinparam classAttributeIconSize 0 +class ResidentialProperty { + -id: String + -address: String + -price: String + -hoaFees: Double + -bedrooms: Double + -bathrooms: Double + +<> ResidentialProperty(id: String, address: String, price: String, hoaFees: Double, bedrooms: Double, bathrooms: Double) + +getHoaFees(): Double + +setHoaFees(newHoaFees: Double) + +getBedrooms(): Double + +setBedrooms(newBedrooms: Double) + +getBedrooms(): Double + +getBathrooms(): Double + +setBathrooms(newBathrooms: Double) +} + +skinparam classAttributeIconSize 0 +class Listing { + -properties: ArrayList + +setProperties(newProperties: ArrayList) + +getProperties(): ArrayList + +loadProperties(): Listing + +getProperty(address: String): Property +} + +skinparam classAttributeIconSize 0 +class MainActivity { + #onCreate(savedInstanceState: Bundle) +} + +CommercialProperty -u-|> Property +ResidentialProperty -u-|> Property +Listing *-d- Property +MainActivity .d.|> Listing +@enduml diff --git a/Summer-2024/CS-3443/Labs/Lab3/Layout.svg b/Summer-2024/CS-3443/Labs/Lab3/Layout.svg new file mode 100644 index 0000000..7907e44 --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/Layout.svg @@ -0,0 +1 @@ +Property-id: String-address: String-price: String+«constructor» Property(id: String, address: String, price: String)+toString(): String+setId(newId: String)+getId(): String+setAddress(newAddress: String)+getAddress(): String+setPrice(price: String)+getPrice(): StringCommercialProperty-id: String-address: String-price: String-zone: String-units: Integer-parkingSpots: Integer+«constructor» CommercialProperty(id: String, address: String, price: String, zone: String, units: Integer, parkingSpots: Integer)+setZone(newZone: String)+getZone(): String+setUnits(newUnits: Integer)+getUnits(): Integer+setParkingSpots(newParkingSpots: Integer)+getParkingSpots(): IntegerResidentialProperty-id: String-address: String-price: String-hoaFees: Double-bedrooms: Double-bathrooms: Double+«constructor» ResidentialProperty(id: String, address: String, price: String, hoaFees: Double, bedrooms: Double, bathrooms: Double)+getHoaFees(): Double+setHoaFees(newHoaFees: Double)+getBedrooms(): Double+setBedrooms(newBedrooms: Double)+getBedrooms(): Double+getBathrooms(): Double+setBathrooms(newBathrooms: Double)Listing-properties: ArrayList<Property>+setProperties(newProperties: ArrayList<Property>)+getProperties(): ArrayList<Property>+loadProperties(): Listing+getProperty(address: String): PropertyMainActivity#onCreate(savedInstanceState: Bundle) \ No newline at end of file diff --git a/Summer-2024/CS-3443/Labs/Lab3/README.org b/Summer-2024/CS-3443/Labs/Lab3/README.org new file mode 100644 index 0000000..f71a02a --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/README.org @@ -0,0 +1,26 @@ +* Lab 3 Submission +Name: =Price Hiller= + +ABC123: =zfp106= + +Date: =2024-07-05= + +URL: [[https://git.orion-technologies.io/Price/college/src/branch/Development/Summer-2024/CS-3443/Labs/Lab3]] + +** UML Diagram + +#+ATTR_HTML: :alt :align left :class img +[[./Layout.svg][UML Diagram of the program]] + +You can see the HTML rendering at [[./UML.html]] + +** Running the program + +To operate correctly the program must be ran from the top level directory! + +*** via Android Studio + +- Download the provided ~zip~ file +- Click =File= > =New= > =Import Project=... in Android Studio +- Select the downloaded ~zip~ file +- Run the application diff --git a/Summer-2024/CS-3443/Labs/Lab3/UML.html b/Summer-2024/CS-3443/Labs/Lab3/UML.html new file mode 100644 index 0000000..faa1798 --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/UML.html @@ -0,0 +1,38 @@ + + + + + + + zfp106 UML Diagram for Lab2 + + + +

+ Made in the dungeons with great pain in PlantUML (Lab3, + zfp106) +

+

+ Some notes on the decisions made here. + + + + + + + + + + + + + + +
QuestionAnswer
Why does the MainActivity class not show it's dependency relationship with AppCompatActivity?Because AppCompatActivity is coming from an external library, and as such not implemented by me.
Why do your concrete property classes (e.g. ResidentialProperty) not have toString() methods?Because they inherit the toString() method from their parent class Property.
+

+ +

The actual UML diagram below:

+ Uml Diagram + + + diff --git a/Summer-2024/CS-3443/Labs/Lab3/app/.classpath b/Summer-2024/CS-3443/Labs/Lab3/app/.classpath new file mode 100644 index 0000000..0a3280e --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/app/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/Summer-2024/CS-3443/Labs/Lab3/app/.gitignore b/Summer-2024/CS-3443/Labs/Lab3/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Summer-2024/CS-3443/Labs/Lab3/app/build.gradle.kts b/Summer-2024/CS-3443/Labs/Lab3/app/build.gradle.kts new file mode 100644 index 0000000..dc43bd9 --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/app/build.gradle.kts @@ -0,0 +1,43 @@ +plugins { + alias(libs.plugins.android.application) +} + +android { + namespace = "edu.utsa.cs3443.zfp106_lab3" + compileSdk = 34 + + defaultConfig { + applicationId = "edu.utsa.cs3443.zfp106_lab3" + minSdk = 26 + targetSdk = 34 + 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_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation(libs.appcompat) + implementation(libs.material) + implementation(libs.activity) + implementation(libs.constraintlayout) + testImplementation(libs.junit) + androidTestImplementation(libs.ext.junit) + androidTestImplementation(libs.espresso.core) +} \ No newline at end of file diff --git a/Summer-2024/CS-3443/Labs/Lab3/app/proguard-rules.pro b/Summer-2024/CS-3443/Labs/Lab3/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/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/Summer-2024/CS-3443/Labs/Lab3/app/src/androidTest/java/edu/utsa/cs3443/zfp106_lab3/ExampleInstrumentedTest.java b/Summer-2024/CS-3443/Labs/Lab3/app/src/androidTest/java/edu/utsa/cs3443/zfp106_lab3/ExampleInstrumentedTest.java new file mode 100644 index 0000000..e13fd96 --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/app/src/androidTest/java/edu/utsa/cs3443/zfp106_lab3/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package edu.utsa.cs3443.zfp106_lab3; + +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("edu.utsa.cs3443.zfp106_lab3", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/Summer-2024/CS-3443/Labs/Lab3/app/src/main/AndroidManifest.xml b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..f67de15 --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Summer-2024/CS-3443/Labs/Lab3/app/src/main/assets/listings.csv b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/assets/listings.csv new file mode 100644 index 0000000..a57f290 --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/assets/listings.csv @@ -0,0 +1,8 @@ +rp12345, 123 River Rd - San Antonio - TX, 350900, 400, 4, 3 +cp54321, 23412 Hill St - San Antonio - TX, 1500000, industrial, 1, 10 +rp67890, 34 Deer Ct - San Antonio - TX, 100000, 0, 1, 1 +rp09876, 109 Medina St - Boerne - TX, 249000, 0, 2, 3 +cp32145, 9867 Bend St - Selma - TX, 190000, office districts, 2, 15 +rp32145, 223 River Rd - San Antonio - TX, 270000, 500, 3, 2.5 +rp87690, 435 Bee Rd - San Antonio - TX, 3505000, 0, 10, 7 +cp90876, 123 Factory Dr - San Antonio - TX, 350000, office districts, 1, 12 \ No newline at end of file diff --git a/Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/MainActivity.java b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/MainActivity.java new file mode 100644 index 0000000..59e6e83 --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/MainActivity.java @@ -0,0 +1,104 @@ +package edu.utsa.cs3443.zfp106_lab3; + +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +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 edu.utsa.cs3443.zfp106_lab3.model.Listing; +import edu.utsa.cs3443.zfp106_lab3.model.Property; + +/** + * The main activity for this Android Application + * + */ +public class MainActivity extends AppCompatActivity { + + /** + * The primary driver for this program, handles the creation of the application + * + * @param savedInstanceState The saved instance state of the application + */ + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Listing listing = Listing.loadProperties(this); + 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; + }); + + Button propertyOneButton = findViewById(R.id.propertyButtonOne); + Property propertyOne = listing.getProperties().get(0); + propertyOneButton.setText(propertyOne.toString()); + propertyOneButton.setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View view) { + Toast toast = + Toast.makeText( + view.getContext(), + String.valueOf("$" + propertyOne.getPrice()), + Toast.LENGTH_SHORT); + toast.show(); + } + }); + + Button propertyTwoButton = findViewById(R.id.propertyButtonTwo); + Property propertyTwo = listing.getProperties().get(1); + propertyTwoButton.setText(propertyTwo.toString()); + propertyTwoButton.setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View view) { + Toast toast = + Toast.makeText( + view.getContext(), + String.valueOf("$" + propertyTwo.getPrice()), + Toast.LENGTH_SHORT); + toast.show(); + } + }); + + Button propertyThreeButton = findViewById(R.id.propertyButtonThree); + Property propertyThree = listing.getProperties().get(2); + propertyThreeButton.setText(propertyThree.toString()); + propertyThreeButton.setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View view) { + Toast toast = + Toast.makeText( + view.getContext(), + String.valueOf("$" + propertyThree.getPrice()), + Toast.LENGTH_SHORT); + toast.show(); + } + }); + + Button propertyFourButton = findViewById(R.id.propertyButtonFour); + Property propertyFour = listing.getProperties().get(3); + propertyFourButton.setText(propertyFour.toString()); + propertyFourButton.setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View view) { + Toast toast = + Toast.makeText( + view.getContext(), + String.valueOf("$" + propertyFour.getPrice()), + Toast.LENGTH_SHORT); + toast.show(); + } + }); + } +} diff --git a/Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/model/CommercialProperty.java b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/model/CommercialProperty.java new file mode 100644 index 0000000..08eb15d --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/model/CommercialProperty.java @@ -0,0 +1,82 @@ +package edu.utsa.cs3443.zfp106_lab3.model; + +/** + * A given Commercial Property + * + *

A commercial property, in addition to a normal property, has a zone, number of units, and number of parking spots + * + */ +public class CommercialProperty extends Property { + public String zone; + public Integer units; + public Integer parkingSpots; + + /** + * Create a new Commercial Property + * + * @param id ID of the property + * @param address Address/location of the property + * @param price The price of the property + * @param zone The zone of the Commercial property + * @param units The number of units within the Commercial property + * @param parkingSpots The number of parking spots within the Commercial property + */ + public CommercialProperty( + String id, String location, String price, String zone, Integer units, Integer parkingSpots) { + super(id, location, price); + } + + /** + * Set the zone of the property + * + * @param newZone The new zone for the commercial property + */ + public void setZone(String newZone) { + this.zone = newZone; + } + + /** + * Get the zone of the commercial property + * + * @return The current zone of the Commercial property + */ + public String getZone() { + return this.zone; + } + + /** + * Set the number of units within the commercial property + * + * @param newUnits The new number of units for the commercial property + */ + public void setUnits(Integer newUnits) { + this.units = newUnits; + } + + /** + * Get the number of units of the commercial property + * + * @return The number of units in the commercial property + */ + public Integer getUnits() { + return this.units; + } + + /** + * Set the number of parking spots within the commercial property + * + * @param newParkingSpots The new number of parking spots for the commercial property + */ + public void setParkingSpots(Integer newParkingSpots) { + this.parkingSpots = newParkingSpots; + } + + /** + * Get the number of parking spots within the commercial property + * + * @return The number of parking spots within the commercial property + */ + public Integer getParkingSpots() { + return this.parkingSpots; + } +} diff --git a/Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/model/Listing.java b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/model/Listing.java new file mode 100644 index 0000000..0123488 --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/model/Listing.java @@ -0,0 +1,97 @@ +package edu.utsa.cs3443.zfp106_lab3.model; + +import android.content.res.AssetManager; +import edu.utsa.cs3443.zfp106_lab3.MainActivity; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Scanner; + +/** + * A listing of properties with the ability to load them from an external csv file + * + */ +public class Listing { + public ArrayList properties; + + /** + * Create a new listing of proeprties + * + * @param properties The listing of properties + */ + public Listing(ArrayList properties) { + this.setProperties(properties); + } + + /** + * Set the properties for the listing + * + * @param newProperties The new properties to set for the listing + */ + public void setProperties(ArrayList newProperties) { + this.properties = newProperties; + } + + /** + * Get the properties of the listing + * + * @return The properties of the listing + */ + public ArrayList getProperties() { + return this.properties; + } + + /** + * Load properties from a "listings.csv" file and return a Listing + * + * @param activity The activity of the android application + * @return A new Listing of properties + * @throws throw new RuntimeException(e); If unable to read the properties listing + */ + public static Listing loadProperties(MainActivity activity) { + AssetManager manager = activity.getAssets(); + ArrayList properties = new ArrayList<>(); + try { + InputStream file = manager.open("listings.csv"); + Scanner scan = new Scanner(file); + while (scan.hasNextLine()) { + String line = scan.nextLine(); + String[] propertyInfo = line.split(","); + String id = propertyInfo[0].trim(); + String address = propertyInfo[1].trim(); + String price = propertyInfo[2].trim(); + Property property; + if (id.startsWith("rp")) { + Double hoaFees = Double.parseDouble(propertyInfo[3].trim()); + Double bedrooms = Double.parseDouble(propertyInfo[4].trim()); + Double bathrooms = Double.parseDouble(propertyInfo[5].trim()); + property = new ResidentialProperty(id, address, price, hoaFees, bedrooms, bathrooms); + } else { + String zone = propertyInfo[3].trim(); + Integer units = Integer.parseInt(propertyInfo[4].trim()); + Integer parkingSpots = Integer.parseInt(propertyInfo[5].trim()); + property = new CommercialProperty(id, address, price, zone, units, parkingSpots); + } + properties.add(property); + } + return new Listing(properties); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * Return a single property given an address of the property + * + * @param address The address of the property + * @return The associated proprety with the address or null if not found + */ + public Property getProperty(String address) { + for (Property property : this.getProperties()) { + if (property.getAddress().equals(address)) { + return property; + } + } + return null; + } +} diff --git a/Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/model/Property.java b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/model/Property.java new file mode 100644 index 0000000..95683c9 --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/model/Property.java @@ -0,0 +1,90 @@ +package edu.utsa.cs3443.zfp106_lab3.model; + +/** + * A given Property + * + *

A property has an id, address, and a price + * + */ +public abstract class Property { + private String id; + private String address; + private String price; + + /** + * Create a new Property + * + * @param id ID of the property + * @param address Address/location of the property + * @param price The price of the property + */ + public Property(String id, String address, String price) { + this.setId(id); + this.setAddress(address); + this.setPrice(price); + } + + + /** + * Get the string representation of the property + * + * @return The string representation of the property + */ + public String toString() { + return this.getAddress(); + } + + /** + * Set the id of the property + * + * @param newId The new id to set for the property + */ + public void setId(String newId) { + this.id = newId; + } + + /** + * Get the id of the property + * + * @return The current id of the property + */ + public String getId() { + return this.id; + } + + /** + * Set the address for the property + * + * @param newAddress The new address for the property + */ + public void setAddress(String newAddress) { + this.address = newAddress; + } + + /** + * Get the address of the property + * + * @return The current address of the property + */ + public String getAddress() { + return this.address; + } + + /** + * Set the price for the property + * + * @param price The new price for the property + */ + public void setPrice(String price) { + this.price = price; + } + + /** + * Get the price of the property + * + * @return The current price of the property + */ + public String getPrice() { + return this.price; + } +} diff --git a/Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/model/ResidentialProperty.java b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/model/ResidentialProperty.java new file mode 100644 index 0000000..bd35e4e --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/java/edu/utsa/cs3443/zfp106_lab3/model/ResidentialProperty.java @@ -0,0 +1,85 @@ +package edu.utsa.cs3443.zfp106_lab3.model; + +/** + * A given Residential Property + * + *

A residential property, in addition to a normal property, has HOA fees, a number of bedrooms, and a number of bathrooms + * + */ +public class ResidentialProperty extends Property { + private Double hoaFees; + private Double bedrooms; + private Double bathrooms; + + /** + * Create a new Residential Property + * + * @param id ID of the property + * @param address Address/location of the property + * @param price The price of the property + * @param hoaFees The annual HOA fees for the property + * @param bedrooms The number of bedrooms for the property + * @param bathrooms The number of bathrooms for the property + */ + public ResidentialProperty( + String id, String location, String price, Double hoaFees, Double bedrooms, Double bathrooms) { + super(id, location, price); + this.hoaFees = hoaFees; + this.bedrooms = bedrooms; + this.bathrooms = bathrooms; + } + + /** + * Get the annual HOA fees owed by the property + * + * @return The annual HOA fees owed by the property + */ + public Double getHoaFees() { + return this.hoaFees; + } + + /** + * Set the annual HOA fees owed for this property + * + * @param newHoaFees The annual HOA fees owed for this property + */ + public void setHoaFees(Double newHoaFees) { + this.hoaFees = newHoaFees; + } + + /** + * Get the number of bedrooms of this property + * + * @return The number of bedrooms of this property + */ + public Double getBedrooms() { + return this.bedrooms; + } + + /** + * Set the number of bedrooms for this property + * + * @param newBedrooms The number of bedrooms for this property + */ + public void setBedrooms(Double newBedrooms) { + this.bedrooms = newBedrooms; + } + + /** + * Get the number of bathrooms for this property + * + * @return The number of bathrooms for this property + */ + public Double getBathrooms() { + return this.bathrooms; + } + + /** + * Set the number of bathrooms for this property + * + * @param newBathrooms The number of bathrooms for this property + */ + public void setBathrooms(Double newBathrooms) { + this.bathrooms = newBathrooms; + } +} diff --git a/Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/drawable/ic_launcher_background.xml b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/drawable/ic_launcher_foreground.xml b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/drawable/logo.jpeg b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/drawable/logo.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..60f28fc998e6476400a0f245231816d2e5592e26 GIT binary patch literal 32737 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 X^8Xq^t35sQzedn%bA$ia2pauA8`10z literal 0 HcmV?d00001 diff --git a/Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/layout/activity_main.xml b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..7f6f120 --- /dev/null +++ b/Summer-2024/CS-3443/Labs/Lab3/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,66 @@ + + + + + +