101
									
								
								frontend/allowance-planner-v2/android/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,101 @@ | ||||
| # Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore | ||||
|  | ||||
| # Built application files | ||||
| *.apk | ||||
| *.aar | ||||
| *.ap_ | ||||
| *.aab | ||||
|  | ||||
| # Files for the ART/Dalvik VM | ||||
| *.dex | ||||
|  | ||||
| # Java class files | ||||
| *.class | ||||
|  | ||||
| # Generated files | ||||
| bin/ | ||||
| gen/ | ||||
| out/ | ||||
| #  Uncomment the following line in case you need and you don't have the release build type files in your app | ||||
| # release/ | ||||
|  | ||||
| # Gradle files | ||||
| .gradle/ | ||||
| build/ | ||||
|  | ||||
| # Local configuration file (sdk path, etc) | ||||
| local.properties | ||||
|  | ||||
| # Proguard folder generated by Eclipse | ||||
| proguard/ | ||||
|  | ||||
| # Log Files | ||||
| *.log | ||||
|  | ||||
| # Android Studio Navigation editor temp files | ||||
| .navigation/ | ||||
|  | ||||
| # Android Studio captures folder | ||||
| captures/ | ||||
|  | ||||
| # IntelliJ | ||||
| *.iml | ||||
| .idea/workspace.xml | ||||
| .idea/tasks.xml | ||||
| .idea/gradle.xml | ||||
| .idea/assetWizardSettings.xml | ||||
| .idea/dictionaries | ||||
| .idea/libraries | ||||
| # Android Studio 3 in .gitignore file. | ||||
| .idea/caches | ||||
| .idea/modules.xml | ||||
| # Comment next line if keeping position of elements in Navigation Editor is relevant for you | ||||
| .idea/navEditor.xml | ||||
|  | ||||
| # Keystore files | ||||
| # Uncomment the following lines if you do not want to check your keystore files in. | ||||
| #*.jks | ||||
| #*.keystore | ||||
|  | ||||
| # External native build folder generated in Android Studio 2.2 and later | ||||
| .externalNativeBuild | ||||
| .cxx/ | ||||
|  | ||||
| # Google Services (e.g. APIs or Firebase) | ||||
| # google-services.json | ||||
|  | ||||
| # Freeline | ||||
| freeline.py | ||||
| freeline/ | ||||
| freeline_project_description.json | ||||
|  | ||||
| # fastlane | ||||
| fastlane/report.xml | ||||
| fastlane/Preview.html | ||||
| fastlane/screenshots | ||||
| fastlane/test_output | ||||
| fastlane/readme.md | ||||
|  | ||||
| # Version control | ||||
| vcs.xml | ||||
|  | ||||
| # lint | ||||
| lint/intermediates/ | ||||
| lint/generated/ | ||||
| lint/outputs/ | ||||
| lint/tmp/ | ||||
| # lint/reports/ | ||||
|  | ||||
| # Android Profiling | ||||
| *.hprof | ||||
|  | ||||
| # Cordova plugins for Capacitor | ||||
| capacitor-cordova-android-plugins | ||||
|  | ||||
| # Copied web assets | ||||
| app/src/main/assets/public | ||||
|  | ||||
| # Generated Config files | ||||
| app/src/main/assets/capacitor.config.json | ||||
| app/src/main/assets/capacitor.plugins.json | ||||
| app/src/main/res/xml/config.xml | ||||
							
								
								
									
										2
									
								
								frontend/allowance-planner-v2/android/app/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,2 @@ | ||||
| /build/* | ||||
| !/build/.npmkeep | ||||
							
								
								
									
										54
									
								
								frontend/allowance-planner-v2/android/app/build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,54 @@ | ||||
| apply plugin: 'com.android.application' | ||||
|  | ||||
| android { | ||||
|     namespace "io.ionic.starter" | ||||
|     compileSdk rootProject.ext.compileSdkVersion | ||||
|     defaultConfig { | ||||
|         applicationId "io.ionic.starter" | ||||
|         minSdkVersion rootProject.ext.minSdkVersion | ||||
|         targetSdkVersion rootProject.ext.targetSdkVersion | ||||
|         versionCode 1 | ||||
|         versionName "1.0" | ||||
|         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | ||||
|         aaptOptions { | ||||
|              // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. | ||||
|              // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61 | ||||
|             ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' | ||||
|         } | ||||
|     } | ||||
|     buildTypes { | ||||
|         release { | ||||
|             minifyEnabled false | ||||
|             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| repositories { | ||||
|     flatDir{ | ||||
|         dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' | ||||
|     } | ||||
| } | ||||
|  | ||||
| dependencies { | ||||
|     implementation fileTree(include: ['*.jar'], dir: 'libs') | ||||
|     implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" | ||||
|     implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" | ||||
|     implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion" | ||||
|     implementation project(':capacitor-android') | ||||
|     testImplementation "junit:junit:$junitVersion" | ||||
|     androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" | ||||
|     androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" | ||||
|     implementation project(':capacitor-cordova-android-plugins') | ||||
| } | ||||
|  | ||||
| apply from: 'capacitor.build.gradle' | ||||
|  | ||||
| try { | ||||
|     def servicesJSON = file('google-services.json') | ||||
|     if (servicesJSON.text) { | ||||
|         apply plugin: 'com.google.gms.google-services' | ||||
|     } | ||||
| } catch(Exception e) { | ||||
|     logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work") | ||||
| } | ||||
| @@ -0,0 +1,22 @@ | ||||
| // DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN | ||||
|  | ||||
| android { | ||||
|   compileOptions { | ||||
|       sourceCompatibility JavaVersion.VERSION_21 | ||||
|       targetCompatibility JavaVersion.VERSION_21 | ||||
|   } | ||||
| } | ||||
|  | ||||
| apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" | ||||
| dependencies { | ||||
|     implementation project(':capacitor-app') | ||||
|     implementation project(':capacitor-haptics') | ||||
|     implementation project(':capacitor-keyboard') | ||||
|     implementation project(':capacitor-status-bar') | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| if (hasProperty('postBuildExtras')) { | ||||
|   postBuildExtras() | ||||
| } | ||||
							
								
								
									
										21
									
								
								frontend/allowance-planner-v2/android/app/proguard-rules.pro
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -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 | ||||
| @@ -0,0 +1,26 @@ | ||||
| package com.getcapacitor.myapp; | ||||
|  | ||||
| import static org.junit.Assert.*; | ||||
|  | ||||
| import android.content.Context; | ||||
| import androidx.test.ext.junit.runners.AndroidJUnit4; | ||||
| import androidx.test.platform.app.InstrumentationRegistry; | ||||
| import org.junit.Test; | ||||
| import org.junit.runner.RunWith; | ||||
|  | ||||
| /** | ||||
|  * Instrumented test, which will execute on an Android device. | ||||
|  * | ||||
|  * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> | ||||
|  */ | ||||
| @RunWith(AndroidJUnit4.class) | ||||
| public class ExampleInstrumentedTest { | ||||
|  | ||||
|     @Test | ||||
|     public void useAppContext() throws Exception { | ||||
|         // Context of the app under test. | ||||
|         Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); | ||||
|  | ||||
|         assertEquals("com.getcapacitor.app", appContext.getPackageName()); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,41 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|  | ||||
|     <application | ||||
|         android:allowBackup="true" | ||||
|         android:icon="@mipmap/ic_launcher" | ||||
|         android:label="@string/app_name" | ||||
|         android:roundIcon="@mipmap/ic_launcher_round" | ||||
|         android:supportsRtl="true" | ||||
|         android:theme="@style/AppTheme"> | ||||
|  | ||||
|         <activity | ||||
|             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation" | ||||
|             android:name=".MainActivity" | ||||
|             android:label="@string/title_activity_main" | ||||
|             android:theme="@style/AppTheme.NoActionBarLaunch" | ||||
|             android:launchMode="singleTask" | ||||
|             android:exported="true"> | ||||
|  | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.MAIN" /> | ||||
|                 <category android:name="android.intent.category.LAUNCHER" /> | ||||
|             </intent-filter> | ||||
|  | ||||
|         </activity> | ||||
|  | ||||
|         <provider | ||||
|             android:name="androidx.core.content.FileProvider" | ||||
|             android:authorities="${applicationId}.fileprovider" | ||||
|             android:exported="false" | ||||
|             android:grantUriPermissions="true"> | ||||
|             <meta-data | ||||
|                 android:name="android.support.FILE_PROVIDER_PATHS" | ||||
|                 android:resource="@xml/file_paths"></meta-data> | ||||
|         </provider> | ||||
|     </application> | ||||
|  | ||||
|     <!-- Permissions --> | ||||
|  | ||||
|     <uses-permission android:name="android.permission.INTERNET" /> | ||||
| </manifest> | ||||
| @@ -0,0 +1,5 @@ | ||||
| package io.ionic.starter; | ||||
|  | ||||
| import com.getcapacitor.BridgeActivity; | ||||
|  | ||||
| public class MainActivity extends BridgeActivity {} | ||||
| After Width: | Height: | Size: 7.5 KiB | 
| After Width: | Height: | Size: 3.9 KiB | 
| After Width: | Height: | Size: 9.0 KiB | 
| After Width: | Height: | Size: 14 KiB | 
| After Width: | Height: | Size: 17 KiB | 
| After Width: | Height: | Size: 7.7 KiB | 
| After Width: | Height: | Size: 4.0 KiB | 
| After Width: | Height: | Size: 9.6 KiB | 
| After Width: | Height: | Size: 13 KiB | 
| After Width: | Height: | Size: 17 KiB | 
| @@ -0,0 +1,34 @@ | ||||
| <vector xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:aapt="http://schemas.android.com/aapt" | ||||
|     android:width="108dp" | ||||
|     android:height="108dp" | ||||
|     android:viewportHeight="108" | ||||
|     android:viewportWidth="108"> | ||||
|     <path | ||||
|         android:fillType="evenOdd" | ||||
|         android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z" | ||||
|         android:strokeColor="#00000000" | ||||
|         android:strokeWidth="1"> | ||||
|         <aapt:attr name="android:fillColor"> | ||||
|             <gradient | ||||
|                 android:endX="78.5885" | ||||
|                 android:endY="90.9159" | ||||
|                 android:startX="48.7653" | ||||
|                 android:startY="61.0927" | ||||
|                 android:type="linear"> | ||||
|                 <item | ||||
|                     android:color="#44000000" | ||||
|                     android:offset="0.0" /> | ||||
|                 <item | ||||
|                     android:color="#00000000" | ||||
|                     android:offset="1.0" /> | ||||
|             </gradient> | ||||
|         </aapt:attr> | ||||
|     </path> | ||||
|     <path | ||||
|         android:fillColor="#FFFFFF" | ||||
|         android:fillType="nonZero" | ||||
|         android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z" | ||||
|         android:strokeColor="#00000000" | ||||
|         android:strokeWidth="1" /> | ||||
| </vector> | ||||
| @@ -0,0 +1,170 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <vector xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:width="108dp" | ||||
|     android:height="108dp" | ||||
|     android:viewportHeight="108" | ||||
|     android:viewportWidth="108"> | ||||
|     <path | ||||
|         android:fillColor="#26A69A" | ||||
|         android:pathData="M0,0h108v108h-108z" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M9,0L9,108" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M19,0L19,108" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M29,0L29,108" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M39,0L39,108" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M49,0L49,108" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M59,0L59,108" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M69,0L69,108" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M79,0L79,108" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M89,0L89,108" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M99,0L99,108" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,9L108,9" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,19L108,19" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,29L108,29" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,39L108,39" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,49L108,49" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,59L108,59" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,69L108,69" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,79L108,79" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,89L108,89" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M0,99L108,99" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M19,29L89,29" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M19,39L89,39" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M19,49L89,49" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M19,59L89,59" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M19,69L89,69" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M19,79L89,79" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M29,19L29,89" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M39,19L39,89" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M49,19L49,89" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M59,19L59,89" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M69,19L69,89" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
|     <path | ||||
|         android:fillColor="#00000000" | ||||
|         android:pathData="M79,19L79,89" | ||||
|         android:strokeColor="#33FFFFFF" | ||||
|         android:strokeWidth="0.8" /> | ||||
| </vector> | ||||
| After Width: | Height: | Size: 3.9 KiB | 
| @@ -0,0 +1,12 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     tools:context=".MainActivity"> | ||||
|  | ||||
|     <WebView | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent" /> | ||||
| </androidx.coordinatorlayout.widget.CoordinatorLayout> | ||||
| @@ -0,0 +1,5 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <background android:drawable="@color/ic_launcher_background"/> | ||||
|     <foreground android:drawable="@mipmap/ic_launcher_foreground"/> | ||||
| </adaptive-icon> | ||||
| @@ -0,0 +1,5 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <background android:drawable="@color/ic_launcher_background"/> | ||||
|     <foreground android:drawable="@mipmap/ic_launcher_foreground"/> | ||||
| </adaptive-icon> | ||||
| After Width: | Height: | Size: 2.7 KiB | 
| After Width: | Height: | Size: 3.4 KiB | 
| After Width: | Height: | Size: 4.2 KiB | 
| After Width: | Height: | Size: 1.8 KiB | 
| After Width: | Height: | Size: 2.1 KiB | 
| After Width: | Height: | Size: 2.7 KiB | 
| After Width: | Height: | Size: 3.9 KiB | 
| After Width: | Height: | Size: 4.9 KiB | 
| After Width: | Height: | Size: 6.4 KiB | 
| After Width: | Height: | Size: 6.5 KiB | 
| After Width: | Height: | Size: 9.6 KiB | 
| After Width: | Height: | Size: 10 KiB | 
| After Width: | Height: | Size: 9.2 KiB | 
| After Width: | Height: | Size: 15 KiB | 
| After Width: | Height: | Size: 16 KiB | 
| @@ -0,0 +1,4 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <resources> | ||||
|     <color name="ic_launcher_background">#FFFFFF</color> | ||||
| </resources> | ||||
| @@ -0,0 +1,7 @@ | ||||
| <?xml version='1.0' encoding='utf-8'?> | ||||
| <resources> | ||||
|     <string name="app_name">allowance-planner-v2</string> | ||||
|     <string name="title_activity_main">allowance-planner-v2</string> | ||||
|     <string name="package_name">io.ionic.starter</string> | ||||
|     <string name="custom_url_scheme">io.ionic.starter</string> | ||||
| </resources> | ||||
| @@ -0,0 +1,22 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <resources> | ||||
|  | ||||
|     <!-- Base application theme. --> | ||||
|     <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> | ||||
|         <!-- Customize your theme here. --> | ||||
|         <item name="colorPrimary">@color/colorPrimary</item> | ||||
|         <item name="colorPrimaryDark">@color/colorPrimaryDark</item> | ||||
|         <item name="colorAccent">@color/colorAccent</item> | ||||
|     </style> | ||||
|  | ||||
|     <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar"> | ||||
|         <item name="windowActionBar">false</item> | ||||
|         <item name="windowNoTitle">true</item> | ||||
|         <item name="android:background">@null</item> | ||||
|     </style> | ||||
|  | ||||
|  | ||||
|     <style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen"> | ||||
|         <item name="android:background">@drawable/splash</item> | ||||
|     </style> | ||||
| </resources> | ||||
| @@ -0,0 +1,5 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <paths xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <external-path name="my_images" path="." /> | ||||
|     <cache-path name="my_cache_images" path="." /> | ||||
| </paths> | ||||
| @@ -0,0 +1,18 @@ | ||||
| package com.getcapacitor.myapp; | ||||
|  | ||||
| import static org.junit.Assert.*; | ||||
|  | ||||
| import org.junit.Test; | ||||
|  | ||||
| /** | ||||
|  * Example local unit test, which will execute on the development machine (host). | ||||
|  * | ||||
|  * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> | ||||
|  */ | ||||
| public class ExampleUnitTest { | ||||
|  | ||||
|     @Test | ||||
|     public void addition_isCorrect() throws Exception { | ||||
|         assertEquals(4, 2 + 2); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										29
									
								
								frontend/allowance-planner-v2/android/build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,29 @@ | ||||
| // Top-level build file where you can add configuration options common to all sub-projects/modules. | ||||
|  | ||||
| buildscript { | ||||
|      | ||||
|     repositories { | ||||
|         google() | ||||
|         mavenCentral() | ||||
|     } | ||||
|     dependencies { | ||||
|         classpath 'com.android.tools.build:gradle:8.7.2' | ||||
|         classpath 'com.google.gms:google-services:4.4.2' | ||||
|  | ||||
|         // NOTE: Do not place your application dependencies here; they belong | ||||
|         // in the individual module build.gradle files | ||||
|     } | ||||
| } | ||||
|  | ||||
| apply from: "variables.gradle" | ||||
|  | ||||
| allprojects { | ||||
|     repositories { | ||||
|         google() | ||||
|         mavenCentral() | ||||
|     } | ||||
| } | ||||
|  | ||||
| task clean(type: Delete) { | ||||
|     delete rootProject.buildDir | ||||
| } | ||||
| @@ -0,0 +1,15 @@ | ||||
| // DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN | ||||
| include ':capacitor-android' | ||||
| project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') | ||||
|  | ||||
| include ':capacitor-app' | ||||
| project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android') | ||||
|  | ||||
| include ':capacitor-haptics' | ||||
| project(':capacitor-haptics').projectDir = new File('../node_modules/@capacitor/haptics/android') | ||||
|  | ||||
| include ':capacitor-keyboard' | ||||
| project(':capacitor-keyboard').projectDir = new File('../node_modules/@capacitor/keyboard/android') | ||||
|  | ||||
| include ':capacitor-status-bar' | ||||
| project(':capacitor-status-bar').projectDir = new File('../node_modules/@capacitor/status-bar/android') | ||||
							
								
								
									
										22
									
								
								frontend/allowance-planner-v2/android/gradle.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,22 @@ | ||||
| # Project-wide Gradle settings. | ||||
|  | ||||
| # IDE (e.g. Android Studio) users: | ||||
| # Gradle settings configured through the IDE *will override* | ||||
| # any settings specified in this file. | ||||
|  | ||||
| # For more details on how to configure your build environment visit | ||||
| # http://www.gradle.org/docs/current/userguide/build_environment.html | ||||
|  | ||||
| # Specifies the JVM arguments used for the daemon process. | ||||
| # The setting is particularly useful for tweaking memory settings. | ||||
| org.gradle.jvmargs=-Xmx1536m | ||||
|  | ||||
| # When configured, Gradle will run in incubating parallel mode. | ||||
| # This option should only be used with decoupled projects. More details, visit | ||||
| # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects | ||||
| # org.gradle.parallel=true | ||||
|  | ||||
| # AndroidX package structure to make it clearer which packages are bundled with the | ||||
| # Android operating system, and which are packaged with your app's APK | ||||
| # https://developer.android.com/topic/libraries/support-library/androidx-rn | ||||
| android.useAndroidX=true | ||||
							
								
								
									
										
											BIN
										
									
								
								frontend/allowance-planner-v2/android/gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										7
									
								
								frontend/allowance-planner-v2/android/gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | ||||
| distributionBase=GRADLE_USER_HOME | ||||
| distributionPath=wrapper/dists | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip | ||||
| networkTimeout=10000 | ||||
| validateDistributionUrl=true | ||||
| zipStoreBase=GRADLE_USER_HOME | ||||
| zipStorePath=wrapper/dists | ||||
							
								
								
									
										252
									
								
								frontend/allowance-planner-v2/android/gradlew
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,252 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| # | ||||
| # Copyright © 2015-2021 the original authors. | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| # you may not use this file except in compliance with the License. | ||||
| # You may obtain a copy of the License at | ||||
| # | ||||
| #      https://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
| # | ||||
| # SPDX-License-Identifier: Apache-2.0 | ||||
| # | ||||
|  | ||||
| ############################################################################## | ||||
| # | ||||
| #   Gradle start up script for POSIX generated by Gradle. | ||||
| # | ||||
| #   Important for running: | ||||
| # | ||||
| #   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is | ||||
| #       noncompliant, but you have some other compliant shell such as ksh or | ||||
| #       bash, then to run this script, type that shell name before the whole | ||||
| #       command line, like: | ||||
| # | ||||
| #           ksh Gradle | ||||
| # | ||||
| #       Busybox and similar reduced shells will NOT work, because this script | ||||
| #       requires all of these POSIX shell features: | ||||
| #         * functions; | ||||
| #         * expansions «$var», «${var}», «${var:-default}», «${var+SET}», | ||||
| #           «${var#prefix}», «${var%suffix}», and «$( cmd )»; | ||||
| #         * compound commands having a testable exit status, especially «case»; | ||||
| #         * various built-in commands including «command», «set», and «ulimit». | ||||
| # | ||||
| #   Important for patching: | ||||
| # | ||||
| #   (2) This script targets any POSIX shell, so it avoids extensions provided | ||||
| #       by Bash, Ksh, etc; in particular arrays are avoided. | ||||
| # | ||||
| #       The "traditional" practice of packing multiple parameters into a | ||||
| #       space-separated string is a well documented source of bugs and security | ||||
| #       problems, so this is (mostly) avoided, by progressively accumulating | ||||
| #       options in "$@", and eventually passing that to Java. | ||||
| # | ||||
| #       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, | ||||
| #       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; | ||||
| #       see the in-line comments for details. | ||||
| # | ||||
| #       There are tweaks for specific operating systems such as AIX, CygWin, | ||||
| #       Darwin, MinGW, and NonStop. | ||||
| # | ||||
| #   (3) This script is generated from the Groovy template | ||||
| #       https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt | ||||
| #       within the Gradle project. | ||||
| # | ||||
| #       You can find Gradle at https://github.com/gradle/gradle/. | ||||
| # | ||||
| ############################################################################## | ||||
|  | ||||
| # Attempt to set APP_HOME | ||||
|  | ||||
| # Resolve links: $0 may be a link | ||||
| app_path=$0 | ||||
|  | ||||
| # Need this for daisy-chained symlinks. | ||||
| while | ||||
|     APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path | ||||
|     [ -h "$app_path" ] | ||||
| do | ||||
|     ls=$( ls -ld "$app_path" ) | ||||
|     link=${ls#*' -> '} | ||||
|     case $link in             #( | ||||
|       /*)   app_path=$link ;; #( | ||||
|       *)    app_path=$APP_HOME$link ;; | ||||
|     esac | ||||
| done | ||||
|  | ||||
| # This is normally unused | ||||
| # shellcheck disable=SC2034 | ||||
| APP_BASE_NAME=${0##*/} | ||||
| # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) | ||||
| APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s | ||||
| ' "$PWD" ) || exit | ||||
|  | ||||
| # Use the maximum available, or set MAX_FD != -1 to use that value. | ||||
| MAX_FD=maximum | ||||
|  | ||||
| warn () { | ||||
|     echo "$*" | ||||
| } >&2 | ||||
|  | ||||
| die () { | ||||
|     echo | ||||
|     echo "$*" | ||||
|     echo | ||||
|     exit 1 | ||||
| } >&2 | ||||
|  | ||||
| # OS specific support (must be 'true' or 'false'). | ||||
| cygwin=false | ||||
| msys=false | ||||
| darwin=false | ||||
| nonstop=false | ||||
| case "$( uname )" in                #( | ||||
|   CYGWIN* )         cygwin=true  ;; #( | ||||
|   Darwin* )         darwin=true  ;; #( | ||||
|   MSYS* | MINGW* )  msys=true    ;; #( | ||||
|   NONSTOP* )        nonstop=true ;; | ||||
| esac | ||||
|  | ||||
| CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar | ||||
|  | ||||
|  | ||||
| # Determine the Java command to use to start the JVM. | ||||
| if [ -n "$JAVA_HOME" ] ; then | ||||
|     if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | ||||
|         # IBM's JDK on AIX uses strange locations for the executables | ||||
|         JAVACMD=$JAVA_HOME/jre/sh/java | ||||
|     else | ||||
|         JAVACMD=$JAVA_HOME/bin/java | ||||
|     fi | ||||
|     if [ ! -x "$JAVACMD" ] ; then | ||||
|         die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME | ||||
|  | ||||
| Please set the JAVA_HOME variable in your environment to match the | ||||
| location of your Java installation." | ||||
|     fi | ||||
| else | ||||
|     JAVACMD=java | ||||
|     if ! command -v java >/dev/null 2>&1 | ||||
|     then | ||||
|         die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||
|  | ||||
| Please set the JAVA_HOME variable in your environment to match the | ||||
| location of your Java installation." | ||||
|     fi | ||||
| fi | ||||
|  | ||||
| # Increase the maximum file descriptors if we can. | ||||
| if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then | ||||
|     case $MAX_FD in #( | ||||
|       max*) | ||||
|         # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. | ||||
|         # shellcheck disable=SC2039,SC3045 | ||||
|         MAX_FD=$( ulimit -H -n ) || | ||||
|             warn "Could not query maximum file descriptor limit" | ||||
|     esac | ||||
|     case $MAX_FD in  #( | ||||
|       '' | soft) :;; #( | ||||
|       *) | ||||
|         # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. | ||||
|         # shellcheck disable=SC2039,SC3045 | ||||
|         ulimit -n "$MAX_FD" || | ||||
|             warn "Could not set maximum file descriptor limit to $MAX_FD" | ||||
|     esac | ||||
| fi | ||||
|  | ||||
| # Collect all arguments for the java command, stacking in reverse order: | ||||
| #   * args from the command line | ||||
| #   * the main class name | ||||
| #   * -classpath | ||||
| #   * -D...appname settings | ||||
| #   * --module-path (only if needed) | ||||
| #   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. | ||||
|  | ||||
| # For Cygwin or MSYS, switch paths to Windows format before running java | ||||
| if "$cygwin" || "$msys" ; then | ||||
|     APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) | ||||
|     CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) | ||||
|  | ||||
|     JAVACMD=$( cygpath --unix "$JAVACMD" ) | ||||
|  | ||||
|     # Now convert the arguments - kludge to limit ourselves to /bin/sh | ||||
|     for arg do | ||||
|         if | ||||
|             case $arg in                                #( | ||||
|               -*)   false ;;                            # don't mess with options #( | ||||
|               /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath | ||||
|                     [ -e "$t" ] ;;                      #( | ||||
|               *)    false ;; | ||||
|             esac | ||||
|         then | ||||
|             arg=$( cygpath --path --ignore --mixed "$arg" ) | ||||
|         fi | ||||
|         # Roll the args list around exactly as many times as the number of | ||||
|         # args, so each arg winds up back in the position where it started, but | ||||
|         # possibly modified. | ||||
|         # | ||||
|         # NB: a `for` loop captures its iteration list before it begins, so | ||||
|         # changing the positional parameters here affects neither the number of | ||||
|         # iterations, nor the values presented in `arg`. | ||||
|         shift                   # remove old arg | ||||
|         set -- "$@" "$arg"      # push replacement arg | ||||
|     done | ||||
| fi | ||||
|  | ||||
|  | ||||
| # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||
| DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | ||||
|  | ||||
| # Collect all arguments for the java command: | ||||
| #   * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, | ||||
| #     and any embedded shellness will be escaped. | ||||
| #   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be | ||||
| #     treated as '${Hostname}' itself on the command line. | ||||
|  | ||||
| set -- \ | ||||
|         "-Dorg.gradle.appname=$APP_BASE_NAME" \ | ||||
|         -classpath "$CLASSPATH" \ | ||||
|         org.gradle.wrapper.GradleWrapperMain \ | ||||
|         "$@" | ||||
|  | ||||
| # Stop when "xargs" is not available. | ||||
| if ! command -v xargs >/dev/null 2>&1 | ||||
| then | ||||
|     die "xargs is not available" | ||||
| fi | ||||
|  | ||||
| # Use "xargs" to parse quoted args. | ||||
| # | ||||
| # With -n1 it outputs one arg per line, with the quotes and backslashes removed. | ||||
| # | ||||
| # In Bash we could simply go: | ||||
| # | ||||
| #   readarray ARGS < <( xargs -n1 <<<"$var" ) && | ||||
| #   set -- "${ARGS[@]}" "$@" | ||||
| # | ||||
| # but POSIX shell has neither arrays nor command substitution, so instead we | ||||
| # post-process each arg (as a line of input to sed) to backslash-escape any | ||||
| # character that might be a shell metacharacter, then use eval to reverse | ||||
| # that process (while maintaining the separation between arguments), and wrap | ||||
| # the whole thing up as a single "set" statement. | ||||
| # | ||||
| # This will of course break if any of these variables contains a newline or | ||||
| # an unmatched quote. | ||||
| # | ||||
|  | ||||
| eval "set -- $( | ||||
|         printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | | ||||
|         xargs -n1 | | ||||
|         sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | | ||||
|         tr '\n' ' ' | ||||
|     )" '"$@"' | ||||
|  | ||||
| exec "$JAVACMD" "$@" | ||||
							
								
								
									
										94
									
								
								frontend/allowance-planner-v2/android/gradlew.bat
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,94 @@ | ||||
| @rem | ||||
| @rem Copyright 2015 the original author or authors. | ||||
| @rem | ||||
| @rem Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| @rem you may not use this file except in compliance with the License. | ||||
| @rem You may obtain a copy of the License at | ||||
| @rem | ||||
| @rem      https://www.apache.org/licenses/LICENSE-2.0 | ||||
| @rem | ||||
| @rem Unless required by applicable law or agreed to in writing, software | ||||
| @rem distributed under the License is distributed on an "AS IS" BASIS, | ||||
| @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| @rem See the License for the specific language governing permissions and | ||||
| @rem limitations under the License. | ||||
| @rem | ||||
| @rem SPDX-License-Identifier: Apache-2.0 | ||||
| @rem | ||||
|  | ||||
| @if "%DEBUG%"=="" @echo off | ||||
| @rem ########################################################################## | ||||
| @rem | ||||
| @rem  Gradle startup script for Windows | ||||
| @rem | ||||
| @rem ########################################################################## | ||||
|  | ||||
| @rem Set local scope for the variables with windows NT shell | ||||
| if "%OS%"=="Windows_NT" setlocal | ||||
|  | ||||
| set DIRNAME=%~dp0 | ||||
| if "%DIRNAME%"=="" set DIRNAME=. | ||||
| @rem This is normally unused | ||||
| set APP_BASE_NAME=%~n0 | ||||
| set APP_HOME=%DIRNAME% | ||||
|  | ||||
| @rem Resolve any "." and ".." in APP_HOME to make it shorter. | ||||
| for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi | ||||
|  | ||||
| @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||
| set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" | ||||
|  | ||||
| @rem Find java.exe | ||||
| if defined JAVA_HOME goto findJavaFromJavaHome | ||||
|  | ||||
| set JAVA_EXE=java.exe | ||||
| %JAVA_EXE% -version >NUL 2>&1 | ||||
| if %ERRORLEVEL% equ 0 goto execute | ||||
|  | ||||
| echo. 1>&2 | ||||
| echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 | ||||
| echo. 1>&2 | ||||
| echo Please set the JAVA_HOME variable in your environment to match the 1>&2 | ||||
| echo location of your Java installation. 1>&2 | ||||
|  | ||||
| goto fail | ||||
|  | ||||
| :findJavaFromJavaHome | ||||
| set JAVA_HOME=%JAVA_HOME:"=% | ||||
| set JAVA_EXE=%JAVA_HOME%/bin/java.exe | ||||
|  | ||||
| if exist "%JAVA_EXE%" goto execute | ||||
|  | ||||
| echo. 1>&2 | ||||
| echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 | ||||
| echo. 1>&2 | ||||
| echo Please set the JAVA_HOME variable in your environment to match the 1>&2 | ||||
| echo location of your Java installation. 1>&2 | ||||
|  | ||||
| goto fail | ||||
|  | ||||
| :execute | ||||
| @rem Setup the command line | ||||
|  | ||||
| set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar | ||||
|  | ||||
|  | ||||
| @rem Execute Gradle | ||||
| "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* | ||||
|  | ||||
| :end | ||||
| @rem End local scope for the variables with windows NT shell | ||||
| if %ERRORLEVEL% equ 0 goto mainEnd | ||||
|  | ||||
| :fail | ||||
| rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | ||||
| rem the _cmd.exe /c_ return code! | ||||
| set EXIT_CODE=%ERRORLEVEL% | ||||
| if %EXIT_CODE% equ 0 set EXIT_CODE=1 | ||||
| if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% | ||||
| exit /b %EXIT_CODE% | ||||
|  | ||||
| :mainEnd | ||||
| if "%OS%"=="Windows_NT" endlocal | ||||
|  | ||||
| :omega | ||||
							
								
								
									
										5
									
								
								frontend/allowance-planner-v2/android/settings.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,5 @@ | ||||
| include ':app' | ||||
| include ':capacitor-cordova-android-plugins' | ||||
| project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') | ||||
|  | ||||
| apply from: 'capacitor.settings.gradle' | ||||
							
								
								
									
										16
									
								
								frontend/allowance-planner-v2/android/variables.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,16 @@ | ||||
| ext { | ||||
|     minSdkVersion = 23 | ||||
|     compileSdkVersion = 35 | ||||
|     targetSdkVersion = 35 | ||||
|     androidxActivityVersion = '1.9.2' | ||||
|     androidxAppCompatVersion = '1.7.0' | ||||
|     androidxCoordinatorLayoutVersion = '1.2.0' | ||||
|     androidxCoreVersion = '1.15.0' | ||||
|     androidxFragmentVersion = '1.8.4' | ||||
|     coreSplashScreenVersion = '1.0.1' | ||||
|     androidxWebkitVersion = '1.12.1' | ||||
|     junitVersion = '4.13.2' | ||||
|     androidxJunitVersion = '1.2.1' | ||||
|     androidxEspressoCoreVersion = '3.6.1' | ||||
|     cordovaAndroidVersion = '10.1.1' | ||||
| } | ||||
							
								
								
									
										9
									
								
								frontend/allowance-planner-v2/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						| @@ -18,6 +18,7 @@ | ||||
|         "@angular/platform-browser": "^19.0.0", | ||||
|         "@angular/platform-browser-dynamic": "^19.0.0", | ||||
|         "@angular/router": "^19.0.0", | ||||
|         "@capacitor/android": "7.2.0", | ||||
|         "@capacitor/app": "7.0.1", | ||||
|         "@capacitor/core": "7.2.0", | ||||
|         "@capacitor/haptics": "7.0.1", | ||||
| @@ -2452,6 +2453,14 @@ | ||||
|         "node": ">=6.9.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@capacitor/android": { | ||||
|       "version": "7.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-7.2.0.tgz", | ||||
|       "integrity": "sha512-zdhEy3jZPG5Toe/pGzKtDgIiBGywjaoEuQWnGVjBYPlSAEUtAhpZ2At7V0SCb26yluAuzrAUV0Ue+LQeEtHwFQ==", | ||||
|       "peerDependencies": { | ||||
|         "@capacitor/core": "^7.2.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@capacitor/app": { | ||||
|       "version": "7.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-7.0.1.tgz", | ||||
|   | ||||
| @@ -23,6 +23,7 @@ | ||||
|     "@angular/platform-browser": "^19.0.0", | ||||
|     "@angular/platform-browser-dynamic": "^19.0.0", | ||||
|     "@angular/router": "^19.0.0", | ||||
|     "@capacitor/android": "7.2.0", | ||||
|     "@capacitor/app": "7.0.1", | ||||
|     "@capacitor/core": "7.2.0", | ||||
|     "@capacitor/haptics": "7.0.1", | ||||
|   | ||||
							
								
								
									
										10
									
								
								frontend/allowance-planner-v2/src/app/models/allowance.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,10 @@ | ||||
| export interface Allowance { | ||||
|     id: number; | ||||
|     name: string; | ||||
|     target: number; | ||||
|     // Current allowance value | ||||
|     progress: number; | ||||
|     // Can be any positive number (backend checks for number relative to each other) | ||||
|     weight: number; | ||||
|     colour: string; | ||||
| } | ||||
| @@ -5,14 +5,22 @@ import { FormsModule } from '@angular/forms'; | ||||
| import { AllowancePage } from './allowance.page'; | ||||
|  | ||||
| import { AllowancePageRoutingModule } from './allowance-routing.module'; | ||||
| import { AllowanceService } from 'src/app/services/allowance.service'; | ||||
| import { provideHttpClient } from '@angular/common/http'; | ||||
| import { MatIconModule } from '@angular/material/icon'; | ||||
|  | ||||
| @NgModule({ | ||||
|   imports: [ | ||||
|     IonicModule, | ||||
|     CommonModule, | ||||
|     FormsModule, | ||||
|     AllowancePageRoutingModule | ||||
|     AllowancePageRoutingModule, | ||||
|     MatIconModule | ||||
|   ], | ||||
|   declarations: [AllowancePage] | ||||
|   declarations: [AllowancePage], | ||||
|   providers: [ | ||||
|     provideHttpClient(), | ||||
|     AllowanceService | ||||
|   ] | ||||
| }) | ||||
| export class AllowancePageModule {} | ||||
|   | ||||
| @@ -7,4 +7,63 @@ | ||||
| </ion-header> | ||||
|  | ||||
| <ion-content> | ||||
|   <div class="content" *ngIf="allowance$ | async as allowance"> | ||||
|     <div class="bar"> | ||||
|       <div class="distribution">Allowance distribution</div> | ||||
|       <div class="allowance-bar"> | ||||
|         <span | ||||
|           *ngFor="let goal of allowance" | ||||
|           class="partition" | ||||
|           [style.--partition-color]="goal.colour" | ||||
|           [style.width.%]="getPartitionSize(goal, allowance)" | ||||
|         ></span> | ||||
|       </div> | ||||
|       <div class="legend"> | ||||
|         <div class="legend-item" [style.--legend-color]="goal.colour" *ngFor="let goal of allowance"> | ||||
|           <div class="circle"></div> | ||||
|           <div class="title">{{ goal.name }}</div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div | ||||
|       class="goal" | ||||
|       [style.--used-color]="goal.colour" | ||||
|       [ngClass]="{'other-goals': goal.id !== 0}" | ||||
|       *ngFor="let goal of allowance" | ||||
|     > | ||||
|       <div class="main" *ngIf="goal.id === 0; else other_goal"> | ||||
|         <div class="title"> | ||||
|           <div class="name">Main Allowance</div> | ||||
|           <div class="icon"> | ||||
|             <mat-icon>settings</mat-icon> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="progress">{{ goal.progress }} SP</div> | ||||
|         <div class="buttons"> | ||||
|           <button class="add-button">Add</button> | ||||
|           <!-- <button class="move-button">Move</button> --> | ||||
|           <button class="spend-button">Spend</button> | ||||
|         </div> | ||||
|       </div> | ||||
|       <ng-template #other_goal> | ||||
|         <div class="color-wrapper"> | ||||
|           <div> | ||||
|             <div class="title"> | ||||
|               <div class="name">{{ goal.name }}</div> | ||||
|               <div class="icon"> | ||||
|                 <mat-icon>settings</mat-icon> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div class="progress">{{ goal.progress }} / {{ goal.target }} SP</div> | ||||
|             <div class="buttons"> | ||||
|               <button class="add-button">Add</button> | ||||
|               <!-- <button class="move-button">Move</button> --> | ||||
|               <button class="spend-button" [disabled]="!canFinishGoal(goal)">Finish goal</button> | ||||
|             </div> | ||||
|           </div> | ||||
|           <div class="color" [style.--background]="hexToRgb(goal.colour)" [style.width.%]="getPercentage(goal)"></div> | ||||
|         </div> | ||||
|       </ng-template> | ||||
|     </div> | ||||
|   </div> | ||||
| </ion-content> | ||||
|   | ||||
| @@ -0,0 +1,130 @@ | ||||
| .goal { | ||||
|     border: 1px solid var(--used-color); | ||||
|     border-radius: 10px; | ||||
|     padding: 10px; | ||||
|     margin-bottom: 20px; | ||||
|     margin-left: 10px; | ||||
|     margin-right: 10px; | ||||
|     color: var(--used-color); | ||||
| } | ||||
|  | ||||
| .name { | ||||
|     font-size: 20px; | ||||
| } | ||||
|  | ||||
| .progress { | ||||
|     color: var(--font-color); | ||||
|     margin-left: 15px; | ||||
|     margin-top: 8px; | ||||
|     margin-bottom: 15px; | ||||
|     font-size: 16px; | ||||
| } | ||||
|  | ||||
| .bar { | ||||
|     margin-top: 20px; | ||||
|     margin-bottom: 20px; | ||||
|     margin-left: 20px; | ||||
| } | ||||
|  | ||||
| .distribution { | ||||
|     color: var(--ion-color-primary); | ||||
| } | ||||
|  | ||||
| .allowance-bar { | ||||
|     display: flex; | ||||
|     width: 95%; | ||||
|     height: 15px !important; | ||||
|     border-radius: 15px; | ||||
|     background-color: var(--font-color); | ||||
|     overflow: hidden; | ||||
| } | ||||
|  | ||||
| .partition { | ||||
|     --partition-color: white; | ||||
|     background-color: var(--partition-color); | ||||
|     width: 25%; | ||||
|     height: 100%; | ||||
|     //border-radius: 15px; | ||||
| } | ||||
|  | ||||
| .buttons, | ||||
| .title { | ||||
|     display: flex; | ||||
|     gap: 10px; | ||||
| } | ||||
|  | ||||
| button { | ||||
|     height: 30px; | ||||
|     padding-inline: 30px; | ||||
|     border-radius: 10px; | ||||
|     color: white; | ||||
|     font-size: 16px; | ||||
| } | ||||
|  | ||||
| button:disabled, | ||||
| button[disabled]{ | ||||
|     opacity: 0.5; | ||||
| } | ||||
|  | ||||
| .add-button { | ||||
|     background-color: var(--confirm-button-color); | ||||
| } | ||||
|  | ||||
| .move-button { | ||||
|     background-color: var(--ion-color-primary); | ||||
| } | ||||
|  | ||||
| .spend-button { | ||||
|     background-color: var(--negative-amount-color); | ||||
| } | ||||
|  | ||||
| .icon { | ||||
|     margin-left: auto; | ||||
|     color: var(--font-color); | ||||
| } | ||||
|  | ||||
| .color-wrapper { | ||||
|     padding: 10px; | ||||
|     border-radius: 9px; | ||||
|     position: relative; | ||||
|     z-index: 1; | ||||
| } | ||||
|  | ||||
| .color { | ||||
|     --background: rgba(0, 0, 0, 0.3); | ||||
|     background-color: var(--background); | ||||
|     border-radius: 9px; | ||||
|     position: absolute; | ||||
|     top: 0; | ||||
|     bottom: 0; | ||||
|     left: 0; | ||||
|     z-index: -1; | ||||
| } | ||||
|  | ||||
| .other-goals { | ||||
|     padding: unset; | ||||
| } | ||||
|  | ||||
| .legend { | ||||
|     width: 95%; | ||||
|     display: flex; | ||||
|     font-size: 13px; | ||||
|     gap: 8px; | ||||
|     margin-top: 5px; | ||||
|     flex-wrap: wrap; | ||||
| } | ||||
|  | ||||
| .legend-item { | ||||
|     display: flex; | ||||
|     --legend-color: white; | ||||
|     color: var(--legend-color); | ||||
|     align-items: center; | ||||
| } | ||||
|  | ||||
| .circle { | ||||
|     width: 12px; | ||||
|     height: 12px; | ||||
|     background-color: var(--legend-color); | ||||
|     border-radius: 20px; | ||||
|     margin-right: 2px; | ||||
| } | ||||
| @@ -1,5 +1,10 @@ | ||||
| import { Component } from '@angular/core'; | ||||
| import { UserService } from 'src/app/services/user.service'; | ||||
| import { ActivatedRoute } from '@angular/router'; | ||||
| import { BehaviorSubject } from 'rxjs'; | ||||
| import { Allowance } from 'src/app/models/allowance'; | ||||
| import { AllowanceService } from 'src/app/services/allowance.service'; | ||||
| import hexRgb from 'hex-rgb'; | ||||
| import { ViewWillEnter } from '@ionic/angular'; | ||||
|  | ||||
| @Component({ | ||||
|   selector: 'app-allowance', | ||||
| @@ -7,8 +12,64 @@ import { UserService } from 'src/app/services/user.service'; | ||||
|   styleUrls: ['allowance.page.scss'], | ||||
|   standalone: false, | ||||
| }) | ||||
| export class AllowancePage { | ||||
| export class AllowancePage implements ViewWillEnter { | ||||
|   private id: number; | ||||
|   // Move to add/edit page later | ||||
|   private possibleColors: Array<string> = [ | ||||
|     '#6199D9', | ||||
|     '#D98B61', | ||||
|     '#DBC307', | ||||
|     '#13DEB5', | ||||
|     '#7DCB7D', | ||||
|     '#CF1DBD', | ||||
|     '#F53311', | ||||
|     '#2F00FF', | ||||
|     '#098B0D', | ||||
|     '#1BC2E8' | ||||
|   ]; | ||||
|   public allowance$: BehaviorSubject<Array<Allowance>> = new BehaviorSubject<Array<Allowance>>([]); | ||||
|  | ||||
|   constructor(private userService: UserService) {} | ||||
|   constructor( | ||||
|     private route: ActivatedRoute, | ||||
|     private allowanceService: AllowanceService | ||||
|   ) { | ||||
|     this.id = this.route.snapshot.params['id']; | ||||
|     this.getAllowance(); | ||||
|   } | ||||
|  | ||||
|   ionViewWillEnter(): void { | ||||
|     this.getAllowance(); | ||||
|   } | ||||
|  | ||||
|   getAllowance() { | ||||
|     setTimeout(() => { | ||||
|       this.allowanceService.getAllowanceList(this.id).subscribe(allowance => { | ||||
|         allowance[0].colour = '#9C4BE4'; | ||||
|         allowance[0].name = 'Main Allowance'; | ||||
|         console.log('Allowance list: ', allowance); | ||||
|         this.allowance$.next(allowance); | ||||
|       }) | ||||
|     }, 10); | ||||
|   } | ||||
|  | ||||
|   canFinishGoal(allowance: Allowance): boolean { | ||||
|     return allowance.progress >= allowance.target; | ||||
|   } | ||||
|  | ||||
|   hexToRgb(color: string) { | ||||
|     return hexRgb(color, { alpha: 0.3, format: 'css' }) | ||||
|   } | ||||
|  | ||||
|   getPercentage(allowance: Allowance): number { | ||||
|     return allowance.progress / allowance.target * 100; | ||||
|   } | ||||
|  | ||||
|   // Returns number in percent | ||||
|   getPartitionSize(goal: Allowance, allowanceList: Array<Allowance>): number { | ||||
|     let allowanceTotal = 0; | ||||
|     for (let allowance of allowanceList) { | ||||
|       allowanceTotal += allowance.progress; | ||||
|     } | ||||
|     return goal.progress / allowanceTotal * 100; | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -18,7 +18,7 @@ | ||||
|     <input id="name" type="text" formControlName="name"/> | ||||
|  | ||||
|     <label>Reward</label> | ||||
|     <input id="name" type="number" formControlName="reward"/> | ||||
|     <input id="name" type="number" placeholder="0.00" name="price" min="0" value="0" step="0.01" formControlName="reward"/> | ||||
|  | ||||
|     <label>Assigned</label> | ||||
|     <select formControlName="assigned"> | ||||
|   | ||||
| @@ -30,7 +30,7 @@ export class EditTaskPage implements OnInit { | ||||
|  | ||||
|     this.form = this.formBuilder.group({ | ||||
|       name: ['', Validators.required], | ||||
|       reward: ['', [Validators.required, Validators.pattern("^[0-9]*$")]], | ||||
|       reward: ['', Validators.required], | ||||
|       assigned: [0, Validators.required] | ||||
|     }); | ||||
|   } | ||||
|   | ||||
| @@ -0,0 +1,17 @@ | ||||
| import { HttpClient } from '@angular/common/http'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { Observable } from 'rxjs'; | ||||
| import { Allowance } from '../models/allowance'; | ||||
|  | ||||
| @Injectable({ | ||||
|     providedIn: 'root' | ||||
| }) | ||||
| export class AllowanceService { | ||||
|     private url = 'http://localhost:8080/api'; | ||||
|  | ||||
|     constructor(private http: HttpClient) {} | ||||
|  | ||||
|     getAllowanceList(userId: number): Observable<Array<Allowance>> { | ||||
|         return this.http.get<Allowance[]>(`${this.url}/user/${userId}/allowance`); | ||||
|     } | ||||
| } | ||||