-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Integrate Chucker for network troubleshooting #22381
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: trunk
Are you sure you want to change the base?
Changes from 15 commits
08dad53
3b1973c
f666fd7
d13bbce
4f2f330
a8ab423
4db23a1
d47c0a2
f26609c
82c062c
43d181b
74c9397
8e01862
e6de212
5801102
333d16b
b9cc5f7
6505f42
f20cacc
dc1e76f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,56 @@ | ||
| package org.wordpress.android.modules | ||
|
|
||
| import android.content.Context | ||
| import dagger.Module | ||
|
Check warning on line 4 in WordPress/src/main/java/org/wordpress/android/modules/TrackNetworkRequestsModule.kt
|
||
| import dagger.Provides | ||
| import dagger.hilt.InstallIn | ||
| import dagger.hilt.android.qualifiers.ApplicationContext | ||
| import dagger.hilt.components.SingletonComponent | ||
| import dagger.multibindings.IntoSet | ||
| import okhttp3.Interceptor | ||
| import org.wordpress.android.fluxc.module.OkHttpClientQualifiers | ||
| import org.wordpress.android.fluxc.network.NetworkRequestsRetentionPeriod | ||
| import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor | ||
| import org.wordpress.android.fluxc.network.TrackNetworkRequestsPreference | ||
| import org.wordpress.android.ui.posts.editor.GutenbergKitNetworkLogger | ||
| import org.wordpress.android.ui.prefs.AppPrefsWrapper | ||
| import javax.inject.Named | ||
| import javax.inject.Singleton | ||
|
|
||
| @InstallIn(SingletonComponent::class) | ||
| @Module | ||
| class TrackNetworkRequestsModule { | ||
| @Singleton | ||
| @Provides | ||
| fun provideTrackNetworkRequestsPreference(appPrefsWrapper: AppPrefsWrapper): TrackNetworkRequestsPreference { | ||
| return object : TrackNetworkRequestsPreference { | ||
| override fun isEnabled(): Boolean = appPrefsWrapper.isTrackNetworkRequestsEnabled | ||
| override fun getRetentionPeriod(): NetworkRequestsRetentionPeriod = | ||
| NetworkRequestsRetentionPeriod.fromInt(appPrefsWrapper.trackNetworkRequestsRetentionPeriod) | ||
| } | ||
| } | ||
|
|
||
| @Singleton | ||
| @Provides | ||
| fun provideTrackNetworkRequestsInterceptor( | ||
| @ApplicationContext context: Context, | ||
| preference: TrackNetworkRequestsPreference | ||
| ): TrackNetworkRequestsInterceptor { | ||
| return TrackNetworkRequestsInterceptor(context, preference) | ||
| } | ||
|
|
||
| @Provides | ||
| @IntoSet | ||
| @Named(OkHttpClientQualifiers.INTERCEPTORS) | ||
| fun provideTrackNetworkRequestsInterceptorAsInterceptor( | ||
| interceptor: TrackNetworkRequestsInterceptor | ||
| ): Interceptor = interceptor | ||
|
|
||
| @Singleton | ||
| @Provides | ||
| fun provideGutenbergKitNetworkLogger( | ||
| interceptor: TrackNetworkRequestsInterceptor | ||
| ): GutenbergKitNetworkLogger { | ||
| return GutenbergKitNetworkLogger(interceptor) | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -4,7 +4,9 @@ | |
| import android.content.Intent | ||
| import android.os.Build | ||
| import android.os.Bundle | ||
| import android.widget.TextView | ||
| import androidx.activity.viewModels | ||
| import androidx.appcompat.app.AlertDialog | ||
| import androidx.appcompat.app.AppCompatActivity | ||
| import androidx.compose.runtime.collectAsState | ||
| import androidx.compose.runtime.getValue | ||
|
|
@@ -14,11 +16,14 @@ | |
| import androidx.lifecycle.Lifecycle | ||
| import androidx.lifecycle.lifecycleScope | ||
| import androidx.lifecycle.repeatOnLifecycle | ||
| import com.chuckerteam.chucker.api.Chucker | ||
| import dagger.hilt.android.AndroidEntryPoint | ||
| import kotlinx.coroutines.launch | ||
| import org.wordpress.android.BuildConfig | ||
| import org.wordpress.android.R | ||
| import org.wordpress.android.analytics.AnalyticsTracker | ||
| import org.wordpress.android.analytics.AnalyticsTracker.Stat | ||
| import org.wordpress.android.fluxc.network.NetworkRequestsRetentionPeriod | ||
| import org.wordpress.android.WordPress | ||
| import org.wordpress.android.support.aibot.ui.AIBotSupportActivity | ||
| import org.wordpress.android.support.logs.ui.LogsActivity | ||
|
|
@@ -36,6 +41,7 @@ | |
| super.onCreate(savedInstanceState) | ||
| viewModel.init() | ||
| observeNavigationEvents() | ||
| observeDialogEvents() | ||
| composeView = ComposeView(this) | ||
| setContentView( | ||
| composeView.apply { | ||
|
|
@@ -47,6 +53,7 @@ | |
| val userInfo by viewModel.userInfo.collectAsState() | ||
| val optionsVisibility by viewModel.optionsVisibility.collectAsState() | ||
| val isLoggedIn by viewModel.isLoggedIn.collectAsState() | ||
| val networkTrackingState by viewModel.networkTrackingState.collectAsState() | ||
| AppThemeM3 { | ||
| SupportScreen( | ||
| userName = userInfo.userName, | ||
|
|
@@ -55,20 +62,45 @@ | |
| isLoggedIn = isLoggedIn, | ||
| showAskTheBots = optionsVisibility.showAskTheBots, | ||
| showAskHappinessEngineers = optionsVisibility.showAskHappinessEngineers, | ||
| showNetworkDebugging = networkTrackingState.showNetworkDebugging, | ||
| isNetworkTrackingEnabled = networkTrackingState.isTrackingEnabled, | ||
| networkTrackingRetentionInfo = getRetentionInfoText( | ||
| networkTrackingState.retentionPeriod | ||
| ), | ||
| versionName = WordPress.versionName, | ||
| onBackClick = { finish() }, | ||
| onLoginClick = { viewModel.onLoginClick() }, | ||
| onHelpCenterClick = { viewModel.onHelpCenterClick() }, | ||
| onAskTheBotsClick = { viewModel.onAskTheBotsClick() }, | ||
| onAskHappinessEngineersClick = { viewModel.onAskHappinessEngineersClick() }, | ||
| onApplicationLogsClick = { viewModel.onApplicationLogsClick() } | ||
| onApplicationLogsClick = { viewModel.onApplicationLogsClick() }, | ||
| onNetworkTrackingToggle = { viewModel.onNetworkTrackingToggle(it) }, | ||
| onViewNetworkRequestsClick = { viewModel.onViewNetworkRequestsClick() }, | ||
| ) | ||
| } | ||
| } | ||
| } | ||
| ) | ||
| } | ||
|
|
||
| private fun getRetentionInfoText(period: NetworkRequestsRetentionPeriod): String { | ||
| val periodString = getRetentionPeriodDisplayString(period) | ||
| return getString(R.string.network_requests_retention_info, periodString) | ||
| } | ||
|
|
||
| private fun getRetentionPeriodDisplayString(period: NetworkRequestsRetentionPeriod): String { | ||
| return when (period) { | ||
| NetworkRequestsRetentionPeriod.ONE_HOUR -> | ||
| getString(R.string.network_requests_retention_one_hour) | ||
| NetworkRequestsRetentionPeriod.ONE_DAY -> | ||
| getString(R.string.network_requests_retention_one_day) | ||
| NetworkRequestsRetentionPeriod.ONE_WEEK -> | ||
| getString(R.string.network_requests_retention_one_week) | ||
| NetworkRequestsRetentionPeriod.FOREVER -> | ||
| getString(R.string.network_requests_retention_until_cleared) | ||
| } | ||
| } | ||
oguzkocer marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| private fun observeNavigationEvents() { | ||
| lifecycleScope.launch { | ||
| repeatOnLifecycle(Lifecycle.State.STARTED) { | ||
|
|
@@ -81,12 +113,69 @@ | |
| is SupportViewModel.NavigationEvent.NavigateToAskHappinessEngineers -> { | ||
| navigateToAskTheHappinessEngineers() | ||
| } | ||
| is SupportViewModel.NavigationEvent.NavigateToNetworkRequests -> { | ||
| navigateToNetworkRequests() | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
|
|
||
| private fun observeDialogEvents() { | ||
| lifecycleScope.launch { | ||
| repeatOnLifecycle(Lifecycle.State.STARTED) { | ||
| viewModel.dialogEvents.collect { event -> | ||
| when (event) { | ||
| is SupportViewModel.DialogEvent.ShowEnableTrackingDialog -> { | ||
| showEnableTrackingDialog(event.currentPeriod) | ||
| } | ||
| is SupportViewModel.DialogEvent.ShowDisableTrackingDialog -> { | ||
| showDisableTrackingDialog() | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
|
|
||
| private fun showEnableTrackingDialog(currentPeriod: NetworkRequestsRetentionPeriod) { | ||
| val periods = NetworkRequestsRetentionPeriod.entries.toTypedArray() | ||
| val displayNames = periods.map { getRetentionPeriodDisplayString(it) }.toTypedArray() | ||
| var selectedIndex = periods.indexOf(currentPeriod) | ||
|
|
||
| val titleView = layoutInflater.inflate(R.layout.dialog_title_with_message, null).apply { | ||
oguzkocer marked this conversation as resolved.
Fixed
Show fixed
Hide fixed
|
||
| findViewById<TextView>(R.id.dialog_title).setText(R.string.track_network_requests) | ||
| findViewById<TextView>(R.id.dialog_message) | ||
| .setText(R.string.network_requests_enable_dialog_description) | ||
| } | ||
|
|
||
| AlertDialog.Builder(this) | ||
| .setCustomTitle(titleView) | ||
| .setSingleChoiceItems(displayNames, selectedIndex) { _, which -> | ||
| selectedIndex = which | ||
| } | ||
| .setPositiveButton(R.string.network_requests_enable) { _, _ -> | ||
| val selectedPeriod = periods[selectedIndex] | ||
| viewModel.onEnableTrackingConfirmed(selectedPeriod) | ||
| } | ||
| // No action needed on cancel - UI state is driven by ViewModel | ||
| .setNegativeButton(R.string.cancel, null) | ||
| .show() | ||
| } | ||
|
|
||
| private fun showDisableTrackingDialog() { | ||
| AlertDialog.Builder(this) | ||
| .setTitle(R.string.network_requests_disable_tracking_title) | ||
| .setMessage(R.string.network_requests_disable_tracking_description) | ||
| .setPositiveButton(R.string.network_requests_disable) { _, _ -> | ||
| viewModel.onDisableTrackingConfirmed() | ||
| } | ||
| // No action needed on cancel - UI state is driven by ViewModel | ||
| .setNegativeButton(R.string.cancel, null) | ||
| .show() | ||
| } | ||
|
|
||
| private fun navigateToAskTheBots() { | ||
| startActivity( | ||
| AIBotSupportActivity.Companion.createIntent(this) | ||
|
|
@@ -120,6 +209,10 @@ | |
| startActivity(LogsActivity.createIntent(this)) | ||
| } | ||
|
|
||
| private fun navigateToNetworkRequests() { | ||
| startActivity(Chucker.getLaunchIntent(this)) | ||
| } | ||
|
|
||
| companion object { | ||
| @JvmStatic | ||
| fun createIntent(context: Context): Intent = Intent(context, SupportActivity::class.java) | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.