add possibility to view avatars fullscreen (#724)

* add possibility to view avatars fullscreen

* improve codestyle
This commit is contained in:
Konrad Pozniak 2018-07-30 15:42:45 +02:00 committed by GitHub
parent 133808891d
commit b5a8915845
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 106 additions and 37 deletions

View file

@ -32,6 +32,7 @@ import android.support.annotation.ColorInt
import android.support.annotation.Px
import android.support.design.widget.*
import android.support.text.emoji.EmojiCompat
import android.support.v4.app.ActivityOptionsCompat
import android.support.v4.app.Fragment
import android.support.v4.content.ContextCompat
import android.support.v4.view.ViewCompat
@ -145,8 +146,6 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasSupportF
val intent = intent
accountId = intent.getStringExtra(KEY_ACCOUNT_ID)
loadedAccount = null
// set toolbar top margin according to system window insets
ViewCompat.setOnApplyWindowInsetsListener(accountCoordinatorLayout) { _, insets ->
val top = insets.systemWindowInsetTop
@ -320,6 +319,15 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasSupportF
.load(account.header)
.into(accountHeaderImageView)
accountAvatarImageView.setOnClickListener { avatarView ->
val intent = ViewMediaActivity.newAvatarIntent(avatarView.context, account.avatar)
ViewCompat.setTransitionName(avatarView, account.avatar)
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, avatarView, account.avatar)
startActivity(intent, options.toBundle())
}
accountFieldAdapter.fields = account.fields ?: emptyList()
accountFieldAdapter.emojis = account.emojis ?: emptyList()
accountFieldAdapter.notifyDataSetChanged()

View file

@ -23,8 +23,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
@ -35,6 +33,7 @@ import android.support.annotation.StringRes;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
@ -44,6 +43,7 @@ import android.widget.Toast;
import com.keylesspalace.tusky.entity.Attachment;
import com.keylesspalace.tusky.fragment.ViewMediaFragment;
import com.keylesspalace.tusky.pager.AvatarImagePagerAdapter;
import com.keylesspalace.tusky.pager.ImagePagerAdapter;
import com.keylesspalace.tusky.view.ImageViewPager;
import com.keylesspalace.tusky.viewdata.AttachmentViewData;
@ -57,14 +57,20 @@ import kotlin.jvm.functions.Function0;
public final class ViewMediaActivity extends BaseActivity
implements ViewMediaFragment.PhotoActionsListener {
private static final String ATTACHMENTS_EXTRA = "attachments";
private static final String INDEX_EXTRA = "index";
private static final String EXTRA_ATTACHMENTS = "attachments";
private static final String EXTRA_ATTACHMENT_INDEX = "index";
private static final String EXTRA_AVATAR_URL = "avatar";
public static Intent newIntent(Context context, List<AttachmentViewData> attachments,
int index) {
public static Intent newIntent(Context context, List<AttachmentViewData> attachments, int index) {
final Intent intent = new Intent(context, ViewMediaActivity.class);
intent.putParcelableArrayListExtra(ATTACHMENTS_EXTRA, new ArrayList<>(attachments));
intent.putExtra(INDEX_EXTRA, index);
intent.putParcelableArrayListExtra(EXTRA_ATTACHMENTS, new ArrayList<>(attachments));
intent.putExtra(EXTRA_ATTACHMENT_INDEX, index);
return intent;
}
public static Intent newAvatarIntent(Context context, String url) {
final Intent intent = new Intent(context, ViewMediaActivity.class);
intent.putExtra(EXTRA_AVATAR_URL, url);
return intent;
}
@ -72,9 +78,10 @@ public final class ViewMediaActivity extends BaseActivity
private ImageViewPager viewPager;
private View anyView;
private List<AttachmentViewData> attachments;
private Toolbar toolbar;
private List<AttachmentViewData> attachments;
private boolean isToolbarVisible = true;
private final List<ToolbarVisibilityListener> toolbarVisibilityListeners = new ArrayList<>();
@ -106,14 +113,28 @@ public final class ViewMediaActivity extends BaseActivity
// Gather the parameters.
Intent intent = getIntent();
attachments = intent.getParcelableArrayListExtra(ATTACHMENTS_EXTRA);
int initialPosition = intent.getIntExtra(INDEX_EXTRA, 0);
attachments = intent.getParcelableArrayListExtra(EXTRA_ATTACHMENTS);
int initialPosition = intent.getIntExtra(EXTRA_ATTACHMENT_INDEX, 0);
final PagerAdapter adapter;
if(attachments != null) {
List<Attachment> realAttachs =
CollectionsKt.map(attachments, AttachmentViewData::getAttachment);
// Setup the view pager.
adapter = new ImagePagerAdapter(getSupportFragmentManager(),
realAttachs, initialPosition);
} else {
String avatarUrl = intent.getStringExtra(EXTRA_AVATAR_URL);
if(avatarUrl == null) {
throw new IllegalArgumentException("attachment list or avatar url has to be set");
}
adapter = new AvatarImagePagerAdapter(getSupportFragmentManager(), avatarUrl);
}
List<Attachment> realAttachs =
CollectionsKt.map(attachments, AttachmentViewData::getAttachment);
// Setup the view pager.
final ImagePagerAdapter adapter = new ImagePagerAdapter(getSupportFragmentManager(),
realAttachs, initialPosition);
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(initialPosition);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@ -165,17 +186,12 @@ public final class ViewMediaActivity extends BaseActivity
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.view_media_toolbar, menu);
// Manually tint all action buttons, because the theme overlay doesn't handle them properly.
for (int i = 0; i < menu.size(); i++) {
Drawable drawable = menu.getItem(i).getIcon();
if (drawable != null) {
drawable.mutate();
int color = ContextCompat.getColor(this, R.color.text_color_primary_dark);
drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
}
if(attachments != null) {
getMenuInflater().inflate(R.menu.view_media_toolbar, menu);
return true;
} else {
return false;
}
return true;
}
@Override

View file

@ -62,19 +62,30 @@ public final class ViewMediaFragment extends BaseFragment {
private Function0 toolbarVisibiltyDisposable;
private static final String ARG_START_POSTPONED_TRANSITION = "startPostponedTransition";
private static final String ATTACH_ARG = "attach";
private static final String ARG_ATTACHMENT = "attach";
private static final String ARG_AVATAR_URL = "avatarUrl";
public static ViewMediaFragment newInstance(@NonNull Attachment attachment,
boolean shouldStartPostponedTransition) {
Bundle arguments = new Bundle();
Bundle arguments = new Bundle(2);
ViewMediaFragment fragment = new ViewMediaFragment();
arguments.putParcelable(ATTACH_ARG, attachment);
arguments.putParcelable(ARG_ATTACHMENT, attachment);
arguments.putBoolean(ARG_START_POSTPONED_TRANSITION, shouldStartPostponedTransition);
fragment.setArguments(arguments);
return fragment;
}
public static ViewMediaFragment newAvatarInstance(@NonNull String avatarUrl) {
Bundle arguments = new Bundle(2);
ViewMediaFragment fragment = new ViewMediaFragment();
arguments.putString(ARG_AVATAR_URL, avatarUrl);
arguments.putBoolean(ARG_START_POSTPONED_TRANSITION, true);
fragment.setArguments(arguments);
return fragment;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
@ -89,13 +100,26 @@ public final class ViewMediaFragment extends BaseFragment {
descriptionView = rootView.findViewById(R.id.tv_media_description);
final Bundle arguments = Objects.requireNonNull(getArguments(), "Empty arguments");
final Attachment attachment = arguments.getParcelable(ATTACH_ARG);
final String url = attachment.getUrl();
@Nullable final String description = attachment.getDescription();
final Attachment attachment = arguments.getParcelable(ARG_ATTACHMENT);
final String url;
descriptionView.setText(description);
showingDescription = !TextUtils.isEmpty(description);
isDescriptionVisible = showingDescription;
if(attachment != null) {
url = attachment.getUrl();
@Nullable final String description = attachment.getDescription();
descriptionView.setText(description);
showingDescription = !TextUtils.isEmpty(description);
isDescriptionVisible = showingDescription;
} else {
url = arguments.getString(ARG_AVATAR_URL);
if(url == null) {
throw new IllegalArgumentException("attachment or avatar url has to be set");
}
showingDescription = false;
isDescriptionVisible = false;
}
// Setting visibility without animations so it looks nice when you scroll images
//noinspection ConstantConditions

View file

@ -0,0 +1,21 @@
package com.keylesspalace.tusky.pager
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentPagerAdapter
import com.keylesspalace.tusky.fragment.ViewMediaFragment
class AvatarImagePagerAdapter(fragmentManager: FragmentManager, private val avatarUrl: String) : FragmentPagerAdapter(fragmentManager) {
override fun getItem(position: Int): Fragment? {
return if (position == 0) {
ViewMediaFragment.newAvatarInstance(avatarUrl)
} else {
null
}
}
override fun getCount() = 1
}