Skip to content

Instantly share code, notes, and snippets.

@fernando-jascovich
Created May 5, 2017 20:37
Show Gist options
  • Select an option

  • Save fernando-jascovich/1e86eca2e562f1e509cdb61908a284d9 to your computer and use it in GitHub Desktop.

Select an option

Save fernando-jascovich/1e86eca2e562f1e509cdb61908a284d9 to your computer and use it in GitHub Desktop.
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