target SDK 35 (Android 15)

Daniel Gultsch created

Change summary

build.gradle                                                                                |  8 
src/conversations/res/layout/activity_easy_invite.xml                                       |  1 
src/conversations/res/layout/activity_magic_create.xml                                      |  2 
src/conversations/res/layout/activity_pick_server.xml                                       |  2 
src/conversations/res/layout/activity_welcome.xml                                           |  1 
src/main/java/de/gultsch/common/MiniUri.java                                                |  2 
src/main/java/de/gultsch/minidns/DNSServer.java                                             |  6 
src/main/java/eu/siacs/conversations/services/AbstractConnectionManager.java                | 64 
src/main/java/eu/siacs/conversations/ui/ConversationActivity.java                           | 15 
src/main/java/eu/siacs/conversations/xmpp/jingle/Media.java                                 | 11 
src/main/java/eu/siacs/conversations/xmpp/jingle/RtpContentMap.java                         |  4 
src/main/java/eu/siacs/conversations/xmpp/jingle/TrackWrapper.java                          | 13 
src/main/java/eu/siacs/conversations/xmpp/jingle/VideoSourceWrapper.java                    | 17 
src/main/java/eu/siacs/conversations/xmpp/jingle/WebRTCWrapper.java                         | 10 
src/main/java/eu/siacs/conversations/xmpp/jingle/transports/WebRTCDataChannelTransport.java |  6 
src/main/res/layout-w945dp/activity_conversations.xml                                       |  1 
src/main/res/layout/activity_add_reaction.xml                                               |  3 
src/main/res/layout/activity_change_password.xml                                            |  3 
src/main/res/layout/activity_channel_discovery.xml                                          |  1 
src/main/res/layout/activity_choose_contact.xml                                             |  1 
src/main/res/layout/activity_contact_details.xml                                            |  1 
src/main/res/layout/activity_conversations.xml                                              |  1 
src/main/res/layout/activity_edit_account.xml                                               |  3 
src/main/res/layout/activity_import_backup.xml                                              |  1 
src/main/res/layout/activity_manage_accounts.xml                                            |  1 
src/main/res/layout/activity_media_browser.xml                                              |  1 
src/main/res/layout/activity_muc_details.xml                                                |  1 
src/main/res/layout/activity_muc_users.xml                                                  |  1 
src/main/res/layout/activity_publish_profile_picture.xml                                    |  3 
src/main/res/layout/activity_rtp_session.xml                                                |  3 
src/main/res/layout/activity_search.xml                                                     |  3 
src/main/res/layout/activity_settings.xml                                                   |  3 
src/main/res/layout/activity_share_location.xml                                             |  1 
src/main/res/layout/activity_share_with.xml                                                 |  1 
src/main/res/layout/activity_show_location.xml                                              |  3 
src/main/res/layout/activity_start_conversation.xml                                         |  5 
src/main/res/layout/activity_trust_keys.xml                                                 |  3 
src/main/res/values/themes.xml                                                              |  1 
src/quicksy/res/layout/activity_choose_country.xml                                          |  1 
src/quicksy/res/layout/activity_enter_name.xml                                              |  1 
src/quicksy/res/layout/activity_enter_number.xml                                            |  1 
src/quicksy/res/layout/activity_tos.xml                                                     |  1 
src/quicksy/res/layout/activity_verify.xml                                                  |  1 
43 files changed, 114 insertions(+), 98 deletions(-)

Detailed changes

build.gradle 🔗

@@ -67,7 +67,7 @@ dependencies {
     implementation "androidx.preference:preference:1.2.1"
     implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
     implementation 'com.google.android.material:material:1.13.0-alpha12'
-    implementation 'androidx.work:work-runtime:2.9.1'
+    implementation 'androidx.work:work-runtime:2.10.0'
 
     implementation "androidx.emoji2:emoji2:1.5.0"
     freeImplementation "androidx.emoji2:emoji2-bundled:1.5.0"
@@ -96,7 +96,7 @@ dependencies {
     implementation "com.squareup.retrofit2:converter-gson:2.11.0"
     implementation "com.squareup.okhttp3:okhttp:4.12.0"
 
-    implementation 'com.google.guava:guava:33.4.0-android'
+    implementation 'com.google.guava:guava:33.4.6-android'
     quicksyImplementation 'io.michaelrocks:libphonenumber-android:8.13.52'
     implementation 'im.conversations.webrtc:webrtc-android:129.0.0'
 
@@ -112,11 +112,11 @@ ext {
 
 android {
     namespace 'eu.siacs.conversations'
-    compileSdk 34
+    compileSdk 35
 
     defaultConfig {
         minSdkVersion 23
-        targetSdkVersion 34
+        targetSdkVersion 35
         versionCode 42140
         versionName "2.18.1"
         archivesBaseName += "-$versionName"

src/conversations/res/layout/activity_magic_create.xml 🔗

@@ -2,9 +2,9 @@
 <layout xmlns:android="http://schemas.android.com/apk/res/android">
 
     <LinearLayout
-
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout

src/conversations/res/layout/activity_pick_server.xml 🔗

@@ -2,9 +2,9 @@
 <layout xmlns:android="http://schemas.android.com/apk/res/android">
 
     <LinearLayout
-
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout

src/conversations/res/layout/activity_welcome.xml 🔗

@@ -4,6 +4,7 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout

src/main/java/de/gultsch/common/MiniUri.java 🔗

@@ -1,6 +1,7 @@
 package de.gultsch.common;
 
 import android.net.Uri;
+import androidx.annotation.NonNull;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
@@ -11,7 +12,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import org.checkerframework.checker.nullness.qual.NonNull;
 
 public class MiniUri {
 

src/main/java/de/gultsch/minidns/DNSServer.java 🔗

@@ -1,17 +1,15 @@
 package de.gultsch.minidns;
 
+import androidx.annotation.NonNull;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterables;
-
 import java.net.InetAddress;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
-import javax.annotation.Nonnull;
-
 public final class DNSServer {
 
     public final InetAddress inetAddress;
@@ -76,7 +74,7 @@ public final class DNSServer {
     }
 
     @Override
-    @Nonnull
+    @NonNull
     public String toString() {
         return MoreObjects.toStringHelper(this)
                 .add("inetAddress", inetAddress)

src/main/java/eu/siacs/conversations/services/AbstractConnectionManager.java 🔗

@@ -1,20 +1,16 @@
 package eu.siacs.conversations.services;
 
-import android.content.Context;
+import static eu.siacs.conversations.entities.Transferable.VALID_CRYPTO_EXTENSIONS;
+
 import android.os.PowerManager;
 import android.os.SystemClock;
 import android.util.Log;
-
+import androidx.annotation.Nullable;
 import androidx.core.content.ContextCompat;
-
-import org.bouncycastle.crypto.engines.AESEngine;
-import org.bouncycastle.crypto.io.CipherInputStream;
-import org.bouncycastle.crypto.io.CipherOutputStream;
-import org.bouncycastle.crypto.modes.AEADBlockCipher;
-import org.bouncycastle.crypto.modes.GCMBlockCipher;
-import org.bouncycastle.crypto.params.AEADParameters;
-import org.bouncycastle.crypto.params.KeyParameter;
-
+import eu.siacs.conversations.Config;
+import eu.siacs.conversations.R;
+import eu.siacs.conversations.entities.DownloadableFile;
+import eu.siacs.conversations.utils.Compatibility;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
@@ -22,20 +18,18 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.concurrent.atomic.AtomicLong;
-
-import javax.annotation.Nullable;
-
-import eu.siacs.conversations.Config;
-import eu.siacs.conversations.R;
-import eu.siacs.conversations.entities.DownloadableFile;
-import eu.siacs.conversations.utils.Compatibility;
 import okhttp3.MediaType;
 import okhttp3.RequestBody;
 import okio.BufferedSink;
 import okio.Okio;
 import okio.Source;
-
-import static eu.siacs.conversations.entities.Transferable.VALID_CRYPTO_EXTENSIONS;
+import org.bouncycastle.crypto.engines.AESEngine;
+import org.bouncycastle.crypto.io.CipherInputStream;
+import org.bouncycastle.crypto.io.CipherOutputStream;
+import org.bouncycastle.crypto.modes.AEADBlockCipher;
+import org.bouncycastle.crypto.modes.GCMBlockCipher;
+import org.bouncycastle.crypto.params.AEADParameters;
+import org.bouncycastle.crypto.params.KeyParameter;
 
 public class AbstractConnectionManager {
 
@@ -50,18 +44,19 @@ public class AbstractConnectionManager {
     public static InputStream upgrade(DownloadableFile file, InputStream is) {
         if (file.getKey() != null && file.getIv() != null) {
             AEADBlockCipher cipher = new GCMBlockCipher(new AESEngine());
-            cipher.init(true, new AEADParameters(new KeyParameter(file.getKey()), 128, file.getIv()));
+            cipher.init(
+                    true, new AEADParameters(new KeyParameter(file.getKey()), 128, file.getIv()));
             return new CipherInputStream(is, cipher);
         } else {
             return is;
         }
     }
 
+    // For progress tracking see:
+    // https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/Progress.java
 
-    //For progress tracking see:
-    //https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/Progress.java
-
-    public static RequestBody requestBody(final DownloadableFile file, final ProgressListener progressListener) {
+    public static RequestBody requestBody(
+            final DownloadableFile file, final ProgressListener progressListener) {
         return new RequestBody() {
 
             @Override
@@ -94,7 +89,8 @@ public class AbstractConnectionManager {
         void onProgress(long progress);
     }
 
-    public static OutputStream createOutputStream(DownloadableFile file, boolean append, boolean decrypt) {
+    public static OutputStream createOutputStream(
+            DownloadableFile file, boolean append, boolean decrypt) {
         FileOutputStream os;
         try {
             os = new FileOutputStream(file, append);
@@ -107,7 +103,8 @@ public class AbstractConnectionManager {
         }
         try {
             AEADBlockCipher cipher = new GCMBlockCipher(new AESEngine());
-            cipher.init(false, new AEADParameters(new KeyParameter(file.getKey()), 128, file.getIv()));
+            cipher.init(
+                    false, new AEADParameters(new KeyParameter(file.getKey()), 128, file.getIv()));
             return new CipherOutputStream(os, cipher);
         } catch (Exception e) {
             Log.d(Config.LOGTAG, "unable to create cipher output stream", e);
@@ -120,7 +117,9 @@ public class AbstractConnectionManager {
     }
 
     public long getAutoAcceptFileSize() {
-        final long autoAcceptFileSize = this.mXmppConnectionService.getLongPreference("auto_accept_file_size", R.integer.auto_accept_filesize);
+        final long autoAcceptFileSize =
+                this.mXmppConnectionService.getLongPreference(
+                        "auto_accept_file_size", R.integer.auto_accept_filesize);
         return autoAcceptFileSize <= 0 ? -1 : autoAcceptFileSize;
     }
 
@@ -130,7 +129,9 @@ public class AbstractConnectionManager {
 
     public void updateConversationUi(boolean force) {
         synchronized (LAST_UI_UPDATE_CALL) {
-            if (force || SystemClock.elapsedRealtime() - LAST_UI_UPDATE_CALL.get() >= UI_REFRESH_THRESHOLD) {
+            if (force
+                    || SystemClock.elapsedRealtime() - LAST_UI_UPDATE_CALL.get()
+                            >= UI_REFRESH_THRESHOLD) {
                 LAST_UI_UPDATE_CALL.set(SystemClock.elapsedRealtime());
                 mXmppConnectionService.updateConversationUi();
             }
@@ -138,7 +139,8 @@ public class AbstractConnectionManager {
     }
 
     public PowerManager.WakeLock createWakeLock(final String name) {
-        final PowerManager powerManager = ContextCompat.getSystemService(mXmppConnectionService, PowerManager.class);
+        final PowerManager powerManager =
+                ContextCompat.getSystemService(mXmppConnectionService, PowerManager.class);
         return powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, name);
     }
 
@@ -160,7 +162,7 @@ public class AbstractConnectionManager {
         }
 
         public static Extension of(String path) {
-            //TODO accept List<String> pathSegments
+            // TODO accept List<String> pathSegments
             final int pos = path.lastIndexOf('/');
             final String filename = path.substring(pos + 1).toLowerCase();
             final String[] parts = filename.split("\\.");

src/main/java/eu/siacs/conversations/ui/ConversationActivity.java 🔗

@@ -2,18 +2,15 @@ package eu.siacs.conversations.ui;
 
 import android.content.Intent;
 import android.os.Bundle;
-
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 
-import eu.siacs.conversations.ui.util.SettingsUtils;
-
 public class ConversationActivity extends AppCompatActivity {
 
-	@Override
-	protected void onCreate(@Nullable Bundle savedInstanceState) {
-		super.onCreate(savedInstanceState);
-		startActivity(new Intent(this, ConversationsActivity.class));
-		finish();
-	}
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        startActivity(new Intent(this, ConversationsActivity.class));
+        finish();
+    }
 }

src/main/java/eu/siacs/conversations/xmpp/jingle/Media.java 🔗

@@ -1,18 +1,17 @@
 package eu.siacs.conversations.xmpp.jingle;
 
+import androidx.annotation.NonNull;
 import com.google.common.collect.ImmutableSet;
-
 import java.util.Locale;
 import java.util.Set;
 
-import javax.annotation.Nonnull;
-
 public enum Media {
-
-    VIDEO, AUDIO, UNKNOWN;
+    VIDEO,
+    AUDIO,
+    UNKNOWN;
 
     @Override
-    @Nonnull
+    @NonNull
     public String toString() {
         return super.toString().toLowerCase(Locale.ROOT);
     }

src/main/java/eu/siacs/conversations/xmpp/jingle/RtpContentMap.java 🔗

@@ -1,5 +1,6 @@
 package eu.siacs.conversations.xmpp.jingle;
 
+import androidx.annotation.NonNull;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
@@ -25,7 +26,6 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import javax.annotation.Nonnull;
 
 public class RtpContentMap extends AbstractContentMap<RtpDescription, IceUdpTransportInfo> {
 
@@ -491,7 +491,7 @@ public class RtpContentMap extends AbstractContentMap<RtpDescription, IceUdpTran
         }
 
         @Override
-        @Nonnull
+        @NonNull
         public String toString() {
             return MoreObjects.toStringHelper(this)
                     .add("added", added)

src/main/java/eu/siacs/conversations/xmpp/jingle/TrackWrapper.java 🔗

@@ -1,23 +1,18 @@
 package eu.siacs.conversations.xmpp.jingle;
 
 import android.util.Log;
-
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import com.google.common.base.CaseFormat;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
-
 import eu.siacs.conversations.Config;
-
+import java.util.UUID;
 import org.webrtc.MediaStreamTrack;
 import org.webrtc.PeerConnection;
 import org.webrtc.RtpSender;
 import org.webrtc.RtpTransceiver;
 
-import java.util.UUID;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
 class TrackWrapper<T extends MediaStreamTrack> {
     public final T track;
     public final RtpSender rtpSender;
@@ -63,7 +58,7 @@ class TrackWrapper<T extends MediaStreamTrack> {
     }
 
     public static <T extends MediaStreamTrack> RtpTransceiver getTransceiver(
-            @Nonnull final PeerConnection peerConnection, final TrackWrapper<T> trackWrapper) {
+            @NonNull final PeerConnection peerConnection, final TrackWrapper<T> trackWrapper) {
         final RtpSender rtpSender = trackWrapper.rtpSender;
         final String rtpSenderId;
         try {

src/main/java/eu/siacs/conversations/xmpp/jingle/VideoSourceWrapper.java 🔗

@@ -2,12 +2,15 @@ package eu.siacs.conversations.xmpp.jingle;
 
 import android.content.Context;
 import android.util.Log;
-
+import androidx.annotation.Nullable;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
-
+import eu.siacs.conversations.Config;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Set;
 import org.webrtc.Camera2Enumerator;
 import org.webrtc.CameraEnumerationAndroid;
 import org.webrtc.CameraEnumerator;
@@ -17,14 +20,6 @@ import org.webrtc.PeerConnectionFactory;
 import org.webrtc.SurfaceTextureHelper;
 import org.webrtc.VideoSource;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Set;
-
-import javax.annotation.Nullable;
-
-import eu.siacs.conversations.Config;
-
 class VideoSourceWrapper {
 
     private static final int CAPTURING_RESOLUTION = 1920;
@@ -151,7 +146,7 @@ class VideoSourceWrapper {
                     return videoSourceWrapper;
                 }
             }
-            if (deviceNames.size() == 0) {
+            if (deviceNames.isEmpty()) {
                 return null;
             } else {
                 return of(enumerator, Iterables.get(deviceNames, 0), deviceNames);

src/main/java/eu/siacs/conversations/xmpp/jingle/WebRTCWrapper.java 🔗

@@ -3,6 +3,8 @@ package eu.siacs.conversations.xmpp.jingle;
 import android.content.Context;
 import android.os.Build;
 import android.util.Log;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -22,8 +24,6 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 import org.webrtc.AudioSource;
 import org.webrtc.AudioTrack;
 import org.webrtc.CandidatePairChangeEvent;
@@ -661,7 +661,7 @@ public class WebRTCWrapper {
                 MoreExecutors.directExecutor());
     }
 
-    @Nonnull
+    @NonNull
     private ListenableFuture<PeerConnection> getPeerConnectionFuture() {
         final PeerConnection peerConnection = this.peerConnection;
         if (peerConnection == null) {
@@ -671,7 +671,7 @@ public class WebRTCWrapper {
         }
     }
 
-    @Nonnull
+    @NonNull
     private PeerConnection requirePeerConnection() {
         final PeerConnection peerConnection = this.peerConnection;
         if (peerConnection == null) {
@@ -680,7 +680,7 @@ public class WebRTCWrapper {
         return peerConnection;
     }
 
-    @Nonnull
+    @NonNull
     private PeerConnectionFactory requirePeerConnectionFactory() {
         final PeerConnectionFactory peerConnectionFactory = this.peerConnectionFactory;
         if (peerConnectionFactory == null) {

src/main/java/eu/siacs/conversations/xmpp/jingle/transports/WebRTCDataChannelTransport.java 🔗

@@ -5,6 +5,7 @@ import static eu.siacs.conversations.xmpp.jingle.WebRTCWrapper.logDescription;
 
 import android.content.Context;
 import android.util.Log;
+import androidx.annotation.NonNull;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.io.Closeables;
@@ -41,7 +42,6 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicBoolean;
-import javax.annotation.Nonnull;
 import org.webrtc.CandidatePairChangeEvent;
 import org.webrtc.DataChannel;
 import org.webrtc.IceCandidate;
@@ -437,7 +437,7 @@ public class WebRTCDataChannelTransport implements Transport {
                 localDescriptionExecutorService);
     }
 
-    @Nonnull
+    @NonNull
     private PeerConnectionFactory requirePeerConnectionFactory() {
         final PeerConnectionFactory peerConnectionFactory = this.peerConnectionFactory;
         if (peerConnectionFactory == null) {
@@ -446,7 +446,7 @@ public class WebRTCDataChannelTransport implements Transport {
         return peerConnectionFactory;
     }
 
-    @Nonnull
+    @NonNull
     private PeerConnection requirePeerConnection() {
         final var future = this.peerConnectionFuture;
         if (future != null && future.isDone()) {

src/main/res/layout/activity_add_reaction.xml 🔗

@@ -3,6 +3,7 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout
@@ -20,6 +21,6 @@
         <androidx.emoji2.emojipicker.EmojiPickerView
             android:id="@+id/emoji_picker"
             android:layout_width="match_parent"
-            android:layout_height="match_parent"/>
+            android:layout_height="match_parent" />
     </LinearLayout>
 </layout>

src/main/res/layout/activity_change_password.xml 🔗

@@ -4,7 +4,8 @@
 
     <RelativeLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:fitsSystemWindows="true">
 
         <com.google.android.material.appbar.AppBarLayout
             android:id="@+id/app_bar_layout"

src/main/res/layout/activity_channel_discovery.xml 🔗

@@ -6,6 +6,7 @@
     <LinearLayout
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout

src/main/res/layout/activity_choose_contact.xml 🔗

@@ -4,6 +4,7 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout

src/main/res/layout/activity_contact_details.xml 🔗

@@ -6,6 +6,7 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout

src/main/res/layout/activity_conversations.xml 🔗

@@ -4,6 +4,7 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout

src/main/res/layout/activity_edit_account.xml 🔗

@@ -5,7 +5,8 @@
 
     <RelativeLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:fitsSystemWindows="true">
 
         <com.google.android.material.appbar.AppBarLayout
             android:id="@+id/app_bar_layout"

src/main/res/layout/activity_import_backup.xml 🔗

@@ -5,6 +5,7 @@
     <LinearLayout
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout

src/main/res/layout/activity_manage_accounts.xml 🔗

@@ -4,6 +4,7 @@
     <LinearLayout
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout

src/main/res/layout/activity_muc_details.xml 🔗

@@ -6,6 +6,7 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout

src/main/res/layout/activity_muc_users.xml 🔗

@@ -5,6 +5,7 @@
     <LinearLayout
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout

src/main/res/layout/activity_publish_profile_picture.xml 🔗

@@ -4,7 +4,8 @@
 
     <RelativeLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:fitsSystemWindows="true">
 
         <com.google.android.material.appbar.AppBarLayout
             android:id="@+id/app_bar_layout"

src/main/res/layout/activity_rtp_session.xml 🔗

@@ -5,7 +5,8 @@
 
     <RelativeLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:fitsSystemWindows="true">
 
         <LinearLayout
             android:id="@+id/pip_placeholder"

src/main/res/layout/activity_search.xml 🔗

@@ -5,6 +5,7 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout
@@ -20,10 +21,10 @@
         </com.google.android.material.appbar.AppBarLayout>
 
         <ListView
-            android:background="@drawable/background_search"
             android:id="@+id/search_results"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
+            android:background="@drawable/background_search"
             android:divider="@android:color/transparent"
             android:dividerHeight="0dp"
             android:listSelector="@android:color/transparent"

src/main/res/layout/activity_settings.xml 🔗

@@ -4,7 +4,8 @@
 
     <androidx.coordinatorlayout.widget.CoordinatorLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:fitsSystemWindows="true">
 
         <com.google.android.material.appbar.AppBarLayout
             android:id="@+id/app_bar_layout"

src/main/res/layout/activity_share_location.xml 🔗

@@ -5,6 +5,7 @@
     <RelativeLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
         tools:context=".ui.ShareLocationActivity">
 
         <com.google.android.material.appbar.AppBarLayout

src/main/res/layout/activity_share_with.xml 🔗

@@ -5,6 +5,7 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout

src/main/res/layout/activity_show_location.xml 🔗

@@ -3,7 +3,8 @@
 
     <RelativeLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:fitsSystemWindows="true">
 
         <com.google.android.material.appbar.AppBarLayout
             android:id="@+id/app_bar_layout"

src/main/res/layout/activity_start_conversation.xml 🔗

@@ -4,7 +4,8 @@
 
     <RelativeLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:fitsSystemWindows="true">
 
         <com.google.android.material.appbar.AppBarLayout
             android:id="@+id/app_bar_layout"
@@ -51,9 +52,9 @@
             android:layout_alignParentEnd="true"
             android:layout_alignParentBottom="true"
             android:contentDescription="@string/add_contact_or_create_or_join_group_chat"
-            app:sdMainFabClosedSrc="@drawable/ic_add_24dp"
             app:sdMainFabClosedBackgroundColor="?colorPrimaryContainer"
             app:sdMainFabClosedIconColor="?colorOnPrimaryContainer"
+            app:sdMainFabClosedSrc="@drawable/ic_add_24dp"
             app:sdMainFabOpenedBackgroundColor="?colorPrimaryContainer"
             app:sdMainFabOpenedIconColor="?colorOnPrimaryContainer"
             app:sdOverlayLayout="@id/overlay"

src/main/res/layout/activity_trust_keys.xml 🔗

@@ -3,7 +3,8 @@
 
     <RelativeLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:fitsSystemWindows="true">
 
         <com.google.android.material.appbar.AppBarLayout
             android:id="@+id/app_bar_layout"

src/main/res/values/themes.xml 🔗

@@ -14,6 +14,7 @@
     <style name="Theme.Conversations3.SplashScreen" parent="@style/Theme.Conversations3">
         <item name="android:windowBackground">@drawable/background_splash_screen</item>
         <item name="android:windowLightStatusBar">true</item>
+        <item name="android:windowFullscreen">true</item>
     </style>
 
     <style name="Theme.Conversations3.Dialog" parent="@style/Theme.Conversations3">

src/quicksy/res/layout/activity_enter_number.xml 🔗

@@ -5,6 +5,7 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout

src/quicksy/res/layout/activity_tos.xml 🔗

@@ -4,6 +4,7 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout

src/quicksy/res/layout/activity_verify.xml 🔗

@@ -4,6 +4,7 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
         android:orientation="vertical">
 
         <com.google.android.material.appbar.AppBarLayout