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
1 change: 1 addition & 0 deletions .devrev/.devrev/repo.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
deployable: true
1 change: 1 addition & 0 deletions .github/.github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* @zeeshan-devrev @rohan-devrev
Binary file added .gradle/.gradle/8.0.2/checksums/checksums.lock
Binary file not shown.
Binary file not shown.
Binary file added .gradle/.gradle/8.0.2/fileHashes/fileHashes.lock
Binary file not shown.
Empty file.
Empty file.
26 changes: 17 additions & 9 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## 2.2.8

### Deprecated
- Deprecated the `identifyAnonymousUser()` method.

### Fixed
- Resolved a potential OutOfMemory crash.

## 2.2.7

### Added
Expand Down Expand Up @@ -58,7 +66,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- Fixed an issue related to rendering of the event properties.
- Improved the verified identification flow.
- Fixed an issue with the session upload flow.
- Fixed an issue with the session upload flow.

## 2.0.4

Expand All @@ -68,7 +76,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## 2.0.3

### Fixed
- Fixed an issue with manual unmasking of input components.
- Fixed an issue with manual unmasking of input components.
- Fixed an issue with session uploads when the app is rapidly killed.

## 2.0.2
Expand All @@ -90,11 +98,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## 1.1.5

### Added
- Added `setShouldPreferSystemTheme` for dynamic theme handling.
- Added support for masking compose views in session recordings & analytics.
- Added `setShouldPreferSystemTheme` for dynamic theme handling.
- Added support for masking compose views in session recordings & analytics.

### Fixed
- Improved the initialization sequence of the observability SDK.
- Improved the initialization sequence of the observability SDK.

## 1.1.4

Expand All @@ -109,20 +117,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Enhanced the session analytics feature to work better across different environments.

### Fixed
- Fix the bugs related to on-demand sessions providing a more stable experience.
- Fix the bugs related to on-demand sessions providing a more stable experience.

## 1.1.2

### Fixed
- Fix the session recording experience in the SDK.
- Fix the session recording experience in the SDK.

## 1.1.1

### Added
### Added
- Added new methods that allow tracking of screen transitions to understand user navigation within your app.

### Fixed
- Fix the session recording upload bug.
- Fix the session recording upload bug.

## 1.1.0

Expand Down
103 changes: 78 additions & 25 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ DevRev SDK, used for integrating DevRev services into your Android app.
- [Sample app](#sample-app)
- [Features](#features)
- [Identification](#identification)
- [Identify an anonymous user](#identify-an-anonymous-user)
- [Identify an unverified user](#identify-an-unverified-user)
- [Identify a verified user](#identify-a-verified-user)
- [Generate an AAT](#generate-an-aat)
Expand All @@ -39,8 +38,10 @@ DevRev SDK, used for integrating DevRev services into your Android app.
- [Mask using predefined tags](#mask-using-predefined-tags)
- [Mask web view elements](#mask-web-view-elements)
- [Unmask web view elements](#unmask-web-view-elements)
- [User interaction tracking](#user-interaction-tracking)
- [Custom masking provider](#custom-masking-provider)
- [Timers](#timers)
- [Track handled exceptions](#track-handled-exceptions)
- [Track screens](#track-screens)
- [Manage screen transitions](#manage-screen-transitions)
- [Check if the screen is transitioning](#check-if-the-screen-is-transitioning)
Expand Down Expand Up @@ -209,23 +210,6 @@ The identification function should be placed appropriately in your app after the
> [!TIP]
> The `Identity` structure allows for custom fields in the user, organization, and account traits. These fields must be configured through the DevRev app before they can be utilized. For more information, refer to [Object customization](https://devrev.ai/docs/product/object-customization).

#### Identify an anonymous user

The anonymous identification method allows you to create an anonymous user with an optional user identifier, ensuring that no other data is stored or associated with the user.

- Kotlin
```kotlin
DevRev.identifyAnonymousUser(
userId: String
)
```
- Java
```java
DevRev.INSTANCE.identifyAnonymousUser(
String userId
);
```

#### Identify an unverified user

The unverified identification method identifies users with a unique identifier, but it does not verify their identity with the DevRev backend.
Expand Down Expand Up @@ -322,9 +306,6 @@ For example:

- Kotlin
```kotlin
// Identify an anonymous user without a user identifier.
DevRev.identifyAnonymousUser("abcd1234")

// Identify an unverified user with its email address as a user identifier.
DevRev.identifyUnverifiedUser(Identity(userId = "foo@example.org"))

Expand All @@ -333,9 +314,6 @@ For example:
```
- Java
```java
// Identify an anonymous user without a user identifier.
DevRev.INSTANCE.identifyAnonymousUser("abcd1234");

// Identify an unverified user with its email address as a user identifier.
DevRev.identifyUnverifiedUser(
new Identity("foo@example.org", null, null, null, null, null)
Expand Down Expand Up @@ -902,6 +880,32 @@ For example:
<input type="text" placeholder="Enter Username" name="username" required class="devrev-unmask">
```

#### User interaction tracking

The DevRev SDK automatically tracks user interactions such as taps, swipes, and scrolls. However, in some cases you may want to disable this tracking to prevent sensitive user actions from being recorded.

To **temporarily disable** user interaction tracking, use the following method:

- Kotlin
```kotlin
DevRev.pauseUserInteractionTracking()
```
- Java
```java
DevRevObservabilityExtKt.pauseUserInteractionTracking(DevRev.INSTANCE);
```

To **resume** user interaction tracking, use the following method:

- Kotlin
```kotlin
DevRev.resumeUserInteractionTracking()
```
- Java
```java
DevRevObservabilityExtKt.resumeUserInteractionTracking(DevRev.INSTANCE);
```

#### Custom masking provider

For advanced use cases, you can provide a custom masking provider to explicitly specify which regions of the UI should be masked during snapshots.
Expand Down Expand Up @@ -1037,6 +1041,55 @@ DevRevObservabilityExtKt.startTimer(DevRev.INSTANCE, "response-time", new HashMa
DevRevObservabilityExtKt.endTimer(DevRev.INSTANCE, "response-time", new HashMap<String, String>().put("id", "task-1337"));
```

#### Track handled exceptions

You can report a handled exception from a catch block using the `sendException` function.
This ensures that even if the exception is handled in your app, it will still be logged for diagnostics.

- Kotlin
```kotlin
DevRev.sendException(
exceptionObj: Throwable,
exceptionTag: String
)
```

- Java
```java
DevRevObservabilityExtKt.sendException(
DevRev.INSTANCE,
Throwable exceptionObj,
String exceptionTag
);
```

For example:

- Kotlin
```kotlin
try {
// Your code that may produce an exception
} catch (e: Throwable) {
DevRev.sendException(
exceptionObj = e,
exceptionTag = "login-failure"
)
}
```

- Java
```java
try {
// your code that may throw
} catch (Throwable e) {
DevRevObservabilityExtKt.sendException(
DevRev.INSTANCE,
e,
"login-failure"
);
}
```

#### Track screens

The DevRev SDK offers automatic screen tracking to help you understand how users navigate through your app. Although activities and fragments are automatically tracked, you can manually track screens using the following method:
Expand Down Expand Up @@ -1240,7 +1293,7 @@ public class MyFirebaseMessagingService extends FirebaseMessagingService {
**Solution**: The DevRev SDK reports all errors using Android's logging utility. Look for error messages in Android Studio's Logcat after applying `DEVREV SDK` filter.

- **Issue**: Support chat won't show.
**Solution**: Ensure you have correctly called one of the identification methods: `DevRev.identifyUnverifiedUser(...)`, `DevRev.identifyVerifiedUser(...)`, or `DevRev.identifyAnonymousUser(...)`.
**Solution**: Ensure you have correctly called one of the identification methods: `DevRev.identifyUnverifiedUser(...)` or `DevRev.identifyVerifiedUser(...)`.

- **Issue**: Not receiving push notifications.
**Solution**: Ensure that your app is configured to receive push notifications and that your device is registered with the DevRev SDK.
Expand Down
21 changes: 1 addition & 20 deletions docs/html/core/ai.devrev.sdk.interfaces/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -110,27 +110,8 @@
<h1 class="cover"><span><span>Package-level</span></span> <span><span>declarations</span></span></h1>
</div>
<div class="tabbedcontent">
<div class="tabs-section" tabs-section="tabs-section"><button class="section-tab" data-active="" data-togglable="TYPE">Types</button><button class="section-tab" data-togglable="FUNCTION,EXTENSION_FUNCTION">Functions</button></div>
<div class="tabs-section" tabs-section="tabs-section"><button class="section-tab" data-active="" data-togglable="FUNCTION,EXTENSION_FUNCTION">Functions</button></div>
<div class="tabs-section-body">
<div data-togglable="TYPE">
<h2 class="">Types</h2>
<div class="table"><a data-name="-1832215238%2FClasslikes%2F197447377" anchor-label="Logger" id="-1832215238%2FClasslikes%2F197447377" data-filterable-set=":core:dokkaHtml/release"></a>
<div class="table-row" data-filterable-current=":core:dokkaHtml/release" data-filterable-set=":core:dokkaHtml/release">
<div class="main-subrow keyValue ">
<div class=""><span class="inline-flex">
<div><a href="-logger/index.html"><span><span>Logger</span></span></a></div>
<span class="anchor-wrapper"><span class="anchor-icon" pointing-to="-1832215238%2FClasslikes%2F197447377"></span>
<div class="copy-popup-wrapper "><span class="copy-popup-icon"></span><span>Link copied to clipboard</span></div>
</span></span></div>
<div>
<div class="title">
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:dokkaHtml/release"><div class="symbol monospace"><span class="token keyword">interface </span><a href="-logger/index.html">Logger</a></div></div></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div data-togglable="EXTENSION_FUNCTION">
<h2 class="">Functions</h2>
<div class="table"><a data-name="-340499117%2FFunctions%2F197447377" anchor-label="refreshToken" id="-340499117%2FFunctions%2F197447377" data-filterable-set=":core:dokkaHtml/release"></a>
Expand Down
128 changes: 128 additions & 0 deletions docs/html/core/ai.devrev.sdk.utils/-l-o-g_-t-a-g.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
<!DOCTYPE html>
<html class="no-js">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1" charset="UTF-8">
<title>LOG_TAG</title>
<link href="../../images/logo-icon.svg" rel="icon" type="image/svg">
<script>var pathToRoot = "../../";</script>
<script>document.documentElement.classList.replace("no-js","js");</script>
<script>const storage = localStorage.getItem("dokka-dark-mode")
if (storage == null) {
const osDarkSchemePreferred = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
if (osDarkSchemePreferred === true) {
document.getElementsByTagName("html")[0].classList.add("theme-dark")
}
} else {
const savedDarkMode = JSON.parse(storage)
if(savedDarkMode === true) {
document.getElementsByTagName("html")[0].classList.add("theme-dark")
}
}
</script>
<script type="text/javascript" src="https://unpkg.com/kotlin-playground@1/dist/playground.min.js" async="async"></script>
<script type="text/javascript" src="../../scripts/sourceset_dependencies.js" async="async"></script>
<link href="../../styles/style.css" rel="Stylesheet">
<link href="../../styles/main.css" rel="Stylesheet">
<link href="../../styles/prism.css" rel="Stylesheet">
<link href="../../styles/logo-styles.css" rel="Stylesheet">
<link href="../../styles/font-jb-sans-auto.css" rel="Stylesheet">
<link href="../../ui-kit/ui-kit.min.css" rel="Stylesheet">
<script type="text/javascript" src="../../scripts/clipboard.js" async="async"></script>
<script type="text/javascript" src="../../scripts/navigation-loader.js" async="async"></script>
<script type="text/javascript" src="../../scripts/platform-content-handler.js" async="async"></script>
<script type="text/javascript" src="../../scripts/main.js" defer="defer"></script>
<script type="text/javascript" src="../../scripts/prism.js" async="async"></script>
<script type="text/javascript" src="../../ui-kit/ui-kit.min.js" defer="defer"></script>
<script type="text/javascript" src="../../scripts/symbol-parameters-wrapper_deferred.js" defer="defer"></script>
</head>
<body>
<div class="root">
<nav class="navigation theme-dark" id="navigation-wrapper">
<a class="library-name--link" href="../../index.html">
core
</a>
<button class="navigation-controls--btn navigation-controls--btn_toc ui-kit_mobile-only" id="toc-toggle"
type="button">Toggle table of contents
</button>
<div class="navigation-controls--break ui-kit_mobile-only"></div>
<div class="library-version" id="library-version">
</div>
<div class="navigation-controls">
<div class="filter-section filter-section_loading" id="filter-section">
<button class="platform-tag platform-selector jvm-like" data-active=""
data-filter=":core:dokkaHtml/release">androidJvm</button>
<div class="dropdown filter-section--dropdown" data-role="dropdown" id="filter-section-dropdown">
<button class="button button_dropdown filter-section--dropdown-toggle" role="combobox"
data-role="dropdown-toggle"
aria-controls="platform-tags-listbox"
aria-haspopup="listbox"
aria-expanded="false"
aria-label="Toggle source sets"
></button>
<ul role="listbox" id="platform-tags-listbox" class="dropdown--list" data-role="dropdown-listbox">
<div class="dropdown--header"><span>Platform filter</span>
<button class="button" data-role="dropdown-toggle" aria-label="Close platform filter">
<i class="ui-kit-icon ui-kit-icon_cross"></i>
</button>
</div>
<li role="option" class="dropdown--option platform-selector-option jvm-like" tabindex="0">
<label class="checkbox">
<input type="checkbox" class="checkbox--input" id=":core:dokkaHtml/release"
data-filter=":core:dokkaHtml/release"/>
<span class="checkbox--icon"></span>
androidJvm
</label>
</li>
</ul>
<div class="dropdown--overlay"></div>
</div>
</div>
<button class="navigation-controls--btn navigation-controls--btn_theme" id="theme-toggle-button"
type="button">Switch theme
</button>
<div class="navigation-controls--btn navigation-controls--btn_search" id="searchBar" role="button">Search in
API
</div>
</div>
</nav>
<div id="container">
<div class="sidebar" id="leftColumn">
<div class="dropdown theme-dark_mobile" data-role="dropdown" id="toc-dropdown">
<ul role="listbox" id="toc-listbox" class="dropdown--list dropdown--list_toc-list"
data-role="dropdown-listbox">
<div class="dropdown--header">
<span>
core
</span>
<button class="button" data-role="dropdown-toggle" aria-label="Close table of contents">
<i class="ui-kit-icon ui-kit-icon_cross"></i>
</button>
</div>
<div class="sidebar--inner" id="sideMenu"></div>
</ul>
<div class="dropdown--overlay"></div>
</div>
</div>
<div id="main">
<div class="main-content" data-page-type="member" id="content" pageIds="core::ai.devrev.sdk.utils//LOG_TAG/#/PointingToDeclaration//197447377">
<div class="breadcrumbs"><a href="../../index.html">core</a><span class="delimiter">/</span><a href="index.html">ai.devrev.sdk.utils</a><span class="delimiter">/</span><span class="current">LOG_TAG</span></div>
<div class="cover ">
<h1 class="cover"><span>LOG_</span><wbr></wbr><span>TAG</span></h1>
</div>
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:dokkaHtml/release"><div class="symbol monospace"><span class="token keyword">const </span><span class="token keyword">val </span><a href="-l-o-g_-t-a-g.html">LOG_TAG</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html">String</a></div></div></div>
</div>
<div class="footer">
<a href="#content" id="go-to-top-link" class="footer--button footer--button_go-to-top"></a>
<span>© 2025 Copyright</span>
<span class="pull-right">
<span>Generated by </span>
<a class="footer--link footer--link_external" href="https://github.com/Kotlin/dokka">
<span>dokka</span>
</a>
</span>
</div>
</div>
</div>
</div>
</body>
</html>
Loading