Skip to content

Commit

Permalink
feat: preview version of the widget & all library versions have been …
Browse files Browse the repository at this point in the history
…updated & fix bug with background work & fix bug with notification
  • Loading branch information
v1tzor committed Nov 14, 2024
1 parent 770db98 commit b5d0a4d
Show file tree
Hide file tree
Showing 100 changed files with 2,009 additions and 356 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
/buildSrc/build
.DS_Store
.kotlin
/build
/captures
.externalNativeBuild
Expand Down
5 changes: 5 additions & 0 deletions .idea/detekt.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/kotlinc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion app/.gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
/build
/build
/release
/debug
5 changes: 5 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("kotlin-parcelize")
id("org.jetbrains.kotlin.plugin.compose") version "2.0.20"
kotlin("plugin.serialization") version "1.8.21"
kotlin("kapt")
}

Expand Down Expand Up @@ -132,6 +134,9 @@ dependencies {
implementation(Dependencies.AndroidX.material)
implementation(Dependencies.AndroidX.googleMaterial)
implementation(Dependencies.AndroidX.lifecycleRuntime)
implementation(Dependencies.AndroidX.serialization)
implementation(Dependencies.AndroidX.glance)
implementation(Dependencies.AndroidX.glanceMaterial)

implementation(Dependencies.Compose.ui)
implementation(Dependencies.Compose.activity)
Expand Down
21 changes: 20 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
~ limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ru.aleshin.timeplanner"
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
Expand Down Expand Up @@ -43,6 +42,16 @@
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="app"
android:host="timeplanner.com"
android:pathPrefix="/openEditor" />
</intent-filter>
</activity>

<receiver
Expand All @@ -55,6 +64,16 @@
</intent-filter>
</receiver>

<receiver android:name=".presentation.widgets.main.MainWidgetReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/main_widget_info" />
</receiver>

</application>

</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,11 @@ import ru.aleshin.core.ui.theme.tokens.fetchCoreLanguage
import ru.aleshin.core.ui.theme.tokens.fetchCoreStrings
import ru.aleshin.core.utils.extensions.fetchLocale
import ru.aleshin.core.utils.functional.Constants
import ru.aleshin.core.utils.notifications.NotificationCreator
import ru.aleshin.core.utils.notifications.parameters.NotificationDefaults
import ru.aleshin.core.utils.notifications.parameters.NotificationPriority
import ru.aleshin.core.utils.notifications.parameters.NotificationImportance
import ru.aleshin.timeplanner.di.component.AppComponent
import javax.inject.Inject

/**
* @author Stanislav Aleshin on 14.02.2023.
Expand All @@ -39,15 +41,15 @@ class TimePlannerApp : Application() {
AppComponent.create(applicationContext)
}

private val notificationCreator by lazy {
appComponent.fetchNotificationCreator()
}
@Inject
lateinit var notificationCreator: NotificationCreator

private val coreStrings: TimePlannerStrings
get() = fetchCoreStrings(fetchCoreLanguage(fetchLocale().language))

override fun onCreate() {
super.onCreate()
appComponent.inject(this)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
deleteOldChannel()
createTimeTaskNotifyChannel()
Expand All @@ -58,8 +60,8 @@ class TimePlannerApp : Application() {
private fun createTimeTaskNotifyChannel() = notificationCreator.createNotifyChannel(
channelId = Constants.Notification.CHANNEL_ID_NEW,
channelName = coreStrings.timeTaskChannelName,
priority = NotificationPriority.MAX,
defaults = NotificationDefaults(true, true, true),
importance = NotificationImportance.MAX,
defaults = NotificationDefaults(isSound = true, isVibrate = true, isLights = true),
)

@RequiresApi(Build.VERSION_CODES.O)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,22 @@ import android.content.Context
import dagger.BindsInstance
import dagger.Component
import ru.aleshin.core.utils.navigation.navigator.NavigatorManager
import ru.aleshin.core.utils.notifications.NotificationCreator
import ru.aleshin.features.analytics.impl.di.AnalyticsFeatureDependencies
import ru.aleshin.features.editor.impl.di.EditorFeatureDependencies
import ru.aleshin.features.home.impl.di.HomeFeatureDependencies
import ru.aleshin.features.settings.impl.di.SettingsFeatureDependencies
import ru.aleshin.timeplanner.application.TimePlannerApp
import ru.aleshin.timeplanner.di.annotation.TabNavigation
import ru.aleshin.timeplanner.di.modules.*
import ru.aleshin.timeplanner.di.modules.CoreModule
import ru.aleshin.timeplanner.di.modules.DataBaseModule
import ru.aleshin.timeplanner.di.modules.DataModule
import ru.aleshin.timeplanner.di.modules.DependenciesModule
import ru.aleshin.timeplanner.di.modules.DomainModules
import ru.aleshin.timeplanner.di.modules.FeatureModule
import ru.aleshin.timeplanner.di.modules.NavigationModule
import ru.aleshin.timeplanner.di.modules.PresentationModule
import ru.aleshin.timeplanner.domain.interactors.SettingsInteractor
import ru.aleshin.timeplanner.domain.interactors.TimeTaskInteractor
import ru.aleshin.timeplanner.presentation.ui.main.MainActivity
import ru.aleshin.timeplanner.presentation.ui.tabs.screenmodel.TabScreenModel
import javax.inject.Singleton
Expand Down Expand Up @@ -55,8 +64,10 @@ interface AppComponent :
@TabNavigation
fun fetchTabNavigatorManager(): NavigatorManager
fun fetchTabScreenModel(): TabScreenModel
fun fetchNotificationCreator(): NotificationCreator
fun fetchTimeTaskInteractor(): TimeTaskInteractor
fun fetchSettingsInteractor(): SettingsInteractor
fun inject(activity: MainActivity)
fun inject(application: TimePlannerApp)

@Component.Builder
interface Builder {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@ import dagger.Binds
import dagger.Module
import ru.aleshin.core.domain.common.ScheduleStatusChecker
import ru.aleshin.core.domain.common.TimeTaskStatusChecker
import ru.aleshin.core.ui.notifications.AlarmReceiverProvider
import ru.aleshin.core.ui.notifications.TemplatesAlarmManager
import ru.aleshin.core.ui.notifications.TimeTaskAlarmManager
import ru.aleshin.core.utils.managers.CoroutineManager
import ru.aleshin.core.utils.managers.DateManager
import ru.aleshin.core.utils.managers.TimeOverlayManager
import ru.aleshin.core.utils.notifications.NotificationCreator
import ru.aleshin.core.ui.notifications.AlarmReceiverProvider
import ru.aleshin.core.ui.notifications.TemplatesAlarmManager
import ru.aleshin.core.ui.notifications.TimeTaskAlarmManager
import ru.aleshin.timeplanner.navigation.GlobalNavigationManager
import ru.aleshin.timeplanner.navigation.TabNavigationManager
import ru.aleshin.timeplanner.presentation.receiver.AlarmReceiverProviderImpl
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
package ru.aleshin.timeplanner.di.modules

import android.content.Context
import androidx.room.Room
import dagger.Module
import dagger.Provides
import ru.aleshin.core.data.datasources.categories.CategoriesLocalDataSource
Expand Down Expand Up @@ -128,32 +127,14 @@ class DataBaseModule {

@Provides
@Singleton
fun provideSettingsDataBase(
context: Context,
): SettingsDataBase = Room.databaseBuilder(
context = context,
klass = SettingsDataBase::class.java,
name = SettingsDataBase.NAME,
).createFromAsset("database/settings_prepopulated.db")
.addMigrations(SettingsDataBase.MIGRATION_1_2)
.addMigrations(SettingsDataBase.MIGRATION_2_3)
.addMigrations(SettingsDataBase.MIGRATION_3_4)
.addMigrations(SettingsDataBase.MIGRATION_4_5)
.addMigrations(SettingsDataBase.MIGRATION_5_6)
.build()

@Provides
@Singleton
fun provideSchedulesDataBase(
context: Context,
) = Room.databaseBuilder(
context = context,
klass = SchedulesDataBase::class.java,
name = SchedulesDataBase.NAME,
).createFromAsset("database/categories_prepopulate.db")
.addMigrations(SchedulesDataBase.MIGRATE_2_3)
.addMigrations(SchedulesDataBase.MIGRATE_4_5)
.addMigrations(SchedulesDataBase.MIGRATE_5_6)
.addMigrations(SchedulesDataBase.MIGRATE_7_8)
.build()
fun provideSettingsDataBase(context: Context): SettingsDataBase = SettingsDataBase.create(context)

@Provides
@Singleton
fun provideSchedulesDataBase(context: Context): SchedulesDataBase = SchedulesDataBase.create(context)

// WorkManager

// @Provides
// fun provideWorkManager(context: Context): WorkManager = WorkManager.getInstance(context)
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import dagger.Module
import ru.aleshin.timeplanner.domain.common.MainEitherWrapper
import ru.aleshin.timeplanner.domain.common.MainErrorHandler
import ru.aleshin.timeplanner.domain.interactors.SettingsInteractor
import ru.aleshin.timeplanner.domain.interactors.TimeTaskInteractor
import javax.inject.Singleton

/**
Expand All @@ -37,4 +38,8 @@ interface DomainModules {

@Binds
fun bindMainErrorHandler(handler: MainErrorHandler.Base): MainErrorHandler

@Binds
@Singleton
fun bindTimeTaskInteractor(interactor: TimeTaskInteractor.Base): TimeTaskInteractor
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* Copyright 2023 Stanislav Aleshin
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ru.aleshin.timeplanner.domain.entities

import kotlinx.serialization.Serializable
import ru.aleshin.core.domain.entities.schedules.TimeTask

/**
* @author Stanislav Aleshin on 28.04.2024.
*/
@Serializable
data class TimeTasks(val tasks: List<TimeTask> = emptyList())
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright 2023 Stanislav Aleshin
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ru.aleshin.timeplanner.domain.interactors

import kotlinx.coroutines.flow.map
import ru.aleshin.core.domain.entities.schedules.TimeTask
import ru.aleshin.core.domain.repository.ScheduleRepository
import ru.aleshin.core.utils.functional.FlowDomainResult
import ru.aleshin.timeplanner.domain.common.MainEitherWrapper
import ru.aleshin.timeplanner.domain.common.MainFailures
import java.util.Date
import javax.inject.Inject

/**
* @author Stanislav Aleshin on 10.03.2023.
*/
interface TimeTaskInteractor {

suspend fun fetchTimeTasksByDate(date: Date): FlowDomainResult<MainFailures, List<TimeTask>>

class Base @Inject constructor(
private val scheduleRepository: ScheduleRepository,
private val eitherWrapper: MainEitherWrapper,
) : TimeTaskInteractor {
override suspend fun fetchTimeTasksByDate(date: Date) = eitherWrapper.wrapFlow {
scheduleRepository.fetchScheduleByDate(date.time).map {
it?.timeTasks ?: emptyList()
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,11 @@
package ru.aleshin.timeplanner.navigation

import ru.aleshin.core.utils.navigation.Router
import ru.aleshin.features.editor.api.navigations.EditorFeatureStarter
import ru.aleshin.features.editor.api.navigations.EditorScreens
import ru.aleshin.timeplanner.presentation.ui.tabs.TabsScreen
import javax.inject.Inject
import javax.inject.Provider

/**
* @author Stanislav Aleshin on 14.02.2023.
Expand All @@ -26,10 +29,20 @@ interface GlobalNavigationManager {

fun showTabScreen()

class Base @Inject constructor(private val router: Router) : GlobalNavigationManager {
fun navigateToEditorFeature(screen: EditorScreens)

class Base @Inject constructor(
private val globalRouter: Router,
private val editorFeatureStarter: Provider<EditorFeatureStarter>,
) : GlobalNavigationManager {

override fun showTabScreen() {
router.replaceTo(TabsScreen())
globalRouter.replaceTo(TabsScreen())
}

override fun navigateToEditorFeature(screen: EditorScreens) {
val editorNavScreen = editorFeatureStarter.get().provideEditorScreen(screen)
globalRouter.navigateTo(editorNavScreen)
}
}
}
Loading

0 comments on commit b5d0a4d

Please sign in to comment.