diff --git a/.idea/misc.xml b/.idea/misc.xml index 4bcf062..cb0e206 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -23,6 +23,7 @@ + @@ -80,6 +81,7 @@ + diff --git a/app/build.gradle b/app/build.gradle index 38e162a..23da3d6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.ethosa.ktc" minSdk 21 targetSdk 32 - versionCode 14 - versionName "0.8.3" + versionCode 15 + versionName "0.8.4" ndk { abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 12cd487..04d22b6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,17 @@ android:theme="@style/Theme.KTC" android:usesCleartextTraffic="true" tools:targetApi="m"> + + + + + + + @@ -38,9 +49,9 @@ android:theme="@style/Theme.KTC.NoActionBar" /> + android:exported="true"> diff --git a/app/src/main/java/com/ethosa/ktc/ui/fragments/TimetableFragment.kt b/app/src/main/java/com/ethosa/ktc/ui/fragments/TimetableFragment.kt index e08197a..0910743 100644 --- a/app/src/main/java/com/ethosa/ktc/ui/fragments/TimetableFragment.kt +++ b/app/src/main/java/com/ethosa/ktc/ui/fragments/TimetableFragment.kt @@ -70,6 +70,10 @@ class TimetableFragment : IOFragmentBackPressed() { // toggle isStudent binding.toggleTimetable.setOnClickListener { Preferences.isStudent = !Preferences.isStudent + if (Preferences.isStudent && Preferences.timetableState == 2 && Preferences.teacherId == 0) + Preferences.isStudent = !Preferences.isStudent + if (!Preferences.isStudent && Preferences.timetableState == 2 && Preferences.group!!.id == 0) + Preferences.isStudent = !Preferences.isStudent loadState() } diff --git a/app/src/main/java/com/ethosa/ktc/ui/widgets/TeacherTimetableWidget.kt b/app/src/main/java/com/ethosa/ktc/ui/widgets/TeacherTimetableWidget.kt new file mode 100644 index 0000000..9353fd5 --- /dev/null +++ b/app/src/main/java/com/ethosa/ktc/ui/widgets/TeacherTimetableWidget.kt @@ -0,0 +1,145 @@ +package com.ethosa.ktc.ui.widgets + +import android.annotation.SuppressLint +import android.app.PendingIntent +import android.appwidget.AppWidgetManager +import android.appwidget.AppWidgetProvider +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.os.Build +import android.widget.RemoteViews +import com.ethosa.ktc.Preferences +import com.ethosa.ktc.R +import com.ethosa.ktc.college.CollegeApi +import com.ethosa.ktc.college.CollegeCallback +import com.ethosa.ktc.college.teacher.TeacherTimetable +import com.ethosa.ktc.ui.activities.MainActivity +import com.google.gson.Gson +import okhttp3.Call +import okhttp3.Response +import java.util.* + + +/** + * Implementation of App Widget functionality. + */ +class TeacherTimetableWidget : AppWidgetProvider() { + private val college = CollegeApi() + private var preferences: Preferences? = null + + override fun onUpdate( + context: Context, + appWidgetManager: AppWidgetManager, + appWidgetIds: IntArray + ) { + preferences = Preferences(context) + // There may be multiple widgets active, so update all of them + for (appWidgetId in appWidgetIds) { + updateAppWidget(context, appWidgetManager, appWidgetId) + } + } + + /** + * Update timetable for current widget + */ + @SuppressLint("UnspecifiedImmutableFlag") + private fun updateWidgetPendingIntent( + context: Context?, + appWidgetId: Int + ): PendingIntent { + val intent = Intent(context, TimetableWidget::class.java) + val ids = AppWidgetManager.getInstance(context) + .getAppWidgetIds(ComponentName(context!!, TimetableWidget::class.java)) + intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE + intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids) + + return PendingIntent.getBroadcast( + context, + appWidgetId, + intent, + when { + Build.VERSION.SDK_INT >= 31 -> PendingIntent.FLAG_MUTABLE + else -> PendingIntent.FLAG_UPDATE_CURRENT + }) + } + + /** + * Open app with pending intent + */ + @SuppressLint("UnspecifiedImmutableFlag") + private fun openAppPendingIntent( + context: Context?, + appWidgetId: Int + ): PendingIntent { + val intent = Intent(context, MainActivity::class.java) + return PendingIntent.getActivity( + context, + appWidgetId, + intent, + when { + Build.VERSION.SDK_INT >= 31 -> PendingIntent.FLAG_MUTABLE + else -> PendingIntent.FLAG_UPDATE_CURRENT + }) + } + + @SuppressLint("RemoteViewLayout") + private fun updateAppWidget( + context: Context, + appWidgetManager: AppWidgetManager, + appWidgetId: Int + ) { + // Construct the RemoteViews object + val views = RemoteViews(context.packageName, R.layout.widget_timetable) + views.setOnClickPendingIntent( + R.id.timetable_widget_reload, + updateWidgetPendingIntent(context, appWidgetId) + ) + views.setOnClickPendingIntent( + R.id.timetable_widget_background, + openAppPendingIntent(context, appWidgetId) + ) + // Load last group ID + val teacherId = Preferences.teacherId + val branchId = Preferences.branch!!.id + val calendar = Calendar.getInstance() + val weekday = calendar.get(Calendar.DAY_OF_WEEK) + + college.fetchTeacherTimetable(branchId, teacherId, object : CollegeCallback { + @SuppressLint("SetTextI18n") + override fun onResponse(call: Call, response: Response) { + // Parse JSON + val json = response.body?.string() + val timetable = Gson().fromJson(json, TeacherTimetable::class.java) + println(weekday) + // Get current day timetable + val day = + when { + weekday >= 2 -> timetable.week[weekday-2] + weekday > 1 -> timetable.week[1] + else -> timetable.week[0] + } + + // Setup widget + views.setTextViewText(R.id.timetable_widget_title, "${timetable.teacher} - ${day.title}") + views.removeAllViews(R.id.timetable_widget_lessons) + + // Setup views + for (l in day.lessons) { + println(l) + // Load lesson data + if (l.group == "") continue + val lesson = RemoteViews(context.packageName, R.layout.widget_tlesson) + lesson.setTextViewText(R.id.widget_tlesson_title, l.title) + lesson.setTextViewText(R.id.widget_tlesson_classroom, l.classroom) + lesson.setTextViewText(R.id.widget_tlesson_group, l.group) + lesson.setTextViewText(R.id.widget_tlesson_number, l.number) + views.addView(R.id.timetable_widget_lessons, lesson) + } + // Update widget + appWidgetManager.updateAppWidget(appWidgetId, views) + } + }) + appWidgetManager.updateAppWidget(appWidgetId, views) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ethosa/ktc/ui/widgets/TimetableWidget.kt b/app/src/main/java/com/ethosa/ktc/ui/widgets/TimetableWidget.kt index e473fb6..7418772 100644 --- a/app/src/main/java/com/ethosa/ktc/ui/widgets/TimetableWidget.kt +++ b/app/src/main/java/com/ethosa/ktc/ui/widgets/TimetableWidget.kt @@ -7,9 +7,9 @@ import android.appwidget.AppWidgetProvider import android.content.ComponentName import android.content.Context import android.content.Intent -import android.content.SharedPreferences import android.os.Build import android.widget.RemoteViews +import com.ethosa.ktc.Preferences import com.ethosa.ktc.R import com.ethosa.ktc.college.CollegeApi import com.ethosa.ktc.college.CollegeCallback @@ -26,14 +26,14 @@ import java.util.* */ class TimetableWidget : AppWidgetProvider() { private val college = CollegeApi() - private var preferences: SharedPreferences? = null + private var preferences: Preferences? = null override fun onUpdate( context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray ) { - preferences = context.getSharedPreferences("com.ethosa.ktc", Context.MODE_PRIVATE) + preferences = Preferences(context) // There may be multiple widgets active, so update all of them for (appWidgetId in appWidgetIds) { updateAppWidget(context, appWidgetManager, appWidgetId) @@ -100,11 +100,11 @@ class TimetableWidget : AppWidgetProvider() { openAppPendingIntent(context, appWidgetId) ) // Load last group ID - val groupId = preferences?.getInt("group", 0) + val groupId = Preferences.group!!.id val calendar = Calendar.getInstance() val weekday = calendar.get(Calendar.DAY_OF_WEEK) - college.fetchTimetable(groupId!!, object : CollegeCallback { + college.fetchTimetable(groupId, object : CollegeCallback { @SuppressLint("SetTextI18n") override fun onResponse(call: Call, response: Response) { // Parse JSON diff --git a/app/src/main/res/drawable-v21/ic_reload.xml b/app/src/main/res/drawable/ic_reload.xml similarity index 100% rename from app/src/main/res/drawable-v21/ic_reload.xml rename to app/src/main/res/drawable/ic_reload.xml diff --git a/app/src/main/res/layout/widget_lesson.xml b/app/src/main/res/layout/widget_lesson.xml index b7d68b4..113f95e 100644 --- a/app/src/main/res/layout/widget_lesson.xml +++ b/app/src/main/res/layout/widget_lesson.xml @@ -72,7 +72,6 @@ android:lineSpacingExtra="-4sp" android:padding="0dp" android:text="@string/lesson_title" - android:textSize="14sp" tools:textStyle="bold" /> + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml index 9df9efd..cf29372 100644 --- a/app/src/main/res/menu/bottom_nav_menu.xml +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -18,6 +18,6 @@ \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ee18d10..42c447a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,7 +5,8 @@ Github Расписание - Отображается расписание на сегодня + Виджет отображает расписание для студентов на сегодняшний день + Виджет отображает расписание для преподавателей на сегодняшний день Доступно обновление! Обновить приложение @@ -15,7 +16,7 @@ Новости Расписание Галерея - Настройки + Личный кабинет О приложении Контактная информация ProCollege @@ -63,4 +64,5 @@ Placeholder v0.0.1 + EXAMPLE \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index a37e439..5e462d2 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,4 +1,5 @@ +