diff --git a/.gitignore b/.gitignore
index 0042435..fe49149 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,12 +3,13 @@ refilc/.flutter-plugins
refilc/.flutter-plugins-dependencies
refilc/pubspec.lock
refilc/.dart_tool/
-refilc/android/
-refilc/ios/
-refilc/windows/
-refilc/linux/
-refilc/macos/
+# refilc/android/
+# refilc/ios/
+# refilc/windows/
+# refilc/linux/
+# refilc/macos/
refilc/build/
+refilc/android/key.properties
refilc_desktop_ui/.flutter-plugins
refilc_desktop_ui/.flutter-plugins-dependencies
@@ -34,6 +35,18 @@ filcnaplo_premium/.dart_tool/
.github
.idea
.gitmodules
+.gradle
refilc/.DS_Store
.DS_Store
+refilc/linux/flutter/
+refilc/macos/flutter/
+.plugin_symlinks/
+refilc/ios/Flutter/flutter_export_environment.sh
+refilc/ios/Flutter/Generated.xcconfig
+refilc/ios/Runner/GeneratedPluginRegistrant.h
+refilc/ios/Runner/GeneratedPluginRegistrant.m
+refilc/android/local.properties
+refilc/macos/Flutter/GeneratedPluginRegistrant.swift
+refilc/android/debugkey.properties
+refilc/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java
diff --git a/README.md b/README.md
index badf856..2379379 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
reFilc
@@ -23,7 +23,7 @@ Run `fix-pub.sh`
### Run the app
```sh
-cd refilc
+cd filcnaplo
flutter run
```
@@ -47,6 +47,4 @@ Az összes (ugyan azon verzióhoz tartozó) contribution meg fog jelenni a relea
**Péter:** video editor
-**annon:** a régi Filc Napló fejlesztője (ez az app, ha bár sokban változott, alapjaiban a Filc-re épül)
-
-Ez a projekt egy fork; az eredeti projektet megtaláljátok itt: [filc/naplo-archive](https://github.com/filc/naplo-archive) (köszi, annon)
+**annon:** a régi Filc Napló fejlesztője (ez az app, ha bár sokban változott, alapjaiban a Filc-re épül)
\ No newline at end of file
diff --git a/refilc/android/app/build.gradle b/refilc/android/app/build.gradle
new file mode 100644
index 0000000..15d0169
--- /dev/null
+++ b/refilc/android/app/build.gradle
@@ -0,0 +1,116 @@
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+ localPropertiesFile.withReader('UTF-8') { reader ->
+ localProperties.load(reader)
+ }
+}
+
+def flutterRoot = localProperties.getProperty('flutter.sdk')
+if (flutterRoot == null) {
+ throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
+}
+
+def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
+if (flutterVersionCode == null) {
+ throw new GradleException("Undefined VersionCode")
+}
+
+def flutterVersionName = localProperties.getProperty('flutter.versionName')
+if (flutterVersionName == null) {
+ throw new GradleException("Undefined VersionName")
+}
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
+
+def keystoreProperties = new Properties()
+def keystorePropertiesFile = rootProject.file("key.properties")
+keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
+
+def debugKeystoreProperties = new Properties()
+def debugKeystorePropertiesFile = rootProject.file("debugkey.properties")
+debugKeystoreProperties.load(new FileInputStream(debugKeystorePropertiesFile))
+
+android {
+ ndkVersion "25.1.8937393"
+
+ compileSdkVersion rootProject.ext.compileSdkVersion
+
+ sourceSets {
+ main.java.srcDirs += 'src/main/kotlin'
+ }
+
+ lintOptions {
+ disable 'InvalidPackage'
+ disable "Instantiatable"
+ checkReleaseBuilds false
+ abortOnError false
+ }
+
+ defaultConfig {
+ applicationId "hu.refilc.naplo"
+ minSdkVersion 21
+ targetSdkVersion rootProject.ext.targetSdkVersion
+ versionCode flutterVersionCode.toInteger()
+ versionName flutterVersionName
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ multiDexEnabled true
+ }
+
+ compileOptions {
+ // Flag to enable support for the new language APIs
+ coreLibraryDesugaringEnabled true
+ // Sets Java compatibility to Java 8
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ signingConfigs {
+ debug {
+ keyAlias "androiddebugkey"
+ keyPassword debugKeystoreProperties['keyPassword']
+ storeFile file(debugKeystoreProperties['storeFile'])
+ storePassword debugKeystoreProperties['storePassword']
+ }
+
+ release {
+ keyAlias keystoreProperties['keyAlias']
+ keyPassword keystoreProperties['keyPassword']
+ storeFile file(keystoreProperties['storeFile'])
+ storePassword keystoreProperties['storePassword']
+ }
+ }
+
+ buildTypes {
+ debug {
+ signingConfig signingConfigs.debug
+ }
+
+ release {
+ signingConfig signingConfigs.release
+ shrinkResources false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ buildFeatures {
+ viewBinding true
+ }
+}
+
+flutter {
+ source '../..'
+}
+
+dependencies {
+ implementation 'com.android.support:multidex:2.0.1'
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+ implementation 'joda-time:joda-time:2.9.4'
+ androidTestImplementation 'androidx.test:runner:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
+ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
+ implementation 'androidx.window:window:1.0.0'
+ implementation 'androidx.window:window-java:1.0.0'
+}
diff --git a/refilc/android/app/google-services.json b/refilc/android/app/google-services.json
new file mode 100644
index 0000000..09ea9d9
--- /dev/null
+++ b/refilc/android/app/google-services.json
@@ -0,0 +1,38 @@
+{
+ "project_info": {
+ "project_number": "584481527599",
+ "project_id": "refilc-mobile-login",
+ "storage_bucket": "refilc-mobile-login.appspot.com"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:584481527599:android:cd0fef08720efc4de033da",
+ "android_client_info": {
+ "package_name": "hu.refilc.naplo"
+ }
+ },
+ "oauth_client": [
+ {
+ "client_id": "584481527599-2cpalmvit8kl489aoj3v6t28ujcbcd62.apps.googleusercontent.com",
+ "client_type": 1,
+ "android_info": {
+ "package_name": "hu.refilc.naplo",
+ "certificate_hash": "3c61db0984e5db01569cb084c83f9b3e058d94dc"
+ }
+ }
+ ],
+ "api_key": [
+ {
+ "current_key": "AIzaSyAl8eWn7XVeWeA9dPMrWtzdRhhH4XOWOaY"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/refilc/android/app/proguard-rules.pro b/refilc/android/app/proguard-rules.pro
new file mode 100644
index 0000000..2f9ff85
--- /dev/null
+++ b/refilc/android/app/proguard-rules.pro
@@ -0,0 +1,11 @@
+-keep class io.flutter.plugin.editing.** { *; }
+-keep class androidx.lifecycle.DefaultLifecycleObserver
+-keep class com.pauldemarco.flutter_blue.** { *; }
+-keep class com.mr.flutter.plugin.filepicker.** { *; }
+-keep class com.shockwave.**
+
+-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivity$g
+-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Args
+-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Error
+-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter
+-dontwarn com.stripe.android.pushProvisioning.PushProvisioningEphemeralKeyProvider
\ No newline at end of file
diff --git a/refilc/android/app/src/debug/AndroidManifest.xml b/refilc/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000..fcc14fa
--- /dev/null
+++ b/refilc/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/refilc/android/app/src/main/AndroidManifest.xml b/refilc/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..7914701
--- /dev/null
+++ b/refilc/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/refilc/android/app/src/main/java/hu/refilc/naplo/MainActivity.kt b/refilc/android/app/src/main/java/hu/refilc/naplo/MainActivity.kt
new file mode 100644
index 0000000..ca3052f
--- /dev/null
+++ b/refilc/android/app/src/main/java/hu/refilc/naplo/MainActivity.kt
@@ -0,0 +1,5 @@
+package hu.refilc.naplo
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity()
diff --git a/refilc/android/app/src/main/java/hu/refilc/naplo/database/DBManager.kt b/refilc/android/app/src/main/java/hu/refilc/naplo/database/DBManager.kt
new file mode 100644
index 0000000..0ea69dc
--- /dev/null
+++ b/refilc/android/app/src/main/java/hu/refilc/naplo/database/DBManager.kt
@@ -0,0 +1,73 @@
+package hu.refilc.naplo.database
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+import android.database.sqlite.SQLiteDatabase
+
+import java.sql.SQLException
+
+import hu.refilc.naplo.database.SQLiteHelper
+import kotlin.arrayOf
+
+class DBManager(private val context: Context) {
+ private lateinit var database: SQLiteDatabase
+ private lateinit var dbHelper: SQLiteHelper
+
+ fun open(): DBManager {
+ this.dbHelper = SQLiteHelper(this.context)
+ this.database = this.dbHelper.getWritableDatabase()
+ return this
+ }
+
+ fun close() {
+ this.dbHelper.close()
+ }
+
+ fun fetchWidget(wid: Int): Cursor {
+ val cursor: Cursor = this.database.query(SQLiteHelper.TABLE_NAME_WIDGETS, arrayOf(SQLiteHelper._ID, SQLiteHelper.DAY_SEL), "${SQLiteHelper._ID} = $wid", null, null, null, null)
+ if (cursor != null) cursor.moveToFirst()
+ return cursor
+ }
+
+ fun fetchTimetable(): Cursor {
+ val cursor: Cursor = this.database.query(SQLiteHelper.TABLE_NAME_USER_DATA, arrayOf(SQLiteHelper.TIMETABLE), null, null, null, null, null)
+ if (cursor != null) cursor.moveToFirst()
+ return cursor
+ }
+
+ fun fetchLastUser(): Cursor {
+ val cursor: Cursor = this.database.query(SQLiteHelper.TABLE_NAME_SETTINGS, arrayOf(SQLiteHelper.LAST_ACCOUNT_ID), null, null, null, null, null)
+ if (cursor != null) cursor.moveToFirst()
+ return cursor
+ }
+
+ fun fetchTheme(): Cursor {
+ val cursor: Cursor = this.database.query(SQLiteHelper.TABLE_NAME_SETTINGS, arrayOf(SQLiteHelper.THEME, SQLiteHelper.CUSTOM_ACCENT_COLOR, SQLiteHelper.CUSTOM_BACKGROUND_COLOR), null, null, null, null, null)
+ if (cursor != null) cursor.moveToFirst()
+ return cursor
+ }
+
+ fun fetchLocale(): Cursor {
+ val cursor: Cursor = this.database.query(SQLiteHelper.TABLE_NAME_SETTINGS, arrayOf(SQLiteHelper.LOCALE), null, null, null, null, null)
+ if (cursor != null) cursor.moveToFirst()
+ return cursor
+ }
+
+ fun deleteWidget(_id: Int) {
+ this.database.delete(SQLiteHelper.TABLE_NAME_WIDGETS, "_id=$_id", null)
+ }
+
+ fun insertSelDay(_id: Int, day_sel: Int) {
+ val con: ContentValues = ContentValues()
+ con.put(SQLiteHelper._ID, _id)
+ con.put(SQLiteHelper.DAY_SEL, day_sel)
+ this.database.insert(SQLiteHelper.TABLE_NAME_WIDGETS, null, con)
+ }
+
+ fun update(_id: Int, day_sel: Int): Int {
+ val con: ContentValues = ContentValues()
+ con.put(SQLiteHelper.DAY_SEL, day_sel)
+ return this.database.update(SQLiteHelper.TABLE_NAME_WIDGETS, con, "${SQLiteHelper._ID} = $_id", null)
+ }
+}
diff --git a/refilc/android/app/src/main/java/hu/refilc/naplo/database/SQLiteHelper.kt b/refilc/android/app/src/main/java/hu/refilc/naplo/database/SQLiteHelper.kt
new file mode 100644
index 0000000..69588b2
--- /dev/null
+++ b/refilc/android/app/src/main/java/hu/refilc/naplo/database/SQLiteHelper.kt
@@ -0,0 +1,33 @@
+package hu.refilc.naplo.database
+
+import android.content.Context
+import android.database.sqlite.SQLiteDatabase
+import android.database.sqlite.SQLiteOpenHelper
+
+class SQLiteHelper(context: Context): SQLiteOpenHelper(context, DB_NAME, null, 7) {
+ companion object {
+ private final val CREATE_TABLE_WIDGET: String = " create table widgets ( _id INTEGER NOT NULL, day_sel INTEGER NOT NULL);"
+ private final val DB_NAME: String = "app.db"
+ private final val DB_VERSION: Int = 1
+ final val _ID: String = "_id"
+ final val DAY_SEL: String = "day_sel"
+ final val TIMETABLE: String = "timetable"
+ final val LAST_ACCOUNT_ID: String = "last_account_id"
+ final val THEME: String = "theme"
+ final val LOCALE: String = "language"
+ final val CUSTOM_ACCENT_COLOR: String = "custom_accent_color"
+ final val CUSTOM_BACKGROUND_COLOR: String = "custom_background_color"
+ final val TABLE_NAME_WIDGETS: String = "widgets"
+ final val TABLE_NAME_USER_DATA: String = "user_data"
+ final val TABLE_NAME_SETTINGS: String = "settings"
+ }
+
+ override fun onCreate(db: SQLiteDatabase) {
+ db.execSQL(CREATE_TABLE_WIDGET)
+ }
+
+ override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
+ db.execSQL("DROP TABLE IF EXISTS widgets")
+ onCreate(db)
+ }
+}
diff --git a/refilc/android/app/src/main/java/hu/refilc/naplo/utils/Utils.kt b/refilc/android/app/src/main/java/hu/refilc/naplo/utils/Utils.kt
new file mode 100644
index 0000000..bf8a2ff
--- /dev/null
+++ b/refilc/android/app/src/main/java/hu/refilc/naplo/utils/Utils.kt
@@ -0,0 +1,41 @@
+package hu.refilc.naplo.utils
+
+import android.content.Context
+import android.net.ConnectivityManager
+import android.net.NetworkInfo
+
+import java.util.Calendar
+import java.util.Date
+
+class Utils {
+ companion object {
+ @JvmStatic
+ fun hasNetwork(context: Context): Boolean {
+ val cm: ConnectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+ val netInfo: NetworkInfo = cm.getActiveNetworkInfo() as NetworkInfo
+ if (netInfo != null && netInfo.isConnectedOrConnecting()) {
+ return true
+ }
+ return false
+ }
+
+ @JvmStatic
+ fun getWeekStartDate(): Date {
+ var calendar: Calendar = Calendar.getInstance()
+ while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
+ calendar.add(Calendar.DATE, -1)
+ }
+ return calendar.getTime()
+ }
+
+ @JvmStatic
+ fun getWeekEndDate(): Date {
+ var calendar: Calendar = Calendar.getInstance()
+ while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
+ calendar.add(Calendar.DATE, 1)
+ }
+ calendar.add(Calendar.DATE, -1)
+ return calendar.getTime()
+ }
+ }
+}
diff --git a/refilc/android/app/src/main/java/hu/refilc/naplo/utils/Week.kt b/refilc/android/app/src/main/java/hu/refilc/naplo/utils/Week.kt
new file mode 100644
index 0000000..860b8f2
--- /dev/null
+++ b/refilc/android/app/src/main/java/hu/refilc/naplo/utils/Week.kt
@@ -0,0 +1,57 @@
+package hu.refilc.naplo.utils
+
+import java.time.DayOfWeek
+import java.time.Duration
+import java.time.LocalDate
+import kotlin.math.ceil
+
+class Week private constructor(private final val start: LocalDate, private final val end: LocalDate) {
+ companion object {
+ fun current(): Week {
+ return fromDate(LocalDate.now())
+ }
+
+ fun fromId(id: Int): Week {
+ val _now: LocalDate = getYearStart().plusDays(id * 7L)
+ return Week(_now.minusDays(_now.getDayOfWeek().getValue() - 1L), _now.plusDays(7L - _now.getDayOfWeek().getValue()))
+ }
+
+ fun fromDate(date: LocalDate): Week {
+ return Week(date.minusDays(date.getDayOfWeek().getValue() - 1L), date.plusDays(7L - date.getDayOfWeek().getValue()))
+ }
+
+ private fun getYearStart(): LocalDate {
+ val now: LocalDate = LocalDate.now()
+ val start: LocalDate = getYearStart(now.getYear())
+ return if (start.isBefore(now)) start else getYearStart(now.getYear() - 1)
+ }
+
+ private fun getYearStart(year: Int): LocalDate {
+ val time: LocalDate = LocalDate.of(year, 9, 1)
+ if (time.getDayOfWeek() == DayOfWeek.SATURDAY)
+ return time.plusDays(2)
+ else if (time.getDayOfWeek() == DayOfWeek.SUNDAY)
+ return time.plusDays(1)
+ return time
+ }
+ }
+
+ fun next(): Week {
+ return Week.fromDate(start.plusDays(8))
+ }
+
+ fun id(): Int {
+ return Math.ceil(Duration.between(getYearStart().atStartOfDay(), start.atStartOfDay()).toDays() / 7.0).toInt()
+ }
+
+ override fun equals(o: Any?): Boolean {
+ if (this == o as Week) return true
+ if (o == null || Week::class != o::class) return false
+ val week: Week = o as Week
+ return this.id() == week.id()
+ }
+
+ override fun hashCode(): Int {
+ return id()
+ }
+}
diff --git a/refilc/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetable.kt b/refilc/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetable.kt
new file mode 100644
index 0000000..e9f70cf
--- /dev/null
+++ b/refilc/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetable.kt
@@ -0,0 +1,402 @@
+package hu.refilc.naplo.widget_timetable
+
+import android.app.PendingIntent
+import android.app.UiModeManager
+import android.appwidget.AppWidgetManager
+import android.appwidget.AppWidgetProvider
+import android.content.Context
+import android.content.Intent
+import android.content.SharedPreferences
+import android.database.Cursor
+import android.net.Uri
+import android.os.Build
+import android.util.Log
+import android.view.View
+import android.widget.RemoteViews
+import android.widget.Toast
+
+import org.joda.time.DateTime
+import org.json.JSONArray
+import org.json.JSONException
+import org.json.JSONObject
+
+import java.time.DayOfWeek
+import java.time.format.TextStyle
+import java.util.Collections
+import java.util.Comparator
+import java.util.Locale
+import java.util.HashMap
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.Date
+
+import hu.refilc.naplo.database.DBManager
+import hu.refilc.naplo.MainActivity
+import hu.refilc.naplo.R
+
+import hu.refilc.naplo.utils.Week
+
+import es.antonborri.home_widget.HomeWidgetBackgroundIntent
+import es.antonborri.home_widget.HomeWidgetLaunchIntent
+import es.antonborri.home_widget.HomeWidgetProvider
+import kotlin.collections.mutableMapOf
+
+class WidgetTimetable : HomeWidgetProvider() {
+ override fun onUpdate(
+ context: Context,
+ appWidgetManager: AppWidgetManager,
+ appWidgetIds: IntArray,
+ widgetData: SharedPreferences
+ ) {
+ val fullTheme: Array = getFullTheme(context)
+ val textColors: Array = getTextColors(context, fullTheme)
+ for (i in appWidgetIds.indices) {
+ val views: RemoteViews = generateView(context, appWidgetIds[i])
+ if (userLoggedIn(context)) {
+ val rday = selectDay(context, appWidgetIds[i], 0, true)
+ views.setTextViewText(R.id.nav_current, convertDayOfWeek(context, rday))
+ views.setInt(R.id.nav_current, "setTextColor", getColor(context, textColors[0]))
+ }
+ pushUpdate(context, views, appWidgetIds[i])
+ }
+ }
+
+ override fun onReceive(context: Context, intent: Intent) {
+ super.onReceive(context, intent)
+ if (intent.hasExtra(AppWidgetManager.EXTRA_APPWIDGET_ID)) {
+ val appId: Int = intent.getIntExtra(
+ AppWidgetManager.EXTRA_APPWIDGET_ID,
+ AppWidgetManager.INVALID_APPWIDGET_ID
+ )
+ val views: RemoteViews = generateView(context, appId)
+ try {
+ if (userLoggedIn(context)) {
+ if (intent.getAction().equals(ACTION_WIDGET_CLICK_NAV_LEFT)) {
+ val rday = selectDay(context, appId, -1, false)
+ views.setTextViewText(R.id.nav_current, convertDayOfWeek(context, rday))
+ pushUpdate(context, views, appId)
+ } else if (intent.getAction().equals(ACTION_WIDGET_CLICK_NAV_RIGHT)) {
+ val rday = selectDay(context, appId, 1, false)
+ views.setTextViewText(R.id.nav_current, convertDayOfWeek(context, rday))
+ pushUpdate(context, views, appId)
+ } else if (intent.getAction().equals(ACTION_WIDGET_CLICK_NAV_TODAY)) {
+ val rday = getToday(context)
+ setSelectedDay(context, appId, rday)
+ views.setTextViewText(R.id.nav_current, convertDayOfWeek(context, rday))
+ pushUpdate(context, views, appId)
+ } else if (intent.getAction().equals(ACTION_WIDGET_CLICK_NAV_REFRESH)) {
+ val pendingIntent: PendingIntent =
+ HomeWidgetLaunchIntent.getActivity(
+ context,
+ MainActivity::class.java,
+ Uri.parse("timetable://refresh")
+ )
+ pendingIntent.send()
+ } else if (intent.getAction()
+ .equals("android.appwidget.action.APPWIDGET_DELETED")
+ ) {
+ val dbManager = DBManager(context.getApplicationContext())
+ try {
+ dbManager.open()
+ dbManager.deleteWidget(appId)
+ dbManager.close()
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+ }
+ if (intent.getAction().equals(ACTION_WIDGET_CLICK_BUY_PREMIUM)) {
+ val pendingIntent: PendingIntent = HomeWidgetLaunchIntent.getActivity(
+ context,
+ MainActivity::class.java,
+ Uri.parse("settings://premium")
+ )
+ pendingIntent.send()
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+ }
+
+ override fun onEnabled(context: Context?) {
+ }
+
+ override fun onDisabled(context: Context?) {
+ }
+
+ companion object {
+ private const val ACTION_WIDGET_CLICK_NAV_LEFT = "list_widget.ACTION_WIDGET_CLICK_NAV_LEFT"
+ private const val ACTION_WIDGET_CLICK_NAV_RIGHT =
+ "list_widget.ACTION_WIDGET_CLICK_NAV_RIGHT"
+ private const val ACTION_WIDGET_CLICK_NAV_TODAY =
+ "list_widget.ACTION_WIDGET_CLICK_NAV_TODAY"
+ private const val ACTION_WIDGET_CLICK_NAV_REFRESH =
+ "list_widget.ACTION_WIDGET_CLICK_NAV_REFRESH"
+ private const val ACTION_WIDGET_CLICK_BUY_PREMIUM =
+ "list_widget.ACTION_WIDGET_CLICK_BUY_PREMIUM"
+
+ fun pushUpdate(context: Context?, remoteViews: RemoteViews?, appWidgetSingleId: Int) {
+ val manager: AppWidgetManager = AppWidgetManager.getInstance(context)
+ manager.updateAppWidget(appWidgetSingleId, remoteViews)
+ manager.notifyAppWidgetViewDataChanged(appWidgetSingleId, R.id.widget_list)
+ }
+
+ fun getColor(context: Context, color: Int): Int {
+ return context.getResources().getColor(color)
+ }
+
+ fun getTextColors(context: Context, fullTheme: Array): Array {
+ val uiModeManager: UiModeManager =
+ context.getSystemService(Context.UI_MODE_SERVICE) as UiModeManager
+ val nightMode: Int = uiModeManager.getNightMode()
+ val textColor: Int
+ val textDescColor: Int
+ if (fullTheme[0] == 0 && nightMode == UiModeManager.MODE_NIGHT_NO) {
+ textColor = R.color.text_light
+ textDescColor = R.color.text_desc_light
+ } else if (fullTheme[0] == 1) {
+ textColor = R.color.text_light
+ textDescColor = R.color.text_desc_light
+ } else {
+ textColor = R.color.text
+ textDescColor = R.color.text_desc
+ }
+ return arrayOf(textColor, textDescColor)
+ }
+
+ fun getFullTheme(context: Context): Array {
+ val dbManager = DBManager(context.getApplicationContext())
+ try {
+ dbManager.open()
+ val cursor: Cursor = dbManager.fetchTheme()
+ dbManager.close()
+ val theme: Int = cursor.getInt(0)
+ val customBackgroundColor: Int = cursor.getInt(2)
+ return arrayOf(theme, customBackgroundColor)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return arrayOf(0, 0)
+ }
+
+ fun generateView(context: Context, appId: Int): RemoteViews {
+ val fullTheme: Array = getFullTheme(context)
+ val textColors: Array = getTextColors(context, fullTheme)
+ val serviceIntent = Intent(context, WidgetTimetableService::class.java)
+ serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appId)
+ serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)))
+ val views = RemoteViews(context.getPackageName(), R.layout.widget_timetable)
+ views.setViewVisibility(R.id.need_login, View.GONE)
+ views.setViewVisibility(R.id.tt_grid_cont, View.GONE)
+ views.setInt(R.id.nav_to_left, "setColorFilter", getColor(context, textColors[1]))
+ views.setInt(R.id.nav_to_right, "setColorFilter", getColor(context, textColors[1]))
+ views.setInt(R.id.nav_refresh, "setColorFilter", getColor(context, textColors[1]))
+ views.setInt(R.id.empty_view, "setTextColor", getColor(context, textColors[0]))
+ if (!userLoggedIn(context)) {
+ views.setViewVisibility(R.id.need_login, View.VISIBLE)
+ views.setOnClickPendingIntent(
+ R.id.open_login,
+ makePending(context, ACTION_WIDGET_CLICK_BUY_PREMIUM, appId)
+ )
+ } else {
+ views.setViewVisibility(R.id.tt_grid_cont, View.VISIBLE)
+ views.setInt(R.id.widget_list, "setBackgroundColor", fullTheme[1])
+ views.setInt(R.id.bottom_nav, "setBackgroundColor", fullTheme[1])
+ views.setOnClickPendingIntent(
+ R.id.nav_to_left,
+ makePending(context, ACTION_WIDGET_CLICK_NAV_LEFT, appId)
+ )
+ views.setOnClickPendingIntent(
+ R.id.nav_to_right,
+ makePending(context, ACTION_WIDGET_CLICK_NAV_RIGHT, appId)
+ )
+ views.setOnClickPendingIntent(
+ R.id.nav_current,
+ makePending(context, ACTION_WIDGET_CLICK_NAV_TODAY, appId)
+ )
+ views.setOnClickPendingIntent(
+ R.id.nav_refresh,
+ makePending(context, ACTION_WIDGET_CLICK_NAV_REFRESH, appId)
+ )
+ views.setRemoteAdapter(R.id.widget_list, serviceIntent)
+ views.setEmptyView(R.id.widget_list, R.id.empty_view)
+ views.setInt(R.id.empty_view, "setBackgroundColor", fullTheme[1])
+ }
+ return views
+ }
+
+ fun makePending(context: Context?, action: String?, appWidgetId: Int): PendingIntent {
+ val activebtnnext = Intent(context, WidgetTimetable::class.java)
+ activebtnnext.setAction(action)
+ activebtnnext.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
+ return PendingIntent.getBroadcast(
+ context,
+ appWidgetId,
+ activebtnnext,
+ PendingIntent.FLAG_IMMUTABLE
+ )
+ }
+
+ fun convertDayOfWeek(context: Context, rday: Int): String {
+
+ /*if(rday == -1) return DayOfWeek.of(1).getDisplayName(TextStyle.FULL, new Locale("hu", "HU"))
+
+ String dayOfWeek = DayOfWeek.of(rday + 1).getDisplayName(TextStyle.FULL, new Locale("hu", "HU"))*/
+ var dayOfWeek = "Unknown"
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ val loc: Locale = getLocale(context)
+ if (rday == -1) return DayOfWeek.of(1).getDisplayName(TextStyle.FULL, loc)
+ dayOfWeek = DayOfWeek.of(rday + 1).getDisplayName(TextStyle.FULL, loc)
+ }
+ return dayOfWeek.substring(0, 1).toUpperCase() + dayOfWeek.substring(1).toLowerCase()
+ }
+
+ fun setSelectedDay(context: Context, wid: Int, day: Int) {
+ val dbManager = DBManager(context.getApplicationContext())
+ try {
+ dbManager.open()
+ dbManager.update(wid, day)
+ dbManager.close()
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+
+ fun getToday(context: Context): Int {
+ var rday: Int = DateTime().getDayOfWeek() - 1
+ val s: MutableList = genJsonDays(context)
+ try {
+ if (checkIsAfter(s, rday)) rday += 1
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return retDay(rday, s.size)
+ }
+
+ fun selectDay(context: Context, wid: Int, add: Int, afterSubjects: Boolean): Int {
+ val dbManager = DBManager(context.getApplicationContext())
+ try {
+ dbManager.open()
+ val cursor: Cursor = dbManager.fetchWidget(wid)
+ val s: MutableList = genJsonDays(context)
+ var retday: Int = DateTime().getDayOfWeek() - 1
+ if (cursor.getCount() !== 0) retday = retDay(cursor.getInt(1) + add, s.size)
+ if (afterSubjects) if (checkIsAfter(s, retday)) retday += 1
+ retday = retDay(retday, s.size)
+ if (cursor.getCount() === 0) dbManager.insertSelDay(
+ wid,
+ retday
+ ) else dbManager.update(wid, retday)
+ dbManager.close()
+
+ // get the date of the first lesson
+ val dt = DateTime(s[retday].getJSONObject(0).getString("Datum"))
+ retday = dt.getDayOfWeek() - 1
+ return retday
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return 0
+ }
+
+ fun checkIsAfter(s: MutableList, retday: Int): Boolean {
+ var retday = retday
+ retday = retDay(retday, s.size)
+ val vegIdopont: String =
+ s[retday].getJSONObject(s[retday].length() - 1).getString("VegIdopont")
+ return DateTime().isAfter(DateTime(vegIdopont))
+ }
+
+ fun retDay(retday: Int, size: Int): Int {
+ var retday = retday
+ if (retday < 0) retday = size - 1 else if (retday > size - 1) retday = 0
+ return retday
+ }
+
+ fun genJsonDays(context: Context): MutableList {
+ val genDays: MutableList = mutableListOf()
+ val dayMap: MutableMap = mutableMapOf()
+ val dbManager = DBManager(context.getApplicationContext())
+ try {
+ dbManager.open()
+ val ct: Cursor = dbManager.fetchTimetable()
+ if (ct.getCount() === 0) {
+ return genDays
+ }
+ val fetchedTimetable = JSONObject(ct.getString(0))
+ val currentWeek: String = Week.current().id().toString()
+ val week: JSONArray = fetchedTimetable.getJSONArray(currentWeek)
+
+ // Organize lessons into dates
+ for (i in 0 until week.length()) {
+ try {
+ val entry: JSONObject = week.getJSONObject(i)
+ val date: String = entry.getString("Datum")
+ dayMap.computeIfAbsent(date) { k -> JSONArray() }.put(entry)
+ } catch (e: JSONException) {
+ e.printStackTrace()
+ }
+ }
+ genDays.addAll(dayMap.values)
+
+ // Sort the 'genDays' list of JSON based on the start time of the first entry
+ genDays.sortWith( { day1, day2 ->
+ // Extract the start time of the first entry in each day's JSON
+ val startTime1: String = day1.getJSONObject(0).getString("KezdetIdopont")
+ val startTime2: String = day2.getJSONObject(0).getString("KezdetIdopont")
+ // Compare the start times and return the result for sorting
+ startTime1.compareTo(startTime2)
+ })
+ } catch (e: Exception) {
+ e.printStackTrace()
+ } finally {
+ dbManager.close()
+ }
+ return genDays
+ }
+
+ fun zeroPad(value: Int, padding: Int): String {
+ val b = StringBuilder()
+ b.append(value)
+ while (b.length < padding) {
+ b.insert(0, "0")
+ }
+ return b.toString()
+ }
+
+ fun getLocale(context: Context): Locale {
+ val dbManager = DBManager(context.getApplicationContext())
+ try {
+ dbManager.open()
+ val loc: String = dbManager.fetchLocale().getString(0)
+ dbManager.close()
+ if (loc.equals("hu") || loc.equals("de")) {
+ return Locale(loc, loc.toUpperCase())
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return Locale("en", "GB")
+ }
+
+ fun userLoggedIn(context: Context): Boolean {
+ return !lastUserId(context).equals("")
+ }
+
+ fun lastUserId(context: Context): String {
+ val dbManager = DBManager(context.getApplicationContext())
+ try {
+ dbManager.open()
+ val cursor: Cursor = dbManager.fetchLastUser()
+ dbManager.close()
+ if (cursor != null && !cursor.getString(0).equals("")) {
+ return cursor.getString(0)
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return ""
+ }
+ }
+}
diff --git a/refilc/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableDataProvider.kt b/refilc/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableDataProvider.kt
new file mode 100644
index 0000000..b3229f3
--- /dev/null
+++ b/refilc/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableDataProvider.kt
@@ -0,0 +1,328 @@
+package hu.refilc.naplo.widget_timetable
+
+import android.app.UiModeManager
+import android.appwidget.AppWidgetManager
+import android.content.Context
+import android.content.Intent
+import android.database.Cursor
+import android.os.Build
+import android.util.Log
+import android.view.View
+import android.widget.RemoteViews
+import android.widget.RemoteViewsService
+
+import org.joda.time.DateTime
+import org.json.JSONArray
+import org.json.JSONException
+import org.json.JSONObject
+
+import java.util.Collections
+import java.util.Comparator
+
+import hu.refilc.naplo.database.DBManager
+import hu.refilc.naplo.R
+
+class WidgetTimetableDataProvider(context: Context, intent: Intent) : RemoteViewsService.RemoteViewsFactory {
+ private val context: Context
+ private val appWidgetId: Int
+ private var rday = 0
+ private var fullTheme: Array
+ private val uiModeManager: UiModeManager
+ private val nightMode: Int
+ var day_subjects: MutableList = mutableListOf()
+ var lessonIndexes: MutableList = mutableListOf()
+ var witem: Item? = null
+
+ /* Default values */
+ class Item(
+ var Layout: Int,
+ var BackgroundColor: Int,
+ var NumVisibility: Int,
+ var NameVisibility: Int,
+ var NameNodescVisibility: Int,
+ var DescVisibility: Int,
+ var RoomVisibility: Int,
+ var TimeVisibility: Int,
+ var NumColor: Int,
+ var NameColor: Int,
+ var NameNodescColor: Int,
+ var DescColor: Int,
+ var RoomColor: Int,
+ var TimeColor: Int
+ ) {
+ var NameNodescPadding: Array = arrayOf(0, 0, 0, 0)
+ }
+
+ class Lesson(
+ var status: String,
+ var lessonIndex: String,
+ var lessonName: String,
+ var lessonTopic: String,
+ var lessonRoom: String,
+ var lessonStart: Long,
+ var lessonEnd: Long,
+ var substituteTeacher: String
+ )
+
+ var itemNameNodescPadding: Array = arrayOf(0, 0, 0, 0)
+
+ init {
+ this.context = context
+ appWidgetId = intent.getIntExtra(
+ AppWidgetManager.EXTRA_APPWIDGET_ID,
+ AppWidgetManager.INVALID_APPWIDGET_ID
+ )
+ fullTheme = getFullTheme(context)
+ uiModeManager = context.getSystemService(Context.UI_MODE_SERVICE) as UiModeManager
+ nightMode = uiModeManager.getNightMode()
+ }
+
+ override fun onCreate() {
+ initData()
+ }
+
+ override fun onDataSetChanged() {
+ initData()
+ }
+
+ override fun onDestroy() {}
+
+ override fun getCount(): Int {
+ return day_subjects.size
+ }
+
+ fun setLayout(view: RemoteViews) {
+ /* Visibilities */
+ view.setViewVisibility(R.id.tt_item_num, witem!!.NumVisibility)
+ view.setViewVisibility(R.id.tt_item_name, witem!!.NameVisibility)
+ view.setViewVisibility(R.id.tt_item_name_nodesc, witem!!.NameNodescVisibility)
+ view.setViewVisibility(R.id.tt_item_desc, witem!!.DescVisibility)
+ view.setViewVisibility(R.id.tt_item_room, witem!!.RoomVisibility)
+ view.setViewVisibility(R.id.tt_item_time, witem!!.TimeVisibility)
+
+ /* backgroundResources */
+ view.setInt(R.id.main_lay, "setBackgroundResource", witem!!.Layout)
+ view.setInt(R.id.main_lay, "setBackgroundColor", witem!!.BackgroundColor)
+
+ /* Paddings */
+ view.setViewPadding(
+ R.id.tt_item_name_nodesc,
+ witem!!.NameNodescPadding[0],
+ witem!!.NameNodescPadding[1],
+ witem!!.NameNodescPadding[2],
+ witem!!.NameNodescPadding[3]
+ )
+
+ /* Text Colors */
+ view.setInt(R.id.tt_item_num, "setTextColor", witem!!.NumColor)
+ view.setInt(R.id.tt_item_name, "setTextColor", getColor(context, witem!!.NameColor))
+ view.setInt(R.id.tt_item_name_nodesc, "setTextColor", getColor(context, witem!!.NameNodescColor))
+ view.setInt(R.id.tt_item_desc, "setTextColor", getColor(context, witem!!.DescColor))
+ view.setInt(R.id.tt_item_room, "setTextColor", getColor(context, witem!!.RoomColor))
+ view.setInt(R.id.tt_item_time, "setTextColor", getColor(context, witem!!.TimeColor))
+ }
+
+ fun getColor(context: Context, color: Int): Int {
+ return context.getResources().getColor(color)
+ }
+
+ override fun getViewAt(position: Int): RemoteViews {
+ val view = RemoteViews(context.getPackageName(), R.layout.timetable_item)
+ witem = defaultItem(fullTheme, nightMode)
+ val curr_subject = day_subjects[position]
+ if (curr_subject.status.equals("empty")) {
+ witem!!.NumColor = getColor(context, R.color.text_miss_num)
+ witem!!.TimeVisibility = View.GONE
+ witem!!.RoomVisibility = View.GONE
+ witem!!.NameNodescColor = R.color.text_miss
+ }
+ if (!curr_subject.substituteTeacher.equals("null")) {
+ witem!!.NumColor = getColor(context, R.color.yellow)
+ witem!!.Layout = R.drawable.card_layout_tile_helyetesitett
+ }
+ if (curr_subject.status.equals("Elmaradt")) {
+ witem!!.NumColor = getColor(context, R.color.red)
+ witem!!.Layout = R.drawable.card_layout_tile_elmarad
+ } else if (curr_subject.status.equals("TanevRendjeEsemeny")) {
+ witem!!.NumVisibility = View.GONE
+ witem!!.TimeVisibility = View.GONE
+ witem!!.RoomVisibility = View.GONE
+ witem!!.NameNodescPadding[0] = 50
+ witem!!.NameNodescPadding[2] = 50
+ witem!!.NameNodescColor = R.color.text_miss
+ }
+ if (curr_subject.lessonTopic.equals("null")) {
+ witem!!.DescVisibility = View.GONE
+ witem!!.NameVisibility = View.GONE
+ witem!!.NameNodescVisibility = View.VISIBLE
+ }
+ setLayout(view)
+ val lessonIndexTrailing = if (curr_subject.lessonIndex.equals("+")) "" else "."
+ view.setTextViewText(R.id.tt_item_num, curr_subject.lessonIndex + lessonIndexTrailing)
+ view.setTextViewText(R.id.tt_item_name, curr_subject.lessonName)
+ view.setTextViewText(R.id.tt_item_name_nodesc, curr_subject.lessonName)
+ view.setTextViewText(R.id.tt_item_desc, curr_subject.lessonTopic)
+ view.setTextViewText(R.id.tt_item_room, curr_subject.lessonRoom)
+ if (curr_subject.lessonStart != 0L && curr_subject.lessonEnd != 0L) view.setTextViewText(
+ R.id.tt_item_time,
+ ((WidgetTimetable.zeroPad(
+ DateTime(curr_subject.lessonStart).getHourOfDay(),
+ 2
+ ) + ":" + WidgetTimetable.zeroPad(
+ DateTime(curr_subject.lessonStart).getMinuteOfHour(),
+ 2
+ )).toString() +
+ "\n" + WidgetTimetable.zeroPad(
+ DateTime(curr_subject.lessonEnd).getHourOfDay(),
+ 2
+ )).toString() + ":" + WidgetTimetable.zeroPad(
+ DateTime(curr_subject.lessonEnd).getMinuteOfHour(),
+ 2
+ )
+ )
+ return view
+ }
+
+ override fun getLoadingView(): RemoteViews {
+ val view = RemoteViews(context.getPackageName(), R.layout.timetable_item)
+ return view
+ }
+
+ override fun getViewTypeCount(): Int {
+ return 1
+ }
+
+ override fun getItemId(position: Int): Long {
+ return position.toLong()
+ }
+
+ override fun hasStableIds(): Boolean {
+ return true
+ }
+
+ private fun initData() {
+ // refresh theme
+ fullTheme = getFullTheme(context)
+ rday = WidgetTimetable.selectDay(context, appWidgetId, 0, false)
+ day_subjects.clear()
+ lessonIndexes.clear()
+ try {
+ val arr: MutableList = WidgetTimetable.genJsonDays(context) as MutableList
+ if (arr.isEmpty()) {
+ return
+ }
+ val arr_lessons: JSONArray = WidgetTimetable.genJsonDays(context).get(rday)
+ for (i in 0 until arr_lessons.length()) {
+ val obj_lessons: JSONObject = arr_lessons.getJSONObject(i)
+ day_subjects.add(jsonToLesson(obj_lessons))
+ }
+ } catch (e: JSONException) {
+ e.printStackTrace()
+ }
+ if (day_subjects.size > 0) {
+ Collections.sort(day_subjects, object : Comparator {
+ override fun compare(o1: Lesson?, o2: Lesson?): Int {
+ return DateTime(o1?.lessonStart).compareTo(DateTime(o2?.lessonStart))
+ }
+ })
+ for (i in 0 until day_subjects.size) {
+ if (!day_subjects[i].lessonIndex.equals("+")) {
+ lessonIndexes.add(Integer.valueOf(day_subjects[i].lessonIndex))
+ }
+ }
+ if (lessonIndexes.size > 0) {
+ var lessonsChecked: Int = Collections.min(lessonIndexes)
+ var i = 0
+ while (lessonsChecked < Collections.max(lessonIndexes)) {
+ if (!lessonIndexes.contains(lessonsChecked)) {
+ day_subjects.add(i, emptyLesson(lessonsChecked))
+ }
+ lessonsChecked++
+ i++
+ }
+ }
+ }
+ }
+
+ fun defaultItem(fullTheme: Array, nightMode: Int): Item {
+ val textColor: Int
+ val textDescColor: Int
+ if (fullTheme[0] == 0 && nightMode == UiModeManager.MODE_NIGHT_NO) {
+ textColor = R.color.text_light
+ textDescColor = R.color.text_desc_light
+ } else if (fullTheme[0] == 1) {
+ textColor = R.color.text_light
+ textDescColor = R.color.text_desc_light
+ } else {
+ textColor = R.color.text
+ textDescColor = R.color.text_desc
+ }
+ return Item(
+ R.drawable.card_layout_tile,
+ fullTheme[2],
+ View.VISIBLE,
+ View.VISIBLE,
+ View.INVISIBLE,
+ View.VISIBLE,
+ View.VISIBLE,
+ View.VISIBLE,
+ fullTheme[1],
+ textColor,
+ textColor,
+ textDescColor,
+ textDescColor,
+ textColor
+ )
+ }
+
+ fun emptyLesson(lessonIndex: Int): Lesson {
+ return Lesson(
+ "empty",
+ lessonIndex.toString(),
+ "Lyukasóra",
+ "null",
+ "null",
+ 0,
+ 0,
+ "null"
+ )
+ }
+
+ fun jsonToLesson(json: JSONObject): Lesson {
+ try {
+ var name: String = json.getString("Nev")
+ name = name.substring(0, 1).toUpperCase() + name.substring(1) // Capitalize name
+ return Lesson(
+ json.getJSONObject("Allapot").getString("Nev"),
+ if (!json.getString("Oraszam").equals("null")) json.getString("Oraszam") else "+",
+ name,
+ json.getString("Tema"),
+ json.getString("TeremNeve"),
+ DateTime(json.getString("KezdetIdopont")).getMillis(),
+ DateTime(json.getString("VegIdopont")).getMillis(),
+ json.getString("HelyettesTanarNeve")
+ )
+ } catch (e: Exception) {
+ Log.d("Filc", "exception: $e")
+ }
+ return Lesson("", "", "", "", "", 0, 0, "")
+ }
+
+ companion object {
+ fun getFullTheme(context: Context): Array {
+ val dbManager = DBManager(context.getApplicationContext())
+ try {
+ dbManager.open()
+ val cursor: Cursor = dbManager.fetchTheme()
+ dbManager.close()
+ val theme: Int = cursor.getInt(0)
+ val customAccentColor: Int = cursor.getInt(1)
+ val customBackgroundColor: Int = cursor.getInt(2)
+ return arrayOf(theme, customAccentColor, customBackgroundColor)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return arrayOf(0, 0, 0)
+ }
+ }
+}
diff --git a/refilc/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableService.kt b/refilc/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableService.kt
new file mode 100644
index 0000000..7990e4b
--- /dev/null
+++ b/refilc/android/app/src/main/java/hu/refilc/naplo/widget_timetable/WidgetTimetableService.kt
@@ -0,0 +1,12 @@
+package hu.refilc.naplo.widget_timetable
+
+import android.content.Context
+import android.content.Intent
+import android.os.Build
+import android.widget.RemoteViewsService
+
+class WidgetTimetableService: RemoteViewsService() {
+ override fun onGetViewFactory(intent: Intent): RemoteViewsFactory {
+ return WidgetTimetableDataProvider(getApplicationContext(), intent)
+ }
+}
diff --git a/refilc/android/app/src/main/res/drawable-hdpi/android12splash.png b/refilc/android/app/src/main/res/drawable-hdpi/android12splash.png
new file mode 100644
index 0000000..42f64fb
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-hdpi/android12splash.png differ
diff --git a/refilc/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/refilc/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..314c878
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png differ
diff --git a/refilc/android/app/src/main/res/drawable-hdpi/ic_stat_splash_logo.png b/refilc/android/app/src/main/res/drawable-hdpi/ic_stat_splash_logo.png
new file mode 100644
index 0000000..f180cf9
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-hdpi/ic_stat_splash_logo.png differ
diff --git a/refilc/android/app/src/main/res/drawable-hdpi/splash.png b/refilc/android/app/src/main/res/drawable-hdpi/splash.png
new file mode 100644
index 0000000..42f64fb
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-hdpi/splash.png differ
diff --git a/refilc/android/app/src/main/res/drawable-hdpi/tinta_image.png b/refilc/android/app/src/main/res/drawable-hdpi/tinta_image.png
new file mode 100644
index 0000000..77f4ef2
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-hdpi/tinta_image.png differ
diff --git a/refilc/android/app/src/main/res/drawable-mdpi/android12splash.png b/refilc/android/app/src/main/res/drawable-mdpi/android12splash.png
new file mode 100644
index 0000000..65928ee
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-mdpi/android12splash.png differ
diff --git a/refilc/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png b/refilc/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..aa13b85
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png differ
diff --git a/refilc/android/app/src/main/res/drawable-mdpi/ic_stat_splash_logo.png b/refilc/android/app/src/main/res/drawable-mdpi/ic_stat_splash_logo.png
new file mode 100644
index 0000000..b6b25d1
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-mdpi/ic_stat_splash_logo.png differ
diff --git a/refilc/android/app/src/main/res/drawable-mdpi/splash.png b/refilc/android/app/src/main/res/drawable-mdpi/splash.png
new file mode 100644
index 0000000..65928ee
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-mdpi/splash.png differ
diff --git a/refilc/android/app/src/main/res/drawable-night-hdpi/android12splash.png b/refilc/android/app/src/main/res/drawable-night-hdpi/android12splash.png
new file mode 100644
index 0000000..42f64fb
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-night-hdpi/android12splash.png differ
diff --git a/refilc/android/app/src/main/res/drawable-night-mdpi/android12splash.png b/refilc/android/app/src/main/res/drawable-night-mdpi/android12splash.png
new file mode 100644
index 0000000..65928ee
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-night-mdpi/android12splash.png differ
diff --git a/refilc/android/app/src/main/res/drawable-night-xhdpi/android12splash.png b/refilc/android/app/src/main/res/drawable-night-xhdpi/android12splash.png
new file mode 100644
index 0000000..8147fe6
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-night-xhdpi/android12splash.png differ
diff --git a/refilc/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png b/refilc/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png
new file mode 100644
index 0000000..80a42fb
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png differ
diff --git a/refilc/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png b/refilc/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png
new file mode 100644
index 0000000..2148f7f
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png differ
diff --git a/refilc/android/app/src/main/res/drawable-nodpi/ic_check.xml b/refilc/android/app/src/main/res/drawable-nodpi/ic_check.xml
new file mode 100644
index 0000000..62d6723
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-nodpi/ic_check.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/refilc/android/app/src/main/res/drawable-nodpi/ic_chevron_left.xml b/refilc/android/app/src/main/res/drawable-nodpi/ic_chevron_left.xml
new file mode 100644
index 0000000..01e9d40
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-nodpi/ic_chevron_left.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/refilc/android/app/src/main/res/drawable-nodpi/ic_chevron_right.xml b/refilc/android/app/src/main/res/drawable-nodpi/ic_chevron_right.xml
new file mode 100644
index 0000000..c1e9015
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-nodpi/ic_chevron_right.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/refilc/android/app/src/main/res/drawable-nodpi/ic_droplet.xml b/refilc/android/app/src/main/res/drawable-nodpi/ic_droplet.xml
new file mode 100644
index 0000000..cc3690b
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-nodpi/ic_droplet.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/refilc/android/app/src/main/res/drawable-nodpi/ic_launcher_background.xml b/refilc/android/app/src/main/res/drawable-nodpi/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-nodpi/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/refilc/android/app/src/main/res/drawable-nodpi/ic_launcher_foreground.xml b/refilc/android/app/src/main/res/drawable-nodpi/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-nodpi/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/drawable-nodpi/ic_navigation_2.xml b/refilc/android/app/src/main/res/drawable-nodpi/ic_navigation_2.xml
new file mode 100644
index 0000000..273720c
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-nodpi/ic_navigation_2.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/refilc/android/app/src/main/res/drawable-nodpi/ic_refresh_cw.xml b/refilc/android/app/src/main/res/drawable-nodpi/ic_refresh_cw.xml
new file mode 100644
index 0000000..f2365a8
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-nodpi/ic_refresh_cw.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
diff --git a/refilc/android/app/src/main/res/drawable-v21/app_widget_background.xml b/refilc/android/app/src/main/res/drawable-v21/app_widget_background.xml
new file mode 100644
index 0000000..785445c
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-v21/app_widget_background.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/drawable-v21/app_widget_inner_view_background.xml b/refilc/android/app/src/main/res/drawable-v21/app_widget_inner_view_background.xml
new file mode 100644
index 0000000..007e287
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-v21/app_widget_inner_view_background.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/drawable-v21/background.png b/refilc/android/app/src/main/res/drawable-v21/background.png
new file mode 100644
index 0000000..d90316e
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-v21/background.png differ
diff --git a/refilc/android/app/src/main/res/drawable-v21/launch_background.xml b/refilc/android/app/src/main/res/drawable-v21/launch_background.xml
new file mode 100644
index 0000000..3cc4948
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -0,0 +1,9 @@
+
+
+ -
+
+
+ -
+
+
+
diff --git a/refilc/android/app/src/main/res/drawable-xhdpi/android12splash.png b/refilc/android/app/src/main/res/drawable-xhdpi/android12splash.png
new file mode 100644
index 0000000..8147fe6
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-xhdpi/android12splash.png differ
diff --git a/refilc/android/app/src/main/res/drawable-xhdpi/card_layout_bg.xml b/refilc/android/app/src/main/res/drawable-xhdpi/card_layout_bg.xml
new file mode 100644
index 0000000..78dab0f
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-xhdpi/card_layout_bg.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/refilc/android/app/src/main/res/drawable-xhdpi/card_layout_tile.xml b/refilc/android/app/src/main/res/drawable-xhdpi/card_layout_tile.xml
new file mode 100644
index 0000000..6466eba
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-xhdpi/card_layout_tile.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/drawable-xhdpi/card_layout_tile_elmarad.xml b/refilc/android/app/src/main/res/drawable-xhdpi/card_layout_tile_elmarad.xml
new file mode 100644
index 0000000..426d5c1
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-xhdpi/card_layout_tile_elmarad.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/drawable-xhdpi/card_layout_tile_helyetesitett.xml b/refilc/android/app/src/main/res/drawable-xhdpi/card_layout_tile_helyetesitett.xml
new file mode 100644
index 0000000..6e5cbff
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-xhdpi/card_layout_tile_helyetesitett.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png b/refilc/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..a83f396
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png differ
diff --git a/refilc/android/app/src/main/res/drawable-xhdpi/ic_stat_splash_logo.png b/refilc/android/app/src/main/res/drawable-xhdpi/ic_stat_splash_logo.png
new file mode 100644
index 0000000..7c96a2f
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-xhdpi/ic_stat_splash_logo.png differ
diff --git a/refilc/android/app/src/main/res/drawable-xhdpi/splash.png b/refilc/android/app/src/main/res/drawable-xhdpi/splash.png
new file mode 100644
index 0000000..8147fe6
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-xhdpi/splash.png differ
diff --git a/refilc/android/app/src/main/res/drawable-xhdpi/timetable_widget_preview.png b/refilc/android/app/src/main/res/drawable-xhdpi/timetable_widget_preview.png
new file mode 100644
index 0000000..7f61c65
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-xhdpi/timetable_widget_preview.png differ
diff --git a/refilc/android/app/src/main/res/drawable-xhdpi/widget_card_bottom.xml b/refilc/android/app/src/main/res/drawable-xhdpi/widget_card_bottom.xml
new file mode 100644
index 0000000..8a99162
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-xhdpi/widget_card_bottom.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/drawable-xhdpi/widget_card_bottom_dark.xml b/refilc/android/app/src/main/res/drawable-xhdpi/widget_card_bottom_dark.xml
new file mode 100644
index 0000000..d8ad4a8
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-xhdpi/widget_card_bottom_dark.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/refilc/android/app/src/main/res/drawable-xhdpi/widget_card_top.xml b/refilc/android/app/src/main/res/drawable-xhdpi/widget_card_top.xml
new file mode 100644
index 0000000..e0e9376
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-xhdpi/widget_card_top.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/drawable-xhdpi/widget_card_top_dark.xml b/refilc/android/app/src/main/res/drawable-xhdpi/widget_card_top_dark.xml
new file mode 100644
index 0000000..b17a764
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-xhdpi/widget_card_top_dark.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/refilc/android/app/src/main/res/drawable-xhdpi/widget_scroll_style.xml b/refilc/android/app/src/main/res/drawable-xhdpi/widget_scroll_style.xml
new file mode 100644
index 0000000..a8f281e
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable-xhdpi/widget_scroll_style.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/drawable-xxhdpi/android12splash.png b/refilc/android/app/src/main/res/drawable-xxhdpi/android12splash.png
new file mode 100644
index 0000000..80a42fb
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-xxhdpi/android12splash.png differ
diff --git a/refilc/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png b/refilc/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..1de7a46
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png differ
diff --git a/refilc/android/app/src/main/res/drawable-xxhdpi/ic_stat_splash_logo.png b/refilc/android/app/src/main/res/drawable-xxhdpi/ic_stat_splash_logo.png
new file mode 100644
index 0000000..b8b19e7
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-xxhdpi/ic_stat_splash_logo.png differ
diff --git a/refilc/android/app/src/main/res/drawable-xxhdpi/splash.png b/refilc/android/app/src/main/res/drawable-xxhdpi/splash.png
new file mode 100644
index 0000000..80a42fb
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-xxhdpi/splash.png differ
diff --git a/refilc/android/app/src/main/res/drawable-xxxhdpi/android12splash.png b/refilc/android/app/src/main/res/drawable-xxxhdpi/android12splash.png
new file mode 100644
index 0000000..2148f7f
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-xxxhdpi/android12splash.png differ
diff --git a/refilc/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png b/refilc/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..beeae31
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/refilc/android/app/src/main/res/drawable-xxxhdpi/ic_stat_splash_logo.png b/refilc/android/app/src/main/res/drawable-xxxhdpi/ic_stat_splash_logo.png
new file mode 100644
index 0000000..dd12562
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-xxxhdpi/ic_stat_splash_logo.png differ
diff --git a/refilc/android/app/src/main/res/drawable-xxxhdpi/splash.png b/refilc/android/app/src/main/res/drawable-xxxhdpi/splash.png
new file mode 100644
index 0000000..2148f7f
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable-xxxhdpi/splash.png differ
diff --git a/refilc/android/app/src/main/res/drawable/background.png b/refilc/android/app/src/main/res/drawable/background.png
new file mode 100644
index 0000000..d90316e
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable/background.png differ
diff --git a/refilc/android/app/src/main/res/drawable/btn_shape.xml b/refilc/android/app/src/main/res/drawable/btn_shape.xml
new file mode 100644
index 0000000..d91b3b2
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable/btn_shape.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/drawable/btn_shape_login.xml b/refilc/android/app/src/main/res/drawable/btn_shape_login.xml
new file mode 100644
index 0000000..99824d4
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable/btn_shape_login.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
diff --git a/refilc/android/app/src/main/res/drawable/ic_absences.png b/refilc/android/app/src/main/res/drawable/ic_absences.png
new file mode 100644
index 0000000..97d6a2d
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable/ic_absences.png differ
diff --git a/refilc/android/app/src/main/res/drawable/ic_grades.png b/refilc/android/app/src/main/res/drawable/ic_grades.png
new file mode 100644
index 0000000..4528dd0
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable/ic_grades.png differ
diff --git a/refilc/android/app/src/main/res/drawable/ic_home.png b/refilc/android/app/src/main/res/drawable/ic_home.png
new file mode 100644
index 0000000..1321435
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable/ic_home.png differ
diff --git a/refilc/android/app/src/main/res/drawable/ic_messages.png b/refilc/android/app/src/main/res/drawable/ic_messages.png
new file mode 100644
index 0000000..e6b5178
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable/ic_messages.png differ
diff --git a/refilc/android/app/src/main/res/drawable/ic_notification.png b/refilc/android/app/src/main/res/drawable/ic_notification.png
new file mode 100644
index 0000000..67fd370
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable/ic_notification.png differ
diff --git a/refilc/android/app/src/main/res/drawable/ic_timetable.png b/refilc/android/app/src/main/res/drawable/ic_timetable.png
new file mode 100644
index 0000000..71a4621
Binary files /dev/null and b/refilc/android/app/src/main/res/drawable/ic_timetable.png differ
diff --git a/refilc/android/app/src/main/res/drawable/launch_background.xml b/refilc/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 0000000..3cc4948
--- /dev/null
+++ b/refilc/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,9 @@
+
+
+ -
+
+
+ -
+
+
+
diff --git a/refilc/android/app/src/main/res/font/montserrat_medium.ttf b/refilc/android/app/src/main/res/font/montserrat_medium.ttf
new file mode 100644
index 0000000..6e079f6
Binary files /dev/null and b/refilc/android/app/src/main/res/font/montserrat_medium.ttf differ
diff --git a/refilc/android/app/src/main/res/ic_launcher-web.png b/refilc/android/app/src/main/res/ic_launcher-web.png
new file mode 100644
index 0000000..25ed396
Binary files /dev/null and b/refilc/android/app/src/main/res/ic_launcher-web.png differ
diff --git a/refilc/android/app/src/main/res/layout/home_widget_test.xml b/refilc/android/app/src/main/res/layout/home_widget_test.xml
new file mode 100644
index 0000000..f0a315a
--- /dev/null
+++ b/refilc/android/app/src/main/res/layout/home_widget_test.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/layout/timetable_item.xml b/refilc/android/app/src/main/res/layout/timetable_item.xml
new file mode 100644
index 0000000..f057d2d
--- /dev/null
+++ b/refilc/android/app/src/main/res/layout/timetable_item.xml
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/layout/widget_timetable.xml b/refilc/android/app/src/main/res/layout/widget_timetable.xml
new file mode 100644
index 0000000..93af688
--- /dev/null
+++ b/refilc/android/app/src/main/res/layout/widget_timetable.xml
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/refilc/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/refilc/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..4b7da89
--- /dev/null
+++ b/refilc/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/refilc/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/refilc/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..456e2d5
--- /dev/null
+++ b/refilc/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/refilc/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/refilc/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..7144abf
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png b/refilc/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png
new file mode 100644
index 0000000..75d1236
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/refilc/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..41776f7
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png b/refilc/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..135f9f0
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/refilc/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..0e55b88
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png b/refilc/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png
new file mode 100644
index 0000000..e76b647
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/refilc/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..9f106fe
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png b/refilc/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..f5106b5
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/refilc/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..83ad190
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png b/refilc/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png
new file mode 100644
index 0000000..ab6de10
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/refilc/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..d0ecde3
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png b/refilc/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..180d66c
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/refilc/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..26c3c81
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/refilc/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png
new file mode 100644
index 0000000..9f7dba9
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/refilc/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..e65a7c7
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png b/refilc/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..27ebd1f
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/refilc/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..9ef3354
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png b/refilc/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png
new file mode 100644
index 0000000..bcd2541
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/refilc/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..a6d9eab
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/refilc/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png b/refilc/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..9a3da37
Binary files /dev/null and b/refilc/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png differ
diff --git a/refilc/android/app/src/main/res/playstore-icon.png b/refilc/android/app/src/main/res/playstore-icon.png
new file mode 100644
index 0000000..25ed396
Binary files /dev/null and b/refilc/android/app/src/main/res/playstore-icon.png differ
diff --git a/refilc/android/app/src/main/res/values-night-v31/styles.xml b/refilc/android/app/src/main/res/values-night-v31/styles.xml
new file mode 100644
index 0000000..67c1d39
--- /dev/null
+++ b/refilc/android/app/src/main/res/values-night-v31/styles.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/refilc/android/app/src/main/res/values-night-v31/themes.xml b/refilc/android/app/src/main/res/values-night-v31/themes.xml
new file mode 100644
index 0000000..f253c9d
--- /dev/null
+++ b/refilc/android/app/src/main/res/values-night-v31/themes.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/values-night/styles.xml b/refilc/android/app/src/main/res/values-night/styles.xml
new file mode 100644
index 0000000..3af5c05
--- /dev/null
+++ b/refilc/android/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/values-v31/styles.xml b/refilc/android/app/src/main/res/values-v31/styles.xml
new file mode 100644
index 0000000..0d96965
--- /dev/null
+++ b/refilc/android/app/src/main/res/values-v31/styles.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/refilc/android/app/src/main/res/values-v31/themes.xml b/refilc/android/app/src/main/res/values-v31/themes.xml
new file mode 100644
index 0000000..badd306
--- /dev/null
+++ b/refilc/android/app/src/main/res/values-v31/themes.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/values/attrs.xml b/refilc/android/app/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..7781ac8
--- /dev/null
+++ b/refilc/android/app/src/main/res/values/attrs.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/values/colors.xml b/refilc/android/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..c86c230
--- /dev/null
+++ b/refilc/android/app/src/main/res/values/colors.xml
@@ -0,0 +1,69 @@
+
+
+ #3D7BF4
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #FFE1F5FE
+ #FF81D4FA
+ #FF039BE5
+ #FF01579B
+
+ #ffE8E8E8
+ #000000
+ #888C8F
+ #B9B9B9
+ #888C8F
+ #ffF4F9FF
+ #ffFFFFFF
+ #ffFF3B30
+ #40FF3B30
+ #ffFF9500
+ #ffFFCC00
+ #40FFD60A
+ #ff34C759
+ #ff3D7BF4
+ #ff5AC8FA
+ #ff007AFF
+ #ff5856D6
+ #ffAF52DE
+ #ffFF2D55
+
+
+
+ #000
+ #FFFFFFFF
+ #B9B9B9
+ #93979A
+ #A1A5A8
+ #ff000000
+ #ff141516
+ #ffFF453A
+ #40FF453A
+ #ffFF9F0A
+ #ffFFD60A
+ #40FFD60A
+ #ff32D74B
+ #ff3D7BF4
+ #ff3D93F5
+ #ff64D2FF
+ #ff0A84FF
+ #ff5E5CE6
+ #ffBF5AF2
+ #ffFF375F
+
+ #FF63B5F6
+ #FF66BB6A
+ #FF9CCC65
+ #FFFFB74C
+ #FFFF8A65
+ #FFE57373
+ #FFF06292
+ #FFBA68C8
+ #FF22AC9B
+
diff --git a/refilc/android/app/src/main/res/values/dimens.xml b/refilc/android/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..4db8c59
--- /dev/null
+++ b/refilc/android/app/src/main/res/values/dimens.xml
@@ -0,0 +1,10 @@
+
+
+
+
+ 0dp
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/values/strings.xml b/refilc/android/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..3a76198
--- /dev/null
+++ b/refilc/android/app/src/main/res/values/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Órarend Widget
+ Add widget
+ Mindig lásd, milyen órád lesz, a kezdőképernyőd kényelméből.
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/values/styles.xml b/refilc/android/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..84f2e34
--- /dev/null
+++ b/refilc/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
diff --git a/refilc/android/app/src/main/res/values/themes.xml b/refilc/android/app/src/main/res/values/themes.xml
new file mode 100644
index 0000000..f6846b8
--- /dev/null
+++ b/refilc/android/app/src/main/res/values/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/main/res/xml/home_widget_test_info.xml b/refilc/android/app/src/main/res/xml/home_widget_test_info.xml
new file mode 100644
index 0000000..bd311e0
--- /dev/null
+++ b/refilc/android/app/src/main/res/xml/home_widget_test_info.xml
@@ -0,0 +1,13 @@
+
+
\ No newline at end of file
diff --git a/refilc/android/app/src/profile/AndroidManifest.xml b/refilc/android/app/src/profile/AndroidManifest.xml
new file mode 100644
index 0000000..fcc14fa
--- /dev/null
+++ b/refilc/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/refilc/android/build.gradle b/refilc/android/build.gradle
new file mode 100644
index 0000000..851cf08
--- /dev/null
+++ b/refilc/android/build.gradle
@@ -0,0 +1,53 @@
+buildscript {
+ ext.kotlin_version = '1.8.21'
+
+ ext {
+ compileSdkVersion = 34
+ targetSdkVersion = 34
+ appCompatVersion = "1.1.0"
+ }
+
+ repositories {
+ google()
+ jcenter()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:7.1.1'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ maven {
+ // [required] background_fetch
+ url "${project(':background_fetch').projectDir}/libs"
+ }
+ }
+}
+
+subprojects {
+ afterEvaluate {project ->
+ if (project.plugins.hasPlugin('android') || project.plugins.hasPlugin('android-library')) {
+ android {
+ compileSdkVersion 34
+ buildToolsVersion '31.0.0'
+ }
+ }
+ }
+}
+
+rootProject.buildDir = '../build'
+subprojects {
+ project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+ project.evaluationDependsOn(':app')
+}
+
+tasks.register("clean", Delete) {
+ delete rootProject.buildDir
+}
\ No newline at end of file
diff --git a/refilc/android/gradle.properties b/refilc/android/gradle.properties
new file mode 100644
index 0000000..80db790
--- /dev/null
+++ b/refilc/android/gradle.properties
@@ -0,0 +1,8 @@
+org.gradle.jvmargs=-Xmx1536M \
+--add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
+--add-opens=java.base/java.lang=ALL-UNNAMED \
+--add-opens=java.base/java.lang.reflect=ALL-UNNAMED \
+--add-opens=java.base/java.io=ALL-UNNAMED \
+--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/refilc/android/gradle/wrapper/gradle-wrapper.jar b/refilc/android/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..13372ae
Binary files /dev/null and b/refilc/android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/refilc/android/gradle/wrapper/gradle-wrapper.properties b/refilc/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..a965008
--- /dev/null
+++ b/refilc/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Fri Jun 23 08:50:38 CEST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https://services.gradle.org/distributions/gradle-7.3.3-all.zip
diff --git a/refilc/android/gradlew b/refilc/android/gradlew
new file mode 100644
index 0000000..9d82f78
--- /dev/null
+++ b/refilc/android/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+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"
+ which java >/dev/null 2>&1 || 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
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/refilc/android/gradlew.bat b/refilc/android/gradlew.bat
new file mode 100644
index 0000000..8a0b282
--- /dev/null
+++ b/refilc/android/gradlew.bat
@@ -0,0 +1,90 @@
+@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
+
+@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=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+: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 %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="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!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/refilc/android/settings.gradle b/refilc/android/settings.gradle
new file mode 100644
index 0000000..44e62bc
--- /dev/null
+++ b/refilc/android/settings.gradle
@@ -0,0 +1,11 @@
+include ':app'
+
+def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
+def properties = new Properties()
+
+assert localPropertiesFile.exists()
+localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
+
+def flutterSdkPath = properties.getProperty("flutter.sdk")
+assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
diff --git a/refilc/android/settings_aar.gradle b/refilc/android/settings_aar.gradle
new file mode 100644
index 0000000..e7b4def
--- /dev/null
+++ b/refilc/android/settings_aar.gradle
@@ -0,0 +1 @@
+include ':app'
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-Black.otf b/refilc/assets/fonts/GeistMono/GeistMono-Black.otf
new file mode 100644
index 0000000..8fc2661
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-Black.otf differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-Black.woff2 b/refilc/assets/fonts/GeistMono/GeistMono-Black.woff2
new file mode 100644
index 0000000..3bbcc0c
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-Black.woff2 differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-Bold.otf b/refilc/assets/fonts/GeistMono/GeistMono-Bold.otf
new file mode 100644
index 0000000..73f0b4a
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-Bold.otf differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-Bold.woff2 b/refilc/assets/fonts/GeistMono/GeistMono-Bold.woff2
new file mode 100644
index 0000000..854b75a
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-Bold.woff2 differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-Light.otf b/refilc/assets/fonts/GeistMono/GeistMono-Light.otf
new file mode 100644
index 0000000..b552b20
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-Light.otf differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-Light.woff2 b/refilc/assets/fonts/GeistMono/GeistMono-Light.woff2
new file mode 100644
index 0000000..10457f3
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-Light.woff2 differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-Medium.otf b/refilc/assets/fonts/GeistMono/GeistMono-Medium.otf
new file mode 100644
index 0000000..99b4837
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-Medium.otf differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-Medium.woff2 b/refilc/assets/fonts/GeistMono/GeistMono-Medium.woff2
new file mode 100644
index 0000000..aaf10d7
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-Medium.woff2 differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-Regular.otf b/refilc/assets/fonts/GeistMono/GeistMono-Regular.otf
new file mode 100644
index 0000000..021235d
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-Regular.otf differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-Regular.woff2 b/refilc/assets/fonts/GeistMono/GeistMono-Regular.woff2
new file mode 100644
index 0000000..1603e0e
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-Regular.woff2 differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-SemiBold.otf b/refilc/assets/fonts/GeistMono/GeistMono-SemiBold.otf
new file mode 100644
index 0000000..3ab98ed
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-SemiBold.otf differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-SemiBold.woff2 b/refilc/assets/fonts/GeistMono/GeistMono-SemiBold.woff2
new file mode 100644
index 0000000..d973a87
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-SemiBold.woff2 differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-Thin.otf b/refilc/assets/fonts/GeistMono/GeistMono-Thin.otf
new file mode 100644
index 0000000..c66b1e2
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-Thin.otf differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-Thin.woff2 b/refilc/assets/fonts/GeistMono/GeistMono-Thin.woff2
new file mode 100644
index 0000000..649b16d
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-Thin.woff2 differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-UltraBlack.otf b/refilc/assets/fonts/GeistMono/GeistMono-UltraBlack.otf
new file mode 100644
index 0000000..319953b
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-UltraBlack.otf differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-UltraBlack.woff2 b/refilc/assets/fonts/GeistMono/GeistMono-UltraBlack.woff2
new file mode 100644
index 0000000..fa6b9f9
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-UltraBlack.woff2 differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-UltraLight.otf b/refilc/assets/fonts/GeistMono/GeistMono-UltraLight.otf
new file mode 100644
index 0000000..6531a1e
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-UltraLight.otf differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMono-UltraLight.woff2 b/refilc/assets/fonts/GeistMono/GeistMono-UltraLight.woff2
new file mode 100644
index 0000000..b13744e
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMono-UltraLight.woff2 differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMonoVariableVF.ttf b/refilc/assets/fonts/GeistMono/GeistMonoVariableVF.ttf
new file mode 100644
index 0000000..252788e
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMonoVariableVF.ttf differ
diff --git a/refilc/assets/fonts/GeistMono/GeistMonoVariableVF.woff2 b/refilc/assets/fonts/GeistMono/GeistMonoVariableVF.woff2
new file mode 100644
index 0000000..dc6d198
Binary files /dev/null and b/refilc/assets/fonts/GeistMono/GeistMonoVariableVF.woff2 differ
diff --git a/refilc/assets/svg/menu_icons/grades.svg b/refilc/assets/svg/menu_icons/grades.svg
new file mode 100644
index 0000000..cea66bd
--- /dev/null
+++ b/refilc/assets/svg/menu_icons/grades.svg
@@ -0,0 +1,3 @@
+
diff --git a/refilc/assets/svg/menu_icons/grades_selected.svg b/refilc/assets/svg/menu_icons/grades_selected.svg
new file mode 100644
index 0000000..a58eb19
--- /dev/null
+++ b/refilc/assets/svg/menu_icons/grades_selected.svg
@@ -0,0 +1,3 @@
+
diff --git a/refilc/assets/svg/menu_icons/inbox.svg b/refilc/assets/svg/menu_icons/inbox.svg
new file mode 100644
index 0000000..1a8f5bb
--- /dev/null
+++ b/refilc/assets/svg/menu_icons/inbox.svg
@@ -0,0 +1,3 @@
+
diff --git a/refilc/assets/svg/menu_icons/inbox_selected.svg b/refilc/assets/svg/menu_icons/inbox_selected.svg
new file mode 100644
index 0000000..58dc5e7
--- /dev/null
+++ b/refilc/assets/svg/menu_icons/inbox_selected.svg
@@ -0,0 +1,4 @@
+
diff --git a/refilc/assets/svg/menu_icons/notes.svg b/refilc/assets/svg/menu_icons/notes.svg
new file mode 100644
index 0000000..ecda024
--- /dev/null
+++ b/refilc/assets/svg/menu_icons/notes.svg
@@ -0,0 +1,14 @@
+
diff --git a/refilc/assets/svg/menu_icons/notes_selected.svg b/refilc/assets/svg/menu_icons/notes_selected.svg
new file mode 100644
index 0000000..170162b
--- /dev/null
+++ b/refilc/assets/svg/menu_icons/notes_selected.svg
@@ -0,0 +1,8 @@
+
diff --git a/refilc/assets/svg/menu_icons/timetable.svg b/refilc/assets/svg/menu_icons/timetable.svg
new file mode 100644
index 0000000..de2dc46
--- /dev/null
+++ b/refilc/assets/svg/menu_icons/timetable.svg
@@ -0,0 +1,5 @@
+
diff --git a/refilc/assets/svg/menu_icons/timetable_selected.svg b/refilc/assets/svg/menu_icons/timetable_selected.svg
new file mode 100644
index 0000000..3c4d13f
--- /dev/null
+++ b/refilc/assets/svg/menu_icons/timetable_selected.svg
@@ -0,0 +1,5 @@
+
diff --git a/refilc/assets/svg/menu_icons/today.svg b/refilc/assets/svg/menu_icons/today.svg
new file mode 100644
index 0000000..c7e558b
--- /dev/null
+++ b/refilc/assets/svg/menu_icons/today.svg
@@ -0,0 +1,9 @@
+
diff --git a/refilc/assets/svg/menu_icons/today_selected.svg b/refilc/assets/svg/menu_icons/today_selected.svg
new file mode 100644
index 0000000..bc7036a
--- /dev/null
+++ b/refilc/assets/svg/menu_icons/today_selected.svg
@@ -0,0 +1,5 @@
+
diff --git a/refilc/devtools_options.yaml b/refilc/devtools_options.yaml
new file mode 100644
index 0000000..7e7e7f6
--- /dev/null
+++ b/refilc/devtools_options.yaml
@@ -0,0 +1 @@
+extensions:
diff --git a/refilc/ios/Flutter/AppFrameworkInfo.plist b/refilc/ios/Flutter/AppFrameworkInfo.plist
new file mode 100644
index 0000000..9625e10
--- /dev/null
+++ b/refilc/ios/Flutter/AppFrameworkInfo.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ App
+ CFBundleIdentifier
+ io.flutter.flutter.app
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ App
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ MinimumOSVersion
+ 11.0
+
+
diff --git a/refilc/ios/Flutter/Debug.xcconfig b/refilc/ios/Flutter/Debug.xcconfig
new file mode 100644
index 0000000..ec97fc6
--- /dev/null
+++ b/refilc/ios/Flutter/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+#include "Generated.xcconfig"
diff --git a/refilc/ios/Flutter/Release.xcconfig b/refilc/ios/Flutter/Release.xcconfig
new file mode 100644
index 0000000..c4855bf
--- /dev/null
+++ b/refilc/ios/Flutter/Release.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
+#include "Generated.xcconfig"
diff --git a/refilc/ios/Podfile b/refilc/ios/Podfile
new file mode 100644
index 0000000..02d8d13
--- /dev/null
+++ b/refilc/ios/Podfile
@@ -0,0 +1,46 @@
+# Uncomment this line to define a global platform for your project
+platform :ios, '12.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug' => :debug,
+ 'Profile' => :release,
+ 'Release' => :release,
+}
+
+def flutter_root
+ generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
+ unless File.exist?(generated_xcode_build_settings_path)
+ raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
+ end
+
+ File.foreach(generated_xcode_build_settings_path) do |line|
+ matches = line.match(/FLUTTER_ROOT\=(.*)/)
+ return matches[1].strip if matches
+ end
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_ios_podfile_setup
+
+target 'Runner' do
+ use_frameworks!
+ use_modular_headers!
+
+ flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+
+ pod 'DKImagePickerController/PhotoGallery', :git => 'https://github.com/zhangao0086/DKImagePickerController.git'
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_ios_build_settings(target)
+ target.build_configurations.each do |config|
+ config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
+ end
+ end
+end
diff --git a/refilc/ios/Runner.xcodeproj/project.pbxproj b/refilc/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..3d7f9b1
--- /dev/null
+++ b/refilc/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,821 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 3127F78D28EAEDE200C2EFB3 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3127F75528EAECC800C2EFB3 /* WidgetKit.framework */; };
+ 3127F78E28EAEDE200C2EFB3 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3127F75728EAECC800C2EFB3 /* SwiftUI.framework */; };
+ 3127F79828EAEDE300C2EFB3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3127F79728EAEDE300C2EFB3 /* Assets.xcassets */; };
+ 3127F79E28EAEDE300C2EFB3 /* livecard.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 3127F78C28EAEDE200C2EFB3 /* livecard.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
+ 3127F7A428EAEE3D00C2EFB3 /* livecard.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 3127F7A328EAEE3D00C2EFB3 /* livecard.intentdefinition */; };
+ 3127F7A628EAEE5900C2EFB3 /* livecard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3127F7A528EAEE5900C2EFB3 /* livecard.swift */; };
+ 3127F7A828EAEE8500C2EFB3 /* lesson_model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3127F7A728EAEE8500C2EFB3 /* lesson_model.swift */; };
+ 373A6ECB5FC71FE9D8AF2EDB /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F0ADD56276103500A3016C8 /* Pods_Runner.framework */; };
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 3127F79C28EAEDE300C2EFB3 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 97C146E61CF9000F007C117D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 3127F78B28EAEDE200C2EFB3;
+ remoteInfo = livecardExtension;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 3127F74F28EAEC8A00C2EFB3 /* Embed Foundation Extensions */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 13;
+ files = (
+ 3127F79E28EAEDE300C2EFB3 /* livecard.appex in Embed Foundation Extensions */,
+ );
+ name = "Embed Foundation Extensions";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
+ 1F0ADD56276103500A3016C8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 3127F73928EAEC3200C2EFB3 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; };
+ 3127F73F28EAEC8A00C2EFB3 /* IntentsUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IntentsUI.framework; path = System/Library/Frameworks/IntentsUI.framework; sourceTree = SDKROOT; };
+ 3127F75528EAECC800C2EFB3 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; };
+ 3127F75728EAECC800C2EFB3 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; };
+ 3127F78C28EAEDE200C2EFB3 /* livecard.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = livecard.appex; sourceTree = BUILT_PRODUCTS_DIR; };
+ 3127F79728EAEDE300C2EFB3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 3127F79928EAEDE300C2EFB3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 3127F7A328EAEE3D00C2EFB3 /* livecard.intentdefinition */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.intentdefinition; path = livecard.intentdefinition; sourceTree = ""; };
+ 3127F7A528EAEE5900C2EFB3 /* livecard.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = livecard.swift; sourceTree = ""; tabWidth = 2; };
+ 3127F7A728EAEE8500C2EFB3 /* lesson_model.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = lesson_model.swift; sourceTree = ""; };
+ 317DE77A294F6FFB002E323E /* livecard.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = livecard.entitlements; sourceTree = ""; };
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 707F8089D970F81C480F73C4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 80777CF254888CE770D5F909 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
+ 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 98578F0EBCC6D3FF8391AAEB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 3127F78928EAEDE200C2EFB3 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3127F78E28EAEDE200C2EFB3 /* SwiftUI.framework in Frameworks */,
+ 3127F78D28EAEDE200C2EFB3 /* WidgetKit.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EB1CF9000F007C117D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 373A6ECB5FC71FE9D8AF2EDB /* Pods_Runner.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 3127F78F28EAEDE200C2EFB3 /* livecard */ = {
+ isa = PBXGroup;
+ children = (
+ 317DE77A294F6FFB002E323E /* livecard.entitlements */,
+ 3127F7A728EAEE8500C2EFB3 /* lesson_model.swift */,
+ 3127F7A328EAEE3D00C2EFB3 /* livecard.intentdefinition */,
+ 3127F79728EAEDE300C2EFB3 /* Assets.xcassets */,
+ 3127F79928EAEDE300C2EFB3 /* Info.plist */,
+ 3127F7A528EAEE5900C2EFB3 /* livecard.swift */,
+ );
+ path = livecard;
+ sourceTree = "";
+ };
+ 6640A963014A9D4F31026053 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 1F0ADD56276103500A3016C8 /* Pods_Runner.framework */,
+ 3127F73F28EAEC8A00C2EFB3 /* IntentsUI.framework */,
+ 3127F75528EAECC800C2EFB3 /* WidgetKit.framework */,
+ 3127F75728EAECC800C2EFB3 /* SwiftUI.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 91FEB6212755D596FFFFEC73 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 80777CF254888CE770D5F909 /* Pods-Runner.debug.xcconfig */,
+ 98578F0EBCC6D3FF8391AAEB /* Pods-Runner.release.xcconfig */,
+ 707F8089D970F81C480F73C4 /* Pods-Runner.profile.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
+ 9740EEB11CF90186004384FC /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */,
+ );
+ name = Flutter;
+ sourceTree = "";
+ };
+ 97C146E51CF9000F007C117D = {
+ isa = PBXGroup;
+ children = (
+ 9740EEB11CF90186004384FC /* Flutter */,
+ 97C146F01CF9000F007C117D /* Runner */,
+ 3127F78F28EAEDE200C2EFB3 /* livecard */,
+ 97C146EF1CF9000F007C117D /* Products */,
+ 91FEB6212755D596FFFFEC73 /* Pods */,
+ 6640A963014A9D4F31026053 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ 3127F78C28EAEDE200C2EFB3 /* livecard.appex */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 97C146F01CF9000F007C117D /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 3127F73928EAEC3200C2EFB3 /* Runner.entitlements */,
+ 97C146FA1CF9000F007C117D /* Main.storyboard */,
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */,
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+ 97C147021CF9000F007C117D /* Info.plist */,
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 3127F78B28EAEDE200C2EFB3 /* livecard */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 3127F79F28EAEDE300C2EFB3 /* Build configuration list for PBXNativeTarget "livecard" */;
+ buildPhases = (
+ 3127F78A28EAEDE200C2EFB3 /* Resources */,
+ 3127F78828EAEDE200C2EFB3 /* Sources */,
+ 3127F78928EAEDE200C2EFB3 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = livecard;
+ productName = livecardExtension;
+ productReference = 3127F78C28EAEDE200C2EFB3 /* livecard.appex */;
+ productType = "com.apple.product-type.app-extension";
+ };
+ 97C146ED1CF9000F007C117D /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 779338C8D92BCBC36F75F791 /* [CP] Check Pods Manifest.lock */,
+ 9740EEB61CF901F6004384FC /* Run Script */,
+ 97C146EA1CF9000F007C117D /* Sources */,
+ 97C146EB1CF9000F007C117D /* Frameworks */,
+ 97C146EC1CF9000F007C117D /* Resources */,
+ 9705A1C41CF9048500538489 /* Embed Frameworks */,
+ 3127F74F28EAEC8A00C2EFB3 /* Embed Foundation Extensions */,
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ 71459C0EB905E05018E3D78F /* [CP] Embed Pods Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 3127F79D28EAEDE300C2EFB3 /* PBXTargetDependency */,
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 97C146E61CF9000F007C117D /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastSwiftUpdateCheck = 1410;
+ LastUpgradeCheck = 1300;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 3127F78B28EAEDE200C2EFB3 = {
+ CreatedOnToolsVersion = 14.1;
+ };
+ 97C146ED1CF9000F007C117D = {
+ CreatedOnToolsVersion = 7.3.1;
+ LastSwiftMigration = 1100;
+ };
+ };
+ };
+ buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 97C146E51CF9000F007C117D;
+ productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 97C146ED1CF9000F007C117D /* Runner */,
+ 3127F78B28EAEDE200C2EFB3 /* livecard */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 3127F78A28EAEDE200C2EFB3 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3127F79828EAEDE300C2EFB3 /* Assets.xcassets in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EC1CF9000F007C117D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 12;
+ files = (
+ );
+ inputPaths = (
+ "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
+ );
+ name = "Thin Binary";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n";
+ };
+ 71459C0EB905E05018E3D78F /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 12;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 779338C8D92BCBC36F75F791 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 9740EEB61CF901F6004384FC /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 3127F78828EAEDE200C2EFB3 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3127F7A828EAEE8500C2EFB3 /* lesson_model.swift in Sources */,
+ 3127F7A428EAEE3D00C2EFB3 /* livecard.intentdefinition in Sources */,
+ 3127F7A628EAEE5900C2EFB3 /* livecard.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EA1CF9000F007C117D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 3127F79D28EAEDE300C2EFB3 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 3127F78B28EAEDE200C2EFB3 /* livecard */;
+ targetProxy = 3127F79C28EAEDE300C2EFB3 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C146FB1CF9000F007C117D /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C147001CF9000F007C117D /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 249021D3217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Profile;
+ };
+ 249021D4217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
+ CURRENT_PROJECT_VERSION = 195;
+ DEVELOPMENT_TEAM = 4DKAF249F3;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = reFilc;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 3.6.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Profile;
+ };
+ 3127F7A028EAEDE300C2EFB3 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CODE_SIGN_ENTITLEMENTS = livecard/livecard.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 238;
+ DEVELOPMENT_TEAM = 4DKAF249F3;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = livecard/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = livecard;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INFOPLIST_KEY_NSSupportsLiveActivities = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 16.1;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@executable_path/../../Frameworks",
+ );
+ MARKETING_VERSION = 4.5.1;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo.livecardpro;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 3127F7A128EAEDE300C2EFB3 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CODE_SIGN_ENTITLEMENTS = livecard/livecard.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 238;
+ DEVELOPMENT_TEAM = 4DKAF249F3;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = livecard/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = livecard;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INFOPLIST_KEY_NSSupportsLiveActivities = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 16.1;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@executable_path/../../Frameworks",
+ );
+ MARKETING_VERSION = 4.5.1;
+ MTL_FAST_MATH = YES;
+ PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo.livecardpro;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+ 3127F7A228EAEDE300C2EFB3 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CODE_SIGN_ENTITLEMENTS = livecard/livecard.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 238;
+ DEVELOPMENT_TEAM = 4DKAF249F3;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = livecard/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = livecard;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INFOPLIST_KEY_NSSupportsLiveActivities = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 16.1;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@executable_path/../../Frameworks",
+ );
+ MARKETING_VERSION = 4.5.1;
+ MTL_FAST_MATH = YES;
+ PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo.livecardpro;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Profile;
+ };
+ 97C147031CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 97C147041CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 97C147061CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
+ CURRENT_PROJECT_VERSION = 195;
+ DEVELOPMENT_TEAM = 4DKAF249F3;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = reFilc;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 3.6.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ 97C147071CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
+ CURRENT_PROJECT_VERSION = 195;
+ DEVELOPMENT_TEAM = 4DKAF249F3;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = reFilc;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 3.6.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.refilc2.naplo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 3127F79F28EAEDE300C2EFB3 /* Build configuration list for PBXNativeTarget "livecard" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 3127F7A028EAEDE300C2EFB3 /* Debug */,
+ 3127F7A128EAEDE300C2EFB3 /* Release */,
+ 3127F7A228EAEDE300C2EFB3 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147031CF9000F007C117D /* Debug */,
+ 97C147041CF9000F007C117D /* Release */,
+ 249021D3217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147061CF9000F007C117D /* Debug */,
+ 97C147071CF9000F007C117D /* Release */,
+ 249021D4217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}
diff --git a/refilc/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/refilc/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/refilc/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/refilc/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/refilc/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/refilc/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/refilc/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/refilc/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..f9b0d7c
--- /dev/null
+++ b/refilc/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/refilc/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/refilc/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 0000000..c87d15a
--- /dev/null
+++ b/refilc/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/refilc/ios/Runner.xcworkspace/contents.xcworkspacedata b/refilc/ios/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..21a3cc1
--- /dev/null
+++ b/refilc/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/refilc/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/refilc/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/refilc/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/refilc/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/refilc/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..f9b0d7c
--- /dev/null
+++ b/refilc/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/refilc/ios/Runner/AppDelegate.swift b/refilc/ios/Runner/AppDelegate.swift
new file mode 100644
index 0000000..2c4c46e
--- /dev/null
+++ b/refilc/ios/Runner/AppDelegate.swift
@@ -0,0 +1,25 @@
+import UIKit
+import Flutter
+
+@UIApplicationMain
+@objc class AppDelegate: FlutterAppDelegate {
+ override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
+ GeneratedPluginRegistrant.register(with: self)
+
+ // here, Without this code the task will not work.
+ //SwiftFlutterForegroundTaskPlugin.setPluginRegistrantCallback(registerPlugins)
+ if #available(iOS 10.0, *) {
+ UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
+ }
+
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+}
+
+// here
+func registerPlugins(registry: FlutterPluginRegistry) {
+ GeneratedPluginRegistrant.register(with: registry)
+}
diff --git a/refilc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/refilc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..1373340
--- /dev/null
+++ b/refilc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,14 @@
+{
+ "images" : [
+ {
+ "filename" : "reFilc_Logo.png",
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/refilc/ios/Runner/Assets.xcassets/AppIcon.appiconset/reFilc_Logo.png b/refilc/ios/Runner/Assets.xcassets/AppIcon.appiconset/reFilc_Logo.png
new file mode 100644
index 0000000..fad3d44
Binary files /dev/null and b/refilc/ios/Runner/Assets.xcassets/AppIcon.appiconset/reFilc_Logo.png differ
diff --git a/refilc/ios/Runner/Assets.xcassets/Contents.json b/refilc/ios/Runner/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/refilc/ios/Runner/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/refilc/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json b/refilc/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json
new file mode 100644
index 0000000..9f447e1
--- /dev/null
+++ b/refilc/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "background.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/refilc/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png b/refilc/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png
new file mode 100644
index 0000000..d90316e
Binary files /dev/null and b/refilc/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png differ
diff --git a/refilc/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/refilc/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 0000000..00cabce
--- /dev/null
+++ b/refilc/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "LaunchImage.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "LaunchImage@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "LaunchImage@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/refilc/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/refilc/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 0000000..65928ee
Binary files /dev/null and b/refilc/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/refilc/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/refilc/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 0000000..8147fe6
Binary files /dev/null and b/refilc/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/refilc/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/refilc/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 0000000..80a42fb
Binary files /dev/null and b/refilc/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/refilc/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/refilc/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 0000000..89c2725
--- /dev/null
+++ b/refilc/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/refilc/ios/Runner/Assets.xcassets/ic_absences.imageset/Contents.json b/refilc/ios/Runner/Assets.xcassets/ic_absences.imageset/Contents.json
new file mode 100644
index 0000000..2945b36
--- /dev/null
+++ b/refilc/ios/Runner/Assets.xcassets/ic_absences.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "icon.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/refilc/ios/Runner/Assets.xcassets/ic_absences.imageset/icon.png b/refilc/ios/Runner/Assets.xcassets/ic_absences.imageset/icon.png
new file mode 100644
index 0000000..ca70ec6
Binary files /dev/null and b/refilc/ios/Runner/Assets.xcassets/ic_absences.imageset/icon.png differ
diff --git a/refilc/ios/Runner/Assets.xcassets/ic_grades.imageset/Contents.json b/refilc/ios/Runner/Assets.xcassets/ic_grades.imageset/Contents.json
new file mode 100644
index 0000000..2945b36
--- /dev/null
+++ b/refilc/ios/Runner/Assets.xcassets/ic_grades.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "icon.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/refilc/ios/Runner/Assets.xcassets/ic_grades.imageset/icon.png b/refilc/ios/Runner/Assets.xcassets/ic_grades.imageset/icon.png
new file mode 100644
index 0000000..4c1c148
Binary files /dev/null and b/refilc/ios/Runner/Assets.xcassets/ic_grades.imageset/icon.png differ
diff --git a/refilc/ios/Runner/Assets.xcassets/ic_messages.imageset/Contents.json b/refilc/ios/Runner/Assets.xcassets/ic_messages.imageset/Contents.json
new file mode 100644
index 0000000..2945b36
--- /dev/null
+++ b/refilc/ios/Runner/Assets.xcassets/ic_messages.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "icon.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/refilc/ios/Runner/Assets.xcassets/ic_messages.imageset/icon.png b/refilc/ios/Runner/Assets.xcassets/ic_messages.imageset/icon.png
new file mode 100644
index 0000000..6c9c7a5
Binary files /dev/null and b/refilc/ios/Runner/Assets.xcassets/ic_messages.imageset/icon.png differ
diff --git a/refilc/ios/Runner/Assets.xcassets/ic_timetable.imageset/Contents.json b/refilc/ios/Runner/Assets.xcassets/ic_timetable.imageset/Contents.json
new file mode 100644
index 0000000..2945b36
--- /dev/null
+++ b/refilc/ios/Runner/Assets.xcassets/ic_timetable.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "icon.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/refilc/ios/Runner/Assets.xcassets/ic_timetable.imageset/icon.png b/refilc/ios/Runner/Assets.xcassets/ic_timetable.imageset/icon.png
new file mode 100644
index 0000000..da7c5fc
Binary files /dev/null and b/refilc/ios/Runner/Assets.xcassets/ic_timetable.imageset/icon.png differ
diff --git a/refilc/ios/Runner/Base.lproj/LaunchScreen.storyboard b/refilc/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..c9cac30
--- /dev/null
+++ b/refilc/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/refilc/ios/Runner/Base.lproj/Main.storyboard b/refilc/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..f3c2851
--- /dev/null
+++ b/refilc/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/refilc/ios/Runner/GoogleService-Info.plist b/refilc/ios/Runner/GoogleService-Info.plist
new file mode 100644
index 0000000..6900b48
--- /dev/null
+++ b/refilc/ios/Runner/GoogleService-Info.plist
@@ -0,0 +1,32 @@
+
+
+
+
+ ANDROID_CLIENT_ID
+ 584481527599-2cpalmvit8kl489aoj3v6t28ujcbcd62.apps.googleusercontent.com
+ API_KEY
+ AIzaSyD0Wdo2D-lUki7i1X-32ELmsl6Jn7Cuctc
+ GCM_SENDER_ID
+ 584481527599
+ PLIST_VERSION
+ 1
+ BUNDLE_ID
+ com.refilc2.naplo
+ PROJECT_ID
+ refilc-mobile-login
+ STORAGE_BUCKET
+ refilc-mobile-login.appspot.com
+ IS_ADS_ENABLED
+
+ IS_ANALYTICS_ENABLED
+
+ IS_APPINVITE_ENABLED
+
+ IS_GCM_ENABLED
+
+ IS_SIGNIN_ENABLED
+
+ GOOGLE_APP_ID
+ 1:584481527599:ios:58876c3349550a41e033da
+
+
\ No newline at end of file
diff --git a/refilc/ios/Runner/Info.plist b/refilc/ios/Runner/Info.plist
new file mode 100644
index 0000000..aa695d8
--- /dev/null
+++ b/refilc/ios/Runner/Info.plist
@@ -0,0 +1,124 @@
+
+
+
+
+ CFBundleAlternateIcons
+
+ refilc_pride
+
+ CFBundleIconFiles
+
+ refilc_pride
+
+ UIPrerenderedIcon
+
+
+ refilc_overcomplicated
+
+ CFBundleIconFiles
+
+ refilc_overcomplicated
+
+ UIPrerenderedIcon
+
+
+ refilc_concept
+
+ CFBundleIconFiles
+
+ refilc_concept
+
+ UIPrerenderedIcon
+
+
+ refilc_default
+
+ CFBundleIconFiles
+
+ refilc_default
+
+ UIPrerenderedIcon
+
+
+
+ CFBundleIcons
+
+ CFBundlePrimaryIcon
+
+ CFBundleIconName
+
+ CFBundleIconFiles
+
+
+
+ UIPrerenderedIcon
+
+
+
+ BGTaskSchedulerPermittedIdentifiers
+
+ com.transistorsoft.fetch
+
+ CADisableMinimumFrameDurationOnPhone
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ reFilc
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ ITSAppUsesNonExemptEncryption
+
+ LSApplicationQueriesSchemes
+
+ https
+ http
+
+ LSRequiresIPhoneOS
+
+ NSPhotoLibraryUsageDescription
+ The app requires the photo library to set a custom profile picture.
+ NSSupportsLiveActivities
+
+ UIApplicationSupportsIndirectInputEvents
+
+ UIBackgroundModes
+
+ fetch
+ processing
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UIStatusBarHidden
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+
+
diff --git a/refilc/ios/Runner/Runner-Bridging-Header.h b/refilc/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 0000000..308a2a5
--- /dev/null
+++ b/refilc/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/refilc/ios/Runner/Runner.entitlements b/refilc/ios/Runner/Runner.entitlements
new file mode 100644
index 0000000..8e1d462
--- /dev/null
+++ b/refilc/ios/Runner/Runner.entitlements
@@ -0,0 +1,12 @@
+
+
+
+
+ aps-environment
+ development
+ com.apple.security.application-groups
+
+ group.refilc2.livecard
+
+
+
diff --git a/refilc/ios/firebase_app_id_file.json b/refilc/ios/firebase_app_id_file.json
new file mode 100644
index 0000000..0c96296
--- /dev/null
+++ b/refilc/ios/firebase_app_id_file.json
@@ -0,0 +1,7 @@
+{
+ "file_generated_by": "FlutterFire CLI",
+ "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory",
+ "GOOGLE_APP_ID": "1:584481527599:ios:58876c3349550a41e033da",
+ "FIREBASE_PROJECT_ID": "refilc-mobile-login",
+ "GCM_SENDER_ID": "584481527599"
+}
\ No newline at end of file
diff --git a/refilc/ios/livecard/Assets.xcassets/AccentColor.colorset/Contents.json b/refilc/ios/livecard/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 0000000..eb87897
--- /dev/null
+++ b/refilc/ios/livecard/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/refilc/ios/livecard/Assets.xcassets/AppIcon.appiconset/Contents.json b/refilc/ios/livecard/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..1373340
--- /dev/null
+++ b/refilc/ios/livecard/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,14 @@
+{
+ "images" : [
+ {
+ "filename" : "reFilc_Logo.png",
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/refilc/ios/livecard/Assets.xcassets/AppIcon.appiconset/reFilc_Logo.png b/refilc/ios/livecard/Assets.xcassets/AppIcon.appiconset/reFilc_Logo.png
new file mode 100644
index 0000000..fad3d44
Binary files /dev/null and b/refilc/ios/livecard/Assets.xcassets/AppIcon.appiconset/reFilc_Logo.png differ
diff --git a/refilc/ios/livecard/Assets.xcassets/Contents.json b/refilc/ios/livecard/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/refilc/ios/livecard/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/refilc/ios/livecard/Assets.xcassets/WidgetBackground.colorset/Contents.json b/refilc/ios/livecard/Assets.xcassets/WidgetBackground.colorset/Contents.json
new file mode 100644
index 0000000..eb87897
--- /dev/null
+++ b/refilc/ios/livecard/Assets.xcassets/WidgetBackground.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/refilc/ios/livecard/Info.plist b/refilc/ios/livecard/Info.plist
new file mode 100644
index 0000000..0f118fb
--- /dev/null
+++ b/refilc/ios/livecard/Info.plist
@@ -0,0 +1,11 @@
+
+
+
+
+ NSExtension
+
+ NSExtensionPointIdentifier
+ com.apple.widgetkit-extension
+
+
+
diff --git a/refilc/ios/livecard/lesson_model.swift b/refilc/ios/livecard/lesson_model.swift
new file mode 100644
index 0000000..f098b63
--- /dev/null
+++ b/refilc/ios/livecard/lesson_model.swift
@@ -0,0 +1,31 @@
+import Foundation
+
+class LessonData {
+ var color: String
+ var icon: String
+ var index: String
+ var title: String
+ var subtitle: String
+ var description: String
+ var startDate: Date
+ var endDate: Date
+ var date: ClosedRange
+ var nextSubject: String
+ var nextRoom: String
+
+ init?() {
+ let sharedDefault = UserDefaults(suiteName: "group.refilc2.livecard")!
+
+ self.color = sharedDefault.string(forKey: "color")!
+ self.icon = sharedDefault.string(forKey: "icon")!
+ self.index = sharedDefault.string(forKey: "index")!
+ self.title = sharedDefault.string(forKey: "title")!
+ self.subtitle = sharedDefault.string(forKey: "subtitle")!
+ self.description = sharedDefault.string(forKey: "description")!
+ self.startDate = Date(timeIntervalSince1970: Double(sharedDefault.string(forKey: "startDate")!)! / 1000)
+ self.endDate = Date(timeIntervalSince1970: Double(sharedDefault.string(forKey: "endDate")!)! / 1000)
+ date = self.startDate...self.endDate
+ self.nextSubject = sharedDefault.string(forKey: "nextSubject")!
+ self.nextRoom = sharedDefault.string(forKey: "nextRoom")!
+ }
+}
diff --git a/refilc/ios/livecard/livecard.entitlements b/refilc/ios/livecard/livecard.entitlements
new file mode 100644
index 0000000..8e1d462
--- /dev/null
+++ b/refilc/ios/livecard/livecard.entitlements
@@ -0,0 +1,12 @@
+
+
+
+
+ aps-environment
+ development
+ com.apple.security.application-groups
+
+ group.refilc2.livecard
+
+
+
diff --git a/refilc/ios/livecard/livecard.intentdefinition b/refilc/ios/livecard/livecard.intentdefinition
new file mode 100644
index 0000000..bdb4045
--- /dev/null
+++ b/refilc/ios/livecard/livecard.intentdefinition
@@ -0,0 +1,59 @@
+
+
+
+
+ INEnums
+
+ INIntentDefinitionModelVersion
+ 1.2
+ INIntentDefinitionNamespace
+ 88xZPY
+ INIntentDefinitionSystemVersion
+ 20A294
+ INIntentDefinitionToolsBuildVersion
+ 12A6144
+ INIntentDefinitionToolsVersion
+ 12.0
+ INIntents
+
+
+ INIntentCategory
+ information
+ INIntentDescriptionID
+ tVvJ9c
+ INIntentEligibleForWidgets
+
+ INIntentIneligibleForSuggestions
+
+ INIntentName
+ Configuration
+ INIntentResponse
+
+ INIntentResponseCodes
+
+
+ INIntentResponseCodeName
+ success
+ INIntentResponseCodeSuccess
+
+
+
+ INIntentResponseCodeName
+ failure
+
+
+
+ INIntentTitle
+ Configuration
+ INIntentTitleID
+ gpCwrM
+ INIntentType
+ Custom
+ INIntentVerb
+ View
+
+
+ INTypes
+
+
+
diff --git a/refilc/ios/livecard/livecard.swift b/refilc/ios/livecard/livecard.swift
new file mode 100644
index 0000000..3781b3e
--- /dev/null
+++ b/refilc/ios/livecard/livecard.swift
@@ -0,0 +1,205 @@
+import ActivityKit
+import WidgetKit
+import SwiftUI
+
+@main
+struct Widgets: WidgetBundle {
+ var body: some Widget {
+ if #available(iOS 16.1, *) {
+ LiveCardWidget()
+ }
+ }
+}
+
+// Color Converter
+extension Color {
+ init(hex: String, alpha: Double = 1.0) {
+ var hexValue = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
+
+ if hexValue.hasPrefix("#") {
+ hexValue.remove(at: hexValue.startIndex)
+ }
+
+ var rgbValue: UInt64 = 0
+ Scanner(string: hexValue).scanHexInt64(&rgbValue)
+
+ let red = Double((rgbValue & 0xFF0000) >> 16) / 255.0
+ let green = Double((rgbValue & 0x00FF00) >> 8) / 255.0
+ let blue = Double(rgbValue & 0x0000FF) / 255.0
+
+ self.init(
+ .sRGB,
+ red: red,
+ green: green,
+ blue: blue,
+ opacity: alpha
+ )
+ }
+}
+
+
+// We need to redefined live activities pipe
+struct LiveActivitiesAppAttributes: ActivityAttributes, Identifiable {
+ public struct ContentState: Codable, Hashable { }
+
+ var id = UUID()
+}
+
+struct LockScreenLiveActivityView: View {
+ let context: ActivityViewContext
+
+ let lesson = LessonData()
+
+ var body: some View {
+ HStack(alignment: .center) {
+ Image(systemName: lesson!.icon)
+ .resizable()
+ .aspectRatio(contentMode: .fit)
+ .frame(width: CGFloat(30), height: CGFloat(30))
+ .padding(.leading, CGFloat(24))
+
+ VStack(alignment: .leading) {
+ HStack(alignment: .center) {
+ Text(lesson!.index + lesson!.title)
+ .font(.title3)
+ .bold()
+
+ Text(lesson!.subtitle)
+ .font(.subheadline)
+ .padding(.trailing, 12)
+ }
+
+ if (lesson!.description != "") {
+ Text(lesson!.description)
+ .font(.subheadline)
+ }
+
+ HStack {
+ Image(systemName: "arrow.right")
+ .resizable()
+ .aspectRatio(contentMode: .fit)
+ .frame(width: CGFloat(8), height: CGFloat(8))
+ Text(lesson!.nextSubject)
+ .font(.caption)
+ Text(lesson!.nextRoom)
+ .font(.caption2)
+ }
+ }.padding(15)
+
+ Spacer()
+
+ Text(timerInterval: lesson!.date, countsDown: true)
+ .multilineTextAlignment(.center)
+ .frame(width: 85)
+ .font(.title2)
+ .monospacedDigit()
+ .padding(.trailing, CGFloat(24))
+ }
+ .activityBackgroundTint(
+ lesson!.color != "#676767"
+ ? Color(hex: lesson!.color)
+ // Ha nem megy hat nem megy
+ : Color.clear
+ )
+ }
+}
+
+@available(iOSApplicationExtension 16.1, *)
+struct LiveCardWidget: Widget {
+ var body: some WidgetConfiguration {
+ /// Live Activity Notification
+ ActivityConfiguration(for: LiveActivitiesAppAttributes.self) { context in
+ LockScreenLiveActivityView(context: context)
+ /// Dynamic Island
+ } dynamicIsland: { context in
+ let lesson = LessonData()
+
+ /// Expanded
+ return DynamicIsland {
+ DynamicIslandExpandedRegion(.leading) {
+ VStack {
+ Spacer()
+ ProgressView(
+ timerInterval: lesson!.date,
+ countsDown: true,
+ label: {
+ Image(systemName: lesson!.icon)
+ .resizable()
+ .aspectRatio(contentMode: .fit)
+ .frame(width: CGFloat(32), height: CGFloat(32))
+ },
+ currentValueLabel: {
+ Image(systemName: lesson!.icon)
+ .resizable()
+ .aspectRatio(contentMode: .fit)
+ .frame(width: CGFloat(32), height: CGFloat(32))
+ }
+ ).progressViewStyle(.circular)
+ }
+ }
+ DynamicIslandExpandedRegion(.center) {
+ VStack(alignment: .leading) {
+ Text(lesson!.index + lesson!.title)
+ .lineLimit(1)
+ .font(.title3)
+ .bold()
+
+ Text(lesson!.description)
+ .lineLimit(2)
+ .font(.caption)
+ }.padding(EdgeInsets(top: 0.0, leading: 5.0, bottom: 0.0, trailing: 0.0))
+ }
+ DynamicIslandExpandedRegion(.trailing) {
+ VStack {
+ Spacer()
+ Text(lesson!.subtitle)
+ .lineLimit(1)
+ .font(.subheadline)
+ Spacer()
+ }
+ }
+
+ /// Compact
+ } compactLeading: {
+ Label {
+ Text(lesson!.title)
+ } icon: {
+ Image(systemName: lesson!.icon)
+ }
+ .font(.caption2)
+ }
+ compactTrailing: {
+ Text(timerInterval: lesson!.date, countsDown: true)
+ .multilineTextAlignment(.center)
+ .frame(width: 40)
+ .font(.caption2)
+
+ /// Collapsed
+ } minimal: {
+ VStack(alignment: .center, content: {
+ ProgressView(
+ timerInterval: lesson!.date,
+ countsDown: true,
+ label: {
+ Image(systemName: lesson!.icon)
+ .resizable()
+ .aspectRatio(contentMode: .fit)
+ .frame(width: CGFloat(12), height: CGFloat(12))
+ },
+ currentValueLabel: {
+ Image(systemName: lesson!.icon)
+ .resizable()
+ .aspectRatio(contentMode: .fit)
+ .frame(width: CGFloat(12), height: CGFloat(12))
+ }
+ ).progressViewStyle(.circular)
+ })
+ }
+ .keylineTint(
+ lesson!.color != "#676767"
+ ? Color(hex: lesson!.color)
+ : Color.clear
+ )
+ }
+ }
+}
diff --git a/refilc/lib/database/init.dart b/refilc/lib/database/init.dart
index ff5c601..3691a8c 100644
--- a/refilc/lib/database/init.dart
+++ b/refilc/lib/database/init.dart
@@ -45,11 +45,10 @@ const settingsDB = DatabaseStruct("settings", {
"show_breaks": int,
"font_family": String,
"plus_session_id": String,
- "cal_sync_room_location": String,
- "cal_sync_show_exams": int,
- "cal_sync_show_teacher": int,
- "cal_sync_renamed": int,
+ "cal_sync_room_location": String, "cal_sync_show_exams": int,
+ "cal_sync_show_teacher": int, "cal_sync_renamed": int,
"calendar_id": String,
+ "nav_shadow": int,
});
// DON'T FORGET TO UPDATE DEFAULT VALUES IN `initDB` MIGRATION OR ELSE PARENTS WILL COMPLAIN ABOUT THEIR CHILDREN MISSING
// YOU'VE BEEN WARNED!!!
diff --git a/refilc/lib/main.dart b/refilc/lib/main.dart
index 327f25e..2d341e9 100644
--- a/refilc/lib/main.dart
+++ b/refilc/lib/main.dart
@@ -15,7 +15,6 @@ import 'package:refilc/utils/service_locator.dart';
import 'package:refilc_mobile_ui/screens/error_screen.dart';
import 'package:refilc_mobile_ui/screens/error_report_screen.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
-import 'package:flutter_stripe/flutter_stripe.dart' as stripe;
// import 'package:firebase_core/firebase_core.dart';
// import 'firebase_options.dart';
@@ -35,6 +34,7 @@ void main() async {
// Custom error page
ErrorWidget.builder = errorBuilder;
+
// initialize stripe key
stripe.Stripe.publishableKey =
'pk_test_51Oo7iUBS0FxsTGxKjGZSQqzDKWHY5ZFYM9XeI0qSdIh2w8jWy6GhHlYpT7GLTzgpl1xhE5YP4BXpA4gMZqPmgMId00cGFYFzbh';
diff --git a/refilc/lib/models/settings.dart b/refilc/lib/models/settings.dart
index d238964..6e9ca8c 100644
--- a/refilc/lib/models/settings.dart
+++ b/refilc/lib/models/settings.dart
@@ -98,6 +98,7 @@ class SettingsProvider extends ChangeNotifier {
bool _calSyncShowTeacher;
bool _calSyncRenamed;
String _calendarId;
+ bool _navShadow;
SettingsProvider({
DatabaseProvider? database,
@@ -161,6 +162,7 @@ class SettingsProvider extends ChangeNotifier {
required bool calSyncShowTeacher,
required bool calSyncRenamed,
required String calendarId,
+ required bool navShadow,
}) : _database = database,
_language = language,
_startPage = startPage,
@@ -221,7 +223,8 @@ class SettingsProvider extends ChangeNotifier {
_calSyncShowExams = calSyncShowExams,
_calSyncShowTeacher = calSyncShowTeacher,
_calSyncRenamed = calSyncRenamed,
- _calendarId = calendarId;
+ _calendarId = calendarId,
+ _navShadow = navShadow;
factory SettingsProvider.fromMap(Map map,
{required DatabaseProvider database}) {
@@ -302,6 +305,7 @@ class SettingsProvider extends ChangeNotifier {
calSyncShowTeacher: map['cal_sync_show_teacher'] == 1,
calSyncRenamed: map['cal_sync_renamed'] == 1,
calendarId: map['calendar_id'],
+ navShadow: map['nav_shadow'] == 1,
);
}
@@ -370,6 +374,7 @@ class SettingsProvider extends ChangeNotifier {
"cal_sync_show_teacher": _calSyncShowTeacher ? 1 : 0,
"cal_sync_renamed": _calSyncRenamed ? 1 : 0,
"calendar_id": _calendarId,
+ "nav_shadow": _navShadow ? 1 : 0,
};
}
@@ -442,6 +447,7 @@ class SettingsProvider extends ChangeNotifier {
calSyncShowTeacher: true,
calSyncRenamed: false,
calendarId: '',
+ navShadow: true,
);
}
@@ -505,6 +511,7 @@ class SettingsProvider extends ChangeNotifier {
bool get calSyncShowTeacher => _calSyncShowTeacher;
bool get calSyncRenamed => _calSyncRenamed;
String get calendarId => _calendarId;
+ bool get navShadow => _navShadow;
Future update({
bool store = true,
@@ -564,6 +571,7 @@ class SettingsProvider extends ChangeNotifier {
bool? calSyncShowTeacher,
bool? calSyncRenamed,
String? calendarId,
+ bool? navShadow,
}) async {
if (language != null && language != _language) _language = language;
if (startPage != null && startPage != _startPage) _startPage = startPage;
@@ -731,6 +739,9 @@ class SettingsProvider extends ChangeNotifier {
if (calendarId != null && calendarId != _calendarId) {
_calendarId = calendarId;
}
+ if (navShadow != null && navShadow != _navShadow) {
+ _navShadow = navShadow;
+ }
// store or not
if (store) await _database?.store.storeSettings(this);
notifyListeners();
diff --git a/refilc/lib/theme/colors/utils.dart b/refilc/lib/theme/colors/utils.dart
new file mode 100644
index 0000000..d67d7ef
--- /dev/null
+++ b/refilc/lib/theme/colors/utils.dart
@@ -0,0 +1,22 @@
+import 'package:flutter/material.dart';
+
+class ColorsUtils {
+ Color darken(Color color, {double amount = .1}) {
+ assert(amount >= 0 && amount <= 1);
+
+ final hsl = HSLColor.fromColor(color);
+ final hslDark = hsl.withLightness((hsl.lightness - amount).clamp(0.0, 1.0));
+
+ return hslDark.toColor();
+ }
+
+ Color lighten(Color color, {double amount = .1}) {
+ assert(amount >= 0 && amount <= 1);
+
+ final hsl = HSLColor.fromColor(color);
+ final hslLight =
+ hsl.withLightness((hsl.lightness + amount).clamp(0.0, 1.0));
+
+ return hslLight.toColor();
+ }
+}
diff --git a/refilc/lib/theme/observer.dart b/refilc/lib/theme/observer.dart
index e5baaec..c8824a6 100644
--- a/refilc/lib/theme/observer.dart
+++ b/refilc/lib/theme/observer.dart
@@ -1,4 +1,20 @@
+import 'dart:io';
+
import 'package:flutter/material.dart';
+import 'package:home_widget/home_widget.dart';
+import 'package:flutter/foundation.dart';
+import 'package:flutter/services.dart';
+
+Future updateWidget() async {
+ try {
+ return HomeWidget.updateWidget(name: 'widget_timetable.WidgetTimetable');
+ } on PlatformException catch (exception) {
+ if (kDebugMode) {
+ print('Error Updating Widget After changeTheme. $exception');
+ }
+ }
+ return false;
+}
class ThemeModeObserver extends ChangeNotifier {
ThemeMode _themeMode;
@@ -13,6 +29,7 @@ class ThemeModeObserver extends ChangeNotifier {
void changeTheme(ThemeMode mode, {bool updateNavbarColor = true}) {
_themeMode = mode;
_updateNavbarColor = updateNavbarColor;
+ if (Platform.isAndroid) updateWidget();
notifyListeners();
}
}
diff --git a/refilc/lib/theme/theme.dart b/refilc/lib/theme/theme.dart
index 1c85088..4ff4a43 100644
--- a/refilc/lib/theme/theme.dart
+++ b/refilc/lib/theme/theme.dart
@@ -1,6 +1,7 @@
import 'package:refilc/models/settings.dart';
import 'package:refilc/theme/colors/accent.dart';
import 'package:refilc/theme/colors/colors.dart';
+import 'package:refilc/theme/colors/utils.dart';
import 'package:refilc/theme/observer.dart';
import 'package:flutter/material.dart';
import 'package:material_color_utilities/material_color_utilities.dart';
@@ -61,6 +62,10 @@ class AppTheme {
: _paletteHighlightLight(palette)) ??
lightColors.highlight;
+ Color newSecondary = ColorsUtils().darken(accent, amount: 0.4);
+ // Color newScaffoldBg = ColorsUtils().lighten(accent, amount: 0.4);
+ Color newTertiary = ColorsUtils().darken(accent, amount: 0.5);
+
return ThemeData(
brightness: Brightness.light,
useMaterial3: true,
@@ -74,9 +79,14 @@ class AppTheme {
onPrimary:
(accent.computeLuminance() > 0.5 ? Colors.black : Colors.white)
.withOpacity(.9),
- secondary: accent,
- onSecondary:
- (accent.computeLuminance() > 0.5 ? Colors.black : Colors.white)
+ secondary: newSecondary,
+ onSecondary: (newSecondary.computeLuminance() > 0.5
+ ? Colors.black
+ : Colors.white)
+ .withOpacity(.9),
+ tertiary: newTertiary,
+ onTertiary:
+ (newTertiary.computeLuminance() > 0.5 ? Colors.black : Colors.white)
.withOpacity(.9),
background: highlightColor,
onBackground: Colors.black.withOpacity(.9),
@@ -145,6 +155,9 @@ class AppTheme {
: _paletteHighlightDark(palette)) ??
darkColors.highlight;
+ Color newSecondary = ColorsUtils().lighten(accent, amount: 0.4);
+ Color newTertiary = ColorsUtils().lighten(accent, amount: 0.5);
+
return ThemeData(
brightness: Brightness.dark,
useMaterial3: true,
@@ -158,9 +171,14 @@ class AppTheme {
onPrimary:
(accent.computeLuminance() > 0.5 ? Colors.black : Colors.white)
.withOpacity(.9),
- secondary: accent,
- onSecondary:
- (accent.computeLuminance() > 0.5 ? Colors.black : Colors.white)
+ secondary: newSecondary,
+ onSecondary: (newSecondary.computeLuminance() > 0.5
+ ? Colors.black
+ : Colors.white)
+ .withOpacity(.9),
+ tertiary: newTertiary,
+ onTertiary:
+ (newTertiary.computeLuminance() > 0.5 ? Colors.black : Colors.white)
.withOpacity(.9),
background: highlightColor,
onBackground: Colors.white.withOpacity(.9),
diff --git a/refilc/linux/filcnaplo.desktop b/refilc/linux/filcnaplo.desktop
new file mode 100644
index 0000000..7c98deb
--- /dev/null
+++ b/refilc/linux/filcnaplo.desktop
@@ -0,0 +1,8 @@
+ [Desktop Entry]
+ Name=reFilc
+ Comment=Nem hivatalos e-napló alkalmazás az eKRÉTA rendszerhez
+ Exec=filcnaplo
+ Icon=icon.png
+ Terminal=false
+ Type=Application
+ Categories=Education;
\ No newline at end of file
diff --git a/refilc/linux/icon.png b/refilc/linux/icon.png
new file mode 100644
index 0000000..90d1850
Binary files /dev/null and b/refilc/linux/icon.png differ
diff --git a/refilc/linux/main.cc b/refilc/linux/main.cc
new file mode 100644
index 0000000..e7c5c54
--- /dev/null
+++ b/refilc/linux/main.cc
@@ -0,0 +1,6 @@
+#include "my_application.h"
+
+int main(int argc, char** argv) {
+ g_autoptr(MyApplication) app = my_application_new();
+ return g_application_run(G_APPLICATION(app), argc, argv);
+}
diff --git a/refilc/linux/my_application.cc b/refilc/linux/my_application.cc
new file mode 100644
index 0000000..8194a2a
--- /dev/null
+++ b/refilc/linux/my_application.cc
@@ -0,0 +1,104 @@
+#include "my_application.h"
+
+#include
+#ifdef GDK_WINDOWING_X11
+#include
+#endif
+
+#include "flutter/generated_plugin_registrant.h"
+
+struct _MyApplication {
+ GtkApplication parent_instance;
+ char** dart_entrypoint_arguments;
+};
+
+G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)
+
+// Implements GApplication::activate.
+static void my_application_activate(GApplication* application) {
+ MyApplication* self = MY_APPLICATION(application);
+ GtkWindow* window =
+ GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
+
+ // Use a header bar when running in GNOME as this is the common style used
+ // by applications and is the setup most users will be using (e.g. Ubuntu
+ // desktop).
+ // If running on X and not using GNOME then just use a traditional title bar
+ // in case the window manager does more exotic layout, e.g. tiling.
+ // If running on Wayland assume the header bar will work (may need changing
+ // if future cases occur).
+ gboolean use_header_bar = TRUE;
+#ifdef GDK_WINDOWING_X11
+ GdkScreen* screen = gtk_window_get_screen(window);
+ if (GDK_IS_X11_SCREEN(screen)) {
+ const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);
+ if (g_strcmp0(wm_name, "GNOME Shell") != 0) {
+ use_header_bar = FALSE;
+ }
+ }
+#endif
+ if (use_header_bar) {
+ GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
+ gtk_widget_show(GTK_WIDGET(header_bar));
+ gtk_header_bar_set_title(header_bar, "reFilc");
+ gtk_header_bar_set_show_close_button(header_bar, TRUE);
+ gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
+ } else {
+ gtk_window_set_title(window, "reFilc");
+ }
+
+ gtk_window_set_default_size(window, 1280, 720);
+ gtk_widget_show(GTK_WIDGET(window));
+
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);
+
+ FlView* view = fl_view_new(project);
+ gtk_widget_show(GTK_WIDGET(view));
+ gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
+
+ fl_register_plugins(FL_PLUGIN_REGISTRY(view));
+
+ gtk_widget_grab_focus(GTK_WIDGET(view));
+}
+
+// Implements GApplication::local_command_line.
+static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {
+ MyApplication* self = MY_APPLICATION(application);
+ // Strip out the first argument as it is the binary name.
+ self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);
+
+ g_autoptr(GError) error = nullptr;
+ if (!g_application_register(application, nullptr, &error)) {
+ g_warning("Failed to register: %s", error->message);
+ *exit_status = 1;
+ return TRUE;
+ }
+
+ g_application_activate(application);
+ *exit_status = 0;
+
+ return TRUE;
+}
+
+// Implements GObject::dispose.
+static void my_application_dispose(GObject* object) {
+ MyApplication* self = MY_APPLICATION(object);
+ g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);
+ G_OBJECT_CLASS(my_application_parent_class)->dispose(object);
+}
+
+static void my_application_class_init(MyApplicationClass* klass) {
+ G_APPLICATION_CLASS(klass)->activate = my_application_activate;
+ G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;
+ G_OBJECT_CLASS(klass)->dispose = my_application_dispose;
+}
+
+static void my_application_init(MyApplication* self) {}
+
+MyApplication* my_application_new() {
+ return MY_APPLICATION(g_object_new(my_application_get_type(),
+ "application-id", APPLICATION_ID,
+ "flags", G_APPLICATION_NON_UNIQUE,
+ nullptr));
+}
diff --git a/refilc/linux/my_application.h b/refilc/linux/my_application.h
new file mode 100644
index 0000000..72271d5
--- /dev/null
+++ b/refilc/linux/my_application.h
@@ -0,0 +1,18 @@
+#ifndef FLUTTER_MY_APPLICATION_H_
+#define FLUTTER_MY_APPLICATION_H_
+
+#include
+
+G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION,
+ GtkApplication)
+
+/**
+ * my_application_new:
+ *
+ * Creates a new Flutter-based application.
+ *
+ * Returns: a new #MyApplication.
+ */
+MyApplication* my_application_new();
+
+#endif // FLUTTER_MY_APPLICATION_H_
diff --git a/refilc/macos/Flutter/GeneratedPluginRegistrant.swift b/refilc/macos/Flutter/GeneratedPluginRegistrant.swift
new file mode 100644
index 0000000..aa7e909
--- /dev/null
+++ b/refilc/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -0,0 +1,40 @@
+//
+// Generated file. Do not edit.
+//
+
+import FlutterMacOS
+import Foundation
+
+import connectivity_plus
+import dynamic_color
+import file_selector_macos
+import flutter_any_logo
+import flutter_image_compress_macos
+import flutter_local_notifications
+import google_sign_in_ios
+import macos_window_utils
+import maps_launcher
+import package_info_plus
+import path_provider_foundation
+import rive_common
+import share_plus
+import sqflite
+import url_launcher_macos
+
+func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
+ ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin"))
+ DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
+ FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
+ FlutterAnyLogoPlugin.register(with: registry.registrar(forPlugin: "FlutterAnyLogoPlugin"))
+ FlutterImageCompressMacosPlugin.register(with: registry.registrar(forPlugin: "FlutterImageCompressMacosPlugin"))
+ FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
+ FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin"))
+ MacOSWindowUtilsPlugin.register(with: registry.registrar(forPlugin: "MacOSWindowUtilsPlugin"))
+ MapsLauncherPlugin.register(with: registry.registrar(forPlugin: "MapsLauncherPlugin"))
+ FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
+ PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
+ RivePlugin.register(with: registry.registrar(forPlugin: "RivePlugin"))
+ SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
+ SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
+ UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
+}
diff --git a/refilc/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/refilc/macos/Flutter/ephemeral/Flutter-Generated.xcconfig
new file mode 100644
index 0000000..98911a8
--- /dev/null
+++ b/refilc/macos/Flutter/ephemeral/Flutter-Generated.xcconfig
@@ -0,0 +1,11 @@
+// This is a generated file; do not edit or check into version control.
+FLUTTER_ROOT=/home/reinerrego/snap/flutter/common/flutter
+FLUTTER_APPLICATION_PATH=/media/zypherift/FileStorage/reFilc/naplo/refilc
+COCOAPODS_PARALLEL_CODE_SIGN=true
+FLUTTER_BUILD_DIR=build
+FLUTTER_BUILD_NAME=5.0.0
+FLUTTER_BUILD_NUMBER=241
+DART_OBFUSCATION=false
+TRACK_WIDGET_CREATION=true
+TREE_SHAKE_ICONS=false
+PACKAGE_CONFIG=.dart_tool/package_config.json
diff --git a/refilc/macos/Flutter/ephemeral/flutter_export_environment.sh b/refilc/macos/Flutter/ephemeral/flutter_export_environment.sh
new file mode 100644
index 0000000..e15d8a9
--- /dev/null
+++ b/refilc/macos/Flutter/ephemeral/flutter_export_environment.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+# This is a generated file; do not edit or check into version control.
+export "FLUTTER_ROOT=/home/reinerrego/snap/flutter/common/flutter"
+export "FLUTTER_APPLICATION_PATH=/media/zypherift/FileStorage/reFilc/naplo/refilc"
+export "COCOAPODS_PARALLEL_CODE_SIGN=true"
+export "FLUTTER_BUILD_DIR=build"
+export "FLUTTER_BUILD_NAME=5.0.0"
+export "FLUTTER_BUILD_NUMBER=241"
+export "DART_OBFUSCATION=false"
+export "TRACK_WIDGET_CREATION=true"
+export "TREE_SHAKE_ICONS=false"
+export "PACKAGE_CONFIG=.dart_tool/package_config.json"
diff --git a/refilc/macos/Podfile b/refilc/macos/Podfile
new file mode 100644
index 0000000..049abe2
--- /dev/null
+++ b/refilc/macos/Podfile
@@ -0,0 +1,40 @@
+platform :osx, '10.14'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug' => :debug,
+ 'Profile' => :release,
+ 'Release' => :release,
+}
+
+def flutter_root
+ generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)
+ unless File.exist?(generated_xcode_build_settings_path)
+ raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first"
+ end
+
+ File.foreach(generated_xcode_build_settings_path) do |line|
+ matches = line.match(/FLUTTER_ROOT\=(.*)/)
+ return matches[1].strip if matches
+ end
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\""
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_macos_podfile_setup
+
+target 'Runner' do
+ use_frameworks!
+ use_modular_headers!
+
+ flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_macos_build_settings(target)
+ end
+end
diff --git a/refilc/macos/Runner.xcodeproj/project.pbxproj b/refilc/macos/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..61c33df
--- /dev/null
+++ b/refilc/macos/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,670 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
+ buildPhases = (
+ 33CC111E2044C6BF0003C045 /* ShellScript */,
+ );
+ dependencies = (
+ );
+ name = "Flutter Assemble";
+ productName = FLX;
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
+ 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
+ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
+ 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
+ 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
+ 43DE217EE63035454211B258 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BB026B00EBE728C695C538A /* Pods_Runner.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 33CC111A2044C6BA0003C045;
+ remoteInfo = FLX;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 33CC110E2044A8840003C045 /* Bundle Framework */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Bundle Framework";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; };
+ 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; };
+ 33CC10ED2044A3C60003C045 /* Felt Diary.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Felt Diary.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; };
+ 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
+ 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; };
+ 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; };
+ 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; };
+ 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; };
+ 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; };
+ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; };
+ 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; };
+ 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; };
+ 72E0977D2D8959666A33F54C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; };
+ 8BB026B00EBE728C695C538A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; };
+ 9C848561CA407DAFCC1F5699 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
+ C200D9112D0A790C324733AA /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 33CC10EA2044A3C60003C045 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 43DE217EE63035454211B258 /* Pods_Runner.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 33BA886A226E78AF003329D5 /* Configs */ = {
+ isa = PBXGroup;
+ children = (
+ 33E5194F232828860026EE4D /* AppInfo.xcconfig */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
+ );
+ path = Configs;
+ sourceTree = "";
+ };
+ 33CC10E42044A3C60003C045 = {
+ isa = PBXGroup;
+ children = (
+ 33FAB671232836740065AC1E /* Runner */,
+ 33CEB47122A05771004F2AC0 /* Flutter */,
+ 33CC10EE2044A3C60003C045 /* Products */,
+ 51085A7CB06D107E9E0B55D2 /* Pods */,
+ D1EA9707C367C55447080BD3 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 33CC10EE2044A3C60003C045 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10ED2044A3C60003C045 /* Felt Diary.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 33CC11242044D66E0003C045 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10F22044A3C60003C045 /* Assets.xcassets */,
+ 33CC10F42044A3C60003C045 /* MainMenu.xib */,
+ 33CC10F72044A3C60003C045 /* Info.plist */,
+ );
+ name = Resources;
+ path = ..;
+ sourceTree = "";
+ };
+ 33CEB47122A05771004F2AC0 /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
+ 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
+ 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
+ 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
+ );
+ path = Flutter;
+ sourceTree = "";
+ };
+ 33FAB671232836740065AC1E /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10F02044A3C60003C045 /* AppDelegate.swift */,
+ 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
+ 33E51913231747F40026EE4D /* DebugProfile.entitlements */,
+ 33E51914231749380026EE4D /* Release.entitlements */,
+ 33CC11242044D66E0003C045 /* Resources */,
+ 33BA886A226E78AF003329D5 /* Configs */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+ 51085A7CB06D107E9E0B55D2 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 72E0977D2D8959666A33F54C /* Pods-Runner.debug.xcconfig */,
+ C200D9112D0A790C324733AA /* Pods-Runner.release.xcconfig */,
+ 9C848561CA407DAFCC1F5699 /* Pods-Runner.profile.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
+ D1EA9707C367C55447080BD3 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 8BB026B00EBE728C695C538A /* Pods_Runner.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 33CC10EC2044A3C60003C045 /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ FD4539A7C90013601C734851 /* [CP] Check Pods Manifest.lock */,
+ 33CC10E92044A3C60003C045 /* Sources */,
+ 33CC10EA2044A3C60003C045 /* Frameworks */,
+ 33CC10EB2044A3C60003C045 /* Resources */,
+ 33CC110E2044A8840003C045 /* Bundle Framework */,
+ 3399D490228B24CF009A79C7 /* ShellScript */,
+ 558B4163B66FBD35BF611538 /* [CP] Embed Pods Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 33CC11202044C79F0003C045 /* PBXTargetDependency */,
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 33CC10ED2044A3C60003C045 /* Felt Diary.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 33CC10E52044A3C60003C045 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastSwiftUpdateCheck = 0920;
+ LastUpgradeCheck = 1300;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 33CC10EC2044A3C60003C045 = {
+ CreatedOnToolsVersion = 9.2;
+ LastSwiftMigration = 1100;
+ SystemCapabilities = {
+ com.apple.Sandbox = {
+ enabled = 1;
+ };
+ };
+ };
+ 33CC111A2044C6BA0003C045 = {
+ CreatedOnToolsVersion = 9.2;
+ ProvisioningStyle = Manual;
+ };
+ };
+ };
+ buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 33CC10E42044A3C60003C045;
+ productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 33CC10EC2044A3C60003C045 /* Runner */,
+ 33CC111A2044C6BA0003C045 /* Flutter Assemble */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 33CC10EB2044A3C60003C045 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
+ 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3399D490228B24CF009A79C7 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ );
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
+ };
+ 33CC111E2044C6BF0003C045 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ Flutter/ephemeral/FlutterInputs.xcfilelist,
+ );
+ inputPaths = (
+ Flutter/ephemeral/tripwire,
+ );
+ outputFileListPaths = (
+ Flutter/ephemeral/FlutterOutputs.xcfilelist,
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
+ };
+ 558B4163B66FBD35BF611538 /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ FD4539A7C90013601C734851 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 33CC10E92044A3C60003C045 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,
+ 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,
+ 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 33CC11202044C79F0003C045 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
+ targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 33CC10F42044A3C60003C045 /* MainMenu.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 33CC10F52044A3C60003C045 /* Base */,
+ );
+ name = MainMenu.xib;
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 338D0CE9231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEAD_CODE_STRIPPING = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = macosx;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ };
+ name = Profile;
+ };
+ 338D0CEA231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEAD_CODE_STRIPPING = YES;
+ DEVELOPMENT_TEAM = MYUTW2GF6J;
+ INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = "reFilc";
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ NEW_SETTING = "";
+ PRODUCT_BUNDLE_IDENTIFIER = hu.filc.filcnaplo;
+ PRODUCT_NAME = "Felt Diary";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Profile;
+ };
+ 338D0CEB231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Manual;
+ DEAD_CODE_STRIPPING = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Profile;
+ };
+ 33CC10F92044A3C60003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEAD_CODE_STRIPPING = YES;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ 33CC10FA2044A3C60003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEAD_CODE_STRIPPING = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = macosx;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ };
+ name = Release;
+ };
+ 33CC10FC2044A3C60003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEAD_CODE_STRIPPING = YES;
+ DEVELOPMENT_TEAM = MYUTW2GF6J;
+ INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = "reFilc";
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ NEW_SETTING = "";
+ PRODUCT_BUNDLE_IDENTIFIER = hu.filc.filcnaplo;
+ PRODUCT_NAME = "Felt Diary";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Debug;
+ };
+ 33CC10FD2044A3C60003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEAD_CODE_STRIPPING = YES;
+ DEVELOPMENT_TEAM = MYUTW2GF6J;
+ INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = "reFilc";
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.education";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ NEW_SETTING = "";
+ PRODUCT_BUNDLE_IDENTIFIER = hu.filc.filcnaplo;
+ PRODUCT_NAME = "Felt Diary";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Release;
+ };
+ 33CC111C2044C6BA0003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Manual;
+ DEAD_CODE_STRIPPING = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 33CC111D2044C6BA0003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ DEAD_CODE_STRIPPING = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC10F92044A3C60003C045 /* Debug */,
+ 33CC10FA2044A3C60003C045 /* Release */,
+ 338D0CE9231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC10FC2044A3C60003C045 /* Debug */,
+ 33CC10FD2044A3C60003C045 /* Release */,
+ 338D0CEA231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC111C2044C6BA0003C045 /* Debug */,
+ 33CC111D2044C6BA0003C045 /* Release */,
+ 338D0CEB231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 33CC10E52044A3C60003C045 /* Project object */;
+}
diff --git a/refilc/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/refilc/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/refilc/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/refilc/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/refilc/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 0000000..f2f63a8
--- /dev/null
+++ b/refilc/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/refilc/macos/Runner.xcworkspace/contents.xcworkspacedata b/refilc/macos/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..21a3cc1
--- /dev/null
+++ b/refilc/macos/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/refilc/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/refilc/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/refilc/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/refilc/macos/Runner/AppDelegate.swift b/refilc/macos/Runner/AppDelegate.swift
new file mode 100644
index 0000000..d53ef64
--- /dev/null
+++ b/refilc/macos/Runner/AppDelegate.swift
@@ -0,0 +1,9 @@
+import Cocoa
+import FlutterMacOS
+
+@NSApplicationMain
+class AppDelegate: FlutterAppDelegate {
+ override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
+ return true
+ }
+}
diff --git a/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..a2ec33f
--- /dev/null
+++ b/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,68 @@
+{
+ "images" : [
+ {
+ "size" : "16x16",
+ "idiom" : "mac",
+ "filename" : "app_icon_16.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "16x16",
+ "idiom" : "mac",
+ "filename" : "app_icon_32.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "32x32",
+ "idiom" : "mac",
+ "filename" : "app_icon_32.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "32x32",
+ "idiom" : "mac",
+ "filename" : "app_icon_64.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "128x128",
+ "idiom" : "mac",
+ "filename" : "app_icon_128.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "128x128",
+ "idiom" : "mac",
+ "filename" : "app_icon_256.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "256x256",
+ "idiom" : "mac",
+ "filename" : "app_icon_256.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "256x256",
+ "idiom" : "mac",
+ "filename" : "app_icon_512.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "512x512",
+ "idiom" : "mac",
+ "filename" : "app_icon_512.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "512x512",
+ "idiom" : "mac",
+ "filename" : "app_icon_1024.png",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
new file mode 100644
index 0000000..82b6f9d
Binary files /dev/null and b/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ
diff --git a/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
new file mode 100644
index 0000000..13b35eb
Binary files /dev/null and b/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ
diff --git a/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
new file mode 100644
index 0000000..0a3f5fa
Binary files /dev/null and b/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ
diff --git a/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
new file mode 100644
index 0000000..bdb5722
Binary files /dev/null and b/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ
diff --git a/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
new file mode 100644
index 0000000..f083318
Binary files /dev/null and b/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ
diff --git a/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
new file mode 100644
index 0000000..326c0e7
Binary files /dev/null and b/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ
diff --git a/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
new file mode 100644
index 0000000..2f1632c
Binary files /dev/null and b/refilc/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ
diff --git a/refilc/macos/Runner/Base.lproj/MainMenu.xib b/refilc/macos/Runner/Base.lproj/MainMenu.xib
new file mode 100644
index 0000000..bbf5e2d
--- /dev/null
+++ b/refilc/macos/Runner/Base.lproj/MainMenu.xib
@@ -0,0 +1,348 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/refilc/macos/Runner/Configs/AppInfo.xcconfig b/refilc/macos/Runner/Configs/AppInfo.xcconfig
new file mode 100644
index 0000000..b86f95b
--- /dev/null
+++ b/refilc/macos/Runner/Configs/AppInfo.xcconfig
@@ -0,0 +1,14 @@
+// Application-level settings for the Runner target.
+//
+// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the
+// future. If not, the values below would default to using the project name when this becomes a
+// 'flutter create' template.
+
+// The application's name. By default this is also the title of the Flutter window.
+PRODUCT_NAME = reFilc
+
+// The application's bundle identifier
+PRODUCT_BUNDLE_IDENTIFIER = hu.refilc.naplo
+
+// The copyright displayed in application information
+PRODUCT_COPYRIGHT = reFilc
diff --git a/refilc/macos/Runner/Configs/Debug.xcconfig b/refilc/macos/Runner/Configs/Debug.xcconfig
new file mode 100644
index 0000000..36b0fd9
--- /dev/null
+++ b/refilc/macos/Runner/Configs/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Debug.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/refilc/macos/Runner/Configs/Release.xcconfig b/refilc/macos/Runner/Configs/Release.xcconfig
new file mode 100644
index 0000000..dff4f49
--- /dev/null
+++ b/refilc/macos/Runner/Configs/Release.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Release.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/refilc/macos/Runner/Configs/Warnings.xcconfig b/refilc/macos/Runner/Configs/Warnings.xcconfig
new file mode 100644
index 0000000..42bcbf4
--- /dev/null
+++ b/refilc/macos/Runner/Configs/Warnings.xcconfig
@@ -0,0 +1,13 @@
+WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings
+GCC_WARN_UNDECLARED_SELECTOR = YES
+CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES
+CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE
+CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
+CLANG_WARN_PRAGMA_PACK = YES
+CLANG_WARN_STRICT_PROTOTYPES = YES
+CLANG_WARN_COMMA = YES
+GCC_WARN_STRICT_SELECTOR_MATCH = YES
+CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES
+CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES
+GCC_WARN_SHADOW = YES
+CLANG_WARN_UNREACHABLE_CODE = YES
diff --git a/refilc/macos/Runner/DebugProfile.entitlements b/refilc/macos/Runner/DebugProfile.entitlements
new file mode 100644
index 0000000..9f5b50b
--- /dev/null
+++ b/refilc/macos/Runner/DebugProfile.entitlements
@@ -0,0 +1,16 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+ com.apple.security.cs.allow-jit
+
+ com.apple.security.files.downloads.read-write
+
+ com.apple.security.network.client
+
+ com.apple.security.network.server
+
+
+
diff --git a/refilc/macos/Runner/Info.plist b/refilc/macos/Runner/Info.plist
new file mode 100644
index 0000000..91dd316
--- /dev/null
+++ b/refilc/macos/Runner/Info.plist
@@ -0,0 +1,32 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ ${EXECUTABLE_NAME}
+ CFBundleIconFile
+
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSMinimumSystemVersion
+ $(MACOSX_DEPLOYMENT_TARGET)
+ NSHumanReadableCopyright
+ $(PRODUCT_COPYRIGHT)
+ NSMainNibFile
+ MainMenu
+ NSPrincipalClass
+ NSApplication
+
+
diff --git a/refilc/macos/Runner/MainFlutterWindow.swift b/refilc/macos/Runner/MainFlutterWindow.swift
new file mode 100644
index 0000000..4b4fe9b
--- /dev/null
+++ b/refilc/macos/Runner/MainFlutterWindow.swift
@@ -0,0 +1,19 @@
+import Cocoa
+import FlutterMacOS
+import flutter_acrylic
+
+class MainFlutterWindow: NSWindow {
+ override func awakeFromNib() {
+ let blurryContainerViewController = BlurryContainerViewController()
+ let windowFrame = self.frame
+ self.contentViewController = blurryContainerViewController
+ self.setFrame(windowFrame, display: true)
+
+ /* Initialize the flutter_acrylic plugin */
+ MainFlutterWindowManipulator.start(mainFlutterWindow: self)
+
+ RegisterGeneratedPlugins(registry: blurryContainerViewController.flutterViewController)
+
+ super.awakeFromNib()
+ }
+}
diff --git a/refilc/macos/Runner/Release.entitlements b/refilc/macos/Runner/Release.entitlements
new file mode 100644
index 0000000..8dc5725
--- /dev/null
+++ b/refilc/macos/Runner/Release.entitlements
@@ -0,0 +1,12 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+ com.apple.security.files.downloads.read-write
+
+ com.apple.security.network.client
+
+
+
diff --git a/refilc/pubspec.yaml b/refilc/pubspec.yaml
index 6d05e57..fbc9620 100644
--- a/refilc/pubspec.yaml
+++ b/refilc/pubspec.yaml
@@ -162,6 +162,11 @@ flutter:
- asset: assets/fonts/SpaceMono/SpaceMono-BoldItalic.ttf
weight: 700
style: italic
+ - family: GeistMono
+ fonts:
+ - asset: assets/fonts/GeistMono/GeistMono-Regular.otf
+ weight: 500
+
flutter_launcher_icons:
diff --git a/refilc/windows/runner/Runner.rc b/refilc/windows/runner/Runner.rc
new file mode 100644
index 0000000..51b3032
--- /dev/null
+++ b/refilc/windows/runner/Runner.rc
@@ -0,0 +1,121 @@
+// Microsoft Visual C++ generated resource script.
+//
+#pragma code_page(65001)
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "winres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (United States) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""winres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_APP_ICON ICON "resources\\app_icon.ico"
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD)
+#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD
+#else
+#define VERSION_AS_NUMBER 1,0,0,0
+#endif
+
+#if defined(FLUTTER_VERSION)
+#define VERSION_AS_STRING FLUTTER_VERSION
+#else
+#define VERSION_AS_STRING "1.0.0"
+#endif
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION VERSION_AS_NUMBER
+ PRODUCTVERSION VERSION_AS_NUMBER
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+ FILEFLAGS VS_FF_DEBUG
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS VOS__WINDOWS32
+ FILETYPE VFT_APP
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904e4"
+ BEGIN
+ VALUE "CompanyName", "hu.refilc" "\0"
+ VALUE "FileDescription", "filcnaplo" "\0"
+ VALUE "FileVersion", VERSION_AS_STRING "\0"
+ VALUE "InternalName", "filcnaplo" "\0"
+ VALUE "LegalCopyright", "Copyright (C) 2023 hu.refilc. All rights reserved." "\0"
+ VALUE "OriginalFilename", "filcnaplo.exe" "\0"
+ VALUE "ProductName", "filcnaplo" "\0"
+ VALUE "ProductVersion", VERSION_AS_STRING "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+END
+
+#endif // English (United States) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
diff --git a/refilc/windows/runner/flutter_window.cpp b/refilc/windows/runner/flutter_window.cpp
new file mode 100644
index 0000000..955ee30
--- /dev/null
+++ b/refilc/windows/runner/flutter_window.cpp
@@ -0,0 +1,71 @@
+#include "flutter_window.h"
+
+#include
+
+#include "flutter/generated_plugin_registrant.h"
+
+FlutterWindow::FlutterWindow(const flutter::DartProject& project)
+ : project_(project) {}
+
+FlutterWindow::~FlutterWindow() {}
+
+bool FlutterWindow::OnCreate() {
+ if (!Win32Window::OnCreate()) {
+ return false;
+ }
+
+ RECT frame = GetClientArea();
+
+ // The size here must match the window dimensions to avoid unnecessary surface
+ // creation / destruction in the startup path.
+ flutter_controller_ = std::make_unique(
+ frame.right - frame.left, frame.bottom - frame.top, project_);
+ // Ensure that basic setup of the controller was successful.
+ if (!flutter_controller_->engine() || !flutter_controller_->view()) {
+ return false;
+ }
+ RegisterPlugins(flutter_controller_->engine());
+ SetChildContent(flutter_controller_->view()->GetNativeWindow());
+
+ flutter_controller_->engine()->SetNextFrameCallback([&]() {
+ this->Show();
+ });
+
+ // Flutter can complete the first frame before the "show window" callback is
+ // registered. The following call ensures a frame is pending to ensure the
+ // window is shown. It is a no-op if the first frame hasn't completed yet.
+ flutter_controller_->ForceRedraw();
+
+ return true;
+}
+
+void FlutterWindow::OnDestroy() {
+ if (flutter_controller_) {
+ flutter_controller_ = nullptr;
+ }
+
+ Win32Window::OnDestroy();
+}
+
+LRESULT
+FlutterWindow::MessageHandler(HWND hwnd, UINT const message,
+ WPARAM const wparam,
+ LPARAM const lparam) noexcept {
+ // Give Flutter, including plugins, an opportunity to handle window messages.
+ if (flutter_controller_) {
+ std::optional result =
+ flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,
+ lparam);
+ if (result) {
+ return *result;
+ }
+ }
+
+ switch (message) {
+ case WM_FONTCHANGE:
+ flutter_controller_->engine()->ReloadSystemFonts();
+ break;
+ }
+
+ return Win32Window::MessageHandler(hwnd, message, wparam, lparam);
+}
diff --git a/refilc/windows/runner/flutter_window.h b/refilc/windows/runner/flutter_window.h
new file mode 100644
index 0000000..6da0652
--- /dev/null
+++ b/refilc/windows/runner/flutter_window.h
@@ -0,0 +1,33 @@
+#ifndef RUNNER_FLUTTER_WINDOW_H_
+#define RUNNER_FLUTTER_WINDOW_H_
+
+#include
+#include
+
+#include
+
+#include "win32_window.h"
+
+// A window that does nothing but host a Flutter view.
+class FlutterWindow : public Win32Window {
+ public:
+ // Creates a new FlutterWindow hosting a Flutter view running |project|.
+ explicit FlutterWindow(const flutter::DartProject& project);
+ virtual ~FlutterWindow();
+
+ protected:
+ // Win32Window:
+ bool OnCreate() override;
+ void OnDestroy() override;
+ LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam,
+ LPARAM const lparam) noexcept override;
+
+ private:
+ // The project to run.
+ flutter::DartProject project_;
+
+ // The Flutter instance hosted by this window.
+ std::unique_ptr flutter_controller_;
+};
+
+#endif // RUNNER_FLUTTER_WINDOW_H_
diff --git a/refilc/windows/runner/main.cpp b/refilc/windows/runner/main.cpp
new file mode 100644
index 0000000..2847838
--- /dev/null
+++ b/refilc/windows/runner/main.cpp
@@ -0,0 +1,43 @@
+#include
+#include
+#include
+
+#include "flutter_window.h"
+#include "utils.h"
+
+int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
+ _In_ wchar_t *command_line, _In_ int show_command) {
+ // Attach to console when present (e.g., 'flutter run') or create a
+ // new console when running with a debugger.
+ if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
+ CreateAndAttachConsole();
+ }
+
+ // Initialize COM, so that it is available for use in the library and/or
+ // plugins.
+ ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
+
+ flutter::DartProject project(L"data");
+
+ std::vector command_line_arguments =
+ GetCommandLineArguments();
+
+ project.set_dart_entrypoint_arguments(std::move(command_line_arguments));
+
+ FlutterWindow window(project);
+ Win32Window::Point origin(10, 10);
+ Win32Window::Size size(800, 720);
+ if (!window.Create(L"reFilc", origin, size)) {
+ return EXIT_FAILURE;
+ }
+ window.SetQuitOnClose(true);
+
+ ::MSG msg;
+ while (::GetMessage(&msg, nullptr, 0, 0)) {
+ ::TranslateMessage(&msg);
+ ::DispatchMessage(&msg);
+ }
+
+ ::CoUninitialize();
+ return EXIT_SUCCESS;
+}
diff --git a/refilc/windows/runner/resource.h b/refilc/windows/runner/resource.h
new file mode 100644
index 0000000..66a65d1
--- /dev/null
+++ b/refilc/windows/runner/resource.h
@@ -0,0 +1,16 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by Runner.rc
+//
+#define IDI_APP_ICON 101
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 102
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1001
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/refilc/windows/runner/resources/app_icon.ico b/refilc/windows/runner/resources/app_icon.ico
new file mode 100644
index 0000000..49c0c16
Binary files /dev/null and b/refilc/windows/runner/resources/app_icon.ico differ
diff --git a/refilc/windows/runner/runner.exe.manifest b/refilc/windows/runner/runner.exe.manifest
new file mode 100644
index 0000000..a42ea76
--- /dev/null
+++ b/refilc/windows/runner/runner.exe.manifest
@@ -0,0 +1,20 @@
+
+
+
+
+ PerMonitorV2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/refilc/windows/runner/utils.cpp b/refilc/windows/runner/utils.cpp
new file mode 100644
index 0000000..b2b0873
--- /dev/null
+++ b/refilc/windows/runner/utils.cpp
@@ -0,0 +1,65 @@
+#include "utils.h"
+
+#include
+#include
+#include
+#include
+
+#include
+
+void CreateAndAttachConsole() {
+ if (::AllocConsole()) {
+ FILE *unused;
+ if (freopen_s(&unused, "CONOUT$", "w", stdout)) {
+ _dup2(_fileno(stdout), 1);
+ }
+ if (freopen_s(&unused, "CONOUT$", "w", stderr)) {
+ _dup2(_fileno(stdout), 2);
+ }
+ std::ios::sync_with_stdio();
+ FlutterDesktopResyncOutputStreams();
+ }
+}
+
+std::vector GetCommandLineArguments() {
+ // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use.
+ int argc;
+ wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);
+ if (argv == nullptr) {
+ return std::vector();
+ }
+
+ std::vector command_line_arguments;
+
+ // Skip the first argument as it's the binary name.
+ for (int i = 1; i < argc; i++) {
+ command_line_arguments.push_back(Utf8FromUtf16(argv[i]));
+ }
+
+ ::LocalFree(argv);
+
+ return command_line_arguments;
+}
+
+std::string Utf8FromUtf16(const wchar_t* utf16_string) {
+ if (utf16_string == nullptr) {
+ return std::string();
+ }
+ int target_length = ::WideCharToMultiByte(
+ CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
+ -1, nullptr, 0, nullptr, nullptr)
+ -1; // remove the trailing null character
+ int input_length = (int)wcslen(utf16_string);
+ std::string utf8_string;
+ if (target_length <= 0 || target_length > utf8_string.max_size()) {
+ return utf8_string;
+ }
+ utf8_string.resize(target_length);
+ int converted_length = ::WideCharToMultiByte(
+ CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
+ input_length, utf8_string.data(), target_length, nullptr, nullptr);
+ if (converted_length == 0) {
+ return std::string();
+ }
+ return utf8_string;
+}
diff --git a/refilc/windows/runner/utils.h b/refilc/windows/runner/utils.h
new file mode 100644
index 0000000..3879d54
--- /dev/null
+++ b/refilc/windows/runner/utils.h
@@ -0,0 +1,19 @@
+#ifndef RUNNER_UTILS_H_
+#define RUNNER_UTILS_H_
+
+#include
+#include
+
+// Creates a console for the process, and redirects stdout and stderr to
+// it for both the runner and the Flutter library.
+void CreateAndAttachConsole();
+
+// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string
+// encoded in UTF-8. Returns an empty std::string on failure.
+std::string Utf8FromUtf16(const wchar_t* utf16_string);
+
+// Gets the command line arguments passed in as a std::vector,
+// encoded in UTF-8. Returns an empty std::vector on failure.
+std::vector GetCommandLineArguments();
+
+#endif // RUNNER_UTILS_H_
diff --git a/refilc/windows/runner/win32_window.cpp b/refilc/windows/runner/win32_window.cpp
new file mode 100644
index 0000000..60608d0
--- /dev/null
+++ b/refilc/windows/runner/win32_window.cpp
@@ -0,0 +1,288 @@
+#include "win32_window.h"
+
+#include
+#include
+
+#include "resource.h"
+
+namespace {
+
+/// Window attribute that enables dark mode window decorations.
+///
+/// Redefined in case the developer's machine has a Windows SDK older than
+/// version 10.0.22000.0.
+/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute
+#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE
+#define DWMWA_USE_IMMERSIVE_DARK_MODE 20
+#endif
+
+constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW";
+
+/// Registry key for app theme preference.
+///
+/// A value of 0 indicates apps should use dark mode. A non-zero or missing
+/// value indicates apps should use light mode.
+constexpr const wchar_t kGetPreferredBrightnessRegKey[] =
+ L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize";
+constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme";
+
+// The number of Win32Window objects that currently exist.
+static int g_active_window_count = 0;
+
+using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd);
+
+// Scale helper to convert logical scaler values to physical using passed in
+// scale factor
+int Scale(int source, double scale_factor) {
+ return static_cast(source * scale_factor);
+}
+
+// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module.
+// This API is only needed for PerMonitor V1 awareness mode.
+void EnableFullDpiSupportIfAvailable(HWND hwnd) {
+ HMODULE user32_module = LoadLibraryA("User32.dll");
+ if (!user32_module) {
+ return;
+ }
+ auto enable_non_client_dpi_scaling =
+ reinterpret_cast(
+ GetProcAddress(user32_module, "EnableNonClientDpiScaling"));
+ if (enable_non_client_dpi_scaling != nullptr) {
+ enable_non_client_dpi_scaling(hwnd);
+ }
+ FreeLibrary(user32_module);
+}
+
+} // namespace
+
+// Manages the Win32Window's window class registration.
+class WindowClassRegistrar {
+ public:
+ ~WindowClassRegistrar() = default;
+
+ // Returns the singleton registrar instance.
+ static WindowClassRegistrar* GetInstance() {
+ if (!instance_) {
+ instance_ = new WindowClassRegistrar();
+ }
+ return instance_;
+ }
+
+ // Returns the name of the window class, registering the class if it hasn't
+ // previously been registered.
+ const wchar_t* GetWindowClass();
+
+ // Unregisters the window class. Should only be called if there are no
+ // instances of the window.
+ void UnregisterWindowClass();
+
+ private:
+ WindowClassRegistrar() = default;
+
+ static WindowClassRegistrar* instance_;
+
+ bool class_registered_ = false;
+};
+
+WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr;
+
+const wchar_t* WindowClassRegistrar::GetWindowClass() {
+ if (!class_registered_) {
+ WNDCLASS window_class{};
+ window_class.hCursor = LoadCursor(nullptr, IDC_ARROW);
+ window_class.lpszClassName = kWindowClassName;
+ window_class.style = CS_HREDRAW | CS_VREDRAW;
+ window_class.cbClsExtra = 0;
+ window_class.cbWndExtra = 0;
+ window_class.hInstance = GetModuleHandle(nullptr);
+ window_class.hIcon =
+ LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));
+ window_class.hbrBackground = 0;
+ window_class.lpszMenuName = nullptr;
+ window_class.lpfnWndProc = Win32Window::WndProc;
+ RegisterClass(&window_class);
+ class_registered_ = true;
+ }
+ return kWindowClassName;
+}
+
+void WindowClassRegistrar::UnregisterWindowClass() {
+ UnregisterClass(kWindowClassName, nullptr);
+ class_registered_ = false;
+}
+
+Win32Window::Win32Window() {
+ ++g_active_window_count;
+}
+
+Win32Window::~Win32Window() {
+ --g_active_window_count;
+ Destroy();
+}
+
+bool Win32Window::Create(const std::wstring& title,
+ const Point& origin,
+ const Size& size) {
+ Destroy();
+
+ const wchar_t* window_class =
+ WindowClassRegistrar::GetInstance()->GetWindowClass();
+
+ const POINT target_point = {static_cast(origin.x),
+ static_cast(origin.y)};
+ HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);
+ UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);
+ double scale_factor = dpi / 96.0;
+
+ HWND window = CreateWindow(
+ window_class, title.c_str(), WS_OVERLAPPEDWINDOW,
+ Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
+ Scale(size.width, scale_factor), Scale(size.height, scale_factor),
+ nullptr, nullptr, GetModuleHandle(nullptr), this);
+
+ if (!window) {
+ return false;
+ }
+
+ UpdateTheme(window);
+
+ return OnCreate();
+}
+
+bool Win32Window::Show() {
+ return ShowWindow(window_handle_, SW_SHOWNORMAL);
+}
+
+// static
+LRESULT CALLBACK Win32Window::WndProc(HWND const window,
+ UINT const message,
+ WPARAM const wparam,
+ LPARAM const lparam) noexcept {
+ if (message == WM_NCCREATE) {
+ auto window_struct = reinterpret_cast(lparam);
+ SetWindowLongPtr(window, GWLP_USERDATA,
+ reinterpret_cast(window_struct->lpCreateParams));
+
+ auto that = static_cast(window_struct->lpCreateParams);
+ EnableFullDpiSupportIfAvailable(window);
+ that->window_handle_ = window;
+ } else if (Win32Window* that = GetThisFromHandle(window)) {
+ return that->MessageHandler(window, message, wparam, lparam);
+ }
+
+ return DefWindowProc(window, message, wparam, lparam);
+}
+
+LRESULT
+Win32Window::MessageHandler(HWND hwnd,
+ UINT const message,
+ WPARAM const wparam,
+ LPARAM const lparam) noexcept {
+ switch (message) {
+ case WM_DESTROY:
+ window_handle_ = nullptr;
+ Destroy();
+ if (quit_on_close_) {
+ PostQuitMessage(0);
+ }
+ return 0;
+
+ case WM_DPICHANGED: {
+ auto newRectSize = reinterpret_cast(lparam);
+ LONG newWidth = newRectSize->right - newRectSize->left;
+ LONG newHeight = newRectSize->bottom - newRectSize->top;
+
+ SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth,
+ newHeight, SWP_NOZORDER | SWP_NOACTIVATE);
+
+ return 0;
+ }
+ case WM_SIZE: {
+ RECT rect = GetClientArea();
+ if (child_content_ != nullptr) {
+ // Size and position the child window.
+ MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left,
+ rect.bottom - rect.top, TRUE);
+ }
+ return 0;
+ }
+
+ case WM_ACTIVATE:
+ if (child_content_ != nullptr) {
+ SetFocus(child_content_);
+ }
+ return 0;
+
+ case WM_DWMCOLORIZATIONCOLORCHANGED:
+ UpdateTheme(hwnd);
+ return 0;
+ }
+
+ return DefWindowProc(window_handle_, message, wparam, lparam);
+}
+
+void Win32Window::Destroy() {
+ OnDestroy();
+
+ if (window_handle_) {
+ DestroyWindow(window_handle_);
+ window_handle_ = nullptr;
+ }
+ if (g_active_window_count == 0) {
+ WindowClassRegistrar::GetInstance()->UnregisterWindowClass();
+ }
+}
+
+Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {
+ return reinterpret_cast(
+ GetWindowLongPtr(window, GWLP_USERDATA));
+}
+
+void Win32Window::SetChildContent(HWND content) {
+ child_content_ = content;
+ SetParent(content, window_handle_);
+ RECT frame = GetClientArea();
+
+ MoveWindow(content, frame.left, frame.top, frame.right - frame.left,
+ frame.bottom - frame.top, true);
+
+ SetFocus(child_content_);
+}
+
+RECT Win32Window::GetClientArea() {
+ RECT frame;
+ GetClientRect(window_handle_, &frame);
+ return frame;
+}
+
+HWND Win32Window::GetHandle() {
+ return window_handle_;
+}
+
+void Win32Window::SetQuitOnClose(bool quit_on_close) {
+ quit_on_close_ = quit_on_close;
+}
+
+bool Win32Window::OnCreate() {
+ // No-op; provided for subclasses.
+ return true;
+}
+
+void Win32Window::OnDestroy() {
+ // No-op; provided for subclasses.
+}
+
+void Win32Window::UpdateTheme(HWND const window) {
+ DWORD light_mode;
+ DWORD light_mode_size = sizeof(light_mode);
+ LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey,
+ kGetPreferredBrightnessRegValue,
+ RRF_RT_REG_DWORD, nullptr, &light_mode,
+ &light_mode_size);
+
+ if (result == ERROR_SUCCESS) {
+ BOOL enable_dark_mode = light_mode == 0;
+ DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE,
+ &enable_dark_mode, sizeof(enable_dark_mode));
+ }
+}
diff --git a/refilc/windows/runner/win32_window.h b/refilc/windows/runner/win32_window.h
new file mode 100644
index 0000000..e901dde
--- /dev/null
+++ b/refilc/windows/runner/win32_window.h
@@ -0,0 +1,102 @@
+#ifndef RUNNER_WIN32_WINDOW_H_
+#define RUNNER_WIN32_WINDOW_H_
+
+#include
+
+#include
+#include
+#include
+
+// A class abstraction for a high DPI-aware Win32 Window. Intended to be
+// inherited from by classes that wish to specialize with custom
+// rendering and input handling
+class Win32Window {
+ public:
+ struct Point {
+ unsigned int x;
+ unsigned int y;
+ Point(unsigned int x, unsigned int y) : x(x), y(y) {}
+ };
+
+ struct Size {
+ unsigned int width;
+ unsigned int height;
+ Size(unsigned int width, unsigned int height)
+ : width(width), height(height) {}
+ };
+
+ Win32Window();
+ virtual ~Win32Window();
+
+ // Creates a win32 window with |title| that is positioned and sized using
+ // |origin| and |size|. New windows are created on the default monitor. Window
+ // sizes are specified to the OS in physical pixels, hence to ensure a
+ // consistent size this function will scale the inputted width and height as
+ // as appropriate for the default monitor. The window is invisible until
+ // |Show| is called. Returns true if the window was created successfully.
+ bool Create(const std::wstring& title, const Point& origin, const Size& size);
+
+ // Show the current window. Returns true if the window was successfully shown.
+ bool Show();
+
+ // Release OS resources associated with window.
+ void Destroy();
+
+ // Inserts |content| into the window tree.
+ void SetChildContent(HWND content);
+
+ // Returns the backing Window handle to enable clients to set icon and other
+ // window properties. Returns nullptr if the window has been destroyed.
+ HWND GetHandle();
+
+ // If true, closing this window will quit the application.
+ void SetQuitOnClose(bool quit_on_close);
+
+ // Return a RECT representing the bounds of the current client area.
+ RECT GetClientArea();
+
+ protected:
+ // Processes and route salient window messages for mouse handling,
+ // size change and DPI. Delegates handling of these to member overloads that
+ // inheriting classes can handle.
+ virtual LRESULT MessageHandler(HWND window,
+ UINT const message,
+ WPARAM const wparam,
+ LPARAM const lparam) noexcept;
+
+ // Called when CreateAndShow is called, allowing subclass window-related
+ // setup. Subclasses should return false if setup fails.
+ virtual bool OnCreate();
+
+ // Called when Destroy is called.
+ virtual void OnDestroy();
+
+ private:
+ friend class WindowClassRegistrar;
+
+ // OS callback called by message pump. Handles the WM_NCCREATE message which
+ // is passed when the non-client area is being created and enables automatic
+ // non-client DPI scaling so that the non-client area automatically
+ // responds to changes in DPI. All other messages are handled by
+ // MessageHandler.
+ static LRESULT CALLBACK WndProc(HWND const window,
+ UINT const message,
+ WPARAM const wparam,
+ LPARAM const lparam) noexcept;
+
+ // Retrieves a class instance pointer for |window|
+ static Win32Window* GetThisFromHandle(HWND const window) noexcept;
+
+ // Update the window frame's theme to match the system theme.
+ static void UpdateTheme(HWND const window);
+
+ bool quit_on_close_ = false;
+
+ // window handle for top level window.
+ HWND window_handle_ = nullptr;
+
+ // window handle for hosted content.
+ HWND child_content_ = nullptr;
+};
+
+#endif // RUNNER_WIN32_WINDOW_H_
diff --git a/refilc_desktop_ui/lib/screens/settings/settings_screen.dart b/refilc_desktop_ui/lib/screens/settings/settings_screen.dart
index 8ccf7f6..ae94435 100644
--- a/refilc_desktop_ui/lib/screens/settings/settings_screen.dart
+++ b/refilc_desktop_ui/lib/screens/settings/settings_screen.dart
@@ -98,7 +98,7 @@ class _SettingsScreenState extends State
name: _firstName,
backgroundColor: Theme.of(context)
.colorScheme
- .primary, //!settings.presentationMode
+ .secondary, //!settings.presentationMode
//? ColorUtils.stringToColor(account.name)
//: Theme.of(context).colorScheme.secondary,
role: account.role,
diff --git a/refilc_mobile_ui/lib/common/filter_bar.dart b/refilc_mobile_ui/lib/common/filter_bar.dart
index 3515375..ade96a3 100644
--- a/refilc_mobile_ui/lib/common/filter_bar.dart
+++ b/refilc_mobile_ui/lib/common/filter_bar.dart
@@ -61,7 +61,7 @@ class _FilterBarState extends State {
indicatorSize: TabBarIndicatorSize.tab,
indicatorPadding: const EdgeInsets.symmetric(vertical: 8.0),
indicator: BoxDecoration(
- color: Theme.of(context).colorScheme.secondary.withOpacity(0.25),
+ color: Theme.of(context).colorScheme.secondary.withOpacity(.2),
borderRadius: BorderRadius.circular(45.0),
),
overlayColor: MaterialStateProperty.all(const Color(0x00000000)),
diff --git a/refilc_mobile_ui/lib/common/round_border_icon.dart b/refilc_mobile_ui/lib/common/round_border_icon.dart
index 330c5c5..9a6e594 100644
--- a/refilc_mobile_ui/lib/common/round_border_icon.dart
+++ b/refilc_mobile_ui/lib/common/round_border_icon.dart
@@ -1,4 +1,3 @@
-import 'package:refilc/theme/colors/colors.dart';
import 'package:flutter/material.dart';
class RoundBorderIcon extends StatelessWidget {
@@ -19,7 +18,9 @@ class RoundBorderIcon extends StatelessWidget {
return Container(
decoration: BoxDecoration(
border: Border.all(
- color: color ?? AppColors.of(context).text, width: width),
+ color: color ??
+ Theme.of(context).colorScheme.secondary.withOpacity(0.25),
+ width: width),
borderRadius: BorderRadius.circular(50.0),
),
child: Padding(
diff --git a/refilc_mobile_ui/lib/common/splitted_panel/splitted_panel.dart b/refilc_mobile_ui/lib/common/splitted_panel/splitted_panel.dart
index 89fe034..4517b48 100644
--- a/refilc_mobile_ui/lib/common/splitted_panel/splitted_panel.dart
+++ b/refilc_mobile_ui/lib/common/splitted_panel/splitted_panel.dart
@@ -53,8 +53,10 @@ class SplittedPanel extends StatelessWidget {
),
border: hasBorder
? Border.all(
- color:
- Theme.of(context).colorScheme.primary.withOpacity(.25),
+ color: Theme.of(context)
+ .colorScheme
+ .secondary
+ .withOpacity(.25),
width: 1.0)
: null,
),
diff --git a/refilc_mobile_ui/lib/common/widgets/message/message_view_tile.dart b/refilc_mobile_ui/lib/common/widgets/message/message_view_tile.dart
index 55825e8..8e80e33 100644
--- a/refilc_mobile_ui/lib/common/widgets/message/message_view_tile.dart
+++ b/refilc_mobile_ui/lib/common/widgets/message/message_view_tile.dart
@@ -91,7 +91,7 @@ class MessageViewTile extends StatelessWidget {
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16.0),
border: Border.all(
- color: Theme.of(context).colorScheme.primary.withOpacity(.25),
+ color: Theme.of(context).colorScheme.secondary.withOpacity(.25),
width: 1.0,
),
),
diff --git a/refilc_mobile_ui/lib/common/widgets/note/note_view.dart b/refilc_mobile_ui/lib/common/widgets/note/note_view.dart
index b0ffaff..865ef0d 100644
--- a/refilc_mobile_ui/lib/common/widgets/note/note_view.dart
+++ b/refilc_mobile_ui/lib/common/widgets/note/note_view.dart
@@ -1,4 +1,3 @@
-import 'package:refilc/utils/color.dart';
import 'package:refilc_kreta_api/models/note.dart';
import 'package:refilc_mobile_ui/common/profile_image/profile_image.dart';
import 'package:refilc/utils/format.dart';
@@ -31,12 +30,13 @@ class NoteView extends StatelessWidget {
: note.teacher.name) ??
'',
radius: 22.0,
- backgroundColor: ColorUtils.stringToColor(
- (note.teacher.isRenamed
- ? note.teacher.renamedTo
- : note.teacher.name) ??
- '',
- ),
+ backgroundColor: Theme.of(context).colorScheme.secondary,
+ // backgroundColor: ColorUtils.stringToColor(
+ // (note.teacher.isRenamed
+ // ? note.teacher.renamedTo
+ // : note.teacher.name) ??
+ // '',
+ // ),
),
title: Text(
note.title,
diff --git a/refilc_mobile_ui/lib/common/widgets/tick_tile.dart b/refilc_mobile_ui/lib/common/widgets/tick_tile.dart
index 36e3600..04e7a7f 100644
--- a/refilc_mobile_ui/lib/common/widgets/tick_tile.dart
+++ b/refilc_mobile_ui/lib/common/widgets/tick_tile.dart
@@ -58,7 +58,7 @@ class TickTileState extends State {
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(
- color: Theme.of(context).colorScheme.primary,
+ color: Theme.of(context).colorScheme.secondary,
width: 2.0,
),
),
@@ -67,7 +67,7 @@ class TickTileState extends State {
: Icon(
FeatherIcons.checkCircle,
size: 22.0,
- color: Theme.of(context).colorScheme.primary,
+ color: Theme.of(context).colorScheme.secondary,
),
title: Row(
children: [
diff --git a/refilc_mobile_ui/lib/pages/absences/absences_page.dart b/refilc_mobile_ui/lib/pages/absences/absences_page.dart
index 5e9c2cd..906c19a 100644
--- a/refilc_mobile_ui/lib/pages/absences/absences_page.dart
+++ b/refilc_mobile_ui/lib/pages/absences/absences_page.dart
@@ -164,7 +164,7 @@ class AbsencesPageState extends State
name: firstName,
backgroundColor: Theme.of(context)
.colorScheme
- .primary, //ColorUtils.stringToColor(user.displayName ?? "?"),
+ .secondary, //ColorUtils.stringToColor(user.displayName ?? "?"),
badge: updateProvider.available,
role: user.role,
profilePictureString: user.picture,
@@ -423,7 +423,9 @@ class AbsencesPageState extends State
child: filterWidgets[index - (activeData <= 1 ? 1 : 0)],
);
} else {
- return _tabController.index == 1 ? Empty(subtitle: "emptyDelays".i18n) : Empty(subtitle: "emptyMisses".i18n);
+ return _tabController.index == 1
+ ? Empty(subtitle: "emptyDelays".i18n)
+ : Empty(subtitle: "emptyMisses".i18n);
}
},
),
diff --git a/refilc_mobile_ui/lib/pages/grades/grades_page.dart b/refilc_mobile_ui/lib/pages/grades/grades_page.dart
index e67e526..3c40eb1 100644
--- a/refilc_mobile_ui/lib/pages/grades/grades_page.dart
+++ b/refilc_mobile_ui/lib/pages/grades/grades_page.dart
@@ -540,7 +540,7 @@ class GradesPageState extends State {
name: firstName,
backgroundColor: Theme.of(context)
.colorScheme
- .primary, //ColorUtils.stringToColor(user.displayName ?? "?"),
+ .secondary, //ColorUtils.stringToColor(user.displayName ?? "?"),
badge: updateProvider.available,
role: user.role,
profilePictureString: user.picture,
diff --git a/refilc_mobile_ui/lib/pages/home/home_page.dart b/refilc_mobile_ui/lib/pages/home/home_page.dart
index 4576514..f23ea67 100644
--- a/refilc_mobile_ui/lib/pages/home/home_page.dart
+++ b/refilc_mobile_ui/lib/pages/home/home_page.dart
@@ -252,7 +252,7 @@ class HomePageState extends State with TickerProviderStateMixin {
name: firstName,
backgroundColor: Theme.of(context)
.colorScheme
- .primary, //!settings.presentationMode
+ .secondary, //!settings.presentationMode
//? ColorUtils.stringToColor(user.displayName ?? "?")
//: Theme.of(context).colorScheme.secondary,
badge: updateProvider.available,
diff --git a/refilc_mobile_ui/lib/pages/messages/messages_page.dart b/refilc_mobile_ui/lib/pages/messages/messages_page.dart
index e08f1a7..87c9b80 100644
--- a/refilc_mobile_ui/lib/pages/messages/messages_page.dart
+++ b/refilc_mobile_ui/lib/pages/messages/messages_page.dart
@@ -105,7 +105,7 @@ class MessagesPageState extends State
name: firstName,
backgroundColor: Theme.of(context)
.colorScheme
- .primary, //ColorUtils.stringToColor(user.displayName ?? "?"),
+ .secondary, //ColorUtils.stringToColor(user.displayName ?? "?"),
badge: updateProvider.available,
role: user.role,
profilePictureString: user.picture,
diff --git a/refilc_mobile_ui/lib/pages/notes/notes_page.dart b/refilc_mobile_ui/lib/pages/notes/notes_page.dart
new file mode 100644
index 0000000..a229f71
--- /dev/null
+++ b/refilc_mobile_ui/lib/pages/notes/notes_page.dart
@@ -0,0 +1,308 @@
+// ignore_for_file: no_leading_underscores_for_local_identifiers, use_build_context_synchronously
+
+import 'dart:math';
+
+import 'package:flutter/cupertino.dart';
+import 'package:flutter_feather_icons/flutter_feather_icons.dart';
+import 'package:refilc/api/providers/database_provider.dart';
+import 'package:refilc/api/providers/self_note_provider.dart';
+import 'package:refilc/api/providers/update_provider.dart';
+import 'package:refilc/utils/format.dart';
+import 'package:refilc_kreta_api/models/absence.dart';
+import 'package:refilc_kreta_api/models/homework.dart';
+import 'package:refilc_kreta_api/models/subject.dart';
+import 'package:refilc/api/providers/user_provider.dart';
+import 'package:refilc/theme/colors/colors.dart';
+import 'package:refilc_kreta_api/providers/homework_provider.dart';
+import 'package:refilc_mobile_ui/common/empty.dart';
+import 'package:refilc_mobile_ui/common/panel/panel.dart';
+import 'package:refilc_mobile_ui/common/profile_image/profile_button.dart';
+import 'package:refilc_mobile_ui/common/profile_image/profile_image.dart';
+import 'package:refilc_mobile_ui/common/soon_alert/soon_alert.dart';
+import 'package:refilc_mobile_ui/common/widgets/tick_tile.dart';
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import 'package:refilc_mobile_ui/screens/notes/add_note_screen.dart';
+import 'package:refilc_mobile_ui/screens/notes/note_view_screen.dart';
+import 'package:refilc_mobile_ui/screens/notes/self_note_tile.dart';
+import 'package:refilc_plus/models/premium_scopes.dart';
+import 'package:refilc_plus/providers/premium_provider.dart';
+import 'package:refilc_plus/ui/mobile/premium/premium_inline.dart';
+import 'package:refilc_plus/ui/mobile/premium/upsell.dart';
+import 'notes_page.i18n.dart';
+
+enum AbsenceFilter { absences, delays, misses }
+
+class SubjectAbsence {
+ GradeSubject subject;
+ List absences;
+ double percentage;
+
+ SubjectAbsence(
+ {required this.subject, this.absences = const [], this.percentage = 0.0});
+}
+
+class NotesPage extends StatefulWidget {
+ const NotesPage({super.key});
+
+ @override
+ NotesPageState createState() => NotesPageState();
+}
+
+class NotesPageState extends State with TickerProviderStateMixin {
+ late UserProvider user;
+ late UpdateProvider updateProvider;
+ late DatabaseProvider databaseProvider;
+ late SelfNoteProvider selfNoteProvider;
+
+ late String firstName;
+
+ Map doneItems = {};
+ List noteTiles = [];
+
+ void generateTiles() async {
+ doneItems = await databaseProvider.userQuery.toDoItems(userId: user.id!);
+
+ List tiles = [];
+
+ List hw = Provider.of(context, listen: false)
+ .homework
+ .where((e) => e.deadline.isAfter(DateTime.now()))
+ // e.deadline.isBefore(DateTime(DateTime.now().year,
+ // DateTime.now().month, DateTime.now().day + 3)))
+ .toList();
+
+ // todo tiles
+ List toDoTiles = [];
+
+ if (hw.isNotEmpty &&
+ !Provider.of(context, listen: false)
+ .hasScope(PremiumScopes.unlimitedSelfNotes)) {
+ toDoTiles.addAll(hw.map((e) => TickTile(
+ padding: EdgeInsets.zero,
+ title: 'homework'.i18n,
+ description:
+ '${(e.subject.isRenamed ? e.subject.renamedTo : e.subject.name) ?? ''}, ${e.content.escapeHtml()}',
+ isTicked: doneItems[e.id] ?? false,
+ onTap: (p0) async {
+ if (!doneItems.containsKey(e.id)) {
+ doneItems.addAll({e.id: p0});
+ } else {
+ doneItems[e.id] = p0;
+ }
+ await databaseProvider.userStore
+ .storeToDoItem(doneItems, userId: user.id!);
+ },
+ )));
+ }
+
+ if (toDoTiles.isNotEmpty) {
+ tiles.add(const SizedBox(
+ height: 10.0,
+ ));
+
+ tiles.add(Panel(
+ title: Text('todo'.i18n),
+ child: Column(
+ children: toDoTiles,
+ ),
+ ));
+ }
+
+ // self notes
+ List selfNoteTiles = [];
+
+ if (selfNoteProvider.notes.isNotEmpty) {
+ selfNoteTiles.addAll(selfNoteProvider.notes.reversed.map(
+ (e) => SelfNoteTile(
+ title: e.title ?? e.content.split(' ')[0],
+ content: e.content,
+ onTap: () => Navigator.of(context, rootNavigator: true).push(
+ CupertinoPageRoute(
+ builder: (context) => NoteViewScreen(note: e))),
+ ),
+ ));
+ }
+
+ if (selfNoteTiles.isNotEmpty) {
+ // padding
+ tiles.add(const SizedBox(
+ height: 28.0,
+ ));
+
+ // actual thing
+ tiles.add(Panel(
+ title: Text('your_notes'.i18n),
+ padding: EdgeInsets.zero,
+ isTransparent: true,
+ child: Wrap(
+ spacing: 18.0,
+ runSpacing: 18.0,
+ children: selfNoteTiles,
+ ),
+ ));
+ }
+
+ // insert empty tile
+ if (tiles.isEmpty) {
+ tiles.insert(
+ 0,
+ Padding(
+ padding: const EdgeInsets.only(top: 24.0),
+ child: Empty(subtitle: "empty".i18n),
+ ),
+ );
+ }
+
+ tiles.add(Provider.of(context, listen: false).hasPremium
+ ? const SizedBox()
+ : const Padding(
+ padding: EdgeInsets.only(top: 24.0),
+ child: PremiumInline(features: [
+ PremiumInlineFeature.stats,
+ ]),
+ ));
+
+ // padding
+ tiles.add(const SizedBox(height: 32.0));
+
+ noteTiles = List.castFrom(tiles);
+
+ setState(() {});
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ user = Provider.of(context);
+ databaseProvider = Provider.of(context);
+ updateProvider = Provider.of(context);
+ selfNoteProvider = Provider.of(context);
+
+ List nameParts = user.displayName?.split(" ") ?? ["?"];
+ firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0];
+
+ generateTiles();
+
+ return Scaffold(
+ body: Padding(
+ padding: const EdgeInsets.only(top: 12.0),
+ child: NestedScrollView(
+ physics: const BouncingScrollPhysics(
+ parent: AlwaysScrollableScrollPhysics()),
+ headerSliverBuilder: (context, _) => [
+ SliverAppBar(
+ pinned: true,
+ floating: false,
+ snap: false,
+ centerTitle: false,
+ surfaceTintColor: Theme.of(context).scaffoldBackgroundColor,
+ actions: [
+ Padding(
+ padding: const EdgeInsets.symmetric(
+ horizontal: 16.0, vertical: 5.0),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.end,
+ children: [
+ GestureDetector(
+ onTap: () async {
+ SoonAlert.show(context: context);
+ },
+ child: Icon(
+ FeatherIcons.search,
+ color: AppColors.of(context).text,
+ size: 22.0,
+ ),
+ ),
+ const SizedBox(
+ width: 12.0,
+ ),
+ GestureDetector(
+ onTap: () async {
+ // handle tap
+ if (!Provider.of(context,
+ listen: false)
+ .hasScope(PremiumScopes.unlimitedSelfNotes) &&
+ noteTiles.length > 10) {
+ return PremiumLockedFeatureUpsell.show(
+ context: context,
+ feature: PremiumFeature.selfNotes);
+ }
+
+ Navigator.of(context, rootNavigator: true).push(
+ CupertinoPageRoute(
+ builder: (context) => const AddNoteScreen()));
+ },
+ child: Icon(
+ FeatherIcons.plus,
+ color: AppColors.of(context).text,
+ ),
+ ),
+ ],
+ ),
+ ),
+
+ // Profile Icon
+ Padding(
+ padding: const EdgeInsets.only(right: 24.0),
+ child: ProfileButton(
+ child: ProfileImage(
+ heroTag: "profile",
+ name: firstName,
+ backgroundColor: Theme.of(context)
+ .colorScheme
+ .secondary, //ColorUtils.stringToColor(user.displayName ?? "?"),
+ badge: updateProvider.available,
+ role: user.role,
+ profilePictureString: user.picture,
+ ),
+ ),
+ ),
+ ],
+ automaticallyImplyLeading: false,
+ shadowColor: Theme.of(context).shadowColor,
+ title: Padding(
+ padding: const EdgeInsets.only(left: 8.0),
+ child: Text(
+ "notes".i18n,
+ style: TextStyle(
+ color: AppColors.of(context).text,
+ fontSize: 32.0,
+ fontWeight: FontWeight.bold),
+ ),
+ ),
+ ),
+ ],
+ body: RefreshIndicator(
+ onRefresh: () {
+ var state = Provider.of(context, listen: false)
+ .fetch(
+ from: DateTime.now().subtract(const Duration(days: 30)));
+ Provider.of(context, listen: false).restore();
+
+ generateTiles();
+
+ return state;
+ },
+ color: Theme.of(context).colorScheme.secondary,
+ child: ListView.builder(
+ padding: EdgeInsets.zero,
+ physics: const BouncingScrollPhysics(),
+ itemCount: max(noteTiles.length, 1),
+ itemBuilder: (context, index) {
+ if (noteTiles.isNotEmpty) {
+ const EdgeInsetsGeometry panelPadding =
+ EdgeInsets.symmetric(horizontal: 24.0);
+
+ return Padding(
+ padding: panelPadding, child: noteTiles[index]);
+ } else {
+ return Container();
+ }
+ },
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/refilc_mobile_ui/lib/pages/notes/notes_page.i18n.dart b/refilc_mobile_ui/lib/pages/notes/notes_page.i18n.dart
new file mode 100644
index 0000000..7924e35
--- /dev/null
+++ b/refilc_mobile_ui/lib/pages/notes/notes_page.i18n.dart
@@ -0,0 +1,45 @@
+import 'package:i18n_extension/i18n_extension.dart';
+
+extension ScreensLocalization on String {
+ static final _t = Translations.byLocale("hu_hu") +
+ {
+ "en_en": {
+ "notes": "Notes",
+ "empty": "You don't have any notes",
+ "todo": "Tasks",
+ "homework": "Homework",
+ "new_note": "New Note",
+ "edit_note": "Edit Note",
+ "hint": "Note content...",
+ "hint_t": "Note title...",
+ "your_notes": "Your Notes",
+ },
+ "hu_hu": {
+ "notes": "Füzet",
+ "empty": "Nincsenek jegyzeteid",
+ "todo": "Feladatok",
+ "homework": "Házi feladat",
+ "new_note": "Új jegyzet",
+ "edit_note": "Jegyzet szerkesztése",
+ "hint": "Jegyzet tartalma...",
+ "hint_t": "Jegyzet címe...",
+ "your_notes": "Jegyzeteid",
+ },
+ "de_de": {
+ "notes": "Broschüre",
+ "empty": "Sie haben keine Notizen",
+ "todo": "Aufgaben",
+ "homework": "Hausaufgaben",
+ "new_note": "Neue Notiz",
+ "edit_note": "Notiz bearbeiten",
+ "hint": "Inhalt beachten...",
+ "hint_t": "Titel notieren...",
+ "your_notes": "Deine Noten",
+ },
+ };
+
+ String get i18n => localize(this, _t);
+ String fill(List