Skip to content

Commit

Permalink
Fix oppia#1106: Addition of Work Manager for uploading logs (oppia#1680)
Browse files Browse the repository at this point in the history
* work manager start.

* constraints + lint fixes.

* work manager module + injection + onStart setup.

* lint fixes.

* approach change.

* fixes.

* app-module test fix.

* inprogress

* inprogress

* tests in progress.

* Worker Injection setup.

* worker factory setup.

* worker tests.

* merging of request and worker class.

* work request invocation on app creation setup.

* tests.

* app-module tests fix.

* lint fix.

* comments.

* bazel building.

* fixes.

* fixes.

* bazel.

* lint fix.

* more lint fix.

* app module test + config impl change.

* lint fix.

* more lint fix.

* nits.

* Coroutine worker | no map.

* changes.

* work manager impl correction.

* testing for initialiser.

* Test fixes.

* lint fixes.

* changes.

* lint fixes.

* dependency changes.

* lint fixes.

* lint.

* minor.

* change 1.

* child factory removal.

* lint fix.

* Add test applications to all tests which now rely on WorkManager to NOT
be initialized (these tests shouldn't use OppiaApplication anymore).
Includes some fixes for various tests that may have had
flakiness/syncing issues before, and removed one test activity that
wasn't actually used. One test was also ignored because it isn't testing
the correct thing and it fails when the correct assertion is added, so
follow-up work is needed.

* comment addition.

Co-authored-by: Ben Henning <[email protected]>
  • Loading branch information
Sarthak2601 and BenHenning committed Sep 4, 2020
1 parent fc25224 commit 2d14066
Show file tree
Hide file tree
Showing 54 changed files with 2,044 additions and 438 deletions.
1 change: 1 addition & 0 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ maven_install(
"androidx.test.ext:junit:1.1.1",
"androidx.test:runner:1.2.0",
"androidx.viewpager:viewpager:1.0.0",
"androidx.work:work-runtime-ktx:2.4.0",
"com.android.support:support-annotations:28.0.0",
"com.caverock:androidsvg-aar:1.4",
"com.chaos.view:pinview:1.4.3",
Expand Down
1 change: 1 addition & 0 deletions app/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -578,6 +578,7 @@ kt_android_library(
artifact("androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"),
artifact("androidx.multidex:multidex:2.0.1"),
artifact("androidx.viewpager:viewpager:1.0.0"),
artifact("androidx.work:work-runtime-ktx:2.4.0"),
artifact("com.caverock:androidsvg-aar"),
artifact("javax.annotation:javax.annotation-api:jar"),
],
Expand Down
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ dependencies {
'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-alpha03',
'androidx.multidex:multidex:2.0.1',
'androidx.recyclerview:recyclerview:1.0.0',
'androidx.work:work-runtime-ktx:2.4.0',
'com.chaos.view:pinview:1.4.3',
'com.github.bumptech.glide:glide:4.11.0',
'com.google.android.material:material:1.2.0-alpha02',
Expand Down
9 changes: 6 additions & 3 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http:https://schemas.android.com/apk/res/android"
xmlns:tools="http:https://schemas.android.com/tools"
package="org.oppia.app">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
Expand Down Expand Up @@ -137,9 +138,6 @@
<activity
android:name=".testing.ProfileChooserFragmentTestActivity"
android:theme="@style/OppiaThemeWithoutActionBar" />
<activity
android:name=".testing.StoryFragmentTestActivity"
android:theme="@style/OppiaThemeWithoutActionBar" />
<activity
android:name=".testing.TopicTestActivity"
android:theme="@style/OppiaThemeWithoutActionBar" />
Expand All @@ -159,5 +157,10 @@
<activity
android:name=".walkthrough.WalkthroughActivity"
android:theme="@style/OppiaThemeWithoutActionBar" />
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
android:exported="false"
tools:node="remove"/>
</application>
</manifest>
2 changes: 0 additions & 2 deletions app/src/main/java/org/oppia/app/activity/ActivityComponent.kt
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ import org.oppia.app.testing.HtmlParserTestActivity
import org.oppia.app.testing.ImageRegionSelectionTestActivity
import org.oppia.app.testing.NavigationDrawerTestActivity
import org.oppia.app.testing.ProfileChooserFragmentTestActivity
import org.oppia.app.testing.StoryFragmentTestActivity
import org.oppia.app.testing.TestFontScaleConfigurationUtilActivity
import org.oppia.app.testing.TopicRevisionTestActivity
import org.oppia.app.testing.TopicTestActivity
Expand Down Expand Up @@ -120,6 +119,5 @@ interface ActivityComponent {
fun inject(topicRevisionTestActivity: TopicRevisionTestActivity)
fun inject(topicTestActivity: TopicTestActivity)
fun inject(topicTestActivityForStory: TopicTestActivityForStory)
fun inject(storyFragmentTestActivity: StoryFragmentTestActivity)
fun inject(walkthroughActivity: WalkthroughActivity)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package org.oppia.app.application

// TODO(#1675): Add NetworkModule once data module is migrated off of Moshi.
import android.app.Application
import androidx.work.Configuration
import dagger.BindsInstance
import dagger.Component
import org.oppia.app.activity.ActivityComponent
Expand All @@ -23,12 +24,15 @@ import org.oppia.domain.onboarding.ExpirationMetaDataRetrieverModule
import org.oppia.domain.oppialogger.ApplicationStartupListener
import org.oppia.domain.oppialogger.LogStorageModule
import org.oppia.domain.oppialogger.exceptions.UncaughtExceptionLoggerModule
import org.oppia.domain.oppialogger.loguploader.LogUploadWorkerModule
import org.oppia.domain.oppialogger.loguploader.WorkManagerConfigurationModule
import org.oppia.domain.question.QuestionModule
import org.oppia.domain.topic.PrimeTopicAssetsControllerModule
import org.oppia.util.accessibility.AccessibilityModule
import org.oppia.util.caching.CachingModule
import org.oppia.util.gcsresource.GcsResourceModule
import org.oppia.util.logging.LoggerModule
import org.oppia.util.logging.firebase.FirebaseLogUploaderModule
import org.oppia.util.logging.firebase.LogReportingModule
import org.oppia.util.parser.GlideImageLoaderModule
import org.oppia.util.parser.HtmlParserEntityTypeModule
Expand Down Expand Up @@ -59,7 +63,8 @@ import javax.inject.Singleton
ViewBindingShimModule::class, PrimeTopicAssetsControllerModule::class,
ExpirationMetaDataRetrieverModule::class, RatioInputModule::class,
UncaughtExceptionLoggerModule::class, ApplicationStartupListenerModule::class,
HintsAndSolutionConfigModule::class
LogUploadWorkerModule::class, WorkManagerConfigurationModule::class,
HintsAndSolutionConfigModule::class, FirebaseLogUploaderModule::class
]
)

Expand All @@ -74,4 +79,6 @@ interface ApplicationComponent : ApplicationInjector {
fun getActivityComponentBuilderProvider(): Provider<ActivityComponent.Builder>

fun getApplicationStartupListeners(): Set<ApplicationStartupListener>

fun getWorkManagerConfiguration(): Configuration
}
10 changes: 9 additions & 1 deletion app/src/main/java/org/oppia/app/application/OppiaApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package org.oppia.app.application
import android.app.Application
import androidx.appcompat.app.AppCompatActivity
import androidx.multidex.MultiDexApplication
import androidx.work.Configuration
import androidx.work.WorkManager
import com.google.firebase.FirebaseApp
import org.oppia.app.activity.ActivityComponent
import org.oppia.domain.oppialogger.ApplicationStartupListener
Expand All @@ -11,7 +13,8 @@ import org.oppia.domain.oppialogger.ApplicationStartupListener
class OppiaApplication :
MultiDexApplication(),
ActivityComponentFactory,
ApplicationInjectorProvider {
ApplicationInjectorProvider,
Configuration.Provider {
/** The root [ApplicationComponent]. */
private val component: ApplicationComponent by lazy {
DaggerApplicationComponent.builder()
Expand All @@ -28,6 +31,11 @@ class OppiaApplication :
override fun onCreate() {
super.onCreate()
FirebaseApp.initializeApp(applicationContext)
WorkManager.initialize(applicationContext, workManagerConfiguration)
component.getApplicationStartupListeners().forEach(ApplicationStartupListener::onCreate)
}

override fun getWorkManagerConfiguration(): Configuration {
return component.getWorkManagerConfiguration()
}
}

This file was deleted.

This file was deleted.

7 changes: 0 additions & 7 deletions app/src/main/res/layout/story_fragment_test_activity.xml

This file was deleted.

98 changes: 98 additions & 0 deletions app/src/sharedTest/java/org/oppia/app/faq/FAQListFragmentTest.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package org.oppia.app.faq

import android.app.Application
import android.content.Context
import android.content.res.Resources
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.RecyclerView
import androidx.test.core.app.ActivityScenario.launch
import androidx.test.core.app.ApplicationProvider
Expand All @@ -17,31 +19,78 @@ import androidx.test.espresso.matcher.ViewMatchers.isRoot
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.ext.junit.runners.AndroidJUnit4
import dagger.Component
import org.hamcrest.Matchers.allOf
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.oppia.app.R
import org.oppia.app.activity.ActivityComponent
import org.oppia.app.application.ActivityComponentFactory
import org.oppia.app.application.ApplicationComponent
import org.oppia.app.application.ApplicationInjector
import org.oppia.app.application.ApplicationInjectorProvider
import org.oppia.app.application.ApplicationModule
import org.oppia.app.application.ApplicationStartupListenerModule
import org.oppia.app.help.faq.FAQListActivity
import org.oppia.app.help.faq.faqsingle.FAQSingleActivity
import org.oppia.app.player.state.hintsandsolution.HintsAndSolutionConfigModule
import org.oppia.app.recyclerview.RecyclerViewMatcher.Companion.atPosition
import org.oppia.app.recyclerview.RecyclerViewMatcher.Companion.atPositionOnView
import org.oppia.app.shim.ViewBindingShimModule
import org.oppia.app.utility.OrientationChangeAction.Companion.orientationLandscape
import org.oppia.domain.classify.InteractionsModule
import org.oppia.domain.classify.rules.continueinteraction.ContinueModule
import org.oppia.domain.classify.rules.dragAndDropSortInput.DragDropSortInputModule
import org.oppia.domain.classify.rules.fractioninput.FractionInputModule
import org.oppia.domain.classify.rules.imageClickInput.ImageClickInputModule
import org.oppia.domain.classify.rules.itemselectioninput.ItemSelectionInputModule
import org.oppia.domain.classify.rules.multiplechoiceinput.MultipleChoiceInputModule
import org.oppia.domain.classify.rules.numberwithunits.NumberWithUnitsRuleModule
import org.oppia.domain.classify.rules.numericinput.NumericInputRuleModule
import org.oppia.domain.classify.rules.ratioinput.RatioInputModule
import org.oppia.domain.classify.rules.textinput.TextInputRuleModule
import org.oppia.domain.onboarding.ExpirationMetaDataRetrieverModule
import org.oppia.domain.oppialogger.LogStorageModule
import org.oppia.domain.oppialogger.loguploader.LogUploadWorkerModule
import org.oppia.domain.oppialogger.loguploader.WorkManagerConfigurationModule
import org.oppia.domain.question.QuestionModule
import org.oppia.domain.topic.PrimeTopicAssetsControllerModule
import org.oppia.testing.TestAccessibilityModule
import org.oppia.testing.TestCoroutineDispatchers
import org.oppia.testing.TestDispatcherModule
import org.oppia.testing.TestLogReportingModule
import org.oppia.util.caching.testing.CachingTestModule
import org.oppia.util.gcsresource.GcsResourceModule
import org.oppia.util.logging.LoggerModule
import org.oppia.util.logging.firebase.FirebaseLogUploaderModule
import org.oppia.util.parser.GlideImageLoaderModule
import org.oppia.util.parser.HtmlParserEntityTypeModule
import org.oppia.util.parser.ImageParsingModule
import org.robolectric.annotation.Config
import org.robolectric.annotation.LooperMode
import javax.inject.Inject
import javax.inject.Singleton

/** Tests for [FAQListFragment]. */
@RunWith(AndroidJUnit4::class)
@LooperMode(LooperMode.Mode.PAUSED)
@Config(application = FAQListFragmentTest.TestApplication::class, qualifiers = "port-xxhdpi")
class FAQListFragmentTest {
@Inject
lateinit var testCoroutineDispatchers: TestCoroutineDispatchers

@Before
fun setUp() {
Intents.init()
setUpTestApplicationComponent()
testCoroutineDispatchers.registerIdlingResource()
}

@After
fun tearDown() {
testCoroutineDispatchers.unregisterIdlingResource()
Intents.release()
}

Expand Down Expand Up @@ -100,7 +149,56 @@ class FAQListFragmentTest {
}
}

private fun setUpTestApplicationComponent() {
ApplicationProvider.getApplicationContext<TestApplication>().inject(this)
}

private fun getResources(): Resources {
return ApplicationProvider.getApplicationContext<Context>().resources
}

// TODO(#59): Figure out a way to reuse modules instead of needing to re-declare them.
// TODO(#1675): Add NetworkModule once data module is migrated off of Moshi.
@Singleton
@Component(
modules = [
TestDispatcherModule::class, ApplicationModule::class,
LoggerModule::class, ContinueModule::class, FractionInputModule::class,
ItemSelectionInputModule::class, MultipleChoiceInputModule::class,
NumberWithUnitsRuleModule::class, NumericInputRuleModule::class, TextInputRuleModule::class,
DragDropSortInputModule::class, ImageClickInputModule::class, InteractionsModule::class,
GcsResourceModule::class, GlideImageLoaderModule::class, ImageParsingModule::class,
HtmlParserEntityTypeModule::class, QuestionModule::class, TestLogReportingModule::class,
TestAccessibilityModule::class, LogStorageModule::class, CachingTestModule::class,
PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class,
ViewBindingShimModule::class, RatioInputModule::class,
ApplicationStartupListenerModule::class, LogUploadWorkerModule::class,
WorkManagerConfigurationModule::class, HintsAndSolutionConfigModule::class,
FirebaseLogUploaderModule::class
]
)
interface TestApplicationComponent : ApplicationComponent, ApplicationInjector {
@Component.Builder
interface Builder : ApplicationComponent.Builder

fun inject(faqListFragmentTest: FAQListFragmentTest)
}

class TestApplication : Application(), ActivityComponentFactory, ApplicationInjectorProvider {
private val component: TestApplicationComponent by lazy {
DaggerFAQListFragmentTest_TestApplicationComponent.builder()
.setApplication(this)
.build() as TestApplicationComponent
}

fun inject(faqListFragmentTest: FAQListFragmentTest) {
component.inject(faqListFragmentTest)
}

override fun createActivityComponent(activity: AppCompatActivity): ActivityComponent {
return component.getActivityComponentBuilderProvider().get().setActivity(activity).build()
}

override fun getApplicationInjector(): ApplicationInjector = component
}
}
Loading

0 comments on commit 2d14066

Please sign in to comment.