/******************************************************************************* * Copyright (c) 2015 Aptoide. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v2.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html ******************************************************************************/ package com.aptoide.amethyst.adapter; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.View; import com.aptoide.amethyst.R; import com.aptoide.amethyst.downloadmanager.adapter.NotOngoingDownloadRow; import com.aptoide.amethyst.downloadmanager.adapter.OngoingDownloadRow; import com.aptoide.amethyst.models.EnumStoreTheme; import com.aptoide.models.displayables.StoreHeaderRow; import com.aptoide.dataprovider.webservices.models.Constants; import com.aptoide.models.displayables.AdItem; import com.aptoide.models.displayables.AdultItem; import com.aptoide.models.displayables.AppItem; import com.aptoide.models.displayables.BrickAppItem; import com.aptoide.models.displayables.CommentItem; import com.aptoide.models.displayables.Displayable; import com.aptoide.models.displayables.EditorsChoiceRow; import com.aptoide.models.displayables.HeaderRow; import com.aptoide.models.displayables.HomeStoreItem; import com.aptoide.models.IHasMore; import com.aptoide.models.displayables.MoreVersionsItem; import com.aptoide.models.displayables.ProgressBarRow; import com.aptoide.models.displayables.ReviewRowItem; import com.aptoide.models.displayables.CategoryRow; import com.aptoide.models.displayables.TimelineRow; import com.aptoide.models.displayables.CommentPlaceHolderRow; import com.aptoide.models.displayables.ReviewPlaceHolderRow; import com.aptoide.models.displayables.TimeLinePlaceHolderRow; import java.util.List; import com.aptoide.amethyst.AppViewActivity; import com.aptoide.amethyst.SearchActivity; import com.aptoide.amethyst.ui.MoreCommentsActivity; import com.aptoide.amethyst.ui.MoreFriendsInstallsActivity; import com.aptoide.amethyst.ui.MoreHighlightedActivity; import com.aptoide.amethyst.ui.MoreListViewItemsActivity; import com.aptoide.amethyst.ui.MoreListViewItemsBrickActivity; import com.aptoide.amethyst.ui.MoreReviewsActivity; import com.aptoide.amethyst.ui.MoreStoreWidgetActivity; import com.aptoide.amethyst.viewholders.BaseViewHolder; import static com.aptoide.dataprovider.webservices.models.v7.GetStoreWidgets.Datalist.WidgetList.ADS_TYPE; import static com.aptoide.dataprovider.webservices.models.v7.GetStoreWidgets.Datalist.WidgetList.Action.Event.EVENT_FACEBOOK_TYPE; import static com.aptoide.dataprovider.webservices.models.v7.GetStoreWidgets.Datalist.WidgetList.Action.Event.EVENT_GETSTOREWIDGETS; import static com.aptoide.dataprovider.webservices.models.v7.GetStoreWidgets.Datalist.WidgetList.Action.Event.EVENT_LIST_APPS; import static com.aptoide.dataprovider.webservices.models.v7.GetStoreWidgets.Datalist.WidgetList.Action.Event.EVENT_LIST_STORES; import static com.aptoide.dataprovider.webservices.models.v7.GetStoreWidgets.Datalist.WidgetList.Action.Event.EVENT_YOUTUBE_TYPE; import static com.aptoide.dataprovider.webservices.models.v7.GetStoreWidgets.Datalist.WidgetList.COMMENTS_TYPE; import static com.aptoide.dataprovider.webservices.models.v7.GetStoreWidgets.Datalist.WidgetList.REVIEWS_TYPE; import static com.aptoide.dataprovider.webservices.models.v7.GetStoreWidgets.Datalist.WidgetList.TIMELINE_TYPE; /** * Created by hsousa on 08/08/15. */ public abstract class BaseAdapter extends RecyclerView.Adapter<BaseViewHolder> { protected List<Displayable> displayableList; public BaseAdapter(List<Displayable> displayableList) { this.displayableList = displayableList; } @Override public int getItemCount() { return displayableList.size(); } @Override public void onBindViewHolder(BaseViewHolder holder, int position) { holder.populateView(displayableList.get(position)); } /** * In order to refactor this listener to be inherited, it will be necessary to finish * all AppItem listeners and extract the common code */ public static class AppItemOnClickListener implements View.OnClickListener { private final AppItem appItem; public AppItemOnClickListener(AppItem appItem) { this.appItem = appItem; } @Override public void onClick(View view) { Intent i = new Intent(view.getContext(), AppViewActivity.class); i.putExtra(Constants.FROM_RELATED_KEY, true); i.putExtra(Constants.APP_ID_KEY, appItem.id); i.putExtra(Constants.APPNAME_KEY, appItem.appName); i.putExtra(Constants.MD5SUM_KEY, appItem.md5sum); i.putExtra(Constants.DOWNLOAD_FROM_KEY, Constants.LOCAL_TOP_APPS_VALUE); i.putExtra(Constants.ICON_KEY, appItem.icon); i.putExtra(Constants.DOWNLOADS_KEY, appItem.downloads); i.putExtra(Constants.RATING_KEY, appItem.rating); i.putExtra(Constants.GRAPHIC_KEY, appItem.featuredGraphic); i.putExtra(Constants.FILESIZE_KEY, appItem.fileSize); i.putExtra(Constants.STOREID_KEY, appItem.storeId); i.putExtra(Constants.STORENAME_KEY, appItem.storeName); i.putExtra(Constants.PACKAGENAME_KEY, appItem.packageName); i.putExtra(Constants.VERSIONNAME_KEY, appItem.versionName); view.getContext().startActivity(i); } } public static class AdAppItemOnClickListener implements View.OnClickListener { private final AdItem adItem; public AdAppItemOnClickListener(AdItem adItem) { this.adItem = adItem; } @Override public void onClick(View view) { Intent i = new Intent(view.getContext(), AppViewActivity.class); i.putExtra(Constants.FROM_SPONSORED_KEY, true); i.putExtra(Constants.APP_ID_KEY, adItem.id); i.putExtra(Constants.AD_ID_KEY, adItem.adId); i.putExtra(Constants.APPNAME_KEY, adItem.appName); i.putExtra(Constants.PACKAGENAME_KEY, adItem.packageName); i.putExtra(Constants.STORENAME_KEY, adItem.storeName); i.putExtra(Constants.CPC_KEY, adItem.cpcUrl); i.putExtra(Constants.CPI_KEY, adItem.cpiUrl); i.putExtra(Constants.CPD_KEY, adItem.cpdUrl); i.putExtra(Constants.LOCATION_KEY, "homepage"); i.putExtra(Constants.KEYWORD_KEY, "__NULL__"); i.putExtra(Constants.WHERE_FROM_KEY, "sponsored"); i.putExtra(Constants.DOWNLOAD_FROM_KEY, "sponsored"); if (adItem.partnerName != null && adItem.partnerClickUrl != null) { Bundle bundle = new Bundle(); bundle.putString("partnerType", adItem.partnerName); bundle.putString("partnerClickUrl", adItem.partnerClickUrl); i.putExtra("partnerExtra", bundle); } view.getContext().startActivity(i); } } public static class TimelineItemOnClickListener implements View.OnClickListener { private final TimelineRow item; public TimelineItemOnClickListener(TimelineRow item) { this.item = item; } @Override public void onClick(View view) { Intent i = new Intent(view.getContext(), AppViewActivity.class); i.putExtra(Constants.FROM_TIMELINE_KEY, true); i.putExtra(Constants.STORENAME_KEY, item.repoName); i.putExtra(Constants.APPNAME_KEY, item.appName); i.putExtra(Constants.MD5SUM_KEY, item.md5sum); i.putExtra(Constants.DOWNLOAD_FROM_KEY, "timeline"); view.getContext().startActivity(i); } } public static class CommentItemOnClickListener implements View.OnClickListener { private final CommentItem item; public CommentItemOnClickListener(CommentItem item) { this.item = item; } @Override public void onClick(View view) { if (item != null && item.appid != null) { Intent i = new Intent(view.getContext(), AppViewActivity.class); i.putExtra(Constants.APP_ID_KEY, item.appid.longValue()); i.putExtra(Constants.APPNAME_KEY, item.appname); i.putExtra(Constants.FROM_COMMENT_KEY, true); view.getContext().startActivity(i); } } } public static class IHasMoreOnClickListener implements View.OnClickListener { private final IHasMore row; private final EnumStoreTheme theme; private final String storeName; private final long storeId; public IHasMoreOnClickListener(IHasMore row, EnumStoreTheme theme) { this.row = row; this.theme = theme; storeName = null; this.storeId = 0; } public IHasMoreOnClickListener(IHasMore row, EnumStoreTheme theme, String storeName) { this.row = row; this.theme = theme; this.storeName = storeName; this.storeId = 0; } public IHasMoreOnClickListener(IHasMore row, EnumStoreTheme theme, long storeId) { this.row = row; this.theme = theme; this.storeName = null; this.storeId = storeId; } public IHasMoreOnClickListener(IHasMore row, EnumStoreTheme theme, String storeName, long storeId) { this.row = row; this.theme = theme; this.storeName = storeName; this.storeId = storeId; } @Override public void onClick(View view) { if (row.isHasMore() && row.getEventName() != null) { Intent i = null; switch (row.getEventName()) { case EVENT_LIST_APPS: if (row.getLayout().equals(Constants.LAYOUT_BRICK)) { i = new Intent(view.getContext(), MoreListViewItemsBrickActivity.class); } else { i = new Intent(view.getContext(), MoreListViewItemsActivity.class); if (storeName != null && !TextUtils.isEmpty(storeName)) { i.putExtra(SearchActivity.SEARCH_THEME, theme); i.putExtra(SearchActivity.SEARCH_SOURCE, storeName); } } break; case EVENT_LIST_STORES: i = new Intent(view.getContext(), MoreListViewItemsActivity.class); break; case EVENT_GETSTOREWIDGETS: i = new Intent(view.getContext(), MoreStoreWidgetActivity.class); break; case EVENT_FACEBOOK_TYPE: case EVENT_YOUTUBE_TYPE: i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(row.getEventActionUrl())); view.getContext().startActivity(i); return; case ADS_TYPE: i = new Intent(view.getContext(), MoreHighlightedActivity.class); break; case TIMELINE_TYPE: i = new Intent(view.getContext(), MoreFriendsInstallsActivity.class); break; case REVIEWS_TYPE: i = new Intent(view.getContext(), MoreReviewsActivity.class); if (storeId > 0) { i.putExtra(Constants.STOREID_KEY, storeId); } break; case COMMENTS_TYPE: i = new Intent(view.getContext(), MoreCommentsActivity.class); break; default: break; } if (i != null) { i.putExtra(Constants.EVENT_ACTION_URL, row.getEventActionUrl()); i.putExtra(Constants.EVENT_NAME, row.getEventName()); i.putExtra(Constants.EVENT_TYPE, row.getEventType()); i.putExtra(Constants.EVENT_LABEL, row.getLabel()); i.putExtra(Constants.LOCALYTICS_TAG, row.getTag()); i.putExtra(Constants.THEME_KEY, theme == null ? 0 : theme.ordinal()); i.putExtra(Constants.HOMEPAGE_KEY, row.getHomepage()); if (i.getLongExtra(Constants.STOREID_KEY, 0) == 0) { i.putExtra(Constants.STOREID_KEY, row.getStoreId()); } view.getContext().startActivity(i); } } } } @Override public int getItemViewType(int position) { Displayable displayable = displayableList.get(position); if (displayable instanceof HeaderRow) { return R.layout.layout_header; } else if (displayable instanceof EditorsChoiceRow) { return R.layout.editors_choice_row; } else if (displayable instanceof StoreHeaderRow) { return R.layout.row_store_header; } else if (displayable instanceof ReviewRowItem) { return R.layout.row_review; } else if (displayable instanceof ReviewPlaceHolderRow) { return R.layout.row_empty; } else if (displayable instanceof CategoryRow) { return R.layout.row_category_home_item; } else if (displayable instanceof TimeLinePlaceHolderRow) { return R.layout.row_empty; } else if (displayable instanceof TimelineRow) { return R.layout.timeline_item; } else if (displayable instanceof HomeStoreItem) { return R.layout.row_store_item; } else if (displayable instanceof AdultItem) { return R.layout.row_adult_switch; } else if (displayable instanceof ProgressBarRow) { return R.layout.row_progress_bar; } else if (displayable instanceof MoreVersionsItem) { return R.layout.grid_item; } else if (displayable instanceof CommentItem) { return R.layout.comment_row; } else if (displayable instanceof OngoingDownloadRow) { return R.layout.row_app_downloading_ongoing; } else if (displayable instanceof NotOngoingDownloadRow) { return R.layout.row_app_downloading_notongoing; } else if (displayable instanceof BrickAppItem) { // this has to be above the instanceof AppItem instruction return R.layout.brick_app_item; } else if (displayable instanceof AppItem) { return R.layout.grid_item; } else if (displayable instanceof CommentPlaceHolderRow) { return R.layout.row_empty; } // else { // throw new IllegalStateException("InvalidType"); // } return R.layout.row_empty; } }