diff --git a/app/build.gradle b/app/build.gradle
index 08e69799..1e80a563 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -240,11 +240,11 @@ dependencies {
implementation "com.github.ChuckerTeam.Chucker:library:3.5.2" // https://github.com/ChuckerTeam/chucker
implementation "com.github.antonKozyriatskyi:CircularProgressIndicator:1.2.2" // https://github.com/antonKozyriatskyi/CircularProgressIndicator
implementation "com.github.bassaer:chatmessageview:2.0.1" // https://github.com/bassaer/ChatMessageView
- implementation "com.github.hypertrack:hyperlog-android:0.0.10" // https://github.com/hypertrack/hyperlog-android
implementation "com.github.smuyyh:JsonViewer:V1.0.6" // https://github.com/smuyyh/JsonViewer
implementation "com.github.underwindfall.PowerPermission:powerpermission-coroutines:1.4.0" // https://github.com/underwindfall/PowerPermission
implementation "com.github.underwindfall.PowerPermission:powerpermission:1.4.0" // https://github.com/underwindfall/PowerPermission
implementation "com.github.wulkanowy.uonet-request-signer:hebe-jvm:a99ca50a31" // https://github.com/wulkanowy/uonet-request-signer
+ implementation 'com.jakewharton.timber:timber:5.0.1'
implementation "com.jaredrummler:colorpicker:1.1.0"
implementation "io.coil-kt:coil:1.1.1"
implementation "me.dm7.barcodescanner:zxing:1.9.8"
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index c06827e5..c4b81a88 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -37,7 +37,7 @@
-keepnames class pl.szczodrzynski.edziennik.ui.widgets.luckynumber.WidgetLuckyNumberProvider
-keep class pl.szczodrzynski.edziennik.data.config.AppData { *; }
-keep class pl.szczodrzynski.edziennik.data.config.AppData$** { *; }
--keep class pl.szczodrzynski.edziennik.utils.managers.TextStylingManager$HtmlMode { *; }
+-keep class pl.szczodrzynski.edziennik.core.manager.TextStylingManager$HtmlMode { *; }
-keepnames class androidx.appcompat.view.menu.MenuBuilder { setHeaderTitleInt(java.lang.CharSequence); }
-keepnames class androidx.appcompat.view.menu.MenuPopupHelper { showPopup(int, int, boolean, boolean); }
diff --git a/app/schemas/pl.szczodrzynski.edziennik.data.db.AppDb/101.json b/app/schemas/pl.szczodrzynski.edziennik.data.db.AppDb/101.json
new file mode 100644
index 00000000..d01559a4
--- /dev/null
+++ b/app/schemas/pl.szczodrzynski.edziennik.data.db.AppDb/101.json
@@ -0,0 +1,2348 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 101,
+ "identityHash": "14e4b0e50eedd9a1f55e7f08819a9da7",
+ "entities": [
+ {
+ "tableName": "grades",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `gradeId` INTEGER NOT NULL, `gradeName` TEXT NOT NULL, `gradeType` INTEGER NOT NULL, `gradeValue` REAL NOT NULL, `gradeWeight` REAL NOT NULL, `gradeColor` INTEGER NOT NULL, `gradeCategory` TEXT, `gradeDescription` TEXT, `gradeComment` TEXT, `gradeSemester` INTEGER NOT NULL, `teacherId` INTEGER NOT NULL, `subjectId` INTEGER NOT NULL, `addedDate` INTEGER NOT NULL, `gradeValueMax` REAL, `gradeClassAverage` REAL, `gradeParentId` INTEGER, `gradeIsImprovement` INTEGER NOT NULL, `keep` INTEGER NOT NULL, PRIMARY KEY(`profileId`, `gradeId`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "gradeId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "gradeName",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "gradeType",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "value",
+ "columnName": "gradeValue",
+ "affinity": "REAL",
+ "notNull": true
+ },
+ {
+ "fieldPath": "weight",
+ "columnName": "gradeWeight",
+ "affinity": "REAL",
+ "notNull": true
+ },
+ {
+ "fieldPath": "color",
+ "columnName": "gradeColor",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "category",
+ "columnName": "gradeCategory",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "description",
+ "columnName": "gradeDescription",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "comment",
+ "columnName": "gradeComment",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "semester",
+ "columnName": "gradeSemester",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "teacherId",
+ "columnName": "teacherId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "subjectId",
+ "columnName": "subjectId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "addedDate",
+ "columnName": "addedDate",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "valueMax",
+ "columnName": "gradeValueMax",
+ "affinity": "REAL",
+ "notNull": false
+ },
+ {
+ "fieldPath": "classAverage",
+ "columnName": "gradeClassAverage",
+ "affinity": "REAL",
+ "notNull": false
+ },
+ {
+ "fieldPath": "parentId",
+ "columnName": "gradeParentId",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "isImprovement",
+ "columnName": "gradeIsImprovement",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "keep",
+ "columnName": "keep",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "gradeId"
+ ]
+ },
+ "indices": [
+ {
+ "name": "index_grades_profileId",
+ "unique": false,
+ "columnNames": [
+ "profileId"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_grades_profileId` ON `${TABLE_NAME}` (`profileId`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "teachers",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `teacherId` INTEGER NOT NULL, `teacherLoginId` TEXT, `teacherName` TEXT, `teacherSurname` TEXT, `teacherType` INTEGER NOT NULL, `teacherTypeDescription` TEXT, `teacherSubjects` TEXT NOT NULL, PRIMARY KEY(`profileId`, `teacherId`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "teacherId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "loginId",
+ "columnName": "teacherLoginId",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "teacherName",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "surname",
+ "columnName": "teacherSurname",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "teacherType",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "typeDescription",
+ "columnName": "teacherTypeDescription",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "subjects",
+ "columnName": "teacherSubjects",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "teacherId"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "teacherAbsence",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `teacherAbsenceId` INTEGER NOT NULL, `teacherAbsenceType` INTEGER NOT NULL, `teacherAbsenceName` TEXT, `teacherAbsenceDateFrom` TEXT NOT NULL, `teacherAbsenceDateTo` TEXT NOT NULL, `teacherAbsenceTimeFrom` TEXT, `teacherAbsenceTimeTo` TEXT, `teacherId` INTEGER NOT NULL, `addedDate` INTEGER NOT NULL, `keep` INTEGER NOT NULL, PRIMARY KEY(`profileId`, `teacherAbsenceId`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "teacherAbsenceId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "teacherAbsenceType",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "teacherAbsenceName",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "dateFrom",
+ "columnName": "teacherAbsenceDateFrom",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "dateTo",
+ "columnName": "teacherAbsenceDateTo",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "timeFrom",
+ "columnName": "teacherAbsenceTimeFrom",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "timeTo",
+ "columnName": "teacherAbsenceTimeTo",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "teacherId",
+ "columnName": "teacherId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "addedDate",
+ "columnName": "addedDate",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "keep",
+ "columnName": "keep",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "teacherAbsenceId"
+ ]
+ },
+ "indices": [
+ {
+ "name": "index_teacherAbsence_profileId",
+ "unique": false,
+ "columnNames": [
+ "profileId"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_teacherAbsence_profileId` ON `${TABLE_NAME}` (`profileId`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "teacherAbsenceTypes",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `teacherAbsenceTypeId` INTEGER NOT NULL, `teacherAbsenceTypeName` TEXT NOT NULL, PRIMARY KEY(`profileId`, `teacherAbsenceTypeId`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "teacherAbsenceTypeId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "teacherAbsenceTypeName",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "teacherAbsenceTypeId"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "subjects",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `subjectId` INTEGER NOT NULL, `subjectLongName` TEXT, `subjectShortName` TEXT, `subjectColor` INTEGER NOT NULL, PRIMARY KEY(`profileId`, `subjectId`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "subjectId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "longName",
+ "columnName": "subjectLongName",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "shortName",
+ "columnName": "subjectShortName",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "color",
+ "columnName": "subjectColor",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "subjectId"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "notices",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `noticeId` INTEGER NOT NULL, `noticeType` INTEGER NOT NULL, `noticeSemester` INTEGER NOT NULL, `noticeText` TEXT NOT NULL, `noticeCategory` TEXT, `noticePoints` REAL, `teacherId` INTEGER NOT NULL, `addedDate` INTEGER NOT NULL, `keep` INTEGER NOT NULL, PRIMARY KEY(`profileId`, `noticeId`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "noticeId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "noticeType",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "semester",
+ "columnName": "noticeSemester",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "text",
+ "columnName": "noticeText",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "category",
+ "columnName": "noticeCategory",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "points",
+ "columnName": "noticePoints",
+ "affinity": "REAL",
+ "notNull": false
+ },
+ {
+ "fieldPath": "teacherId",
+ "columnName": "teacherId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "addedDate",
+ "columnName": "addedDate",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "keep",
+ "columnName": "keep",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "noticeId"
+ ]
+ },
+ "indices": [
+ {
+ "name": "index_notices_profileId",
+ "unique": false,
+ "columnNames": [
+ "profileId"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_notices_profileId` ON `${TABLE_NAME}` (`profileId`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "teams",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `teamId` INTEGER NOT NULL, `teamType` INTEGER NOT NULL, `teamName` TEXT, `teamCode` TEXT, `teamTeacherId` INTEGER NOT NULL, PRIMARY KEY(`profileId`, `teamId`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "teamId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "teamType",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "teamName",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "code",
+ "columnName": "teamCode",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "teacherId",
+ "columnName": "teamTeacherId",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "teamId"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "attendances",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `attendanceId` INTEGER NOT NULL, `attendanceBaseType` INTEGER NOT NULL, `attendanceTypeName` TEXT NOT NULL, `attendanceTypeShort` TEXT NOT NULL, `attendanceTypeSymbol` TEXT NOT NULL, `attendanceTypeColor` INTEGER, `attendanceDate` TEXT NOT NULL, `attendanceTime` TEXT, `attendanceSemester` INTEGER NOT NULL, `teacherId` INTEGER NOT NULL, `subjectId` INTEGER NOT NULL, `addedDate` INTEGER NOT NULL, `attendanceLessonTopic` TEXT, `attendanceLessonNumber` INTEGER, `attendanceIsCounted` INTEGER NOT NULL, `keep` INTEGER NOT NULL, PRIMARY KEY(`profileId`, `attendanceId`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "attendanceId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "baseType",
+ "columnName": "attendanceBaseType",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "typeName",
+ "columnName": "attendanceTypeName",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "typeShort",
+ "columnName": "attendanceTypeShort",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "typeSymbol",
+ "columnName": "attendanceTypeSymbol",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "typeColor",
+ "columnName": "attendanceTypeColor",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "date",
+ "columnName": "attendanceDate",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "startTime",
+ "columnName": "attendanceTime",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "semester",
+ "columnName": "attendanceSemester",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "teacherId",
+ "columnName": "teacherId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "subjectId",
+ "columnName": "subjectId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "addedDate",
+ "columnName": "addedDate",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lessonTopic",
+ "columnName": "attendanceLessonTopic",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "lessonNumber",
+ "columnName": "attendanceLessonNumber",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "isCounted",
+ "columnName": "attendanceIsCounted",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "keep",
+ "columnName": "keep",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "attendanceId"
+ ]
+ },
+ "indices": [
+ {
+ "name": "index_attendances_profileId",
+ "unique": false,
+ "columnNames": [
+ "profileId"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_attendances_profileId` ON `${TABLE_NAME}` (`profileId`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "events",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `eventId` INTEGER NOT NULL, `eventDate` TEXT NOT NULL, `eventTime` TEXT, `eventTopic` TEXT NOT NULL, `eventColor` INTEGER, `eventType` INTEGER NOT NULL, `teacherId` INTEGER NOT NULL, `subjectId` INTEGER NOT NULL, `teamId` INTEGER NOT NULL, `addedDate` INTEGER NOT NULL, `eventAddedManually` INTEGER NOT NULL, `eventSharedBy` TEXT, `eventSharedByName` TEXT, `eventBlacklisted` INTEGER NOT NULL, `eventIsDone` INTEGER NOT NULL, `eventIsDownloaded` INTEGER NOT NULL, `homeworkBody` TEXT, `attachmentIds` TEXT, `attachmentNames` TEXT, `keep` INTEGER NOT NULL, PRIMARY KEY(`profileId`, `eventId`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "eventId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "date",
+ "columnName": "eventDate",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "time",
+ "columnName": "eventTime",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "topic",
+ "columnName": "eventTopic",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "color",
+ "columnName": "eventColor",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "eventType",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "teacherId",
+ "columnName": "teacherId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "subjectId",
+ "columnName": "subjectId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "teamId",
+ "columnName": "teamId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "addedDate",
+ "columnName": "addedDate",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "addedManually",
+ "columnName": "eventAddedManually",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "sharedBy",
+ "columnName": "eventSharedBy",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "sharedByName",
+ "columnName": "eventSharedByName",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "blacklisted",
+ "columnName": "eventBlacklisted",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "isDone",
+ "columnName": "eventIsDone",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "isDownloaded",
+ "columnName": "eventIsDownloaded",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "homeworkBody",
+ "columnName": "homeworkBody",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "attachmentIds",
+ "columnName": "attachmentIds",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "attachmentNames",
+ "columnName": "attachmentNames",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "keep",
+ "columnName": "keep",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "eventId"
+ ]
+ },
+ "indices": [
+ {
+ "name": "index_events_profileId_eventDate_eventTime",
+ "unique": false,
+ "columnNames": [
+ "profileId",
+ "eventDate",
+ "eventTime"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_events_profileId_eventDate_eventTime` ON `${TABLE_NAME}` (`profileId`, `eventDate`, `eventTime`)"
+ },
+ {
+ "name": "index_events_profileId_eventType",
+ "unique": false,
+ "columnNames": [
+ "profileId",
+ "eventType"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_events_profileId_eventType` ON `${TABLE_NAME}` (`profileId`, `eventType`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "eventTypes",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `eventType` INTEGER NOT NULL, `eventTypeName` TEXT NOT NULL, `eventTypeColor` INTEGER NOT NULL, `eventTypeOrder` INTEGER NOT NULL, `eventTypeSource` INTEGER NOT NULL, PRIMARY KEY(`profileId`, `eventType`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "eventType",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "eventTypeName",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "color",
+ "columnName": "eventTypeColor",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "order",
+ "columnName": "eventTypeOrder",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "source",
+ "columnName": "eventTypeSource",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "eventType"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "loginStores",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`loginStoreId` INTEGER NOT NULL, `loginStoreType` INTEGER NOT NULL, `loginStoreMode` INTEGER NOT NULL, `loginStoreData` TEXT NOT NULL, PRIMARY KEY(`loginStoreId`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "loginStoreId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "loginStoreType",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "mode",
+ "columnName": "loginStoreMode",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "data",
+ "columnName": "loginStoreData",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "loginStoreId"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "profiles",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `loginStoreId` INTEGER NOT NULL, `loginStoreType` INTEGER NOT NULL, `name` TEXT NOT NULL, `subname` TEXT, `studentNameLong` TEXT NOT NULL, `studentNameShort` TEXT NOT NULL, `accountName` TEXT, `studentData` TEXT NOT NULL, `image` TEXT, `empty` INTEGER NOT NULL, `archived` INTEGER NOT NULL, `syncEnabled` INTEGER NOT NULL, `enableSharedEvents` INTEGER NOT NULL, `registration` INTEGER NOT NULL, `userCode` TEXT NOT NULL, `archiveId` INTEGER, `studentNumber` INTEGER NOT NULL, `studentClassName` TEXT, `studentSchoolYearStart` INTEGER NOT NULL, `dateSemester1Start` TEXT NOT NULL, `dateSemester2Start` TEXT NOT NULL, `dateYearEnd` TEXT NOT NULL, `disabledNotifications` TEXT, `lastReceiversSync` INTEGER NOT NULL, PRIMARY KEY(`profileId`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "loginStoreId",
+ "columnName": "loginStoreId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "loginStoreType",
+ "columnName": "loginStoreType",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "subname",
+ "columnName": "subname",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "studentNameLong",
+ "columnName": "studentNameLong",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "studentNameShort",
+ "columnName": "studentNameShort",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "accountName",
+ "columnName": "accountName",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "studentData",
+ "columnName": "studentData",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "image",
+ "columnName": "image",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "empty",
+ "columnName": "empty",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "archived",
+ "columnName": "archived",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "syncEnabled",
+ "columnName": "syncEnabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "unused1",
+ "columnName": "enableSharedEvents",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "registration",
+ "columnName": "registration",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "userCode",
+ "columnName": "userCode",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "archiveId",
+ "columnName": "archiveId",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "studentNumber",
+ "columnName": "studentNumber",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "studentClassName",
+ "columnName": "studentClassName",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "studentSchoolYearStart",
+ "columnName": "studentSchoolYearStart",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "dateSemester1Start",
+ "columnName": "dateSemester1Start",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "dateSemester2Start",
+ "columnName": "dateSemester2Start",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "dateYearEnd",
+ "columnName": "dateYearEnd",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "disabledNotifications",
+ "columnName": "disabledNotifications",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "lastReceiversSync",
+ "columnName": "lastReceiversSync",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "luckyNumbers",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `luckyNumberDate` INTEGER NOT NULL, `luckyNumber` INTEGER NOT NULL, `keep` INTEGER NOT NULL, PRIMARY KEY(`profileId`, `luckyNumberDate`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "date",
+ "columnName": "luckyNumberDate",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "number",
+ "columnName": "luckyNumber",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "keep",
+ "columnName": "keep",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "luckyNumberDate"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "announcements",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `announcementId` INTEGER NOT NULL, `announcementSubject` TEXT NOT NULL, `announcementText` TEXT, `announcementStartDate` TEXT, `announcementEndDate` TEXT, `teacherId` INTEGER NOT NULL, `addedDate` INTEGER NOT NULL, `announcementIdString` TEXT, `keep` INTEGER NOT NULL, PRIMARY KEY(`profileId`, `announcementId`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "announcementId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "subject",
+ "columnName": "announcementSubject",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "text",
+ "columnName": "announcementText",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "startDate",
+ "columnName": "announcementStartDate",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "endDate",
+ "columnName": "announcementEndDate",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "teacherId",
+ "columnName": "teacherId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "addedDate",
+ "columnName": "addedDate",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "idString",
+ "columnName": "announcementIdString",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "keep",
+ "columnName": "keep",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "announcementId"
+ ]
+ },
+ "indices": [
+ {
+ "name": "index_announcements_profileId",
+ "unique": false,
+ "columnNames": [
+ "profileId"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_announcements_profileId` ON `${TABLE_NAME}` (`profileId`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "gradeCategories",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `categoryId` INTEGER NOT NULL, `weight` REAL NOT NULL, `color` INTEGER NOT NULL, `text` TEXT, `columns` TEXT, `valueFrom` REAL NOT NULL, `valueTo` REAL NOT NULL, `type` INTEGER NOT NULL, PRIMARY KEY(`profileId`, `categoryId`, `type`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "categoryId",
+ "columnName": "categoryId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "weight",
+ "columnName": "weight",
+ "affinity": "REAL",
+ "notNull": true
+ },
+ {
+ "fieldPath": "color",
+ "columnName": "color",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "text",
+ "columnName": "text",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "columns",
+ "columnName": "columns",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "valueFrom",
+ "columnName": "valueFrom",
+ "affinity": "REAL",
+ "notNull": true
+ },
+ {
+ "fieldPath": "valueTo",
+ "columnName": "valueTo",
+ "affinity": "REAL",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "categoryId",
+ "type"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "feedbackMessages",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `received` INTEGER NOT NULL, `text` TEXT NOT NULL, `senderName` TEXT NOT NULL, `deviceId` TEXT, `deviceName` TEXT, `devId` INTEGER, `devImage` TEXT, `sentTime` INTEGER NOT NULL)",
+ "fields": [
+ {
+ "fieldPath": "messageId",
+ "columnName": "messageId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "received",
+ "columnName": "received",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "text",
+ "columnName": "text",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "senderName",
+ "columnName": "senderName",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "deviceId",
+ "columnName": "deviceId",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "deviceName",
+ "columnName": "deviceName",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "devId",
+ "columnName": "devId",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "devImage",
+ "columnName": "devImage",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "sentTime",
+ "columnName": "sentTime",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": true,
+ "columnNames": [
+ "messageId"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "messages",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `messageId` INTEGER NOT NULL, `messageType` INTEGER NOT NULL, `messageSubject` TEXT NOT NULL, `messageBody` TEXT, `senderId` INTEGER, `addedDate` INTEGER NOT NULL, `messageIsPinned` INTEGER NOT NULL, `hasAttachments` INTEGER NOT NULL, `attachmentIds` TEXT, `attachmentNames` TEXT, `attachmentSizes` TEXT, `keep` INTEGER NOT NULL, PRIMARY KEY(`profileId`, `messageId`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "messageId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "messageType",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "subject",
+ "columnName": "messageSubject",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "body",
+ "columnName": "messageBody",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "senderId",
+ "columnName": "senderId",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "addedDate",
+ "columnName": "addedDate",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "isStarred",
+ "columnName": "messageIsPinned",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "hasAttachments",
+ "columnName": "hasAttachments",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "attachmentIds",
+ "columnName": "attachmentIds",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "attachmentNames",
+ "columnName": "attachmentNames",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "attachmentSizes",
+ "columnName": "attachmentSizes",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "keep",
+ "columnName": "keep",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "messageId"
+ ]
+ },
+ "indices": [
+ {
+ "name": "index_messages_profileId_messageType",
+ "unique": false,
+ "columnNames": [
+ "profileId",
+ "messageType"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_messages_profileId_messageType` ON `${TABLE_NAME}` (`profileId`, `messageType`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "messageRecipients",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `messageRecipientId` INTEGER NOT NULL, `messageRecipientReplyId` INTEGER NOT NULL, `messageRecipientReadDate` INTEGER NOT NULL, `messageId` INTEGER NOT NULL, PRIMARY KEY(`profileId`, `messageRecipientId`, `messageId`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "messageRecipientId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "replyId",
+ "columnName": "messageRecipientReplyId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "readDate",
+ "columnName": "messageRecipientReadDate",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "messageId",
+ "columnName": "messageId",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "messageRecipientId",
+ "messageId"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "logs",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `timestamp` INTEGER NOT NULL, `priority` INTEGER NOT NULL, `tag` TEXT, `message` TEXT NOT NULL)",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "timestamp",
+ "columnName": "timestamp",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "priority",
+ "columnName": "priority",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "tag",
+ "columnName": "tag",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "message",
+ "columnName": "message",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": true,
+ "columnNames": [
+ "id"
+ ]
+ },
+ "indices": [
+ {
+ "name": "index_logs_timestamp",
+ "unique": false,
+ "columnNames": [
+ "timestamp"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_logs_timestamp` ON `${TABLE_NAME}` (`timestamp`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "endpointTimers",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `endpointId` INTEGER NOT NULL, `endpointLastSync` INTEGER, `endpointNextSync` INTEGER NOT NULL, `endpointViewId` INTEGER, PRIMARY KEY(`profileId`, `endpointId`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "endpointId",
+ "columnName": "endpointId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastSync",
+ "columnName": "endpointLastSync",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "nextSync",
+ "columnName": "endpointNextSync",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "featureType",
+ "columnName": "endpointViewId",
+ "affinity": "INTEGER",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "endpointId"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "lessonRanges",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `lessonRangeNumber` INTEGER NOT NULL, `lessonRangeStart` TEXT NOT NULL, `lessonRangeEnd` TEXT NOT NULL, PRIMARY KEY(`profileId`, `lessonRangeNumber`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lessonNumber",
+ "columnName": "lessonRangeNumber",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "startTime",
+ "columnName": "lessonRangeStart",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "endTime",
+ "columnName": "lessonRangeEnd",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "lessonRangeNumber"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "notifications",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT NOT NULL, `text` TEXT NOT NULL, `textLong` TEXT, `type` INTEGER NOT NULL, `profileId` INTEGER, `profileName` TEXT, `posted` INTEGER NOT NULL, `viewId` INTEGER, `extras` TEXT, `addedDate` INTEGER NOT NULL)",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "title",
+ "columnName": "title",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "text",
+ "columnName": "text",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "textLong",
+ "columnName": "textLong",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "profileName",
+ "columnName": "profileName",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "posted",
+ "columnName": "posted",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "navTarget",
+ "columnName": "viewId",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "extras",
+ "columnName": "extras",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "addedDate",
+ "columnName": "addedDate",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": true,
+ "columnNames": [
+ "id"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "classrooms",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `id` INTEGER NOT NULL, `name` TEXT NOT NULL, PRIMARY KEY(`profileId`, `id`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "id"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "noticeTypes",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `id` INTEGER NOT NULL, `name` TEXT NOT NULL, PRIMARY KEY(`profileId`, `id`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "id"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "attendanceTypes",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `id` INTEGER NOT NULL, `baseType` INTEGER NOT NULL, `typeName` TEXT NOT NULL, `typeShort` TEXT NOT NULL, `typeSymbol` TEXT NOT NULL, `typeColor` INTEGER, PRIMARY KEY(`profileId`, `id`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "baseType",
+ "columnName": "baseType",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "typeName",
+ "columnName": "typeName",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "typeShort",
+ "columnName": "typeShort",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "typeSymbol",
+ "columnName": "typeSymbol",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "typeColor",
+ "columnName": "typeColor",
+ "affinity": "INTEGER",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "id"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "timetable",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `id` INTEGER NOT NULL, `type` INTEGER NOT NULL, `date` TEXT, `lessonNumber` INTEGER, `startTime` TEXT, `endTime` TEXT, `subjectId` INTEGER, `teacherId` INTEGER, `teamId` INTEGER, `classroom` TEXT, `oldDate` TEXT, `oldLessonNumber` INTEGER, `oldStartTime` TEXT, `oldEndTime` TEXT, `oldSubjectId` INTEGER, `oldTeacherId` INTEGER, `oldTeamId` INTEGER, `oldClassroom` TEXT, `isExtra` INTEGER NOT NULL, `ownerId` INTEGER NOT NULL, `color` INTEGER, `keep` INTEGER NOT NULL, PRIMARY KEY(`profileId`, `id`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "date",
+ "columnName": "date",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "lessonNumber",
+ "columnName": "lessonNumber",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "startTime",
+ "columnName": "startTime",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "endTime",
+ "columnName": "endTime",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "subjectId",
+ "columnName": "subjectId",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "teacherId",
+ "columnName": "teacherId",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "teamId",
+ "columnName": "teamId",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "classroom",
+ "columnName": "classroom",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "oldDate",
+ "columnName": "oldDate",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "oldLessonNumber",
+ "columnName": "oldLessonNumber",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "oldStartTime",
+ "columnName": "oldStartTime",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "oldEndTime",
+ "columnName": "oldEndTime",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "oldSubjectId",
+ "columnName": "oldSubjectId",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "oldTeacherId",
+ "columnName": "oldTeacherId",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "oldTeamId",
+ "columnName": "oldTeamId",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "oldClassroom",
+ "columnName": "oldClassroom",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "isExtra",
+ "columnName": "isExtra",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "ownerId",
+ "columnName": "ownerId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "color",
+ "columnName": "color",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "keep",
+ "columnName": "keep",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "id"
+ ]
+ },
+ "indices": [
+ {
+ "name": "index_timetable_profileId_type_date",
+ "unique": false,
+ "columnNames": [
+ "profileId",
+ "type",
+ "date"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_timetable_profileId_type_date` ON `${TABLE_NAME}` (`profileId`, `type`, `date`)"
+ },
+ {
+ "name": "index_timetable_profileId_type_oldDate",
+ "unique": false,
+ "columnNames": [
+ "profileId",
+ "type",
+ "oldDate"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_timetable_profileId_type_oldDate` ON `${TABLE_NAME}` (`profileId`, `type`, `oldDate`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "config",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `key` TEXT NOT NULL, `value` TEXT, PRIMARY KEY(`profileId`, `key`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "key",
+ "columnName": "key",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "value",
+ "columnName": "value",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "key"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "librusLessons",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `lessonId` INTEGER NOT NULL, `teacherId` INTEGER NOT NULL, `subjectId` INTEGER NOT NULL, `teamId` INTEGER, PRIMARY KEY(`profileId`, `lessonId`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lessonId",
+ "columnName": "lessonId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "teacherId",
+ "columnName": "teacherId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "subjectId",
+ "columnName": "subjectId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "teamId",
+ "columnName": "teamId",
+ "affinity": "INTEGER",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "profileId",
+ "lessonId"
+ ]
+ },
+ "indices": [
+ {
+ "name": "index_librusLessons_profileId",
+ "unique": false,
+ "columnNames": [
+ "profileId"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_librusLessons_profileId` ON `${TABLE_NAME}` (`profileId`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "timetableManual",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `type` INTEGER NOT NULL, `repeatBy` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `date` INTEGER, `weekDay` INTEGER, `lessonNumber` INTEGER, `startTime` TEXT, `endTime` TEXT, `subjectId` INTEGER, `teacherId` INTEGER, `teamId` INTEGER, `classroom` TEXT)",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "repeatBy",
+ "columnName": "repeatBy",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "date",
+ "columnName": "date",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "weekDay",
+ "columnName": "weekDay",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "lessonNumber",
+ "columnName": "lessonNumber",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "startTime",
+ "columnName": "startTime",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "endTime",
+ "columnName": "endTime",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "subjectId",
+ "columnName": "subjectId",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "teacherId",
+ "columnName": "teacherId",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "teamId",
+ "columnName": "teamId",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "classroom",
+ "columnName": "classroom",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": true,
+ "columnNames": [
+ "id"
+ ]
+ },
+ "indices": [
+ {
+ "name": "index_timetableManual_profileId_date",
+ "unique": false,
+ "columnNames": [
+ "profileId",
+ "date"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_timetableManual_profileId_date` ON `${TABLE_NAME}` (`profileId`, `date`)"
+ },
+ {
+ "name": "index_timetableManual_profileId_weekDay",
+ "unique": false,
+ "columnNames": [
+ "profileId",
+ "weekDay"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_timetableManual_profileId_weekDay` ON `${TABLE_NAME}` (`profileId`, `weekDay`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "notes",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `noteId` INTEGER NOT NULL, `noteOwnerType` TEXT, `noteOwnerId` INTEGER, `noteReplacesOriginal` INTEGER NOT NULL, `noteTopic` TEXT, `noteBody` TEXT NOT NULL, `noteColor` INTEGER, `noteSharedBy` TEXT, `noteSharedByName` TEXT, `addedDate` INTEGER NOT NULL, PRIMARY KEY(`noteId`))",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "noteId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "ownerType",
+ "columnName": "noteOwnerType",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "ownerId",
+ "columnName": "noteOwnerId",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "replacesOriginal",
+ "columnName": "noteReplacesOriginal",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "topic",
+ "columnName": "noteTopic",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "body",
+ "columnName": "noteBody",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "color",
+ "columnName": "noteColor",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "sharedBy",
+ "columnName": "noteSharedBy",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "sharedByName",
+ "columnName": "noteSharedByName",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "addedDate",
+ "columnName": "addedDate",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "noteId"
+ ]
+ },
+ "indices": [
+ {
+ "name": "index_notes_profileId_noteOwnerType_noteOwnerId",
+ "unique": false,
+ "columnNames": [
+ "profileId",
+ "noteOwnerType",
+ "noteOwnerId"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_notes_profileId_noteOwnerType_noteOwnerId` ON `${TABLE_NAME}` (`profileId`, `noteOwnerType`, `noteOwnerId`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "metadata",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`profileId` INTEGER NOT NULL, `metadataId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `thingType` INTEGER NOT NULL, `thingId` INTEGER NOT NULL, `seen` INTEGER NOT NULL, `notified` INTEGER NOT NULL)",
+ "fields": [
+ {
+ "fieldPath": "profileId",
+ "columnName": "profileId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "metadataId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "thingType",
+ "columnName": "thingType",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "thingId",
+ "columnName": "thingId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "seen",
+ "columnName": "seen",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notified",
+ "columnName": "notified",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": true,
+ "columnNames": [
+ "metadataId"
+ ]
+ },
+ "indices": [
+ {
+ "name": "index_metadata_profileId_thingType_thingId",
+ "unique": true,
+ "columnNames": [
+ "profileId",
+ "thingType",
+ "thingId"
+ ],
+ "orders": [],
+ "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_metadata_profileId_thingType_thingId` ON `${TABLE_NAME}` (`profileId`, `thingType`, `thingId`)"
+ }
+ ],
+ "foreignKeys": []
+ }
+ ],
+ "views": [],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '14e4b0e50eedd9a1f55e7f08819a9da7')"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0818551c..3f5cd18b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -173,7 +173,7 @@
| | \ \ __/ (_| __/ |\ V / __/ | \__ \
|_| \_\___|\___\___|_| \_/ \___|_| |___/
-->
-
@@ -186,7 +186,7 @@
-
@@ -201,7 +201,7 @@
|_____/ \___|_| \_/ |_|\___\___||___/
-->
-
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/App.kt b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt
index e558de53..f760e1af 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/App.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt
@@ -4,12 +4,6 @@
package pl.szczodrzynski.edziennik
-import android.content.Intent
-import android.content.pm.PackageManager
-import android.content.pm.ShortcutInfo
-import android.content.pm.ShortcutManager
-import android.graphics.drawable.Icon
-import android.os.Build
import android.provider.Settings
import android.util.Log
import android.widget.Toast
@@ -20,12 +14,7 @@ import cat.ereza.customactivityoncrash.config.CaocConfig
import com.chuckerteam.chucker.api.ChuckerCollector
import com.chuckerteam.chucker.api.ChuckerInterceptor
import com.chuckerteam.chucker.api.RetentionManager
-import com.google.firebase.FirebaseApp
-import com.google.firebase.FirebaseOptions
-import com.google.firebase.iid.FirebaseInstanceId
-import com.google.firebase.messaging.FirebaseMessaging
import com.google.gson.Gson
-import com.hypertrack.hyperlog.HyperLog
import com.mikepenz.iconics.Iconics
import im.wangchao.mhttp.MHttp
import kotlinx.coroutines.CoroutineScope
@@ -36,41 +25,39 @@ import kotlinx.coroutines.withContext
import me.leolin.shortcutbadger.ShortcutBadger
import okhttp3.OkHttpClient
import org.greenrobot.eventbus.EventBus
-import pl.szczodrzynski.edziennik.data.config.AppData
-import pl.szczodrzynski.edziennik.data.config.Config
+import pl.szczodrzynski.edziennik.core.manager.AttendanceManager
+import pl.szczodrzynski.edziennik.core.manager.AvailabilityManager
+import pl.szczodrzynski.edziennik.core.manager.BuildManager
+import pl.szczodrzynski.edziennik.core.manager.EventManager
+import pl.szczodrzynski.edziennik.core.manager.FirebaseManager
+import pl.szczodrzynski.edziennik.core.manager.GradesManager
+import pl.szczodrzynski.edziennik.core.manager.LoggingManager
+import pl.szczodrzynski.edziennik.core.manager.MessageManager
+import pl.szczodrzynski.edziennik.core.manager.NoteManager
+import pl.szczodrzynski.edziennik.core.manager.NotificationManager
+import pl.szczodrzynski.edziennik.core.manager.PermissionManager
+import pl.szczodrzynski.edziennik.core.manager.ShortcutManager
+import pl.szczodrzynski.edziennik.core.manager.TextStylingManager
+import pl.szczodrzynski.edziennik.core.manager.TimetableManager
+import pl.szczodrzynski.edziennik.core.manager.UiManager
+import pl.szczodrzynski.edziennik.core.manager.UpdateManager
+import pl.szczodrzynski.edziennik.core.manager.UserActionManager
+import pl.szczodrzynski.edziennik.core.network.DumbCookieJar
+import pl.szczodrzynski.edziennik.core.work.SyncWorker
+import pl.szczodrzynski.edziennik.core.work.UpdateWorker
import pl.szczodrzynski.edziennik.data.api.events.ProfileListEmptyEvent
import pl.szczodrzynski.edziennik.data.api.szkolny.SzkolnyApi
import pl.szczodrzynski.edziennik.data.api.szkolny.interceptor.Signing
+import pl.szczodrzynski.edziennik.data.config.AppData
+import pl.szczodrzynski.edziennik.data.config.Config
import pl.szczodrzynski.edziennik.data.db.AppDb
import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.data.enums.LoginType
-import pl.szczodrzynski.edziennik.ext.DAY
-import pl.szczodrzynski.edziennik.ext.MS
-import pl.szczodrzynski.edziennik.ext.putExtras
import pl.szczodrzynski.edziennik.network.SSLProviderInstaller
-import pl.szczodrzynski.edziennik.network.cookie.DumbCookieJar
-import pl.szczodrzynski.edziennik.sync.SyncWorker
-import pl.szczodrzynski.edziennik.sync.UpdateWorker
import pl.szczodrzynski.edziennik.ui.base.CrashActivity
-import pl.szczodrzynski.edziennik.data.enums.NavTarget
-import pl.szczodrzynski.edziennik.utils.DebugLogFormat
import pl.szczodrzynski.edziennik.utils.PermissionChecker
import pl.szczodrzynski.edziennik.utils.Utils
-import pl.szczodrzynski.edziennik.utils.Utils.d
-import pl.szczodrzynski.edziennik.utils.managers.AttendanceManager
-import pl.szczodrzynski.edziennik.utils.managers.AvailabilityManager
-import pl.szczodrzynski.edziennik.utils.managers.BuildManager
-import pl.szczodrzynski.edziennik.utils.managers.EventManager
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager
-import pl.szczodrzynski.edziennik.utils.managers.MessageManager
-import pl.szczodrzynski.edziennik.utils.managers.NoteManager
-import pl.szczodrzynski.edziennik.utils.managers.NotificationChannelsManager
-import pl.szczodrzynski.edziennik.utils.managers.PermissionManager
-import pl.szczodrzynski.edziennik.utils.managers.TextStylingManager
-import pl.szczodrzynski.edziennik.utils.managers.UiManager
-import pl.szczodrzynski.edziennik.utils.managers.TimetableManager
-import pl.szczodrzynski.edziennik.utils.managers.UpdateManager
-import pl.szczodrzynski.edziennik.utils.managers.UserActionManager
+import timber.log.Timber
import java.util.concurrent.TimeUnit
import kotlin.coroutines.CoroutineContext
import kotlin.system.exitProcess
@@ -81,7 +68,8 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
lateinit var db: AppDb
private set
lateinit var config: Config
- // private set // for LabFragment
+
+ // private set // for LabFragment
lateinit var profile: Profile
private set
lateinit var data: AppData
@@ -98,11 +86,14 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
val availabilityManager by lazy { AvailabilityManager(this) }
val buildManager by lazy { BuildManager(this) }
val eventManager by lazy { EventManager(this) }
+ val firebaseManager by lazy { FirebaseManager(this) }
val gradesManager by lazy { GradesManager(this) }
+ val loggingManager by lazy { LoggingManager(this) }
val messageManager by lazy { MessageManager(this) }
val noteManager by lazy { NoteManager(this) }
- val notificationChannelsManager by lazy { NotificationChannelsManager(this) }
+ val notificationManager by lazy { NotificationManager(this) }
val permissionManager by lazy { PermissionManager(this) }
+ val shortcutManager by lazy { ShortcutManager(this) }
val textStylingManager by lazy { TextStylingManager(this) }
val timetableManager by lazy { TimetableManager(this) }
val uiManager by lazy { UiManager(this) }
@@ -125,8 +116,8 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
get() = job + Dispatchers.Main
override val workManagerConfiguration: Configuration = Configuration.Builder()
- .setMinimumLoggingLevel(Log.VERBOSE)
- .build()
+ .setMinimumLoggingLevel(Log.VERBOSE)
+ .build()
val permissionChecker by lazy { PermissionChecker(this) }
val gson by lazy { Gson() }
@@ -155,7 +146,8 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
if (devMode) {
if (enableChucker) {
- val chuckerCollector = ChuckerCollector(this, true, RetentionManager.Period.ONE_HOUR)
+ val chuckerCollector =
+ ChuckerCollector(this, true, RetentionManager.Period.ONE_HOUR)
val chuckerInterceptor = ChuckerInterceptor(this, chuckerCollector)
builder.addInterceptor(chuckerInterceptor)
}
@@ -170,6 +162,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
MHttp.instance().customOkHttpClient(http)
}
+
val cookieJar by lazy { DumbCookieJar(this) }
/* _____ _ _
@@ -180,7 +173,12 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|_____/|_|\__, |_| |_|\__,_|\__|\__,_|_| \___|
__/ |
|__*/
- val deviceId: String by lazy { Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID) ?: "" }
+ val deviceId: String by lazy {
+ Settings.Secure.getString(
+ contentResolver,
+ Settings.Secure.ANDROID_ID
+ ) ?: ""
+ }
private var unreadBadgesAvailable = true
/* _____ _
@@ -191,225 +189,77 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
\___/|_| |_|\_____|_| \___|\__,_|\__\__*/
override fun onCreate() {
super.onCreate()
- AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
- CaocConfig.Builder.create()
- .backgroundMode(CaocConfig.BACKGROUND_MODE_SHOW_CUSTOM)
- .enabled(true)
- .showErrorDetails(true)
- .showRestartButton(true)
- .logErrorOnRestart(true)
- .trackActivities(true)
- .minTimeBetweenCrashesMs(60*1000)
- .errorDrawable(R.drawable.ic_rip)
- .restartActivity(MainActivity::class.java)
- .errorActivity(CrashActivity::class.java)
- .apply()
- Iconics.init(applicationContext)
- Iconics.respectFontBoundsDefault = true
- // initialize companion object values
+ // initialize Timber to enable basic logging
+ Timber.plant(loggingManager.logcatTree)
+ Timber.i("Initializing Szkolny.eu app v${BuildConfig.VERSION_NAME}")
+ // initialize core objects
AppData.read(this)
App.db = AppDb(this)
+ // read and migrate global config
App.config = Config(this)
App.config.migrate()
+ // add database logging to Timber
+ Timber.plant(loggingManager.databaseTree)
+ Timber.i("Initialized Szkolny.eu app v${BuildConfig.VERSION_NAME}")
devMode = config.devMode ?: BuildConfig.DEBUG
if (config.devModePassword != null)
checkDevModePassword()
-
enableChucker = config.enableChucker ?: devMode
+
+ AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
+ CaocConfig.Builder.create()
+ .backgroundMode(CaocConfig.BACKGROUND_MODE_SHOW_CUSTOM)
+ .enabled(true)
+ .showErrorDetails(true)
+ .showRestartButton(true)
+ .logErrorOnRestart(true)
+ .trackActivities(true)
+ .minTimeBetweenCrashesMs(60 * 1000)
+ .errorDrawable(R.drawable.ic_rip)
+ .restartActivity(MainActivity::class.java)
+ .errorActivity(CrashActivity::class.java)
+ .apply()
+ Iconics.init(applicationContext)
+ Iconics.respectFontBoundsDefault = true
+ Signing.getCert(this)
+ Utils.initializeStorageDir(this)
+ buildHttp()
+
uiManager.applyNightMode()
uiManager.applyLanguage(this)
- if (devMode) {
- HyperLog.initialize(this)
- HyperLog.setLogLevel(Log.VERBOSE)
- HyperLog.setLogFormat(DebugLogFormat(this))
- }
-
if (!profileLoadById(config.lastProfileId)) {
val success = db.profileDao().firstId?.let { profileLoadById(it) }
if (success != true)
profileLoad(Profile(0, 0, LoginType.TEMPLATE, ""))
}
- buildHttp()
+ launch(Dispatchers.Default) {
+ buildManager.fetchInstalledTime()
+ firebaseManager.initializeApps()
+ loggingManager.cleanupIfNeeded()
+ loggingManager.cleanupHyperLogDatabase()
+ notificationManager.registerAllChannels()
+ shortcutManager.createShortcuts()
- Signing.getCert(this)
- Utils.initializeStorageDir(this)
+ SSLProviderInstaller.install(applicationContext, this@App::buildHttp)
- launch {
- withContext(Dispatchers.Default) {
- SSLProviderInstaller.install(applicationContext, this@App::buildHttp)
+ if (config.sync.enabled)
+ SyncWorker.scheduleNext(this@App, false)
+ else
+ SyncWorker.cancelNext(this@App)
- if (config.sync.enabled)
- SyncWorker.scheduleNext(this@App, false)
- else
- SyncWorker.cancelNext(this@App)
+ if (config.sync.notifyAboutUpdates)
+ UpdateWorker.scheduleNext(this@App, false)
+ else
+ UpdateWorker.cancelNext(this@App)
+ }
- if (config.sync.notifyAboutUpdates)
- UpdateWorker.scheduleNext(this@App, false)
- else
- UpdateWorker.cancelNext(this@App)
-
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
- val shortcutManager = getSystemService(ShortcutManager::class.java)
-
- val shortcutTimetable = ShortcutInfo.Builder(this@App, "item_timetable")
- .setShortLabel(getString(R.string.shortcut_timetable)).setLongLabel(getString(R.string.shortcut_timetable))
- .setIcon(Icon.createWithResource(this@App, R.mipmap.ic_shortcut_timetable))
- .setIntent(Intent(Intent.ACTION_MAIN, null, this@App, MainActivity::class.java)
- .putExtras("fragmentId" to NavTarget.TIMETABLE))
- .build()
-
- val shortcutAgenda = ShortcutInfo.Builder(this@App, "item_agenda")
- .setShortLabel(getString(R.string.shortcut_agenda)).setLongLabel(getString(R.string.shortcut_agenda))
- .setIcon(Icon.createWithResource(this@App, R.mipmap.ic_shortcut_agenda))
- .setIntent(Intent(Intent.ACTION_MAIN, null, this@App, MainActivity::class.java)
- .putExtras("fragmentId" to NavTarget.AGENDA))
- .build()
-
- val shortcutGrades = ShortcutInfo.Builder(this@App, "item_grades")
- .setShortLabel(getString(R.string.shortcut_grades)).setLongLabel(getString(R.string.shortcut_grades))
- .setIcon(Icon.createWithResource(this@App, R.mipmap.ic_shortcut_grades))
- .setIntent(Intent(Intent.ACTION_MAIN, null, this@App, MainActivity::class.java)
- .putExtras("fragmentId" to NavTarget.GRADES))
- .build()
-
- val shortcutHomework = ShortcutInfo.Builder(this@App, "item_homeworks")
- .setShortLabel(getString(R.string.shortcut_homework)).setLongLabel(getString(R.string.shortcut_homework))
- .setIcon(Icon.createWithResource(this@App, R.mipmap.ic_shortcut_homework))
- .setIntent(Intent(Intent.ACTION_MAIN, null, this@App, MainActivity::class.java)
- .putExtras("fragmentId" to NavTarget.HOMEWORK))
- .build()
-
- val shortcutMessages = ShortcutInfo.Builder(this@App, "item_messages")
- .setShortLabel(getString(R.string.shortcut_messages)).setLongLabel(getString(R.string.shortcut_messages))
- .setIcon(Icon.createWithResource(this@App, R.mipmap.ic_shortcut_messages))
- .setIntent(Intent(Intent.ACTION_MAIN, null, this@App, MainActivity::class.java)
- .putExtras("fragmentId" to NavTarget.MESSAGES))
- .build()
-
- shortcutManager.dynamicShortcuts = listOf(
- shortcutTimetable,
- shortcutAgenda,
- shortcutGrades,
- shortcutHomework,
- shortcutMessages
- )
- } // shortcuts - end
-
- notificationChannelsManager.registerAllChannels()
-
-
- if (config.appInstalledTime == 0L)
- try {
- config.appInstalledTime = packageManager.getPackageInfo(packageName, 0).firstInstallTime
- config.appRateSnackbarTime = config.appInstalledTime + 7 * DAY * MS
- } catch (e: PackageManager.NameNotFoundException) {
- e.printStackTrace()
- }
-
- val pushMobidziennikApp = FirebaseApp.initializeApp(
- this@App,
- FirebaseOptions.Builder()
- .setProjectId("mobidziennik")
- .setStorageBucket("mobidziennik.appspot.com")
- .setDatabaseUrl("https://mobidziennik.firebaseio.com")
- .setGcmSenderId("747285019373")
- .setApiKey("AIzaSyCi5LmsZ5BBCQnGtrdvWnp1bWLCNP8OWQE")
- .setApplicationId("1:747285019373:android:f6341bf7b158621d")
- .build(),
- "Mobidziennik2"
- )
-
- val pushLibrusApp = FirebaseApp.initializeApp(
- this@App,
- FirebaseOptions.Builder()
- .setProjectId("synergiadru")
- .setStorageBucket("synergiadru.appspot.com")
- .setDatabaseUrl("https://synergiadru.firebaseio.com")
- .setGcmSenderId("513056078587")
- .setApiKey("AIzaSyDfTuEoYPKdv4aceEws1CO3n0-HvTndz-o")
- .setApplicationId("1:513056078587:android:1e29083b760af544")
- .build(),
- "Librus"
- )
-
- val pushVulcanApp = FirebaseApp.initializeApp(
- this@App,
- FirebaseOptions.Builder()
- .setProjectId("dzienniczekplus")
- .setStorageBucket("dzienniczekplus.appspot.com")
- .setDatabaseUrl("https://dzienniczekplus.firebaseio.com")
- .setGcmSenderId("987828170337")
- .setApiKey("AIzaSyDW8MUtanHy64_I0oCpY6cOxB3jrvJd_iA")
- .setApplicationId("1:987828170337:android:ac97431a0a4578c3")
- .build(),
- "Vulcan"
- )
-
- val pushVulcanHebeApp = FirebaseApp.initializeApp(
- this@App,
- FirebaseOptions.Builder()
- .setProjectId("dzienniczekplus")
- .setStorageBucket("dzienniczekplus.appspot.com")
- .setDatabaseUrl("https://dzienniczekplus.firebaseio.com")
- .setGcmSenderId("987828170337")
- .setApiKey("AIzaSyDW8MUtanHy64_I0oCpY6cOxB3jrvJd_iA")
- .setApplicationId("1:987828170337:android:7e16404b9e5deaaa")
- .build(),
- "VulcanHebe"
- )
-
- try {
- FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener { instanceIdResult ->
- val token = instanceIdResult.token
- d("Firebase", "Got App token: $token")
- config.sync.tokenApp = token
- }
- FirebaseInstanceId.getInstance(pushMobidziennikApp).instanceId.addOnSuccessListener { instanceIdResult ->
- val token = instanceIdResult.token
- d("Firebase", "Got Mobidziennik2 token: $token")
- if (token != config.sync.tokenMobidziennik) {
- config.sync.tokenMobidziennik = token
- config.sync.tokenMobidziennikList = listOf()
- }
- }
- FirebaseInstanceId.getInstance(pushLibrusApp).instanceId.addOnSuccessListener { instanceIdResult ->
- val token = instanceIdResult.token
- d("Firebase", "Got Librus token: $token")
- if (token != config.sync.tokenLibrus) {
- config.sync.tokenLibrus = token
- config.sync.tokenLibrusList = listOf()
- }
- }
- FirebaseInstanceId.getInstance(pushVulcanApp).instanceId.addOnSuccessListener { instanceIdResult ->
- val token = instanceIdResult.token
- d("Firebase", "Got Vulcan token: $token")
- if (token != config.sync.tokenVulcan) {
- config.sync.tokenVulcan = token
- config.sync.tokenVulcanList = listOf()
- }
- }
- FirebaseInstanceId.getInstance(pushVulcanHebeApp).instanceId.addOnSuccessListener { instanceIdResult ->
- val token = instanceIdResult.token
- d("Firebase", "Got VulcanHebe token: $token")
- if (token != config.sync.tokenVulcanHebe) {
- config.sync.tokenVulcanHebe = token
- config.sync.tokenVulcanHebeList = listOf()
- }
- }
- FirebaseMessaging.getInstance().subscribeToTopic(packageName)
- } catch (e: IllegalStateException) {
- e.printStackTrace()
- }
- }
-
- db.metadataDao().countUnseen().observeForever { count: Int ->
- if (unreadBadgesAvailable)
- unreadBadgesAvailable = ShortcutBadger.applyCount(this@App, count)
- }
+ db.metadataDao().countUnseen().observeForever { count: Int ->
+ if (unreadBadgesAvailable)
+ unreadBadgesAvailable = ShortcutBadger.applyCount(this@App, count)
}
}
@@ -418,7 +268,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
App.config.lastProfileId = profile.id
try {
App.data = AppData.get(profile.loginStoreType)
- d("App", "Loaded AppData: ${App.data}")
+ Timber.d("Loaded AppData: ${App.data}")
// apply newly-added config overrides, if not changed by the user yet
for ((key, value) in App.data.configOverrides) {
val config = App.profile.config
@@ -426,7 +276,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
config[key] = value
}
} catch (e: Exception) {
- Log.e("App", "Cannot load AppData", e)
+ Timber.e(e, "Cannot load AppData")
Toast.makeText(this, R.string.app_cannot_load_data, Toast.LENGTH_LONG).show()
exitProcess(0)
}
@@ -439,6 +289,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
}
return false
}
+
fun profileLoad(profileId: Int, onSuccess: (profile: Profile) -> Unit) {
launch {
val success = withContext(Dispatchers.Default) {
@@ -450,6 +301,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
profileLoadLast(onSuccess)
}
}
+
fun profileLoadLast(onSuccess: (profile: Profile) -> Unit) {
launch {
val success = withContext(Dispatchers.Default) {
@@ -457,12 +309,12 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
}
if (!success) {
EventBus.getDefault().post(ProfileListEmptyEvent())
- }
- else {
+ } else {
onSuccess(profile)
}
}
}
+
fun profileSave() = profileSave(profile)
fun profileSave(profile: Profile) {
if (profile.id == profileId)
@@ -474,9 +326,12 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
fun checkDevModePassword() {
devMode = devMode || try {
- Utils.AESCrypt.decrypt("nWFVxY65Pa8/aRrT7EylNAencmOD+IxUY2Gg/beiIWY=", config.devModePassword) == "ok here you go it's enabled now"
+ Utils.AESCrypt.decrypt(
+ "nWFVxY65Pa8/aRrT7EylNAencmOD+IxUY2Gg/beiIWY=",
+ config.devModePassword
+ ) == "ok here you go it's enabled now"
} catch (e: Exception) {
- e.printStackTrace()
+ Timber.e(e)
false
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt
index 9e3ca0f3..250bdda1 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt
@@ -45,10 +45,10 @@ import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.data.enums.FeatureType
import pl.szczodrzynski.edziennik.databinding.ActivitySzkolnyBinding
import pl.szczodrzynski.edziennik.ext.*
-import pl.szczodrzynski.edziennik.sync.AppManagerDetectedEvent
-import pl.szczodrzynski.edziennik.sync.SyncWorker
-import pl.szczodrzynski.edziennik.sync.UpdateStateEvent
-import pl.szczodrzynski.edziennik.sync.UpdateWorker
+import pl.szczodrzynski.edziennik.core.work.AppManagerDetectedEvent
+import pl.szczodrzynski.edziennik.core.work.SyncWorker
+import pl.szczodrzynski.edziennik.core.work.UpdateStateEvent
+import pl.szczodrzynski.edziennik.core.work.UpdateWorker
import pl.szczodrzynski.edziennik.ui.base.MainSnackbar
import pl.szczodrzynski.edziennik.data.enums.NavTarget
import pl.szczodrzynski.edziennik.data.enums.NavTargetLocation
@@ -66,9 +66,8 @@ import pl.szczodrzynski.edziennik.ui.login.LoginActivity
import pl.szczodrzynski.edziennik.ui.messages.list.MessagesFragment
import pl.szczodrzynski.edziennik.ui.timetable.TimetableFragment
import pl.szczodrzynski.edziennik.utils.*
-import pl.szczodrzynski.edziennik.utils.Utils.d
-import pl.szczodrzynski.edziennik.utils.managers.AvailabilityManager.Error.Type
-import pl.szczodrzynski.edziennik.utils.managers.UserActionManager
+import pl.szczodrzynski.edziennik.core.manager.AvailabilityManager.Error.Type
+import pl.szczodrzynski.edziennik.core.manager.UserActionManager
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.navlib.*
import pl.szczodrzynski.navlib.bottomsheet.NavBottomSheet
@@ -76,6 +75,7 @@ import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetPrimaryItem
import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetSeparatorItem
import pl.szczodrzynski.navlib.drawer.NavDrawer
import pl.szczodrzynski.navlib.drawer.items.DrawerPrimaryItem
+import timber.log.Timber
import java.io.IOException
import kotlin.coroutines.CoroutineContext
import kotlin.math.roundToInt
@@ -123,18 +123,19 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- d(TAG, "Activity created")
+ Timber.i("Activity created")
app.uiManager.applyTheme(this)
app.uiManager.applyLanguage(this)
app.buildManager.validateBuild(this)
if (App.profileId == 0) {
+ Timber.i("Profile is not loaded")
onProfileListEmptyEvent(ProfileListEmptyEvent())
return
}
- d(TAG, "Profile is valid, inflating views")
+ Timber.i("Profile is valid, inflating views")
setContentView(b.root)
@@ -542,7 +543,6 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
@Subscribe(threadMode = ThreadMode.MAIN)
fun onProfileListEmptyEvent(event: ProfileListEmptyEvent) {
- d(TAG, "Profile list is empty. Launch LoginActivity.")
app.config.loginFinished = false
startActivity(Intent(this, LoginActivity::class.java))
finish()
@@ -617,7 +617,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
try {
startActivity(Intent(Settings.ACTION_SETTINGS))
} catch (e: Exception) {
- e.printStackTrace()
+ Timber.e(e)
Toast.makeText(this, R.string.app_manager_open_failed, Toast.LENGTH_SHORT)
.show()
}
@@ -665,11 +665,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
}
fun handleIntent(extras: Bundle?) {
- d(TAG, "handleIntent() {")
- extras?.keySet()?.forEach { key ->
- d(TAG, " \"$key\": " + extras.get(key))
- }
- d(TAG, "}")
+ Timber.d("handleIntent() ${extras?.keySet()}")
val intentProfileId = extras.getIntOrNull("profileId").takePositive()
var intentNavTarget = extras.getEnum("fragmentId")
@@ -783,17 +779,17 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
}
override fun onStart() {
- d(TAG, "Activity started")
+ Timber.i("Activity started")
super.onStart()
}
override fun onStop() {
- d(TAG, "Activity stopped")
+ Timber.i("Activity stopped")
super.onStop()
}
override fun onResume() {
- d(TAG, "Activity resumed")
+ Timber.i("Activity resumed")
val filter = IntentFilter()
filter.addAction(Intent.ACTION_MAIN)
ContextCompat.registerReceiver(
@@ -807,14 +803,14 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
}
override fun onPause() {
- d(TAG, "Activity paused")
+ Timber.i("Activity paused")
unregisterReceiver(intentReceiver)
EventBus.getDefault().unregister(this)
super.onPause()
}
override fun onDestroy() {
- d(TAG, "Activity destroyed")
+ Timber.i("Activity destroyed")
super.onDestroy()
}
@@ -868,7 +864,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
args: Bundle? = null,
skipBeforeNavigate: Boolean = false,
): Boolean {
- d(TAG, "navigate(profileId = ${profile?.id ?: profileId}, target = ${navTarget?.name}, args = $args)")
+ Timber.d("navigate(profileId = ${profile?.id ?: profileId}, target = ${navTarget?.name}, args = $args)")
if (!(skipBeforeNavigate || navTarget == this.navTarget) && !canNavigate()) {
bottomSheet.close()
drawer.close()
@@ -901,7 +897,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
args: Bundle?,
profileChanged: Boolean,
) {
- d(TAG, "navigateImpl(profileId = ${profile.id}, target = ${navTarget.name}, args = $args)")
+ Timber.d("navigateImpl(profileId = ${profile.id}, target = ${navTarget.name}, args = $args)")
if (navTarget.featureType != null && !profile.hasUIFeature(navTarget.featureType)) {
navigateImpl(profile, NavTarget.HOME, args, profileChanged)
@@ -954,7 +950,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
navView.bottomBar.fabExtended = false
navView.bottomBar.setFabOnClickListener(null)
- d("NavDebug", "Navigating from ${this.navTarget.name} to ${navTarget.name}")
+ Timber.d("Navigating from ${this.navTarget.name} to ${navTarget.name}")
val fragment = navTarget.fragmentClass?.getDeclaredConstructor()?.newInstance() ?: return
fragment.arguments = arguments
@@ -1014,9 +1010,9 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
}
}
- d("NavDebug", "Current fragment ${navTarget.name}, back stack:")
+ Timber.d("Current fragment ${navTarget.name}, back stack:")
navBackStack.forEachIndexed { index, item ->
- d("NavDebug", " - $index: ${item.first.name}")
+ Timber.d(" - $index: ${item.first.name}")
}
transaction.replace(R.id.fragment, fragment)
@@ -1099,8 +1095,8 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
else
BitmapDrawable.createFromPath(it)
}
- } catch (e: IOException) {
- e.printStackTrace()
+ } catch (e: Exception) {
+ Timber.e(e)
}
}
@@ -1141,7 +1137,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
}
fun setDrawerItems() {
- d("NavDebug", "setDrawerItems() app.profile = ${app.profile}")
+ Timber.d("setDrawerItems() app.profile = ${app.profile}")
val drawerItems = arrayListOf>()
val drawerItemsMore = arrayListOf>()
val drawerItemsBottom = arrayListOf>()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/FirebaseSendException.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/FirebaseSendException.kt
similarity index 93%
rename from app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/FirebaseSendException.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/FirebaseSendException.kt
index 04cb7c23..917a795b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/FirebaseSendException.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/FirebaseSendException.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2020-1-11.
*/
-package pl.szczodrzynski.edziennik.data.firebase
+package pl.szczodrzynski.edziennik.core.firebase
class FirebaseSendException(reason: String?) : Exception(reason) {
companion object {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/FirebaseService.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/FirebaseService.kt
similarity index 92%
rename from app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/FirebaseService.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/FirebaseService.kt
index 80dcd4ea..7d39f38d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/FirebaseService.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/FirebaseService.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2020-1-11.
*/
-package pl.szczodrzynski.edziennik.data.firebase
+package pl.szczodrzynski.edziennik.core.firebase
import android.annotation.SuppressLint
import android.app.PendingIntent
@@ -14,6 +14,7 @@ import com.google.firebase.iid.zzaz
import com.google.firebase.messaging.zzc
import com.google.gson.JsonObject
import pl.szczodrzynski.edziennik.ext.*
+import timber.log.Timber
import java.util.*
import com.google.firebase.messaging.zzo.zza as logNotificationOpen
import com.google.firebase.messaging.zzo.zza as logNotificationReceived
@@ -44,7 +45,7 @@ open class FirebaseService : zzc() {
try {
it.send()
} catch (e: CanceledException) {
- Log.e(TAG, "Notification pending intent canceled")
+ Timber.e("Notification pending intent canceled")
}
}
@@ -59,7 +60,7 @@ open class FirebaseService : zzc() {
final override fun zzc(intent: Intent?) {
val action = intent?.action
val json = intent?.toJsonObject()
- Log.d(TAG, "zzc Intent(action=$action, extras=$json)")
+ Timber.d("zzc Intent(action=$action, extras=$json)")
if (action == null || json == null)
return
@@ -73,12 +74,13 @@ open class FirebaseService : zzc() {
onNewToken(json.getString("token"))
}
"com.google.android.c2dm.intent.RECEIVE",
- "com.google.firebase.messaging.RECEIVE_DIRECT_BOOT" -> {
+ "com.google.firebase.messaging.RECEIVE_DIRECT_BOOT",
+ -> {
val messageId = json.getString("google.message_id")
if (messageId != null) {
// send back an acknowledgement to Google Play Services
val ackBundle = Bundle(
- "google.message_id" to messageId
+ "google.message_id" to messageId
)
zzad.zza(this).zza(2, ackBundle)
}
@@ -86,7 +88,7 @@ open class FirebaseService : zzc() {
// and add it to queue
if (messageId.isNotNullNorEmpty()) {
if (messageQueue.contains(messageId)) {
- Log.d(TAG, "Received duplicate message: $messageId")
+ Timber.d("Received duplicate message: $messageId")
return
}
if (messageQueue.size >= 10)
@@ -97,7 +99,7 @@ open class FirebaseService : zzc() {
processMessage(messageId, json, intent)
}
else -> {
- Log.d(TAG, "Unknown intent action: $action")
+ Timber.d("Unknown intent action: $action")
}
}
}
@@ -128,7 +130,7 @@ open class FirebaseService : zzc() {
)
}
else -> {
- Log.w(TAG, "Received message with unknown type: $it")
+ Timber.w("Received message with unknown type: $it")
return
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/MyFirebaseService.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/MyFirebaseService.kt
similarity index 77%
rename from app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/MyFirebaseService.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/MyFirebaseService.kt
index 00d33812..b6bed72a 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/MyFirebaseService.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/MyFirebaseService.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2020-1-11.
*/
-package pl.szczodrzynski.edziennik.data.firebase
+package pl.szczodrzynski.edziennik.core.firebase
import android.content.Context
import android.util.Log
@@ -11,6 +11,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import pl.szczodrzynski.edziennik.App
+import timber.log.Timber
import kotlin.coroutines.CoroutineContext
class MyFirebaseService : FirebaseService(), CoroutineScope {
@@ -25,17 +26,13 @@ class MyFirebaseService : FirebaseService(), CoroutineScope {
get() = job + Dispatchers.Main
override fun onNewToken(token: String?) {
- Log.d(TAG, "Got new token: $token")
+ Timber.d("Got new token: $token")
app.config.sync.tokenApp = token
}
override fun onMessageReceived(message: Message) {
launch(Dispatchers.Default) {
- Log.d(TAG, "Message received from ${message.from}: $message")
- app.getSharedPreferences("firebase_service_log", Context.MODE_PRIVATE).edit().apply {
- putString(System.currentTimeMillis().toString(), message.toString())
- apply()
- }
+ Timber.d("Message received from ${message.from}: $message")
val profiles = app.db.profileDao().profilesForFirebaseNow
when (message.from) {
"640759989760" -> SzkolnyAppFirebase(app, profiles, message)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyAppFirebase.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/SzkolnyAppFirebase.kt
similarity index 99%
rename from app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyAppFirebase.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/SzkolnyAppFirebase.kt
index d80ef156..0d6226e5 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyAppFirebase.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/SzkolnyAppFirebase.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2020-1-11.
*/
-package pl.szczodrzynski.edziennik.data.firebase
+package pl.szczodrzynski.edziennik.core.firebase
import com.google.gson.JsonParser
import com.google.gson.reflect.TypeToken
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyLibrusFirebase.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/SzkolnyLibrusFirebase.kt
similarity index 99%
rename from app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyLibrusFirebase.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/SzkolnyLibrusFirebase.kt
index b8fd7d97..074457a3 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyLibrusFirebase.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/SzkolnyLibrusFirebase.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2020-1-11.
*/
-package pl.szczodrzynski.edziennik.data.firebase
+package pl.szczodrzynski.edziennik.core.firebase
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.data.api.edziennik.EdziennikTask
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyMobidziennikFirebase.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/SzkolnyMobidziennikFirebase.kt
similarity index 98%
rename from app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyMobidziennikFirebase.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/SzkolnyMobidziennikFirebase.kt
index c209cb9d..73c59e1d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyMobidziennikFirebase.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/SzkolnyMobidziennikFirebase.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2020-1-11.
*/
-package pl.szczodrzynski.edziennik.data.firebase
+package pl.szczodrzynski.edziennik.core.firebase
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.data.api.edziennik.EdziennikTask
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyVulcanFirebase.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/SzkolnyVulcanFirebase.kt
similarity index 97%
rename from app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyVulcanFirebase.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/SzkolnyVulcanFirebase.kt
index 7c3359cd..2ab6defb 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyVulcanFirebase.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/firebase/SzkolnyVulcanFirebase.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2020-1-11.
*/
-package pl.szczodrzynski.edziennik.data.firebase
+package pl.szczodrzynski.edziennik.core.firebase
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.data.api.edziennik.EdziennikTask
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/AttendanceManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/AttendanceManager.kt
similarity index 98%
rename from app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/AttendanceManager.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/manager/AttendanceManager.kt
index 5b112af9..accdfba3 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/AttendanceManager.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/AttendanceManager.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2020-4-28.
*/
-package pl.szczodrzynski.edziennik.utils.managers
+package pl.szczodrzynski.edziennik.core.manager
import com.mikepenz.iconics.typeface.IIcon
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/AvailabilityManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/AvailabilityManager.kt
similarity index 98%
rename from app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/AvailabilityManager.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/manager/AvailabilityManager.kt
index d254c065..eedbb6ad 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/AvailabilityManager.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/AvailabilityManager.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2021-9-18.
*/
-package pl.szczodrzynski.edziennik.utils.managers
+package pl.szczodrzynski.edziennik.core.manager
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.BuildConfig
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/BuildManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/BuildManager.kt
similarity index 94%
rename from app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/BuildManager.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/manager/BuildManager.kt
index 91778906..a60abe68 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/BuildManager.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/BuildManager.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2021-3-27.
*/
-package pl.szczodrzynski.edziennik.utils.managers
+package pl.szczodrzynski.edziennik.core.manager
import android.content.pm.PackageManager
import android.text.TextUtils
@@ -20,7 +20,9 @@ import pl.szczodrzynski.edziennik.BuildConfig
import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.api.szkolny.interceptor.Signing
import pl.szczodrzynski.edziennik.data.api.szkolny.response.Update
+import pl.szczodrzynski.edziennik.ext.DAY
import pl.szczodrzynski.edziennik.ext.Intent
+import pl.szczodrzynski.edziennik.ext.MS
import pl.szczodrzynski.edziennik.ext.asBoldSpannable
import pl.szczodrzynski.edziennik.ext.asColoredSpannable
import pl.szczodrzynski.edziennik.ext.concat
@@ -34,7 +36,7 @@ import pl.szczodrzynski.edziennik.ext.resolveColor
import pl.szczodrzynski.edziennik.ext.toJsonObject
import pl.szczodrzynski.edziennik.ui.base.BuildInvalidActivity
import pl.szczodrzynski.edziennik.utils.Utils
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
import java.time.Instant
import java.time.ZoneId
import java.time.ZonedDateTime
@@ -101,6 +103,18 @@ class BuildManager(val app: App) : CoroutineScope {
else -> Update.Type.RELEASE
}
+ fun fetchInstalledTime() {
+ if (app.config.appInstalledTime != 0L)
+ return
+ try {
+ app.config.appInstalledTime =
+ app.packageManager.getPackageInfo(app.packageName, 0).firstInstallTime
+ app.config.appRateSnackbarTime = app.config.appInstalledTime + 7 * DAY * MS
+ } catch (e: PackageManager.NameNotFoundException) {
+ Timber.e(e)
+ }
+ }
+
fun showVersionDialog(activity: AppCompatActivity) {
val yes = activity.getString(R.string.yes)
val no = activity.getString(R.string.no)
@@ -235,7 +249,7 @@ class BuildManager(val app: App) : CoroutineScope {
fun validateBuild(activity: AppCompatActivity) {
launch {
gitRemote = getRemoteRepo()
- d("BuildManager", "isSigned = $isSigned, buildType = $buildType, buildFlavor = $buildFlavor, remote = $gitRemote")
+ Timber.d("isSigned = $isSigned, buildType = $buildType, buildFlavor = $buildFlavor, remote = $gitRemote")
// officially signed package
if (isSigned)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/EventManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/EventManager.kt
similarity index 98%
rename from app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/EventManager.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/manager/EventManager.kt
index 38a8fee3..450b6e6c 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/EventManager.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/EventManager.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2020-4-3.
*/
-package pl.szczodrzynski.edziennik.utils.managers
+package pl.szczodrzynski.edziennik.core.manager
import android.widget.TextView
import androidx.core.view.isVisible
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/FirebaseManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/FirebaseManager.kt
new file mode 100644
index 00000000..ba3dbe6a
--- /dev/null
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/FirebaseManager.kt
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) Kuba Szczodrzyński 2024-7-1.
+ */
+
+package pl.szczodrzynski.edziennik.core.manager
+
+import com.google.firebase.FirebaseApp
+import com.google.firebase.FirebaseOptions
+import com.google.firebase.iid.FirebaseInstanceId
+import com.google.firebase.messaging.FirebaseMessaging
+import pl.szczodrzynski.edziennik.App
+import timber.log.Timber
+
+class FirebaseManager(val app: App) {
+ data class Instance(
+ val name: String,
+ val projectId: String,
+ val projectNumber: String,
+ val apiKey: String,
+ val applicationId: String,
+ val onToken: (token: String) -> Unit,
+ )
+
+ private val instances = listOf(
+ Instance(
+ name = "Mobidziennik",
+ projectId = "mobidziennik",
+ projectNumber = "747285019373",
+ apiKey = "AIzaSyCi5LmsZ5BBCQnGtrdvWnp1bWLCNP8OWQE",
+ applicationId = "f6341bf7b158621d",
+ onToken = {
+ app.config.sync.tokenMobidziennik = it
+ app.config.sync.tokenMobidziennikList = listOf()
+ },
+ ),
+ Instance(
+ name = "Librus",
+ projectId = "synergiadru",
+ projectNumber = "513056078587",
+ apiKey = "AIzaSyDfTuEoYPKdv4aceEws1CO3n0-HvTndz-o",
+ applicationId = "1e29083b760af544",
+ onToken = {
+ app.config.sync.tokenLibrus = it
+ app.config.sync.tokenLibrusList = listOf()
+ },
+ ),
+ Instance(
+ name = "Vulcan",
+ projectId = "dzienniczekplus",
+ projectNumber = "987828170337",
+ apiKey = "AIzaSyDW8MUtanHy64_I0oCpY6cOxB3jrvJd_iA",
+ applicationId = "ac97431a0a4578c3",
+ onToken = {
+ app.config.sync.tokenVulcan = it
+ app.config.sync.tokenVulcanList = listOf()
+ },
+ ),
+ Instance(
+ name = "VulcanHebe",
+ projectId = "dzienniczekplus",
+ projectNumber = "987828170337",
+ apiKey = "AIzaSyDW8MUtanHy64_I0oCpY6cOxB3jrvJd_iA",
+ applicationId = "7e16404b9e5deaaa",
+ onToken = {
+ app.config.sync.tokenVulcanHebe = it
+ app.config.sync.tokenVulcanHebeList = listOf()
+ },
+ ),
+ )
+
+ fun initializeApps() {
+ FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener { result ->
+ val token = result.token
+ Timber.i("Got App token: $token")
+ app.config.sync.tokenApp = token
+ }
+ FirebaseMessaging.getInstance().subscribeToTopic(app.packageName)
+
+ instances.forEach {
+ val options = FirebaseOptions.Builder()
+ .setProjectId(it.projectId)
+ .setStorageBucket("${it.projectId}.appspot.com")
+ .setDatabaseUrl("https://${it.projectId}.firebaseio.com")
+ .setGcmSenderId(it.projectNumber)
+ .setApiKey(it.apiKey)
+ .setApplicationId("1:${it.projectNumber}:android:${it.applicationId}")
+ .build()
+
+ val instance = FirebaseApp.initializeApp(app, options, it.name)
+
+ FirebaseInstanceId.getInstance(instance).instanceId.addOnSuccessListener { result ->
+ val token = result.token
+ Timber.i("Got ${it.name} token: $token")
+ if (token != app.config["token${it.name}"])
+ it.onToken(token)
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/GradesManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/GradesManager.kt
similarity index 99%
rename from app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/GradesManager.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/manager/GradesManager.kt
index 6ae0cb31..ca8f01a5 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/GradesManager.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/GradesManager.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2020-3-1.
*/
-package pl.szczodrzynski.edziennik.utils.managers
+package pl.szczodrzynski.edziennik.core.manager
import android.content.Context
import com.google.android.material.color.MaterialColors
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/LoggingManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/LoggingManager.kt
new file mode 100644
index 00000000..d599c5fd
--- /dev/null
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/LoggingManager.kt
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) Kuba Szczodrzyński 2024-7-1.
+ */
+
+package pl.szczodrzynski.edziennik.core.manager
+
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import pl.szczodrzynski.edziennik.App
+import pl.szczodrzynski.edziennik.data.db.entity.LogEntry
+import pl.szczodrzynski.edziennik.ext.DAY
+import pl.szczodrzynski.edziennik.ext.MS
+import pl.szczodrzynski.edziennik.ext.ignore
+import timber.log.Timber
+
+class LoggingManager(val app: App) : CoroutineScope {
+ companion object {
+ private const val CLEANUP_INTERVAL = 2 * DAY * MS
+ private const val CLEANUP_MAX_AGE = 7 * DAY * MS
+ }
+
+ override val coroutineContext = Job() + Dispatchers.IO
+
+ val logcatTree = object : Timber.DebugTree() {
+ override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
+ super.log(
+ priority = priority,
+ tag = tag?.substringBefore("$")?.let { "Szkolny/$it" },
+ message = message,
+ t = t,
+ )
+ }
+ }
+
+ val databaseTree = object : Timber.DebugTree() {
+ override fun log(priority: Int, tag: String?, message: String, t: Throwable?) = launch {
+ val entry = LogEntry(
+ timestamp = System.currentTimeMillis(),
+ priority = priority,
+ tag = tag?.substringBefore("$"),
+ message = message,
+ )
+ app.db.logDao().add(entry)
+ }.ignore()
+ }
+
+ suspend fun cleanupIfNeeded(force: Boolean = false) {
+ if (!force && System.currentTimeMillis() - app.config.lastLogCleanupTime < CLEANUP_INTERVAL)
+ return
+ withContext(Dispatchers.IO) {
+ val timestamp = System.currentTimeMillis() - CLEANUP_MAX_AGE
+ Timber.i("Cleaning logs older than $timestamp")
+ app.db.logDao().clearBefore(timestamp)
+ }
+ app.config.lastLogCleanupTime = System.currentTimeMillis()
+ }
+
+ fun cleanupHyperLogDatabase() {
+ try {
+ app.deleteDatabase("com.hypertrack.common.device_logs.db")
+ } catch (e: Exception) {
+ Timber.e(e)
+ }
+ }
+}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/MessageManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/MessageManager.kt
similarity index 98%
rename from app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/MessageManager.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/manager/MessageManager.kt
index 8d81ac2d..ea969c20 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/MessageManager.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/MessageManager.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2021-10-7.
*/
-package pl.szczodrzynski.edziennik.utils.managers
+package pl.szczodrzynski.edziennik.core.manager
import android.content.Context
import android.os.Bundle
@@ -30,8 +30,8 @@ import pl.szczodrzynski.edziennik.ext.setText
import pl.szczodrzynski.edziennik.ui.messages.MessagesUtils
import pl.szczodrzynski.edziennik.utils.TextInputKeyboardEdit
import pl.szczodrzynski.edziennik.utils.html.BetterHtml
-import pl.szczodrzynski.edziennik.utils.managers.TextStylingManager.HtmlMode.ORIGINAL
-import pl.szczodrzynski.edziennik.utils.managers.TextStylingManager.StylingConfig
+import pl.szczodrzynski.edziennik.core.manager.TextStylingManager.HtmlMode.ORIGINAL
+import pl.szczodrzynski.edziennik.core.manager.TextStylingManager.StylingConfig
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Time
import pl.szczodrzynski.edziennik.utils.span.BoldSpan
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/NoteManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/NoteManager.kt
similarity index 99%
rename from app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/NoteManager.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/manager/NoteManager.kt
index 50ac84cd..fc8b244d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/NoteManager.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/NoteManager.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2021-10-17.
*/
-package pl.szczodrzynski.edziennik.utils.managers
+package pl.szczodrzynski.edziennik.core.manager
import android.annotation.SuppressLint
import android.text.SpannableStringBuilder
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/NotificationManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/NotificationManager.kt
new file mode 100644
index 00000000..f8e9d269
--- /dev/null
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/NotificationManager.kt
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) Kuba Szczodrzyński 2020-2-15.
+ */
+
+package pl.szczodrzynski.edziennik.core.manager
+
+import android.app.NotificationChannel
+import android.app.NotificationManager
+import android.content.Context
+import android.os.Build
+import androidx.core.app.NotificationCompat.*
+import androidx.core.app.NotificationManagerCompat.*
+import pl.szczodrzynski.edziennik.R
+
+class NotificationManager(val c: Context) {
+ data class Channel(
+ val id: Int,
+ val key: String,
+ val name: String,
+ val description: String,
+ val importance: Int,
+ val priority: Int,
+ val quiet: Boolean = false,
+ val lightColor: Int? = null
+ )
+
+ fun registerAllChannels() {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
+ return
+ val manager = c.getSystemService(NotificationManager::class.java)
+
+ val registered = manager.notificationChannels.map { it.id }.toSet()
+ val all = all.map { it.key }.toSet()
+
+ val toRegister = all - registered
+ val toDelete = registered - all
+
+ for (key in toRegister) {
+ val channel = this.all.firstOrNull { it.key == key } ?: continue
+ manager.createNotificationChannel(NotificationChannel(key, channel.name, channel.importance).apply {
+ description = channel.description
+ if (channel.quiet) {
+ enableVibration(false)
+ setSound(null, null)
+ }
+ channel.lightColor?.let {
+ enableLights(true)
+ lightColor = it
+ }
+ })
+ }
+
+ for (key in toDelete) {
+ if (key.contains("chucker"))
+ continue
+ manager.deleteNotificationChannel(key)
+ }
+ }
+
+ val sync = Channel(
+ 1,
+ "pl.szczodrzynski.edziennik.SYNC",
+ c.getString(R.string.notification_channel_get_data_name),
+ c.getString(R.string.notification_channel_get_data_desc),
+ IMPORTANCE_MIN,
+ PRIORITY_MIN,
+ quiet = true
+ )
+
+ val data = Channel(
+ 50,
+ "pl.szczodrzynski.edziennik.DATA",
+ c.getString(R.string.notification_channel_notifications_name),
+ c.getString(R.string.notification_channel_notifications_desc),
+ IMPORTANCE_HIGH,
+ PRIORITY_MAX,
+ lightColor = 0xff2196f3.toInt()
+ )
+
+ val dataQuiet = Channel(
+ 60,
+ "pl.szczodrzynski.edziennik.DATA_QUIET",
+ c.getString(R.string.notification_channel_notifications_quiet_name),
+ c.getString(R.string.notification_channel_notifications_quiet_desc),
+ IMPORTANCE_LOW,
+ PRIORITY_LOW,
+ quiet = true
+ )
+
+ val updates = Channel(
+ 100,
+ "pl.szczodrzynski.edziennik.UPDATES",
+ c.getString(R.string.notification_channel_updates_name),
+ c.getString(R.string.notification_channel_updates_desc),
+ IMPORTANCE_DEFAULT,
+ PRIORITY_DEFAULT
+ )
+
+ val userAttention = Channel(
+ 200,
+ "pl.szczodrzynski.edziennik.USER_ATTENTION",
+ c.getString(R.string.notification_channel_user_attention_name),
+ c.getString(R.string.notification_channel_user_attention_desc),
+ IMPORTANCE_DEFAULT,
+ PRIORITY_DEFAULT
+ )
+
+ val all by lazy { listOf(
+ sync,
+ data,
+ dataQuiet,
+ updates,
+ userAttention
+ ) }
+}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/PermissionManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/PermissionManager.kt
similarity index 99%
rename from app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/PermissionManager.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/manager/PermissionManager.kt
index e99f9e3e..6091803e 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/PermissionManager.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/PermissionManager.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2020-4-7.
*/
-package pl.szczodrzynski.edziennik.utils.managers
+package pl.szczodrzynski.edziennik.core.manager
import android.Manifest
import android.content.Intent
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/ShortcutManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/ShortcutManager.kt
new file mode 100644
index 00000000..9a561dd3
--- /dev/null
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/ShortcutManager.kt
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) Kuba Szczodrzyński 2024-7-1.
+ */
+
+package pl.szczodrzynski.edziennik.core.manager
+
+import android.content.Intent
+import android.content.pm.ShortcutInfo
+import android.content.pm.ShortcutManager
+import android.graphics.drawable.Icon
+import android.os.Build
+import androidx.core.content.getSystemService
+import pl.szczodrzynski.edziennik.App
+import pl.szczodrzynski.edziennik.MainActivity
+import pl.szczodrzynski.edziennik.R
+import pl.szczodrzynski.edziennik.data.enums.NavTarget
+import pl.szczodrzynski.edziennik.ext.putExtras
+
+class ShortcutManager(val app: App) {
+
+ data class Shortcut(
+ val id: String,
+ val label: Int,
+ val icon: Int,
+ val target: NavTarget,
+ )
+
+ private val shortcuts = listOf(
+ Shortcut(
+ id = "item_timetable",
+ label = R.string.shortcut_timetable,
+ icon = R.mipmap.ic_shortcut_timetable,
+ target = NavTarget.TIMETABLE,
+ ),
+ Shortcut(
+ id = "item_agenda",
+ label = R.string.shortcut_agenda,
+ icon = R.mipmap.ic_shortcut_agenda,
+ target = NavTarget.AGENDA,
+ ),
+ Shortcut(
+ id = "item_grades",
+ label = R.string.shortcut_grades,
+ icon = R.mipmap.ic_shortcut_grades,
+ target = NavTarget.GRADES,
+ ),
+ Shortcut(
+ id = "item_homeworks",
+ label = R.string.shortcut_homework,
+ icon = R.mipmap.ic_shortcut_homework,
+ target = NavTarget.HOMEWORK,
+ ),
+ Shortcut(
+ id = "item_messages",
+ label = R.string.shortcut_messages,
+ icon = R.mipmap.ic_shortcut_messages,
+ target = NavTarget.MESSAGES,
+ ),
+ )
+
+ fun createShortcuts() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
+ app.getSystemService()?.dynamicShortcuts = shortcuts.map {
+ ShortcutInfo.Builder(app, it.id)
+ .setShortLabel(app.getString(it.label))
+ .setLongLabel(app.getString(it.label))
+ .setIcon(Icon.createWithResource(app, it.icon))
+ .setIntent(
+ Intent(Intent.ACTION_MAIN, null, app, MainActivity::class.java)
+ .putExtras("fragmentId" to it.target)
+ )
+ .build()
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/TextStylingManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/TextStylingManager.kt
similarity index 98%
rename from app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/TextStylingManager.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/manager/TextStylingManager.kt
index 7a96c270..86d1a72b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/TextStylingManager.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/TextStylingManager.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2021-10-7.
*/
-package pl.szczodrzynski.edziennik.utils.managers
+package pl.szczodrzynski.edziennik.core.manager
import android.text.SpannableStringBuilder
import android.text.Spanned
@@ -31,7 +31,7 @@ import pl.szczodrzynski.edziennik.ext.replaceSpan
import pl.szczodrzynski.edziennik.ui.dialogs.StyledTextDialog
import pl.szczodrzynski.edziennik.utils.TextInputKeyboardEdit
import pl.szczodrzynski.edziennik.utils.html.BetterHtml
-import pl.szczodrzynski.edziennik.utils.managers.TextStylingManager.HtmlMode.*
+import pl.szczodrzynski.edziennik.core.manager.TextStylingManager.HtmlMode.*
import pl.szczodrzynski.edziennik.utils.span.BoldSpan
import pl.szczodrzynski.edziennik.utils.span.ItalicSpan
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/TimetableManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/TimetableManager.kt
similarity index 92%
rename from app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/TimetableManager.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/manager/TimetableManager.kt
index 5448feb7..869dd26f 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/TimetableManager.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/TimetableManager.kt
@@ -2,11 +2,9 @@
* Copyright (c) Kuba Szczodrzyński 2020-3-10.
*/
-package pl.szczodrzynski.edziennik.utils.managers
+package pl.szczodrzynski.edziennik.core.manager
import android.content.Context
-import android.graphics.PorterDuff
-import android.graphics.PorterDuffColorFilter
import android.widget.TextView
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -15,11 +13,8 @@ import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.db.entity.Lesson
import pl.szczodrzynski.edziennik.data.db.full.LessonFull
-import pl.szczodrzynski.edziennik.ext.resolveAttr
import pl.szczodrzynski.edziennik.ext.setText
-import pl.szczodrzynski.edziennik.ext.setTintColor
import pl.szczodrzynski.edziennik.ext.startCoroutineTimer
-import pl.szczodrzynski.navlib.getColorFromAttr
import kotlin.coroutines.CoroutineContext
class TimetableManager(val app: App) : CoroutineScope {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/UiManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/UiManager.kt
similarity index 94%
rename from app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/UiManager.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/manager/UiManager.kt
index 52df8158..cd99fd6b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/UiManager.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/UiManager.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2024-6-26.
*/
-package pl.szczodrzynski.edziennik.utils.managers
+package pl.szczodrzynski.edziennik.core.manager
import android.content.Context
import android.os.Build
@@ -17,7 +17,7 @@ import pl.szczodrzynski.edziennik.data.enums.Theme
import pl.szczodrzynski.edziennik.data.enums.Theme.Mode
import pl.szczodrzynski.edziennik.data.enums.Theme.Type
import pl.szczodrzynski.edziennik.ext.isNightMode
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
import java.util.Locale
class UiManager(val app: App) {
@@ -63,7 +63,7 @@ class UiManager(val app: App) {
) {
color = Theme.BLUE
}
- d(TAG, "Applying theme $color($type, $mode)")
+ Timber.d("Applying theme $color($type, $mode)")
color.styleRes[type to mode] ?: color.styleRes[Type.M3 to Mode.DAYNIGHT]!!
}
activity.setTheme(themeRes)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/UpdateManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/UpdateManager.kt
similarity index 98%
rename from app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/UpdateManager.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/manager/UpdateManager.kt
index f2d1c131..67c75295 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/UpdateManager.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/UpdateManager.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2022-10-22.
*/
-package pl.szczodrzynski.edziennik.utils.managers
+package pl.szczodrzynski.edziennik.core.manager
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/UserActionManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/UserActionManager.kt
similarity index 96%
rename from app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/UserActionManager.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/manager/UserActionManager.kt
index 9ca4c233..80fd7764 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/UserActionManager.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/manager/UserActionManager.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2020-2-15.
*/
-package pl.szczodrzynski.edziennik.utils.managers
+package pl.szczodrzynski.edziennik.core.manager
import android.app.NotificationManager
import android.app.PendingIntent
@@ -24,7 +24,7 @@ import pl.szczodrzynski.edziennik.ui.login.oauth.OAuthLoginActivity
import pl.szczodrzynski.edziennik.ui.login.oauth.OAuthLoginResult
import pl.szczodrzynski.edziennik.ui.login.recaptcha.RecaptchaActivity
import pl.szczodrzynski.edziennik.ui.login.recaptcha.RecaptchaResult
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
class UserActionManager(val app: App) {
companion object {
@@ -55,7 +55,7 @@ class UserActionManager(val app: App) {
)
val notification =
- NotificationCompat.Builder(app, app.notificationChannelsManager.userAttention.key)
+ NotificationCompat.Builder(app, app.notificationManager.userAttention.key)
.setContentTitle(app.getString(R.string.notification_user_action_required_title))
.setContentText(text)
.setSmallIcon(R.drawable.ic_error_outline)
@@ -82,7 +82,7 @@ class UserActionManager(val app: App) {
event: UserActionRequiredEvent,
callback: UserActionCallback,
) {
- d(TAG, "Running user action (${event.type}) with params: ${event.params}")
+ Timber.d("Running user action (${event.type}) with params: ${event.params}")
val isSuccessful = when (event.type) {
UserActionRequiredEvent.Type.RECAPTCHA -> executeRecaptcha(activity, event, callback)
UserActionRequiredEvent.Type.OAUTH -> executeOauth(activity, event, callback)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/network/cookie/DumbCookie.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/network/DumbCookie.kt
similarity index 97%
rename from app/src/main/java/pl/szczodrzynski/edziennik/network/cookie/DumbCookie.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/network/DumbCookie.kt
index ecd513b0..24c096f7 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/network/cookie/DumbCookie.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/network/DumbCookie.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2020-3-24.
*/
-package pl.szczodrzynski.edziennik.network.cookie
+package pl.szczodrzynski.edziennik.core.network
import okhttp3.Cookie
import okhttp3.HttpUrl
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/network/cookie/DumbCookieJar.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/network/DumbCookieJar.kt
similarity index 98%
rename from app/src/main/java/pl/szczodrzynski/edziennik/network/cookie/DumbCookieJar.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/network/DumbCookieJar.kt
index 945e16ea..c9e88b0d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/network/cookie/DumbCookieJar.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/network/DumbCookieJar.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2020-3-24.
*/
-package pl.szczodrzynski.edziennik.network.cookie
+package pl.szczodrzynski.edziennik.core.network
import android.content.Context
import androidx.core.content.edit
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/receivers/SzkolnyReceiver.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/receiver/SzkolnyReceiver.kt
similarity index 96%
rename from app/src/main/java/pl/szczodrzynski/edziennik/receivers/SzkolnyReceiver.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/receiver/SzkolnyReceiver.kt
index f7819c43..6527ac12 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/receivers/SzkolnyReceiver.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/receiver/SzkolnyReceiver.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2019-10-1.
*/
-package pl.szczodrzynski.edziennik.receivers
+package pl.szczodrzynski.edziennik.core.receiver
import android.content.BroadcastReceiver
import android.content.Context
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/receivers/UserPresentReceiver.java b/app/src/main/java/pl/szczodrzynski/edziennik/core/receiver/UserPresentReceiver.java
similarity index 96%
rename from app/src/main/java/pl/szczodrzynski/edziennik/receivers/UserPresentReceiver.java
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/receiver/UserPresentReceiver.java
index 82a31f11..e085d9ba 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/receivers/UserPresentReceiver.java
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/receiver/UserPresentReceiver.java
@@ -1,4 +1,4 @@
-package pl.szczodrzynski.edziennik.receivers;
+package pl.szczodrzynski.edziennik.core.receiver;
import android.appwidget.AppWidgetManager;
import android.content.BroadcastReceiver;
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/sync/AppManagerDetectedEvent.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/work/AppManagerDetectedEvent.kt
similarity index 57%
rename from app/src/main/java/pl/szczodrzynski/edziennik/sync/AppManagerDetectedEvent.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/work/AppManagerDetectedEvent.kt
index 10d93dfc..eea77e04 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/sync/AppManagerDetectedEvent.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/work/AppManagerDetectedEvent.kt
@@ -1,3 +1,3 @@
-package pl.szczodrzynski.edziennik.sync
+package pl.szczodrzynski.edziennik.core.work
-class AppManagerDetectedEvent(val failedWorkTimestamps: List)
\ No newline at end of file
+class AppManagerDetectedEvent(val failedWorkTimestamps: List)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/sync/SyncWorker.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/work/SyncWorker.kt
similarity index 90%
rename from app/src/main/java/pl/szczodrzynski/edziennik/sync/SyncWorker.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/work/SyncWorker.kt
index 3a2a5f40..66f40314 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/sync/SyncWorker.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/work/SyncWorker.kt
@@ -1,4 +1,4 @@
-package pl.szczodrzynski.edziennik.sync
+package pl.szczodrzynski.edziennik.core.work
import android.annotation.SuppressLint
import android.content.Context
@@ -6,7 +6,7 @@ import androidx.work.*
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.data.api.edziennik.EdziennikTask
import pl.szczodrzynski.edziennik.ext.formatDate
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
import java.util.concurrent.TimeUnit
class SyncWorker(val context: Context, val params: WorkerParameters) : Worker(context, params) {
@@ -38,7 +38,7 @@ class SyncWorker(val context: Context, val params: WorkerParameters) : Worker(co
val syncInterval = app.config.sync.interval.toLong()
val syncAt = System.currentTimeMillis() + syncInterval*1000
- d(TAG, "Scheduling work at ${syncAt.formatDate()}")
+ Timber.d("Scheduling work at ${syncAt.formatDate()}")
val constraints = Constraints.Builder()
.setRequiredNetworkType(
@@ -61,14 +61,14 @@ class SyncWorker(val context: Context, val params: WorkerParameters) : Worker(co
* Cancel any scheduled sync job.
*/
fun cancelNext(app: App) {
- d(TAG, "Cancelling work by tag $TAG")
+ Timber.d("Cancelling work by tag $TAG")
WorkManager.getInstance(app).cancelAllWorkByTag(TAG)
//WorkManager.getInstance(app).pruneWork() // do not prune the work in order to look for failed tasks
}
}
override fun doWork(): Result {
- d(TAG, "Running worker ID ${params.id}")
+ Timber.d("Running worker ID ${params.id}")
EdziennikTask.sync().enqueue(context)
rescheduleNext(context as App)
return Result.success()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/sync/UpdateStateEvent.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/work/UpdateStateEvent.kt
similarity index 82%
rename from app/src/main/java/pl/szczodrzynski/edziennik/sync/UpdateStateEvent.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/work/UpdateStateEvent.kt
index 878efdb8..dbae6b9e 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/sync/UpdateStateEvent.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/work/UpdateStateEvent.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2022-10-22.
*/
-package pl.szczodrzynski.edziennik.sync
+package pl.szczodrzynski.edziennik.core.work
import pl.szczodrzynski.edziennik.data.api.szkolny.response.Update
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/sync/UpdateWorker.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/work/UpdateWorker.kt
similarity index 91%
rename from app/src/main/java/pl/szczodrzynski/edziennik/sync/UpdateWorker.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/work/UpdateWorker.kt
index 3d22e044..11d586e5 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/sync/UpdateWorker.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/work/UpdateWorker.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2020-1-18.
*/
-package pl.szczodrzynski.edziennik.sync
+package pl.szczodrzynski.edziennik.core.work
import android.annotation.SuppressLint
import android.content.Context
@@ -13,6 +13,7 @@ import pl.szczodrzynski.edziennik.data.api.szkolny.response.Update
import pl.szczodrzynski.edziennik.ext.DAY
import pl.szczodrzynski.edziennik.ext.formatDate
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
import java.util.concurrent.TimeUnit
import kotlin.coroutines.CoroutineContext
@@ -43,7 +44,7 @@ class UpdateWorker(val context: Context, val params: WorkerParameters) : Worker(
val syncInterval = 4 * DAY;
val syncAt = System.currentTimeMillis() + syncInterval*1000
- Utils.d(TAG, "Scheduling work at ${syncAt.formatDate()}")
+ Timber.d("Scheduling work at ${syncAt.formatDate()}")
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
@@ -62,7 +63,7 @@ class UpdateWorker(val context: Context, val params: WorkerParameters) : Worker(
* Cancel any scheduled sync job.
*/
fun cancelNext(app: App) {
- Utils.d(TAG, "Cancelling work by tag $TAG")
+ Timber.d("Cancelling work by tag $TAG")
WorkManager.getInstance(app).cancelAllWorkByTag(TAG)
}
}
@@ -72,7 +73,7 @@ class UpdateWorker(val context: Context, val params: WorkerParameters) : Worker(
get() = job + Dispatchers.Main
override fun doWork(): Result {
- Utils.d(TAG, "Running worker ID ${params.id}")
+ Timber.d("Running worker ID ${params.id}")
val app = context as App
if (!app.config.sync.notifyAboutUpdates) {
return Result.success()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/sync/WorkerUtils.kt b/app/src/main/java/pl/szczodrzynski/edziennik/core/work/WorkerUtils.kt
similarity index 73%
rename from app/src/main/java/pl/szczodrzynski/edziennik/sync/WorkerUtils.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/core/work/WorkerUtils.kt
index a3250ed8..2e0a8b66 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/sync/WorkerUtils.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/core/work/WorkerUtils.kt
@@ -2,7 +2,7 @@
* Copyright (c) Kuba Szczodrzyński 2020-1-18.
*/
-package pl.szczodrzynski.edziennik.sync
+package pl.szczodrzynski.edziennik.core.work
import android.annotation.SuppressLint
import android.os.AsyncTask
@@ -14,6 +14,7 @@ import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.ext.MINUTE
import pl.szczodrzynski.edziennik.ext.formatDate
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
object WorkerUtils {
/**
@@ -26,27 +27,27 @@ object WorkerUtils {
val workManager = WorkManager.getInstance(app) as WorkManagerImpl
val scheduledWork = workManager.workDatabase.workSpecDao().getScheduledWork().toMutableList()
scheduledWork.forEach {
- Utils.d("WorkerUtils", "Work: ${it.id} at ${it.calculateNextRunTime().formatDate()}. State = ${it.state} (finished = ${it.state.isFinished})")
+ Timber.d("Work: ${it.id} at ${it.calculateNextRunTime().formatDate()}. State = ${it.state} (finished = ${it.state.isFinished})")
}
// remove finished work and other than SyncWorker
scheduledWork.removeAll { it.workerClassName != SyncWorker::class.java.canonicalName || it.isPeriodic || it.state.isFinished }
- Utils.d("WorkerUtils", "Found ${scheduledWork.size} unfinished work")
+ Timber.d("Found ${scheduledWork.size} unfinished work")
// remove all enqueued work that had to (but didn't) run at some point in the past (at least 1min ago)
val failedWork = scheduledWork.filter { it.state == WorkInfo.State.ENQUEUED && it.calculateNextRunTime() < System.currentTimeMillis() - 1 * MINUTE * 1000 }
- Utils.d("WorkerUtils", "${failedWork.size} work requests failed to start (out of ${scheduledWork.size} requests)")
+ Timber.d("${failedWork.size} work requests failed to start (out of ${scheduledWork.size} requests)")
if (rescheduleIfFailedFound) {
if (failedWork.isNotEmpty()) {
- Utils.d("WorkerUtils", "App Manager detected!")
+ Timber.d("App Manager detected!")
EventBus.getDefault().postSticky(AppManagerDetectedEvent(failedWork.map { it.calculateNextRunTime() }))
}
if (scheduledWork.size - failedWork.size < 1) {
- Utils.d("WorkerUtils", "No pending work found, scheduling next:")
+ Timber.d("No pending work found, scheduling next:")
onReschedule()
}
} else {
- Utils.d("WorkerUtils", "NOT rescheduling: waiting to open the activity")
+ Timber.d("NOT rescheduling: waiting to open the activity")
if (scheduledWork.size < 1) {
- Utils.d("WorkerUtils", "No work found *at all*, scheduling next:")
+ Timber.d("No work found *at all*, scheduling next:")
onReschedule()
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/ApiService.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/ApiService.kt
index 0d9fe92c..c031b15e 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/ApiService.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/ApiService.kt
@@ -23,7 +23,7 @@ import pl.szczodrzynski.edziennik.data.api.task.IApiTask
import pl.szczodrzynski.edziennik.data.api.task.SzkolnyTask
import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.ext.toApiError
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
import kotlin.math.min
import kotlin.math.roundToInt
@@ -76,7 +76,7 @@ class ApiService : Service() {
private val taskCallback = object : EdziennikCallback {
override fun onCompleted() {
lastEventTime = System.currentTimeMillis()
- d(TAG, "Task $taskRunningId (profile $taskProfileId) finished in ${System.currentTimeMillis()-taskStartTime}")
+ Timber.d("Task $taskRunningId (profile $taskProfileId) finished in ${System.currentTimeMillis()-taskStartTime}")
EventBus.getDefault().postSticky(ApiTaskFinishedEvent(taskProfileId))
clearTask()
@@ -93,12 +93,12 @@ class ApiService : Service() {
override fun onError(apiError: ApiError) {
lastEventTime = System.currentTimeMillis()
- d(TAG, "Task $taskRunningId threw an error - $apiError")
+ Timber.d("Task $taskRunningId threw an error - $apiError")
apiError.profileId = taskProfileId
EventBus.getDefault().postSticky(ApiTaskErrorEvent(apiError))
errorList.add(apiError)
- apiError.throwable?.printStackTrace()
+ Timber.e(apiError.throwable)
if (apiError.isCritical) {
taskRunning?.cancel()
@@ -119,7 +119,7 @@ class ApiService : Service() {
taskProgress = 0f
taskProgress += step
taskProgress = min(100f, taskProgress)
- d(TAG, "Task $taskRunningId progress: ${taskProgress.roundToInt()}%")
+ Timber.d("Task $taskRunningId progress: ${taskProgress.roundToInt()}%")
EventBus.getDefault().post(ApiTaskProgressEvent(taskProfileId, taskProgress, taskProgressText))
notification.setProgress(taskProgress).post()
}
@@ -127,7 +127,7 @@ class ApiService : Service() {
override fun onStartProgress(stringRes: Int) {
lastEventTime = System.currentTimeMillis()
taskProgressText = getString(stringRes)
- d(TAG, "Task $taskRunningId progress: $taskProgressText")
+ Timber.d("Task $taskRunningId progress: $taskProgressText")
EventBus.getDefault().post(ApiTaskProgressEvent(taskProfileId, taskProgress, taskProgressText))
notification.setProgressText(taskProgressText).post()
}
@@ -166,7 +166,7 @@ class ApiService : Service() {
taskProgress = -1f
taskProgressText = task.taskName
- d(TAG, "Executing task $taskRunningId - ${task::class.java.name}")
+ Timber.d("Executing task $taskRunningId - ${task::class.java.name}")
// update the notification
notification.setCurrentTask(taskRunningId, taskProgressText).post()
@@ -200,7 +200,7 @@ class ApiService : Service() {
if (System.currentTimeMillis() - lastEventTime > 30*1000
|| taskCancelTries >= 3) {
val time = System.currentTimeMillis() - lastEventTime
- d(TAG, "!!! Task $taskRunningId froze for $time ms. $taskRunning")
+ Timber.d("!!! Task $taskRunningId froze for $time ms. $taskRunning")
clearTask()
return true
}
@@ -245,7 +245,7 @@ class ApiService : Service() {
@Subscribe(sticky = true, threadMode = ThreadMode.ASYNC)
fun onApiTask(task: IApiTask) {
EventBus.getDefault().removeStickyEvent(task)
- d(TAG, task.toString())
+ Timber.d(task.toString())
if (task is EdziennikTask) {
// fix for duplicated tasks, thank you EventBus
@@ -270,10 +270,10 @@ class ApiService : Service() {
else {
taskQueue += task
}
- d(TAG, "EventBus received an IApiTask: $task")
- d(TAG, "Current queue:")
+ Timber.d("EventBus received an IApiTask: $task")
+ Timber.d("Current queue:")
taskQueue.forEach {
- d(TAG, " - $it")
+ Timber.d(" - $it")
}
runTask()
}
@@ -281,7 +281,7 @@ class ApiService : Service() {
@Subscribe(sticky = true, threadMode = ThreadMode.ASYNC)
fun onTaskCancelRequest(request: TaskCancelRequest) {
EventBus.getDefault().removeStickyEvent(request)
- d(TAG, request.toString())
+ Timber.d(request.toString())
taskCancelTries++
taskCancelled = true
@@ -291,7 +291,7 @@ class ApiService : Service() {
@Subscribe(sticky = true, threadMode = ThreadMode.ASYNC)
fun onServiceCloseRequest(request: ServiceCloseRequest) {
EventBus.getDefault().removeStickyEvent(request)
- d(TAG, request.toString())
+ Timber.d(request.toString())
serviceClosed = true
taskCancelled = true
@@ -306,19 +306,19 @@ class ApiService : Service() {
____) | __/ | \ V /| | (_| __/ | (_) \ V / __/ | | | | | (_| | __/\__ \
|_____/ \___|_| \_/ |_|\___\___| \___/ \_/ \___|_| |_| |_|\__,_|\___||__*/
override fun onCreate() {
- d(TAG, "Service created")
+ Timber.d("Service created")
EventBus.getDefault().register(this)
notification.setIdle().setCloseAction()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
- d(TAG, "Foreground service onStartCommand")
- startForeground(app.notificationChannelsManager.sync.id, notification.notification)
+ Timber.d("Foreground service onStartCommand")
+ startForeground(app.notificationManager.sync.id, notification.notification)
return START_NOT_STICKY
}
override fun onDestroy() {
- d(TAG, "Service destroyed")
+ Timber.d("Service destroyed")
serviceClosed = true
EventBus.getDefault().unregister(this)
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/EdziennikNotification.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/EdziennikNotification.kt
index 6b2b7533..4fbfa6b8 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/EdziennikNotification.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/EdziennikNotification.kt
@@ -14,7 +14,7 @@ import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.ext.Bundle
import pl.szczodrzynski.edziennik.ext.pendingIntentFlag
-import pl.szczodrzynski.edziennik.receivers.SzkolnyReceiver
+import pl.szczodrzynski.edziennik.core.receiver.SzkolnyReceiver
import kotlin.math.roundToInt
@@ -138,7 +138,7 @@ class EdziennikNotification(val app: App) {
fun post() {
if (serviceClosed)
return
- notificationManager.notify(app.notificationChannelsManager.sync.id, notification)
+ notificationManager.notify(app.notificationManager.sync.id, notification)
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt
index c4363301..97c42482 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt
@@ -30,8 +30,8 @@ import pl.szczodrzynski.edziennik.data.db.full.EventFull
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
import pl.szczodrzynski.edziennik.ext.isBeforeYear
import pl.szczodrzynski.edziennik.ext.shouldArchive
-import pl.szczodrzynski.edziennik.utils.Utils.d
-import pl.szczodrzynski.edziennik.utils.managers.AvailabilityManager.Error.Type
+import pl.szczodrzynski.edziennik.core.manager.AvailabilityManager.Error.Type
+import timber.log.Timber
open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTask(profileId) {
companion object {
@@ -80,16 +80,16 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa
internal fun run(app: App, taskCallback: EdziennikCallback) {
profile?.let { profile ->
if (profile.archived) {
- d(TAG, "The profile $profileId is archived")
+ Timber.d("The profile $profileId is archived")
taskCallback.onError(ApiError(TAG, ERROR_PROFILE_ARCHIVED))
return
}
else if (profile.shouldArchive()) {
- d(TAG, "The profile $profileId's year ended on ${profile.dateYearEnd}, archiving")
+ Timber.d("The profile $profileId's year ended on ${profile.dateYearEnd}, archiving")
ProfileArchiver(app, profile)
}
if (profile.isBeforeYear()) {
- d(TAG, "The profile $profileId's school year has not started yet; aborting sync")
+ Timber.d("The profile $profileId's school year has not started yet; aborting sync")
cancel()
taskCallback.onCompleted()
return
@@ -143,7 +143,7 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa
}
override fun cancel() {
- d(TAG, "Task ${toString()} cancelling...")
+ Timber.d("Task ${toString()} cancelling...")
edziennikInterface?.cancel()
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/ProfileArchiver.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/ProfileArchiver.kt
index 151c1859..66160198 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/ProfileArchiver.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/ProfileArchiver.kt
@@ -9,8 +9,8 @@ import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.data.enums.LoginType
import pl.szczodrzynski.edziennik.ext.Intent
-import pl.szczodrzynski.edziennik.utils.Utils.d
import pl.szczodrzynski.edziennik.utils.models.Date
+import timber.log.Timber
class ProfileArchiver(val app: App, val profile: Profile) {
companion object {
@@ -20,14 +20,14 @@ class ProfileArchiver(val app: App, val profile: Profile) {
init {
if (profile.archiveId == null)
profile.archiveId = profile.id
- d(TAG, "Processing ${profile.name}#${profile.id}, archiveId = ${profile.archiveId}")
+ Timber.d("Processing ${profile.name}#${profile.id}, archiveId = ${profile.archiveId}")
profile.archived = true
app.db.profileDao().add(profile)
//app.db.metadataDao().setAllSeen(profile.id, true)
app.db.notificationDao().clear(profile.id)
app.db.endpointTimerDao().clear(profile.id)
- d(TAG, "Archived profile ${profile.id} saved")
+ Timber.d("Archived profile ${profile.id} saved")
profile.archived = false
// guess the nearest school year
@@ -48,7 +48,7 @@ class ProfileArchiver(val app: App, val profile: Profile) {
profile.subname = "Nowy rok szkolny - ${profile.studentSchoolYearStart}"
profile.studentClassName = null
- d(TAG, "New profile ID for ${profile.name}: ${profile.id}")
+ Timber.d("New profile ID for ${profile.name}: ${profile.id}")
when (profile.loginStoreType) {
LoginType.LIBRUS -> {
@@ -79,7 +79,7 @@ class ProfileArchiver(val app: App, val profile: Profile) {
LoginType.TEMPLATE -> {}
}
- d(TAG, "Processed student data: ${profile.studentData}")
+ Timber.d("Processed student data: ${profile.studentData}")
app.db.profileDao().add(profile)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt
index 337f30c2..d13067c3 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt
@@ -29,7 +29,7 @@ import pl.szczodrzynski.edziennik.data.enums.LoginMethod
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
import pl.szczodrzynski.edziennik.data.db.full.EventFull
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, val callback: EdziennikCallback) : EdziennikInterface {
companion object {
@@ -67,10 +67,10 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
}
private fun login(loginMethod: LoginMethod? = null, afterLogin: (() -> Unit)? = null) {
- d(TAG, "Trying to login with ${data.targetLoginMethods}")
+ Timber.d("Trying to login with ${data.targetLoginMethods}")
if (internalErrorList.isNotEmpty()) {
- d(TAG, " - Internal errors:")
- internalErrorList.forEach { d(TAG, " - code $it") }
+ Timber.d(" - Internal errors:")
+ internalErrorList.forEach { Timber.d(" - code $it") }
}
loginMethod?.let { data.prepareFor(it) }
afterLogin?.let { this.afterLogin = it }
@@ -80,10 +80,10 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
}
private fun data() {
- d(TAG, "Endpoint IDs: ${data.targetEndpoints}")
+ Timber.d("Endpoint IDs: ${data.targetEndpoints}")
if (internalErrorList.isNotEmpty()) {
- d(TAG, " - Internal errors:")
- internalErrorList.forEach { d(TAG, " - code $it") }
+ Timber.d(" - Internal errors:")
+ internalErrorList.forEach { Timber.d(" - code $it") }
}
afterLogin?.invoke() ?: LibrusData(data) {
completed()
@@ -158,7 +158,7 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
override fun firstLogin() { LibrusFirstLogin(data) { completed() } }
override fun cancel() {
- d(TAG, "Cancelled")
+ Timber.d("Cancelled")
data.cancel()
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusApi.kt
index 2b736a0f..c5366783 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusApi.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusApi.kt
@@ -12,7 +12,7 @@ import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.ext.getString
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
import java.net.HttpURLConnection.*
open class LibrusApi(open val data: DataLibrus, open val lastSync: Long?) {
@@ -28,7 +28,7 @@ open class LibrusApi(open val data: DataLibrus, open val lastSync: Long?) {
fun apiGet(tag: String, endpoint: String, method: Int = GET, payload: JsonObject? = null, ignoreErrors: List = emptyList(), onSuccess: (json: JsonObject) -> Unit) {
- d(tag, "Request: Librus/Api - ${if (data.fakeLogin) FAKE_LIBRUS_API else LIBRUS_API_URL}/$endpoint")
+ Timber.tag(tag).d("Request: Librus/Api - ${if (data.fakeLogin) FAKE_LIBRUS_API else LIBRUS_API_URL}/$endpoint")
val callback = object : JsonCallbackHandler() {
override fun onSuccess(json: JsonObject?, response: Response?) {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusData.kt
index a5d9256e..1b7adcd2 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusData.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusData.kt
@@ -13,6 +13,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.synergia.Librus
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.synergia.LibrusSynergiaInfo
import pl.szczodrzynski.edziennik.data.db.entity.Message
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
class LibrusData(val data: DataLibrus, val onSuccess: () -> Unit) {
companion object {
@@ -41,7 +42,7 @@ class LibrusData(val data: DataLibrus, val onSuccess: () -> Unit) {
}
private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
- Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
+ Timber.d("Using endpoint $endpointId. Last sync time = $lastSync")
when (endpointId) {
/**
* API
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusMessages.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusMessages.kt
index dc8d8c47..0fc25c87 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusMessages.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusMessages.kt
@@ -20,7 +20,7 @@ import org.jsoup.parser.Parser
import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
import pl.szczodrzynski.edziennik.data.api.models.ApiError
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
import java.io.File
import java.io.StringWriter
import javax.xml.parsers.DocumentBuilderFactory
@@ -43,7 +43,7 @@ open class LibrusMessages(open val data: DataLibrus, open val lastSync: Long?) {
fun messagesGet(tag: String, module: String, method: Int = POST,
parameters: Map? = null, onSuccess: (doc: Document) -> Unit) {
- d(tag, "Request: Librus/Messages - $LIBRUS_MESSAGES_URL/$module")
+ Timber.tag(tag).d("Request: Librus/Messages - $LIBRUS_MESSAGES_URL/$module")
val callback = object : TextCallbackHandler() {
override fun onSuccess(text: String?, response: Response?) {
@@ -127,7 +127,7 @@ open class LibrusMessages(open val data: DataLibrus, open val lastSync: Long?) {
fun messagesGetJson(tag: String, module: String, method: Int = POST,
parameters: Map? = null, onSuccess: (json: JsonObject?) -> Unit) {
- d(tag, "Request: Librus/Messages - $LIBRUS_MESSAGES_URL/$module")
+ Timber.tag(tag).d("Request: Librus/Messages - $LIBRUS_MESSAGES_URL/$module")
val callback = object : TextCallbackHandler() {
override fun onSuccess(text: String?, response: Response?) {
@@ -211,7 +211,7 @@ open class LibrusMessages(open val data: DataLibrus, open val lastSync: Long?) {
fun sandboxGet(tag: String, action: String, parameters: Map? = null,
onSuccess: (json: JsonObject) -> Unit) {
- d(tag, "Request: Librus/Messages - $LIBRUS_SANDBOX_URL$action")
+ Timber.tag(tag).d("Request: Librus/Messages - $LIBRUS_SANDBOX_URL$action")
val callback = object : JsonCallbackHandler() {
override fun onSuccess(json: JsonObject?, response: Response?) {
@@ -256,7 +256,7 @@ open class LibrusMessages(open val data: DataLibrus, open val lastSync: Long?) {
method: Int = GET,
onProgress: (written: Long, total: Long) -> Unit) {
- d(tag, "Request: Librus/Messages - $url")
+ Timber.tag(tag).d("Request: Librus/Messages - $url")
val callback = object : FileCallbackHandler(targetFile) {
override fun onSuccess(file: File?, response: Response?) {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusPortal.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusPortal.kt
index d1d34226..d1d1083e 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusPortal.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusPortal.kt
@@ -8,7 +8,7 @@ import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.ext.getString
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
import java.net.HttpURLConnection
open class LibrusPortal(open val data: DataLibrus) {
@@ -24,7 +24,7 @@ open class LibrusPortal(open val data: DataLibrus) {
fun portalGet(tag: String, endpoint: String, method: Int = GET, payload: JsonObject? = null, onSuccess: (json: JsonObject, response: Response?) -> Unit) {
- d(tag, "Request: Librus/Portal - ${if (data.fakeLogin) FAKE_LIBRUS_PORTAL else LIBRUS_PORTAL_URL}$endpoint")
+ Timber.tag(tag).d("Request: Librus/Portal - ${if (data.fakeLogin) FAKE_LIBRUS_PORTAL else LIBRUS_PORTAL_URL}$endpoint")
val callback = object : JsonCallbackHandler() {
override fun onSuccess(json: JsonObject?, response: Response?) {
@@ -59,8 +59,8 @@ open class LibrusPortal(open val data: DataLibrus) {
if (response?.code() == HttpURLConnection.HTTP_OK) {
try {
onSuccess(json, response)
- } catch (e: NullPointerException) {
- e.printStackTrace()
+ } catch (e: Exception) {
+ Timber.e(e)
data.error(ApiError(tag, EXCEPTION_LIBRUS_PORTAL_SYNERGIA_TOKEN)
.withResponse(response)
.withThrowable(e)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusSynergia.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusSynergia.kt
index 72faf801..26c1496d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusSynergia.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusSynergia.kt
@@ -10,7 +10,7 @@ import im.wangchao.mhttp.callback.TextCallbackHandler
import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
import pl.szczodrzynski.edziennik.data.api.models.ApiError
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
open class LibrusSynergia(open val data: DataLibrus, open val lastSync: Long?) {
companion object {
@@ -25,7 +25,7 @@ open class LibrusSynergia(open val data: DataLibrus, open val lastSync: Long?) {
fun synergiaGet(tag: String, endpoint: String, method: Int = GET,
parameters: Map = emptyMap(), onSuccess: (text: String) -> Unit) {
- d(tag, "Request: Librus/Synergia - $LIBRUS_SYNERGIA_URL/$endpoint")
+ Timber.tag(tag).d("Request: Librus/Synergia - $LIBRUS_SYNERGIA_URL/$endpoint")
val callback = object : TextCallbackHandler() {
override fun onSuccess(text: String?, response: Response?) {
@@ -91,7 +91,7 @@ open class LibrusSynergia(open val data: DataLibrus, open val lastSync: Long?) {
}
fun redirectUrlGet(tag: String, url: String, onSuccess: (url: String) -> Unit) {
- d(tag, "Request: Librus/Synergia - $url")
+ Timber.tag(tag).d("Request: Librus/Synergia - $url")
val callback = object : TextCallbackHandler() {
override fun onSuccess(text: String?, response: Response) {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTimetables.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTimetables.kt
index 8ec3beae..af7f7add 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTimetables.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTimetables.kt
@@ -16,10 +16,10 @@ import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
import pl.szczodrzynski.edziennik.data.enums.MetadataType
import pl.szczodrzynski.edziennik.ext.*
-import pl.szczodrzynski.edziennik.utils.Utils.d
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Time
import pl.szczodrzynski.edziennik.utils.models.Week
+import timber.log.Timber
class LibrusApiTimetables(override val data: DataLibrus,
override val lastSync: Long?,
@@ -71,7 +71,7 @@ class LibrusApiTimetables(override val data: DataLibrus,
}
}
- d(TAG, "Clearing lessons between ${weekStart.stringY_m_d} and ${weekEnd.stringY_m_d} - timetable downloaded for $getDate")
+ Timber.d("Clearing lessons between ${weekStart.stringY_m_d} and ${weekEnd.stringY_m_d} - timetable downloaded for $getDate")
if (data.timetableNotPublic) data.timetableNotPublic = false
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLogin.kt
index bf4b2abb..c96001cc 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLogin.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLogin.kt
@@ -8,6 +8,7 @@ import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
import pl.szczodrzynski.edziennik.data.enums.LoginMethod
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
class LibrusLogin(val data: DataLibrus, val onSuccess: () -> Unit) {
companion object {
@@ -43,7 +44,7 @@ class LibrusLogin(val data: DataLibrus, val onSuccess: () -> Unit) {
onSuccess(null)
return
}
- Utils.d(TAG, "Using login method $loginMethod")
+ Timber.d("Using login method $loginMethod")
when (loginMethod) {
LoginMethod.LIBRUS_PORTAL -> {
data.startProgress(R.string.edziennik_progress_login_librus_portal)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginApi.kt
index b0268b5c..300da4b2 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginApi.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginApi.kt
@@ -17,7 +17,7 @@ import pl.szczodrzynski.edziennik.data.enums.LoginMode
import pl.szczodrzynski.edziennik.ext.getInt
import pl.szczodrzynski.edziennik.ext.getString
import pl.szczodrzynski.edziennik.ext.getUnixDate
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
import java.net.HttpURLConnection.*
@Suppress("ConvertSecondaryConstructorToPrimary")
@@ -171,7 +171,7 @@ class LibrusLoginApi {
}
private fun synergiaGetToken() {
- d(TAG, "Request: Librus/Login/Api - $LIBRUS_API_TOKEN_URL")
+ Timber.d("Request: Librus/Login/Api - $LIBRUS_API_TOKEN_URL")
Request.builder()
.url(LIBRUS_API_TOKEN_URL)
@@ -192,7 +192,7 @@ class LibrusLoginApi {
.enqueue()
}
private fun synergiaRefreshToken() {
- d(TAG, "Request: Librus/Login/Api - $LIBRUS_API_TOKEN_URL")
+ Timber.d("Request: Librus/Login/Api - $LIBRUS_API_TOKEN_URL")
Request.builder()
.url(LIBRUS_API_TOKEN_URL)
@@ -211,7 +211,7 @@ class LibrusLoginApi {
.enqueue()
}
private fun jstGetToken() {
- d(TAG, "Request: Librus/Login/Api - $LIBRUS_API_TOKEN_JST_URL")
+ Timber.d("Request: Librus/Login/Api - $LIBRUS_API_TOKEN_JST_URL")
Request.builder()
.url(LIBRUS_API_TOKEN_JST_URL)
@@ -233,7 +233,7 @@ class LibrusLoginApi {
.enqueue()
}
private fun jstRefreshToken() {
- d(TAG, "Request: Librus/Login/Api - $LIBRUS_API_TOKEN_JST_URL")
+ Timber.d("Request: Librus/Login/Api - $LIBRUS_API_TOKEN_JST_URL")
Request.builder()
.url(LIBRUS_API_TOKEN_JST_URL)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginMessages.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginMessages.kt
index b2416365..b131904d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginMessages.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginMessages.kt
@@ -14,7 +14,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.LibrusRecaptchaHelpe
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.data.enums.LoginMethod
import pl.szczodrzynski.edziennik.ext.getUnixDate
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
import java.io.StringWriter
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.transform.OutputKeys
@@ -108,7 +108,7 @@ class LibrusLoginMessages(val data: DataLibrus, val onSuccess: () -> Unit) {
* XML (Flash messages website) login method. Uses a Synergia login and password.
*/
private fun loginWithCredentials() {
- d(TAG, "Request: Librus/Login/Messages - $LIBRUS_MESSAGES_URL/Login")
+ Timber.d("Request: Librus/Login/Messages - $LIBRUS_MESSAGES_URL/Login")
val docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder()
val doc = docBuilder.newDocument()
@@ -152,7 +152,7 @@ class LibrusLoginMessages(val data: DataLibrus, val onSuccess: () -> Unit) {
* A login method using the Synergia website (/wiadomosci2 Auto Login).
*/
private fun loginWithSynergia(url: String = "https://synergia.librus.pl/wiadomosci2") {
- d(TAG, "Request: Librus/Login/Messages - $url")
+ Timber.d("Request: Librus/Login/Messages - $url")
Request.builder()
.url(url)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginPortal.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginPortal.kt
index 8f20faff..2543d9c3 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginPortal.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginPortal.kt
@@ -14,7 +14,7 @@ import pl.szczodrzynski.edziennik.data.api.events.UserActionRequiredEvent
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.data.enums.LoginMode
import pl.szczodrzynski.edziennik.ext.*
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
import java.net.HttpURLConnection.*
import java.util.*
import java.util.regex.Pattern
@@ -63,7 +63,7 @@ class LibrusLoginPortal(val data: DataLibrus, val onSuccess: () -> Unit) {
}}
private fun authorize(url: String, referer: String? = null) {
- d(TAG, "Request: Librus/Login/Portal - $url")
+ Timber.d("Request: Librus/Login/Portal - $url")
Request.builder()
.url(url)
@@ -176,7 +176,7 @@ class LibrusLoginPortal(val data: DataLibrus, val onSuccess: () -> Unit) {
return
}
- d(TAG, "Request: Librus/Login/Portal - $url")
+ Timber.d("Request: Librus/Login/Portal - $url")
val recaptchaCode = data.arguments?.getString("recaptchaCode") ?: data.loginStore.getLoginData("recaptchaCode", null)
val recaptchaTime = data.arguments?.getLong("recaptchaTime") ?: data.loginStore.getLoginData("recaptchaTime", 0L)
@@ -239,7 +239,7 @@ class LibrusLoginPortal(val data: DataLibrus, val onSuccess: () -> Unit) {
}
private fun accessToken(code: String?, refreshToken: String?) {
- d(TAG, "Request: Librus/Login/Portal - ${if (data.fakeLogin) FAKE_LIBRUS_TOKEN else LIBRUS_TOKEN_URL}")
+ Timber.d("Request: Librus/Login/Portal - ${if (data.fakeLogin) FAKE_LIBRUS_TOKEN else LIBRUS_TOKEN_URL}")
val onSuccess = { json: JsonObject, response: Response? ->
data.portalAccessToken = json.getString("access_token")
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginSynergia.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginSynergia.kt
index 62b9a7ba..aad97f2d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginSynergia.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginSynergia.kt
@@ -15,7 +15,7 @@ import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.data.enums.LoginMethod
import pl.szczodrzynski.edziennik.ext.getString
import pl.szczodrzynski.edziennik.ext.getUnixDate
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
import java.net.HttpURLConnection
class LibrusLoginSynergia(override val data: DataLibrus, val onSuccess: () -> Unit) : LibrusApi(data, null) {
@@ -58,7 +58,7 @@ class LibrusLoginSynergia(override val data: DataLibrus, val onSuccess: () -> Un
* A login method using the Synergia API (AutoLoginToken endpoint).
*/
private fun loginWithApi() {
- d(TAG, "Request: Librus/Login/Synergia - $LIBRUS_API_URL/AutoLoginToken")
+ Timber.d("Request: Librus/Login/Synergia - $LIBRUS_API_URL/AutoLoginToken")
val onSuccess = { json: JsonObject ->
loginWithToken(json.getString("Token"))
@@ -73,7 +73,7 @@ class LibrusLoginSynergia(override val data: DataLibrus, val onSuccess: () -> Un
return
}
- d(TAG, "Request: Librus/Login/Synergia - " + LIBRUS_SYNERGIA_TOKEN_LOGIN_URL.replace("TOKEN", token) + "/uczen/widok/centrum_powiadomien")
+ Timber.d("Request: Librus/Login/Synergia - " + LIBRUS_SYNERGIA_TOKEN_LOGIN_URL.replace("TOKEN", token) + "/uczen/widok/centrum_powiadomien")
val callback = object : TextCallbackHandler() {
override fun onSuccess(json: String?, response: Response?) {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/SynergiaTokenExtractor.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/SynergiaTokenExtractor.kt
index 54ec450e..d70b04bc 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/SynergiaTokenExtractor.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/SynergiaTokenExtractor.kt
@@ -9,7 +9,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusPortal
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.data.enums.LoginMode
import pl.szczodrzynski.edziennik.ext.*
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
class SynergiaTokenExtractor(override val data: DataLibrus, val onSuccess: () -> Unit) : LibrusPortal(data) {
companion object {
@@ -45,7 +45,7 @@ class SynergiaTokenExtractor(override val data: DataLibrus, val onSuccess: () ->
val accountLogin = data.apiLogin ?: return false
data.portalAccessToken ?: return false
- d(TAG, "Request: Librus/SynergiaTokenExtractor - ${if (data.fakeLogin) FAKE_LIBRUS_ACCOUNT else LIBRUS_ACCOUNT_URL}$accountLogin")
+ Timber.d("Request: Librus/SynergiaTokenExtractor - ${if (data.fakeLogin) FAKE_LIBRUS_ACCOUNT else LIBRUS_ACCOUNT_URL}$accountLogin")
val onSuccess = { json: JsonObject, response: Response? ->
// synergiaAccount is executed when a synergia token needs a refresh
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt
index 1e8a96da..65b9cd35 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt
@@ -23,7 +23,7 @@ import pl.szczodrzynski.edziennik.data.enums.LoginMethod
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
import pl.szczodrzynski.edziennik.data.db.full.EventFull
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
class Mobidziennik(val app: App, val profile: Profile?, val loginStore: LoginStore, val callback: EdziennikCallback) : EdziennikInterface {
companion object {
@@ -63,10 +63,10 @@ class Mobidziennik(val app: App, val profile: Profile?, val loginStore: LoginSto
}
private fun login(loginMethod: LoginMethod? = null, afterLogin: (() -> Unit)? = null) {
- d(TAG, "Trying to login with ${data.targetLoginMethods}")
+ Timber.d("Trying to login with ${data.targetLoginMethods}")
if (internalErrorList.isNotEmpty()) {
- d(TAG, " - Internal errors:")
- internalErrorList.forEach { d(TAG, " - code $it") }
+ Timber.d(" - Internal errors:")
+ internalErrorList.forEach { Timber.d(" - code $it") }
}
loginMethod?.let { data.prepareFor(it) }
afterLogin?.let { this.afterLogin = it }
@@ -76,10 +76,10 @@ class Mobidziennik(val app: App, val profile: Profile?, val loginStore: LoginSto
}
private fun data() {
- d(TAG, "Endpoint IDs: ${data.targetEndpoints}")
+ Timber.d("Endpoint IDs: ${data.targetEndpoints}")
if (internalErrorList.isNotEmpty()) {
- d(TAG, " - Internal errors:")
- internalErrorList.forEach { d(TAG, " - code $it") }
+ Timber.d(" - Internal errors:")
+ internalErrorList.forEach { Timber.d(" - code $it") }
}
afterLogin?.invoke() ?: MobidziennikData(data) {
completed()
@@ -138,7 +138,7 @@ class Mobidziennik(val app: App, val profile: Profile?, val loginStore: LoginSto
override fun firstLogin() { MobidziennikFirstLogin(data) { completed() } }
override fun cancel() {
- d(TAG, "Cancelled")
+ Timber.d("Cancelled")
data.cancel()
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikData.kt
index 4b58d203..d4180eae 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikData.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikData.kt
@@ -10,6 +10,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.api.Mobid
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.api2.MobidziennikApi2Main
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web.*
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
class MobidziennikData(val data: DataMobidziennik, val onSuccess: () -> Unit) {
companion object {
@@ -38,7 +39,7 @@ class MobidziennikData(val data: DataMobidziennik, val onSuccess: () -> Unit) {
}
private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
- Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
+ Timber.d("Using endpoint $endpointId. Last sync time = $lastSync")
when (endpointId) {
ENDPOINT_MOBIDZIENNIK_API_MAIN -> {
data.startProgress(R.string.edziennik_progress_endpoint_data)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikWeb.kt
index cfb4ab49..236268e0 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikWeb.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikWeb.kt
@@ -11,7 +11,7 @@ import im.wangchao.mhttp.callback.TextCallbackHandler
import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik
import pl.szczodrzynski.edziennik.data.api.models.ApiError
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
import java.io.File
open class MobidziennikWeb(open val data: DataMobidziennik, open val lastSync: Long?) {
@@ -52,7 +52,7 @@ open class MobidziennikWeb(open val data: DataMobidziennik, open val lastSync: L
) {
val url = fullUrl ?: "https://${data.loginServerName}.mobidziennik.pl$endpoint"
- d(tag, "Request: Mobidziennik/Web - $url")
+ Timber.tag(tag).d("Request: Mobidziennik/Web - $url")
if (data.webSessionKey == null) {
data.error(TAG, ERROR_MOBIDZIENNIK_WEB_NO_SESSION_KEY)
@@ -128,7 +128,7 @@ open class MobidziennikWeb(open val data: DataMobidziennik, open val lastSync: L
onProgress: (written: Long, total: Long) -> Unit) {
val url = "https://${data.loginServerName}.mobidziennik.pl$action"
- d(tag, "Request: Mobidziennik/Web - $url")
+ Timber.tag(tag).d("Request: Mobidziennik/Web - $url")
if (data.webSessionKey == null) {
data.error(TAG, ERROR_MOBIDZIENNIK_WEB_NO_SESSION_KEY)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiEvents.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiEvents.kt
index 40a357d0..422dca35 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiEvents.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiEvents.kt
@@ -13,6 +13,7 @@ import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.enums.MetadataType
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Time
+import timber.log.Timber
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.*
@@ -45,8 +46,8 @@ class MobidziennikApiEvents(val data: DataMobidziennik, rows: List) {
val format = SimpleDateFormat("yyyyMMddHHmmss", Locale.US)
val addedDate = try {
format.parse(cols[7]).time
- } catch (e: ParseException) {
- e.printStackTrace()
+ } catch (e: Exception) {
+ Timber.e(e)
System.currentTimeMillis()
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api2/MobidziennikApi2Main.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api2/MobidziennikApi2Main.kt
index 9c231849..2edfcc2a 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api2/MobidziennikApi2Main.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api2/MobidziennikApi2Main.kt
@@ -17,6 +17,7 @@ import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
import pl.szczodrzynski.edziennik.ext.getJsonObject
import pl.szczodrzynski.edziennik.ext.getString
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
class MobidziennikApi2Main(val data: DataMobidziennik,
val lastSync: Long?,
@@ -33,7 +34,7 @@ class MobidziennikApi2Main(val data: DataMobidziennik,
get() = data.profile
init {
- Utils.d(TAG, "Request: Mobidziennik/Api2/Main - https://${data.loginServerName}.mobidziennik.pl/api2/logowanie")
+ Timber.d("Request: Mobidziennik/Api2/Main - https://${data.loginServerName}.mobidziennik.pl/api2/logowanie")
val callback = object : JsonCallbackHandler() {
override fun onSuccess(json: JsonObject?, response: Response?) {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebAttendance.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebAttendance.kt
index 3fe26720..0672ea8d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebAttendance.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebAttendance.kt
@@ -25,10 +25,10 @@ import pl.szczodrzynski.edziennik.ext.dateToSemester
import pl.szczodrzynski.edziennik.ext.fixName
import pl.szczodrzynski.edziennik.ext.get
import pl.szczodrzynski.edziennik.ext.singleOrNull
-import pl.szczodrzynski.edziennik.utils.Utils.d
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Time
import pl.szczodrzynski.edziennik.utils.models.Week
+import timber.log.Timber
class MobidziennikWebAttendance(override val data: DataMobidziennik,
override val lastSync: Long?,
@@ -156,7 +156,7 @@ class MobidziennikWebAttendance(override val data: DataMobidziennik,
}
}
- d(TAG, "Done in ${System.currentTimeMillis()-start} ms (request ${start-requestTime} ms)")
+ Timber.d("Done in ${System.currentTimeMillis()-start} ms (request ${start-requestTime} ms)")
onSuccess()
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLogin.kt
index 373e10e2..ee539df0 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLogin.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLogin.kt
@@ -8,6 +8,7 @@ import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik
import pl.szczodrzynski.edziennik.data.enums.LoginMethod
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
class MobidziennikLogin(val data: DataMobidziennik, val onSuccess: () -> Unit) {
companion object {
@@ -43,7 +44,7 @@ class MobidziennikLogin(val data: DataMobidziennik, val onSuccess: () -> Unit) {
onSuccess(null)
return
}
- Utils.d(TAG, "Using login method $loginMethod")
+ Timber.d("Using login method $loginMethod")
when (loginMethod) {
LoginMethod.MOBIDZIENNIK_WEB -> {
data.startProgress(R.string.edziennik_progress_login_mobidziennik_web)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLoginApi2.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLoginApi2.kt
index 01d7b9b7..2f6690f1 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLoginApi2.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLoginApi2.kt
@@ -19,6 +19,7 @@ import pl.szczodrzynski.edziennik.ext.getString
import pl.szczodrzynski.edziennik.ext.isNotNullNorBlank
import pl.szczodrzynski.edziennik.ext.isNotNullNorEmpty
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
class MobidziennikLoginApi2(val data: DataMobidziennik, val onSuccess: () -> Unit) {
companion object {
@@ -54,7 +55,7 @@ class MobidziennikLoginApi2(val data: DataMobidziennik, val onSuccess: () -> Uni
}}
private fun loginWithCredentials() {
- Utils.d(TAG, "Request: Mobidziennik/Login/Api2 - https://mobidziennik.pl/logowanie")
+ Timber.d("Request: Mobidziennik/Login/Api2 - https://mobidziennik.pl/logowanie")
val callback = object : JsonCallbackHandler() {
override fun onSuccess(json: JsonObject?, response: Response?) {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLoginWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLoginWeb.kt
index ce801a73..5ea92107 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLoginWeb.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLoginWeb.kt
@@ -13,7 +13,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.Mobidziennik
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.ext.getUnixDate
import pl.szczodrzynski.edziennik.ext.isNotNullNorEmpty
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
class MobidziennikLoginWeb(val data: DataMobidziennik, val onSuccess: () -> Unit) {
companion object {
@@ -36,7 +36,7 @@ class MobidziennikLoginWeb(val data: DataMobidziennik, val onSuccess: () -> Unit
}}
private fun loginWithCredentials() {
- d(TAG, "Request: Mobidziennik/Login/Web - https://${data.loginServerName}.mobidziennik.pl/api/")
+ Timber.d("Request: Mobidziennik/Login/Web - https://${data.loginServerName}.mobidziennik.pl/api/")
val callback = object : TextCallbackHandler() {
override fun onSuccess(text: String?, response: Response?) {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/Podlasie.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/Podlasie.kt
index 3b08b7af..0ee556a6 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/Podlasie.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/Podlasie.kt
@@ -25,6 +25,7 @@ import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
import pl.szczodrzynski.edziennik.data.db.full.EventFull
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
import java.io.File
class Podlasie(val app: App, val profile: Profile?, val loginStore: LoginStore, val callback: EdziennikCallback) : EdziennikInterface {
@@ -58,8 +59,8 @@ class Podlasie(val app: App, val profile: Profile?, val loginStore: LoginStore,
override fun sync(featureTypes: Set?, onlyEndpoints: Set?, arguments: JsonObject?) {
data.arguments = arguments
data.prepare(PodlasieFeatures, featureTypes, onlyEndpoints)
- Utils.d(TAG, "LoginMethod IDs: ${data.targetLoginMethods}")
- Utils.d(TAG, "Endpoint IDs: ${data.targetEndpoints}")
+ Timber.d("LoginMethod IDs: ${data.targetLoginMethods}")
+ Timber.d("Endpoint IDs: ${data.targetEndpoints}")
PodlasieLogin(data) {
PodlasieData(data) {
completed()
@@ -133,7 +134,7 @@ class Podlasie(val app: App, val profile: Profile?, val loginStore: LoginStore,
}
override fun cancel() {
- Utils.d(TAG, "Cancelled")
+ Timber.d("Cancelled")
data.cancel()
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieApi.kt
index 726b851a..4258cf0a 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieApi.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieApi.kt
@@ -16,6 +16,7 @@ import pl.szczodrzynski.edziennik.ext.getInt
import pl.szczodrzynski.edziennik.ext.getJsonObject
import pl.szczodrzynski.edziennik.ext.toHexString
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
import java.security.MessageDigest
import java.text.SimpleDateFormat
import java.util.*
@@ -34,7 +35,7 @@ open class PodlasieApi(open val data: DataPodlasie, open val lastSync: Long?) {
fun apiGet(tag: String, endpoint: String, onSuccess: (json: JsonObject) -> Unit) {
val url = PODLASIE_API_URL + endpoint
- Utils.d(tag, "Request: Podlasie/Api - $url")
+ Timber.tag(tag).d("Request: Podlasie/Api - $url")
if (data.apiToken == null) {
data.error(tag, ERROR_PODLASIE_API_NO_TOKEN)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieData.kt
index f1117537..ee229af3 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieData.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieData.kt
@@ -9,6 +9,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.ENDPOINT_PODLASIE_API_MAIN
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.api.PodlasieApiMain
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
class PodlasieData(val data: DataPodlasie, val onSuccess: () -> Unit) {
companion object {
@@ -37,7 +38,7 @@ class PodlasieData(val data: DataPodlasie, val onSuccess: () -> Unit) {
}
private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
- Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
+ Timber.d("Using endpoint $endpointId. Last sync time = $lastSync")
when (endpointId) {
ENDPOINT_PODLASIE_API_MAIN -> {
data.startProgress(R.string.edziennik_progress_endpoint_data)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/login/PodlasieLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/login/PodlasieLogin.kt
index 8850f0db..bcb89f98 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/login/PodlasieLogin.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/login/PodlasieLogin.kt
@@ -8,6 +8,7 @@ import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
import pl.szczodrzynski.edziennik.data.enums.LoginMethod
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
class PodlasieLogin(val data: DataPodlasie, val onSuccess: () -> Unit) {
companion object {
@@ -43,7 +44,7 @@ class PodlasieLogin(val data: DataPodlasie, val onSuccess: () -> Unit) {
onSuccess(null)
return
}
- Utils.d(TAG, "Using login method $loginMethod")
+ Timber.d("Using login method $loginMethod")
when (loginMethod) {
LoginMethod.PODLASIE_API -> {
data.startProgress(R.string.edziennik_progress_login_podlasie_api)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/Template.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/Template.kt
index 9a6c3405..6dbbee45 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/Template.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/Template.kt
@@ -22,7 +22,7 @@ import pl.szczodrzynski.edziennik.data.enums.FeatureType
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
import pl.szczodrzynski.edziennik.data.db.full.EventFull
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
class Template(val app: App, val profile: Profile?, val loginStore: LoginStore, val callback: EdziennikCallback) : EdziennikInterface {
companion object {
@@ -55,8 +55,8 @@ class Template(val app: App, val profile: Profile?, val loginStore: LoginStore,
override fun sync(featureTypes: Set?, onlyEndpoints: Set?, arguments: JsonObject?) {
data.arguments = arguments
data.prepare(TemplateFeatures, featureTypes, onlyEndpoints)
- d(TAG, "LoginMethod IDs: ${data.targetLoginMethods}")
- d(TAG, "Endpoint IDs: ${data.targetEndpoints}")
+ Timber.d("LoginMethod IDs: ${data.targetLoginMethods}")
+ Timber.d("Endpoint IDs: ${data.targetEndpoints}")
TemplateLogin(data) {
TemplateData(data) {
completed()
@@ -99,7 +99,7 @@ class Template(val app: App, val profile: Profile?, val loginStore: LoginStore,
}
override fun cancel() {
- d(TAG, "Cancelled")
+ Timber.d("Cancelled")
data.cancel()
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/data/TemplateData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/data/TemplateData.kt
index 4b759e34..57242f72 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/data/TemplateData.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/data/TemplateData.kt
@@ -13,6 +13,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.template.data.api.TemplateA
import pl.szczodrzynski.edziennik.data.api.edziennik.template.data.web.TemplateWebSample
import pl.szczodrzynski.edziennik.data.api.edziennik.template.data.web.TemplateWebSample2
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
class TemplateData(val data: DataTemplate, val onSuccess: () -> Unit) {
companion object {
@@ -41,7 +42,7 @@ class TemplateData(val data: DataTemplate, val onSuccess: () -> Unit) {
}
private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
- Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
+ Timber.d("Using endpoint $endpointId. Last sync time = $lastSync")
when (endpointId) {
ENDPOINT_TEMPLATE_WEB_SAMPLE -> {
data.startProgress(R.string.edziennik_progress_endpoint_student_info)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/login/TemplateLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/login/TemplateLogin.kt
index 214164c8..62d28c6b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/login/TemplateLogin.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/login/TemplateLogin.kt
@@ -8,6 +8,7 @@ import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.api.edziennik.template.DataTemplate
import pl.szczodrzynski.edziennik.data.enums.LoginMethod
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
class TemplateLogin(val data: DataTemplate, val onSuccess: () -> Unit) {
companion object {
@@ -43,7 +44,7 @@ class TemplateLogin(val data: DataTemplate, val onSuccess: () -> Unit) {
onSuccess(null)
return
}
- Utils.d(TAG, "Using login method $loginMethod")
+ Timber.d("Using login method $loginMethod")
when (loginMethod) {
LoginMethod.TEMPLATE_WEB -> {
data.startProgress(R.string.edziennik_progress_login_template_web)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/Usos.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/Usos.kt
index 64be9a83..66baee4a 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/Usos.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/Usos.kt
@@ -21,7 +21,7 @@ import pl.szczodrzynski.edziennik.data.enums.FeatureType
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
import pl.szczodrzynski.edziennik.data.db.full.EventFull
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
class Usos(
val app: App,
@@ -55,8 +55,8 @@ class Usos(
) {
data.arguments = arguments
data.prepare(UsosFeatures, featureTypes, onlyEndpoints)
- d(TAG, "LoginMethod IDs: ${data.targetLoginMethods}")
- d(TAG, "Endpoint IDs: ${data.targetEndpoints}")
+ Timber.d("LoginMethod IDs: ${data.targetLoginMethods}")
+ Timber.d("Endpoint IDs: ${data.targetEndpoints}")
UsosLogin(data) {
UsosData(data) {
completed()
@@ -79,7 +79,7 @@ class Usos(
}
override fun cancel() {
- d(TAG, "Cancelled")
+ Timber.d("Cancelled")
data.cancel()
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/data/UsosApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/data/UsosApi.kt
index 9f716d50..50eebbbd 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/data/UsosApi.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/data/UsosApi.kt
@@ -19,7 +19,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.usos.DataUsos
import pl.szczodrzynski.edziennik.data.api.edziennik.usos.login.UsosLoginApi
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.ext.*
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
import java.net.HttpURLConnection.*
import java.util.UUID
@@ -89,7 +89,7 @@ open class UsosApi(open val data: DataUsos, open val lastSync: Long?) {
onSuccess: (data: T, response: Response?) -> Unit,
) {
val url = "${data.instanceUrl}services/$service"
- d(tag, "Request: Usos/Api - $url")
+ Timber.tag(tag).d("Request: Usos/Api - $url")
val formData = mutableMapOf()
if (params != null)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/data/UsosData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/data/UsosData.kt
index dbccb16b..240907cb 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/data/UsosData.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/data/UsosData.kt
@@ -5,13 +5,12 @@
package pl.szczodrzynski.edziennik.data.api.edziennik.usos.data
import pl.szczodrzynski.edziennik.R
-import pl.szczodrzynski.edziennik.data.api.edziennik.template.data.web.TemplateWebSample
import pl.szczodrzynski.edziennik.data.api.edziennik.usos.*
import pl.szczodrzynski.edziennik.data.api.edziennik.usos.data.api.UsosApiCourses
import pl.szczodrzynski.edziennik.data.api.edziennik.usos.data.api.UsosApiTerms
import pl.szczodrzynski.edziennik.data.api.edziennik.usos.data.api.UsosApiTimetable
import pl.szczodrzynski.edziennik.data.api.edziennik.usos.data.api.UsosApiUser
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
class UsosData(val data: DataUsos, val onSuccess: () -> Unit) {
companion object {
@@ -40,7 +39,7 @@ class UsosData(val data: DataUsos, val onSuccess: () -> Unit) {
}
private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
- d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
+ Timber.d("Using endpoint $endpointId. Last sync time = $lastSync")
when (endpointId) {
ENDPOINT_USOS_API_USER -> {
data.startProgress(R.string.edziennik_progress_endpoint_student_info)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/login/UsosLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/login/UsosLogin.kt
index 85a04258..167994cf 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/login/UsosLogin.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/login/UsosLogin.kt
@@ -7,7 +7,7 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.usos.login
import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.api.edziennik.usos.DataUsos
import pl.szczodrzynski.edziennik.data.enums.LoginMethod
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
class UsosLogin(val data: DataUsos, val onSuccess: () -> Unit) {
companion object {
@@ -43,7 +43,7 @@ class UsosLogin(val data: DataUsos, val onSuccess: () -> Unit) {
onSuccess(null)
return
}
- d(TAG, "Using login method $loginMethod")
+ Timber.d("Using login method $loginMethod")
when (loginMethod) {
LoginMethod.USOS_API -> {
data.startProgress(R.string.edziennik_progress_login_usos_api)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/login/UsosLoginApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/login/UsosLoginApi.kt
index 06651477..5db6ab32 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/login/UsosLoginApi.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/usos/login/UsosLoginApi.kt
@@ -11,7 +11,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.usos.data.UsosApi
import pl.szczodrzynski.edziennik.data.api.events.UserActionRequiredEvent
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.ext.*
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
class UsosLoginApi(val data: DataUsos, val onSuccess: () -> Unit) {
companion object {
@@ -71,7 +71,7 @@ class UsosLoginApi(val data: DataUsos, val onSuccess: () -> Unit) {
}
private fun login() {
- d(TAG, "Login to ${data.schoolId} with ${data.oauthLoginResponse}")
+ Timber.d("Login to ${data.schoolId} with ${data.oauthLoginResponse}")
val authorizeResponse = data.oauthLoginResponse?.fromQueryString()
?: return // checked in init {}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt
index 77f0eb48..4ecf308b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt
@@ -34,7 +34,7 @@ import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
import pl.szczodrzynski.edziennik.data.db.full.EventFull
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
import pl.szczodrzynski.edziennik.utils.Utils
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
import java.io.File
class Vulcan(val app: App, val profile: Profile?, val loginStore: LoginStore, val callback: EdziennikCallback) : EdziennikInterface {
@@ -78,10 +78,10 @@ class Vulcan(val app: App, val profile: Profile?, val loginStore: LoginStore, va
return
}
- d(TAG, "Trying to login with ${data.targetLoginMethods}")
+ Timber.d("Trying to login with ${data.targetLoginMethods}")
if (internalErrorList.isNotEmpty()) {
- d(TAG, " - Internal errors:")
- internalErrorList.forEach { d(TAG, " - code $it") }
+ Timber.d(" - Internal errors:")
+ internalErrorList.forEach { Timber.d(" - code $it") }
}
loginMethod?.let { data.prepareFor(it) }
afterLogin?.let { this.afterLogin = it }
@@ -91,10 +91,10 @@ class Vulcan(val app: App, val profile: Profile?, val loginStore: LoginStore, va
}
private fun data() {
- d(TAG, "Endpoint IDs: ${data.targetEndpoints}")
+ Timber.d("Endpoint IDs: ${data.targetEndpoints}")
if (internalErrorList.isNotEmpty()) {
- d(TAG, " - Internal errors:")
- internalErrorList.forEach { d(TAG, " - code $it") }
+ Timber.d(" - Internal errors:")
+ internalErrorList.forEach { Timber.d(" - code $it") }
}
afterLogin?.invoke() ?: VulcanData(data) {
completed()
@@ -179,7 +179,7 @@ class Vulcan(val app: App, val profile: Profile?, val loginStore: LoginStore, va
override fun firstLogin() { VulcanFirstLogin(data) { completed() } }
override fun cancel() {
- d(TAG, "Cancelled")
+ Timber.d("Cancelled")
data.cancel()
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanData.kt
index 41014919..5f420ec5 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanData.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanData.kt
@@ -10,6 +10,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.*
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.web.VulcanWebLuckyNumber
import pl.szczodrzynski.edziennik.data.db.entity.Message
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) {
companion object {
@@ -82,7 +83,7 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) {
}
private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
- Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
+ Timber.d("Using endpoint $endpointId. Last sync time = $lastSync")
when (endpointId) {
ENDPOINT_VULCAN_WEB_LUCKY_NUMBERS -> {
data.startProgress(R.string.edziennik_progress_endpoint_lucky_number)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanHebe.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanHebe.kt
index 5031393f..b182d693 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanHebe.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanHebe.kt
@@ -22,9 +22,9 @@ import pl.szczodrzynski.edziennik.data.db.entity.LessonRange
import pl.szczodrzynski.edziennik.data.db.entity.Subject
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
import pl.szczodrzynski.edziennik.ext.*
-import pl.szczodrzynski.edziennik.utils.Utils.d
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Time
+import timber.log.Timber
import java.net.HttpURLConnection
import java.net.HttpURLConnection.HTTP_NOT_FOUND
import java.net.URLEncoder
@@ -189,7 +189,7 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) {
) {
val url = "${if (baseUrl) data.apiUrl else data.fullApiUrl}$endpoint"
- d(tag, "Request: Vulcan/Hebe - $url")
+ Timber.tag(tag).d("Request: Vulcan/Hebe - $url")
val privateKey = data.hebePrivateKey
val publicHash = data.hebePublicHash
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt
index e1cc52e6..03466a86 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt
@@ -18,6 +18,7 @@ import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.ext.*
import pl.szczodrzynski.edziennik.utils.Utils
import pl.szczodrzynski.edziennik.utils.models.Date
+import timber.log.Timber
import java.io.File
import java.net.HttpURLConnection
@@ -269,7 +270,7 @@ open class VulcanWebMain(open val data: DataVulcan, open val lastSync: Long?) {
else -> "uonetplus"
} + ".${data.webHost}/${data.symbol}/$endpoint"
- Utils.d(tag, "Request: Vulcan/WebMain - $url")
+ Timber.tag(tag).d("Request: Vulcan/WebMain - $url")
val payload = JsonObject()
parameters.map { (name, value) ->
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeTimetable.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeTimetable.kt
index 392590de..c772272f 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeTimetable.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeTimetable.kt
@@ -25,9 +25,9 @@ import pl.szczodrzynski.edziennik.ext.getBoolean
import pl.szczodrzynski.edziennik.ext.getInt
import pl.szczodrzynski.edziennik.ext.getJsonObject
import pl.szczodrzynski.edziennik.ext.getString
-import pl.szczodrzynski.edziennik.utils.Utils.d
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Week
+import timber.log.Timber
class VulcanHebeTimetable(
override val data: DataVulcan,
@@ -107,8 +107,7 @@ class VulcanHebeTimetable(
date.stepForward(0, 0, 1)
}
- d(
- TAG,
+ Timber.d(
"Clearing lessons between ${dateFrom.stringY_m_d} and ${dateTo.stringY_m_d}"
)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLogin.kt
index e91e166c..ca6df1b7 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLogin.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLogin.kt
@@ -8,6 +8,7 @@ import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
import pl.szczodrzynski.edziennik.data.enums.LoginMethod
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
class VulcanLogin(val data: DataVulcan, val onSuccess: () -> Unit) {
companion object {
@@ -43,7 +44,7 @@ class VulcanLogin(val data: DataVulcan, val onSuccess: () -> Unit) {
onSuccess(null)
return
}
- Utils.d(TAG, "Using login method $loginMethod")
+ Timber.d("Using login method $loginMethod")
when (loginMethod) {
LoginMethod.VULCAN_WEB_MAIN -> {
data.startProgress(R.string.edziennik_progress_login_vulcan_web_main)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt
index 6e16443b..90151043 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt
@@ -22,6 +22,7 @@ import pl.szczodrzynski.edziennik.data.enums.LoginMethod
import pl.szczodrzynski.edziennik.ext.*
import pl.szczodrzynski.edziennik.utils.Utils
import pl.szczodrzynski.edziennik.utils.models.Date
+import timber.log.Timber
abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginStore) {
companion object {
@@ -159,11 +160,6 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
}
}
- private fun d(message: String) {
- if (DEBUG)
- Utils.d(TAG, message)
- }
-
fun clear() {
loginMethods.clear()
@@ -201,7 +197,7 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
return // return on first login
val totalStart = System.currentTimeMillis()
var startTime = System.currentTimeMillis()
- d("Saving data to DB")
+ Timber.d("Saving data to DB")
profile.userCode = generateUserCode()
@@ -233,7 +229,7 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
}
}
- d("Profiles saved in ${System.currentTimeMillis()-startTime} ms")
+ Timber.d("Profiles saved in ${System.currentTimeMillis()-startTime} ms")
startTime = System.currentTimeMillis()
// always present and not empty, during every sync
@@ -250,7 +246,7 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
db.gradeCategoryDao().clear(profileId)
db.gradeCategoryDao().addAll(gradeCategories.values())
- d("Maps saved in ${System.currentTimeMillis()-startTime} ms")
+ Timber.d("Maps saved in ${System.currentTimeMillis()-startTime} ms")
startTime = System.currentTimeMillis()
// may be empty - extracted from DB on demand, by an endpoint
@@ -267,12 +263,12 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
if (librusLessons.size > 0)
db.librusLessonDao().addAll(librusLessons.values())
- d("On-demand maps saved in ${System.currentTimeMillis()-startTime} ms")
+ Timber.d("On-demand maps saved in ${System.currentTimeMillis()-startTime} ms")
startTime = System.currentTimeMillis()
// clear DB with DataRemoveModels added by endpoints
for (model in toRemove) {
- d("Clearing DB with $model")
+ Timber.d("Clearing DB with $model")
when (model) {
is DataRemoveModel.Timetable -> model.commit(profileId, db.timetableDao())
is DataRemoveModel.Grades -> model.commit(profileId, db.gradeDao())
@@ -281,7 +277,7 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
}
}
- d("DB cleared in ${System.currentTimeMillis()-startTime} ms")
+ Timber.d("DB cleared in ${System.currentTimeMillis()-startTime} ms")
startTime = System.currentTimeMillis()
if (metadataList.isNotEmpty())
@@ -289,7 +285,7 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
if (setSeenMetadataList.isNotEmpty())
db.metadataDao().setSeen(setSeenMetadataList)
- d("Metadata saved in ${System.currentTimeMillis()-startTime} ms")
+ Timber.d("Metadata saved in ${System.currentTimeMillis()-startTime} ms")
startTime = System.currentTimeMillis()
db.timetableDao().putAll(lessonList, removeNotKept = true)
@@ -310,9 +306,9 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
if (messageRecipientIgnoreList.isNotEmpty())
db.messageRecipientDao().addAllIgnore(messageRecipientIgnoreList)
- d("Other data saved in ${System.currentTimeMillis()-startTime} ms")
+ Timber.d("Other data saved in ${System.currentTimeMillis()-startTime} ms")
- d("Total save time: ${System.currentTimeMillis()-totalStart} ms")
+ Timber.d("Total save time: ${System.currentTimeMillis()-totalStart} ms")
}
fun setSyncNext(endpointId: Int, syncIn: Long? = null, forceFeatureType: FeatureType? = null, syncAt: Long? = null) {
@@ -339,7 +335,7 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
abstract fun generateUserCode(): String
fun cancel() {
- d("Cancelled")
+ Timber.d("Cancelled")
cancelled = true
saveData()
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt
index f520ac62..0d1fed43 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt
@@ -10,6 +10,7 @@ import android.content.pm.PackageManager
import android.util.Base64
import pl.szczodrzynski.edziennik.BuildConfig
import pl.szczodrzynski.edziennik.ext.sha256
+import timber.log.Timber
import java.security.MessageDigest
object Signing {
@@ -32,7 +33,7 @@ object Signing {
appCertificate = Base64.encodeToString(md.digest(), Base64.NO_WRAP)
}
} catch (e: Exception) {
- e.printStackTrace()
+ Timber.e(e)
}
}}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/ErrorReportTask.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/ErrorReportTask.kt
index 230be5c0..46872d76 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/ErrorReportTask.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/ErrorReportTask.kt
@@ -11,6 +11,7 @@ import pl.szczodrzynski.edziennik.data.api.EdziennikNotification
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikCallback
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
class ErrorReportTask : IApiTask(-1) {
override fun prepare(app: App) {
@@ -23,7 +24,7 @@ class ErrorReportTask : IApiTask(-1) {
fun run(app: App, taskCallback: EdziennikCallback, notification: EdziennikNotification, errorList: MutableList) {
errorList.forEach { error ->
- Utils.d(ApiService.TAG, "Error ${error.tag} profile ${error.profileId}: code ${error.errorCode}")
+ Timber.d("Error ${error.tag} profile ${error.profileId}: code ${error.errorCode}")
}
errorList.clear()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/PostNotifications.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/PostNotifications.kt
index a27e4174..b7633343 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/PostNotifications.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/PostNotifications.kt
@@ -51,7 +51,7 @@ class PostNotifications(val app: App, nList: List) {
else
it.setDefaults(NotificationCompat.DEFAULT_ALL)
}
- .setGroup(if (quiet) app.notificationChannelsManager.dataQuiet.key else app.notificationChannelsManager.data.key)
+ .setGroup(if (quiet) app.notificationManager.dataQuiet.key else app.notificationManager.data.key)
}
private fun buildSummaryText(summaryCounts: Map): CharSequence {
@@ -79,7 +79,7 @@ class PostNotifications(val app: App, nList: List) {
MainActivity::class.java,
"fragmentId" to NavTarget.NOTIFICATIONS
)
- val summaryIntent = PendingIntent.getActivity(app, app.notificationChannelsManager.data.id, intent, PendingIntent.FLAG_ONE_SHOT or pendingIntentFlag())
+ val summaryIntent = PendingIntent.getActivity(app, app.notificationManager.data.id, intent, PendingIntent.FLAG_ONE_SHOT or pendingIntentFlag())
// On Nougat or newer - show maximum 8 notifications
// On Marshmallow or older - show maximum 4 notifications
@@ -95,7 +95,7 @@ class PostNotifications(val app: App, nList: List) {
}
// Create a summary to show *instead* of notifications
- val combined = NotificationCompat.Builder(app, app.notificationChannelsManager.data.key)
+ val combined = NotificationCompat.Builder(app, app.notificationManager.data.key)
.setContentTitle(app.getString(R.string.app_name))
.setContentText(buildSummaryText(summaryCounts))
.setTicker(newNotificationsText)
@@ -128,7 +128,7 @@ class PostNotifications(val app: App, nList: List) {
// Less than 8 notifications
val notifications = nList.map {
summaryCounts[it.type] = summaryCounts.getOrDefault(it.type, 0) + 1
- NotificationCompat.Builder(app, app.notificationChannelsManager.data.key)
+ NotificationCompat.Builder(app, app.notificationManager.data.key)
.setContentTitle(it.profileName ?: app.getString(R.string.app_name))
.setContentText(it.text)
.setSubText(if (it.type == NotificationType.SERVER_MESSAGE) null else it.title)
@@ -155,7 +155,7 @@ class PostNotifications(val app: App, nList: List) {
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- val summary = NotificationCompat.Builder(app, app.notificationChannelsManager.data.key)
+ val summary = NotificationCompat.Builder(app, app.notificationManager.data.key)
.setContentTitle(newNotificationsText)
.setContentText(buildSummaryText(summaryCounts))
.setTicker(newNotificationsText)
@@ -170,7 +170,7 @@ class PostNotifications(val app: App, nList: List) {
.setAutoCancel(true)
.build()
- notificationManager.notify(app.notificationChannelsManager.data.id, summary)
+ notificationManager.notify(app.notificationManager.data.id, summary)
}
}
}}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/SzkolnyTask.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/SzkolnyTask.kt
index 64f647e9..70238b36 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/SzkolnyTask.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/SzkolnyTask.kt
@@ -11,7 +11,7 @@ import pl.szczodrzynski.edziennik.data.api.szkolny.SzkolnyApi
import pl.szczodrzynski.edziennik.data.db.entity.Notification
import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.ext.HOUR
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
class SzkolnyTask(val app: App, val syncingProfiles: List) : IApiTask(-1) {
companion object {
@@ -49,7 +49,7 @@ class SzkolnyTask(val app: App, val syncingProfiles: List) : IApiTask(-
notifications.sharedEventNotifications()
}
}
- d(TAG, "Created ${notificationList.count()} notifications.")
+ Timber.d("Created ${notificationList.count()} notifications.")
// filter notifications
notificationList
@@ -70,7 +70,7 @@ class SzkolnyTask(val app: App, val syncingProfiles: List) : IApiTask(-
// post all notifications
PostNotifications(app, notificationList)
- d(TAG, "SzkolnyTask: finished in ${System.currentTimeMillis()-startTime} ms.")
+ Timber.d("SzkolnyTask: finished in ${System.currentTimeMillis()-startTime} ms.")
taskCallback.onCompleted()
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/config/AppData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/config/AppData.kt
index e2ab6b10..5cfd2aff 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/config/AppData.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/config/AppData.kt
@@ -13,7 +13,7 @@ import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.enums.LoginType
import pl.szczodrzynski.edziennik.ext.getJsonObject
import pl.szczodrzynski.edziennik.ext.mergeWith
-import pl.szczodrzynski.edziennik.utils.managers.TextStylingManager.HtmlMode
+import pl.szczodrzynski.edziennik.core.manager.TextStylingManager.HtmlMode
data class AppData(
val configOverrides: Map,
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/config/BaseConfig.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/config/BaseConfig.kt
index ce2a2ebc..6b345b55 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/config/BaseConfig.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/config/BaseConfig.kt
@@ -4,14 +4,14 @@
package pl.szczodrzynski.edziennik.data.config
+import android.util.Log
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.data.db.entity.ConfigEntry
-import pl.szczodrzynski.edziennik.ext.takePositive
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
import kotlin.coroutines.CoroutineContext
abstract class BaseConfig(
@@ -32,6 +32,7 @@ abstract class BaseConfig(
val values = hashMapOf()
private var currentDataVersion: Int by config("dataVersion") {
+ Timber.d("Initializing ${this::class.java.simpleName} version $dataVersion")
currentDataVersion = dataVersion
dataVersion
}
@@ -45,15 +46,19 @@ abstract class BaseConfig(
entries = app.db.configDao().getAllNow()
values.clear()
for ((profileId, key, value) in entries!!) {
- if (profileId.takePositive() != this.profileId)
+ if (profileId != (this.profileId ?: -1))
continue
values[key] = value
+ Timber.v("Loaded ${this::class.java.simpleName} profile $profileId key $key value $value")
}
}
fun migrate() {
- if (this.dataVersion == this.currentDataVersion)
+ if (this.dataVersion == this.currentDataVersion) {
+ Timber.d("Config ${this::class.java.simpleName} is up to date (${this.currentDataVersion})")
return
+ }
+ Timber.i("Migrating ${this::class.java.simpleName} ${this.currentDataVersion} -> ${this.dataVersion}")
var dataVersion = this.currentDataVersion
while (dataVersion < this.dataVersion) {
@Suppress("UNCHECKED_CAST")
@@ -70,7 +75,7 @@ abstract class BaseConfig(
operator fun set(key: String, value: String?) {
values[key] = value
launch(Dispatchers.IO) {
- d(TAG, "Setting config value ($profileId): $key = $value")
+ Timber.i("Setting config value ($profileId): $key = $value")
app.db.configDao().add(ConfigEntry(profileId ?: -1, key, value))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/config/Config.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/config/Config.kt
index 4063fe4d..bad730a0 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/config/Config.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/config/Config.kt
@@ -10,20 +10,20 @@ import pl.szczodrzynski.edziennik.BuildConfig
import pl.szczodrzynski.edziennik.data.config.migration.ConfigMigration11
import pl.szczodrzynski.edziennik.data.api.szkolny.response.RegisterAvailabilityStatus
import pl.szczodrzynski.edziennik.data.api.szkolny.response.Update
-import pl.szczodrzynski.edziennik.data.config.migration.ConfigMigration13
+import pl.szczodrzynski.edziennik.data.config.migration.ConfigMigration14
import pl.szczodrzynski.edziennik.data.enums.NavTarget
import pl.szczodrzynski.edziennik.data.enums.Theme
import pl.szczodrzynski.edziennik.ext.HOUR
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.ORDER_BY_DATE_DESC
+import pl.szczodrzynski.edziennik.core.manager.GradesManager.Companion.ORDER_BY_DATE_DESC
import pl.szczodrzynski.edziennik.utils.models.Time
class Config(app: App) : BaseConfig(app, profileId = null) {
- override val dataVersion = 13
+ override val dataVersion = 14
override val migrations
get() = mapOf(
11 to ConfigMigration11(),
- 13 to ConfigMigration13(),
+ 14 to ConfigMigration14(),
)
private val profileConfigs: HashMap = hashMapOf()
@@ -58,6 +58,7 @@ class Config(app: App) : BaseConfig(app, profileId = null) {
var apiKeyCustom by config(null)
var appInstalledTime by config(0L)
var appRateSnackbarTime by config(0L)
+ var lastLogCleanupTime by config(0L)
var appVersion by config(BuildConfig.VERSION_CODE)
var validation by config(null, "buildValidation")
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/config/Delegate.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/config/Delegate.kt
index bb8da410..3756bfde 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/config/Delegate.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/config/Delegate.kt
@@ -4,15 +4,14 @@
package pl.szczodrzynski.edziennik.data.config
-import android.util.Log
import com.google.gson.Gson
import com.google.gson.JsonArray
import com.google.gson.JsonObject
import com.google.gson.reflect.TypeToken
import pl.szczodrzynski.edziennik.ext.*
-import pl.szczodrzynski.edziennik.utils.Utils.d
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Time
+import timber.log.Timber
import java.lang.reflect.ParameterizedType
import java.lang.reflect.WildcardType
import kotlin.reflect.KProperty
@@ -108,8 +107,7 @@ class ConfigDelegate(
value = config[key]?.let(::deserialize)
} catch (e: Exception) {
value = getDefault()
- d(TAG, "Couldn't deserialize '$key'")
- e.printStackTrace()
+ Timber.e(e, "Couldn't deserialize '$key'")
}
if (value == null && !nullable)
value = getDefault()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/config/ProfileConfig.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/config/ProfileConfig.kt
index f5c2bb8f..99183417 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/config/ProfileConfig.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/config/ProfileConfig.kt
@@ -14,8 +14,8 @@ import pl.szczodrzynski.edziennik.data.db.entity.ConfigEntry
import pl.szczodrzynski.edziennik.data.db.entity.Profile.Companion.AGENDA_DEFAULT
import pl.szczodrzynski.edziennik.data.enums.NotificationType
import pl.szczodrzynski.edziennik.ui.home.HomeCardModel
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.COLOR_MODE_WEIGHTED
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_ALL_GRADES
+import pl.szczodrzynski.edziennik.core.manager.GradesManager.Companion.COLOR_MODE_WEIGHTED
+import pl.szczodrzynski.edziennik.core.manager.GradesManager.Companion.YEAR_ALL_GRADES
class ProfileConfig(
app: App,
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/config/migration/ConfigMigration13.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/config/migration/ConfigMigration14.kt
similarity index 95%
rename from app/src/main/java/pl/szczodrzynski/edziennik/data/config/migration/ConfigMigration13.kt
rename to app/src/main/java/pl/szczodrzynski/edziennik/data/config/migration/ConfigMigration14.kt
index 92fa86ec..1d76859b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/config/migration/ConfigMigration13.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/config/migration/ConfigMigration14.kt
@@ -19,7 +19,7 @@ import pl.szczodrzynski.edziennik.data.enums.Theme.TEAL
import pl.szczodrzynski.edziennik.data.enums.Theme.Type.M3
import pl.szczodrzynski.edziennik.ext.toJsonArray
-class ConfigMigration13 : BaseMigration() {
+class ConfigMigration14 : BaseMigration() {
override fun migrate(config: Config) = config.apply {
get("theme")?.toIntOrNull()?.let {
@@ -65,7 +65,7 @@ class ConfigMigration13 : BaseMigration() {
try {
ui.miniMenuButtons = it.map { id -> NavTarget.getById(id.asInt) }.toSet()
} catch (e: Exception) {
- ui.miniMenuButtons = NavTarget.getDefaultConfig()
+ ui.miniMenuButtons = ui.miniMenuButtons
}
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.kt
index e50e5fc2..293cf609 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.kt
@@ -29,7 +29,7 @@ import pl.szczodrzynski.edziennik.data.db.migration.*
FeedbackMessage::class,
Message::class,
MessageRecipient::class,
- DebugLog::class,
+ LogEntry::class,
EndpointTimer::class,
LessonRange::class,
Notification::class,
@@ -42,7 +42,7 @@ import pl.szczodrzynski.edziennik.data.db.migration.*
TimetableManual::class,
Note::class,
Metadata::class
-], version = 100)
+], version = 101)
@TypeConverters(
ConverterTime::class,
ConverterDate::class,
@@ -71,7 +71,7 @@ abstract class AppDb : RoomDatabase() {
abstract fun feedbackMessageDao(): FeedbackMessageDao
abstract fun messageDao(): MessageDao
abstract fun messageRecipientDao(): MessageRecipientDao
- abstract fun debugLogDao(): DebugLogDao
+ abstract fun logDao(): LogDao
abstract fun endpointTimerDao(): EndpointTimerDao
abstract fun lessonRangeDao(): LessonRangeDao
abstract fun notificationDao(): NotificationDao
@@ -187,6 +187,7 @@ abstract class AppDb : RoomDatabase() {
Migration98(),
Migration99(),
Migration100(),
+ Migration101(),
).allowMainThreadQueries().build()
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/DebugLogDao.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/DebugLogDao.java
deleted file mode 100644
index 8da52a2a..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/DebugLogDao.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-1-6
- */
-
-package pl.szczodrzynski.edziennik.data.db.dao;
-
-import androidx.room.Dao;
-import androidx.room.Insert;
-
-import pl.szczodrzynski.edziennik.data.db.entity.DebugLog;
-
-@Dao
-public interface DebugLogDao {
- @Insert
- void add(DebugLog debugLog);
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/LogDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/LogDao.kt
new file mode 100644
index 00000000..8e47cc62
--- /dev/null
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/LogDao.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) Kuba Szczodrzyński 2024-7-1.
+ */
+
+package pl.szczodrzynski.edziennik.data.db.dao
+
+import androidx.room.Dao
+import androidx.room.Insert
+import androidx.room.OnConflictStrategy
+import androidx.room.Query
+import pl.szczodrzynski.edziennik.data.db.entity.LogEntry
+
+@Dao
+interface LogDao {
+
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ suspend fun add(entry: LogEntry)
+
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ suspend fun addAll(list: List)
+
+ @Query("DELETE FROM logs")
+ suspend fun clear()
+
+ @Query("DELETE FROM logs WHERE timestamp < :timestamp")
+ suspend fun clearBefore(timestamp: Long)
+}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/DebugLog.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/DebugLog.java
deleted file mode 100644
index 6fff3cce..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/DebugLog.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-1-6
- */
-
-package pl.szczodrzynski.edziennik.data.db.entity;
-
-import androidx.room.Entity;
-import androidx.room.PrimaryKey;
-
-import static pl.szczodrzynski.edziennik.utils.Utils.d;
-
-@Entity(tableName = "debugLogs")
-public class DebugLog {
- @PrimaryKey(autoGenerate = true)
- public int id;
-
- public String text;
-
- public DebugLog(String text) {
- d("DebugLog", text);
- this.text = text;
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/LogEntry.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/LogEntry.kt
new file mode 100644
index 00000000..a8a06338
--- /dev/null
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/LogEntry.kt
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) Kuba Szczodrzyński 2024-7-1.
+ */
+
+package pl.szczodrzynski.edziennik.data.db.entity
+
+import androidx.room.ColumnInfo
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+@Entity(tableName = "logs")
+data class LogEntry(
+ @PrimaryKey(autoGenerate = true)
+ val id: Int = 0,
+ @ColumnInfo(index = true)
+ val timestamp: Long,
+ val priority: Int,
+ val tag: String?,
+ val message: String,
+)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Notification.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Notification.kt
index 4e001a0d..22fddc72 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Notification.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Notification.kt
@@ -18,6 +18,7 @@ import pl.szczodrzynski.edziennik.data.enums.NotificationType
import pl.szczodrzynski.edziennik.ext.pendingIntentFlag
import pl.szczodrzynski.edziennik.ext.putExtras
import pl.szczodrzynski.edziennik.data.enums.NavTarget
+import timber.log.Timber
@Entity(tableName = "notifications")
data class Notification(
@@ -74,8 +75,8 @@ data class Notification(
intent.putExtra(key, primitive.asString)
}
}
- } catch (e: NullPointerException) {
- e.printStackTrace()
+ } catch (e: Exception) {
+ Timber.e(e)
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/migration/Migration101.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/migration/Migration101.kt
new file mode 100644
index 00000000..e0daafca
--- /dev/null
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/migration/Migration101.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) Kuba Szczodrzyński 2022-10-25.
+ */
+
+package pl.szczodrzynski.edziennik.data.db.migration
+
+import androidx.room.migration.Migration
+import androidx.sqlite.db.SupportSQLiteDatabase
+
+class Migration101 : Migration(100, 101) {
+
+ override fun migrate(db: SupportSQLiteDatabase) {
+ // remove old debugLogs table
+ db.execSQL("DROP TABLE debugLogs")
+ // add new logs table
+ db.execSQL(
+ "CREATE TABLE logs (" +
+ "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
+ "timestamp INTEGER NOT NULL, " +
+ "priority INTEGER NOT NULL, " +
+ "tag TEXT, " +
+ "message TEXT NOT NULL)"
+ )
+ // create index for logs table
+ db.execSQL("CREATE INDEX IF NOT EXISTS index_logs_timestamp ON logs (timestamp)")
+ }
+}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ext/ProfileExtensions.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ext/ProfileExtensions.kt
index 9bb70195..715ddb24 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ext/ProfileExtensions.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ext/ProfileExtensions.kt
@@ -21,6 +21,7 @@ import pl.szczodrzynski.edziennik.utils.ProfileImageHolder
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.navlib.ImageHolder
import pl.szczodrzynski.navlib.getDrawableFromRes
+import timber.log.Timber
// TODO refactor Data* fields and make the receiver non-nullable
operator fun Profile?.set(key: String, value: JsonElement) = this?.studentData?.add(key, value)
@@ -101,7 +102,7 @@ fun Profile.getDrawable(context: Context): Drawable {
RoundedBitmapDrawableFactory.create(context.resources, image ?: "")
}
} catch (e: Exception) {
- e.printStackTrace()
+ Timber.e(e)
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/agenda/DayDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/agenda/DayDialog.kt
index cacd51a1..4d239003 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/agenda/DayDialog.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/agenda/DayDialog.kt
@@ -28,7 +28,7 @@ import pl.szczodrzynski.edziennik.ui.event.EventListAdapter
import pl.szczodrzynski.edziennik.ui.event.EventManualDialog
import pl.szczodrzynski.edziennik.ui.notes.setupNotesButton
import pl.szczodrzynski.edziennik.utils.SimpleDividerItemDecoration
-import pl.szczodrzynski.edziennik.utils.managers.NoteManager
+import pl.szczodrzynski.edziennik.core.manager.NoteManager
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Time
import pl.szczodrzynski.edziennik.utils.models.Week
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/agenda/event/AgendaEventRenderer.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/agenda/event/AgendaEventRenderer.kt
index a51cfe43..722ca670 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/agenda/event/AgendaEventRenderer.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/agenda/event/AgendaEventRenderer.kt
@@ -20,7 +20,7 @@ import pl.szczodrzynski.edziennik.ext.join
import pl.szczodrzynski.edziennik.ext.resolveAttr
import pl.szczodrzynski.edziennik.ext.setTintColor
import pl.szczodrzynski.edziennik.utils.Colors
-import pl.szczodrzynski.edziennik.utils.managers.EventManager
+import pl.szczodrzynski.edziennik.core.manager.EventManager
class AgendaEventRenderer(
val manager: EventManager,
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/agenda/lessonchanges/LessonChangesAdapter.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/agenda/lessonchanges/LessonChangesAdapter.kt
index 38a5aa34..05f1ec44 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/agenda/lessonchanges/LessonChangesAdapter.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/agenda/lessonchanges/LessonChangesAdapter.kt
@@ -5,8 +5,6 @@
package pl.szczodrzynski.edziennik.ui.agenda.lessonchanges
import android.content.Context
-import android.graphics.PorterDuff
-import android.graphics.PorterDuffColorFilter
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.view.updateLayoutParams
@@ -16,7 +14,7 @@ import pl.szczodrzynski.edziennik.data.db.entity.Lesson
import pl.szczodrzynski.edziennik.data.db.full.LessonFull
import pl.szczodrzynski.edziennik.databinding.TimetableLessonBinding
import pl.szczodrzynski.edziennik.ext.*
-import pl.szczodrzynski.edziennik.utils.managers.NoteManager
+import pl.szczodrzynski.edziennik.core.manager.NoteManager
class LessonChangesAdapter(
val context: Context,
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/attendance/AttendanceDetailsDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/attendance/AttendanceDetailsDialog.kt
index b0c67241..7ab4901a 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/attendance/AttendanceDetailsDialog.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/attendance/AttendanceDetailsDialog.kt
@@ -16,7 +16,7 @@ import pl.szczodrzynski.edziennik.ext.setTintColor
import pl.szczodrzynski.edziennik.ui.dialogs.base.BindingDialog
import pl.szczodrzynski.edziennik.ui.notes.setupNotesButton
import pl.szczodrzynski.edziennik.utils.BetterLink
-import pl.szczodrzynski.edziennik.utils.managers.NoteManager
+import pl.szczodrzynski.edziennik.core.manager.NoteManager
class AttendanceDetailsDialog(
activity: AppCompatActivity,
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/attendance/AttendanceView.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/attendance/AttendanceView.kt
index 02be63ad..d7acd3e4 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/attendance/AttendanceView.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/attendance/AttendanceView.kt
@@ -19,7 +19,7 @@ import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.db.entity.Attendance
import pl.szczodrzynski.edziennik.ext.dp
import pl.szczodrzynski.edziennik.ext.setTintColor
-import pl.szczodrzynski.edziennik.utils.managers.AttendanceManager
+import pl.szczodrzynski.edziennik.core.manager.AttendanceManager
class AttendanceView : AppCompatTextView {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/attendance/viewholder/AttendanceViewHolder.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/attendance/viewholder/AttendanceViewHolder.kt
index ab6a0b92..247bac82 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/attendance/viewholder/AttendanceViewHolder.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/attendance/viewholder/AttendanceViewHolder.kt
@@ -19,7 +19,7 @@ import pl.szczodrzynski.edziennik.ui.attendance.models.AttendanceDayRange
import pl.szczodrzynski.edziennik.ui.attendance.models.AttendanceMonth
import pl.szczodrzynski.edziennik.ui.grades.models.ExpandableItemModel
import pl.szczodrzynski.edziennik.ui.grades.viewholder.BindableViewHolder
-import pl.szczodrzynski.edziennik.utils.managers.NoteManager
+import pl.szczodrzynski.edziennik.core.manager.NoteManager
import pl.szczodrzynski.edziennik.utils.models.Week
class AttendanceViewHolder(
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/DebugFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/DebugFragment.java
index 66d46762..bcb1f553 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/DebugFragment.java
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/DebugFragment.java
@@ -30,6 +30,7 @@ import java.util.regex.Pattern;
import pl.szczodrzynski.edziennik.App;
import pl.szczodrzynski.edziennik.R;
import pl.szczodrzynski.edziennik.utils.Themes;
+import timber.log.Timber;
public class DebugFragment extends Fragment {
App app;
@@ -193,7 +194,7 @@ public class DebugFragment extends Fragment {
temp = target;
}
} catch (Exception e) {
- e.printStackTrace();
+ Timber.e(e);
return Log.getStackTraceString(e);
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabPageFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabPageFragment.kt
index 2c96aff8..909c9eed 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabPageFragment.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabPageFragment.kt
@@ -69,6 +69,7 @@ class LabPageFragment : LazyFragment(), CoroutineScope {
b.resetEventTypes.isVisible = false
b.unarchive.isVisible = false
b.profile.isVisible = false
+ b.clearConfigProfile.isVisible = false
}
b.last10unseen.onClick {
@@ -165,8 +166,15 @@ class LabPageFragment : LazyFragment(), CoroutineScope {
}
}
+ b.clearConfigProfile.onClick {
+ app.db.configDao().clear(app.profileId)
+ }
+ b.clearConfigGlobal.onClick {
+ app.db.configDao().clear(-1)
+ }
b.rebuildConfig.onClick {
App.config = Config(app)
+ App.config.migrate()
}
val profiles = app.db.profileDao().allNow
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabPlaygroundFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabPlaygroundFragment.kt
index 76df7996..4b4beb52 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabPlaygroundFragment.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabPlaygroundFragment.kt
@@ -18,7 +18,7 @@ import pl.szczodrzynski.edziennik.ext.asColoredSpannable
import pl.szczodrzynski.edziennik.ext.concat
import pl.szczodrzynski.edziennik.ext.resolveAttr
import pl.szczodrzynski.edziennik.ui.base.lazypager.LazyFragment
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
import kotlin.coroutines.CoroutineContext
class LabPlaygroundFragment : LazyFragment(), CoroutineScope {
@@ -50,7 +50,7 @@ class LabPlaygroundFragment : LazyFragment(), CoroutineScope {
override fun onPageCreated(): Boolean {
- d(TAG, "textColorSecondary: ${android.R.attr.textColorSecondary.resolveAttr(activity)}")
+ Timber.d("textColorSecondary: ${android.R.attr.textColorSecondary.resolveAttr(activity)}")
b.spanTest1.text = listOf(
"Text:", "android:textColorSecondary spannable (activity)".asColoredSpannable(
android.R.attr.textColorSecondary.resolveAttr(activity)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/StyledTextDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/StyledTextDialog.kt
index e1be0d99..f8e720fb 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/StyledTextDialog.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/StyledTextDialog.kt
@@ -15,9 +15,8 @@ import pl.szczodrzynski.edziennik.databinding.StyledTextDialogBinding
import pl.szczodrzynski.edziennik.ext.isNightMode
import pl.szczodrzynski.edziennik.ui.dialogs.base.BindingDialog
import pl.szczodrzynski.edziennik.utils.DefaultTextStyles
-import pl.szczodrzynski.edziennik.utils.Themes
-import pl.szczodrzynski.edziennik.utils.managers.TextStylingManager.HtmlMode.SIMPLE
-import pl.szczodrzynski.edziennik.utils.managers.TextStylingManager.StylingConfig
+import pl.szczodrzynski.edziennik.core.manager.TextStylingManager.HtmlMode.SIMPLE
+import pl.szczodrzynski.edziennik.core.manager.TextStylingManager.StylingConfig
class StyledTextDialog(
activity: AppCompatActivity,
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/settings/GradesConfigDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/settings/GradesConfigDialog.kt
index b1c0c86f..2d946083 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/settings/GradesConfigDialog.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/settings/GradesConfigDialog.kt
@@ -17,15 +17,15 @@ import pl.szczodrzynski.edziennik.ext.onChange
import pl.szczodrzynski.edziennik.ext.onClick
import pl.szczodrzynski.edziennik.ext.setOnSelectedListener
import pl.szczodrzynski.edziennik.ui.dialogs.base.ConfigDialog
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.COLOR_MODE_DEFAULT
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.COLOR_MODE_WEIGHTED
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.ORDER_BY_DATE_DESC
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.ORDER_BY_SUBJECT_ASC
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_AVG_2_AVG
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_AVG_2_SEM
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_SEM_2_AVG
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_SEM_2_SEM
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_ALL_GRADES
+import pl.szczodrzynski.edziennik.core.manager.GradesManager.Companion.COLOR_MODE_DEFAULT
+import pl.szczodrzynski.edziennik.core.manager.GradesManager.Companion.COLOR_MODE_WEIGHTED
+import pl.szczodrzynski.edziennik.core.manager.GradesManager.Companion.ORDER_BY_DATE_DESC
+import pl.szczodrzynski.edziennik.core.manager.GradesManager.Companion.ORDER_BY_SUBJECT_ASC
+import pl.szczodrzynski.edziennik.core.manager.GradesManager.Companion.YEAR_1_AVG_2_AVG
+import pl.szczodrzynski.edziennik.core.manager.GradesManager.Companion.YEAR_1_AVG_2_SEM
+import pl.szczodrzynski.edziennik.core.manager.GradesManager.Companion.YEAR_1_SEM_2_AVG
+import pl.szczodrzynski.edziennik.core.manager.GradesManager.Companion.YEAR_1_SEM_2_SEM
+import pl.szczodrzynski.edziennik.core.manager.GradesManager.Companion.YEAR_ALL_GRADES
class GradesConfigDialog(
activity: AppCompatActivity,
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/sync/UpdateProgressDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/sync/UpdateProgressDialog.kt
index 68bd8d54..cfd1ba79 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/sync/UpdateProgressDialog.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/sync/UpdateProgressDialog.kt
@@ -18,7 +18,7 @@ import pl.szczodrzynski.edziennik.data.api.szkolny.response.Update
import pl.szczodrzynski.edziennik.databinding.UpdateProgressDialogBinding
import pl.szczodrzynski.edziennik.ext.getInt
import pl.szczodrzynski.edziennik.ext.startCoroutineTimer
-import pl.szczodrzynski.edziennik.sync.UpdateStateEvent
+import pl.szczodrzynski.edziennik.core.work.UpdateStateEvent
import pl.szczodrzynski.edziennik.ui.dialogs.base.BindingDialog
import pl.szczodrzynski.edziennik.utils.Utils
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/event/EventManualDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/event/EventManualDialog.kt
index 22260ad3..a9a054c7 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/event/EventManualDialog.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/event/EventManualDialog.kt
@@ -20,7 +20,6 @@ import kotlinx.coroutines.withContext
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
-import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.config.AppData
import pl.szczodrzynski.edziennik.data.api.edziennik.EdziennikTask
@@ -50,8 +49,8 @@ import pl.szczodrzynski.edziennik.ui.dialogs.settings.RegistrationConfigDialog
import pl.szczodrzynski.edziennik.ui.views.TimeDropdown.Companion.DISPLAY_LESSONS
import pl.szczodrzynski.edziennik.utils.Anim
import pl.szczodrzynski.edziennik.utils.html.BetterHtml
-import pl.szczodrzynski.edziennik.utils.managers.TextStylingManager.HtmlMode.SIMPLE
-import pl.szczodrzynski.edziennik.utils.managers.TextStylingManager.StylingConfigBase
+import pl.szczodrzynski.edziennik.core.manager.TextStylingManager.HtmlMode.SIMPLE
+import pl.szczodrzynski.edziennik.core.manager.TextStylingManager.StylingConfigBase
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Time
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/feedback/FeedbackFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/feedback/FeedbackFragment.kt
index 3004b35d..793aedb1 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/feedback/FeedbackFragment.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/feedback/FeedbackFragment.kt
@@ -33,6 +33,7 @@ import pl.szczodrzynski.edziennik.ext.crc16
import pl.szczodrzynski.edziennik.ext.onClick
import pl.szczodrzynski.edziennik.utils.Utils
import pl.szczodrzynski.edziennik.utils.Utils.openUrl
+import timber.log.Timber
import java.util.*
import kotlin.collections.set
import kotlin.coroutines.CoroutineContext
@@ -212,7 +213,7 @@ class FeedbackFragment : Fragment(), CoroutineScope {
else
Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888).also { bmp ->
launch {
- Log.d(TAG, "Created image for $userName")
+ Timber.d("Created image for " + userName)
val request = ImageRequest.Builder(activity)
.data(image)
.target {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradeDetailsDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradeDetailsDialog.kt
index d1ac9915..c474b5b4 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradeDetailsDialog.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradeDetailsDialog.kt
@@ -18,7 +18,7 @@ import pl.szczodrzynski.edziennik.ui.dialogs.settings.GradesConfigDialog
import pl.szczodrzynski.edziennik.ui.notes.setupNotesButton
import pl.szczodrzynski.edziennik.utils.BetterLink
import pl.szczodrzynski.edziennik.utils.SimpleDividerItemDecoration
-import pl.szczodrzynski.edziennik.utils.managers.NoteManager
+import pl.szczodrzynski.edziennik.core.manager.NoteManager
class GradeDetailsDialog(
activity: AppCompatActivity,
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradeView.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradeView.kt
index 04deebd7..be57e72f 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradeView.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradeView.kt
@@ -26,7 +26,7 @@ import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_YEAR_PROPO
import pl.szczodrzynski.edziennik.ext.dp
import pl.szczodrzynski.edziennik.ext.resolveAttr
import pl.szczodrzynski.edziennik.ext.setTintColor
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager
+import pl.szczodrzynski.edziennik.core.manager.GradesManager
class GradeView : AppCompatTextView {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradesListFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradesListFragment.kt
index d95bc477..a4ceb6d9 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradesListFragment.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradesListFragment.kt
@@ -28,7 +28,7 @@ import pl.szczodrzynski.edziennik.ui.grades.models.GradesAverages
import pl.szczodrzynski.edziennik.ui.grades.models.GradesSemester
import pl.szczodrzynski.edziennik.ui.grades.models.GradesStats
import pl.szczodrzynski.edziennik.ui.grades.models.GradesSubject
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager
+import pl.szczodrzynski.edziennik.core.manager.GradesManager
import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetPrimaryItem
import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetSeparatorItem
import kotlin.coroutines.CoroutineContext
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/editor/GradesEditorFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/editor/GradesEditorFragment.kt
index 154a42bf..c2ec00d4 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/editor/GradesEditorFragment.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/editor/GradesEditorFragment.kt
@@ -22,10 +22,11 @@ import pl.szczodrzynski.edziennik.ext.getInt
import pl.szczodrzynski.edziennik.ext.getLong
import pl.szczodrzynski.edziennik.ext.input
import pl.szczodrzynski.edziennik.utils.Colors
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_AVG_2_AVG
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_AVG_2_SEM
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_SEM_2_AVG
-import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_ALL_GRADES
+import pl.szczodrzynski.edziennik.core.manager.GradesManager.Companion.YEAR_1_AVG_2_AVG
+import pl.szczodrzynski.edziennik.core.manager.GradesManager.Companion.YEAR_1_AVG_2_SEM
+import pl.szczodrzynski.edziennik.core.manager.GradesManager.Companion.YEAR_1_SEM_2_AVG
+import pl.szczodrzynski.edziennik.core.manager.GradesManager.Companion.YEAR_ALL_GRADES
+import timber.log.Timber
import java.text.DecimalFormat
import java.util.*
import kotlin.math.floor
@@ -344,7 +345,7 @@ class GradesEditorFragment : Fragment() {
editorGrade.weight = input.toFloat()
callback()
} catch (e: Exception) {
- e.printStackTrace()
+ Timber.e(e)
}
true
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/viewholder/GradeViewHolder.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/viewholder/GradeViewHolder.kt
index 85684886..4d552722 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/viewholder/GradeViewHolder.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/viewholder/GradeViewHolder.kt
@@ -15,7 +15,7 @@ import pl.szczodrzynski.edziennik.data.db.full.GradeFull
import pl.szczodrzynski.edziennik.databinding.GradesItemGradeBinding
import pl.szczodrzynski.edziennik.ui.grades.GradesAdapter
import pl.szczodrzynski.edziennik.ui.grades.models.GradesSubject
-import pl.szczodrzynski.edziennik.utils.managers.NoteManager
+import pl.szczodrzynski.edziennik.core.manager.NoteManager
import pl.szczodrzynski.edziennik.utils.models.Date
class GradeViewHolder(
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/home/cards/HomeDebugCard.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/home/cards/HomeDebugCard.kt
index 6947b74b..c148b40f 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/home/cards/HomeDebugCard.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/home/cards/HomeDebugCard.kt
@@ -15,7 +15,6 @@ import androidx.core.view.plusAssign
import androidx.core.view.setMargins
import androidx.work.WorkManager
import com.chuckerteam.chucker.api.Chucker
-import com.hypertrack.hyperlog.HyperLog
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@@ -85,19 +84,6 @@ class HomeDebugCard(
app.startActivity(Chucker.getLaunchIntent(activity, 1));
}
- b.getLogs.onClick {
- val logs = HyperLog.getDeviceLogsInFile(activity, true)
- val intent = Intent(Intent.ACTION_SEND)
-
- if (logs.exists()) {
- intent.type = "text/plain"
- intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + logs.absolutePath))
- intent.putExtra(Intent.EXTRA_SUBJECT, "Share debug logs")
- intent.putExtra(Intent.EXTRA_TEXT, "Share debug logs")
- app.startActivity(Intent.createChooser(intent, "Share debug logs"))
- }
- }
-
b.refreshWidget.onClick {
for (widgetType in 0..2) {
val theClass = when (widgetType) {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginChooserFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginChooserFragment.kt
index d3898e19..21254c3c 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginChooserFragment.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginChooserFragment.kt
@@ -34,7 +34,7 @@ import pl.szczodrzynski.edziennik.ui.feedback.FeedbackActivity
import pl.szczodrzynski.edziennik.utils.BetterLinkMovementMethod
import pl.szczodrzynski.edziennik.utils.SimpleDividerItemDecoration
import pl.szczodrzynski.edziennik.utils.html.BetterHtml
-import pl.szczodrzynski.edziennik.utils.managers.AvailabilityManager.Error.Type
+import pl.szczodrzynski.edziennik.core.manager.AvailabilityManager.Error.Type
import pl.szczodrzynski.edziennik.utils.models.Date
import kotlin.coroutines.CoroutineContext
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginProgressFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginProgressFragment.kt
index dea6b426..59b330ad 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginProgressFragment.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginProgressFragment.kt
@@ -32,7 +32,7 @@ import pl.szczodrzynski.edziennik.data.enums.LoginType
import pl.szczodrzynski.edziennik.databinding.LoginProgressFragmentBinding
import pl.szczodrzynski.edziennik.ext.getEnum
import pl.szczodrzynski.edziennik.ext.joinNotNullStrings
-import pl.szczodrzynski.edziennik.utils.managers.UserActionManager
+import pl.szczodrzynski.edziennik.core.manager.UserActionManager
import kotlin.coroutines.CoroutineContext
import kotlin.math.max
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/oauth/OAuthLoginActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/oauth/OAuthLoginActivity.kt
index c80c3d82..4831371c 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/oauth/OAuthLoginActivity.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/oauth/OAuthLoginActivity.kt
@@ -14,7 +14,7 @@ import android.widget.FrameLayout
import androidx.appcompat.app.AppCompatActivity
import org.greenrobot.eventbus.EventBus
import pl.szczodrzynski.edziennik.R
-import pl.szczodrzynski.edziennik.utils.Utils.d
+import timber.log.Timber
class OAuthLoginActivity : AppCompatActivity() {
companion object {
@@ -35,7 +35,7 @@ class OAuthLoginActivity : AppCompatActivity() {
val webView = WebView(this)
webView.webViewClient = object : WebViewClient() {
override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) {
- d(TAG, "Navigating to $url")
+ Timber.d("Navigating to $url")
if (url.startsWith(redirectUrl)) {
isSuccessful = true
EventBus.getDefault().post(OAuthLoginResult(
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/messages/compose/MessagesComposeFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/messages/compose/MessagesComposeFragment.kt
index 3052219f..d6726578 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/messages/compose/MessagesComposeFragment.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/messages/compose/MessagesComposeFragment.kt
@@ -6,9 +6,6 @@ package pl.szczodrzynski.edziennik.ui.messages.compose
import android.annotation.SuppressLint
import android.os.Bundle
-import android.text.*
-import android.text.Spanned.*
-import android.text.style.*
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@@ -40,12 +37,10 @@ import pl.szczodrzynski.edziennik.data.enums.NavTarget
import pl.szczodrzynski.edziennik.ui.dialogs.settings.MessagesConfigDialog
import pl.szczodrzynski.edziennik.ui.messages.list.MessagesFragment
import pl.szczodrzynski.edziennik.utils.DefaultTextStyles
-import pl.szczodrzynski.edziennik.utils.Themes
-import pl.szczodrzynski.edziennik.utils.managers.MessageManager.UIConfig
-import pl.szczodrzynski.edziennik.utils.managers.TextStylingManager.HtmlMode.COMPATIBLE
-import pl.szczodrzynski.edziennik.utils.managers.TextStylingManager.HtmlMode.ORIGINAL
-import pl.szczodrzynski.edziennik.utils.managers.TextStylingManager.StylingConfig
-import pl.szczodrzynski.edziennik.utils.span.*
+import pl.szczodrzynski.edziennik.core.manager.MessageManager.UIConfig
+import pl.szczodrzynski.edziennik.core.manager.TextStylingManager.HtmlMode.COMPATIBLE
+import pl.szczodrzynski.edziennik.core.manager.TextStylingManager.HtmlMode.ORIGINAL
+import pl.szczodrzynski.edziennik.core.manager.TextStylingManager.StylingConfig
import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetPrimaryItem
import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetSeparatorItem
import kotlin.coroutines.CoroutineContext
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/messages/list/MessageViewHolder.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/messages/list/MessageViewHolder.kt
index 1c3d6aeb..baa6c723 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/messages/list/MessageViewHolder.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/messages/list/MessageViewHolder.kt
@@ -19,7 +19,7 @@ import pl.szczodrzynski.edziennik.ext.onClick
import pl.szczodrzynski.edziennik.ext.resolveAttr
import pl.szczodrzynski.edziennik.ui.grades.viewholder.BindableViewHolder
import pl.szczodrzynski.edziennik.ui.messages.MessagesUtils
-import pl.szczodrzynski.edziennik.utils.managers.NoteManager
+import pl.szczodrzynski.edziennik.core.manager.NoteManager
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.navlib.getColorFromAttr
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/notes/NoteEditorDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/notes/NoteEditorDialog.kt
index 8114a6db..b26a6158 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/notes/NoteEditorDialog.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/notes/NoteEditorDialog.kt
@@ -24,8 +24,8 @@ import pl.szczodrzynski.edziennik.ext.resolveString
import pl.szczodrzynski.edziennik.ui.dialogs.base.BindingDialog
import pl.szczodrzynski.edziennik.ui.dialogs.settings.RegistrationConfigDialog
import pl.szczodrzynski.edziennik.utils.TextInputDropDown
-import pl.szczodrzynski.edziennik.utils.managers.TextStylingManager.HtmlMode
-import pl.szczodrzynski.edziennik.utils.managers.TextStylingManager.StylingConfigBase
+import pl.szczodrzynski.edziennik.core.manager.TextStylingManager.HtmlMode
+import pl.szczodrzynski.edziennik.core.manager.TextStylingManager.StylingConfigBase
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/notifications/NotificationsListFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/notifications/NotificationsListFragment.kt
index f2a98f11..373ea7de 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/notifications/NotificationsListFragment.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/notifications/NotificationsListFragment.kt
@@ -27,6 +27,7 @@ import pl.szczodrzynski.edziennik.ext.startCoroutineTimer
import pl.szczodrzynski.edziennik.utils.SimpleDividerItemDecoration
import pl.szczodrzynski.edziennik.utils.Utils
import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetPrimaryItem
+import timber.log.Timber
import kotlin.coroutines.CoroutineContext
class NotificationsListFragment : Fragment(), CoroutineScope {
@@ -67,7 +68,7 @@ class NotificationsListFragment : Fragment(), CoroutineScope {
val intent = Intent("android.intent.action.MAIN")
notification.fillIntent(intent)
- Utils.d(TAG, "notification with item " + notification.navTarget + " extras " + if (intent.extras == null) "null" else intent.extras!!.toString())
+ Timber.d("notification with item " + notification.navTarget + " extras " + if (intent.extras == null) "null" else intent.extras!!.toString())
if (notification.profileId != null && notification.profileId != -1 && notification.profileId != app.profile.id && context is Activity) {
Toast.makeText(app, app.getString(R.string.toast_changing_profile), Toast.LENGTH_LONG).show()
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/settings/SettingsLicenseActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/settings/SettingsLicenseActivity.kt
index 7ec8c3f7..69d834d0 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/settings/SettingsLicenseActivity.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/settings/SettingsLicenseActivity.kt
@@ -276,14 +276,6 @@ class SettingsLicenseActivity : MaterialAboutActivity() {
"https://github.com/heinrichreimer/material-intro"
),
- license(
- "HyperLog Android",
- "2018",
- "HyperTrack",
- OpenSourceLicense.MIT,
- "https://github.com/hypertrack/hyperlog-android"
- ),
-
license(
"Color Picker",
"2016 Jared Rummler,",
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/settings/cards/SettingsSyncCard.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/settings/cards/SettingsSyncCard.kt
index 701a295e..dca0de98 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/settings/cards/SettingsSyncCard.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/settings/cards/SettingsSyncCard.kt
@@ -12,12 +12,11 @@ import android.os.Build.VERSION_CODES
import android.provider.Settings
import com.danielstone.materialaboutlibrary.model.MaterialAboutCard
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
-import pl.szczodrzynski.edziennik.MainActivity
import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.ext.after
import pl.szczodrzynski.edziennik.ext.getSyncInterval
-import pl.szczodrzynski.edziennik.sync.SyncWorker
-import pl.szczodrzynski.edziennik.sync.UpdateWorker
+import pl.szczodrzynski.edziennik.core.work.SyncWorker
+import pl.szczodrzynski.edziennik.core.work.UpdateWorker
import pl.szczodrzynski.edziennik.data.enums.NavTarget
import pl.szczodrzynski.edziennik.ui.dialogs.settings.NotificationFilterDialog
import pl.szczodrzynski.edziennik.ui.dialogs.settings.QuietHoursConfigDialog
@@ -173,7 +172,7 @@ class SettingsSyncCard(util: SettingsUtil) : SettingsCard(util) {
subText = R.string.settings_sync_notifications_settings_subtext,
icon = CommunityMaterial.Icon.cmd_cog_outline
) {
- val channel = app.notificationChannelsManager.data.key
+ val channel = app.notificationManager.data.key
val intent = Intent().apply {
when {
SDK_INT >= VERSION_CODES.O -> {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/timetable/GenerateBlockTimetableDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/timetable/GenerateBlockTimetableDialog.kt
index 29d8d935..22ce5dc4 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/timetable/GenerateBlockTimetableDialog.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/timetable/GenerateBlockTimetableDialog.kt
@@ -38,6 +38,7 @@ import pl.szczodrzynski.edziennik.ext.*
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Time
import pl.szczodrzynski.edziennik.utils.models.Week
+import timber.log.Timber
import java.io.File
import kotlin.coroutines.CoroutineContext
import kotlin.math.roundToInt
@@ -394,7 +395,7 @@ class GenerateBlockTimetableDialog(
}
uri
} catch (e: Exception) {
- Log.e("SAVE_IMAGE", e.message, e)
+ Timber.e(e)
return@withContext null
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/timetable/LessonDetailsDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/timetable/LessonDetailsDialog.kt
index 31d738dd..bedcd750 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/timetable/LessonDetailsDialog.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/timetable/LessonDetailsDialog.kt
@@ -29,7 +29,7 @@ import pl.szczodrzynski.edziennik.ui.event.EventManualDialog
import pl.szczodrzynski.edziennik.ui.notes.setupNotesButton
import pl.szczodrzynski.edziennik.utils.BetterLink
import pl.szczodrzynski.edziennik.utils.SimpleDividerItemDecoration
-import pl.szczodrzynski.edziennik.utils.managers.NoteManager
+import pl.szczodrzynski.edziennik.core.manager.NoteManager
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Week
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/timetable/TimetableDayFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/timetable/TimetableDayFragment.kt
index 734710e9..8420c003 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/timetable/TimetableDayFragment.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/timetable/TimetableDayFragment.kt
@@ -10,7 +10,6 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
-import android.widget.LinearLayout
import android.widget.TextView
import androidx.asynclayoutinflater.view.AsyncLayoutInflater
import androidx.core.graphics.ColorUtils
@@ -18,7 +17,6 @@ import androidx.core.view.isVisible
import androidx.core.view.marginTop
import androidx.core.view.setPadding
import androidx.core.view.updateLayoutParams
-import androidx.core.view.updateMargins
import com.linkedin.android.tachyon.DayView
import com.linkedin.android.tachyon.DayViewConfig
import com.mikepenz.iconics.IconicsDrawable
@@ -61,7 +59,7 @@ import pl.szczodrzynski.edziennik.ui.base.lazypager.LazyFragment
import pl.szczodrzynski.edziennik.ui.timetable.TimetableFragment.Companion.DEFAULT_END_HOUR
import pl.szczodrzynski.edziennik.ui.timetable.TimetableFragment.Companion.DEFAULT_START_HOUR
import pl.szczodrzynski.edziennik.utils.Colors
-import pl.szczodrzynski.edziennik.utils.managers.NoteManager
+import pl.szczodrzynski.edziennik.core.manager.NoteManager
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Time
import pl.szczodrzynski.edziennik.utils.models.Week
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/views/AttachmentsView.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/views/AttachmentsView.kt
index 81240d62..03f52b12 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/views/AttachmentsView.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/views/AttachmentsView.kt
@@ -23,6 +23,7 @@ import pl.szczodrzynski.edziennik.ext.get
import pl.szczodrzynski.edziennik.ext.isNotNullNorEmpty
import pl.szczodrzynski.edziennik.utils.SimpleDividerItemDecoration
import pl.szczodrzynski.edziennik.utils.Utils
+import timber.log.Timber
import java.io.File
class AttachmentsView @JvmOverloads constructor(
@@ -121,7 +122,7 @@ class AttachmentsView @JvmOverloads constructor(
}
else false
} catch (e: Exception) {
- e.printStackTrace()
+ Timber.e(e)
false
}
} else false
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/WidgetConfigActivity.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/WidgetConfigActivity.java
index 4909c196..6d2d0b5b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/WidgetConfigActivity.java
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/WidgetConfigActivity.java
@@ -35,6 +35,7 @@ import pl.szczodrzynski.edziennik.databinding.WidgetProfileDialogItemBinding;
import pl.szczodrzynski.edziennik.ui.widgets.luckynumber.WidgetLuckyNumberProvider;
import pl.szczodrzynski.edziennik.ui.widgets.notifications.WidgetNotificationsProvider;
import pl.szczodrzynski.edziennik.ui.widgets.timetable.WidgetTimetableProvider;
+import timber.log.Timber;
public class WidgetConfigActivity extends Activity {
@@ -217,7 +218,7 @@ public class WidgetConfigActivity extends Activity {
b.wallpaper.setImageDrawable(wallpaperManager.getDrawable());
}
catch (Exception e) {
- e.printStackTrace();
+ Timber.e(e);
}
b.theme.check(R.id.themeLight);
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/notifications/WidgetNotificationsProvider.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/notifications/WidgetNotificationsProvider.kt
index c66ca92c..053bfc0d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/notifications/WidgetNotificationsProvider.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/notifications/WidgetNotificationsProvider.kt
@@ -22,10 +22,9 @@ import pl.szczodrzynski.edziennik.MainActivity
import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.ext.Bundle
import pl.szczodrzynski.edziennik.ext.getJsonObject
-import pl.szczodrzynski.edziennik.ext.pendingIntentFlag
import pl.szczodrzynski.edziennik.ext.pendingIntentMutable
import pl.szczodrzynski.edziennik.ext.putExtras
-import pl.szczodrzynski.edziennik.receivers.SzkolnyReceiver
+import pl.szczodrzynski.edziennik.core.receiver.SzkolnyReceiver
import pl.szczodrzynski.edziennik.data.enums.NavTarget
import pl.szczodrzynski.edziennik.ui.widgets.WidgetConfig
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/timetable/WidgetTimetableFactory.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/timetable/WidgetTimetableFactory.java
index 960daef7..37b7d37d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/timetable/WidgetTimetableFactory.java
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/timetable/WidgetTimetableFactory.java
@@ -39,6 +39,7 @@ import pl.szczodrzynski.edziennik.utils.models.Date;
import pl.szczodrzynski.edziennik.utils.models.ItemWidgetTimetableModel;
import pl.szczodrzynski.edziennik.utils.models.Time;
import pl.szczodrzynski.edziennik.utils.models.Week;
+import timber.log.Timber;
public class WidgetTimetableFactory implements RemoteViewsService.RemoteViewsFactory {
@@ -53,7 +54,7 @@ public class WidgetTimetableFactory implements RemoteViewsService.RemoteViewsFac
this.context = context;
this.appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0);
// executed only ONCE
- Log.d(TAG, "appWidgetId: "+appWidgetId);
+ Timber.d("appWidgetId: %s", appWidgetId);
//App app = (App) context.getApplicationContext();
//this.lessons = widgetsLessons.get(appWidgetId);
/*this.lessons = new ArrayList<>();
@@ -69,7 +70,7 @@ public class WidgetTimetableFactory implements RemoteViewsService.RemoteViewsFac
@Override
public void onDataSetChanged() {
// executed EVERY TIME
- Log.d(TAG, "onDataSetChanged for appWidgetId: "+appWidgetId);
+ Timber.d("onDataSetChanged for appWidgetId: %s", appWidgetId);
lessons = WidgetTimetableProvider.Companion.getTimetables() == null ? null : WidgetTimetableProvider.Companion.getTimetables().get(appWidgetId);
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/timetable/WidgetTimetableProvider.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/timetable/WidgetTimetableProvider.kt
index fff58cad..799e623c 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/timetable/WidgetTimetableProvider.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/timetable/WidgetTimetableProvider.kt
@@ -43,6 +43,7 @@ import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.ItemWidgetTimetableModel
import pl.szczodrzynski.edziennik.utils.models.Time
import pl.szczodrzynski.edziennik.utils.models.Week
+import timber.log.Timber
import java.lang.reflect.InvocationTargetException
@@ -168,13 +169,13 @@ class WidgetTimetableProvider : AppWidgetProvider() {
}
}
} catch (e: ClassNotFoundException) {
- e.printStackTrace()
+ Timber.e(e)
} catch (e: InvocationTargetException) {
- e.printStackTrace()
+ Timber.e(e)
} catch (e: IllegalAccessException) {
- e.printStackTrace()
+ Timber.e(e)
} catch (e: IllegalArgumentException) {
- e.printStackTrace()
+ Timber.e(e)
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/DebugLogFormat.kt b/app/src/main/java/pl/szczodrzynski/edziennik/utils/DebugLogFormat.kt
deleted file mode 100644
index fbcd6498..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/DebugLogFormat.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package pl.szczodrzynski.edziennik.utils
-
-import android.content.Context
-import com.hypertrack.hyperlog.LogFormat
-
-class DebugLogFormat(context: Context) : LogFormat(context) {
- override fun getFormattedLogMessage(logLevelName: String?, tag: String?, message: String?, timeStamp: String?, senderName: String?, osVersion: String?, deviceUUID: String?): String {
- return "${timeStamp?.replace("[TZ]".toRegex(), " ")}D/$tag: $message"
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/DefaultTextStyles.kt b/app/src/main/java/pl/szczodrzynski/edziennik/utils/DefaultTextStyles.kt
index 7f1fa02a..a5cd9c23 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/DefaultTextStyles.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/utils/DefaultTextStyles.kt
@@ -8,7 +8,7 @@ import android.text.style.StrikethroughSpan
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.databinding.StyledTextButtonsBinding
-import pl.szczodrzynski.edziennik.utils.managers.TextStylingManager.StylingConfig
+import pl.szczodrzynski.edziennik.core.manager.TextStylingManager.StylingConfig
import pl.szczodrzynski.edziennik.utils.span.*
object DefaultTextStyles {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/PermissionChecker.java b/app/src/main/java/pl/szczodrzynski/edziennik/utils/PermissionChecker.java
index 3e4c43e6..398fc0e5 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/PermissionChecker.java
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/utils/PermissionChecker.java
@@ -16,6 +16,8 @@ import android.view.accessibility.AccessibilityManager;
import java.util.List;
+import timber.log.Timber;
+
public class PermissionChecker {
private Context mContext;
@@ -53,8 +55,8 @@ public class PermissionChecker {
try {
mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(), mContext.getPackageName());
- } catch (java.lang.IllegalArgumentException e) {
- e.printStackTrace();
+ } catch (Exception e) {
+ Timber.e(e);
}
boolean granted = false;
if (mode == AppOpsManager.MODE_DEFAULT) {
@@ -165,4 +167,4 @@ public class PermissionChecker {
return null;
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/Utils.java b/app/src/main/java/pl/szczodrzynski/edziennik/utils/Utils.java
index f039952d..010e8fc9 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/Utils.java
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/utils/Utils.java
@@ -26,8 +26,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.FileProvider;
-import com.hypertrack.hyperlog.HyperLog;
-
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
@@ -70,6 +68,7 @@ import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import pl.szczodrzynski.edziennik.App;
+import timber.log.Timber;
public class Utils {
private static final String TAG = "Utils";
@@ -105,21 +104,6 @@ public class Utils {
return false;*/
}
- public static List debugLog = new ArrayList<>();
-
- public static void d(String TAG, String message) {
- if (App.Companion.getDevMode()) {
- HyperLog.d("Szkolny/"+TAG, message);
- //debugLog.add(TAG+": "+message);
- }
- }
- public static void c(String TAG, String message) {
- /*if (App.devMode) {
- Log.d(TAG, "// " + message);
- ///debugLog.add(TAG+": // "+message);
- }*/
- }
-
/**
* Returns the first set (high) bit position, from right to left.
* @param n the number
@@ -247,7 +231,7 @@ public class Utils {
cursor.close();
}
catch (Exception e) {
- e.printStackTrace();
+ Timber.e(e);
}
return result;
}
@@ -258,7 +242,7 @@ public class Utils {
return Integer.parseInt(s);
}
catch (Exception e) {
- e.printStackTrace();
+ Timber.e(e);
return defaultValue;
}
}
@@ -336,8 +320,8 @@ public class Utils {
PackageInfo packageInfo;
packageInfo = context.getPackageManager().getPackageInfo(packageName, 0);
if (packageInfo != null) {
- Log.d(TAG, packageInfo.toString());
- Log.d(TAG, packageInfo.packageName+" "+packageInfo.versionName+" "+packageInfo.versionCode);
+ Timber.d(packageInfo.toString());
+ Timber.d("%s %s %d", packageInfo.packageName, packageInfo.versionName, packageInfo.versionCode);
return packageInfo.versionName;
}
else {
@@ -345,7 +329,7 @@ public class Utils {
}
}
catch (Exception e) {
- e.printStackTrace();
+ Timber.e(e);
return null;
}
}
@@ -471,10 +455,8 @@ public class Utils {
sha_HMAC.init(secret_key);
return Base64UrlSafe(sha_HMAC.doFinal(message.getBytes()));
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- } catch (InvalidKeyException e) {
- e.printStackTrace();
+ } catch (NoSuchAlgorithmException | InvalidKeyException e) {
+ Timber.e(e);
}
return null;
}
@@ -487,10 +469,8 @@ public class Utils {
sha_HMAC.init(secret_key);
return bytesToHex(sha_HMAC.doFinal(message.getBytes()));
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- } catch (InvalidKeyException e) {
- e.printStackTrace();
+ } catch (NoSuchAlgorithmException | InvalidKeyException e) {
+ Timber.e(e);
}
return null;
}
@@ -504,7 +484,7 @@ public class Utils {
MessageDigest md = java.security.MessageDigest.getInstance("MD5");
return Base64UrlSafe(md.digest(message.getBytes()));
}catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
+ Timber.e(e);
}
return null;
}
@@ -626,7 +606,7 @@ public class Utils {
}
out.close();
} catch (Exception e) {
- e.printStackTrace();
+ Timber.e(e);
return false;
}
return true;
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/NotificationChannelsManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/NotificationChannelsManager.kt
deleted file mode 100644
index 5989a35b..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/NotificationChannelsManager.kt
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-2-15.
- */
-
-package pl.szczodrzynski.edziennik.utils.managers
-
-import android.app.NotificationChannel
-import android.app.NotificationManager
-import android.content.Context
-import android.os.Build
-import androidx.core.app.NotificationCompat.*
-import androidx.core.app.NotificationManagerCompat.*
-import pl.szczodrzynski.edziennik.R
-
-class NotificationChannelsManager(val c: Context) {
- data class Channel(
- val id: Int,
- val key: String,
- val name: String,
- val description: String,
- val importance: Int,
- val priority: Int,
- val quiet: Boolean = false,
- val lightColor: Int? = null
- )
-
- fun registerAllChannels() {
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
- return
- val manager = c.getSystemService(NotificationManager::class.java)
-
- val registered = manager.notificationChannels.map { it.id }
- val all = all.map { it.key }
-
- val toRegister = all - registered
- val toDelete = registered - all
-
- for (key in toRegister) {
- val channel = this.all.firstOrNull { it.key == key } ?: continue
- manager.createNotificationChannel(NotificationChannel(key, channel.name, channel.importance).apply {
- description = channel.description
- if (channel.quiet) {
- enableVibration(false)
- setSound(null, null)
- }
- channel.lightColor?.let {
- enableLights(true)
- lightColor = it
- }
- })
- }
-
- for (key in toDelete) {
- if (key.contains("chucker"))
- continue
- manager.deleteNotificationChannel(key)
- }
- }
-
- val sync by lazy {
- Channel(
- 1,
- "pl.szczodrzynski.edziennik.SYNC",
- c.getString(R.string.notification_channel_get_data_name),
- c.getString(R.string.notification_channel_get_data_desc),
- IMPORTANCE_MIN,
- PRIORITY_MIN,
- quiet = true
- )
- }
-
- val data by lazy {
- Channel(
- 50,
- "pl.szczodrzynski.edziennik.DATA",
- c.getString(R.string.notification_channel_notifications_name),
- c.getString(R.string.notification_channel_notifications_desc),
- IMPORTANCE_HIGH,
- PRIORITY_MAX,
- lightColor = 0xff2196f3.toInt()
- )
- }
-
- val dataQuiet by lazy {
- Channel(
- 60,
- "pl.szczodrzynski.edziennik.DATA_QUIET",
- c.getString(R.string.notification_channel_notifications_quiet_name),
- c.getString(R.string.notification_channel_notifications_quiet_desc),
- IMPORTANCE_LOW,
- PRIORITY_LOW,
- quiet = true
- )
- }
-
- val updates by lazy {
- Channel(
- 100,
- "pl.szczodrzynski.edziennik.UPDATES",
- c.getString(R.string.notification_channel_updates_name),
- c.getString(R.string.notification_channel_updates_desc),
- IMPORTANCE_DEFAULT,
- PRIORITY_DEFAULT
- )
- }
-
- val userAttention by lazy {
- Channel(
- 200,
- "pl.szczodrzynski.edziennik.USER_ATTENTION",
- c.getString(R.string.notification_channel_user_attention_name),
- c.getString(R.string.notification_channel_user_attention_desc),
- IMPORTANCE_DEFAULT,
- PRIORITY_DEFAULT
- )
- }
-
- val all by lazy { listOf(
- sync,
- data,
- dataQuiet,
- updates,
- userAttention
- ) }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/Time.java b/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/Time.java
index 04b0c8a3..3b5bd02f 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/Time.java
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/Time.java
@@ -7,6 +7,8 @@ import org.jetbrains.annotations.NotNull;
import java.util.Calendar;
+import timber.log.Timber;
+
public class Time implements Comparable