Android changelog
Version 7.1.7 (2024-01-05)
- Fixed:
TokenPayload
.
Version 7.1.6 (2023-12-20)
- Updated:
TokenPayload
. - Fixed:
BatteryOptimizationsChangedEvent
event.
Version 7.1.5 (2023-10-26)
- Updated: Removed one of unneeded callback event.
Version 7.1.1 (2023-09-26)
- Added:
DeviceSettings
event. This event informs whether power save mode and battery optimizations are enabled on the device or not. - Removed:
BatterySettings
event.
Version 7.1.0 (2023-08-23)
- Changed: Receive a BatterySettings event when the PowerSaveMode changes.
- Changed: Transmit all collected events when stopping tracking.
Version 7.0.2 (2022-12-15)
- Fixed: Retry location collection in case of failure.
- Fixed: Refreshing device id only if new access token contains a new user id.
Version 7.0.1 (2022-11-22)
- Changed: Update dependencies, notably the SDK now uses Kotlin
1.7.10
.
Version 7.0.0 (2022-10-07)
- Added:
BatteryOptimizationsChangedEvent
event. This event informs when there is a change in the app's battery optimizations setting. - Added:
isBatteryOptimizationsEnabled
read-only property. Its value will betrue
if battery optimizations are enabled for the application. - Added:
PowerSaveModeChangedEvent
event. This event informs when there is a change in the device's power save mode setting. - Added:
isPowerSaveModeEnabled
read-only property. Its value will betrue
if the device has power saving mode enabled. - Added:
version
read-only property. It returns the current SDK version. - Added:
isSuccess
read-only property to theTransmissionEvent
sealed class. Its value will betrue
when the transmission is successful. - Removed:
Settings
class and thegetSettings()
function have been removed. The notification and the data transmission settings can be configured during runtime using the mutable propertiesnotification
andwifiOnlyDataTransfer
, respectively. - Removed:
Reason.KILLED
has been removed. The SDK will automatically restore itself after being killed by the user or the OS, and it will not notify the application via theAutoStartEvent
andAutoStopEvent
anymore. - Changed:
minimumSdkVersion
has been increased to 23 (Android 6.0). - Changed:
initialize(application: Application, settings: Settings, callback: MotionTag.Callback)
function parameters have changed toinitialize(application: Application, notification: Notification, callback: MotionTag.Callback)
. - Changed:
userToken(token: String)
andgetUserToken()
functions have been replaced by the mutable propertyuserToken
. - Changed:
useWifiOnlyDataTransfer(on: Boolean)
function has been replaced by the mutable propertywifiOnlyDataTransfer
. - Changed:
notification(notification: Notification)
function has been replaced by the mutable propertynotification
. - Changed:
isTrackingActive()
function has been replaced by a read-only propertyisTrackingActive
. - Changed:
hasRequiredLocationSettings()
function has been replaced by a read-only propertyhasRequiredLocationSettings
. - Changed:
hasRequiredPermissions()
function has been replaced by a read-only propertyhasRequiredPermissions
. - Changed:
getRequiredPermissions()
function has been replaced by a read-only propertyrequiredPermissions
. - Changed:
getDeniedRequiredPermissions()
function has been replaced by a read-only propertydeniedRequiredPermissions
. - Changed:
wifiOnlyDataTransfer
is nowfalse
by default. - Changed: A completion callback parameter must be specified when calling the
clearData()
function. The callback function will be called on the main thread once the user data has been deleted. - Changed: The SDK no longer throws an
IllegalStateException
after callingstart()
function without a validuserToken
. If theuserToken
is invalid (or null) during the data transmission process, the SDK will send aTransmissionEvent.Error
event through theonEvent(event: Event)
callback.
Version 6.2.0 (2022-08-17)
- This version is identical to
6.2.0-rc01
.
Version 6.2.0-rc01 (2022-07-25)
- Added: The SDK supports apps targeting Android 13:
targetSdk 33
. - Changed: Update dependencies
Version 6.1.2 (2022-02-18)
- Changed: Update dependencies, particularly
com.google.android.gms:play-services-location
which had a known NPE issue.
Version 6.1.1 (2021-12-01)
- Fixed: Fix a rare IllegalArgumentException crash when observing connectivity changes on Android 11.
Version 6.1.0 (2021-10-20)
- Changed: Updated Jetpack WorkManager dependency to version 2.7.0.
Important changes since version 6.0.0:
- Added: The SDK supports apps targeting Android 12:
targetSdkVersion 31
.- Apps targeting Android 12 must now request both
android.permission.ACCESS_COARSE_LOCATION
andandroid.permission.ACCESS_FINE_LOCATION
permissions for the new precise location setting that is required by the SDK. - Google has introduced a new format for the backup and restore configuration file for apps that run on and target Android 12, please check our documentation for more information.
- Apps targeting Android 12 must now request both
Version 6.1.0-rc02 (2021-10-13)
- Fixed: Fix an internal state issue that could throw a
ForegroundServiceStartNotAllowedException
on Android 12. - Fixed: Fix a
IllegalArgumentException
crash on Android 11.
NOTE: This version depends on Jetpack WorkManager 2.7.0-rc01 which might be unstable at the moment.
Version 6.1.0-rc01 (2021-10-04)
- Improved: Improve exception message when accessing the SDK instance without initializing it first.
NOTE: This version depends on Jetpack WorkManager 2.7.0-rc01 which might be unstable at the moment.
Version 6.1.0-beta02 (2021-09-13)
- Improved: Reduce gaps when publishing long stays.
- Changed: Update dependencies.
NOTE: This version depends on Jetpack WorkManager 2.7.0-beta01 which might be unstable at the moment.
Version 6.1.0-beta01 (2021-08-27)
- Added: The SDK supports apps targeting Android 12:
targetSdkVersion 31
.- Apps targeting Android 12 must now request both
android.permission.ACCESS_COARSE_LOCATION
andandroid.permission.ACCESS_FINE_LOCATION
permissions for the new precise location setting that is required by the SDK. - Google has introduced a new format for the backup and restore configuration file for apps that run on and target Android 12, please check our documentation for more information.
- Apps targeting Android 12 must now request both
NOTE: This version depends on Jetpack WorkManager 2.7.0-alpha05 which might be unstable at the moment.
Version 6.0.0 (2021-07-08)
- Changed: The
MotionTag
functions are no longer static. The main functionality can be accessed via the class singleton instance:MotionTag.getInstance()
. - Changed: The
MotionTag.with(Application, Settings, MotionTag.Callback)
function has been renamed toMotionTag.getInstance().initialize(Application, Settings, MotionTag.Callback)
. - Changed: The
MotionTag.start(token)
function does not expect a JWT parameter anymore. The token must be specified using the newMotionTag.getInstance().userToken(token)
function. - Changed: The
Settings
class initialization has been simplified by making use of parameters with default values. - Changed: The
useBatterySavingMode
setting has been removed. Battery saving mode is always enabled now. - Added: A
userToken(token)
function that allows updating the user JWT during runtime (e.g.: when the token expires). The provided token will be persisted in the SDK and must be provided before calling thestart()
function. - Added: A
getUserToken(): String?
function that allows retrieving the current user JWT. - Improved: Improve movement detection algorithm.
- Improved: Transmit the collected data more often in order generate storyline items faster.
- Improved: Add a prefix to the private library resources.
This commit in the sample app repository demonstrates how to update from version 5.x.x to 6.0.0.
Version 5.5.2 (2021-06-22)
- Fixed: Correctly handle data transmission timeout.
Version 5.5.1 (2021-05-25)
- Fixed: Fix a rare crash when trying to open the local database.
- Fixed: Fix an issue that could lead to a delay in the initial location tracking.
Version 5.5.0 (2021-05-17)
- Changed: Starting from this version, the Android MOTIONTAG SDK releases will now be hosted on a public Maven repository.
Please change the maven repository declaration as follows: maven { url "https://pkgs.dev.azure.com/motiontag/releases/_packaging/releases/maven/v1" }
.
The old https://artifactory.motion-tag.de/artifactory/libs-release
Maven repository will be deactivated on January 31, 2022.
Version 5.4.0 (2021-05-07)
- Improved: Internal changes in order to support the upcoming Android 12 foreground service restriction changes.
- Improved: Added the SDK license to the Project Object Model (pom.xml).
- Improved: Remove dependency from
jcenter()
maven repository
Version 5.3.0 (2021-03-15)
- Improved: Collect
BatterySettings
event with information about the app's battery optimizations and the device's power save mode status. - Improved: Only collect
Connectivity
event when there's a change in the device's connectivity. - Improved: Move keystore file to the no backup folder (API levels 21 and 22).
- Fixed: Fix sensor data resampling algorithm.
- Fixed: Fix a rare SecurityException crash when observing connectivity changes on Android 11.
- Fixed: Fix crash when parsing invalid Location bearing on Nokia phones.
- Deprecated:
Settings.Builder().useBatterySavingMode(boolean)
andMotionTag.useBatterySavingMode(boolean)
functions have been deprecated and will be removed in version 6.0.0.
Version 5.2.0 (2021-02-11)
- Changed: The SDK no longer supports API levels 18 and 19. The
minimumSdkVersion
is now 21. - Improved: Make sensor data collection more resilient to runtime crashes.
- Improved: The internal database was moved to the no backup folder in order to exclude it from automatic backup.
- Improved: Add WorkManager section to the documentation.
- Fixed: Fix RemoteServiceException when calling
MotionTag.useBatterySavingMode()
orMotionTag.useWifiOnlyDataTransfer()
in rapid succession. - Fixed: Fix crash when parsing invalid Location speed on Nokia phones.
Version 5.1.0 (2020-12-11)
- Improved: Reduce data transmission by up to 50%
- Changed: Immediately trigger the creation of user in our backend after starting the SDK
- Fixed: Fix
RemoteServiceException
crashes when trying to launch the foreground service
Version 5.0.0 (2020-11-24)
- Changed: The SDK's foreground notification will now be displayed only when the device is moving, therefore we recommend app developers to use a low priority notification coupled with a low importance channel in order to not disturb the user every time they start moving.
val channel = NotificationChannel("tracking_channel_id", "channel title", NotificationManager.IMPORTANCE_LOW)
// Other configurations
channel.setShowBadge(false)
notificationManager.createNotificationChannel(channel)
val notification = NotificationCompat.Builder(context, "tracking_channel_id")
.setPriority(NotificationCompat.PRIORITY_LOW)
// Other configurations
.build()
notification.flags = Notification.FLAG_ONGOING_EVENT
- Improved: The SDK size has been reduced from 30 MB to 8 MB.
- Improved: Tracking restart algorithm has been refactored and improved.
Version 4.2.0 (2020-09-14)
- Improved: Reduce data transmission by up to 20%.
Version 4.1.0 (2020-09-04)
- Fixed: Event class Java interoperability issue.
- Improved: Reduce delay to publish user's last storyline item.
- Improved: Mode detection accuracy.
Version 4.0.0 (2020-07-24)
- Added: Support for Android 11. Apps targeting SDK version 30 or later must be granted
android.permission.ACCESS_FINE_LOCATION
permission before requestingandroid.permission.ACCESS_BACKGROUND_LOCATION
. More information in the official Android documentation. An example implementation can be found in our sample app. - Added:
MotionTag.getDeniedRequiredPermissions()
. This function returns aList<String>
with the required runtime permissions that are still denied. - Changed:
MotionTag.getRequiredPermissions()
now returns aList<String>
instead of anArray<String>
. - Changed:
de.motiontag.tracker.Reason.Start
andde.motiontag.tracker.Reason.Stop
were merged tode.motiontag.tracker.Reason
. - Removed:
MotionTag.requestRequiredPermissions(activity, requestCode)
public function. Please useActivityCompat.requestPermissions(activity, permissions, requestCode)
to manually request permissions.MotionTag.getRequiredPermissions()
can be used to retrieve an array with the required runtime permissions. - Removed:
MotionTag.checkIn()
andMotionTag.checkOut()
public functions. - Improved: Tracking restart algorithm.
Version 3.0.0 (2020-06-10)
This is a major release and it is not backward compatible with the previous ones.
- Some packages and classes have been moved and/or renamed as follows:
de.motiontag.tracker.models.Event
-> de.motiontag.tracker.Event
de.motiontag.tracker.models.Event.AutoStart
-> de.motiontag.tracker.AutoStartEvent
de.motiontag.tracker.models.Event.AutoStop
-> de.motiontag.tracker.AutoStopEvent
de.motiontag.tracker.models.Event.Location
-> de.motiontag.tracker.LocationEvent
de.motiontag.tracker.models.Event.Transmission
-> de.motiontag.tracker.TransmissionEvent
de.motiontag.tracker.models.Reason
-> de.motiontag.tracker.Reason
- Added
TransmissionEvent.Success
event:
This event informs when a package of events has been successfully sent to the server. The timestamp represents the time of the server confirmation response. The trackedFrom and trackedTo represent the time range of the transmitted events.
- Added
TransmissionEvent.Error
event:
This event informs when a package of events failed to be transmitted to the server. The timestamp represents the time of the failure. The errorCode and errorMessage describes the error that occurred.
Removed
MotionTag.turnLoggingOn(on: Boolean)
andSettings.Builder.turnLogginOn(on: Boolean)
public functions.Improved mode detection accuracy.
Version 2.4.0 (2020-03-18)
- Reduce data transmission by up to 60%.
Version 2.3.2 (2020-03-11)
- Update
WorkManager
dependency version to 2.3.3.
This version fixes a bug that could prevent sensor data from being transmitted to our server.
Version 2.3.1 (2020-02-13)
- Remove
<uses-feature android:name="android.hardware.sensor.stepdetector" />
feature fromAndroidManifest.xml
.
Version 2.3.0 (2020-02-12)
IMPORTANT:
- The SDK now requires
android.permission.ACTIVITY_RECOGNITION
runtime permission when running on Android 10.
The OS will automatically grant this permission to existing apps. However, this is not the case for new app installs, therefore developers must request this permission before starting the SDK.
A few helper functions were added to help developers with the task of verifying and requesting the correct permissions and location settings:
MotionTag.hasRequiredLocationSettings()
: Checks if the device has all the required location settings.
MotionTag.hasRequiredPermissions()
: Checks if the app has all the required permissions.
MotionTag.getRequiredPermissions()
: Returns an array with all the required permissions.
MotionTag.requestRequiredLocationSettings(Activity activity, int requestCode)
: Displays a dialog that allows users to enable all the required location settings.
MotionTag.requestRequiredPermissions(Activity activity, int requestCode)
: Requests the required runtime permissions to the user.
Please check our documentation for more information.
Other changes:
Reason.Stop.LOCATION_PERMISSION
was renamed toReason.Stop.PERMISSION
- Improve mode detection accuracy
- Restructure internal background jobs
Version 2.2.7 (2020-01-27)
- Improve tracking restart when the app is killed by Android OS
- Fix crash in the SDK when Auto Backup feature is enabled in the app
- Add Auto Backup section to the documentation
Version 2.2.6 (2020-01-16)
- Fix crash when accessing internal database from multiple threads
Version 2.2.5 (2020-01-15)
- Speed up SDK initialization process by lazy loading the local database
- Add an additional exception listener to investigate crashes when first time opening app
Version 2.2.4 (2020-01-07)
- Add exception listener to investigate crashes when first time opening app
Version 2.2.3 (2019-12-05)
- Fix a crash when using the SDK together with Firebase Performance Monitoring
Version 2.2.2 (2019-11-12)
MotionTag.isTrackingActive()
now returns false when tracking is interrupted
Version 2.2.1 (2019-10-03)
- Reduce battery consumption
- Schedule periodic jobs with WorkManager
- Remove library restriction from
useWifiOnlyDataTransfer
method - Hide internal SDK resources
Version 2.2.0 (2019-09-13)
- Add support for Android 10
IMPORTANT:
Starting from version 2.2.0
, the SDK requires compileSdkVersion
29 or higher.
Apps targeting API 29
must request both android.permission.ACCESS_FINE_LOCATION
and android.permission.ACCESS_BACKGROUND_LOCATION
runtime permissions,
otherwise the SDK will not work properly on Android 10.
After requesting the location permissions, Android 10 users will get a dialog with 3 different options to choose from. Users must select "Allow all the time" option, otherwise the SDK won't function properly.
Version 2.1.0 (2019-09-02)
- Reduce battery consumption
- Improve tracking restart when the app is killed by Android OS
Version 2.0.0 (2019-08-23)
- Section 2.3
MotionTag.Callback
changed ...
FROM
Returns | Method | Explanation |
---|---|---|
void | onAutoStart(Reason.Start reason) |
Informs the application that tracking has been automatically started. |
void | onAutoStop(Reason.Stop reason) |
Informs the application that tracking has been automatically stopped. |
void | onLocation(Location location) |
Hands the latest captured android.location.Location. to the application. |
void | onTransmission(long timestamp) |
Informs when a package of events has been successfully sent to the server. The timestamp parameter represents the time (in milliseconds) of the server confirmation response. |
TO
Returns | Method | Explanation |
---|---|---|
void | onEvent(Event event) |
Informs the application about a new incoming event. |
Event | Explanation |
---|---|
AutoStart(Reason.Start reason) |
Event informs application that tracking has been automatically started. |
AutoStop(Reason.Stop reason) |
Event informs application that tracking has been automatically stopped. |
LocationEvent(Location location) |
Event hands the latest captured android.location.Location. to the application. |
Transmission(long timestamp) |
Event informs when a package of events has been successfully sent to the server. The timestamp parameter represents the time (in milliseconds) of the server confirmation response. |
- Section 3.5 Automatic Start/Stop changed ...
FROM
class CustomClass implements MotionTag.Callback {
@Override
public void onAutoStart(Reason.Start reason) {
switch (reason) {
case RESTART:
// do something after the tracking was restarted
// after rebooting the phone or updating the application.
break;
case LOCATION_SERVICE:
// do something after the tracking was restarted
// by turning on the location services.
break;
case KILLED:
// do something after the application has been killed and
// the tracking is restarted.
break;
}
}
@Override
public void onAutoStop(Reason.Stop reason) {
switch (reason) {
case RESTART:
// do something after the tracking was stopped
// because the phone was shut down
break;
case LOCATION_SERVICE:
// do something after the tracking was stopped
// by turning off the location services.
break;
case LOCATION_PERMISSION:
// do something after the tracking was stopped
// by revoking the location permissions.
break;
}
}
}
TO
Java
class CustomClass implements MotionTag.Callback {
@Override
public void onEvent(Event event) {
switch (event.getType()) {
case AUTO_START:
// do something after the tracking was restarted, e.g.
onAutoStart(event.getReason());
break;
case AUTO_STOP:
// do something after the tracking was stopped, e.g.
onAutoStop(event.getReason());
break;
case LOCATION:
// do something after the application provides a location, e.g.
onLocation(event.getLocation());
break;
case TRANSMISSION:
// do something after the application has successfully transmitted data, e.g.
onTransmission(event.getTransmittedAt());
break;
}
}
private void onAutoStart(Reason.Start reason) {
switch (reason) {
case RESTART:
// do something after the tracking was restarted
// after rebooting the phone or updating the application.
break;
case LOCATION_SERVICE:
// do something after the tracking was restarted
// by turning on the location services.
break;
case KILLED:
// do something after the application has been killed and
// the tracking is restarted.
break;
}
}
private void onAutoStop(Reason.Stop reason) {
switch (reason) {
case RESTART:
// do something after the tracking was stopped
// because the phone was shut down
break;
case LOCATION_SERVICE:
// do something after the tracking was stopped
// by turning off the location services.
break;
case LOCATION_PERMISSION:
// do something after the tracking was stopped
// by revoking the location permissions.
break;
}
}
private void onLocation(Location location) {
// Maybe display the location on a map
}
private void onTransmission(Long transmittedAt) {
// Maybe display the time, so the user gets informed that data will be analysed soon
}
}
Kotlin
class CustomClass : MotionTag.Callback {
override fun onEvent(event: Event) {
when (event) {
is Event.AutoStart -> onAutoStart(event.reason) // do something after the tracking was restarted, e.g.
is Event.AutoStop -> onAutoStop(event.reason) // do something after the tracking was stopped, e.g.
is Event.LocationEvent -> onLocation(event.location) // do something after the application provides a location, e.g.
is Event.Transmission -> onTransmission(event.transmittedAt) // do something after the application has successfully transmitted data, e.g.
}
}
private fun onAutoStart(reason: Reason.Start) {
when (reason) {
RESTART -> TODO() // do something after the tracking was restarted after rebooting the phone or updating the application.
LOCATION_SERVICE -> TODO() // do something after the tracking was restarted by turning on the location services.
KILLED -> TODO() // do something after the application has been killed and the tracking is restarted.
}
}
private fun onAutoStop(reason: Reason.Stop) {
when (reason) {
RESTART -> TODO() // do something after the tracking was stopped because the phone was shut down
LOCATION_SERVICE -> TODO() // do something after the tracking was stopped by turning off the location services.
LOCATION_PERMISSION -> TODO() // do something after the tracking was stopped by revoking the location permissions.
}
}
private fun onLocation(location: Location) {
// Maybe display the location on a map
}
private fun onTransmission(transmittedAt: Long) {
// Maybe display the time, so the user gets informed that data will be analysed soon
}
}
Version 1.6.1 (2019-05-22)
- Remove unused bluetooth permission
- Fix crash when parsing geofence event