package org.wordpress.android.ui.stats;
import android.content.Context;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.fluxc.model.SiteModel;
import org.wordpress.android.fluxc.store.SiteStore;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.SiteUtils;
import org.wordpress.android.widgets.WPNetworkImageView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.inject.Inject;
public class StatsWidgetConfigureAdapter extends RecyclerView.Adapter<StatsWidgetConfigureAdapter.SiteViewHolder> {
interface OnSiteClickListener {
void onSiteClick(SiteRecord site);
}
private final int mTextColorNormal;
private final int mTextColorHidden;
private static int mBlavatarSz;
private SiteList mSites = new SiteList();
private final long mPrimarySiteId;
private final Drawable mSelectedItemBackground;
private final LayoutInflater mInflater;
private boolean mShowHiddenSites = false;
private boolean mShowSelfHostedSites = true;
private OnSiteClickListener mSiteSelectedListener;
@Inject SiteStore mSiteStore;
class SiteViewHolder extends RecyclerView.ViewHolder {
private final ViewGroup layoutContainer;
private final TextView txtTitle;
private final TextView txtDomain;
private final WPNetworkImageView imgBlavatar;
private final View divider;
private Boolean isSiteHidden;
public SiteViewHolder(View view) {
super(view);
layoutContainer = (ViewGroup) view.findViewById(R.id.layout_container);
txtTitle = (TextView) view.findViewById(R.id.text_title);
txtDomain = (TextView) view.findViewById(R.id.text_domain);
imgBlavatar = (WPNetworkImageView) view.findViewById(R.id.image_blavatar);
divider = view.findViewById(R.id.divider);
isSiteHidden = null;
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mSiteSelectedListener != null) {
int clickedPosition = getAdapterPosition();
mSiteSelectedListener.onSiteClick(getItem(clickedPosition));
}
}
});
}
}
public StatsWidgetConfigureAdapter(Context context, long primarySiteId) {
super();
((WordPress) context.getApplicationContext()).component().inject(this);
setHasStableIds(true);
mPrimarySiteId = primarySiteId;
mInflater = LayoutInflater.from(context);
mBlavatarSz = context.getResources().getDimensionPixelSize(R.dimen.blavatar_sz);
mTextColorNormal = context.getResources().getColor(R.color.grey_dark);
mTextColorHidden = context.getResources().getColor(R.color.grey);
mSelectedItemBackground = new ColorDrawable(context.getResources().getColor(R.color.grey_lighten_20_translucent_50));
loadSites();
}
@Override
public int getItemCount() {
return mSites.size();
}
@Override
public long getItemId(int position) {
return getItem(position).localId;
}
private SiteRecord getItem(int position) {
return mSites.get(position);
}
public void setOnSiteClickListener(OnSiteClickListener listener) {
mSiteSelectedListener = listener;
}
@Override
public SiteViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = mInflater.inflate(R.layout.site_picker_listitem, parent, false);
return new SiteViewHolder(itemView);
}
@Override
public void onBindViewHolder(SiteViewHolder holder, int position) {
SiteRecord site = getItem(position);
holder.txtTitle.setText(site.getBlogNameOrHomeURL());
holder.txtDomain.setText(site.homeURL);
holder.imgBlavatar.setImageUrl(site.blavatarUrl, WPNetworkImageView.ImageType.BLAVATAR);
if (site.localId == mPrimarySiteId) {
holder.layoutContainer.setBackgroundDrawable(mSelectedItemBackground);
} else {
holder.layoutContainer.setBackgroundDrawable(null);
}
// different styling for visible/hidden sites
if (holder.isSiteHidden == null || holder.isSiteHidden != site.isHidden) {
holder.isSiteHidden = site.isHidden;
holder.txtTitle.setTextColor(site.isHidden ? mTextColorHidden : mTextColorNormal);
holder.txtTitle.setTypeface(holder.txtTitle.getTypeface(), site.isHidden ? Typeface.NORMAL : Typeface.BOLD);
holder.imgBlavatar.setAlpha(site.isHidden ? 0.5f : 1f);
}
// hide the divider for the last item
boolean isLastItem = (position == getItemCount() - 1);
holder.divider.setVisibility(isLastItem ? View.INVISIBLE : View.VISIBLE);
}
private void loadSites() {
if (mIsTaskRunning) {
AppLog.w(AppLog.T.UTILS, "site picker > already loading sites");
} else {
new LoadSitesTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}
/*
* AsyncTask which loads sites from database and populates the adapter
*/
private boolean mIsTaskRunning;
private class LoadSitesTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mIsTaskRunning = true;
}
@Override
protected void onCancelled() {
super.onCancelled();
mIsTaskRunning = false;
}
@Override
protected Void doInBackground(Void... params) {
List<SiteModel> siteModels = getBlogsForCurrentView();
SiteList sites = new SiteList(siteModels);
// sort by blog/host
Collections.sort(sites, new Comparator<SiteRecord>() {
public int compare(SiteRecord site1, SiteRecord site2) {
if (mPrimarySiteId > 0) {
if (site1.blogId == mPrimarySiteId) {
return -1;
} else if (site2.blogId == mPrimarySiteId) {
return 1;
}
}
return site1.getBlogNameOrHomeURL().compareToIgnoreCase(site2.getBlogNameOrHomeURL());
}
});
if (mSites == null || !mSites.isSameList(sites)) {
mSites = sites;
}
return null;
}
@Override
protected void onPostExecute(Void results) {
notifyDataSetChanged();
mIsTaskRunning = false;
}
private List<SiteModel> getBlogsForCurrentView() {
if (mShowHiddenSites) {
if (mShowSelfHostedSites) {
return mSiteStore.getSites();
} else {
return mSiteStore.getSitesAccessedViaWPComRest();
}
} else {
if (mShowSelfHostedSites) {
List<SiteModel> out = mSiteStore.getVisibleSitesAccessedViaWPCom();
out.addAll(mSiteStore.getSitesAccessedViaXMLRPC());
return out;
} else {
return mSiteStore.getVisibleSitesAccessedViaWPCom();
}
}
}
}
/**
* SiteRecord is a simplified version of the full account (blog) record
*/
static class SiteRecord {
final int localId;
final long blogId;
final String blogName;
final String homeURL;
final String url;
final String blavatarUrl;
final boolean isDotComOrJetpack;
final boolean isHidden;
SiteRecord(SiteModel site) {
localId = site.getId();
blogId = site.getSiteId();
blogName = SiteUtils.getSiteNameOrHomeURL(site);
homeURL = SiteUtils.getHomeURLOrHostName(site);
url = site.getUrl();
blavatarUrl = SiteUtils.getSiteIconUrl(site, mBlavatarSz);
isDotComOrJetpack = SiteUtils.isAccessedViaWPComRest(site);
isHidden = !site.isVisible();
}
String getBlogNameOrHomeURL() {
if (TextUtils.isEmpty(blogName)) {
return homeURL;
}
return blogName;
}
}
static class SiteList extends ArrayList<SiteRecord> {
SiteList() { }
SiteList(List<SiteModel> sites) {
if (sites != null) {
for (SiteModel site : sites) {
add(new SiteRecord(site));
}
}
}
boolean isSameList(SiteList sites) {
if (sites == null || sites.size() != this.size()) {
return false;
}
int i;
for (SiteRecord site: sites) {
i = indexOfSite(site);
if (i == -1 || this.get(i).isHidden != site.isHidden) {
return false;
}
}
return true;
}
int indexOfSite(SiteRecord site) {
if (site != null && site.blogId > 0) {
for (int i = 0; i < size(); i++) {
if (site.blogId == this.get(i).blogId) {
return i;
}
}
}
return -1;
}
}
}