Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions sentry-android-core/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,6 @@
##---------------End: proguard configuration for sentry-android-replay ----------

##---------------Begin: proguard configuration for sentry-android-distribution ----------
-dontwarn io.sentry.android.distribution.internal.DistributionIntegration
-keepnames class io.sentry.android.distribution.internal.DistributionIntegration
-dontwarn io.sentry.android.distribution.DistributionIntegration
-keepnames class io.sentry.android.distribution.DistributionIntegration
##---------------End: proguard configuration for sentry-android-distribution ----------
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
import io.sentry.android.core.internal.util.AndroidThreadChecker;
import io.sentry.android.core.internal.util.SentryFrameMetricsCollector;
import io.sentry.android.core.performance.AppStartMetrics;
import io.sentry.android.distribution.internal.DistributionIntegration;
import io.sentry.android.distribution.DistributionIntegration;
import io.sentry.android.fragment.FragmentLifecycleIntegration;
import io.sentry.android.replay.DefaultReplayBreadcrumbConverter;
import io.sentry.android.replay.ReplayIntegration;
Expand Down Expand Up @@ -394,7 +394,9 @@ static void installDefaultIntegrations(
options.setReplayController(replay);
}
if (isDistributionAvailable) {
options.addIntegration(new DistributionIntegration());
final DistributionIntegration distribution = new DistributionIntegration((context));
options.setDistributionController(distribution);
options.addIntegration(distribution);
}
options
.getFeedbackOptions()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public final class SentryAndroid {
"io.sentry.android.replay.ReplayIntegration";

static final String SENTRY_DISTRIBUTION_INTEGRATION_CLASS_NAME =
"io.sentry.android.distribution.internal.DistributionIntegration";
"io.sentry.android.distribution.DistributionIntegration";

private static final String TIMBER_CLASS_NAME = "timber.log.Timber";
private static final String FRAGMENT_CLASS_NAME =
Expand Down
81 changes: 5 additions & 76 deletions sentry-android-distribution/api/sentry-android-distribution.api
Original file line number Diff line number Diff line change
@@ -1,79 +1,8 @@
public final class io/sentry/android/distribution/Distribution {
public static final field INSTANCE Lio/sentry/android/distribution/Distribution;
public final fun checkForUpdate (Landroid/content/Context;Lkotlin/jvm/functions/Function1;)V
public final fun checkForUpdateBlocking (Landroid/content/Context;)Lio/sentry/android/distribution/UpdateStatus;
public final fun downloadUpdate (Landroid/content/Context;Lio/sentry/android/distribution/UpdateInfo;)V
public final fun init (Landroid/content/Context;)V
public final fun init (Landroid/content/Context;Lkotlin/jvm/functions/Function1;)V
public final fun isEnabled ()Z
}

public final class io/sentry/android/distribution/DistributionOptions {
public fun <init> ()V
public final fun getBuildConfiguration ()Ljava/lang/String;
public final fun getOrgAuthToken ()Ljava/lang/String;
public final fun getOrganizationSlug ()Ljava/lang/String;
public final fun getProjectSlug ()Ljava/lang/String;
public final fun getSentryBaseUrl ()Ljava/lang/String;
public final fun setBuildConfiguration (Ljava/lang/String;)V
public final fun setOrgAuthToken (Ljava/lang/String;)V
public final fun setOrganizationSlug (Ljava/lang/String;)V
public final fun setProjectSlug (Ljava/lang/String;)V
public final fun setSentryBaseUrl (Ljava/lang/String;)V
}

public final class io/sentry/android/distribution/UpdateInfo {
public fun <init> (Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
public final fun component1 ()Ljava/lang/String;
public final fun component2 ()Ljava/lang/String;
public final fun component3 ()I
public final fun component4 ()Ljava/lang/String;
public final fun component5 ()Ljava/lang/String;
public final fun component6 ()Ljava/lang/String;
public final fun copy (Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lio/sentry/android/distribution/UpdateInfo;
public static synthetic fun copy$default (Lio/sentry/android/distribution/UpdateInfo;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lio/sentry/android/distribution/UpdateInfo;
public fun equals (Ljava/lang/Object;)Z
public final fun getAppName ()Ljava/lang/String;
public final fun getBuildNumber ()I
public final fun getBuildVersion ()Ljava/lang/String;
public final fun getCreatedDate ()Ljava/lang/String;
public final fun getDownloadUrl ()Ljava/lang/String;
public final fun getId ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public abstract class io/sentry/android/distribution/UpdateStatus {
}

public final class io/sentry/android/distribution/UpdateStatus$Error : io/sentry/android/distribution/UpdateStatus {
public fun <init> (Ljava/lang/String;)V
public final fun component1 ()Ljava/lang/String;
public final fun copy (Ljava/lang/String;)Lio/sentry/android/distribution/UpdateStatus$Error;
public static synthetic fun copy$default (Lio/sentry/android/distribution/UpdateStatus$Error;Ljava/lang/String;ILjava/lang/Object;)Lio/sentry/android/distribution/UpdateStatus$Error;
public fun equals (Ljava/lang/Object;)Z
public final fun getMessage ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class io/sentry/android/distribution/UpdateStatus$NewRelease : io/sentry/android/distribution/UpdateStatus {
public fun <init> (Lio/sentry/android/distribution/UpdateInfo;)V
public final fun component1 ()Lio/sentry/android/distribution/UpdateInfo;
public final fun copy (Lio/sentry/android/distribution/UpdateInfo;)Lio/sentry/android/distribution/UpdateStatus$NewRelease;
public static synthetic fun copy$default (Lio/sentry/android/distribution/UpdateStatus$NewRelease;Lio/sentry/android/distribution/UpdateInfo;ILjava/lang/Object;)Lio/sentry/android/distribution/UpdateStatus$NewRelease;
public fun equals (Ljava/lang/Object;)Z
public final fun getInfo ()Lio/sentry/android/distribution/UpdateInfo;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class io/sentry/android/distribution/UpdateStatus$UpToDate : io/sentry/android/distribution/UpdateStatus {
public static final field INSTANCE Lio/sentry/android/distribution/UpdateStatus$UpToDate;
}

public final class io/sentry/android/distribution/internal/DistributionIntegration : io/sentry/Integration {
public fun <init> ()V
public final class io/sentry/android/distribution/DistributionIntegration : io/sentry/IDistributionApi, io/sentry/Integration {
public fun <init> (Landroid/content/Context;)V
public fun checkForUpdate (Lio/sentry/IDistributionApi$UpdateCallback;)V
public fun checkForUpdateBlocking ()Lio/sentry/UpdateStatus;
public fun downloadUpdate (Lio/sentry/UpdateInfo;)V
public fun register (Lio/sentry/IScopes;Lio/sentry/SentryOptions;)V
}

3 changes: 0 additions & 3 deletions sentry-android-distribution/src/main/AndroidManifest.xml

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package io.sentry.android.distribution

import android.content.Context
import android.content.Intent
import android.net.Uri
import io.sentry.IDistributionApi
import io.sentry.IScopes
import io.sentry.Integration
import io.sentry.SentryOptions
import io.sentry.UpdateInfo
import io.sentry.UpdateStatus

/**
* The public Android SDK for Sentry Build Distribution.
*
* Provides functionality to check for app updates and download new versions from Sentry's preprod
* artifacts system.
*/
public class DistributionIntegration(context: Context) : Integration, IDistributionApi {

private lateinit var scopes: IScopes
private lateinit var sentryOptions: SentryOptions
private val context: Context = context.applicationContext

/**
* Registers the Distribution integration with Sentry.
*
* @param scopes the Scopes
* @param options the options
*/
public override fun register(scopes: IScopes, options: SentryOptions) {
// Store scopes and options for use by distribution functionality
this.scopes = scopes
this.sentryOptions = options
}

/**
* Check for available updates synchronously (blocking call). This method will block the calling
* thread while making the network request. Consider using checkForUpdate with callback for
* non-blocking behavior.
*
* @return UpdateStatus indicating if an update is available, up to date, or error
*/
public override fun checkForUpdateBlocking(): UpdateStatus {
throw NotImplementedError()
}

/**
* Check for available updates asynchronously using a callback.
*
* @param onResult Callback that will be called with the UpdateStatus result
*/
public override fun checkForUpdate(onResult: IDistributionApi.UpdateCallback) {
// TODO implement this in a async way
val result = checkForUpdateBlocking()
onResult.onResult(result)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Async Update Check Fails Due to Unhandled Error

The checkForUpdate() method calls checkForUpdateBlocking(), which throws an unhandled NotImplementedError(). This causes the application to crash and prevents the onResult callback from being invoked, meaning async update checks fail with an exception instead of notifying the caller.

Fix in Cursor Fix in Web

}

/**
* Download and install the provided update by opening the download URL in the default browser or
* appropriate application.
*
* @param info Information about the update to download
*/
public override fun downloadUpdate(info: UpdateInfo) {
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(info.downloadUrl))
browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

try {
context.startActivity(browserIntent)
} catch (e: android.content.ActivityNotFoundException) {
// No application can handle the HTTP/HTTPS URL, typically no browser installed
// Silently fail as this is expected behavior in some environments
}
}
}

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Loading
Loading