diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b243af7b4c..ab96f79f42 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -347,12 +347,17 @@
android:windowSoftInputMode="stateHidden"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
-
+
+
{
+ ContactPhoto contactPhoto = recipient.isLocalNumber() ? new ProfileContactPhoto(recipient, recipient.getProfileAvatar())
+ : recipient.getContactPhoto();
+ FallbackContactPhoto fallbackPhoto = recipient.isLocalNumber() ? new ResourceContactPhoto(R.drawable.ic_profile_outline_40, R.drawable.ic_profile_outline_20, R.drawable.ic_person_large)
+ : recipient.getFallbackContactPhoto();
+
+ GlideApp.with(this).load(contactPhoto)
+ .fallback(fallbackPhoto.asCallCard(this))
+ .error(fallbackPhoto.asCallCard(this))
+ .diskCacheStrategy(DiskCacheStrategy.ALL)
+ .addListener(new RequestListener() {
+ @Override
+ public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
+ Log.w(TAG, "Unable to load avatar, or avatar removed, closing");
+ finish();
+ return false;
+ }
+
+ @Override
+ public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {
+ return false;
+ }
+ })
+ .into(avatar);
+
+ toolbar.setTitle(recipient.toShortString(context));
+ });
+
+ avatar.setOnClickListener(v -> toggleUiVisibility());
+
+ showAndHideWithSystemUI(getWindow(), findViewById(R.id.toolbar_layout));
+ }
+
+ private static void showAndHideWithSystemUI(@NonNull Window window, @NonNull View... views) {
+ window.getDecorView().setOnSystemUiVisibilityChangeListener(visibility -> {
+ boolean hide = (visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0;
+
+ for (View view : views) {
+ view.animate()
+ .alpha(hide ? 0 : 1)
+ .start();
+ }
+ });
+ }
+
+ private void toggleUiVisibility() {
+ int systemUiVisibility = getWindow().getDecorView().getSystemUiVisibility();
+ if ((systemUiVisibility & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0) {
+ showSystemUI();
+ } else {
+ hideSystemUI();
+ }
+ }
+
+ private void hideSystemUI() {
+ getWindow().getDecorView().setSystemUiVisibility(
+ View.SYSTEM_UI_FLAG_IMMERSIVE |
+ View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
+ View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
+ View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
+ View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
+ View.SYSTEM_UI_FLAG_FULLSCREEN );
+ }
+
+ private void showSystemUI() {
+ getWindow().getDecorView().setSystemUiVisibility(
+ View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
+ View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
+ View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN );
+ }
+
+ @Override
+ public boolean onSupportNavigateUp() {
+ onBackPressed();
+ return true;
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/RecipientPreferenceActivity.java b/app/src/main/java/org/thoughtcrime/securesms/RecipientPreferenceActivity.java
index 62306d4181..76b962bea4 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/RecipientPreferenceActivity.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/RecipientPreferenceActivity.java
@@ -5,6 +5,7 @@ import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Color;
+import android.graphics.drawable.Drawable;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
@@ -35,7 +36,11 @@ import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.recyclerview.widget.RecyclerView;
+import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
+import com.bumptech.glide.load.engine.GlideException;
+import com.bumptech.glide.request.RequestListener;
+import com.bumptech.glide.request.target.Target;
import com.google.android.material.appbar.CollapsingToolbarLayout;
import org.thoughtcrime.securesms.color.MaterialColor;
@@ -69,7 +74,6 @@ import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.recipients.RecipientUtil;
import org.thoughtcrime.securesms.util.CommunicationActions;
import org.thoughtcrime.securesms.util.DynamicDarkToolbarTheme;
-import org.thoughtcrime.securesms.util.DynamicLanguage;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.IdentityUtil;
@@ -100,8 +104,7 @@ public class RecipientPreferenceActivity extends PassphraseRequiredActionBarActi
private static final String PREFERENCE_ABOUT = "pref_key_number";
private static final String PREFERENCE_CUSTOM_NOTIFICATIONS = "pref_key_recipient_custom_notifications";
- private final DynamicTheme dynamicTheme = new DynamicDarkToolbarTheme();
- private final DynamicLanguage dynamicLanguage = new DynamicLanguage();
+ private final DynamicTheme dynamicTheme = new DynamicDarkToolbarTheme();
private ImageView avatar;
private GlideRequests glideRequests;
@@ -120,7 +123,6 @@ public class RecipientPreferenceActivity extends PassphraseRequiredActionBarActi
@Override
public void onPreCreate() {
dynamicTheme.onCreate(this);
- dynamicLanguage.onCreate(this);
}
@Override
@@ -135,14 +137,13 @@ public class RecipientPreferenceActivity extends PassphraseRequiredActionBarActi
setHeader(recipient.get());
recipient.observe(this, this::setHeader);
- getSupportLoaderManager().initLoader(0, null, this);
+ LoaderManager.getInstance(this).initLoader(0, null, this);
}
@Override
public void onResume() {
super.onResume();
dynamicTheme.onResume(this);
- dynamicLanguage.onResume(this);
}
@Override
@@ -165,10 +166,10 @@ public class RecipientPreferenceActivity extends PassphraseRequiredActionBarActi
}
private void initializeToolbar() {
- this.toolbarLayout = ViewUtil.findById(this, R.id.collapsing_toolbar);
- this.avatar = ViewUtil.findById(this, R.id.avatar);
- this.threadPhotoRailView = ViewUtil.findById(this, R.id.recent_photos);
- this.threadPhotoRailLabel = ViewUtil.findById(this, R.id.rail_label);
+ this.toolbarLayout = findViewById(R.id.collapsing_toolbar);
+ this.avatar = findViewById(R.id.avatar);
+ this.threadPhotoRailView = findViewById(R.id.recent_photos);
+ this.threadPhotoRailLabel = findViewById(R.id.rail_label);
this.toolbarLayout.setExpandedTitleColor(ThemeUtil.getThemedColor(this, R.attr.conversation_title_color));
this.toolbarLayout.setCollapsedTitleTextColor(ThemeUtil.getThemedColor(this, R.attr.conversation_title_color));
@@ -189,7 +190,7 @@ public class RecipientPreferenceActivity extends PassphraseRequiredActionBarActi
}
);
- Toolbar toolbar = ViewUtil.findById(this, R.id.toolbar);
+ Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setLogo(null);
@@ -215,6 +216,20 @@ public class RecipientPreferenceActivity extends PassphraseRequiredActionBarActi
.fallback(fallbackPhoto.asCallCard(this))
.error(fallbackPhoto.asCallCard(this))
.diskCacheStrategy(DiskCacheStrategy.ALL)
+ .addListener(new RequestListener() {
+ @Override
+ public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
+ avatar.setOnClickListener(null);
+ return false;
+ }
+
+ @Override
+ public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {
+ avatar.setOnClickListener(v -> startActivity(AvatarPreviewActivity.intentFromRecipientId(RecipientPreferenceActivity.this, recipient.getId()),
+ AvatarPreviewActivity.createTransitionBundle(RecipientPreferenceActivity.this, avatar)));
+ return false;
+ }
+ })
.into(this.avatar);
if (contactPhoto == null) this.avatar.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupFragment.java
index 0952a56571..5a69d1c1ce 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupFragment.java
@@ -22,6 +22,7 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.ViewModelProviders;
+import org.thoughtcrime.securesms.AvatarPreviewActivity;
import org.thoughtcrime.securesms.ContactSelectionListFragment;
import org.thoughtcrime.securesms.MediaPreviewActivity;
import org.thoughtcrime.securesms.MuteDialog;
@@ -189,7 +190,14 @@ public class ManageGroupFragment extends Fragment {
viewModel.getTitle().observe(getViewLifecycleOwner(), toolbar::setTitle);
viewModel.getMemberCountSummary().observe(getViewLifecycleOwner(), memberCountUnderAvatar::setText);
viewModel.getFullMemberCountSummary().observe(getViewLifecycleOwner(), memberCountAboveList::setText);
- viewModel.getGroupRecipient().observe(getViewLifecycleOwner(), avatar::setRecipient);
+ viewModel.getGroupRecipient().observe(getViewLifecycleOwner(), groupRecipient -> {
+ avatar.setRecipient(groupRecipient);
+ avatar.setOnClickListener(v -> {
+ FragmentActivity activity = requireActivity();
+ activity.startActivity(AvatarPreviewActivity.intentFromRecipientId(activity, groupRecipient.getId()),
+ AvatarPreviewActivity.createTransitionBundle(activity, avatar));
+ });
+ });
viewModel.getGroupViewState().observe(getViewLifecycleOwner(), vs -> {
if (vs == null) return;
diff --git a/app/src/main/res/layout/contact_photo_preview_activity.xml b/app/src/main/res/layout/contact_photo_preview_activity.xml
new file mode 100644
index 0000000000..7865e35961
--- /dev/null
+++ b/app/src/main/res/layout/contact_photo_preview_activity.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+