From 8f80bc70ed609574719aae22c8d261e3550d0302 Mon Sep 17 00:00:00 2001 From: Kacper Ziubryniewicz Date: Mon, 4 Nov 2019 22:13:07 +0100 Subject: [PATCH] [Architecture] Implement dagger for homework --- app/build.gradle | 8 +++- .../java/pl/szczodrzynski/edziennik/App.java | 19 +++++++++- .../szczodrzynski/edziennik/MainActivity.kt | 8 ++-- .../edziennik/data/db/AppDb.java | 30 +++++++++++++++ .../edziennik/data/db/DatabaseModule.kt | 26 +++++++++++++ .../data/db/modules/events/EventDao.java | 27 +++++++++++-- .../data/db/modules/metadata/MetadataDao.java | 11 ++---- .../edziennik/di/AppComponent.kt | 25 ++++++++++++ .../szczodrzynski/edziennik/di/AppModule.kt | 19 ++++++++++ .../edziennik/di/BindingModule.kt | 38 +++++++++++++++++++ .../edziennik/di/scopes/PerActivity.kt | 11 ++++++ .../edziennik/di/scopes/PerFragment.kt | 11 ++++++ .../edziennik/ui/base/BaseFragment.kt | 6 +-- .../ui/modules/homework/HomeworkFragment.kt | 11 +++--- .../ui/modules/homework/HomeworkPresenter.kt | 8 +++- .../ui/modules/homework/HomeworkView.kt | 3 -- .../homework/list/HomeworkListAdapter.kt | 9 +++-- .../homework/list/HomeworkListFragment.kt | 21 +++++----- .../homework/list/HomeworkListPresenter.kt | 10 +++-- .../modules/homework/list/HomeworkListView.kt | 3 -- build.gradle | 3 +- 21 files changed, 257 insertions(+), 50 deletions(-) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/DatabaseModule.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/di/AppComponent.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/di/AppModule.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/di/BindingModule.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/di/scopes/PerActivity.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/di/scopes/PerFragment.kt diff --git a/app/build.gradle b/app/build.gradle index df417d05..1a8471ae 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-android' +apply plugin: 'kotlin-kapt' apply plugin: 'com.google.gms.google-services' apply plugin: 'io.fabric' @@ -91,7 +92,7 @@ tasks.whenTaskAdded { task -> dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - annotationProcessor "androidx.room:room-compiler:${versions.room}" + kapt "androidx.room:room-compiler:${versions.room}" debugImplementation "com.amitshekhar.android:debug-db:1.0.5" implementation "android.arch.navigation:navigation-fragment-ktx:${versions.navigationFragment}" @@ -164,6 +165,11 @@ dependencies { implementation "io.github.wulkanowy:signer-android:0.1.1" implementation "androidx.work:work-runtime-ktx:${versions.work}" + + api "com.google.dagger:dagger:${versions.dagger}" + api "com.google.dagger:dagger-android-support:${versions.dagger}" + kapt "com.google.dagger:dagger-compiler:${versions.dagger}" + kapt "com.google.dagger:dagger-android-processor:${versions.dagger}" } repositories { mavenCentral() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/App.java b/app/src/main/java/pl/szczodrzynski/edziennik/App.java index b72c713e..92ebada9 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/App.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/App.java @@ -22,6 +22,7 @@ import android.util.Pair; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatDelegate; +import androidx.multidex.MultiDex; import androidx.work.Configuration; import com.chuckerteam.chucker.api.ChuckerCollector; @@ -59,6 +60,8 @@ import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; import cat.ereza.customactivityoncrash.config.CaocConfig; +import dagger.android.AndroidInjector; +import dagger.android.support.DaggerApplication; import im.wangchao.mhttp.MHttp; import im.wangchao.mhttp.internal.cookie.PersistentCookieJar; import im.wangchao.mhttp.internal.cookie.cache.SetCookieCache; @@ -77,6 +80,7 @@ import pl.szczodrzynski.edziennik.data.db.modules.debuglog.DebugLog; import pl.szczodrzynski.edziennik.data.db.modules.login.LoginStore; import pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile; import pl.szczodrzynski.edziennik.data.db.modules.profiles.ProfileFull; +import pl.szczodrzynski.edziennik.di.DaggerAppComponent; import pl.szczodrzynski.edziennik.network.NetworkUtils; import pl.szczodrzynski.edziennik.network.TLSSocketFactory; import pl.szczodrzynski.edziennik.sync.SyncWorker; @@ -90,7 +94,7 @@ import static pl.szczodrzynski.edziennik.data.db.modules.login.LoginStore.LOGIN_ import static pl.szczodrzynski.edziennik.data.db.modules.login.LoginStore.LOGIN_TYPE_MOBIDZIENNIK; import static pl.szczodrzynski.edziennik.data.db.modules.login.LoginStore.LOGIN_TYPE_VULCAN; -public class App extends androidx.multidex.MultiDexApplication implements Configuration.Provider { +public class App extends DaggerApplication implements Configuration.Provider { private static final String TAG = "App"; public static int profileId = -1; private Context mContext; @@ -181,6 +185,17 @@ public class App extends androidx.multidex.MultiDexApplication implements Config return Icon.createWithBitmap(bitmap); } + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + MultiDex.install(this); + } + + @Override + protected AndroidInjector applicationInjector() { + return DaggerAppComponent.factory().create(this); + } + @Override public void onCreate() { super.onCreate(); @@ -543,6 +558,7 @@ public class App extends androidx.multidex.MultiDexApplication implements Config appConfig = new AppConfig(this); } } + public void saveConfig() { try { @@ -724,5 +740,4 @@ public class App extends androidx.multidex.MultiDexApplication implements Config devMode = false; } } - } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt index 183d00de..76005aa8 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt @@ -9,7 +9,6 @@ import android.os.* import android.view.Gravity import android.view.View import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.PopupMenu import androidx.core.graphics.ColorUtils import androidx.lifecycle.Observer @@ -26,6 +25,7 @@ import com.mikepenz.materialdrawer.model.ProfileDrawerItem import com.mikepenz.materialdrawer.model.ProfileSettingDrawerItem import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem import com.mikepenz.materialdrawer.model.interfaces.IProfile +import dagger.android.support.DaggerAppCompatActivity import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode @@ -78,7 +78,7 @@ import java.io.IOException import java.util.* import kotlin.math.roundToInt -class MainActivity : AppCompatActivity() { +class MainActivity : DaggerAppCompatActivity() { companion object { var useOldMessages = false @@ -340,7 +340,7 @@ class MainActivity : AppCompatActivity() { if (!profileListEmpty) { handleIntent(intent?.extras) } - app.db.profileDao().getAllFull().observe(this, Observer { profiles -> + app.db.profileDao().allFull.observe(this, Observer { profiles -> // TODO fix weird -1 profiles ??? profiles.removeAll { it.id < 0 } drawer.setProfileList(profiles) @@ -357,7 +357,7 @@ class MainActivity : AppCompatActivity() { if (app.profile != null) setDrawerItems() - app.db.metadataDao().getUnreadCounts().observe(this, Observer { unreadCounters -> + app.db.metadataDao().unreadCounts.observe(this, Observer { unreadCounters -> unreadCounters.map { it.type = it.thingType } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.java index 800dcc69..a8ac1be7 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.java @@ -10,6 +10,8 @@ import androidx.room.TypeConverters; import androidx.room.migration.Migration; import androidx.sqlite.db.SupportSQLiteDatabase; +import javax.inject.Singleton; + import pl.szczodrzynski.edziennik.data.db.converters.ConverterDate; import pl.szczodrzynski.edziennik.data.db.converters.ConverterDateInt; import pl.szczodrzynski.edziennik.data.db.converters.ConverterJsonObject; @@ -74,6 +76,7 @@ import pl.szczodrzynski.edziennik.data.db.modules.teams.Team; import pl.szczodrzynski.edziennik.data.db.modules.teams.TeamDao; import pl.szczodrzynski.edziennik.utils.models.Date; +@Singleton @Database(entities = { Grade.class, //GradeCategory.class, @@ -114,33 +117,60 @@ import pl.szczodrzynski.edziennik.utils.models.Date; public abstract class AppDb extends RoomDatabase { public abstract GradeDao gradeDao(); + //public abstract GradeCategoryDao gradeCategoryDao(); public abstract TeacherDao teacherDao(); + public abstract TeacherAbsenceDao teacherAbsenceDao(); + public abstract TeacherAbsenceTypeDao teacherAbsenceTypeDao(); + public abstract SubjectDao subjectDao(); + public abstract NoticeDao noticeDao(); + public abstract LessonDao lessonDao(); + public abstract LessonChangeDao lessonChangeDao(); + public abstract TeamDao teamDao(); + public abstract AttendanceDao attendanceDao(); + public abstract EventDao eventDao(); + public abstract EventTypeDao eventTypeDao(); + public abstract LoginStoreDao loginStoreDao(); + public abstract ProfileDao profileDao(); + public abstract LuckyNumberDao luckyNumberDao(); + public abstract AnnouncementDao announcementDao(); + public abstract GradeCategoryDao gradeCategoryDao(); + public abstract FeedbackMessageDao feedbackMessageDao(); + public abstract MessageDao messageDao(); + public abstract MessageRecipientDao messageRecipientDao(); + public abstract DebugLogDao debugLogDao(); + public abstract EndpointTimerDao endpointTimerDao(); + public abstract LessonRangeDao lessonRangeDao(); + public abstract NotificationDao notificationDao(); + public abstract ClassroomDao classroomDao(); + public abstract NoticeTypeDao noticeTypeDao(); + public abstract AttendanceTypeDao attendanceTypeDao(); + public abstract MetadataDao metadataDao(); private static volatile AppDb INSTANCE; diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/DatabaseModule.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/DatabaseModule.kt new file mode 100644 index 00000000..c6d46eed --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/DatabaseModule.kt @@ -0,0 +1,26 @@ +/* + * Copyright (c) Kacper Ziubryniewicz 2019-11-4 + */ + +package pl.szczodrzynski.edziennik.data.db + +import android.content.Context +import dagger.Module +import dagger.Provides +import javax.inject.Singleton + +@Module +internal class DatabaseModule { + + @Singleton + @Provides + fun provideDatabase(context: Context) = AppDb.getDatabase(context) + + @Singleton + @Provides + fun provideEventDao(database: AppDb) = database.eventDao() + + @Singleton + @Provides + fun provideMetadataDao(database: AppDb) = database.metadataDao() +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/events/EventDao.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/events/EventDao.java index 2d1e7d37..7b9f3f45 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/events/EventDao.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/events/EventDao.java @@ -1,19 +1,22 @@ package pl.szczodrzynski.edziennik.data.db.modules.events; +import android.util.Log; + +import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; -import androidx.sqlite.db.SimpleSQLiteQuery; -import androidx.sqlite.db.SupportSQLiteQuery; import androidx.room.Dao; import androidx.room.Insert; import androidx.room.OnConflictStrategy; import androidx.room.Query; import androidx.room.RawQuery; import androidx.room.Transaction; -import androidx.annotation.NonNull; -import android.util.Log; +import androidx.sqlite.db.SimpleSQLiteQuery; +import androidx.sqlite.db.SupportSQLiteQuery; import java.util.List; +import javax.inject.Singleton; + import pl.szczodrzynski.edziennik.utils.models.Date; import pl.szczodrzynski.edziennik.utils.models.Time; @@ -21,6 +24,7 @@ import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_ import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_HOMEWORK; import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_LESSON_CHANGE; +@Singleton @Dao public abstract class EventDao { @Insert(onConflict = OnConflictStrategy.REPLACE) @@ -34,26 +38,32 @@ public abstract class EventDao { @Query("DELETE FROM events WHERE profileId = :profileId AND eventId = :id") public abstract void remove(int profileId, long id); + @Query("DELETE FROM metadata WHERE profileId = :profileId AND thingType = :thingType AND thingId = :thingId") public abstract void removeMetadata(int profileId, int thingType, long thingId); + @Transaction public void remove(int profileId, int type, long id) { remove(profileId, id); removeMetadata(profileId, type == Event.TYPE_HOMEWORK ? TYPE_HOMEWORK : TYPE_EVENT, id); } + @Transaction public void remove(Event event) { remove(event.profileId, event.type, event.id); } + @Transaction public void remove(int profileId, Event event) { remove(profileId, event.type, event.id); } + @Query("DELETE FROM events WHERE teamId = :teamId AND eventId = :id") public abstract void removeByTeamId(long teamId, long id); @RawQuery(observedEntities = {Event.class}) abstract LiveData> getAll(SupportSQLiteQuery query); + public LiveData> getAll(int profileId, String filter) { String query = "SELECT \n" + "*, \n" + @@ -71,24 +81,31 @@ public abstract class EventDao { Log.d("DB", query); return getAll(new SimpleSQLiteQuery(query)); } + public LiveData> getAll(int profileId) { return getAll(profileId, "1"); } + public List getAllNow(int profileId) { return getAllNow(profileId, "1"); } + public LiveData> getAllWhere(int profileId, String filter) { return getAll(profileId, filter); } + public LiveData> getAllByType(int profileId, int type, String filter) { return getAll(profileId, "eventType = "+type+" AND "+filter); } + public LiveData> getAllByDate(int profileId, @NonNull Date date) { return getAll(profileId, "eventDate = '"+date.getStringY_m_d()+"'"); } + public List getAllByDateNow(int profileId, @NonNull Date date) { return getAllNow(profileId, "eventDate = '"+date.getStringY_m_d()+"'"); } + public LiveData> getAllByDateTime(int profileId, @NonNull Date date, Time time) { if (time == null) return getAllByDate(profileId, date); @@ -97,6 +114,7 @@ public abstract class EventDao { @RawQuery abstract List getAllNow(SupportSQLiteQuery query); + public List getAllNow(int profileId, String filter) { return getAllNow(new SimpleSQLiteQuery("SELECT \n" + "*, \n" + @@ -112,6 +130,7 @@ public abstract class EventDao { "WHERE events.profileId = "+profileId+" AND events.eventBlacklisted = 0 AND "+filter+"\n" + "ORDER BY eventStartTime, addedDate ASC")); } + public List getNotNotifiedNow(int profileId) { return getAllNow(profileId, "notified = 0"); } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/metadata/MetadataDao.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/metadata/MetadataDao.java index d86b9f16..f1beb4b8 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/metadata/MetadataDao.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/metadata/MetadataDao.java @@ -9,7 +9,8 @@ import androidx.room.Transaction; import java.util.List; -import pl.szczodrzynski.edziennik.data.db.modules.notices.Notice; +import javax.inject.Singleton; + import pl.szczodrzynski.edziennik.data.db.modules.announcements.Announcement; import pl.szczodrzynski.edziennik.data.db.modules.attendance.Attendance; import pl.szczodrzynski.edziennik.data.db.modules.events.Event; @@ -17,6 +18,7 @@ import pl.szczodrzynski.edziennik.data.db.modules.grades.Grade; import pl.szczodrzynski.edziennik.data.db.modules.lessons.LessonChange; import pl.szczodrzynski.edziennik.data.db.modules.lessons.LessonFull; import pl.szczodrzynski.edziennik.data.db.modules.messages.Message; +import pl.szczodrzynski.edziennik.data.db.modules.notices.Notice; import pl.szczodrzynski.edziennik.utils.models.UnreadCounter; import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_ANNOUNCEMENT; @@ -28,6 +30,7 @@ import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_ import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_MESSAGE; import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_NOTICE; +@Singleton @Dao public abstract class MetadataDao { @Insert(onConflict = OnConflictStrategy.IGNORE) @@ -43,7 +46,6 @@ public abstract class MetadataDao { abstract void updateNotified(int profileId, int thingType, long thingId, boolean notified); - @Transaction public void setSeen(List metadataList) { for (Metadata metadata: metadataList) { @@ -152,7 +154,6 @@ public abstract class MetadataDao { } - @Query("UPDATE metadata SET seen = :seen WHERE profileId = :profileId AND thingType = :thingType") public abstract void setAllSeen(int profileId, int thingType, boolean seen); @@ -166,7 +167,6 @@ public abstract class MetadataDao { public abstract void setAllNotified(int profileId, boolean notified); - @Query("SELECT count() FROM metadata WHERE profileId = :profileId AND thingType = :thingType AND seen = 0") public abstract LiveData countUnseen(int profileId, int thingType); @@ -183,7 +183,6 @@ public abstract class MetadataDao { public abstract LiveData countUnseen(); - @Query("DELETE FROM metadata WHERE profileId = :profileId AND thingType = :thingType AND thingId = :thingId") public abstract void delete(int profileId, int thingType, long thingId); @@ -191,12 +190,10 @@ public abstract class MetadataDao { public abstract void deleteAll(int profileId); - @Query("SELECT profileId, thingType, COUNT(thingId) AS count FROM metadata WHERE seen = 0 GROUP BY profileId, thingType") public abstract LiveData> getUnreadCounts(); - @Query("DELETE FROM metadata WHERE profileId = :profileId AND thingType = "+TYPE_GRADE+" AND thingId NOT IN (SELECT gradeId FROM grades WHERE profileId = :profileId);") public abstract void deleteUnusedGrades(int profileId); diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/di/AppComponent.kt b/app/src/main/java/pl/szczodrzynski/edziennik/di/AppComponent.kt new file mode 100644 index 00000000..1f2b3ba1 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/di/AppComponent.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) Kacper Ziubryniewicz 2019-11-4 + */ + +package pl.szczodrzynski.edziennik.di + +import dagger.Component +import dagger.android.AndroidInjector +import dagger.android.support.AndroidSupportInjectionModule +import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.data.db.DatabaseModule +import javax.inject.Singleton + +@Singleton +@Component(modules = [ + AndroidSupportInjectionModule::class, + BindingModule::class, + AppModule::class, + DatabaseModule::class +]) +interface AppComponent : AndroidInjector { + + @Component.Factory + interface Factory : AndroidInjector.Factory +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/di/AppModule.kt b/app/src/main/java/pl/szczodrzynski/edziennik/di/AppModule.kt new file mode 100644 index 00000000..08e97cde --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/di/AppModule.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) Kacper Ziubryniewicz 2019-11-4 + */ + +package pl.szczodrzynski.edziennik.di + +import android.content.Context +import dagger.Module +import dagger.Provides +import pl.szczodrzynski.edziennik.App +import javax.inject.Singleton + +@Module +internal class AppModule { + + @Singleton + @Provides + fun provideContext(app: App): Context = app +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/di/BindingModule.kt b/app/src/main/java/pl/szczodrzynski/edziennik/di/BindingModule.kt new file mode 100644 index 00000000..67b84f9b --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/di/BindingModule.kt @@ -0,0 +1,38 @@ +/* + * Copyright (c) Kacper Ziubryniewicz 2019-11-4 + */ + +package pl.szczodrzynski.edziennik.di + +import dagger.Module +import dagger.android.ContributesAndroidInjector +import pl.szczodrzynski.edziennik.MainActivity +import pl.szczodrzynski.edziennik.di.scopes.PerActivity +import pl.szczodrzynski.edziennik.di.scopes.PerFragment +import pl.szczodrzynski.edziennik.ui.modules.homework.HomeworkFragment +import pl.szczodrzynski.edziennik.ui.modules.homework.list.HomeworkListFragment + +@Module +@Suppress("unused") +internal abstract class BindingModule { + + /** + * ACTIVITIES + */ + + @PerActivity + @ContributesAndroidInjector + abstract fun bindMainActivity(): MainActivity + + /** + * FRAGMENTS + */ + + @PerFragment + @ContributesAndroidInjector + abstract fun bindHomeworkFragment(): HomeworkFragment + + @PerFragment + @ContributesAndroidInjector + abstract fun bindHomeworkListFragment(): HomeworkListFragment +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/di/scopes/PerActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/di/scopes/PerActivity.kt new file mode 100644 index 00000000..a2e85894 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/di/scopes/PerActivity.kt @@ -0,0 +1,11 @@ +/* + * Copyright (c) Kacper Ziubryniewicz 2019-11-4 + */ + +package pl.szczodrzynski.edziennik.di.scopes + +import javax.inject.Scope + +@Scope +@Retention(AnnotationRetention.RUNTIME) +annotation class PerActivity diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/di/scopes/PerFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/di/scopes/PerFragment.kt new file mode 100644 index 00000000..4d2a189b --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/di/scopes/PerFragment.kt @@ -0,0 +1,11 @@ +/* + * Copyright (c) Kacper Ziubryniewicz 2019-11-4 + */ + +package pl.szczodrzynski.edziennik.di.scopes + +import javax.inject.Scope + +@Scope +@Retention(AnnotationRetention.RUNTIME) +annotation class PerFragment diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/base/BaseFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/base/BaseFragment.kt index 5c848c46..f7f310aa 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/base/BaseFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/base/BaseFragment.kt @@ -5,11 +5,11 @@ package pl.szczodrzynski.edziennik.ui.base import android.widget.Toast -import androidx.fragment.app.Fragment +import dagger.android.support.DaggerFragment -abstract class BaseFragment> : Fragment(), BaseView { +abstract class BaseFragment> : DaggerFragment(), BaseView { - abstract val presenter: T + abstract var presenter: T override fun showMessage(text: String) { Toast.makeText(activity, text, Toast.LENGTH_SHORT).show() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/HomeworkFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/HomeworkFragment.kt index 7b6114f3..e9057bcb 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/HomeworkFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/HomeworkFragment.kt @@ -17,18 +17,21 @@ import pl.szczodrzynski.edziennik.ui.modules.messages.MessagesFragment import pl.szczodrzynski.edziennik.utils.Themes import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetPrimaryItem import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetSeparatorItem +import javax.inject.Inject class HomeworkFragment : BaseFragment(), HomeworkView { companion object { var pageSelection = 0 } - override lateinit var app: App - private lateinit var activity: MainActivity private lateinit var b: FragmentHomeworkBinding - override val presenter: HomeworkPresenter = HomeworkPresenter() + @Inject + override lateinit var presenter: HomeworkPresenter + + @Inject + lateinit var app: App override val markAsReadSuccessString: String get() = getString(R.string.main_menu_mark_as_read_success) @@ -40,8 +43,6 @@ class HomeworkFragment : BaseFragment(), HomeworkView { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { activity = (getActivity() as MainActivity) - app = activity.application as App - context!!.theme.applyStyle(Themes.appTheme, true) if (app.profile == null) return inflater.inflate(R.layout.fragment_loading, container, false) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/HomeworkPresenter.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/HomeworkPresenter.kt index 7987154e..ebe446cb 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/HomeworkPresenter.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/HomeworkPresenter.kt @@ -7,9 +7,13 @@ package pl.szczodrzynski.edziennik.ui.modules.homework import android.os.AsyncTask import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata +import pl.szczodrzynski.edziennik.data.db.modules.metadata.MetadataDao import pl.szczodrzynski.edziennik.ui.base.BasePresenter +import javax.inject.Inject -class HomeworkPresenter : BasePresenter() { +class HomeworkPresenter @Inject constructor( + private val metadataDao: MetadataDao +) : BasePresenter() { override fun onAttachView(view: HomeworkView) { super.onAttachView(view) @@ -31,7 +35,7 @@ class HomeworkPresenter : BasePresenter() { view?.apply { closeBottomSheet() AsyncTask.execute { - app.db.metadataDao().setAllSeen(App.profileId, Metadata.TYPE_HOMEWORK, true) + metadataDao.setAllSeen(App.profileId, Metadata.TYPE_HOMEWORK, true) } showMessage(markAsReadSuccessString) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/HomeworkView.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/HomeworkView.kt index a7d0a667..f78803d6 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/HomeworkView.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/HomeworkView.kt @@ -4,13 +4,10 @@ package pl.szczodrzynski.edziennik.ui.modules.homework -import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.ui.base.BaseView interface HomeworkView : BaseView { - var app: App - val markAsReadSuccessString: String fun initView() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/list/HomeworkListAdapter.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/list/HomeworkListAdapter.kt index d051f576..4bfb772b 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/list/HomeworkListAdapter.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/list/HomeworkListAdapter.kt @@ -19,12 +19,16 @@ import androidx.recyclerview.widget.RecyclerView import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.R import pl.szczodrzynski.edziennik.data.db.modules.events.EventFull +import pl.szczodrzynski.edziennik.data.db.modules.metadata.MetadataDao import pl.szczodrzynski.edziennik.databinding.RowHomeworkItemBinding import pl.szczodrzynski.edziennik.utils.Utils.bs import pl.szczodrzynski.edziennik.utils.models.Date +import javax.inject.Inject import kotlin.math.abs -class HomeworkListAdapter : RecyclerView.Adapter() { +class HomeworkListAdapter @Inject constructor( + private val metadataDao: MetadataDao +) : RecyclerView.Adapter() { val homeworkList: MutableList = mutableListOf() lateinit var onItemEditClick: (homework: EventFull) -> Unit @@ -55,7 +59,7 @@ class HomeworkListAdapter : RecyclerView.Adapter homework.seen = true AsyncTask.execute { - app.db.metadataDao().setSeen(App.profileId, homework, true) + metadataDao.setSeen(App.profileId, homework, true) } } else -> b.homeworkItemTopic.background = null @@ -86,7 +90,6 @@ class HomeworkListAdapter : RecyclerView.Adapter fun getString(resId: Int, vararg formatArgs: Any): String = itemView.context.getString(resId, *formatArgs) fun getDrawable(resId: Int): Drawable? = ContextCompat.getDrawable(itemView.context, resId) - val app: App get() = itemView.context.applicationContext as App val resources: Resources get() = itemView.context.resources fun dateDiffString(diff: Int): String { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/list/HomeworkListFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/list/HomeworkListFragment.kt index 1a4daddd..115d831d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/list/HomeworkListFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/list/HomeworkListFragment.kt @@ -20,17 +20,21 @@ import pl.szczodrzynski.edziennik.databinding.HomeworkListBinding import pl.szczodrzynski.edziennik.ui.base.BaseFragment import pl.szczodrzynski.edziennik.ui.dialogs.event.EventManualDialog import pl.szczodrzynski.edziennik.utils.Themes +import javax.inject.Inject class HomeworkListFragment : BaseFragment(), HomeworkListView { - override lateinit var app: App - private lateinit var activity: MainActivity private lateinit var b: HomeworkListBinding - private lateinit var homeworkAdapter: HomeworkListAdapter + @Inject + override lateinit var presenter: HomeworkListPresenter - override val presenter: HomeworkListPresenter = HomeworkListPresenter() + @Inject + lateinit var app: App + + @Inject + lateinit var homeworkAdapter: HomeworkListAdapter override val viewLifecycle: Lifecycle get() = lifecycle @@ -52,7 +56,6 @@ class HomeworkListFragment : BaseFragment(), HomeworkList activity = (getActivity() as MainActivity?) ?: return null if (context == null) return null - app = activity.application as App context!!.theme.applyStyle(Themes.appTheme, true) if (app.profile == null) return inflater.inflate(R.layout.fragment_loading, container, false) @@ -66,11 +69,11 @@ class HomeworkListFragment : BaseFragment(), HomeworkList if (app.profile == null || !isAdded) return - val layoutManager = LinearLayoutManager(context) - layoutManager.reverseLayout = true - layoutManager.stackFromEnd = true + val layoutManager = LinearLayoutManager(context).apply { + reverseLayout = true + stackFromEnd = true + } - homeworkAdapter = HomeworkListAdapter() homeworkAdapter.onItemEditClick = presenter::onItemEditClick b.homeworkView.apply { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/list/HomeworkListPresenter.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/list/HomeworkListPresenter.kt index d1fb1063..cc25919d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/list/HomeworkListPresenter.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/list/HomeworkListPresenter.kt @@ -6,12 +6,17 @@ package pl.szczodrzynski.edziennik.ui.modules.homework.list import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.data.db.modules.events.Event +import pl.szczodrzynski.edziennik.data.db.modules.events.EventDao import pl.szczodrzynski.edziennik.data.db.modules.events.EventFull import pl.szczodrzynski.edziennik.ui.base.BasePresenter import pl.szczodrzynski.edziennik.ui.modules.homework.HomeworkDate import pl.szczodrzynski.edziennik.utils.models.Date +import javax.inject.Inject -class HomeworkListPresenter : BasePresenter() { +class HomeworkListPresenter @Inject constructor( + private val app: App, + private val eventDao: EventDao +) : BasePresenter() { fun onAttachView(view: HomeworkListView, homeworkDate: Int?) { super.onAttachView(view) @@ -28,8 +33,7 @@ class HomeworkListPresenter : BasePresenter() { } view?.run { - app.db.eventDao() - .getAllByType(App.profileId, Event.TYPE_HOMEWORK, filter) + eventDao.getAllByType(App.profileId, Event.TYPE_HOMEWORK, filter) .observe({ viewLifecycle }, { homeworkList -> if (app.profile == null) return@observe diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/list/HomeworkListView.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/list/HomeworkListView.kt index 86dbac31..0afe6b0c 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/list/HomeworkListView.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/homework/list/HomeworkListView.kt @@ -5,14 +5,11 @@ package pl.szczodrzynski.edziennik.ui.modules.homework.list import androidx.lifecycle.Lifecycle -import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.data.db.modules.events.EventFull import pl.szczodrzynski.edziennik.ui.base.BaseView interface HomeworkListView : BaseView { - var app: App - val viewLifecycle: Lifecycle fun initView() diff --git a/build.gradle b/build.gradle index 4c67499d..707331ac 100644 --- a/build.gradle +++ b/build.gradle @@ -47,7 +47,8 @@ buildscript { navlib : "e4ad01dc87", - gifdrawable : "1.2.15" + gifdrawable : "1.2.15", + dagger : "2.24" ] }