add activity to view full screen avatars

Daniel Gultsch created

Change summary

src/main/AndroidManifest.xml                                            |  4 
src/main/java/eu/siacs/conversations/ui/Activities.java                 |  9 
src/main/java/eu/siacs/conversations/ui/BaseActivity.java               |  4 
src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java     |  7 
src/main/java/eu/siacs/conversations/ui/ViewProfilePictureActivity.java | 49 
src/main/res/layout/activity_view_profile_picture.xml                   | 28 
src/main/res/values-night/themes.xml                                    | 31 
src/main/res/values/themes.xml                                          | 31 
8 files changed, 128 insertions(+), 35 deletions(-)

Detailed changes

src/main/AndroidManifest.xml 🔗

@@ -60,7 +60,7 @@
         android:name="android.hardware.microphone"
         android:required="false" />
 
-    <uses-sdk tools:overrideLibrary="androidx.heifwriter"/>
+    <uses-sdk tools:overrideLibrary="androidx.heifwriter" />
 
     <queries>
         <package android:name="org.sufficientlysecure.keychain" />
@@ -365,6 +365,8 @@
                 <action android:name="android.intent.action.CREATE_SHORTCUT" />
             </intent-filter>
         </activity>
+        <activity android:name=".ui.ViewProfilePictureActivity"
+            android:theme="@style/Theme.Conversations3.Dark"/>
         <activity
             android:name=".ui.MucUsersActivity"
             android:label="@string/group_chat_members" />

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

@@ -17,7 +17,14 @@ public final class Activities {
 
     public static void setStatusAndNavigationBarColors(
             final Activity activity, final View view, final boolean raisedStatusBar) {
-        final var isLightMode = isLightMode(activity);
+        setStatusAndNavigationBarColors(activity, view, isLightMode(activity), raisedStatusBar);
+    }
+
+    public static void setStatusAndNavigationBarColors(
+            final Activity activity,
+            final View view,
+            final boolean isLightMode,
+            final boolean raisedStatusBar) {
         final var window = activity.getWindow();
         final var flags = view.getSystemUiVisibility();
         // an elevation of 4 matches the MaterialToolbar elevation

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

@@ -1,10 +1,8 @@
 package eu.siacs.conversations.ui;
 
 import android.util.Log;
-
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.app.AppCompatDelegate;
-
 import eu.siacs.conversations.Conversations;
 import eu.siacs.conversations.ui.util.SettingsUtils;
 
@@ -23,7 +21,7 @@ public abstract class BaseActivity extends AppCompatActivity {
     }
 
     @Override
-    protected void onResume(){
+    protected void onResume() {
         super.onResume();
         SettingsUtils.applyScreenshotSetting(this);
     }

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

@@ -637,6 +637,13 @@ public class ContactDetailsActivity extends OmemoActivity
     }
 
     private void onBadgeClick(final View view) {
+        final var intent = new Intent(this, ViewProfilePictureActivity.class);
+        intent.setData(Uri.fromParts("avatar", contact.getAvatar(), null));
+        intent.putExtra(ViewProfilePictureActivity.EXTRA_DISPLAY_NAME, contact.getDisplayName());
+        startActivity(intent);
+    }
+
+    private void onAddToAddressBookClick(final View view) {
         if (QuickConversationsService.isContactListIntegration(this)) {
             final Uri systemAccount = contact.getSystemAccount();
             if (systemAccount == null) {

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

@@ -0,0 +1,49 @@
+package eu.siacs.conversations.ui;
+
+import static eu.siacs.conversations.ui.XmppActivity.configureActionBar;
+
+import android.net.Uri;
+import android.os.Bundle;
+import androidx.databinding.DataBindingUtil;
+import eu.siacs.conversations.R;
+import eu.siacs.conversations.databinding.ActivityViewProfilePictureBinding;
+import eu.siacs.conversations.persistance.FileBackend;
+
+public class ViewProfilePictureActivity extends ActionBarActivity {
+
+    public static final String EXTRA_DISPLAY_NAME = "eu.siacs.conversations.extra.DISPLAY_NAME";
+
+    private ActivityViewProfilePictureBinding binding;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        this.binding = DataBindingUtil.setContentView(this, R.layout.activity_view_profile_picture);
+        Activities.setStatusAndNavigationBarColors(this, binding.getRoot(), false, false);
+
+        setSupportActionBar(binding.toolbar);
+        configureActionBar(getSupportActionBar());
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        final var intent = getIntent();
+        if (intent == null) {
+            return;
+        }
+        final var uri = intent.getData();
+        if (uri == null) {
+            return;
+        }
+        final var avatar = uri.getSchemeSpecificPart();
+        if (avatar == null) {
+            return;
+        }
+        final var displayName = intent.getStringExtra(EXTRA_DISPLAY_NAME);
+        final var file = FileBackend.getAvatarFile(this, avatar);
+        this.binding.imageView.setImageURI(Uri.fromFile(file));
+        setTitle(displayName);
+    }
+}

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

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<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
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+
+            <com.google.android.material.appbar.MaterialToolbar
+                android:id="@+id/toolbar"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:minHeight="?attr/actionBarSize" />
+
+        </com.google.android.material.appbar.AppBarLayout>
+
+        <ImageView
+            android:id="@+id/imageView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />
+
+    </LinearLayout>
+</layout>

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

@@ -1,35 +1,6 @@
 <resources>
 
-    <style name="Theme.Conversations3" parent="Theme.Material3.Dark.NoActionBar">
-        <item name="windowActionModeOverlay">true</item>
-        <item name="colorPrimary">@color/md_theme_dark_primary</item>
-        <item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
-        <item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
-        <item name="colorOnPrimaryContainer">@color/md_theme_dark_onPrimaryContainer</item>
-        <item name="colorSecondary">@color/md_theme_dark_secondary</item>
-        <item name="colorOnSecondary">@color/md_theme_dark_onSecondary</item>
-        <item name="colorSecondaryContainer">@color/md_theme_dark_secondaryContainer</item>
-        <item name="colorOnSecondaryContainer">@color/md_theme_dark_onSecondaryContainer</item>
-        <item name="colorTertiary">@color/md_theme_dark_tertiary</item>
-        <item name="colorOnTertiary">@color/md_theme_dark_onTertiary</item>
-        <item name="colorTertiaryContainer">@color/md_theme_dark_tertiaryContainer</item>
-        <item name="colorOnTertiaryContainer">@color/md_theme_dark_onTertiaryContainer</item>
-        <item name="colorError">@color/md_theme_dark_error</item>
-        <item name="colorErrorContainer">@color/md_theme_dark_errorContainer</item>
-        <item name="colorOnError">@color/md_theme_dark_onError</item>
-        <item name="colorOnErrorContainer">@color/md_theme_dark_onErrorContainer</item>
-        <item name="android:colorBackground">@color/md_theme_dark_background</item>
-        <item name="colorOnBackground">@color/md_theme_dark_onBackground</item>
-        <item name="colorSurface">@color/md_theme_dark_surface</item>
-        <item name="colorOnSurface">@color/md_theme_dark_onSurface</item>
-        <item name="colorSurfaceVariant">@color/md_theme_dark_surfaceVariant</item>
-        <item name="colorOnSurfaceVariant">@color/md_theme_dark_onSurfaceVariant</item>
-        <item name="colorOutline">@color/md_theme_dark_outline</item>
-        <item name="colorOnSurfaceInverse">@color/md_theme_dark_inverseOnSurface</item>
-        <item name="colorSurfaceInverse">@color/md_theme_dark_inverseSurface</item>
-        <item name="colorPrimaryInverse">@color/md_theme_dark_inversePrimary</item>
-        <item name="preferenceTheme">@style/MaterialPreferenceThemeOverlay</item>
-    </style>
+    <style name="Theme.Conversations3" parent="Theme.Conversations3.Dark"/>
 
     <style name="Theme.Conversations3.SplashScreen" parent="@style/Theme.Conversations3">
         <item name="android:windowBackground">@drawable/background_splash_screen</item>

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

@@ -54,6 +54,37 @@
         <item name="preferenceTheme">@style/MaterialPreferenceThemeOverlay</item>
     </style>
 
+    <style name="Theme.Conversations3.Dark" parent="Theme.Material3.Dark.NoActionBar">
+        <item name="windowActionModeOverlay">true</item>
+        <item name="colorPrimary">@color/md_theme_dark_primary</item>
+        <item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
+        <item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
+        <item name="colorOnPrimaryContainer">@color/md_theme_dark_onPrimaryContainer</item>
+        <item name="colorSecondary">@color/md_theme_dark_secondary</item>
+        <item name="colorOnSecondary">@color/md_theme_dark_onSecondary</item>
+        <item name="colorSecondaryContainer">@color/md_theme_dark_secondaryContainer</item>
+        <item name="colorOnSecondaryContainer">@color/md_theme_dark_onSecondaryContainer</item>
+        <item name="colorTertiary">@color/md_theme_dark_tertiary</item>
+        <item name="colorOnTertiary">@color/md_theme_dark_onTertiary</item>
+        <item name="colorTertiaryContainer">@color/md_theme_dark_tertiaryContainer</item>
+        <item name="colorOnTertiaryContainer">@color/md_theme_dark_onTertiaryContainer</item>
+        <item name="colorError">@color/md_theme_dark_error</item>
+        <item name="colorErrorContainer">@color/md_theme_dark_errorContainer</item>
+        <item name="colorOnError">@color/md_theme_dark_onError</item>
+        <item name="colorOnErrorContainer">@color/md_theme_dark_onErrorContainer</item>
+        <item name="android:colorBackground">@color/md_theme_dark_background</item>
+        <item name="colorOnBackground">@color/md_theme_dark_onBackground</item>
+        <item name="colorSurface">@color/md_theme_dark_surface</item>
+        <item name="colorOnSurface">@color/md_theme_dark_onSurface</item>
+        <item name="colorSurfaceVariant">@color/md_theme_dark_surfaceVariant</item>
+        <item name="colorOnSurfaceVariant">@color/md_theme_dark_onSurfaceVariant</item>
+        <item name="colorOutline">@color/md_theme_dark_outline</item>
+        <item name="colorOnSurfaceInverse">@color/md_theme_dark_inverseOnSurface</item>
+        <item name="colorSurfaceInverse">@color/md_theme_dark_inverseSurface</item>
+        <item name="colorPrimaryInverse">@color/md_theme_dark_inversePrimary</item>
+        <item name="preferenceTheme">@style/MaterialPreferenceThemeOverlay</item>
+    </style>
+
     <style name="MaterialPreferenceThemeOverlay" parent="@style/PreferenceThemeOverlay">
         <item name="switchPreferenceCompatStyle">@style/MaterialSwitchPreference</item>
     </style>