blob: cb18d7393ece064ae9ac0a48322be2fc3e9a9a3d [file] [log] [blame]
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.models.AccountHelper;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.BlogUtils;
import org.wordpress.android.util.GravatarUtils;
import org.wordpress.android.util.MapUtils;
import org.wordpress.android.widgets.WPNetworkImageView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
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 int mCurrentLocalId;
private final Drawable mSelectedItemBackground;
private final LayoutInflater mInflater;
private boolean mShowHiddenSites = false;
private boolean mShowSelfHostedSites = true;
private OnSiteClickListener mSiteSelectedListener;
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, int currentLocalBlogId) {
super();
setHasStableIds(true);
mCurrentLocalId = currentLocalBlogId;
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.translucent_grey_lighten_20));
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 == mCurrentLocalId) {
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<Map<String, Object>> blogs;
String[] extraFields = {"isHidden", "dotcomFlag", "homeURL"};
blogs = getBlogsForCurrentView(extraFields);
SiteList sites = new SiteList(blogs);
// sort by blog/host
final long primaryBlogId = AccountHelper.getDefaultAccount().getPrimaryBlogId();
Collections.sort(sites, new Comparator<SiteRecord>() {
public int compare(SiteRecord site1, SiteRecord site2) {
if (primaryBlogId > 0) {
if (site1.blogId == primaryBlogId) {
return -1;
} else if (site2.blogId == primaryBlogId) {
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<Map<String, Object>> getBlogsForCurrentView(String[] extraFields) {
if (mShowHiddenSites) {
if (mShowSelfHostedSites) {
// all self-hosted blogs and all wp.com blogs
return WordPress.wpDB.getBlogsBy(null, extraFields);
} else {
// only wp.com blogs
return WordPress.wpDB.getBlogsBy("dotcomFlag=1", extraFields);
}
} else {
if (mShowSelfHostedSites) {
// all self-hosted blogs plus visible wp.com blogs
return WordPress.wpDB.getBlogsBy("dotcomFlag=0 OR (isHidden=0 AND dotcomFlag=1) ", extraFields);
} else {
// only visible wp.com blogs
return WordPress.wpDB.getBlogsBy("isHidden=0 AND dotcomFlag=1", extraFields);
}
}
}
}
/**
* SiteRecord is a simplified version of the full account (blog) record
*/
static class SiteRecord {
final int localId;
final int blogId;
final String blogName;
final String homeURL;
final String url;
final String blavatarUrl;
final boolean isDotCom;
final boolean isHidden;
SiteRecord(Map<String, Object> account) {
localId = MapUtils.getMapInt(account, "id");
blogId = MapUtils.getMapInt(account, "blogId");
blogName = BlogUtils.getBlogNameOrHomeURLFromAccountMap(account);
homeURL = BlogUtils.getHomeURLOrHostNameFromAccountMap(account);
url = MapUtils.getMapStr(account, "url");
blavatarUrl = GravatarUtils.blavatarFromUrl(url, mBlavatarSz);
isDotCom = MapUtils.getMapBool(account, "dotcomFlag");
isHidden = MapUtils.getMapBool(account, "isHidden");
}
String getBlogNameOrHomeURL() {
if (TextUtils.isEmpty(blogName)) {
return homeURL;
}
return blogName;
}
}
static class SiteList extends ArrayList<SiteRecord> {
SiteList() { }
SiteList(List<Map<String, Object>> accounts) {
if (accounts != null) {
for (Map<String, Object> account : accounts) {
add(new SiteRecord(account));
}
}
}
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;
}
}
}