Skip to content

Commit

Permalink
Merge branch '6.x.x' into feat/ui-transactions
Browse files Browse the repository at this point in the history
  • Loading branch information
romtsn authored May 13, 2022
2 parents 15e4347 + d4c250a commit 0161bd7
Show file tree
Hide file tree
Showing 22 changed files with 228 additions and 15 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@

- Allow setting SDK info (name & version) in manifest ([#2016](https://github.com/getsentry/sentry-java/pull/2016))
- Allow setting native Android SDK name during build ([#2035](https://github.com/getsentry/sentry-java/pull/2035))
- Include application permissions in Android events ([#2018](https://github.com/getsentry/sentry-java/pull/2018))
- Automatically create transactions for UI events ([#1975](https://github.com/getsentry/sentry-java/pull/1975))

### Changed

- Update sentry-native to 0.4.17 ([#2033](https://github.com/getsentry/sentry-java/pull/2033))
- Update Gradle to 7.4.2 and AGP to 7.2 ([#2042](https://github.com/getsentry/sentry-java/pull/2042))

## 6.0.0-beta.3

Expand Down
2 changes: 1 addition & 1 deletion buildSrc/src/main/java/Config.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ object Config {
val kotlinCompatibleLanguageVersion = "1.4"

object BuildPlugins {
val androidGradle = "com.android.tools.build:gradle:7.1.2"
val androidGradle = "com.android.tools.build:gradle:7.2.0"
val kotlinGradlePlugin = "gradle-plugin"
val buildConfig = "com.github.gmazzo.buildconfig"
val buildConfigVersion = "3.0.3"
Expand Down
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,19 @@ private ContextUtils() {}
*/
@Nullable
static PackageInfo getPackageInfo(final @NotNull Context context, final @NotNull ILogger logger) {
return getPackageInfo(context, 0, logger);
}

/**
* Return the Application's PackageInfo with the specified flags if possible, or null.
*
* @return the Application's PackageInfo if possible, or null
*/
@Nullable
static PackageInfo getPackageInfo(
final @NotNull Context context, final int flags, final @NotNull ILogger logger) {
try {
return context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
return context.getPackageManager().getPackageInfo(context.getPackageName(), flags);
} catch (Throwable e) {
logger.log(SentryLevel.ERROR, "Error getting package info.", e);
return null;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package io.sentry.android.core;

import static android.content.Context.ACTIVITY_SERVICE;
import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED;
import static android.os.BatteryManager.EXTRA_TEMPERATURE;

import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
Expand Down Expand Up @@ -215,7 +217,8 @@ private void setThreads(final @NotNull SentryEvent event) {
}

private void setPackageInfo(final @NotNull SentryBaseEvent event, final @NotNull App app) {
final PackageInfo packageInfo = ContextUtils.getPackageInfo(context, logger);
final PackageInfo packageInfo =
ContextUtils.getPackageInfo(context, PackageManager.GET_PERMISSIONS, logger);
if (packageInfo != null) {
String versionCode = ContextUtils.getVersionCode(packageInfo);

Expand Down Expand Up @@ -727,10 +730,33 @@ private boolean isExternalStorageMounted() {
return os;
}

@SuppressLint("NewApi") // we perform an if-check for that, but lint fails to recognize
private void setAppPackageInfo(final @NotNull App app, final @NotNull PackageInfo packageInfo) {
app.setAppIdentifier(packageInfo.packageName);
app.setAppVersion(packageInfo.versionName);
app.setAppBuild(ContextUtils.getVersionCode(packageInfo));

if (buildInfoProvider.getSdkInfoVersion() >= Build.VERSION_CODES.JELLY_BEAN) {
final Map<String, String> permissions = new HashMap<>();
final String[] requestedPermissions = packageInfo.requestedPermissions;
final int[] requestedPermissionsFlags = packageInfo.requestedPermissionsFlags;

if (requestedPermissions != null
&& requestedPermissions.length > 0
&& requestedPermissionsFlags != null
&& requestedPermissionsFlags.length > 0) {
for (int i = 0; i < requestedPermissions.length; i++) {
String permission = requestedPermissions[i];
permission = permission.substring(permission.lastIndexOf('.') + 1);

final boolean granted =
(requestedPermissionsFlags[i] & REQUESTED_PERMISSION_GRANTED)
== REQUESTED_PERMISSION_GRANTED;
permissions.put(permission, granted ? "granted" : "not_granted");
}
}
app.setPermissions(permissions);
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.sentry.android.core

import android.content.Context
import android.os.Build
import android.os.Looper
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
Expand All @@ -9,6 +10,7 @@ import com.nhaarman.mockitokotlin2.eq
import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.never
import com.nhaarman.mockitokotlin2.verify
import com.nhaarman.mockitokotlin2.whenever
import io.sentry.DiagnosticLogger
import io.sentry.ILogger
import io.sentry.SentryEvent
Expand Down Expand Up @@ -44,7 +46,8 @@ class DefaultAndroidEventProcessorTest {
private lateinit var context: Context

private val className = "io.sentry.android.core.DefaultAndroidEventProcessor"
private val ctorTypes = arrayOf(Context::class.java, ILogger::class.java, BuildInfoProvider::class.java)
private val ctorTypes =
arrayOf(Context::class.java, ILogger::class.java, BuildInfoProvider::class.java)

init {
Locale.setDefault(Locale.US)
Expand Down Expand Up @@ -104,11 +107,28 @@ class DefaultAndroidEventProcessorTest {

@Test
fun `When Event and hint is not Cached, data should be applied`() {
whenever(fixture.buildInfo.sdkInfoVersion).thenReturn(Build.VERSION_CODES.M)
val sut = fixture.getSut(context)

assertNotNull(sut.process(SentryEvent(), null)) {
assertNotNull(it.contexts.app)
assertNotNull(it.dist)

// assert adds permissions as unknown
val permissions = it.contexts.app!!.permissions
assertNotNull(permissions)
}
}

@Test
fun `when Android version is below JELLY_BEAN, does not add permissions`() {
whenever(fixture.buildInfo.sdkInfoVersion).thenReturn(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
val sut = fixture.getSut(context)

assertNotNull(sut.process(SentryEvent(), null)) {
// assert adds permissions
val unknown = it.contexts.app!!.permissions
assertNull(unknown)
}
}

Expand Down Expand Up @@ -252,17 +272,24 @@ class DefaultAndroidEventProcessorTest {

sut.process(SentryEvent(), null)

verify((fixture.options.logger as DiagnosticLogger).logger, never())!!.log(eq(SentryLevel.ERROR), any<String>(), any())
verify(
(fixture.options.logger as DiagnosticLogger).logger,
never()
)!!.log(eq(SentryLevel.ERROR), any<String>(), any())
}

@Test
fun `Processor won't throw exception when theres a hint`() {
val processor = DefaultAndroidEventProcessor(context, fixture.options.logger, fixture.buildInfo, mock())
val processor =
DefaultAndroidEventProcessor(context, fixture.options.logger, fixture.buildInfo, mock())

val hintsMap = mutableMapOf<String, Any>(SENTRY_TYPE_CHECK_HINT to CachedEvent())
processor.process(SentryEvent(), hintsMap)

verify((fixture.options.logger as DiagnosticLogger).logger, never())!!.log(eq(SentryLevel.ERROR), any<String>(), any())
verify(
(fixture.options.logger as DiagnosticLogger).logger,
never()
)!!.log(eq(SentryLevel.ERROR), any<String>(), any())
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
<!-- extra recommended permission, we'd be able to collect device ringing breadcrumbs (PhoneStateBreadcrumbsIntegration) -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<!-- Just some random permissions to showcase the permission context sent to Sentry -->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<!-- if your minSdkVersion < 16, this would make usable on minSdkVersion >= 14-->
<uses-sdk
tools:overrideLibrary="io.sentry.android"/>
Expand Down Expand Up @@ -45,6 +49,10 @@
android:name=".GesturesActivity"
android:exported="false" />

<activity
android:name=".PermissionsActivity"
android:exported="false" />

<!-- NOTE: Replace the test DSN below with YOUR OWN DSN to see the events from this app in your Sentry project/dashboard-->
<meta-data android:name="io.sentry.dsn" android:value="https://[email protected]/5428559" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,11 @@ protected void onCreate(Bundle savedInstanceState) {
crashCount);
});

binding.openPermissionsActivity.setOnClickListener(
view -> {
startActivity(new Intent(this, PermissionsActivity.class));
});

setContentView(binding.getRoot());
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package io.sentry.samples.android

import android.Manifest
import android.os.Bundle
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts.RequestPermission
import androidx.appcompat.app.AppCompatActivity
import io.sentry.samples.android.databinding.ActivityPermissionsBinding

class PermissionsActivity : AppCompatActivity() {

private lateinit var binding: ActivityPermissionsBinding
private val requestPermissionLauncher =
registerForActivityResult(RequestPermission()) { isGranted: Boolean ->
if (isGranted) {
Toast.makeText(this, "The permission was granted", Toast.LENGTH_LONG).show()
} else {
Toast.makeText(this, "The permission was denied", Toast.LENGTH_LONG).show()
}
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

binding = ActivityPermissionsBinding.inflate(layoutInflater)

binding.cameraPermission.setOnClickListener {
requestPermissionLauncher.launch(Manifest.permission.CAMERA)
}

binding.writePermission.setOnClickListener {
requestPermissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)
}

binding.permissionsCrash.setOnClickListener {
throw RuntimeException("Permissions Activity Exception")
}

setContentView(binding.root)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,12 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/test_timber_integration"/>

<Button
android:id="@+id/open_permissions_activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/open_permissions_activity"/>
</LinearLayout>

</ScrollView>
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<Button
android:id="@+id/camera_permission"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/camera_permission" />

<Button
android:id="@+id/write_permission"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/write_permission" />

<Button
android:id="@+id/permissions_crash"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/crash_from_java" />

</LinearLayout>
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
<string name="open_sample_fragment">Open Sample Fragment</string>
<string name="open_third_fragment">Open Third Fragment</string>
<string name="open_gestures_activity">Open Gestures Activity</string>
<string name="open_permissions_activity">Open Permissions Activity</string>
<string name="test_timber_integration">Test Timber</string>
<string name="back_main">Back to Main Activity</string>
<string name="tap_me">text</string>
Expand All @@ -30,4 +31,6 @@ Aliquam pharetra, velit eu vulputate tempus, sapien purus accumsan orci, non ult

Nulla interdum gravida augue, vel fringilla lorem bibendum vel. In hac habitasse platea dictumst. Praesent dapibus congue velit, vel mollis eros mattis vel. Maecenas mattis sapien lacus, ut interdum dui vulputate a. Vivamus dapibus, est ac maximus aliquam, mauris lorem vehicula nisl, eget viverra metus nunc ut libero. Quisque aliquet, dolor sit amet pellentesque semper, nisi nunc ornare velit, id porta nibh magna sit amet tortor. Curabitur finibus, lectus at convallis elementum, est sem malesuada massa, vel varius lorem justo a libero. Donec a nulla consequat, dignissim tortor id, ultrices dolor. Ut auctor vel ante sed faucibus. Ut ac dolor vel lacus facilisis bibendum.
</string>
<string name="camera_permission">Camera Permission</string>
<string name="write_permission">Write External Storage Permission</string>
</resources>
3 changes: 3 additions & 0 deletions sentry/api/sentry.api
Original file line number Diff line number Diff line change
Expand Up @@ -1946,6 +1946,7 @@ public final class io/sentry/protocol/App : io/sentry/JsonSerializable, io/sentr
public fun getAppVersion ()Ljava/lang/String;
public fun getBuildType ()Ljava/lang/String;
public fun getDeviceAppHash ()Ljava/lang/String;
public fun getPermissions ()Ljava/util/Map;
public fun getUnknown ()Ljava/util/Map;
public fun serialize (Lio/sentry/JsonObjectWriter;Lio/sentry/ILogger;)V
public fun setAppBuild (Ljava/lang/String;)V
Expand All @@ -1955,6 +1956,7 @@ public final class io/sentry/protocol/App : io/sentry/JsonSerializable, io/sentr
public fun setAppVersion (Ljava/lang/String;)V
public fun setBuildType (Ljava/lang/String;)V
public fun setDeviceAppHash (Ljava/lang/String;)V
public fun setPermissions (Ljava/util/Map;)V
public fun setUnknown (Ljava/util/Map;)V
}

Expand All @@ -1968,6 +1970,7 @@ public final class io/sentry/protocol/App$JsonKeys {
public static final field APP_BUILD Ljava/lang/String;
public static final field APP_IDENTIFIER Ljava/lang/String;
public static final field APP_NAME Ljava/lang/String;
public static final field APP_PERMISSIONS Ljava/lang/String;
public static final field APP_START_TIME Ljava/lang/String;
public static final field APP_VERSION Ljava/lang/String;
public static final field BUILD_TYPE Ljava/lang/String;
Expand Down
Loading

0 comments on commit 0161bd7

Please sign in to comment.