From 69adcd1d69b4d3ffc56082e78f357e05828f8335 Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Thu, 28 May 2020 16:05:34 -0300 Subject: [PATCH] Tap avatar in chat preferences or group management to see full screen. --- app/src/main/AndroidManifest.xml | 7 +- .../securesms/AvatarPreviewActivity.java | 152 ++++++++++++++++++ .../RecipientPreferenceActivity.java | 37 +++-- .../ui/managegroup/ManageGroupFragment.java | 10 +- .../layout/contact_photo_preview_activity.xml | 29 ++++ 5 files changed, 222 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java create mode 100644 app/src/main/res/layout/contact_photo_preview_activity.xml 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 @@ + + + + + + + + + + + +