From f6062b23023eb21afb5bfa52be858202498d4308 Mon Sep 17 00:00:00 2001 From: AndrewTrieu Date: Mon, 20 Jun 2022 13:08:58 +0700 Subject: [PATCH] Final --- .gitignore | 15 ++ .idea/.gitignore | 3 + .idea/.name | 1 + .idea/compiler.xml | 6 + .idea/gradle.xml | 19 ++ .idea/misc.xml | 36 ++++ .idea/vcs.xml | 6 + README.md | 19 ++ app/.gitignore | 1 + app/build.gradle | 43 ++++ app/proguard-rules.pro | 21 ++ .../ExampleInstrumentedTest.java | 26 +++ app/src/main/AndroidManifest.xml | 34 +++ app/src/main/ic_launcher-playstore.png | Bin 0 -> 52439 bytes .../com/example/tictactoeapplut/Board.java | 197 ++++++++++++++++++ .../tictactoeapplut/CustomAdapter.java | 66 ++++++ .../tictactoeapplut/DatabaseHelper.java | 64 ++++++ .../tictactoeapplut/EditDataActivity.java | 57 +++++ .../com/example/tictactoeapplut/Game.java | 46 ++++ .../tictactoeapplut/ListDataActivity.java | 48 +++++ .../example/tictactoeapplut/MainActivity.java | 50 +++++ .../com/example/tictactoeapplut/Move.java | 147 +++++++++++++ .../com/example/tictactoeapplut/Prepare.java | 29 +++ .../drawable-v24/ic_launcher_foreground.xml | 30 +++ app/src/main/res/drawable/blue.xml | 11 + app/src/main/res/drawable/button.xml | 11 + .../res/drawable/ic_launcher_background.xml | 170 +++++++++++++++ app/src/main/res/drawable/logo.png | Bin 0 -> 39390 bytes app/src/main/res/drawable/red.xml | 11 + app/src/main/res/drawable/yellow.xml | 11 + app/src/main/res/layout/activity_game.xml | 75 +++++++ app/src/main/res/layout/activity_main.xml | 97 +++++++++ app/src/main/res/layout/activity_prepare.xml | 91 ++++++++ app/src/main/res/layout/edit_data_layout.xml | 96 +++++++++ app/src/main/res/layout/list_item.xml | 65 ++++++ app/src/main/res/layout/list_layout.xml | 16 ++ app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3207 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 5435 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5131 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2151 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 3308 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3133 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4469 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 7865 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7437 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7118 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 13939 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 12243 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10213 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 21627 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 18135 bytes app/src/main/res/values-land/dimens.xml | 3 + app/src/main/res/values-night/themes.xml | 16 ++ app/src/main/res/values-w1240dp/dimens.xml | 3 + app/src/main/res/values-w600dp/dimens.xml | 3 + app/src/main/res/values/attrs.xml | 9 + app/src/main/res/values/colors.xml | 10 + app/src/main/res/values/dimens.xml | 3 + .../res/values/ic_launcher_background.xml | 4 + app/src/main/res/values/strings.xml | 24 +++ app/src/main/res/values/themes.xml | 25 +++ app/src/main/res/xml/backup_rules.xml | 13 ++ .../main/res/xml/data_extraction_rules.xml | 19 ++ .../tictactoeapplut/ExampleUnitTest.java | 17 ++ build.gradle | 9 + gradle.properties | 21 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++++++++++++++++ gradlew.bat | 89 ++++++++ materials/Part1/.gitignore | 15 ++ materials/Part1/.idea/.gitignore | 3 + materials/Part1/.idea/.name | 1 + materials/Part1/.idea/compiler.xml | 6 + materials/Part1/.idea/gradle.xml | 19 ++ materials/Part1/.idea/misc.xml | 16 ++ materials/Part1/app/.gitignore | 1 + materials/Part1/app/build.gradle | 38 ++++ materials/Part1/app/proguard-rules.pro | 21 ++ .../part1/ExampleInstrumentedTest.java | 26 +++ .../Part1/app/src/main/AndroidManifest.xml | 27 +++ .../java/com/example/part1/MainActivity.java | 33 +++ .../drawable-v24/ic_launcher_foreground.xml | 30 +++ .../res/drawable/ic_launcher_background.xml | 170 +++++++++++++++ .../app/src/main/res/layout/activity_main.xml | 55 +++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../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 | 16 ++ .../Part1/app/src/main/res/values/colors.xml | 10 + .../Part1/app/src/main/res/values/strings.xml | 3 + .../Part1/app/src/main/res/values/themes.xml | 16 ++ .../app/src/main/res/xml/backup_rules.xml | 13 ++ .../main/res/xml/data_extraction_rules.xml | 19 ++ .../com/example/part1/ExampleUnitTest.java | 17 ++ materials/Part1/build.gradle | 9 + materials/Part1/gradle.properties | 21 ++ .../Part1/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + materials/Part1/gradlew | 185 ++++++++++++++++ materials/Part1/gradlew.bat | 89 ++++++++ materials/Part1/settings.gradle | 16 ++ materials/Part2/.gitignore | 15 ++ materials/Part2/.idea/.gitignore | 3 + materials/Part2/.idea/.name | 1 + materials/Part2/.idea/compiler.xml | 6 + materials/Part2/.idea/gradle.xml | 18 ++ materials/Part2/.idea/misc.xml | 17 ++ materials/Part2/app/.gitignore | 1 + materials/Part2/app/build.gradle | 38 ++++ materials/Part2/app/proguard-rules.pro | 21 ++ .../part2/ExampleInstrumentedTest.java | 26 +++ .../Part2/app/src/main/AndroidManifest.xml | 30 +++ .../java/com/example/part2/MainActivity.java | 44 ++++ .../com/example/part2/SecondActivity.java | 21 ++ .../drawable-v24/ic_launcher_foreground.xml | 30 +++ .../res/drawable/ic_launcher_background.xml | 170 +++++++++++++++ .../app/src/main/res/layout/activity_main.xml | 30 +++ .../src/main/res/layout/activity_second.xml | 18 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../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 | 16 ++ .../Part2/app/src/main/res/values/colors.xml | 10 + .../Part2/app/src/main/res/values/strings.xml | 3 + .../Part2/app/src/main/res/values/themes.xml | 16 ++ .../app/src/main/res/xml/backup_rules.xml | 13 ++ .../main/res/xml/data_extraction_rules.xml | 19 ++ .../com/example/part2/ExampleUnitTest.java | 17 ++ materials/Part2/build.gradle | 9 + materials/Part2/gradle.properties | 21 ++ .../Part2/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + materials/Part2/gradlew | 185 ++++++++++++++++ materials/Part2/gradlew.bat | 89 ++++++++ materials/Part2/settings.gradle | 16 ++ materials/Part3/.gitignore | 15 ++ materials/Part3/.idea/.gitignore | 3 + materials/Part3/.idea/.name | 1 + materials/Part3/.idea/compiler.xml | 6 + .../Part3/.idea/deploymentTargetDropDown.xml | 17 ++ materials/Part3/.idea/gradle.xml | 18 ++ materials/Part3/.idea/misc.xml | 19 ++ materials/Part3/app/.gitignore | 1 + materials/Part3/app/build.gradle | 38 ++++ materials/Part3/app/proguard-rules.pro | 21 ++ .../part3/ExampleInstrumentedTest.java | 26 +++ .../Part3/app/src/main/AndroidManifest.xml | 30 +++ .../main/java/com/example/part3/Detail.java | 54 +++++ .../java/com/example/part3/ItemAdapter.java | 57 +++++ .../java/com/example/part3/MainActivity.java | 42 ++++ .../drawable-v24/ic_launcher_foreground.xml | 30 +++ .../app/src/main/res/drawable-v24/peach.jpeg | Bin 0 -> 6495 bytes .../app/src/main/res/drawable-v24/squash.jpg | Bin 0 -> 27241 bytes .../app/src/main/res/drawable-v24/tomato.jpg | Bin 0 -> 238015 bytes .../res/drawable/ic_launcher_background.xml | 170 +++++++++++++++ .../app/src/main/res/drawable/peach.jpeg | Bin 0 -> 6495 bytes .../app/src/main/res/drawable/squash.jpg | Bin 0 -> 27241 bytes .../app/src/main/res/drawable/tomato.jpg | Bin 0 -> 238015 bytes .../src/main/res/layout/activity_detail.xml | 18 ++ .../app/src/main/res/layout/activity_main.xml | 15 ++ .../src/main/res/layout/listview_details.xml | 38 ++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../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 | 16 ++ .../Part3/app/src/main/res/values/colors.xml | 10 + .../Part3/app/src/main/res/values/strings.xml | 18 ++ .../Part3/app/src/main/res/values/themes.xml | 16 ++ .../app/src/main/res/xml/backup_rules.xml | 13 ++ .../main/res/xml/data_extraction_rules.xml | 19 ++ .../com/example/part3/ExampleUnitTest.java | 17 ++ materials/Part3/build.gradle | 9 + materials/Part3/gradle.properties | 21 ++ .../Part3/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + materials/Part3/gradlew | 185 ++++++++++++++++ materials/Part3/gradlew.bat | 89 ++++++++ materials/Part3/settings.gradle | 16 ++ settings.gradle | 16 ++ 207 files changed, 4967 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 README.md create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/example/tictactoeapplut/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/java/com/example/tictactoeapplut/Board.java create mode 100644 app/src/main/java/com/example/tictactoeapplut/CustomAdapter.java create mode 100644 app/src/main/java/com/example/tictactoeapplut/DatabaseHelper.java create mode 100644 app/src/main/java/com/example/tictactoeapplut/EditDataActivity.java create mode 100644 app/src/main/java/com/example/tictactoeapplut/Game.java create mode 100644 app/src/main/java/com/example/tictactoeapplut/ListDataActivity.java create mode 100644 app/src/main/java/com/example/tictactoeapplut/MainActivity.java create mode 100644 app/src/main/java/com/example/tictactoeapplut/Move.java create mode 100644 app/src/main/java/com/example/tictactoeapplut/Prepare.java create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/blue.xml create mode 100644 app/src/main/res/drawable/button.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/logo.png create mode 100644 app/src/main/res/drawable/red.xml create mode 100644 app/src/main/res/drawable/yellow.xml create mode 100644 app/src/main/res/layout/activity_game.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_prepare.xml create mode 100644 app/src/main/res/layout/edit_data_layout.xml create mode 100644 app/src/main/res/layout/list_item.xml create mode 100644 app/src/main/res/layout/list_layout.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/values-land/dimens.xml create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values-w1240dp/dimens.xml create mode 100644 app/src/main/res/values-w600dp/dimens.xml create mode 100644 app/src/main/res/values/attrs.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/ic_launcher_background.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/tictactoeapplut/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 materials/Part1/.gitignore create mode 100644 materials/Part1/.idea/.gitignore create mode 100644 materials/Part1/.idea/.name create mode 100644 materials/Part1/.idea/compiler.xml create mode 100644 materials/Part1/.idea/gradle.xml create mode 100644 materials/Part1/.idea/misc.xml create mode 100644 materials/Part1/app/.gitignore create mode 100644 materials/Part1/app/build.gradle create mode 100644 materials/Part1/app/proguard-rules.pro create mode 100644 materials/Part1/app/src/androidTest/java/com/example/part1/ExampleInstrumentedTest.java create mode 100644 materials/Part1/app/src/main/AndroidManifest.xml create mode 100644 materials/Part1/app/src/main/java/com/example/part1/MainActivity.java create mode 100644 materials/Part1/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 materials/Part1/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 materials/Part1/app/src/main/res/layout/activity_main.xml create mode 100644 materials/Part1/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 materials/Part1/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 materials/Part1/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 materials/Part1/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 materials/Part1/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 materials/Part1/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 materials/Part1/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 materials/Part1/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 materials/Part1/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 materials/Part1/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 materials/Part1/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 materials/Part1/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 materials/Part1/app/src/main/res/values-night/themes.xml create mode 100644 materials/Part1/app/src/main/res/values/colors.xml create mode 100644 materials/Part1/app/src/main/res/values/strings.xml create mode 100644 materials/Part1/app/src/main/res/values/themes.xml create mode 100644 materials/Part1/app/src/main/res/xml/backup_rules.xml create mode 100644 materials/Part1/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 materials/Part1/app/src/test/java/com/example/part1/ExampleUnitTest.java create mode 100644 materials/Part1/build.gradle create mode 100644 materials/Part1/gradle.properties create mode 100644 materials/Part1/gradle/wrapper/gradle-wrapper.jar create mode 100644 materials/Part1/gradle/wrapper/gradle-wrapper.properties create mode 100755 materials/Part1/gradlew create mode 100644 materials/Part1/gradlew.bat create mode 100644 materials/Part1/settings.gradle create mode 100644 materials/Part2/.gitignore create mode 100644 materials/Part2/.idea/.gitignore create mode 100644 materials/Part2/.idea/.name create mode 100644 materials/Part2/.idea/compiler.xml create mode 100644 materials/Part2/.idea/gradle.xml create mode 100644 materials/Part2/.idea/misc.xml create mode 100644 materials/Part2/app/.gitignore create mode 100644 materials/Part2/app/build.gradle create mode 100644 materials/Part2/app/proguard-rules.pro create mode 100644 materials/Part2/app/src/androidTest/java/com/example/part2/ExampleInstrumentedTest.java create mode 100644 materials/Part2/app/src/main/AndroidManifest.xml create mode 100644 materials/Part2/app/src/main/java/com/example/part2/MainActivity.java create mode 100644 materials/Part2/app/src/main/java/com/example/part2/SecondActivity.java create mode 100644 materials/Part2/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 materials/Part2/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 materials/Part2/app/src/main/res/layout/activity_main.xml create mode 100644 materials/Part2/app/src/main/res/layout/activity_second.xml create mode 100644 materials/Part2/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 materials/Part2/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 materials/Part2/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 materials/Part2/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 materials/Part2/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 materials/Part2/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 materials/Part2/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 materials/Part2/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 materials/Part2/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 materials/Part2/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 materials/Part2/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 materials/Part2/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 materials/Part2/app/src/main/res/values-night/themes.xml create mode 100644 materials/Part2/app/src/main/res/values/colors.xml create mode 100644 materials/Part2/app/src/main/res/values/strings.xml create mode 100644 materials/Part2/app/src/main/res/values/themes.xml create mode 100644 materials/Part2/app/src/main/res/xml/backup_rules.xml create mode 100644 materials/Part2/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 materials/Part2/app/src/test/java/com/example/part2/ExampleUnitTest.java create mode 100644 materials/Part2/build.gradle create mode 100644 materials/Part2/gradle.properties create mode 100644 materials/Part2/gradle/wrapper/gradle-wrapper.jar create mode 100644 materials/Part2/gradle/wrapper/gradle-wrapper.properties create mode 100755 materials/Part2/gradlew create mode 100644 materials/Part2/gradlew.bat create mode 100644 materials/Part2/settings.gradle create mode 100644 materials/Part3/.gitignore create mode 100644 materials/Part3/.idea/.gitignore create mode 100644 materials/Part3/.idea/.name create mode 100644 materials/Part3/.idea/compiler.xml create mode 100644 materials/Part3/.idea/deploymentTargetDropDown.xml create mode 100644 materials/Part3/.idea/gradle.xml create mode 100644 materials/Part3/.idea/misc.xml create mode 100644 materials/Part3/app/.gitignore create mode 100644 materials/Part3/app/build.gradle create mode 100644 materials/Part3/app/proguard-rules.pro create mode 100644 materials/Part3/app/src/androidTest/java/com/example/part3/ExampleInstrumentedTest.java create mode 100644 materials/Part3/app/src/main/AndroidManifest.xml create mode 100644 materials/Part3/app/src/main/java/com/example/part3/Detail.java create mode 100644 materials/Part3/app/src/main/java/com/example/part3/ItemAdapter.java create mode 100644 materials/Part3/app/src/main/java/com/example/part3/MainActivity.java create mode 100644 materials/Part3/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 materials/Part3/app/src/main/res/drawable-v24/peach.jpeg create mode 100644 materials/Part3/app/src/main/res/drawable-v24/squash.jpg create mode 100644 materials/Part3/app/src/main/res/drawable-v24/tomato.jpg create mode 100644 materials/Part3/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 materials/Part3/app/src/main/res/drawable/peach.jpeg create mode 100644 materials/Part3/app/src/main/res/drawable/squash.jpg create mode 100644 materials/Part3/app/src/main/res/drawable/tomato.jpg create mode 100644 materials/Part3/app/src/main/res/layout/activity_detail.xml create mode 100644 materials/Part3/app/src/main/res/layout/activity_main.xml create mode 100644 materials/Part3/app/src/main/res/layout/listview_details.xml create mode 100644 materials/Part3/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 materials/Part3/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 materials/Part3/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 materials/Part3/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 materials/Part3/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 materials/Part3/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 materials/Part3/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 materials/Part3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 materials/Part3/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 materials/Part3/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 materials/Part3/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 materials/Part3/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 materials/Part3/app/src/main/res/values-night/themes.xml create mode 100644 materials/Part3/app/src/main/res/values/colors.xml create mode 100644 materials/Part3/app/src/main/res/values/strings.xml create mode 100644 materials/Part3/app/src/main/res/values/themes.xml create mode 100644 materials/Part3/app/src/main/res/xml/backup_rules.xml create mode 100644 materials/Part3/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 materials/Part3/app/src/test/java/com/example/part3/ExampleUnitTest.java create mode 100644 materials/Part3/build.gradle create mode 100644 materials/Part3/gradle.properties create mode 100644 materials/Part3/gradle/wrapper/gradle-wrapper.jar create mode 100644 materials/Part3/gradle/wrapper/gradle-wrapper.properties create mode 100755 materials/Part3/gradlew create mode 100644 materials/Part3/gradlew.bat create mode 100644 materials/Part3/settings.gradle create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /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 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..f063dcb --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Tic Tac Toe \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..a2d7c21 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..3f2e1e1 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..babff97 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# Tic-tac-toe app for Android +This project and repository are created for the course CT70A9120 Software Development Skills: Mobile of LUT University, Finland. The app is a Tic-tac-toe game, using a SQLite database to save details of each match (players' names, the winner, and time when the match finishes). The user can view all matches and delete them later. + +## Learning diary +The learning diary is included as a PDF in this repository. + +## Exercise materials +Exercice materials from the YouTube videos are in the folder Materials of this repository. + +## How to run the application? +Run the app using an Android Emulator, minimum API level 21. The application was tested on API level 32 during development, using USB debugging. An APK file is included in /app/build/outputs/apk/debug for easy installation. + +## Demonstration video +Link to be updated. + +## References +The logo of the app is from [PNGWing](https://www.pngwing.com/) and is used for educational purposes only in this project. +The Tic-tac-toe game is based on the Tic-tac-toe series of [Practical Coding](https://www.youtube.com/c/PracticalCoding "Practical Coding"). + diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..1fcb6ef --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,43 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdk 32 + + defaultConfig { + applicationId "com.example.tictactoeapplut" + minSdk 21 + targetSdk 32 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + buildFeatures { + viewBinding true + } +} + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.3.0' + implementation 'com.google.android.material:material:1.4.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.navigation:navigation-fragment:2.3.5' + implementation 'androidx.navigation:navigation-ui:2.3.5' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /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/tictactoeapplut/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/tictactoeapplut/ExampleInstrumentedTest.java new file mode 100644 index 0000000..4daf416 --- /dev/null +++ b/app/src/androidTest/java/com/example/tictactoeapplut/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.tictactoeapplut; + +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.tictactoeapplut", 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 0000000..6198312 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..38fe06f6822c78ca6594bb4d0c62e217c5a90a27 GIT binary patch literal 52439 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 KmCF?^g8vWm*MnF9 literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/example/tictactoeapplut/Board.java b/app/src/main/java/com/example/tictactoeapplut/Board.java new file mode 100644 index 0000000..14c3560 --- /dev/null +++ b/app/src/main/java/com/example/tictactoeapplut/Board.java @@ -0,0 +1,197 @@ +package com.example.tictactoeapplut; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.Nullable; + +public class Board extends View { + + private final int boardColor; + private final int XColor; + private final int OColor; + private final int winColor; + private int cellSize = getWidth()/3; + private final Paint paint = new Paint(); + private final Move game; + private boolean winLine = false; + + public Board(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + game = new Move(context); + + TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.Board,0,0); + + try { + boardColor = a.getInteger(R.styleable.Board_boardColor, 0); + XColor = a.getInteger(R.styleable.Board_XColor, 0); + OColor = a.getInteger(R.styleable.Board_OColor, 0); + winColor = a.getInteger(R.styleable.Board_winColor, 0); + + } finally { + a.recycle(); + } + } + + @Override + protected void onMeasure(int width, int height) { + super.onMeasure(width, height); + + int size = Math.min(getMeasuredWidth(), getMeasuredHeight()); + cellSize = size/3; + + setMeasuredDimension(size, size); + } + + @Override + protected void onDraw(Canvas canvas) { + paint.setStyle(Paint.Style.STROKE); + paint.setAntiAlias(true); + + drawBoard(canvas); + drawMove(canvas); + + if (winLine) { + paint.setColor(winColor); + drawWinLine(canvas); + + } + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public boolean onTouchEvent(MotionEvent event) { + float x = event.getX(); + float y = event.getY(); + + int action = event.getAction(); + if (action == MotionEvent.ACTION_DOWN) { + int row = (int) Math.ceil(y/cellSize); + int column = (int) Math.ceil(x/cellSize); + if (!winLine) { + if (game.updateBoard(row, column)) { + invalidate(); + if (game.winCheck()) { + winLine = true; + invalidate(); + } + if (game.getPlayer() % 2 == 0) { + game.setPlayer(game.getPlayer() - 1); + } else { + game.setPlayer(game.getPlayer() + 1); + } + } + } + + invalidate(); + + return true; + } + + return false; + } + + private void drawBoard(Canvas canvas) { + paint.setColor(boardColor); + paint.setStrokeWidth(16); + for (int x=1; x<3; x++) { + canvas.drawLine(cellSize*x, 0, cellSize*x, canvas.getWidth(), paint); + } + + for (int y=1; y<3; y++) { + canvas.drawLine(0, cellSize*y, canvas.getWidth(), cellSize*y, paint); + } + paint.setStrokeWidth(32); + canvas.drawLine(0,0,cellSize*3,0,paint); + paint.setStrokeWidth(32); + canvas.drawLine(0,cellSize*3,cellSize*3,cellSize*3,paint); + paint.setStrokeWidth(16); + canvas.drawLine(0,0,0,cellSize*3,paint); + paint.setStrokeWidth(16); + canvas.drawLine(cellSize*3,0,cellSize*3,cellSize*3,paint); + } + + private void drawMove(Canvas canvas) { + for (int r=0; r<3; r++) { + for (int c=0; c<3; c++) { + if (game.getBoard()[r][c]!=0) { + if (game.getBoard()[r][c]==1) { + drawX(canvas, r, c); + } else { + drawO(canvas, r, c); + } + } + } + } + } + + private void drawX(Canvas canvas, int row, int column) { + paint.setColor(XColor); + canvas.drawLine((float)((column+1)*cellSize - cellSize*0.1), (float)(row*cellSize+cellSize*0.1), (float)(column*cellSize+cellSize*0.1), (float)((row+1)*cellSize-cellSize*0.1), paint); + canvas.drawLine((float)(column*cellSize+cellSize*0.1), (float)(row*cellSize+cellSize*0.1), (float)((column+1)*cellSize-cellSize*0.1), (float)((row+1)*cellSize-cellSize*0.1), paint); + + } + + private void drawO(Canvas canvas, int row, int column) { + paint.setColor(OColor); + canvas.drawOval((float)(column*cellSize+cellSize*0.1), (float)(row*cellSize+cellSize*0.1), (float)(column*cellSize+cellSize-cellSize*0.1), (float)(row*cellSize+cellSize-cellSize*0.1), paint); + } + + private void drawHorizontal(Canvas canvas, int row, int column) { + canvas.drawLine(column, row*cellSize + cellSize/2, cellSize*3, row*cellSize+cellSize/2,paint); + } + + private void drawVertical(Canvas canvas, int row, int column) { + canvas.drawLine(column*cellSize+cellSize/2, row, column*cellSize+cellSize/2, cellSize*3,paint); + } + + private void drawSlopeUp(Canvas canvas) { + canvas.drawLine(0, cellSize*3, cellSize*3, 0 ,paint); + } + + private void drawSlopeDown(Canvas canvas) { + canvas.drawLine(0, 0, cellSize*3, cellSize*3 ,paint); + } + + private void drawWinLine(Canvas canvas) { + int row = game.getWinType()[0]; + int column = game.getWinType()[1]; + + switch (game.getWinType()[2]) { + case 1: + drawHorizontal(canvas, row, column); + break; + case 2: + drawVertical(canvas, row, column); + break; + case 3: + drawSlopeDown(canvas); + break; + case 4: + drawSlopeUp(canvas); + break; + } + } + + public void setUp(Button again, Button home, TextView display, String[] names) { + game.setAgain(again); + game.setHome(home); + game.setTurn(display); + if (!names[0].equals("") && !names[1].equals("")){ + game.setNames(names); + } + } + + public void resetGame() { + game.resetBoard(); + winLine = false; + } +} diff --git a/app/src/main/java/com/example/tictactoeapplut/CustomAdapter.java b/app/src/main/java/com/example/tictactoeapplut/CustomAdapter.java new file mode 100644 index 0000000..17ed1cd --- /dev/null +++ b/app/src/main/java/com/example/tictactoeapplut/CustomAdapter.java @@ -0,0 +1,66 @@ +package com.example.tictactoeapplut; + +import android.content.Context; +import android.content.Intent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import java.util.ArrayList; + +public class CustomAdapter extends BaseAdapter { + private static final String TAG = "CustomAdapter"; + Context context; + ArrayList name; + ArrayList winner; + ArrayList time; + + public CustomAdapter(Context context, ArrayList name, ArrayList winner, ArrayList time) { + this.context = context; + this.name = name; + this.winner = winner; + this.time = time; + } + + @Override + public int getCount() { + return name.size(); + } + + @Override + public Object getItem(int position) { + return null; + } + + @Override + public long getItemId(int position) { + return 0; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + convertView = inflater.inflate(R.layout.list_item,parent,false); + TextView txtName, txtWin, txtTime; + + txtName = convertView.findViewById(R.id.txt_name); + txtWin = convertView.findViewById(R.id.txt_win); + txtTime = convertView.findViewById(R.id.txt_time); + txtName.setText(name.get(position)); + txtWin.setText(winner.get(position)); + txtTime.setText(time.get(position)); + convertView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent editScreenIntent = new Intent(context, EditDataActivity.class); + editScreenIntent.putExtra("time",txtTime.getText().toString()); + editScreenIntent.putExtra("players", txtName.getText().toString()); + editScreenIntent.putExtra("winner", txtWin.getText().toString()); + context.startActivity(editScreenIntent); + } + }); + return convertView; + } +} diff --git a/app/src/main/java/com/example/tictactoeapplut/DatabaseHelper.java b/app/src/main/java/com/example/tictactoeapplut/DatabaseHelper.java new file mode 100644 index 0000000..eac4f3c --- /dev/null +++ b/app/src/main/java/com/example/tictactoeapplut/DatabaseHelper.java @@ -0,0 +1,64 @@ +package com.example.tictactoeapplut; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +public class DatabaseHelper extends SQLiteOpenHelper { + + private static final String TABLE_NAME = "record"; + private static final String COL1 = "players"; + private static final String COL2 = "winner"; + private static final String COL3 = "time"; + + + public DatabaseHelper(Context context) { + super(context, TABLE_NAME, null, 1); + } + + @Override + public void onCreate(SQLiteDatabase db) { + String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " + + COL1 +" TEXT, " + COL2 + " TEXT, " + COL3 + " TEXT)"; + db.execSQL(createTable); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int i, int i1) { + db.execSQL("DROP IF TABLE EXISTS " + TABLE_NAME); + onCreate(db); + } + + public boolean addData(String players, String winner, String time) { + SQLiteDatabase db = this.getWritableDatabase(); + ContentValues contentValues = new ContentValues(); + contentValues.put(COL1, players); + contentValues.put(COL2, winner); + contentValues.put(COL3, time); + + long result = db.insert(TABLE_NAME, null, contentValues); + + if (result == -1) { + return false; + } else { + return true; + } + } + + public Cursor getData(){ + SQLiteDatabase db = this.getWritableDatabase(); + String query = "SELECT * FROM " + TABLE_NAME; + Cursor data = db.rawQuery(query, null); + return data; + } + + public void deleteMatch(String time){ + SQLiteDatabase db = this.getWritableDatabase(); + String query = "DELETE FROM " + TABLE_NAME + " WHERE " + + COL3 + " = '" + time + "'"; + db.execSQL(query); + } + +} diff --git a/app/src/main/java/com/example/tictactoeapplut/EditDataActivity.java b/app/src/main/java/com/example/tictactoeapplut/EditDataActivity.java new file mode 100644 index 0000000..1d537d7 --- /dev/null +++ b/app/src/main/java/com/example/tictactoeapplut/EditDataActivity.java @@ -0,0 +1,57 @@ +package com.example.tictactoeapplut; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +public class EditDataActivity extends AppCompatActivity { + + private Button btnDelete; + private TextView txtPlayers, txtWinner, txtTime; + + DatabaseHelper mDatabaseHelper; + + private String selectedPlayers, selectedWinner, selectedTime; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.edit_data_layout); + btnDelete = (Button) findViewById(R.id.btnDelete); + txtPlayers = (TextView) findViewById(R.id.txtPlayers); + txtWinner = (TextView) findViewById(R.id.txtWinner); + txtTime = (TextView) findViewById(R.id.txtTime); + mDatabaseHelper = new DatabaseHelper(this); + + Intent receivedIntent = getIntent(); + + selectedPlayers = receivedIntent.getStringExtra("players"); + selectedWinner = receivedIntent.getStringExtra("winner"); + selectedTime = receivedIntent.getStringExtra("time"); + + txtPlayers.setText(selectedPlayers); + txtWinner.setText(selectedWinner); + txtTime.setText(selectedTime); + + btnDelete.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + mDatabaseHelper.deleteMatch(selectedTime); + txtPlayers.setText(""); + txtWinner.setText(""); + txtTime.setText(""); + toaster(); + } + }); + + } + private void toaster(){ + Toast.makeText(this, "Match removed", Toast.LENGTH_SHORT).show(); + } +} diff --git a/app/src/main/java/com/example/tictactoeapplut/Game.java b/app/src/main/java/com/example/tictactoeapplut/Game.java new file mode 100644 index 0000000..928ca3b --- /dev/null +++ b/app/src/main/java/com/example/tictactoeapplut/Game.java @@ -0,0 +1,46 @@ +package com.example.tictactoeapplut; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +public class Game extends AppCompatActivity { + private Board board; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_game); + Button again = findViewById(R.id.button6); + Button home = findViewById(R.id.button5); + TextView turn = findViewById(R.id.textView5); + again.setVisibility(View.GONE); + home.setVisibility(View.GONE); + String[] names = getIntent().getStringArrayExtra("PLAYERS"); + assert names != null; + if (names[0].equals("")){ + + turn.setText((String)("Player 1's turn")); + }else{ + turn.setText((String)(names[0] + "'s turn")); + } + board = findViewById(R.id.board); + + board.setUp(again, home, turn, names); + } + + public void againClick(View view) { + board.resetGame(); + board.invalidate(); + } + + public void homeClick(View view) { + Intent intent = new Intent(this, MainActivity.class); + startActivity(intent); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/tictactoeapplut/ListDataActivity.java b/app/src/main/java/com/example/tictactoeapplut/ListDataActivity.java new file mode 100644 index 0000000..71255c7 --- /dev/null +++ b/app/src/main/java/com/example/tictactoeapplut/ListDataActivity.java @@ -0,0 +1,48 @@ +package com.example.tictactoeapplut; + +import android.database.Cursor; +import android.os.Bundle; +import android.util.Log; +import android.widget.ListView; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import java.util.ArrayList; + +public class ListDataActivity extends AppCompatActivity { + + private static final String TAG = "ListDataActivity"; + + DatabaseHelper mDatabaseHelper; + + private ListView mListView; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.list_layout); + mListView = (ListView) findViewById(R.id.listView); + mDatabaseHelper = new DatabaseHelper(this); + + populateListView(); + } + + private void populateListView() { + Log.d(TAG, "populateListView: Displaying data in the ListView."); + + Cursor data = mDatabaseHelper.getData(); + ArrayList listPlayers = new ArrayList<>(); + ArrayList listWinner = new ArrayList<>(); + ArrayList listTime = new ArrayList<>(); + while(data.moveToNext()){ + + listPlayers.add(data.getString(1)); + listWinner.add(data.getString(2)); + listTime.add(data.getString(3)); + } + CustomAdapter adapter = new CustomAdapter(this, listPlayers, listWinner, listTime); + mListView.setAdapter(adapter); + } +} diff --git a/app/src/main/java/com/example/tictactoeapplut/MainActivity.java b/app/src/main/java/com/example/tictactoeapplut/MainActivity.java new file mode 100644 index 0000000..7c0df8a --- /dev/null +++ b/app/src/main/java/com/example/tictactoeapplut/MainActivity.java @@ -0,0 +1,50 @@ +package com.example.tictactoeapplut; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.TextView; + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + TextView description = (TextView) findViewById(R.id.textView2); + TextView link = (TextView) findViewById(R.id.textView3); + description.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Uri lut = Uri.parse((String)"https://www.lut.fi/en"); + Intent toLUT = new Intent(Intent.ACTION_VIEW, lut); + if (toLUT.resolveActivity(getPackageManager()) != null) { + startActivity(toLUT); + } + } + }); + link.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Uri github = Uri.parse((String)"https://github.com/AndrewTrieu/tictactoeapp"); + Intent toGitHub = new Intent(Intent.ACTION_VIEW, github); + if (toGitHub.resolveActivity(getPackageManager()) != null) { + startActivity(toGitHub); + } + } + }); + } + + public void startClick(View view){ + Intent intent = new Intent(this, Prepare.class); + startActivity(intent); + } + public void recordClick(View view){ + Intent intent = new Intent(this, ListDataActivity.class); + startActivity(intent); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/tictactoeapplut/Move.java b/app/src/main/java/com/example/tictactoeapplut/Move.java new file mode 100644 index 0000000..f50c197 --- /dev/null +++ b/app/src/main/java/com/example/tictactoeapplut/Move.java @@ -0,0 +1,147 @@ +package com.example.tictactoeapplut; + +import android.content.Context; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.Date; + + +public class Move { + private int[][] board; + private String[] names = {"Player 1", "Player 2"}; + private int[] winType = {-1, -1, -1}; + private Button again; + private Button home; + private TextView turn; + private int player = 1; + private static final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd.MM.yyyy"); + + DatabaseHelper databaseHelper; + + Move(Context context) { + databaseHelper = new DatabaseHelper(context); + board = new int[3][3]; + for (int r=0; r<3; r++) { + for (int c=0; c<3; c++) { + board[r][c] = 0; + } + } + } + + public boolean updateBoard(int row, int column) { + if (board[row-1][column-1]==0) { + board[row-1][column-1] = player; + if (player == 1) { + turn.setText((String)(names[1]+"'s turn")); + } else { + turn.setText((String)(names[0]+"'s turn")); + } + return true; + } else { + return false; + } + } + + public boolean winCheck() { + boolean won = false; + + for (int r = 0; r < 3; r++) { + if (board[r][0] == board[r][1] && board[r][0] == board[r][2] && board[r][0] != 0) { + winType = new int[] {r, 0, 1}; + won = true; + break; + } + } + for (int c = 0; c < 3; c++) { + if (board[0][c] == board[1][c] && board[0][c] == board[2][c] && board[0][c] != 0) { + winType = new int[] {0, c, 2}; + won = true; + break; + } + } + if (board[0][0]==board[1][1] && board[0][0]==board[2][2] && board[0][0]!=0) { + winType = new int[] {0, 2, 3}; + won = true; + } + if (board[2][0]==board[1][1] && board[2][0]==board[0][2] && board[2][0]!=0) { + winType = new int[] {2, 2, 4}; + won = true; + } + + int boardFilled = 0; + for (int r=0; r<3; r++) { + for (int c=0; c<3; c++) { + if (board[r][c]!=0){ + boardFilled+=1; + } + } + } + + if (won) { + again.setVisibility(View.VISIBLE); + home.setVisibility(View.VISIBLE); + turn.setText((String)(names[player-1]+" won!")); + Timestamp timestamp = new Timestamp(System.currentTimeMillis()); + databaseHelper.addData(names[0]+" vs "+names[1], names[player-1], sdf.format(timestamp)); + return true; + } else if(boardFilled==9){ + again.setVisibility(View.VISIBLE); + home.setVisibility(View.VISIBLE); + turn.setText((String)("Tie game!")); + Timestamp timestamp = new Timestamp(System.currentTimeMillis()); + databaseHelper.addData(names[0]+" vs "+names[1], "Tie", sdf.format(timestamp)); + return false; + } else { + return false; + } + } + + public void resetBoard() { + for (int r=0; r<3; r++) { + for (int c=0; c<3; c++) { + board[r][c] = 0; + } + } + player = 1; + again.setVisibility(View.GONE); + home.setVisibility(View.GONE); + turn.setText((String)(names[0]+"'s turn")); + } + + public void setAgain(Button again) { + this.again = again; + } + + public void setHome(Button home) { + this.home = home; + } + + public void setTurn(TextView turn) { + this.turn = turn; + } + + public void setNames(String[] names) { + this.names = names; + } + + public int[][] getBoard() { + return board; + } + + public void setPlayer(int player) { + this.player = player; + } + + public int getPlayer() { + return player; + } + + public int[] getWinType() { + return winType; + } + +} diff --git a/app/src/main/java/com/example/tictactoeapplut/Prepare.java b/app/src/main/java/com/example/tictactoeapplut/Prepare.java new file mode 100644 index 0000000..30b6f4f --- /dev/null +++ b/app/src/main/java/com/example/tictactoeapplut/Prepare.java @@ -0,0 +1,29 @@ +package com.example.tictactoeapplut; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.EditText; + +public class Prepare extends AppCompatActivity { + private EditText player1; + private EditText player2; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_prepare); + player1 = findViewById(R.id.editTextTextPersonName4); + player2 = findViewById(R.id.editTextTextPersonName3); + } + public void playClick(View view) { + String player1Name = player1.getText().toString(); + String player2Name = player2.getText().toString(); + + Intent intent = new Intent(this, Game.class); + intent.putExtra("PLAYERS", new String[] {player1Name, player2Name}); + startActivity(intent); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/blue.xml b/app/src/main/res/drawable/blue.xml new file mode 100644 index 0000000..ce9dce5 --- /dev/null +++ b/app/src/main/res/drawable/blue.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button.xml b/app/src/main/res/drawable/button.xml new file mode 100644 index 0000000..3c3a6f6 --- /dev/null +++ b/app/src/main/res/drawable/button.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file 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 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/logo.png b/app/src/main/res/drawable/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2291f6d2361a72bac37822da87e796c019de9a76 GIT binary patch literal 39390 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�vO;Rf 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 Rz)VBn!?v>7TDHYK_P=5x^8o+= literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/red.xml b/app/src/main/res/drawable/red.xml new file mode 100644 index 0000000..dc7b941 --- /dev/null +++ b/app/src/main/res/drawable/red.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/yellow.xml b/app/src/main/res/drawable/yellow.xml new file mode 100644 index 0000000..e48d6ba --- /dev/null +++ b/app/src/main/res/drawable/yellow.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_game.xml b/app/src/main/res/layout/activity_game.xml new file mode 100644 index 0000000..67ca370 --- /dev/null +++ b/app/src/main/res/layout/activity_game.xml @@ -0,0 +1,75 @@ + + + + + + + +