Created
May 5, 2017 20:37
-
-
Save fernando-jascovich/1e86eca2e562f1e509cdb61908a284d9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package com.elnuevodia.androidapplication.home; | |
| import com.elnuevodia.androidapplication.Main; | |
| import com.elnuevodia.androidapplication.R; | |
| import android.os.Bundle; | |
| import android.support.v4.widget.SwipeRefreshLayout; | |
| import android.support.v7.widget.GridLayoutManager; | |
| import android.support.v7.app.AlertDialog; | |
| import retrofit2.Callback; | |
| import com.gfr.nativecore.Api; | |
| import com.elnuevodia.androidapplication.services.Endi; | |
| import android.support.v7.widget.RecyclerView; | |
| import retrofit2.Retrofit; | |
| import android.view.View; | |
| import com.elnuevodia.androidapplication.model.VideosModel; | |
| import com.elnuevodia.androidapplication.model.PhotogalleriesResponseModel; | |
| import com.elnuevodia.androidapplication.model.LiveListModel; | |
| import com.elnuevodia.androidapplication.services.Mvp; | |
| import com.elnuevodia.androidapplication.services.EndiCdn; | |
| import android.util.SparseArray; | |
| import android.content.Intent; | |
| import android.net.Uri; | |
| import com.elnuevodia.androidapplication.model.NewsModel.Section; | |
| import com.elnuevodia.androidapplication.model.NewsModel; | |
| import java.util.HashMap; | |
| import android.content.Context; | |
| import com.facebook.drawee.backends.pipeline.Fresco; | |
| import android.graphics.drawable.Animatable; | |
| import com.facebook.imagepipeline.image.ImageInfo; | |
| import com.facebook.drawee.controller.BaseControllerListener; | |
| import com.facebook.drawee.controller.ControllerListener; | |
| import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; | |
| import com.google.android.gms.ads.formats.NativeAd; | |
| import com.google.android.gms.ads.formats.NativeCustomTemplateAd; | |
| import com.google.android.gms.ads.AdLoader; | |
| import com.facebook.drawee.view.SimpleDraweeView; | |
| import android.location.LocationManager; | |
| import android.content.pm.PackageManager; | |
| import android.support.v4.content.ContextCompat; | |
| import com.gfr.nativecore.helpers.DFPHelper; | |
| import com.google.android.gms.ads.doubleclick.PublisherAdRequest; | |
| import com.gfr.nativecore.helpers.CxenseHelper; | |
| import com.gfr.nativecore.User; | |
| import android.Manifest; | |
| import java.util.List; | |
| import android.location.Location; | |
| import android.util.Log; | |
| import com.google.gson.Gson; | |
| public class Home extends Main { | |
| private RecyclerView recycler; | |
| private SwipeRefreshLayout swipeRefresh; | |
| private HomeAdapter adapter; | |
| private SectionToolbar sectionToolbar; | |
| private HomeToolbar homeToolbar; | |
| private SimpleDraweeView adScrollToReveal; | |
| @Override | |
| public void onCreate(Bundle savedInstanceState) { | |
| super.onCreate(savedInstanceState); | |
| recycler = (RecyclerView) findViewById(R.id.recycler); | |
| recycler.setHasFixedSize(true); | |
| swipeRefresh = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout); | |
| swipeRefresh.setOnRefreshListener(() -> refresh()); | |
| sectionToolbar = (SectionToolbar) findViewById(R.id.section_toolbar); | |
| homeToolbar = (HomeToolbar) findViewById(R.id.toolbar); | |
| adScrollToReveal = (SimpleDraweeView) findViewById(R.id.ad_scroll_to_reveal); | |
| final GridLayoutManager lm = new GridLayoutManager(this, 2); | |
| lm.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { | |
| @Override | |
| public int getSpanSize(int pos) { | |
| for(int i : HomeAdapter.POS_FULL) { | |
| if(pos == i) return 2; | |
| } | |
| return 1; | |
| } | |
| }); | |
| recycler.setLayoutManager(lm); | |
| recycler.addOnScrollListener(new RecyclerView.OnScrollListener() { | |
| private SparseArray<HashMap<String, String>> cached = | |
| new SparseArray<>(); | |
| int activePos = 0; | |
| @Override | |
| public void onScrollStateChanged(RecyclerView r, int newState) {} | |
| @Override | |
| public void onScrolled(RecyclerView r, int dx, int dy) { | |
| int visible = lm.findFirstVisibleItemPosition(); | |
| HashMap<String, String> h = null; | |
| if(visible < activePos && dy < 0) { | |
| h = findCachedBackwards(visible - 1); | |
| if(h != null && | |
| activePos != Integer.valueOf(h.get("pos"))) { | |
| bind(h); | |
| return; | |
| } | |
| sectionToolbar.hide(); | |
| activePos = 0; | |
| } else if(dy > 0) { | |
| h = findCachedBackwards(visible + 1); | |
| if(h != null | |
| && activePos != Integer.valueOf(h.get("pos"))) { | |
| bind(h); | |
| return; | |
| } | |
| } | |
| View v = null; | |
| for(int full : HomeAdapter.POS_FULL) { | |
| if(visible == full && visible > 5) { | |
| v = r.findChildViewUnder(0, 0); | |
| break; | |
| } | |
| } | |
| if(v == null) return; | |
| final HomeAdapter.FeaturedVH holder; | |
| try { | |
| holder = (HomeAdapter.FeaturedVH) | |
| r.findContainingViewHolder(v); | |
| if(holder.catArea == null) { | |
| throw new Exception("null catArea"); | |
| } | |
| if(cached.get(visible) != null) { | |
| throw new Exception("already cached"); | |
| } | |
| } catch(Exception e) { return; } | |
| NewsModel.Section s = (NewsModel.Section) holder.more.getTag(); | |
| HashMap<String, String> el = new HashMap<>(); | |
| el.put("title", holder.cat.getText().toString()); | |
| el.put("click", "endi://news/" + s.identifier); | |
| el.put("pos", String.valueOf(visible)); | |
| cached.put(visible, el); | |
| bind(el); | |
| } | |
| private HashMap<String, String> findCachedBackwards(int i) { | |
| for(int a = i - 1; a > -1; a--) { | |
| if(cached.get(a) != null) return cached.get(a); | |
| } | |
| return null; | |
| } | |
| private void bind(final HashMap<String, String> h) { | |
| activePos = Integer.valueOf(h.get("pos")); | |
| sectionToolbar | |
| .setValues(h.get("title"), | |
| (v) -> { | |
| Uri uri = Uri.parse(h.get("click")); | |
| Intent intent = new Intent(Intent.ACTION_VIEW, uri); | |
| final Context c = v.getContext(); | |
| ((Main) c).goToIntent(intent); | |
| }); | |
| } | |
| }); | |
| refresh(); | |
| } | |
| @Override protected int getContentViewId() { return R.layout.home; } | |
| @Override protected boolean hasBottomNavigation() { return true; } | |
| @Override public View getLoadingView() { return swipeRefresh; } | |
| private void refresh() { | |
| Retrofit retrofit = Api.forBaseUrl(Endi.BASE_URL); | |
| Endi service = retrofit.create(Endi.class); | |
| swipeRefresh.setRefreshing(true); | |
| Callback<HomeModel> c = Api.callback((response) -> { | |
| if(isFinishing()) return; | |
| swipeRefresh.setRefreshing(false); | |
| if(response == null) { | |
| new AlertDialog.Builder(this) | |
| .setMessage(R.string.error_api) | |
| .setPositiveButton(R.string.error_api_btn, | |
| (dialog, which) -> dialog.dismiss()) | |
| .show(); | |
| return; | |
| } | |
| adapter = new HomeAdapter(response); | |
| recycler.setAdapter(adapter); | |
| loadVideos(); | |
| loadPhotos(); | |
| live(); | |
| CxenseHelper.getUserSegments(getApplicationContext(), | |
| User.getInstance().uid, | |
| (segments) -> loadScrollToRevealAd(segments)); | |
| }); | |
| service.home(getString(R.string.key_endi_api)).enqueue(c); | |
| } | |
| private void loadVideos() { | |
| Mvp service = Api.forBaseUrl(Mvp.BASE_URL).create(Mvp.class); | |
| Callback<VideosModel> c = Api.callback((response) -> { | |
| if(isFinishing() | |
| || response == null | |
| || response.items == null | |
| || response.items.size() < 1) return; | |
| adapter.setVideos(response.items); | |
| }); | |
| service.all(getString(R.string.key_mvp_api), | |
| 5, | |
| "categories").enqueue(c); | |
| } | |
| private void loadPhotos() { | |
| Endi service = Api.forBaseUrl(Endi.BASE_URL).create(Endi.class); | |
| Callback<PhotogalleriesResponseModel> c = Api.callback((response) -> { | |
| if(isFinishing() | |
| || response == null | |
| || response.photogalleries == null | |
| || response.photogalleries.get("noticias") == null | |
| || response.photogalleries.get("noticias").size() < 1) return; | |
| adapter.setPhotos(response.photogalleries.get("noticias")); | |
| }); | |
| service.photos("noticias", getString(R.string.key_endi_api)).enqueue(c); | |
| } | |
| private void live() { | |
| Mvp service = Api.forBaseUrl(Mvp.BASE_URL).create(Mvp.class); | |
| Callback<LiveListModel> c = Api.callback((response) -> { | |
| if(isFinishing() | |
| || response == null | |
| || response.items == null | |
| || response.items.size() < 1) { | |
| special(); | |
| return; | |
| } | |
| adapter.setLiveEvent(response.items.get(0)); | |
| }); | |
| service.liveList(getString(R.string.key_mvp_api)).enqueue(c); | |
| } | |
| private void special() { | |
| EndiCdn service = Api.forBaseUrl(EndiCdn.BASE_URL).create(EndiCdn.class); | |
| service.special().enqueue(Api.callback((r) -> { | |
| if(isFinishing() || r == null || r.special_website == null) { | |
| return; | |
| } | |
| adapter.setSpecial(r.special_website); | |
| })); | |
| } | |
| private void loadScrollToRevealAd(List<String> segments) { | |
| PublisherAdRequest.Builder builder = new PublisherAdRequest.Builder(); | |
| builder.addCustomTargeting("section", "Home"); | |
| builder.addCustomTargeting("contentType", DFPHelper.CONTENT_TYPE_NEWS); | |
| builder.addCustomTargeting("referred", DFPHelper.REFERRED_INTERNAL); | |
| builder.addCustomTargeting("pageType", DFPHelper.PAGE_TYPE_TRUNK); | |
| builder.addCustomTargeting("environment", | |
| getString(R.string.key_dfp_env)); | |
| builder.addCustomTargeting("publisher", | |
| getString(R.string.key_dfp_publisher)); | |
| if(segments != null && segments.size() > 0) { | |
| builder.addCustomTargeting("cxsegments", segments); | |
| } | |
| int locPermission = ContextCompat | |
| .checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); | |
| if(locPermission == PackageManager.PERMISSION_GRANTED) { | |
| LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); | |
| Location loc = null; | |
| for(String s : new String[] { | |
| LocationManager.GPS_PROVIDER, | |
| LocationManager.NETWORK_PROVIDER | |
| }) { | |
| loc = lm.getLastKnownLocation(s); | |
| if(loc != null) break; | |
| } | |
| if(loc != null) builder.setLocation(loc); | |
| } | |
| AdLoader adLoader = new AdLoader | |
| .Builder(this, getString(R.string.key_dfp_scroller_unit)) | |
| .forCustomTemplateAd(getString(R.string.key_dfp_scroller_template), | |
| (ad) -> showScrollToRevealAd(ad), | |
| (ad, s) -> { | |
| Log.d("DEBUG", String.format("click: %s", | |
| s)); | |
| }) | |
| .build(); | |
| adLoader.loadAd(builder.build()); | |
| } | |
| private void showScrollToRevealAd(final NativeCustomTemplateAd ad) { | |
| String imageKey = getString(R.string.key_dfp_scroller_key_img); | |
| NativeAd.Image image = ad.getImage(imageKey); | |
| if(image != null) { | |
| int height = image.getDrawable().getIntrinsicHeight(); | |
| if(height < 101) { | |
| adapter.setAdReveal(height, | |
| image.getUri().toString(), | |
| (v) -> ad.performClick(imageKey)); | |
| return; | |
| } | |
| adScrollToReveal | |
| .setHierarchy(new GenericDraweeHierarchyBuilder(getResources()) | |
| .setPlaceholderImage(image.getDrawable()) | |
| .build()); | |
| adapter.setAdReveal(height, null, (v) -> ad.performClick(imageKey)); | |
| ad.recordImpression(); | |
| return; | |
| } | |
| final Uri imageURI; | |
| try { | |
| String uri = ad.getText(getString(R.string.key_dfp_scroller_key_url)) | |
| .toString(); | |
| imageURI = Uri.parse(uri); | |
| if(imageURI == null || imageURI.toString().isEmpty()) { | |
| throw new Exception("bad uri builded"); | |
| } | |
| } catch(Exception e) { e.printStackTrace(); return; } | |
| ControllerListener l = new BaseControllerListener<ImageInfo>() { | |
| @Override | |
| public void onFinalImageSet(String id, ImageInfo info, Animatable anim) { | |
| if (info == null) return; | |
| adapter.setAdReveal(info.getHeight(), imageURI.toString(), null); | |
| ad.recordImpression(); | |
| } | |
| @Override public void onIntermediateImageSet(String id, ImageInfo info) {} | |
| @Override public void onFailure(String id, Throwable throwable) {} | |
| }; | |
| adScrollToReveal.setController(Fresco.newDraweeControllerBuilder() | |
| .setControllerListener(l) | |
| .setUri(imageURI) | |
| .build()); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment