Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
867ef14
Setup spotless and pre-commit
Dec 22, 2024
370186d
Fix pre-commit-config
Dec 22, 2024
67b9cd6
Improve docs
Dec 23, 2024
bb223bc
Fix typo
Dec 23, 2024
48eb471
Reformat file
Dec 23, 2024
99989ac
Reformat
Dec 23, 2024
7ac11f2
Fix doc
Dec 23, 2024
9b83f30
Merge branch 'master' into code-auto-format
BartoszLitwiniuk Jan 9, 2025
1dd3ca4
Merge branch 'master' into code-auto-format
BartoszLitwiniuk Feb 12, 2025
18c59bb
Merge branch 'master' into code-auto-format
BartoszLitwiniuk Mar 18, 2025
7746721
Merge branch 'master' into code-auto-format
Oct 5, 2025
ff017e5
Bump spotless plugin version
Oct 5, 2025
1c1cee0
Tmp update pre-commit
Oct 5, 2025
25a036a
Fix version google java format and plugin
Oct 5, 2025
d42aeea
Update config
Oct 6, 2025
1ca804a
Bump spotless plugin
Oct 8, 2025
80c3a70
Improve CONTRIBUTING.md - add information about spotless
Oct 12, 2025
2f93e88
Improve json format rules
Oct 15, 2025
7392e72
Improve spotless exclude rules
Oct 15, 2025
e0a3646
Fix rules
Oct 15, 2025
6e5a499
Reorder spotless check
Oct 15, 2025
1ccfbf0
Reorder build
Oct 15, 2025
848cf59
Revert
Oct 15, 2025
f99f6ed
Merge branch 'master' into code-auto-format
BartoszLitwiniuk Nov 19, 2025
3f0dd1b
Merge branch 'master' into code-auto-format
BartoszLitwiniuk Jan 19, 2026
9adb592
Merge branch 'master' into code-auto-format
BartoszLitwiniuk Jan 19, 2026
309f53d
Merge branch 'master' into code-auto-format
BartoszLitwiniuk Jan 26, 2026
f72ddee
Code reformat
Jan 26, 2026
2d5d2a2
Fix clang
Jan 26, 2026
7dfd472
Bump version
Jan 26, 2026
f59d092
Fix cpp scan
Jan 27, 2026
ad859aa
Revert changes
Jan 27, 2026
c7b528c
Break formatting
BartoszLitwiniuk Jan 27, 2026
e74bef6
Revert "Break formatting"
Jan 27, 2026
5dee80b
Enable Spotless
Jan 27, 2026
27c9964
Tmp remove gradle format
Jan 27, 2026
e974041
Fix path resolving
Jan 27, 2026
6706ebf
Fix
Jan 27, 2026
180fc0c
Fix path resolving
Jan 27, 2026
c10ecf2
Fix
Jan 27, 2026
ae01ada
Add option to have more debug info
Jan 27, 2026
d45657d
Rm symlink clang format
Jan 27, 2026
aa32afe
Remove options
Jan 27, 2026
d1f29af
Reformat file
Jan 27, 2026
a91af26
Fix unit tests
Jan 28, 2026
3132796
Fix formatting
Jan 28, 2026
1f064f4
Fix formatter issues
Jan 28, 2026
326f4ef
Simplify code
Jan 28, 2026
9449805
Merge pull request #205 from backtrace-labs/code-auto-format-reformat…
BartoszLitwiniuk Jan 28, 2026
a71018a
Uncomment pre-commit config
Jan 28, 2026
3ef350a
Simplify pre-commit config
Jan 28, 2026
d7294d7
Update code
Jan 28, 2026
2ce83eb
Break pre-commit
Jan 28, 2026
5b8b662
Merge branch 'master' into code-auto-format
Feb 3, 2026
a485177
Remove pre-commit
Feb 3, 2026
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
10 changes: 8 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ on:
branches: [master]
pull_request:
schedule:
- cron: '0 0 * * *'
- cron: "0 0 * * *"

jobs:
build:
Expand Down Expand Up @@ -34,7 +34,13 @@ jobs:
echo BACKTRACE_CORONER_TOKEN=\"${{ secrets.BACKTRACE_CORONER_TOKEN }}\" >> ./local.properties

- name: Accept Android SDK licences
run: yes | "${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" --licenses
run: yes | "${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" --licenses

- name: Bugfix libunwindstack-ndk .clang-format symbolic link issue
run: rm ./backtrace-library/src/main/cpp/libbun/external/libunwindstack-ndk/.clang-format

- name: Check Code Style
run: ./gradlew spotlessCheck

- name: Build and check
run: ./gradlew assembleDebug assembleDebugAndroidTest build check
Expand Down
74 changes: 45 additions & 29 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,40 +1,38 @@
# Contributing
Thank you for considering contributing to Backtrace Android SDK library. Here are some guidelines to help you get started:
Thank you for your interest in contributing to the Backtrace Android SDK. Please review the following guidelines to help you get started.

### Getting Started
## Getting Started

1. **Clone the Repository**
- Clone the repository to your local machine using:
```bash
git clone https://github.com/backtrace-labs/backtrace-android.git
```
1. **Clone the repository**
```bash
git clone https://github.com/backtrace-labs/backtrace-android.git
```

2. **Create a Branch**
- It's good practice to create a new branch for each feature or bugfix, if you have jira ticket put ticket number as branch prefix:
```bash
git checkout -b jira-ticket/your-feature-name
```
2. **Create a branch** - it's good practice to create a new branch for each feature or bugfix, if you have jira ticket put ticket number as branch prefix:
```bash
git checkout -b jira-ticket/your-feature-name
```

3. **Update submodules**
```bash
git submodule update --recursive --remote
git submodule update --init --recursive
```

### Coding Guidelines
```bash
git submodule update --recursive --remote
git submodule update --init --recursive
```
## Coding Guidelines

1. **Code Formatting**
- Make sure that your code is properly formatted using the default Android Studio formatter.
- In Android Studio, you can format your code by selecting `Code` > `Reformat Code` or by using the shortcut `Ctrl + Alt + L` (Windows/Linux) or `Cmd + Option + L` (macOS).

2. **Optimize Imports**
- Run 'Optimize imports' to remove unused imports and reorder them.
- In Android Studio, you can optimize imports by selecting `Code` > `Optimize Imports`. You can also enable this option to run it automatically in `Settings` -> `Editor` -> `General` -> `Auto Import`

3. **Write Tests**
- Make sure that your code is properly formatted using the [**Spotless**](https://github.com/diffplug/spotless) formatter.
- From the command line, you can format the code by running:
```bash
./gradlew spotlessApply
```
- In Android Studio, you can also use the **Spotless Gradle** plugin to run formatting directly from the IDE.

2. **Write Tests**
- Ensure that you write tests for the new functionality or changes made. This helps maintain the integrity of the project.

### Commit and Push
## Commit and Push

1. **Commit Your Changes**
- Write clear and concise commit messages. Follow the convention of using the imperative mood in the subject line.
Expand All @@ -48,7 +46,7 @@ git submodule update --init --recursive
git push origin jira-ticket/your-feature-name
```

### Create a Pull Request
## Create a Pull Request

1. **Submit a Pull Request**
- Go to the repository on GitHub and click on the `New Pull Request` button.
Expand All @@ -57,8 +55,26 @@ git submodule update --init --recursive
2. **Review Process**
- One of the project maintainers will review your pull request. Please be responsive to any comments or suggestions made.

### Additional Notes
## Additional Notes

- Ensure that your code follows the existing code style and structure.
- Keep your branch up to date with the latest changes from the `master` branch to avoid merge conflicts.


## Code Formatting

This project uses **[Spotless](https://github.com/diffplug/spotless)** to ensure consistent code style.

### Setup Instructions

1. Run Spotless check
This verifies that your code meets the project’s formatting standards.
```bash
./gradlew spotlessCheck
```

2. (Optional) Automatically reformat code
If formatting issues are found, you can automatically fix them with:
```bash
./gradlew spotlessApply
```
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,13 @@
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;

import backtraceio.library.common.ApplicationMetadataCache;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import backtraceio.library.common.ApplicationMetadataCache;

@RunWith(AndroidJUnit4.class)
public class ApplicationMetadataTest {
private Context context;
Expand Down Expand Up @@ -44,5 +41,4 @@ public void shouldCorrectlyRetrieveApplicationVersion() throws PackageManager.Na
PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getOpPackageName(), 0);
assertEquals(cache.getApplicationVersion(), String.valueOf(packageInfo.versionCode));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,20 @@
import static org.junit.Assert.assertNotNull;

import android.content.Context;

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;

import net.jodah.concurrentunit.Waiter;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import backtraceio.library.events.OnServerResponseEventListener;
import backtraceio.library.events.RequestHandler;
import backtraceio.library.models.BacktraceData;
import backtraceio.library.models.BacktraceResult;
import backtraceio.library.models.types.BacktraceResultStatus;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import net.jodah.concurrentunit.Waiter;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4.class)
public class BacktraceClientAttachmentsTest {
Expand All @@ -50,43 +45,44 @@ public void sendBacktraceExceptionAttachments() {
// GIVEN
final String attachment0 = "/someDir/someFile.log";
final String attachment1 = "/someDir/someOtherFile.log";
List<String> attachments = new ArrayList<String>() {{
add(attachment0);
add(attachment1);
}};
List<String> attachments = new ArrayList<String>() {
{
add(attachment0);
add(attachment1);
}
};

BacktraceClient backtraceClient = new BacktraceClient(context, credentials, database, attachments);

final Waiter waiter = new Waiter();
RequestHandler rh = new RequestHandler() {
@Override
public BacktraceResult onRequest(BacktraceData data) {
return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(),
BacktraceResultStatus.Ok);
return new BacktraceResult(
data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok);
}
};
backtraceClient.setOnRequestHandler(rh);

// WHEN
backtraceClient.send(new Exception(resultMessage), new
OnServerResponseEventListener() {
@Override
public void onEvent(BacktraceResult backtraceResult) {
// THEN
assertEquals(resultMessage, backtraceResult.message);
assertEquals(BacktraceResultStatus.Ok, backtraceResult.status);
assertNotNull(backtraceResult.getBacktraceReport());
assertNotNull(backtraceResult.getBacktraceReport().exception);

// We should have the file attachment paths included
assertEquals(2, backtraceResult.getBacktraceReport().attachmentPaths.size());
assertTrue(backtraceResult.getBacktraceReport().attachmentPaths.contains(attachment0));
assertTrue(backtraceResult.getBacktraceReport().attachmentPaths.contains(attachment1));

waiter.resume();
}
}
);
backtraceClient.send(new Exception(resultMessage), new OnServerResponseEventListener() {
@Override
public void onEvent(BacktraceResult backtraceResult) {
// THEN
assertEquals(resultMessage, backtraceResult.message);
assertEquals(BacktraceResultStatus.Ok, backtraceResult.status);
assertNotNull(backtraceResult.getBacktraceReport());
assertNotNull(backtraceResult.getBacktraceReport().exception);

// We should have the file attachment paths included
assertEquals(
2, backtraceResult.getBacktraceReport().attachmentPaths.size());
assertTrue(backtraceResult.getBacktraceReport().attachmentPaths.contains(attachment0));
assertTrue(backtraceResult.getBacktraceReport().attachmentPaths.contains(attachment1));

waiter.resume();
}
});
// WAIT FOR THE RESULT FROM ANOTHER THREAD
try {
waiter.await(5, TimeUnit.SECONDS);
Expand All @@ -104,30 +100,29 @@ public void sendBacktraceExceptionNoAttachments() {
RequestHandler rh = new RequestHandler() {
@Override
public BacktraceResult onRequest(BacktraceData data) {
return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(),
BacktraceResultStatus.Ok);
return new BacktraceResult(
data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok);
}
};
backtraceClient.setOnRequestHandler(rh);

// WHEN
backtraceClient.send(new Exception(resultMessage), new
OnServerResponseEventListener() {
@Override
public void onEvent(BacktraceResult backtraceResult) {
// THEN
assertEquals(resultMessage, backtraceResult.message);
assertEquals(BacktraceResultStatus.Ok, backtraceResult.status);
assertNotNull(backtraceResult.getBacktraceReport());
assertNotNull(backtraceResult.getBacktraceReport().exception);

// We should NOT have any attachment paths included by default
assertEquals(0, backtraceResult.getBacktraceReport().attachmentPaths.size());

waiter.resume();
}
}
);
backtraceClient.send(new Exception(resultMessage), new OnServerResponseEventListener() {
@Override
public void onEvent(BacktraceResult backtraceResult) {
// THEN
assertEquals(resultMessage, backtraceResult.message);
assertEquals(BacktraceResultStatus.Ok, backtraceResult.status);
assertNotNull(backtraceResult.getBacktraceReport());
assertNotNull(backtraceResult.getBacktraceReport().exception);

// We should NOT have any attachment paths included by default
assertEquals(
0, backtraceResult.getBacktraceReport().attachmentPaths.size());

waiter.resume();
}
});
// WAIT FOR THE RESULT FROM ANOTHER THREAD
try {
waiter.await(5, TimeUnit.SECONDS);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,21 @@
import static org.junit.Assert.assertNotNull;

import android.content.Context;

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;

import backtraceio.library.events.RequestHandler;
import backtraceio.library.models.BacktraceResult;
import backtraceio.library.models.types.BacktraceResultStatus;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import net.jodah.concurrentunit.Waiter;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import backtraceio.library.events.RequestHandler;
import backtraceio.library.models.BacktraceResult;
import backtraceio.library.models.types.BacktraceResultStatus;

@RunWith(AndroidJUnit4.class)
public class BacktraceClientAttributeTests {
private Context context;
Expand Down Expand Up @@ -142,21 +137,19 @@ public void attributesShouldBeAvailableInReport() {
Object value = data.getAttributes().get(attributeKey);
assertNotNull(value);
assertEquals(value, attributeValue);
return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(),
BacktraceResultStatus.Ok);
return new BacktraceResult(
data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok);
};
backtraceClient.setOnRequestHandler(rh);
final Waiter waiter = new Waiter();

// WHEN
backtraceClient.send(new Exception(errorMessage), backtraceResult -> waiter.resume()
);
backtraceClient.send(new Exception(errorMessage), backtraceResult -> waiter.resume());
// WAIT FOR THE RESULT FROM ANOTHER THREAD
try {
waiter.await(5, TimeUnit.SECONDS);
} catch (Exception ex) {
fail(ex.getMessage());
}
}

}
Loading