Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
08dad53
Add Chucker integration research documentation
oguzkocer Nov 25, 2025
3b1973c
Add track network requests interceptor foundation for Chucker integra…
oguzkocer Nov 25, 2025
f666fd7
Integrate Chucker library into TrackNetworkRequestsInterceptor
oguzkocer Nov 25, 2025
d13bbce
Add View Network Requests button to launch Chucker UI
oguzkocer Nov 25, 2025
4f2f330
Add configurable retention period and dialog-based UX for network tra…
oguzkocer Nov 25, 2025
a8ab423
Add login request tracking and make preferences device-level
oguzkocer Nov 25, 2025
4db23a1
Add GutenbergKit network request logging to Chucker
oguzkocer Nov 26, 2025
d47c0a2
Remove debug logs from GutenbergKit network logging
oguzkocer Nov 26, 2025
f26609c
Add experimental feature flag for Network Debugging
oguzkocer Nov 26, 2025
82c062c
Fix detekt issues in Chucker integration code
oguzkocer Nov 26, 2025
43d181b
Add network debugging to new Support screen
oguzkocer Nov 26, 2025
74c9397
Integrate Chucker interceptor into wordpress-rs clients
oguzkocer Nov 27, 2025
8e01862
Update GutenbergKit to v0.11.0 and adapt to API changes
oguzkocer Dec 1, 2025
e6de212
Use OkHttpClientQualifiers.INTERCEPTORS constant for @Named annotations
oguzkocer Dec 1, 2025
5801102
Remove research documentation files
oguzkocer Dec 1, 2025
333d16b
Fix lint warnings and update tests for new constructor parameters
oguzkocer Dec 1, 2025
b9cc5f7
Refactor retention period display string into two methods Split getR…
oguzkocer Dec 2, 2025
6505f42
Migrate network tracking dialogs to Compose
oguzkocer Dec 2, 2025
f20cacc
Add tests for network tracking functionality in SupportViewModel
oguzkocer Dec 2, 2025
dc1e76f
Update GutenbergKit to v0.11.1
oguzkocer Dec 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions WordPress/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -452,6 +452,7 @@ dependencies {
implementation(libs.greenrobot.eventbus.main)
implementation(libs.greenrobot.eventbus.java)
implementation(libs.squareup.retrofit)
implementation(libs.chucker)
implementation(libs.apache.commons.text)
implementation(libs.airbnb.lottie.main)
implementation(libs.facebook.shimmer)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import android.content.SharedPreferences;
import android.hardware.SensorManager;

import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData;
import androidx.preference.PreferenceManager;

Expand Down Expand Up @@ -36,6 +37,7 @@
import org.wordpress.android.util.config.InAppUpdatesFeatureConfig;
import org.wordpress.android.util.config.RemoteConfigWrapper;
import org.wordpress.android.util.wizard.WizardManager;
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor;
import org.wordpress.android.viewmodel.helpers.ConnectionStatus;
import org.wordpress.android.viewmodel.helpers.ConnectionStatusLiveData;

Expand Down Expand Up @@ -153,7 +155,9 @@ public static RecordingStrategy provideVoiceToContentRecordingStrategy() {
}

@Provides
public static WpLoginClient provideWpLoginClient() {
return new WpLoginClient(Collections.emptyList());
public static WpLoginClient provideWpLoginClient(
@NonNull TrackNetworkRequestsInterceptor trackNetworkRequestsInterceptor
) {
return new WpLoginClient(Collections.singletonList(trackNetworkRequestsInterceptor));
}
}
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

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this unused import.

See more on https://sonarcloud.io/project/issues?id=wordpress-mobile_WordPress-Android&issues=AZrcBHr7u-mtKnwcDg0p&open=AZrcBHr7u-mtKnwcDg0p&pullRequest=22381
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
Expand Up @@ -14,15 +14,18 @@ import androidx.core.net.toUri
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.WordPress
import org.wordpress.android.analytics.AnalyticsTracker
import org.wordpress.android.analytics.AnalyticsTracker.Stat
import org.wordpress.android.WordPress
import org.wordpress.android.fluxc.network.NetworkRequestsRetentionPeriod
import org.wordpress.android.support.aibot.ui.AIBotSupportActivity
import org.wordpress.android.support.logs.ui.LogsActivity
import org.wordpress.android.support.he.ui.HESupportActivity
import org.wordpress.android.support.logs.ui.LogsActivity
import org.wordpress.android.ui.ActivityLauncher
import org.wordpress.android.ui.compose.theme.AppThemeM3

Expand All @@ -47,6 +50,8 @@ class SupportActivity : AppCompatActivity() {
val userInfo by viewModel.userInfo.collectAsState()
val optionsVisibility by viewModel.optionsVisibility.collectAsState()
val isLoggedIn by viewModel.isLoggedIn.collectAsState()
val networkTrackingState by viewModel.networkTrackingState.collectAsState()
val dialogState by viewModel.dialogState.collectAsState()
AppThemeM3 {
SupportScreen(
userName = userInfo.userName,
Expand All @@ -55,20 +60,50 @@ class SupportActivity : AppCompatActivity() {
isLoggedIn = isLoggedIn,
showAskTheBots = optionsVisibility.showAskTheBots,
showAskHappinessEngineers = optionsVisibility.showAskHappinessEngineers,
showNetworkDebugging = networkTrackingState.showNetworkDebugging,
isNetworkTrackingEnabled = networkTrackingState.isTrackingEnabled,
networkTrackingRetentionInfo = getRetentionInfoText(
networkTrackingState.retentionPeriod
),
versionName = WordPress.versionName,
dialogState = dialogState,
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() },
onRetentionPeriodSelected = { viewModel.onRetentionPeriodSelected(it) },
onEnableTrackingConfirmed = { viewModel.onEnableTrackingConfirmed(it) },
onDisableTrackingConfirmed = { viewModel.onDisableTrackingConfirmed() },
onDialogDismissed = { viewModel.onDialogDismissed() },
)
}
}
}
)
}

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 getString(getRetentionPeriodStringRes(period))
}

private fun getRetentionPeriodStringRes(period: NetworkRequestsRetentionPeriod): Int {
return when (period) {
NetworkRequestsRetentionPeriod.ONE_HOUR -> R.string.network_requests_retention_one_hour
NetworkRequestsRetentionPeriod.ONE_DAY -> R.string.network_requests_retention_one_day
NetworkRequestsRetentionPeriod.ONE_WEEK -> R.string.network_requests_retention_one_week
NetworkRequestsRetentionPeriod.FOREVER -> R.string.network_requests_retention_until_cleared
}
}

private fun observeNavigationEvents() {
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
Expand All @@ -81,6 +116,9 @@ class SupportActivity : AppCompatActivity() {
is SupportViewModel.NavigationEvent.NavigateToAskHappinessEngineers -> {
navigateToAskTheHappinessEngineers()
}
is SupportViewModel.NavigationEvent.NavigateToNetworkRequests -> {
navigateToNetworkRequests()
}
}
}
}
Expand Down Expand Up @@ -120,6 +158,10 @@ class SupportActivity : AppCompatActivity() {
startActivity(LogsActivity.createIntent(this))
}

private fun navigateToNetworkRequests() {
startActivity(Chucker.getLaunchIntent(this))
}

companion object {
@JvmStatic
fun createIntent(context: Context): Intent = Intent(context, SupportActivity::class.java)
Expand Down
Loading