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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +