Notifications now use AlarmManager instead of WorkManager for delivery, TODO: notifications should be sent even if the app is closed (swiped from 'recents' view)

This commit is contained in:
Deniz Düzgören
2020-03-10 19:42:30 +01:00
parent 80f737a96c
commit ea393603c0
37 changed files with 411 additions and 50 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+3 -15
View File
File diff suppressed because one or more lines are too long
-2
View File
@@ -54,8 +54,6 @@ dependencies {
implementation "androidx.room:room-runtime:2.2.3" implementation "androidx.room:room-runtime:2.2.3"
kapt "androidx.room:room-compiler:$room_version" kapt "androidx.room:room-compiler:$room_version"
implementation "androidx.work:work-runtime-ktx:2.3.3"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0'
Binary file not shown.
+2 -2
View File
@@ -11,8 +11,8 @@
"type": "SINGLE", "type": "SINGLE",
"filters": [], "filters": [],
"properties": [], "properties": [],
"versionCode": 1, "versionCode": 2,
"versionName": "1", "versionName": "2",
"enabled": true, "enabled": true,
"outputFile": "app-release.apk" "outputFile": "app-release.apk"
} }
+3
View File
@@ -12,6 +12,9 @@
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/AppTheme.Launcher"> android:theme="@style/AppTheme.Launcher">
<service android:name=".util.ExamService"
android:description="@string/exam_service_description"
android:enabled="true"/>
<activity android:name=".activity.MainActivity"> <activity android:name=".activity.MainActivity">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@@ -1,22 +1,26 @@
package com.denizd.qwark.activity package com.denizd.qwark.activity
import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.View import android.view.View
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentTransaction import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.work.*
import com.denizd.lawrence.util.viewBinding import com.denizd.lawrence.util.viewBinding
import com.denizd.qwark.R import com.denizd.qwark.R
import com.denizd.qwark.database.QwarkRepository import com.denizd.qwark.database.QwarkRepository
import com.denizd.qwark.databinding.ActivityMainBinding import com.denizd.qwark.databinding.ActivityMainBinding
import com.denizd.qwark.fragment.* import com.denizd.qwark.fragment.*
import com.denizd.qwark.util.Dependencies import com.denizd.qwark.util.Dependencies
import com.denizd.qwark.util.ExamNotificationWorker import com.denizd.qwark.util.ExamService
import com.denizd.qwark.util.QwarkUtil
import com.denizd.qwark.viewmodel.MainViewModel import com.denizd.qwark.viewmodel.MainViewModel
import java.util.concurrent.TimeUnit
import kotlin.random.Random import kotlin.random.Random
class MainActivity : FragmentActivity() { class MainActivity : FragmentActivity() {
@@ -88,16 +92,23 @@ class MainActivity : FragmentActivity() {
// }, 1200) // }, 1200)
Dependencies.repo.allCoursesWithExams.observe(this, Observer { courses -> Dependencies.repo.allCoursesWithExams.observe(this, Observer { courses ->
with (WorkManager.getInstance(this)) { with (getSystemService(Context.ALARM_SERVICE) as AlarmManager) {
for (course in courses) { for (course in courses) {
beginUniqueWork( // val t = getTimeUntil(course.examTime)
"${course.name}-${course.courseId}", if (course.examTime > QwarkUtil.timeAtMidnight || !(QwarkUtil.timeAtMidnight + viewModel.getExamNotificationTime()).hasPassed()) {
ExistingWorkPolicy.REPLACE, set(
OneTimeWorkRequestBuilder<ExamNotificationWorker>() AlarmManager.RTC,
.setInitialDelay(getTimeUntil(course.examTime), TimeUnit.MILLISECONDS) course.examTime + viewModel.getExamNotificationTime(),
.setInputData(Data.Builder().putString("course", course.name).build()) PendingIntent.getService(
.build() this@MainActivity,
).enqueue() course.courseId,
Intent(this@MainActivity, ExamService::class.java).also { intent ->
intent.putExtra("course", course.name)
},
PendingIntent.FLAG_UPDATE_CURRENT
)
)
}
} }
} }
}) })
@@ -154,6 +165,6 @@ class MainActivity : FragmentActivity() {
} }
} }
// TODO add option to set time of notification (currently: 7 AM)
private fun getTimeUntil(examTime: Long): Long = examTime + viewModel.getExamNotificationTime() - System.currentTimeMillis() private fun getTimeUntil(examTime: Long): Long = examTime + viewModel.getExamNotificationTime() - System.currentTimeMillis()
private fun Long.hasPassed(): Boolean = this < System.currentTimeMillis()
} }
@@ -20,8 +20,8 @@ interface QwarkDao {
@Query("SELECT course.*, (SELECT MIN(exam_time) FROM grade WHERE grade.course_id = course.course_id AND exam_time >= :time) AS exam_time FROM course GROUP BY course.course_id ORDER BY time") @Query("SELECT course.*, (SELECT MIN(exam_time) FROM grade WHERE grade.course_id = course.course_id AND exam_time >= :time) AS exam_time FROM course GROUP BY course.course_id ORDER BY time")
fun getAllCourseExams(time: Long = QwarkUtil.timeAtMidnight): List<CourseExam> fun getAllCourseExams(time: Long = QwarkUtil.timeAtMidnight): List<CourseExam>
@Query("SELECT course.*, (SELECT MIN(exam_time) FROM grade WHERE grade.course_id = course.course_id AND exam_time >= :time) AS exam_time FROM course WHERE exam_time > :time GROUP BY course.course_id ORDER BY time") @Query("SELECT course.*, (SELECT MIN(exam_time) FROM grade WHERE grade.course_id = course.course_id AND exam_time >= :timeAtMidnight) AS exam_time FROM course WHERE exam_time > -1 GROUP BY course.course_id ORDER BY time")
fun getAllCoursesWithExams(time: Long = QwarkUtil.timeAtMidnight + 25200000L): LiveData<List<CourseExam>> fun getAllCoursesWithExams(timeAtMidnight: Long = QwarkUtil.timeAtMidnight): LiveData<List<CourseExam>>
@Query("SELECT *, -1 AS exam_time FROM course WHERE course_id != :u ORDER BY time") @Query("SELECT *, -1 AS exam_time FROM course WHERE course_id != :u ORDER BY time")
fun getAllCourses(u: Int = -1): List<CourseExam> // the u variable is an unnecessary workaround to return a list instead of LiveData fun getAllCourses(u: Int = -1): List<CourseExam> // the u variable is an unnecessary workaround to return a list instead of LiveData
@@ -1,6 +1,7 @@
package com.denizd.qwark.util package com.denizd.qwark.util
import android.annotation.TargetApi import android.annotation.TargetApi
import android.app.IntentService
import android.app.NotificationChannel import android.app.NotificationChannel
import android.app.NotificationManager import android.app.NotificationManager
import android.app.PendingIntent import android.app.PendingIntent
@@ -8,43 +9,40 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.os.Build import android.os.Build
import android.util.Log
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.work.Worker
import androidx.work.WorkerParameters
import com.denizd.qwark.R import com.denizd.qwark.R
import com.denizd.qwark.activity.MainActivity import com.denizd.qwark.activity.MainActivity
private const val notificationChannelId = "qwark_exam_notification" private const val notificationChannelId = "qwark_exam_notification"
class ExamNotificationWorker(private val context: Context, workerParams: WorkerParameters) : Worker(context.applicationContext, workerParams) { class ExamService : IntentService("ExamService") {
override fun doWork(): Result { override fun onHandleIntent(intent: Intent?) {
sendNotification(course = inputData.getString("course") ?: "error") sendNotification(course = intent?.getStringExtra("course") ?: "error")
return Result.success()
} }
// TODO launch fragment from intent and launch the fragment for the course
private fun sendNotification(course: String) { private fun sendNotification(course: String) {
val openAppPending = PendingIntent.getActivity( val openAppPending = PendingIntent.getActivity(
context, 0, this, 0,
Intent(context, MainActivity::class.java).also { intent -> Intent(this, MainActivity::class.java).also { intent ->
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + Intent.FLAG_ACTIVITY_CLEAR_TASK intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + Intent.FLAG_ACTIVITY_CLEAR_TASK
}, 0 }, 0
) )
val notificationService = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val notificationService = this.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createNotificationChannel(context, notificationService) createNotificationChannel(this, notificationService)
} }
val notification = NotificationCompat.Builder(context, notificationChannelId) val notification = NotificationCompat.Builder(this, notificationChannelId)
// .setStyle(NotificationCompat.BigTextStyle()) // .setStyle(NotificationCompat.BigTextStyle())
.setContentTitle(context.getString(R.string.exam_reminder, course)) .setContentTitle(this.getString(R.string.exam_reminder, course))
.setContentText(context.getString(R.string.writing_an_exam_today, course)) .setContentText(this.getString(R.string.writing_an_exam_today, course))
.setContentIntent(openAppPending) .setContentIntent(openAppPending)
.setAutoCancel(true) .setAutoCancel(true)
.setColor(context.getColor(R.color.colorAccent)) .setColor(this.getColor(R.color.colorAccent))
.setSmallIcon(R.drawable.bolt) .setSmallIcon(R.drawable.bolt)
.build() .build()
@@ -54,7 +52,8 @@ class ExamNotificationWorker(private val context: Context, workerParams: WorkerP
@TargetApi(26) @TargetApi(26)
private fun createNotificationChannel(context: Context, notificationManager: NotificationManager) { private fun createNotificationChannel(context: Context, notificationManager: NotificationManager) {
if (!Dependencies.repo.prefs.getIsNotificationChannelCreated()) { if (!Dependencies.repo.prefs.getIsNotificationChannelCreated()) {
notificationManager.createNotificationChannel(NotificationChannel( notificationManager.createNotificationChannel(
NotificationChannel(
notificationChannelId, context.getString(R.string.exams), NotificationManager.IMPORTANCE_DEFAULT notificationChannelId, context.getString(R.string.exams), NotificationManager.IMPORTANCE_DEFAULT
).also { channel -> ).also { channel ->
channel.enableLights(true) channel.enableLights(true)
+1
View File
@@ -19,6 +19,7 @@
<string name="exams">Klausuren</string> <string name="exams">Klausuren</string>
<string name="exam_reminder">Klausurerinnerung: %s</string> <string name="exam_reminder">Klausurerinnerung: %s</string>
<string name="writing_an_exam_today">Heute schreibst du eine Klausur in %s!</string> <string name="writing_an_exam_today">Heute schreibst du eine Klausur in %s!</string>
<string name="exam_service_description">Verschickt Benachrichtigungen für anstehende Klausuren</string>
<!-- CourseFragment.kt --> <!-- CourseFragment.kt -->
<string name="course">Kurs</string> <string name="course">Kurs</string>
+1
View File
@@ -21,6 +21,7 @@
<string name="exams">Exams</string> <string name="exams">Exams</string>
<string name="exam_reminder">Exam reminder: %s</string> <string name="exam_reminder">Exam reminder: %s</string>
<string name="writing_an_exam_today">You\'re writing an exam in %s today!</string> <string name="writing_an_exam_today">You\'re writing an exam in %s today!</string>
<string name="exam_service_description">Sends notifications for upcoming exams</string>
<string-array name="greetings"> <string-array name="greetings">
<item>Hello %s!</item> <item>Hello %s!</item>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<androidx.appcompat>
<appcompat versions="1.0.0-alpha1,1.0.0-alpha3,1.0.0-beta01,1.0.0-rc01,1.0.0-rc02,1.0.0,1.0.1,1.0.2,1.1.0-alpha01,1.1.0-alpha02,1.1.0-alpha03,1.1.0-alpha04,1.1.0-alpha05,1.1.0-beta01,1.1.0-rc01,1.1.0,1.2.0-alpha01,1.2.0-alpha02,1.2.0-alpha03"/>
<appcompat-resources versions="1.1.0-alpha03,1.1.0-alpha04,1.1.0-alpha05,1.1.0-beta01,1.1.0-rc01,1.1.0,1.2.0-alpha01,1.2.0-alpha02,1.2.0-alpha03"/>
</androidx.appcompat>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<androidx.constraintlayout>
<constraintlayout-solver versions="1.1.0,1.1.1,1.1.2,1.1.3,2.0.0-alpha1,2.0.0-alpha2,2.0.0-alpha3,2.0.0-alpha4,2.0.0-alpha5,2.0.0-beta1,2.0.0-beta2,2.0.0-beta3,2.0.0-beta4"/>
<constraintlayout versions="1.1.0,1.1.1,1.1.2,1.1.3,2.0.0-alpha1,2.0.0-alpha2,2.0.0-alpha3,2.0.0-alpha4,2.0.0-alpha5,2.0.0-beta1,2.0.0-beta2,2.0.0-beta3,2.0.0-beta4"/>
</androidx.constraintlayout>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<androidx.core>
<core-ktx versions="0.1,0.2,0.3,1.0.0-alpha1,1.0.0-alpha3,1.0.0-beta01,1.0.0-rc01,1.0.0-rc02,1.0.0,1.0.1,1.0.2,1.1.0-alpha02,1.1.0-alpha03,1.1.0-alpha04,1.1.0-alpha05,1.1.0-beta01,1.1.0-rc01,1.1.0-rc02,1.1.0-rc03,1.1.0,1.2.0-alpha01,1.2.0-alpha02,1.2.0-alpha03,1.2.0-alpha04,1.2.0-beta01,1.2.0-beta02,1.2.0-rc01,1.2.0,1.3.0-alpha01,1.3.0-alpha02"/>
<core versions="1.0.0-alpha1,1.0.0-alpha2,1.0.0-alpha3,1.0.0-beta01,1.0.0-rc01,1.0.0-rc02,1.0.0,1.0.1,1.0.2,1.1.0-alpha01,1.1.0-alpha02,1.1.0-alpha03,1.1.0-alpha04,1.1.0-alpha05,1.1.0-beta01,1.1.0-rc01,1.1.0-rc02,1.1.0-rc03,1.1.0,1.2.0-alpha01,1.2.0-alpha02,1.2.0-alpha03,1.2.0-alpha04,1.2.0-beta01,1.2.0-beta02,1.2.0-rc01,1.2.0,1.3.0-alpha01,1.3.0-alpha02"/>
<core-role versions="1.0.0-alpha01,1.0.0-beta01"/>
</androidx.core>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<androidx.fragment>
<fragment-ktx versions="1.0.0-alpha1,1.0.0-alpha3,1.0.0-beta01,1.0.0-rc01,1.0.0-rc02,1.0.0,1.1.0-alpha01,1.1.0-alpha02,1.1.0-alpha03,1.1.0-alpha04,1.1.0-alpha05,1.1.0-alpha06,1.1.0-alpha07,1.1.0-alpha08,1.1.0-alpha09,1.1.0-beta01,1.1.0-rc01,1.1.0-rc02,1.1.0-rc03,1.1.0-rc04,1.1.0,1.2.0-alpha01,1.2.0-alpha02,1.2.0-alpha03,1.2.0-alpha04,1.2.0-beta01,1.2.0-beta02,1.2.0-rc01,1.2.0-rc02,1.2.0-rc03,1.2.0-rc04,1.2.0-rc05,1.2.0,1.2.1,1.2.2,1.3.0-alpha01"/>
<fragment versions="1.0.0-alpha1,1.0.0-alpha3,1.0.0-beta01,1.0.0-rc01,1.0.0-rc02,1.0.0,1.1.0-alpha01,1.1.0-alpha02,1.1.0-alpha03,1.1.0-alpha04,1.1.0-alpha05,1.1.0-alpha06,1.1.0-alpha07,1.1.0-alpha08,1.1.0-alpha09,1.1.0-beta01,1.1.0-rc01,1.1.0-rc02,1.1.0-rc03,1.1.0-rc04,1.1.0,1.2.0-alpha01,1.2.0-alpha02,1.2.0-alpha03,1.2.0-alpha04,1.2.0-beta01,1.2.0-beta02,1.2.0-rc01,1.2.0-rc02,1.2.0-rc03,1.2.0-rc04,1.2.0-rc05,1.2.0,1.2.1,1.2.2,1.3.0-alpha01"/>
<fragment-testing versions="1.1.0-alpha01,1.1.0-alpha02,1.1.0-alpha03,1.1.0-alpha04,1.1.0-alpha05,1.1.0-alpha06,1.1.0-alpha07,1.1.0-alpha08,1.1.0-alpha09,1.1.0-beta01,1.1.0-rc01,1.1.0-rc02,1.1.0-rc03,1.1.0-rc04,1.1.0,1.2.0-alpha01,1.2.0-alpha02,1.2.0-alpha03,1.2.0-alpha04,1.2.0-beta01,1.2.0-beta02,1.2.0-rc01,1.2.0-rc02,1.2.0-rc03,1.2.0-rc04,1.2.0-rc05,1.2.0,1.2.1,1.2.2,1.3.0-alpha01"/>
</androidx.fragment>
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<androidx.lifecycle>
<lifecycle-reactivestreams-ktx versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-alpha03,2.2.0-alpha04,2.2.0-alpha05,2.2.0-beta01,2.2.0-rc01,2.2.0-rc02,2.2.0-rc03,2.2.0,2.3.0-alpha01"/>
<lifecycle-viewmodel versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-alpha03,2.2.0-alpha04,2.2.0-alpha05,2.2.0-beta01,2.2.0-rc01,2.2.0-rc02,2.2.0-rc03,2.2.0,2.3.0-alpha01"/>
<lifecycle-process versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-alpha03,2.2.0-alpha04,2.2.0-alpha05,2.2.0-beta01,2.2.0-rc01,2.2.0-rc02,2.2.0-rc03,2.2.0,2.3.0-alpha01"/>
<lifecycle-viewmodel-ktx versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-alpha03,2.2.0-alpha04,2.2.0-alpha05,2.2.0-beta01,2.2.0-rc01,2.2.0-rc02,2.2.0-rc03,2.2.0,2.3.0-alpha01"/>
<lifecycle-reactivestreams versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-alpha03,2.2.0-alpha04,2.2.0-alpha05,2.2.0-beta01,2.2.0-rc01,2.2.0-rc02,2.2.0-rc03,2.2.0,2.3.0-alpha01"/>
<lifecycle-common-java8 versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-alpha03,2.2.0-alpha04,2.2.0-alpha05,2.2.0-beta01,2.2.0-rc01,2.2.0-rc02,2.2.0-rc03,2.2.0,2.3.0-alpha01"/>
<lifecycle-extensions versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-alpha03,2.2.0-alpha04,2.2.0-alpha05,2.2.0-beta01,2.2.0-rc01,2.2.0-rc02,2.2.0-rc03,2.2.0"/>
<lifecycle-livedata-core versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-alpha03,2.2.0-alpha04,2.2.0-alpha05,2.2.0-beta01,2.2.0-rc01,2.2.0-rc02,2.2.0-rc03,2.2.0,2.3.0-alpha01"/>
<lifecycle-runtime versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-alpha03,2.2.0-alpha04,2.2.0-alpha05,2.2.0-beta01,2.2.0-rc01,2.2.0-rc02,2.2.0-rc03,2.2.0,2.3.0-alpha01"/>
<lifecycle-compiler versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-alpha03,2.2.0-alpha04,2.2.0-alpha05,2.2.0-beta01,2.2.0-rc01,2.2.0-rc02,2.2.0-rc03,2.2.0,2.3.0-alpha01"/>
<lifecycle-livedata versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-alpha03,2.2.0-alpha04,2.2.0-alpha05,2.2.0-beta01,2.2.0-rc01,2.2.0-rc02,2.2.0-rc03,2.2.0,2.3.0-alpha01"/>
<lifecycle-common versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-alpha03,2.2.0-alpha04,2.2.0-alpha05,2.2.0-beta01,2.2.0-rc01,2.2.0-rc02,2.2.0-rc03,2.2.0,2.3.0-alpha01"/>
<lifecycle-service versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-alpha03,2.2.0-alpha04,2.2.0-alpha05,2.2.0-beta01,2.2.0-rc01,2.2.0-rc02,2.2.0-rc03,2.2.0,2.3.0-alpha01"/>
<lifecycle-livedata-ktx versions="2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-alpha03,2.2.0-alpha04,2.2.0-alpha05,2.2.0-beta01,2.2.0-rc01,2.2.0-rc02,2.2.0-rc03,2.2.0,2.3.0-alpha01"/>
<lifecycle-livedata-core-ktx versions="2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-alpha03,2.2.0-alpha04,2.2.0-alpha05,2.2.0-beta01,2.2.0-rc01,2.2.0-rc02,2.2.0-rc03,2.2.0,2.3.0-alpha01"/>
<lifecycle-viewmodel-savedstate versions="1.0.0-alpha01,1.0.0-alpha02,1.0.0-alpha03,1.0.0-alpha04,1.0.0-alpha05,1.0.0-beta01,1.0.0-rc01,1.0.0-rc02,1.0.0-rc03,1.0.0,2.2.0,2.3.0-alpha01"/>
<lifecycle-runtime-ktx versions="2.2.0-alpha01,2.2.0-alpha02,2.2.0-alpha03,2.2.0-alpha04,2.2.0-alpha05,2.2.0-beta01,2.2.0-rc01,2.2.0-rc02,2.2.0-rc03,2.2.0,2.3.0-alpha01"/>
<lifecycle-runtime-testing versions="2.3.0-alpha01"/>
</androidx.lifecycle>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<androidx.preference>
<preference versions="1.0.0-alpha1,1.0.0-alpha3,1.0.0-beta01,1.0.0-rc01,1.0.0-rc02,1.0.0,1.1.0-alpha01,1.1.0-alpha02,1.1.0-alpha03,1.1.0-alpha04,1.1.0-alpha05,1.1.0-beta01,1.1.0-rc01,1.1.0"/>
<preference-ktx versions="1.0.0-alpha3,1.0.0-beta01,1.0.0-rc01,1.0.0-rc02,1.0.0,1.1.0-alpha02,1.1.0-alpha03,1.1.0-alpha04,1.1.0-alpha05,1.1.0-beta01,1.1.0-rc01,1.1.0"/>
</androidx.preference>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<androidx.recyclerview>
<recyclerview-selection versions="1.0.0-alpha1,1.0.0-alpha3,1.0.0-beta01,1.0.0-rc01,1.0.0-rc02,1.0.0,1.1.0-alpha01,1.1.0-alpha05,1.1.0-alpha06,1.1.0-beta01,1.1.0-rc01"/>
<recyclerview versions="1.0.0-alpha1,1.0.0-alpha3,1.0.0-beta01,1.0.0-rc01,1.0.0-rc02,1.0.0,1.1.0-alpha01,1.1.0-alpha02,1.1.0-alpha03,1.1.0-alpha04,1.1.0-alpha05,1.1.0-alpha06,1.1.0-beta01,1.1.0-beta02,1.1.0-beta03,1.1.0-beta04,1.1.0-beta05,1.1.0-rc01,1.1.0,1.2.0-alpha01"/>
</androidx.recyclerview>
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<androidx.room>
<room-rxjava2 versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-alpha05,2.1.0-alpha06,2.1.0-alpha07,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-beta01,2.2.0-rc01,2.2.0,2.2.1,2.2.2,2.2.3,2.2.4"/>
<room-common versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-alpha05,2.1.0-alpha06,2.1.0-alpha07,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-beta01,2.2.0-rc01,2.2.0,2.2.1,2.2.2,2.2.3,2.2.4"/>
<room-compiler versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-alpha05,2.1.0-alpha06,2.1.0-alpha07,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-beta01,2.2.0-rc01,2.2.0,2.2.1,2.2.2,2.2.3,2.2.4"/>
<room-guava versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-alpha05,2.1.0-alpha06,2.1.0-alpha07,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-beta01,2.2.0-rc01,2.2.0,2.2.1,2.2.2,2.2.3,2.2.4"/>
<room-migration versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-alpha05,2.1.0-alpha06,2.1.0-alpha07,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-beta01,2.2.0-rc01,2.2.0,2.2.1,2.2.2,2.2.3,2.2.4"/>
<room-testing versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-alpha05,2.1.0-alpha06,2.1.0-alpha07,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-beta01,2.2.0-rc01,2.2.0,2.2.1,2.2.2,2.2.3,2.2.4"/>
<room-runtime versions="2.0.0-alpha1,2.0.0-beta01,2.0.0-rc01,2.0.0,2.1.0-alpha01,2.1.0-alpha02,2.1.0-alpha03,2.1.0-alpha04,2.1.0-alpha05,2.1.0-alpha06,2.1.0-alpha07,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-beta01,2.2.0-rc01,2.2.0,2.2.1,2.2.2,2.2.3,2.2.4"/>
<room-coroutines versions="2.1.0-alpha03,2.1.0-alpha04"/>
<room-ktx versions="2.1.0-alpha05,2.1.0-alpha06,2.1.0-alpha07,2.1.0-beta01,2.1.0-rc01,2.1.0,2.2.0-alpha01,2.2.0-alpha02,2.2.0-beta01,2.2.0-rc01,2.2.0,2.2.1,2.2.2,2.2.3,2.2.4"/>
</androidx.room>
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<com.google.android.material>
<material versions="1.0.0-alpha1,1.0.0-alpha3,1.0.0-beta01,1.0.0-rc01,1.0.0-rc02,1.0.0,1.1.0-alpha01,1.1.0-alpha02,1.1.0-alpha03,1.1.0-alpha04,1.1.0-alpha05,1.1.0-alpha06,1.1.0-alpha07,1.1.0-alpha08,1.1.0-alpha09,1.1.0-alpha10,1.1.0-beta01,1.1.0-beta02,1.1.0-rc01,1.1.0-rc02,1.1.0,1.2.0-alpha01,1.2.0-alpha02,1.2.0-alpha03,1.2.0-alpha04,1.2.0-alpha05"/>
</com.google.android.material>
@@ -0,0 +1,144 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<com.android.support.constraint/>
<com.android.databinding/>
<com.android.support/>
<com.android.support.test/>
<com.android.support.test.janktesthelper/>
<com.android.support.test.uiautomator/>
<com.android.support.test.espresso/>
<android.arch.persistence.room/>
<android.arch.lifecycle/>
<android.arch.core/>
<com.google.android.instantapps/>
<com.google.android.instantapps.thirdpartycompat/>
<com.android.java.tools.build/>
<com.android.tools/>
<com.android.tools.layoutlib/>
<com.android.tools.ddms/>
<com.android.tools.external.com-intellij/>
<com.android.tools.build/>
<com.android.tools.analytics-library/>
<com.android.tools.internal.build.test/>
<com.android.tools.lint/>
<com.android.tools.external.org-jetbrains/>
<com.android.support.test.espresso.idling/>
<com.android.support.test.services/>
<com.google.firebase/>
<com.google.android.gms/>
<com.google.gms/>
<android.arch.paging/>
<com.crashlytics.sdk.android/>
<io.fabric.sdk.android/>
<android.arch.persistence/>
<com.google.android.wearable/>
<com.google.android.support/>
<com.android.installreferrer/>
<com.google.ar/>
<androidx.core/>
<com.google.android.things/>
<com.android.tools.build.jetifier/>
<tools.base.build-system.debug/>
<androidx.databinding/>
<androidx.constraintlayout/>
<org.chromium.net/>
<com.google.android.play/>
<androidx.multidex/>
<com.google.android.material/>
<androidx.test.services/>
<androidx.test.janktesthelper/>
<androidx.test/>
<androidx.test.espresso/>
<androidx.test.espresso.idling/>
<androidx.test.uiautomator/>
<androidx.room/>
<androidx.paging/>
<androidx.lifecycle/>
<androidx.sqlite/>
<androidx.arch.core/>
<android.arch.work/>
<android.arch.navigation/>
<androidx.mediarouter/>
<androidx.percentlayout/>
<androidx.emoji/>
<androidx.cardview/>
<androidx.preference/>
<androidx.wear/>
<androidx.legacy/>
<androidx.documentfile/>
<androidx.car/>
<androidx.swiperefreshlayout/>
<androidx.leanback/>
<androidx.appcompat/>
<androidx.customview/>
<androidx.gridlayout/>
<androidx.vectordrawable/>
<androidx.heifwriter/>
<androidx.transition/>
<androidx.print/>
<androidx.viewpager/>
<androidx.annotation/>
<androidx.exifinterface/>
<androidx.dynamicanimation/>
<androidx.browser/>
<androidx.localbroadcastmanager/>
<androidx.asynclayoutinflater/>
<androidx.contentpager/>
<androidx.slidingpanelayout/>
<androidx.cursoradapter/>
<androidx.media/>
<androidx.loader/>
<androidx.interpolator/>
<androidx.coordinatorlayout/>
<androidx.fragment/>
<androidx.tvprovider/>
<androidx.slice/>
<androidx.collection/>
<androidx.recommendation/>
<androidx.drawerlayout/>
<androidx.recyclerview/>
<androidx.webkit/>
<androidx.palette/>
<com.google.ar.sceneform/>
<com.google.ar.sceneform.ux/>
<androidx.test.ext/>
<com.google.android.ads.consent/>
<androidx.versionedparcelable/>
<androidx.media2/>
<com.google.ads.afsn/>
<com.google.android.ads/>
<androidx.biometric/>
<androidx.concurrent/>
<androidx.activity/>
<com.android.tools.apkparser/>
<com.android.tools.pixelprobe/>
<androidx.textclassifier/>
<androidx.remotecallback/>
<com.android.tools.chunkio/>
<com.android.tools.fakeadbserver/>
<androidx.savedstate/>
<com.google.android.libraries.places/>
<androidx.viewpager2/>
<androidx.navigation/>
<androidx.work/>
<androidx.sharetarget/>
<androidx.enterprise/>
<androidx.camera/>
<androidx.benchmark/>
<androidx.security/>
<com.google.android.datatransport/>
<zipflinger/>
<androidx.autofill/>
<androidx.ads/>
<com.android/>
<com.google.ads.interactivemedia.v3/>
<androidx.ui/>
<androidx.compose/>
<com.google.androidbrowserhelper/>
<org.jetbrains.kotlin/>
<com.google.prefab/>
<com.android.billingclient/>
<com.android.ndk.thirdparty/>
<com.google.oboe/>
<androidx.window/>
</metadata>
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<org.jetbrains.kotlin>
<kotlin-compiler-embeddable versions="1.3.60-dev-withExperimentalGoogleExtensions-20191016,1.3.61-dev-withExperimentalGoogleExtensions-20191127,1.3.61-dev-withExperimentalGoogleExtensions-20200129"/>
</org.jetbrains.kotlin>
@@ -0,0 +1,143 @@
<?xml version="1.0" ?>
<sdk_metadata>
<library groupId="com.urbanairship.android" artifactId="urbanairship-sdk" recommended-version="9.3.1" >
<versions from="9.1.0" status="deprecated" version-literal="!SDK-VERSION-STRING!:com.urbanairship.android:urbanairship-sdk:9.1.0" />
<versions from="9.0.0" to="9.0.4" status="deprecated" description="Version is known issues with in-app automation. Please update to version &lt;current&gt; as soon as possible." />
<versions from="8.9.1" to="8.9.2" status="deprecated" description="Version is known to have stability issues. Please update to version &lt;current&gt; as soon as possible. See &lt;url&gt; for more details." url="https://github.com/urbanairship/android-library/blob/master/CHANGELOG.md#version-893---october-17-2017" />
<versions from="6.1.4" to="8.7.0" status="deprecated" description="Version is known to have Android O compatibility issues. Please update to version &lt;current&gt; as soon as possible." />
<versions from="9.3.0" status="deprecated" version-literal="!SDK-VERSION-STRING!:com.urbanairship.android:urbanairship-sdk:9.3.0" />
<versions from="9.3.1" status="recommended" version-literal="!SDK-VERSION-STRING!:com.urbanairship.android:urbanairship-sdk:9.3.1" />
</library>
<library groupId="com.urbanairship.android" artifactId="urbanairship-core" recommended-version="9.3.1" >
<versions from="9.1.0" status="deprecated" version-literal="!SDK-VERSION-STRING!:com.urbanairship.android:urbanairship-core:9.1.0" />
<versions from="9.3.0" status="deprecated" version-literal="!SDK-VERSION-STRING!:com.urbanairship.android:urbanairship-core:9.3.0" />
<versions from="9.3.1" status="recommended" version-literal="!SDK-VERSION-STRING!:com.urbanairship.android:urbanairship-core:9.3.1" />
</library>
<library groupId="com.urbanairship.android" artifactId="urbanairship-fcm" recommended-version="9.3.1" >
<versions from="9.1.0" status="deprecated" version-literal="!SDK-VERSION-STRING!:com.urbanairship.android:urbanairship-fcm:9.1.0" />
<versions from="9.3.0" status="deprecated" version-literal="!SDK-VERSION-STRING!:com.urbanairship.android:urbanairship-fcm:9.3.0" />
<versions from="9.3.1" status="recommended" version-literal="!SDK-VERSION-STRING!:com.urbanairship.android:urbanairship-fcm:9.3.1" />
</library>
<library groupId="com.urbanairship.android" artifactId="urbanairship-gcm" recommended-version="9.3.1" >
<versions from="9.1.0" status="deprecated" version-literal="!SDK-VERSION-STRING!:com.urbanairship.android:urbanairship-gcm:9.1.0" />
<versions from="9.3.0" status="deprecated" version-literal="!SDK-VERSION-STRING!:com.urbanairship.android:urbanairship-gcm:9.3.0" />
<versions from="9.3.1" status="recommended" version-literal="!SDK-VERSION-STRING!:com.urbanairship.android:urbanairship-gcm:9.3.1" />
</library>
<library groupId="com.urbanairship.android" artifactId="urbanairship-adm" recommended-version="9.3.1" >
<versions from="9.1.0" status="deprecated" version-literal="!SDK-VERSION-STRING!:com.urbanairship.android:urbanairship-adm:9.1.0" />
<versions from="9.3.0" status="recommended" version-literal="!SDK-VERSION-STRING!:com.urbanairship.android:urbanairship-adm:9.3.0" />
<versions from="9.3.1" status="recommended" version-literal="!SDK-VERSION-STRING!:com.urbanairship.android:urbanairship-adm:9.3.1" />
</library>
<library groupId="com.tune" artifactId="tune-marketing-console-sdk" recommended-version="5.3.0" >
<versions from="5.3.0" version-literal="com.tune.BuildConfig.5.3.0" description="Bug affecting SDK data quality" />
<versions from="5.2.1" version-literal="com.tune.BuildConfig.5.2.1" />
<versions from="5.2.0" version-literal="com.tune.BuildConfig.5.2.0" />
<versions from="5.1.1" status="deprecated" version-literal="com.tune.BuildConfig.5.1.1" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="5.0.0" to="5.0.2" status="deprecated" version-literal="com.tune.BuildConfig.5.0.0" description="Bug affecting SDK data quality" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="4.15.2" to="4.16.0" status="deprecated" version-literal="com.tune.BuildConfig.4.15.2" description="Bug affecting SDK data quality" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="4.15.1" version-literal="com.tune.BuildConfig.4.15.1" description="Bug affecting SDK performance" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="4.15.0" version-literal="com.tune.BuildConfig.4.15.0" description="Bug affecting SDK performance" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="4.14.0" version-literal="com.tune.BuildConfig.4.14.0" description="Bug affecting SDK performance" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="4.13.0" status="deprecated" version-literal="com.tune.BuildConfig.4.13.0" description="Bug affecting app stability" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="4.12.1" status="deprecated" version-literal="com.tune.BuildConfig.4.12.1" description="Bug affecting app stability" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="4.12.0" status="deprecated" version-literal="com.tune.BuildConfig.4.12.0" description="Bug affecting app stability" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="4.11.1" status="deprecated" version-literal="com.tune.BuildConfig.4.11.1" description="Bug affecting app stability" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="4.11.0" status="deprecated" version-literal="com.tune.BuildConfig.4.11.0" description="Bug affecting app stability" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="4.10.2" version-literal="com.tune.BuildConfig.4.10.2" description="Bug affecting app stability" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="4.10.1" version-literal="com.tune.BuildConfig.4.10.1" description="Bug affecting app stability" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="4.10.0" version-literal="com.tune.BuildConfig.4.10.0" description="Bug affecting app stability" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="4.9.0" version-literal="com.tune.BuildConfig.4.9.0" description="Bug affecting app stability" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="4.8.0" to="4.8.1" version-literal="com.tune.BuildConfig.4.8.0" description="Bug affecting app stability" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="4.0.0" to="4.7.1" status="deprecated" version-literal="com.tune.BuildConfig.4.0.0" description="Bug affecting app stability" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="3.0.0" to="3.11.4" status="deprecated" version-literal="com.tune.BuildConfig.3.0.0" description="Bug affecting app stability" url="https://developers.tune.com/sdk/migrating-to-android-4-8-0-and-above/" />
<versions from="0.0.0" to="3.0.0" status="deprecated" description="Bug affecting app stability" />
</library>
<library groupId="com.android.volley" artifactId="volley" recommended-version="1.1.0" >
<versions from="1.1.0" />
<versions from="1.1.0-rc2" status="deprecated" description="Bug affecting app stability" url="https://github.com/google/volley/releases" />
<versions from="1.1.0-rc1" status="deprecated" description="Bug affecting app stability" url="https://github.com/google/volley/releases" />
<versions from="1.0.0" status="deprecated" description="Bug affecting app stability" url="https://github.com/google/volley/releases" />
</library>
<library groupId="com.google.guava" artifactId="guava" recommended-version="24.1-jre" >
<versions from="24.1-jre" />
</library>
<library groupId="com.google.guava" artifactId="guava" recommended-version="25.0-android" >
<versions from="25.0-android" />
<versions from="24.1.1-android" status="insecure" description="Moderate security vulnerability" url="https://github.com/google/guava/wiki/CVE-2018-10237" />
<versions from="24.1-android" status="deprecated" description="Bug affecting app performance" url="https://github.com/google/guava/releases" />
<versions from="24.0-android" status="deprecated" description="Bug affecting app performance" url="https://github.com/google/guava/releases" />
</library>
<library groupId="com.google.firebase" artifactId="firebase-analytics" recommended-version="15.0.0" >
<versions from="15.0.0" />
<versions from="12.0.1" />
<versions from="12.0.0" />
<versions from="11.8.0" />
<versions from="11.6.2" />
<versions from="11.6.0" />
<versions from="11.4.2" />
<versions from="11.4.0" />
<versions from="11.2.2" />
<versions from="11.2.0" />
<versions from="11.0.4" />
<versions from="11.0.2" />
<versions from="11.0.1" />
<versions from="11.0.0" />
<versions from="10.2.6" />
<versions from="10.2.4" />
<versions from="10.2.1" />
<versions from="10.2.0" />
<versions from="10.0.1" />
<versions from="10.0.0" />
<versions from="9.8.0" />
<versions from="9.6.1" />
<versions from="9.6.0" />
<versions from="9.4.0" />
<versions from="9.2.1" />
<versions from="9.2.0" />
<versions from="9.0.2" />
<versions from="9.0.1" />
<versions from="9.0.0" />
</library>
<library groupId="com.google.dagger" artifactId="dagger-android" recommended-version="2.15" >
<versions from="2.15" />
<versions from="2.14.1" status="deprecated" description="Bug affecting SDK performance" url="https://github.com/google/dagger/releases/tag/2.15" />
<versions from="2.14" status="deprecated" description="Bug affecting SDK performance" url="https://github.com/google/dagger/releases/tag/2.15" />
<versions from="2.13" status="deprecated" description="Bug affecting app performance" url="https://github.com/google/dagger/releases/tag/2.15" />
<versions from="2.12" status="deprecated" description="Bug affecting app performance" url="https://github.com/google/dagger/releases/tag/2.15" />
<versions from="2.11" status="deprecated" description="Bug affecting SDK performance" url="https://github.com/google/dagger/releases/tag/2.15" />
<versions from="2.11-rc2" status="deprecated" description="Bug affecting SDK performance" url="https://github.com/google/dagger/releases/tag/2.15" />
<versions from="2.11-rc1" status="deprecated" description="Bug affecting SDK performance" url="https://github.com/google/dagger/releases/tag/2.15" />
<versions from="2.10" status="deprecated" url="https://github.com/google/dagger/releases/tag/2.15" />
</library>
<library groupId="AppsFlyer" artifactId="af-android-sdk" recommended-version="4.8.10" >
<versions from="4.8.9" version-literal="!SDK-VERSION-STRING!:com.appsflyer:af-android-sdk:4.8.9" />
<versions from="4.8.10" version-literal="!SDK-VERSION-STRING!:com.appsflyer:af-android-sdk:4.8.10" />
</library>
<library groupId="com.kochava" artifactId="tracker" recommended-version="3.4.0" >
<versions from="3.4.0" />
<versions from="3.3.1" version-literal="&quot;AndroidTracker 3.3.1&quot;, &quot;control.kochava.com&quot;" />
<versions from="3.3.0" version-literal="&quot;AndroidTracker 3.3.0&quot;, &quot;control.kochava.com&quot;" />
<versions from="3.2.0" version-literal="&quot;AndroidTracker 3.2.0&quot;, &quot;control.kochava.com&quot;" />
<versions from="3.1.1" version-literal="&quot;AndroidTracker 3.1.1&quot;, &quot;control.kochava.com&quot;" />
<versions from="3.1.0" status="deprecated" version-literal="&quot;AndroidTracker 3.1.0&quot;, &quot;control.kochava.com&quot;" description="Bug affecting SDK performance" />
<versions from="3.0.0" status="deprecated" version-literal="&quot;AndroidTracker 3.0.0&quot;, &quot;control.kochava.com&quot;" description="Bug affecting SDK performance" />
<versions from="20170303" status="deprecated" version-literal="&quot;Android20170303&quot;, &quot;control.kochava.com&quot;" description="Bug affecting SDK performance" />
<versions from="20170216" status="deprecated" version-literal="&quot;Android20170216&quot;, &quot;control.kochava.com&quot;" description="Bug affecting SDK performance" />
<versions from="20170127" status="deprecated" version-literal="&quot;Android20170127&quot;, &quot;control.kochava.com&quot;" description="Bug affecting SDK performance" />
<versions from="20170106" status="deprecated" version-literal="&quot;Android20170106&quot;, &quot;control.kochava.com&quot;" description="Bug affecting SDK performance" />
<versions from="20161122" status="deprecated" version-literal="&quot;Android20161122&quot;, &quot;control.kochava.com&quot;" description="Bug affecting SDK performance" />
<versions from="20160914" status="deprecated" version-literal="&quot;Android20160914&quot;, &quot;control.kochava.com&quot;" description="Bug affecting SDK performance" />
<versions from="20160902" status="deprecated" version-literal="&quot;Android20160902&quot;, &quot;control.kochava.com&quot;" description="Bug affecting SDK performance" />
<versions from="20160811" status="deprecated" version-literal="&quot;Android20160811&quot;, &quot;control.kochava.com&quot;" description="Bug affecting SDK performance" />
<versions from="20160615" status="deprecated" version-literal="&quot;Android20160615&quot;, &quot;control.kochava.com&quot;" description="Bug affecting SDK performance" />
<versions from="20160427" status="deprecated" version-literal="&quot;Android20160427&quot;, &quot;control.kochava.com&quot;" description="Bug affecting SDK performance" />
<versions from="20160222" status="deprecated" version-literal="&quot;Android20160222&quot;, &quot;control.kochava.com&quot;" description="Bug affecting SDK performance" />
<versions from="20151109" status="deprecated" version-literal="&quot;Android20151109&quot;, &quot;control.kochava.com&quot;" description="Bug affecting SDK performance" />
<versions from="20150511" status="deprecated" version-literal="&quot;Android20150511&quot;, &quot;control.kochava.com&quot;" description="Bug affecting SDK performance" />
<versions from="20150312" status="insecure" version-literal="&quot;Android20150312&quot;, &quot;control.kochava.com&quot;" description="Moderate security vulnerability" />
<versions from="20150128" status="insecure" version-literal="&quot;Android20150128&quot;, &quot;control.kochava.com&quot;" description="Moderate security vulnerability" />
<versions from="20141023" status="insecure" version-literal="&quot;Android20141023&quot;, &quot;control.kochava.com&quot;" description="Moderate security vulnerability" />
<versions from="20140825" status="insecure" version-literal="&quot;Android20140825&quot;, &quot;control.kochava.com&quot;" description="Moderate security vulnerability" />
</library>
</sdk_metadata>