Bug 1967821 - Adding temporary logs for distribution ID checker r=android-reviewers,rebecatudor273

Differential Revision: https://phabricator.services.mozilla.com/D250498
This commit is contained in:
John Oberhauser
2025-05-23 16:32:35 +00:00
committed by joberhauser@mozilla.com
parent 6dedde3821
commit e3a4c6903b
3 changed files with 179 additions and 13 deletions

View File

@@ -8,6 +8,7 @@ import android.content.Context
import android.content.Intent
import android.database.Cursor
import androidx.core.net.toUri
import mozilla.components.support.base.log.logger.Logger
import org.json.JSONException
import org.json.JSONObject
@@ -30,13 +31,152 @@ interface DistributionProviderChecker {
fun queryProvider(): String?
}
private val logger = Logger(DistributionProviderChecker::class.simpleName)
/**
* Default implementation for DistributionProviderChecker
*
* @param context application context used to get the packageManager and contentResolver
*/
class DefaultDistributionProviderChecker(private val context: Context) : DistributionProviderChecker {
override fun queryProvider(): String? {
logger.info("1 - Starting check...")
val adjustProviderIntent = Intent(ADJUST_CONTENT_PROVIDER_INTENT_ACTION)
val contentProviders = context.packageManager.queryIntentContentProviders(adjustProviderIntent, 0)
val contentResolver = context.contentResolver
for (resolveInfo in contentProviders) {
val authority = resolveInfo.providerInfo.authority
val uri = "content://$authority/trackers".toUri()
if (!authority.contains("google")) {
logger.info("1 - Authority found: $authority")
}
val projection = arrayOf(PACKAGE_NAME_COLUMN, ENCRYPTED_DATA_COLUMN)
val contentResolverCursor = contentResolver.query(
uri,
projection,
null,
null,
null,
)
contentResolverCursor?.use { cursor ->
cursor.getProvider()?.let { return it }
}
}
return null
}
private fun Cursor.getProvider(): String? {
logger.info("1 - Cursor available")
while (moveToNext()) {
logger.info("1 - Checking next cursor...")
val packageNameColumnIndex = getColumnIndex(PACKAGE_NAME_COLUMN)
val dataColumnIndex = getColumnIndex(ENCRYPTED_DATA_COLUMN)
// Check if columns exist
if (packageNameColumnIndex == -1 || dataColumnIndex == -1) {
logger.info("1 - missing columns, packageName: $packageNameColumnIndex; data: $dataColumnIndex")
break
}
logger.info("1 - packageName: ${getString(packageNameColumnIndex)}")
val packageName = getString(packageNameColumnIndex) ?: break
if (packageName == FIREFOX_PACKAGE_NAME ||
packageName == FIREFOX_BETA_PACKAGE_NAME ||
packageName == FIREFOX_NIGHTLY_PACKAGE_NAME
) {
logger.info("1 - data: ${getString(dataColumnIndex)}")
val data = getString(dataColumnIndex) ?: break
try {
val jsonObject = JSONObject(data)
val provider = jsonObject.getString("provider")
logger.info("1 - provider found: $provider")
return provider
} catch (e: JSONException) {
logger.info("1 - JSON expection: $e")
break
}
}
}
return null
}
}
/**
* Second implementation for DistributionProviderChecker
*
* @param context application context used to get the packageManager and contentResolver
*/
class SecondaryDistributionProviderChecker(private val context: Context) : DistributionProviderChecker {
override fun queryProvider(): String? {
logger.info("2 - Starting check...")
val adjustProviderIntent = Intent(ADJUST_CONTENT_PROVIDER_INTENT_ACTION)
val contentProviders = context.packageManager.queryIntentContentProviders(adjustProviderIntent, 0)
val contentResolver = context.contentResolver
for (resolveInfo in contentProviders) {
val authority = resolveInfo.providerInfo.authority
val uri = "content://$authority/trackers".toUri()
val projection = arrayOf(ENCRYPTED_DATA_COLUMN)
val contentResolverCursor = contentResolver.query(
uri,
projection,
"package_name=?",
arrayOf(context.packageName),
null,
)
contentResolverCursor?.use { cursor ->
cursor.getProvider()?.let { return it }
}
}
return null
}
private fun Cursor.getProvider(): String? {
logger.info("2 - Cursor available")
while (moveToNext()) {
val dataColumnIndex = getColumnIndex(ENCRYPTED_DATA_COLUMN)
// Check if columns exist
if (dataColumnIndex == -1) {
break
}
val data = getString(dataColumnIndex) ?: break
try {
val jsonObject = JSONObject(data)
val provider = jsonObject.getString("provider")
logger.info("2 - Provider found: $provider")
return provider
} catch (e: JSONException) {
logger.info("2 - JSON expection: $e")
break
}
}
return null
}
}
/**
* Third implementation for DistributionProviderChecker
*
* @param context application context used to get the packageManager and contentResolver
*/
class ThirdDistributionProviderChecker(private val context: Context) : DistributionProviderChecker {
override fun queryProvider(): String? {
logger.info("3 - Starting check...")
val adjustProviderIntent = Intent(ADJUST_CONTENT_PROVIDER_INTENT_ACTION)
val contentProviders = context.packageManager.queryIntentContentProviders(adjustProviderIntent, 0)
val contentResolver = context.contentResolver
@@ -64,29 +204,34 @@ class DefaultDistributionProviderChecker(private val context: Context) : Distrib
}
private fun Cursor.getProvider(): String? {
logger.info("3 - Cursor available")
while (moveToNext()) {
val packageNameColumnIndex = getColumnIndex(PACKAGE_NAME_COLUMN)
val dataColumnIndex = getColumnIndex(ENCRYPTED_DATA_COLUMN)
// Check if columns exist
if (packageNameColumnIndex == -1 || dataColumnIndex == -1) {
if (dataColumnIndex == -1) {
break
}
val packageName = getString(packageNameColumnIndex) ?: break
val data = getString(dataColumnIndex) ?: break
try {
val jsonObject = JSONObject(data)
val provider = jsonObject.getString("provider")
if (packageName == FIREFOX_PACKAGE_NAME ||
packageName == FIREFOX_BETA_PACKAGE_NAME ||
packageName == FIREFOX_NIGHTLY_PACKAGE_NAME
) {
val data = getString(dataColumnIndex) ?: break
try {
val jsonObject = JSONObject(data)
val provider = jsonObject.getString("provider")
logger.info("3 - data: $data")
val packageNameColumnIndex = getColumnIndex(PACKAGE_NAME_COLUMN)
if (packageNameColumnIndex == -1) {
logger.info("3 - no package name column")
return provider
} catch (e: JSONException) {
break
}
logger.info("3 - package name: ${getString(packageNameColumnIndex)}")
return provider
} catch (e: JSONException) {
logger.info("3 - JSON exception: $e")
break
}
}
return null

View File

@@ -10,6 +10,7 @@ import android.view.View
import android.view.ViewGroup
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@@ -17,6 +18,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.fragment.app.Fragment
@@ -24,6 +26,9 @@ import mozilla.components.browser.state.search.RegionState
import mozilla.components.lib.state.ext.observeAsState
import org.mozilla.fenix.R
import org.mozilla.fenix.components.components
import org.mozilla.fenix.distributions.DefaultDistributionProviderChecker
import org.mozilla.fenix.distributions.SecondaryDistributionProviderChecker
import org.mozilla.fenix.distributions.ThirdDistributionProviderChecker
import org.mozilla.fenix.ext.showToolbar
import org.mozilla.fenix.theme.FirefoxTheme
@@ -139,5 +144,20 @@ private fun DebugInfo(
color = FirefoxTheme.colors.textPrimary,
modifier = Modifier.padding(4.dp),
)
val context = LocalContext.current
Button(
onClick = {
SecondaryDistributionProviderChecker(context).queryProvider()
ThirdDistributionProviderChecker(context).queryProvider()
DefaultDistributionProviderChecker(context).queryProvider()
},
) {
Text(
text = stringResource(R.string.debug_info_run_query_provider_test),
color = FirefoxTheme.colors.textOnColorPrimary,
)
}
}
}

View File

@@ -127,6 +127,7 @@
<string name="debug_info_region_current" translatable="false">Current region</string>
<string name="debug_info_distribution_id" translatable="false">Distribution ID</string>
<string name="debug_info_play_referrer" translatable="false">Play install referrer</string>
<string name="debug_info_run_query_provider_test" translatable="false">Run query provider test</string>
<!-- Profiler settings -->
<string name="preferences_start_profiler">Start Profiler</string>