From d9d598b02159788278d01c5807a4568b3d177ac1 Mon Sep 17 00:00:00 2001 From: Sebastian Seedorf Date: Sun, 6 Dec 2020 20:17:19 +0100 Subject: [PATCH] Initial commit --- .gitignore | 9 + Mental Arithmetic.iml | 19 + app/.gitignore | 1 + app/app.iml | 199 +++++++++ app/build.gradle | 43 ++ app/proguard-rules.pro | 21 + .../ExampleInstrumentedTest.kt | 24 ++ app/src/main/AndroidManifest.xml | 21 + app/src/main/ic_launcher-web.png | Bin 0 -> 36978 bytes .../de/sebse/mentalarithmetic/MainActivity.kt | 100 +++++ .../fragments/SummaryFragment.kt | 96 +++++ .../fragments/TaskFragment.kt | 261 ++++++++++++ .../fragments/TaskItemAdapter.kt | 144 +++++++ .../fragments/TaskItemFragment.kt | 86 ++++ .../fragments/TaskPagerAdapter.kt | 15 + .../fragments/TaskPagerFragment.kt | 50 +++ .../mentalarithmetic/fragments/TipFragment.kt | 83 ++++ .../mentalarithmetic/types/Categories.kt | 7 + .../mentalarithmetic/types/ItemFactory.kt | 72 ++++ .../mentalarithmetic/types/ItemObject.kt | 12 + .../mentalarithmetic/types/Preferences.kt | 56 +++ .../sebse/mentalarithmetic/types/Question.kt | 30 ++ .../mentalarithmetic/types/TaskObject.kt | 90 ++++ .../mentalarithmetic/types/TaskObjects.kt | 395 ++++++++++++++++++ .../sebse/mentalarithmetic/types/TipObject.kt | 9 + .../mentalarithmetic/types/TipObjects.kt | 43 ++ .../sebse/mentalarithmetic/utils/BoardView.kt | 115 +++++ .../mentalarithmetic/utils/ImageGetter.kt | 24 ++ .../sebse/mentalarithmetic/utils/Keyboard.kt | 76 ++++ .../mentalarithmetic/utils/TagHandler.kt | 84 ++++ .../drawable-v24/ic_launcher_foreground.xml | 34 ++ app/src/main/res/drawable/ic_backspace.xml | 9 + .../res/drawable/ic_launcher_background.xml | 170 ++++++++ .../res/drawable/ic_launcher_foreground.xml | 54 +++ .../main/res/drawable/ic_star_border_gold.xml | 5 + .../res/drawable/ic_star_border_silver.xml | 5 + app/src/main/res/drawable/ic_star_gold.xml | 5 + app/src/main/res/drawable/ic_star_silver.xml | 5 + app/src/main/res/layout/activity_main.xml | 14 + app/src/main/res/layout/fragment_summary.xml | 27 ++ app/src/main/res/layout/fragment_task.xml | 117 ++++++ app/src/main/res/layout/fragment_taskitem.xml | 78 ++++ .../res/layout/fragment_taskitem_list.xml | 13 + .../res/layout/fragment_taskitem_pager.xml | 15 + app/src/main/res/layout/fragment_tip.xml | 17 + app/src/main/res/layout/fragment_tipitem.xml | 29 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3383 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5330 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2077 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3246 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4734 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7515 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7467 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11963 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10305 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 16752 bytes app/src/main/res/values/attrs.xml | 10 + app/src/main/res/values/colors.xml | 10 + app/src/main/res/values/dimens.xml | 4 + .../res/values/ic_launcher_background.xml | 4 + app/src/main/res/values/strings.xml | 34 ++ app/src/main/res/values/strings_tasks.xml | 46 ++ app/src/main/res/values/strings_tips.xml | 60 +++ app/src/main/res/values/styles.xml | 15 + app/src/main/res/xml/keyboard_dec7.xml | 18 + app/src/main/res/xml/keyboard_dec7_multi.xml | 23 + app/src/main/res/xml/keyboard_decimal.xml | 23 + .../main/res/xml/keyboard_decimal_multi.xml | 23 + app/src/main/res/xml/keyboard_odd.xml | 7 + app/src/main/res/xml/keyboard_yes_no.xml | 7 + .../sebse/mentalarithmetic/ExampleUnitTest.kt | 17 + build.gradle | 28 ++ data/brain.png | Bin 0 -> 22378 bytes data/brain.svg | 119 ++++++ data/data.txt | 2 + gradle.properties | 21 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 ++++++++ gradlew.bat | 84 ++++ settings.gradle | 2 + 83 files changed, 3527 insertions(+) create mode 100644 .gitignore create mode 100644 Mental Arithmetic.iml create mode 100644 app/.gitignore create mode 100644 app/app.iml create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/de/sebse/mentalarithmetic/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-web.png create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/MainActivity.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/fragments/SummaryFragment.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/fragments/TaskFragment.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/fragments/TaskItemAdapter.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/fragments/TaskItemFragment.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/fragments/TaskPagerAdapter.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/fragments/TaskPagerFragment.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/fragments/TipFragment.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/types/Categories.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/types/ItemFactory.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/types/ItemObject.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/types/Preferences.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/types/Question.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/types/TaskObject.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/types/TaskObjects.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/types/TipObject.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/types/TipObjects.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/utils/BoardView.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/utils/ImageGetter.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/utils/Keyboard.kt create mode 100644 app/src/main/java/de/sebse/mentalarithmetic/utils/TagHandler.kt create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_backspace.xml 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/drawable/ic_star_border_gold.xml create mode 100644 app/src/main/res/drawable/ic_star_border_silver.xml create mode 100644 app/src/main/res/drawable/ic_star_gold.xml create mode 100644 app/src/main/res/drawable/ic_star_silver.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/fragment_summary.xml create mode 100644 app/src/main/res/layout/fragment_task.xml create mode 100644 app/src/main/res/layout/fragment_taskitem.xml create mode 100644 app/src/main/res/layout/fragment_taskitem_list.xml create mode 100644 app/src/main/res/layout/fragment_taskitem_pager.xml create mode 100644 app/src/main/res/layout/fragment_tip.xml create mode 100644 app/src/main/res/layout/fragment_tipitem.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.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_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_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_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_round.png 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/strings_tasks.xml create mode 100644 app/src/main/res/values/strings_tips.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/xml/keyboard_dec7.xml create mode 100644 app/src/main/res/xml/keyboard_dec7_multi.xml create mode 100644 app/src/main/res/xml/keyboard_decimal.xml create mode 100644 app/src/main/res/xml/keyboard_decimal_multi.xml create mode 100644 app/src/main/res/xml/keyboard_odd.xml create mode 100644 app/src/main/res/xml/keyboard_yes_no.xml create mode 100644 app/src/test/java/de/sebse/mentalarithmetic/ExampleUnitTest.kt create mode 100644 build.gradle create mode 100644 data/brain.png create mode 100644 data/brain.svg create mode 100644 data/data.txt create mode 100644 gradle.properties 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 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7ea113c --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.gradle +/local.properties +/.idea/* +/.idea - PC/* +.DS_Store +/build +/captures +.externalNativeBuild +app/release/* diff --git a/Mental Arithmetic.iml b/Mental Arithmetic.iml new file mode 100644 index 0000000..3ed3487 --- /dev/null +++ b/Mental Arithmetic.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/app.iml b/app/app.iml new file mode 100644 index 0000000..49eb95d --- /dev/null +++ b/app/app.iml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..a615760 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,43 @@ +apply plugin: 'com.android.application' + +apply plugin: 'kotlin-android' + +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion 29 + defaultConfig { + applicationId "de.sebse.mentalarithmetic" + minSdkVersion 15 + targetSdkVersion 29 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.core:core-ktx:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.recyclerview:recyclerview:1.1.0' + implementation "androidx.cardview:cardview:1.0.0" + implementation "androidx.gridlayout:gridlayout:1.0.0" + implementation "androidx.preference:preference:1.1.0" + implementation "androidx.viewpager2:viewpager2:1.0.0" + implementation 'com.google.android.material:material:1.2.0-alpha03' + implementation 'me.zhanghai.android.materialprogressbar:library:1.6.1' + implementation 'me.relex:circleindicator:2.1.4' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /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 diff --git a/app/src/androidTest/java/de/sebse/mentalarithmetic/ExampleInstrumentedTest.kt b/app/src/androidTest/java/de/sebse/mentalarithmetic/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..7f4c5c8 --- /dev/null +++ b/app/src/androidTest/java/de/sebse/mentalarithmetic/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package de.sebse.mentalarithmetic + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("de.sebse.mentalarithmetic", appContext.packageName) + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a172027 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..b77d326c77134b0b0390813bce7c9d6137d08594 GIT binary patch literal 36978 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 literal 0 HcmV?d00001 diff --git a/app/src/main/java/de/sebse/mentalarithmetic/MainActivity.kt b/app/src/main/java/de/sebse/mentalarithmetic/MainActivity.kt new file mode 100644 index 0000000..34d6e2f --- /dev/null +++ b/app/src/main/java/de/sebse/mentalarithmetic/MainActivity.kt @@ -0,0 +1,100 @@ +package de.sebse.mentalarithmetic + +import android.os.Bundle +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentTransaction +import de.sebse.mentalarithmetic.fragments.* +import de.sebse.mentalarithmetic.types.ItemObject +import de.sebse.mentalarithmetic.types.TaskObject +import de.sebse.mentalarithmetic.types.TipObject + + +class MainActivity : AppCompatActivity(), TaskItemFragment.OnListFragmentInteractionListener, + TaskFragment.IGameListener, SummaryFragment.IGameSummaryListener { + + var currentFragment: Fragment? = null + val CURRENT_FRAGMENT_STATE: String = "CURRENT_FRAGMENT_STATE" + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + savedInstanceState?.let { + //Restore the fragment's instance + Log.d("APP", "here1") + val fragment = supportFragmentManager.getFragment(savedInstanceState, CURRENT_FRAGMENT_STATE) + fragment?.let { + Log.d("APP", "here") + val ft: FragmentTransaction = supportFragmentManager.beginTransaction() + ft.replace(R.id.fragment_holder, fragment) + ft.commit() + currentFragment = fragment + return + } + } + + val fragment = TaskPagerFragment.newInstance() + val ft: FragmentTransaction = supportFragmentManager.beginTransaction() + ft.replace(R.id.fragment_holder, fragment) + ft.commit() + currentFragment = fragment + } + + override fun onListFragmentInteraction(item: ItemObject) { + val fragment: Fragment? = if (item is TaskObject) { + item.start(applicationContext) + TaskFragment.newInstance(item) + } else if (item is TipObject) { + TipFragment.newInstance(item) + } else { + null + } + if (fragment != null) { + val ft: FragmentTransaction = supportFragmentManager.beginTransaction() + ft.replace(R.id.fragment_holder, fragment) + ft.commit() + currentFragment = fragment + } + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + currentFragment?.let { supportFragmentManager.putFragment(outState, CURRENT_FRAGMENT_STATE, it) } + } + + override fun onGameFinished(item: TaskObject) { + val fragment = SummaryFragment.newInstance(item) + val ft: FragmentTransaction = supportFragmentManager.beginTransaction() + ft.replace(R.id.fragment_holder, fragment) + ft.commit() + currentFragment = fragment + } + + override fun onGameSummaryRetry(item: TaskObject) { + onListFragmentInteraction(item) + } + + override fun onGameSummaryFinished() { + goToList() + } + + fun goToList() { + val fragment = TaskPagerFragment.newInstance() + val ft: FragmentTransaction = supportFragmentManager.beginTransaction() + ft.replace(R.id.fragment_holder, fragment) + ft.commit() + currentFragment = fragment + } + + override fun onBackPressed() { + if (currentFragment is TaskPagerFragment) { + if (!(currentFragment as TaskPagerFragment).previous()) { + super.onBackPressed() + } + } else { + goToList() + } + } +} diff --git a/app/src/main/java/de/sebse/mentalarithmetic/fragments/SummaryFragment.kt b/app/src/main/java/de/sebse/mentalarithmetic/fragments/SummaryFragment.kt new file mode 100644 index 0000000..c83693f --- /dev/null +++ b/app/src/main/java/de/sebse/mentalarithmetic/fragments/SummaryFragment.kt @@ -0,0 +1,96 @@ +package de.sebse.mentalarithmetic.fragments + + +/*import android.inputmethodservice.Keyboard +import android.inputmethodservice.KeyboardView +import android.inputmethodservice.KeyboardView.OnKeyboardActionListener*/ +import android.content.Context +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.TextView +import androidx.fragment.app.Fragment +import de.sebse.mentalarithmetic.R +import de.sebse.mentalarithmetic.types.ItemFactory +import de.sebse.mentalarithmetic.types.TaskObject + + +/** + * A simple [Fragment] subclass. + * Use the [SummaryFragment.newInstance] factory method to + * create an instance of this fragment. + */ +class SummaryFragment : Fragment() { + private lateinit var listener: IGameSummaryListener + private var item: TaskObject? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + Log.d("SummaryFragment", (savedInstanceState != null).toString()) + arguments?.let { + val param1 = it.getString(ARG_PARAM1) + item = ItemFactory.ITEM_MAP[param1] as TaskObject + } + savedInstanceState?.let { + val param1 = it.getString(ARG_PARAM1) + item = ItemFactory.ITEM_MAP[param1] as TaskObject + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_summary, container, false)?.also { view -> + view.findViewById