Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unified Login & Sign-Up: Epilogue screen UI update #11944

Merged
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ private void refreshContent() {
share(ShareAction.SHARE_TO_POST, visibleSites.get(0).getId());
} else {
// display a fragment with list of sites and list of actions the user can perform
initShareFragment(false);
initShareFragment();
}
} else {
// start the login flow and wait onActivityResult
Expand All @@ -107,9 +107,9 @@ private void downloadExternalMedia() {
}
}

private void initShareFragment(boolean afterLogin) {
private void initShareFragment() {
ShareIntentReceiverFragment shareIntentReceiverFragment = ShareIntentReceiverFragment
.newInstance(!isSharingText(), loadLastUsedBlogLocalId(), afterLogin);
.newInstance(!isSharingText(), loadLastUsedBlogLocalId());
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, shareIntentReceiverFragment, ShareIntentReceiverFragment.TAG)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,20 @@
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.Adapter;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;

import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.fluxc.store.AccountStore;
import org.wordpress.android.ui.accounts.login.LoginHeaderViewHolder;
import org.wordpress.android.ui.main.SitePickerAdapter;
import org.wordpress.android.ui.main.SitePickerAdapter.HeaderHandler;
import org.wordpress.android.ui.main.SitePickerAdapter.SiteList;
import org.wordpress.android.ui.main.SitePickerAdapter.ViewHolderHandler;
import org.wordpress.android.ui.media.MediaBrowserActivity;
import org.wordpress.android.ui.posts.EditPostActivity;
import org.wordpress.android.util.image.ImageManager;
Expand All @@ -33,7 +32,6 @@ public class ShareIntentReceiverFragment extends Fragment {

private static final String ARG_SHARING_MEDIA = "ARG_SHARING_MEDIA";
private static final String ARG_LAST_USED_BLOG_LOCAL_ID = "ARG_LAST_USED_BLOG_LOCAL_ID";
private static final String ARG_AFTER_LOGIN = "ARG_AFTER_LOGIN";

@Inject AccountStore mAccountStore;
@Inject ImageManager mImageManager;
Expand All @@ -45,17 +43,14 @@ public class ShareIntentReceiverFragment extends Fragment {

private boolean mSharingMediaFile;
private int mLastUsedBlogLocalId;
private boolean mAfterLogin;
private RecyclerView mRecyclerView;
private View mBottomButtonsContainer;
private View mBottomButtonsShadow;

public static ShareIntentReceiverFragment newInstance(boolean sharingMediaFile, int lastUsedBlogLocalId,
boolean afterLogin) {
public static ShareIntentReceiverFragment newInstance(boolean sharingMediaFile, int lastUsedBlogLocalId) {
ShareIntentReceiverFragment fragment = new ShareIntentReceiverFragment();
Bundle args = new Bundle();
args.putBoolean(ARG_SHARING_MEDIA, sharingMediaFile);
args.putBoolean(ARG_AFTER_LOGIN, afterLogin);
args.putInt(ARG_LAST_USED_BLOG_LOCAL_ID, lastUsedBlogLocalId);
fragment.setArguments(args);
return fragment;
Expand All @@ -81,7 +76,7 @@ public void onAttach(Context context) {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.login_epilogue_screen, container, false);
ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.share_intent_receiver_fragment, container, false);
initButtonsContainer(layout);
initShareActionPostButton(layout);
initShareActionMediaButton(layout, mSharingMediaFile);
Expand All @@ -94,7 +89,6 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((WordPress) getActivity().getApplication()).component().inject(this);
mSharingMediaFile = getArguments().getBoolean(ARG_SHARING_MEDIA);
mAfterLogin = getArguments().getBoolean(ARG_AFTER_LOGIN);
mLastUsedBlogLocalId = getArguments().getInt(ARG_LAST_USED_BLOG_LOCAL_ID);
loadSavedState(savedInstanceState);
}
Expand Down Expand Up @@ -122,15 +116,12 @@ private void initButtonsContainer(ViewGroup layout) {
private void initShareActionPostButton(final ViewGroup layout) {
mSharePostBtn = layout.findViewById(R.id.primary_button);
addShareActionListener(mSharePostBtn, ShareAction.SHARE_TO_POST);
mSharePostBtn.setVisibility(View.VISIBLE);
mSharePostBtn.setText(R.string.share_action_post);
}

private void initShareActionMediaButton(final ViewGroup layout, boolean sharingMediaFile) {
mShareMediaBtn = layout.findViewById(R.id.secondary_button);
addShareActionListener(mShareMediaBtn, ShareAction.SHARE_TO_MEDIA_LIBRARY);
mShareMediaBtn.setVisibility(sharingMediaFile ? View.VISIBLE : View.GONE);
mShareMediaBtn.setText(R.string.share_action_media);
}

private void addShareActionListener(final Button button, final ShareAction shareAction) {
Expand Down Expand Up @@ -184,28 +175,37 @@ public void run() {
return mAdapter;
}

private HeaderHandler createHeaderHandler() {
return new HeaderHandler() {
private ViewHolderHandler<HeaderViewHolder> createHeaderHandler() {
return new ViewHolderHandler<HeaderViewHolder>() {
@Override
public ViewHolder onCreateViewHolder(LayoutInflater layoutInflater, ViewGroup parent,
boolean attachToRoot) {
return new LoginHeaderViewHolder(layoutInflater.inflate(R.layout.login_epilogue_header, parent, false));
public HeaderViewHolder onCreateViewHolder(LayoutInflater layoutInflater, ViewGroup parent,
boolean attachToRoot) {
return new HeaderViewHolder(
layoutInflater.inflate(R.layout.share_intent_receiver_header, parent, false));
}

@Override
public void onBindViewHolder(ViewHolder holder, SiteList sites) {
refreshAccountDetails((LoginHeaderViewHolder) holder, sites);
public void onBindViewHolder(HeaderViewHolder holder, SiteList sites) {
if (!isAdded()) {
return;
}
holder.bindText(getString(
sites.size() == 1 ? R.string.share_intent_adding_to : R.string.share_intent_pick_site));
}
};
}

private void refreshAccountDetails(LoginHeaderViewHolder holder, SiteList sites) {
if (!isAdded()) {
return;
static class HeaderViewHolder extends RecyclerView.ViewHolder {
private final TextView mHeaderTextView;

HeaderViewHolder(View view) {
super(view);
mHeaderTextView = view.findViewById(R.id.header_text_view);
}

void bindText(String text) {
mHeaderTextView.setText(text);
}
holder.updateLoggedInAsHeading(getContext(), mImageManager, mAfterLogin, mAccountStore.getAccount());
holder.showSitesHeading(
getString(sites.size() == 1 ? R.string.share_intent_adding_to : R.string.share_intent_pick_site));
}

enum ShareAction {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,12 @@
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.analytics.AnalyticsTracker;
import org.wordpress.android.fluxc.model.AccountModel;
import org.wordpress.android.fluxc.model.SiteModel;
import org.wordpress.android.login.LoginBaseFormFragment;
import org.wordpress.android.ui.main.SitePickerAdapter;
import org.wordpress.android.ui.main.SitePickerAdapter.SiteList;
import org.wordpress.android.util.GravatarUtils;
import org.wordpress.android.ui.main.SitePickerAdapter.ViewHolderHandler;
import org.wordpress.android.util.StringUtils;
import org.wordpress.android.util.analytics.AnalyticsUtils;
import org.wordpress.android.util.image.ImageManager;
Expand All @@ -40,8 +41,6 @@ public class LoginEpilogueFragment extends LoginBaseFormFragment<LoginEpilogueLi

private RecyclerView mSitesList;
private View mBottomShadow;
private View mBottomButtonsContainer;
private Button mConnectMore;

private SitePickerAdapter mAdapter;
private boolean mDoLoginUpdate;
Expand Down Expand Up @@ -91,10 +90,6 @@ protected ViewGroup createMainView(LayoutInflater inflater, ViewGroup container,
@Override
protected void setupContent(ViewGroup rootView) {
mBottomShadow = rootView.findViewById(R.id.bottom_shadow);

mBottomButtonsContainer = rootView.findViewById(R.id.bottom_buttons);
mConnectMore = mBottomButtonsContainer.findViewById(R.id.secondary_button);

mSitesList = rootView.findViewById(R.id.recycler_view);
mSitesList.setLayoutManager(new LinearLayoutManager(getActivity()));
mSitesList.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
Expand All @@ -104,22 +99,9 @@ protected void setupContent(ViewGroup rootView) {

@Override
protected void setupBottomButtons(Button secondaryButton, Button primaryButton) {
secondaryButton.setVisibility(mShowAndReturn ? View.GONE : View.VISIBLE);
secondaryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mLoginEpilogueListener != null) {
mLoginEpilogueListener.onConnectAnotherSite();
}
}
});

primaryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mLoginEpilogueListener != null) {
mLoginEpilogueListener.onContinue();
}
primaryButton.setOnClickListener(v -> {
if (mLoginEpilogueListener != null) {
mLoginEpilogueListener.onContinue();
}
});
}
Expand Down Expand Up @@ -160,33 +142,45 @@ public void onBeforeLoad(boolean isEmpty) {

@Override
public void onAfterLoad() {
mSitesList.post(new Runnable() {
@Override
public void run() {
if (!isAdded()) {
return;
}

if (mSitesList.computeVerticalScrollRange() > mSitesList.getHeight()) {
mBottomShadow.setVisibility(View.VISIBLE);
} else {
mBottomShadow.setVisibility(View.GONE);
}
mSitesList.post(() -> {
if (!isAdded()) {
return;
}

if (mSitesList.computeVerticalScrollRange() > mSitesList.getHeight()) {
mBottomShadow.setVisibility(View.VISIBLE);
} else {
mBottomShadow.setVisibility(View.GONE);
}
});
}
}, new SitePickerAdapter.HeaderHandler() {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(LayoutInflater layoutInflater, ViewGroup parent,
boolean attachToRoot) {
return new LoginHeaderViewHolder(layoutInflater.inflate(R.layout.login_epilogue_header, parent, false));
}
},
new SitePickerAdapter.ViewHolderHandler<LoginHeaderViewHolder>() {
@Override
public LoginHeaderViewHolder onCreateViewHolder(LayoutInflater layoutInflater, ViewGroup parent,
boolean attachToRoot) {
return new LoginHeaderViewHolder(
layoutInflater.inflate(R.layout.login_epilogue_header, parent, false));
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, SiteList sites) {
refreshAccountDetails((LoginHeaderViewHolder) holder, sites);
}
}, mOldSitesIds);
@Override
public void onBindViewHolder(LoginHeaderViewHolder holder, SiteList sites) {
bindHeaderViewHolder(holder, sites);
}
},
new ViewHolderHandler<LoginFooterViewHolder>() {
@Override
public LoginFooterViewHolder onCreateViewHolder(LayoutInflater layoutInflater, ViewGroup parent,
boolean attachToRoot) {
return new LoginFooterViewHolder(
layoutInflater.inflate(R.layout.login_epilogue_footer, parent, false));
}

@Override
public void onBindViewHolder(LoginFooterViewHolder holder, SiteList sites) {
bindFooterViewHolder(holder, sites);
}
}, mOldSitesIds);
}

@Override
Expand All @@ -209,35 +203,42 @@ public void onResume() {
}
}

private void refreshAccountDetails(LoginHeaderViewHolder holder, SiteList sites) {
private void bindHeaderViewHolder(LoginHeaderViewHolder holder, SiteList sites) {
if (!isAdded()) {
return;
}

final boolean isWpcom = mAccountStore.hasAccessToken();
final boolean hasSites = sites.size() != 0;

if (isWpcom) {
holder.updateLoggedInAsHeading(getContext(), mImageManager, true, mAccountStore.getAccount());
} else if (sites.size() != 0) {
SiteModel site = mSiteStore.getSiteByLocalId(sites.get(0).getLocalId());
int avatarSz = getResources().getDimensionPixelSize(R.dimen.avatar_sz_large);

String avatarUrl = GravatarUtils.gravatarFromEmail(site.getEmail(), avatarSz);
String username = site.getUsername();
String displayName = site.getDisplayName();

holder.updateLoggedInAsHeading(getContext(), mImageManager, true, avatarUrl, username, displayName);
final AccountModel account = mAccountStore.getAccount();
holder.updateLoggedInAsHeading(getContext(), mImageManager, account);
} else if (hasSites) {
final SiteModel site = mSiteStore.getSiteByLocalId(sites.get(0).getLocalId());
holder.updateLoggedInAsHeading(getContext(), mImageManager, site);
}

if (sites.size() == 0) {
holder.hideSitesHeading();
mConnectMore.setText(R.string.connect_site);
} else {
if (hasSites) {
holder.showSitesHeading(StringUtils.getQuantityString(
getActivity(), R.string.days_quantity_one, R.string.login_epilogue_mysites_one,
getActivity(), R.string.login_epilogue_mysites_one, R.string.login_epilogue_mysites_one,
R.string.login_epilogue_mysites_other, sites.size()));
} else {
holder.hideSitesHeading();
}
}

mConnectMore.setText(R.string.connect_more);
private void bindFooterViewHolder(LoginFooterViewHolder holder, SiteList sites) {
holder.itemView.setVisibility(mShowAndReturn ? View.GONE : View.VISIBLE);
holder.itemView.setOnClickListener(v -> {
if (mLoginEpilogueListener != null) {
mLoginEpilogueListener.onConnectAnotherSite();
}
});
if (sites.size() == 0) {
holder.bindText(getString(R.string.connect_site));
} else {
holder.bindText(getString(R.string.connect_more));
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.wordpress.android.ui.accounts.login;

import android.view.View;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

import org.wordpress.android.R;

public class LoginFooterViewHolder extends RecyclerView.ViewHolder {
private final TextView mFooterTextView;

LoginFooterViewHolder(View view) {
super(view);
mFooterTextView = view.findViewById(R.id.footer_text_view);
}

public void bindText(String text) {
mFooterTextView.setText(text);
}
}
Loading