diff --git a/sentry-samples/sentry-samples-android/maestro/README.md b/sentry-samples/sentry-samples-android/maestro/README.md new file mode 100644 index 00000000000..b1885342616 --- /dev/null +++ b/sentry-samples/sentry-samples-android/maestro/README.md @@ -0,0 +1,17 @@ +This folder contains the Maestro flows for the Sentry Android SDK. + +## Running the Flows + +First, make sure you have the Maestro CLI installed. You can find the installation instructions in the [Maestro documentation](https://docs.maestro.dev/getting-started/installing-maestro). + +To run the Maestro flows, navigate to this directory in your terminal and execute the following command: + +```bash +maestro run .yaml +``` + +Replace `` with the name of the flow you want to run, such as `orientation_change_flow.yaml`. + +## Available Flows + +- `orientation_change_flow.yaml`: This flow tests the orientation change/window size change functionality for replays. \ No newline at end of file diff --git a/sentry-samples/sentry-samples-android/maestro/orientation_change_flow.yml b/sentry-samples/sentry-samples-android/maestro/orientation_change_flow.yml new file mode 100644 index 00000000000..66c155521ac --- /dev/null +++ b/sentry-samples/sentry-samples-android/maestro/orientation_change_flow.yml @@ -0,0 +1,38 @@ +appId: io.sentry.samples.android + +--- +- launchApp: + arguments: + isOrientationChange: true +- scrollUntilVisible: + element: + id: "show_dialog" +- tapOn: Show Dialog +- tapOn: Close +- scrollUntilVisible: + element: + id: "open_compose_activity" +- tapOn: Open Compose Activity +- extendedWaitUntil: + visible: randText # Any random text that does not exist in the UI + optional: true # This should be true so that the test won't fail + timeout: 2000 +- tapOn: Show Dialog +- tapOn: + point: 25%, 25% +- tapOn: "Navigate to Github" +- extendedWaitUntil: + visible: randText # Any random text that does not exist in the UI + optional: true # This should be true so that the test won't fail + timeout: 2000 +- back +- tapOn: Show Dialog +- tapOn: + point: 25%, 25% +- back +- extendedWaitUntil: + visible: randText # Any random text that does not exist in the UI + optional: true # This should be true so that the test won't fail + timeout: 2000 +- back +- back diff --git a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java index 4befd811fa9..df523df6a29 100644 --- a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java +++ b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/MainActivity.java @@ -1,6 +1,8 @@ package io.sentry.samples.android; import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.res.Configuration; import android.os.Bundle; import android.os.Handler; import androidx.appcompat.app.AlertDialog; @@ -38,6 +40,8 @@ public class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + SharedState.INSTANCE.setOrientationChange( + getIntent().getBooleanExtra("isOrientationChange", false)); final ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater()); final File imageFile = getApplicationContext().getFileStreamPath("sentry.png"); @@ -282,7 +286,16 @@ public void run() { .setPositiveButton( "Close", (dialog, which) -> { - dialog.dismiss(); + if (SharedState.INSTANCE.isOrientationChange()) { + int currentOrientation = getResources().getConfiguration().orientation; + if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + } else if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + } + } else { + dialog.dismiss(); + } }) .show(); }); diff --git a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/SharedState.kt b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/SharedState.kt new file mode 100644 index 00000000000..8373b54b1ed --- /dev/null +++ b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/SharedState.kt @@ -0,0 +1,6 @@ +package io.sentry.samples.android + +object SharedState { + @Volatile + var isOrientationChange: Boolean = false +} diff --git a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/compose/ComposeActivity.kt b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/compose/ComposeActivity.kt index 7a699a94f33..b6eefa72ca4 100644 --- a/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/compose/ComposeActivity.kt +++ b/sentry-samples/sentry-samples-android/src/main/java/io/sentry/samples/android/compose/ComposeActivity.kt @@ -2,6 +2,9 @@ package io.sentry.samples.android.compose +import android.app.Activity +import android.content.pm.ActivityInfo +import android.content.res.Configuration import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent @@ -34,6 +37,7 @@ import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.input.TextFieldValue @@ -49,6 +53,7 @@ import io.sentry.android.replay.sentryReplayUnmask import io.sentry.compose.SentryTraced import io.sentry.compose.withSentryObservableEffect import io.sentry.samples.android.GithubAPI +import io.sentry.samples.android.SharedState import kotlinx.coroutines.launch import io.sentry.samples.android.R as IR @@ -71,6 +76,8 @@ fun Landing( navigateGithubWithArgs: () -> Unit ) { var showDialog by remember { mutableStateOf(false) } + val context = LocalContext.current + val activity = context as? Activity ?: return SentryTraced(tag = "buttons_page") { Column( @@ -119,7 +126,18 @@ fun Landing( if (showDialog) { BasicAlertDialog( onDismissRequest = { - showDialog = false + if (SharedState.isOrientationChange) { + val orientation = activity.resources.configuration.orientation + if (orientation == Configuration.ORIENTATION_PORTRAIT) { + activity.requestedOrientation = + ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE + } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) { + activity.requestedOrientation = + ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + } + } else { + showDialog = false + } }, content = { Surface(