Set minSdkVersion to 24 + remove checks

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This commit is contained in:
Marcel Hibbe 2023-03-23 13:08:29 +01:00
parent fb0a6aa4ce
commit 73d3ecac0e
No known key found for this signature in database
GPG Key ID: C793F8B59F43CE7B
9 changed files with 56 additions and 125 deletions

View File

@ -42,7 +42,7 @@ android {
namespace 'com.nextcloud.talk' namespace 'com.nextcloud.talk'
defaultConfig { defaultConfig {
minSdkVersion 23 minSdkVersion 24
targetSdkVersion 31 targetSdkVersion 31
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@ -41,7 +41,6 @@ import android.text.TextUtils
import android.util.Base64 import android.util.Base64
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
import androidx.core.app.Person import androidx.core.app.Person
@ -483,19 +482,13 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
val systemNotificationId: Int = val systemNotificationId: Int =
activeStatusBarNotification?.id ?: calculateCRC32(System.currentTimeMillis().toString()).toInt() activeStatusBarNotification?.id ?: calculateCRC32(System.currentTimeMillis().toString()).toInt()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && if (TYPE_CHAT == pushMessage.type && pushMessage.notificationUser != null) {
TYPE_CHAT == pushMessage.type &&
pushMessage.notificationUser != null
) {
prepareChatNotification(notificationBuilder, activeStatusBarNotification, systemNotificationId) prepareChatNotification(notificationBuilder, activeStatusBarNotification, systemNotificationId)
addReplyAction(notificationBuilder, systemNotificationId) addReplyAction(notificationBuilder, systemNotificationId)
addMarkAsReadAction(notificationBuilder, systemNotificationId) addMarkAsReadAction(notificationBuilder, systemNotificationId)
} }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && if (TYPE_RECORDING == pushMessage.type && ncNotification != null) {
TYPE_RECORDING == pushMessage.type &&
ncNotification != null
) {
addDismissRecordingAvailableAction(notificationBuilder, systemNotificationId, ncNotification) addDismissRecordingAvailableAction(notificationBuilder, systemNotificationId, ncNotification)
addShareRecordingToChatAction(notificationBuilder, systemNotificationId, ncNotification) addShareRecordingToChatAction(notificationBuilder, systemNotificationId, ncNotification)
} }
@ -536,7 +529,6 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
return crc32.value return crc32.value
} }
@RequiresApi(api = Build.VERSION_CODES.N)
private fun prepareChatNotification( private fun prepareChatNotification(
notificationBuilder: NotificationCompat.Builder, notificationBuilder: NotificationCompat.Builder,
activeStatusBarNotification: StatusBarNotification?, activeStatusBarNotification: StatusBarNotification?,
@ -616,7 +608,6 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
} }
} }
@RequiresApi(api = Build.VERSION_CODES.N)
private fun addReplyAction(notificationBuilder: NotificationCompat.Builder, systemNotificationId: Int) { private fun addReplyAction(notificationBuilder: NotificationCompat.Builder, systemNotificationId: Int) {
val replyLabel = context!!.resources.getString(R.string.nc_reply) val replyLabel = context!!.resources.getString(R.string.nc_reply)
val remoteInput = RemoteInput.Builder(NotificationUtils.KEY_DIRECT_REPLY) val remoteInput = RemoteInput.Builder(NotificationUtils.KEY_DIRECT_REPLY)
@ -637,7 +628,6 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
notificationBuilder.addAction(replyAction) notificationBuilder.addAction(replyAction)
} }
@RequiresApi(api = Build.VERSION_CODES.N)
private fun addDismissRecordingAvailableAction( private fun addDismissRecordingAvailableAction(
notificationBuilder: NotificationCompat.Builder, notificationBuilder: NotificationCompat.Builder,
systemNotificationId: Int, systemNotificationId: Int,
@ -671,7 +661,6 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
notificationBuilder.addAction(dismissAction) notificationBuilder.addAction(dismissAction)
} }
@RequiresApi(api = Build.VERSION_CODES.N)
private fun addShareRecordingToChatAction( private fun addShareRecordingToChatAction(
notificationBuilder: NotificationCompat.Builder, notificationBuilder: NotificationCompat.Builder,
systemNotificationId: Int, systemNotificationId: Int,
@ -716,7 +705,6 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
notificationBuilder.addAction(shareRecordingAction) notificationBuilder.addAction(shareRecordingAction)
} }
@RequiresApi(api = Build.VERSION_CODES.N)
private fun getStyle(person: Person, style: NotificationCompat.MessagingStyle?): NotificationCompat.MessagingStyle { private fun getStyle(person: Person, style: NotificationCompat.MessagingStyle?): NotificationCompat.MessagingStyle {
val newStyle = NotificationCompat.MessagingStyle(person) val newStyle = NotificationCompat.MessagingStyle(person)
newStyle.conversationTitle = pushMessage.subject newStyle.conversationTitle = pushMessage.subject

View File

@ -25,11 +25,9 @@ import android.app.NotificationManager
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Build
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
import android.text.style.ForegroundColorSpan import android.text.style.ForegroundColorSpan
import android.util.Log import android.util.Log
import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
import androidx.core.app.Person import androidx.core.app.Person
@ -104,12 +102,10 @@ class DirectReplyReceiver : BroadcastReceiver() {
// unused atm // unused atm
} }
@RequiresApi(Build.VERSION_CODES.N)
override fun onNext(genericOverall: GenericOverall) { override fun onNext(genericOverall: GenericOverall) {
confirmReplySent() confirmReplySent()
} }
@RequiresApi(Build.VERSION_CODES.N)
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
Log.e(TAG, "Failed to send reply", e) Log.e(TAG, "Failed to send reply", e)
informReplyFailed() informReplyFailed()
@ -121,12 +117,10 @@ class DirectReplyReceiver : BroadcastReceiver() {
}) })
} }
@RequiresApi(Build.VERSION_CODES.N)
private fun confirmReplySent() { private fun confirmReplySent() {
appendMessageToNotification(replyMessage!!) appendMessageToNotification(replyMessage!!)
} }
@RequiresApi(Build.VERSION_CODES.N)
private fun informReplyFailed() { private fun informReplyFailed() {
val errorColor = ForegroundColorSpan(context.resources.getColor(R.color.medium_emphasis_text, context.theme)) val errorColor = ForegroundColorSpan(context.resources.getColor(R.color.medium_emphasis_text, context.theme))
val errorMessageHeader = context.resources.getString(R.string.nc_message_failed_to_send) val errorMessageHeader = context.resources.getString(R.string.nc_message_failed_to_send)
@ -134,13 +128,11 @@ class DirectReplyReceiver : BroadcastReceiver() {
appendMessageToNotification(errorMessage) appendMessageToNotification(errorMessage)
} }
@RequiresApi(Build.VERSION_CODES.N)
private fun findActiveNotification(notificationId: Int): Notification? { private fun findActiveNotification(notificationId: Int): Notification? {
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
return notificationManager.activeNotifications.find { it.id == notificationId }?.notification return notificationManager.activeNotifications.find { it.id == notificationId }?.notification
} }
@RequiresApi(Build.VERSION_CODES.N)
private fun appendMessageToNotification(reply: CharSequence) { private fun appendMessageToNotification(reply: CharSequence) {
// Implementation inspired by the SO question and article below: // Implementation inspired by the SO question and article below:
// https://stackoverflow.com/questions/51549456/android-o-notification-for-direct-reply-message // https://stackoverflow.com/questions/51549456/android-o-notification-for-direct-reply-message

View File

@ -26,9 +26,7 @@ import android.app.NotificationManager
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Build
import android.util.Log import android.util.Log
import androidx.annotation.RequiresApi
import autodagger.AutoInjector import autodagger.AutoInjector
import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.api.NcApi
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
@ -97,12 +95,10 @@ class MarkAsReadReceiver : BroadcastReceiver() {
// unused atm // unused atm
} }
@RequiresApi(Build.VERSION_CODES.N)
override fun onNext(genericOverall: GenericOverall) { override fun onNext(genericOverall: GenericOverall) {
cancelNotification(systemNotificationId!!) cancelNotification(systemNotificationId!!)
} }
@RequiresApi(Build.VERSION_CODES.N)
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
Log.e(TAG, "Failed to set chat read marker", e) Log.e(TAG, "Failed to set chat read marker", e)
} }
@ -113,7 +109,6 @@ class MarkAsReadReceiver : BroadcastReceiver() {
}) })
} }
@RequiresApi(Build.VERSION_CODES.N)
private fun cancelNotification(notificationId: Int) { private fun cancelNotification(notificationId: Int) {
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.cancel(notificationId) notificationManager.cancel(notificationId)

View File

@ -25,7 +25,6 @@ import android.content.res.Resources
import android.icu.text.RelativeDateTimeFormatter import android.icu.text.RelativeDateTimeFormatter
import android.icu.text.RelativeDateTimeFormatter.Direction import android.icu.text.RelativeDateTimeFormatter.Direction
import android.icu.text.RelativeDateTimeFormatter.RelativeUnit import android.icu.text.RelativeDateTimeFormatter.RelativeUnit
import android.os.Build
import com.nextcloud.talk.R import com.nextcloud.talk.R
import java.text.DateFormat import java.text.DateFormat
import java.util.Calendar import java.util.Calendar
@ -40,23 +39,13 @@ class DateUtils(val context: Context) {
private var format: DateFormat = DateFormat.getDateTimeInstance( private var format: DateFormat = DateFormat.getDateTimeInstance(
DateFormat.DEFAULT, // dateStyle DateFormat.DEFAULT, // dateStyle
DateFormat.SHORT, // timeStyle DateFormat.SHORT, // timeStyle
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { context.resources.configuration.locales[0]
context.resources.configuration.locales[0]
} else {
@Suppress("DEPRECATION")
context.resources.configuration.locale
}
) )
/* date formatter in local timezone and locale */ /* date formatter in local timezone and locale */
private var formatTime: DateFormat = DateFormat.getTimeInstance( private var formatTime: DateFormat = DateFormat.getTimeInstance(
DateFormat.SHORT, // timeStyle DateFormat.SHORT, // timeStyle
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { context.resources.configuration.locales[0]
context.resources.configuration.locales[0]
} else {
@Suppress("DEPRECATION")
context.resources.configuration.locale
}
) )
init { init {
@ -73,48 +62,44 @@ class DateUtils(val context: Context) {
} }
fun relativeStartTimeForLobby(timestampMilliseconds: Long, resources: Resources): String { fun relativeStartTimeForLobby(timestampMilliseconds: Long, resources: Resources): String {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { val fmt = RelativeDateTimeFormatter.getInstance()
val fmt = RelativeDateTimeFormatter.getInstance() val timeLeftMillis = timestampMilliseconds - System.currentTimeMillis()
val timeLeftMillis = timestampMilliseconds - System.currentTimeMillis() val minutes = timeLeftMillis.toDouble() / DateConstants.SECOND_DIVIDER / DateConstants.MINUTES_DIVIDER
val minutes = timeLeftMillis.toDouble() / DateConstants.SECOND_DIVIDER / DateConstants.MINUTES_DIVIDER val hours = minutes / DateConstants.HOURS_DIVIDER
val hours = minutes / DateConstants.HOURS_DIVIDER val days = hours / DateConstants.DAYS_DIVIDER
val days = hours / DateConstants.DAYS_DIVIDER
val minutesInt = minutes.roundToInt() val minutesInt = minutes.roundToInt()
val hoursInt = hours.roundToInt() val hoursInt = hours.roundToInt()
val daysInt = days.roundToInt() val daysInt = days.roundToInt()
when { return when {
daysInt > 0 -> { daysInt > 0 -> {
fmt.format( fmt.format(
daysInt.toDouble(), daysInt.toDouble(),
Direction.NEXT, Direction.NEXT,
RelativeUnit.DAYS RelativeUnit.DAYS
) )
} }
hoursInt > 0 -> { hoursInt > 0 -> {
fmt.format( fmt.format(
hoursInt.toDouble(), hoursInt.toDouble(),
Direction.NEXT, Direction.NEXT,
RelativeUnit.HOURS RelativeUnit.HOURS
) )
} }
minutesInt > 1 -> { minutesInt > 1 -> {
fmt.format( fmt.format(
minutesInt.toDouble(), minutesInt.toDouble(),
Direction.NEXT, Direction.NEXT,
RelativeUnit.MINUTES RelativeUnit.MINUTES
) )
} }
else -> { else -> {
resources.getString(R.string.nc_lobby_start_soon) resources.getString(R.string.nc_lobby_start_soon)
}
} }
} else {
""
} }
} }
} }

View File

@ -25,7 +25,6 @@ import android.content.ComponentName
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Build
import android.util.Log import android.util.Log
import android.view.View import android.view.View
import android.widget.ImageView import android.widget.ImageView
@ -184,19 +183,13 @@ class FileViewerUtils(private val context: Context, private val user: User) {
private fun openFileByExternalApp(fileName: String, mimetype: String) { private fun openFileByExternalApp(fileName: String, mimetype: String) {
val path = context.cacheDir.absolutePath + "/" + fileName val path = context.cacheDir.absolutePath + "/" + fileName
val file = File(path) val file = File(path)
val intent: Intent val intent = Intent()
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { intent.action = Intent.ACTION_VIEW
intent = Intent(Intent.ACTION_VIEW) val pdfURI = FileProvider.getUriForFile(context, context.packageName, file)
intent.setDataAndType(Uri.fromFile(file), mimetype) intent.setDataAndType(pdfURI, mimetype)
intent.flags = Intent.FLAG_ACTIVITY_NO_HISTORY intent.flags = Intent.FLAG_ACTIVITY_NO_HISTORY
} else { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
intent = Intent()
intent.action = Intent.ACTION_VIEW
val pdfURI = FileProvider.getUriForFile(context, context.packageName, file)
intent.setDataAndType(pdfURI, mimetype)
intent.flags = Intent.FLAG_ACTIVITY_NO_HISTORY
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
try { try {
if (intent.resolveActivity(context.packageManager) != null) { if (intent.resolveActivity(context.packageManager) != null) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

View File

@ -55,12 +55,7 @@ object LoggingUtils {
// emailIntent.type = TEXT_PLAIN // emailIntent.type = TEXT_PLAIN
// emailIntent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION // emailIntent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
// val uri: Uri // val uri: Uri
// // uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID, logFile)
// if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
// uri = Uri.fromFile(logFile)
// } else {
// uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID, logFile)
// }
// //
// emailIntent.putExtra(Intent.EXTRA_STREAM, uri) // emailIntent.putExtra(Intent.EXTRA_STREAM, uri)
// emailIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK // emailIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK

View File

@ -27,14 +27,15 @@ import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.PowerManager; import android.os.PowerManager;
import android.provider.Settings; import android.provider.Settings;
import autodagger.AutoInjector;
import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.application.NextcloudTalkApplication;
import javax.inject.Inject; import javax.inject.Inject;
import autodagger.AutoInjector;
@AutoInjector(NextcloudTalkApplication.class) @AutoInjector(NextcloudTalkApplication.class)
public class PowerManagerUtils { public class PowerManagerUtils {
@ -56,9 +57,7 @@ public class PowerManagerUtils {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
fullLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "nctalk:fullwakelock"); fullLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "nctalk:fullwakelock");
partialLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "nctalk:partialwakelock"); partialLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "nctalk:partialwakelock");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { proximityLock = new ProximityLock(pm);
proximityLock = new ProximityLock(pm);
}
// we suppress a possible leak because this is indeed application context // we suppress a possible leak because this is indeed application context
@SuppressLint("WifiManagerPotentialLeak") WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); @SuppressLint("WifiManagerPotentialLeak") WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
@ -127,10 +126,7 @@ public class PowerManagerUtils {
if (!wifiLock.isHeld()) { if (!wifiLock.isHeld()) {
wifiLock.acquire(); wifiLock.acquire();
} }
proximityLock.release();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
proximityLock.release();
}
break; break;
case PARTIAL: case PARTIAL:
if (!partialLock.isHeld()) { if (!partialLock.isHeld()) {
@ -142,18 +138,13 @@ public class PowerManagerUtils {
} }
fullLock.release(); fullLock.release();
proximityLock.release();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
proximityLock.release();
}
break; break;
case SLEEP: case SLEEP:
fullLock.release(); fullLock.release();
partialLock.release(); partialLock.release();
wifiLock.release(); wifiLock.release();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { proximityLock.release();
proximityLock.release();
}
break; break;
case PROXIMITY: case PROXIMITY:
if (!partialLock.isHeld()) { if (!partialLock.isHeld()) {
@ -167,9 +158,7 @@ public class PowerManagerUtils {
fullLock.release( fullLock.release(
); );
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { proximityLock.acquire();
proximityLock.acquire();
}
break; break;
default: default:
// something went very very wrong // something went very very wrong

View File

@ -21,21 +21,17 @@
package com.nextcloud.talk.utils.power; package com.nextcloud.talk.utils.power;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.os.Build;
import android.os.PowerManager; import android.os.PowerManager;
import androidx.annotation.RequiresApi;
import java.util.Optional; import java.util.Optional;
class ProximityLock { class ProximityLock {
private final Optional<PowerManager.WakeLock> proximityLock; private final Optional<PowerManager.WakeLock> proximityLock;
@RequiresApi(api = Build.VERSION_CODES.N)
ProximityLock(PowerManager pm) { ProximityLock(PowerManager pm) {
proximityLock = getProximityLock(pm); proximityLock = getProximityLock(pm);
} }
@RequiresApi(api = Build.VERSION_CODES.N)
private Optional<PowerManager.WakeLock> getProximityLock(PowerManager powerManager) { private Optional<PowerManager.WakeLock> getProximityLock(PowerManager powerManager) {
if (powerManager.isWakeLockLevelSupported(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)) { if (powerManager.isWakeLockLevelSupported(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)) {
return Optional.ofNullable(powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "nctalk:proximitylock")); return Optional.ofNullable(powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "nctalk:proximitylock"));
@ -45,7 +41,6 @@ class ProximityLock {
} }
@SuppressLint("WakelockTimeout") @SuppressLint("WakelockTimeout")
@RequiresApi(api = Build.VERSION_CODES.N)
void acquire() { void acquire() {
if (!proximityLock.isPresent() || proximityLock.get().isHeld()) { if (!proximityLock.isPresent() || proximityLock.get().isHeld()) {
return; return;
@ -54,7 +49,6 @@ class ProximityLock {
proximityLock.get().acquire(); proximityLock.get().acquire();
} }
@RequiresApi(api = Build.VERSION_CODES.N)
void release() { void release() {
if (!proximityLock.isPresent() || !proximityLock.get().isHeld()) { if (!proximityLock.isPresent() || !proximityLock.get().isHeld()) {
return; return;