From 567921a72a26ae25849a93b5e2d2bb4b40f51ea6 Mon Sep 17 00:00:00 2001 From: Tzahie Date: Mon, 18 Jun 2018 18:15:32 +0300 Subject: [PATCH 1/5] Add endless feed inside list of random items --- app/build.gradle | 3 + .../EndlessFeedWithListFragment.java | 39 ++++ .../taboola/taboolasample/FeedAdapter.java | 190 ++++++++++++++++++ .../taboola/taboolasample/MainActivity.java | 6 +- .../fragment_endless_feed_with_list.xml | 6 + app/src/main/res/layout/random_item.xml | 25 +++ app/src/main/res/layout/taboola_row_item.xml | 14 ++ .../main/res/menu/activity_main_drawer.xml | 10 +- app/src/main/res/values/strings.xml | 1 + build.gradle | 2 +- 10 files changed, 291 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/taboola/taboolasample/EndlessFeedWithListFragment.java create mode 100644 app/src/main/java/com/taboola/taboolasample/FeedAdapter.java create mode 100644 app/src/main/res/layout/fragment_endless_feed_with_list.xml create mode 100644 app/src/main/res/layout/random_item.xml create mode 100644 app/src/main/res/layout/taboola_row_item.xml diff --git a/app/build.gradle b/app/build.gradle index 61f6260..1d2d62e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,5 +47,8 @@ dependencies { implementation "com.android.support:appcompat-v7:${support_library}" implementation "com.android.support:design:${support_library}" implementation "com.android.support:support-v4:${support_library}" + implementation 'com.squareup.retrofit2:retrofit:2.3.0' + implementation 'com.squareup.retrofit2:converter-gson:2.3.0' + implementation 'com.squareup.picasso:picasso:2.5.2' } \ No newline at end of file diff --git a/app/src/main/java/com/taboola/taboolasample/EndlessFeedWithListFragment.java b/app/src/main/java/com/taboola/taboolasample/EndlessFeedWithListFragment.java new file mode 100644 index 0000000..42c9e48 --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/EndlessFeedWithListFragment.java @@ -0,0 +1,39 @@ +package com.taboola.taboolasample; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +public class EndlessFeedWithListFragment extends Fragment { + + private FeedAdapter mAdapter; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + mAdapter = new FeedAdapter(); + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_endless_feed_with_list, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + RecyclerView recyclerView = view.findViewById(R.id.feed_rv); + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(view.getContext()); + recyclerView.setLayoutManager(linearLayoutManager); + recyclerView.setAdapter(mAdapter); + } + +} diff --git a/app/src/main/java/com/taboola/taboolasample/FeedAdapter.java b/app/src/main/java/com/taboola/taboolasample/FeedAdapter.java new file mode 100644 index 0000000..4964590 --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/FeedAdapter.java @@ -0,0 +1,190 @@ +package com.taboola.taboolasample; + +import android.support.annotation.IntDef; +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.squareup.picasso.Picasso; +import com.taboola.android.TaboolaWidget; +import com.taboola.android.utils.SdkDetailsHelper; + +import java.lang.annotation.Retention; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import static java.lang.annotation.RetentionPolicy.SOURCE; + +public class FeedAdapter extends RecyclerView.Adapter { + + + private final List mData; + + public FeedAdapter() { + List randomImages = new ArrayList<>(); + randomImages.add(new RandomItem("https://images.unsplash.com/photo-1426170042593-200f250dfdaf?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9&s=c1627023e5cc6260cf97930623becf89")); + randomImages.add(new RandomItem("https://images.unsplash.com/photo-1519255680055-56f0a6b27366?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9&s=8a1648322dd34c05f80ad3034b38be5d")); + randomImages.add(new RandomItem("https://images.unsplash.com/photo-1522150461590-90b858186658?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9&s=a0a0f55a60b16d28d192da080ca29d0b")); + randomImages.add(new RandomItem("https://images.unsplash.com/photo-1521851935320-f0583e21bcff?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9&s=095cb4b5c5553cba16f4924240f05414")); + randomImages.add(new RandomItem("https://images.unsplash.com/photo-1462926795244-b273f8a5454f?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9&s=8cbc77dfb4814087f45a8db614d335fd")); + randomImages.add(new RandomItem("https://images.unsplash.com/photo-1463717738788-85fcacb6ac3d?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9&s=def20d19c740de15f45ce13ef66fbee7")); + randomImages.add(new RandomItem("https://images.unsplash.com/photo-1526781000967-49cfae83f5ac?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9&s=0233a3b85f66d4610fc21a32d8286898")); + randomImages.add(new RandomItem("https://images.unsplash.com/photo-1528399258088-04d894b1dbd6?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9&s=6de5fdd2170b59afc1f31f41a4f4810f")); + Collections.shuffle(randomImages); + randomImages.add(new TaboolaView()); + mData = randomImages; + } + + public static class RandomImageViewHolder extends RecyclerView.ViewHolder { + private final ImageView imageView; + private final TextView textView; + + RandomImageViewHolder(View view) { + super(view); + imageView = view.findViewById(R.id.feed_item_iv); + textView = view.findViewById(R.id.feed_item_tv); + } + } + + public static class ViewHolderTaboola extends RecyclerView.ViewHolder{ + private TaboolaWidget mTaboolaWidget; + + ViewHolderTaboola(View v) { + super(v); + mTaboolaWidget = v.findViewById(R.id.taboola_widget); + mTaboolaWidget + .setPageType("article") + .setPageUrl("http://www.example.com") + .setMode("thumbnails-feed") + .setPlacement("feed-sample-app") + .setTargetType("mix") + .setPublisher("betterbytheminute-app") + .setInterceptScroll(true); + + mTaboolaWidget.fetchContent(); + } + } + + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + switch (viewType){ + + case FeedListItem.ItemType.TABOOLA_ITEM: + View v = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.taboola_row_item, parent, false); + RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) v.getLayoutParams(); + params.height = SdkDetailsHelper.getDisplayHeight(v.getContext()); + v.setLayoutParams(params); + return new ViewHolderTaboola(v); + + default: + case FeedListItem.ItemType.RANDOM_ITEM: + View appCompatImageView = LayoutInflater.from(parent.getContext()).inflate(R.layout.random_item, parent, false); + return new RandomImageViewHolder(appCompatImageView); + } + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + FeedListItem item = getItem(position); + + if(item.type == FeedListItem.ItemType.RANDOM_ITEM){ + RandomImageViewHolder vh = (RandomImageViewHolder)holder; + RandomItem randomItem = (RandomItem) item; + final ImageView imageView = vh.imageView; + Picasso.with(imageView.getContext()).load(randomItem.url).into(imageView); + vh.textView.setText(randomItem.randomText); + } + } + + @Override + public int getItemCount() { + return mData.size(); + } + + @NonNull + private FeedListItem getItem(int position) { + return mData.get(position); + } + + @Override + public int getItemViewType(int position) { + FeedListItem item = getItem(position); + return item.type; + } + + abstract static class FeedListItem { + + @Retention(SOURCE) + @IntDef({ItemType.TABOOLA_ITEM, ItemType.RANDOM_ITEM,}) + + public @interface ItemType { + int TABOOLA_ITEM = 1; + int RANDOM_ITEM = 2; + } + + @ItemType + int type; + + FeedListItem(@ItemType int type) { + this.type = type; + } + } + + static class TaboolaView extends FeedListItem { + + TaboolaView() { + super(ItemType.TABOOLA_ITEM); + } + } + + static class RandomItem extends FeedListItem { + + private final String url; + private final String randomText; + + RandomItem(String imageUrl) { + super(ItemType.RANDOM_ITEM); + url = imageUrl; + randomText = getRandomText(); + } + + private String getRandomText() { + Random random = new Random(); + int newValue = random.nextInt(); + + switch (newValue % 10){ + + default: + case 1: + case 9: + return "Jack Tar me keel lanyard grog doubloon gabion furl Yellow Jack flogging. Booty galleon cable Sail ho lugsail yard draught driver run a rig draft. Wench nipperkin mutiny bowsprit lad Arr draft overhaul salmagundi bilged on her anchor."; + + case 2: + case 8: + return "SFire in the hole grapple plunder matey swing the lead clipper hang the jib skysail handsomely Blimey. Sink me poop deck pressgang hands Yellow Jack lugger haul wind run a rig Sea Legs walk the plank. Boatswain fluke pinnace salmagundi nipper plunder landlubber or just lubber gibbet barque topgallant"; + + case 3: + case 7: + return "Transom bilged on her anchor deadlights Chain Shot topgallant doubloon lugger code of conduct man-of-war spanker. Cackle fruit ahoy fore walk the plank main sheet crimp ye nipper coffer Sea Legs. Bowsprit gangplank long boat gangway strike colors parley gibbet jib take a caulk fathom."; + + case 4: + case 6: + return "Shrimps paste has to have a sun-dried, puréed carrots component. Herring tastes best with fish sauce and lots of cinnamon. Flatten a dozen oysters, tuna, and cumin in a large bucket over medium heat, warm for a handfull minutes and whisk with some squid."; + + case 5: + return "Stern capstan chantey sloop Sea Legs ye Jack Tar rigging sheet booty. Jack Tar jib hogshead grog belay cable keelhaul sloop Shiver me timbers jolly boat. Grog blossom lanyard handsomely chandler run a rig dance the hempen jig Spanish Main landlubber or just lubber measured fer yer chains topsail."; + + } + } + } + +} diff --git a/app/src/main/java/com/taboola/taboolasample/MainActivity.java b/app/src/main/java/com/taboola/taboolasample/MainActivity.java index ad0d6e9..2aa40df 100644 --- a/app/src/main/java/com/taboola/taboolasample/MainActivity.java +++ b/app/src/main/java/com/taboola/taboolasample/MainActivity.java @@ -68,8 +68,12 @@ public boolean onNavigationItemSelected(MenuItem item) { case R.id.endless_feed_sample: fragmentToOpen = new EndlessFeedFragment(); break; + + case R.id.endless_feed_with_list: + fragmentToOpen = new EndlessFeedWithListFragment(); + break; default: - return false; + return false; } transaction.replace(R.id.container_main, fragmentToOpen); diff --git a/app/src/main/res/layout/fragment_endless_feed_with_list.xml b/app/src/main/res/layout/fragment_endless_feed_with_list.xml new file mode 100644 index 0000000..7e1004b --- /dev/null +++ b/app/src/main/res/layout/fragment_endless_feed_with_list.xml @@ -0,0 +1,6 @@ + + diff --git a/app/src/main/res/layout/random_item.xml b/app/src/main/res/layout/random_item.xml new file mode 100644 index 0000000..5034e75 --- /dev/null +++ b/app/src/main/res/layout/random_item.xml @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/taboola_row_item.xml b/app/src/main/res/layout/taboola_row_item.xml new file mode 100644 index 0000000..88ad6ee --- /dev/null +++ b/app/src/main/res/layout/taboola_row_item.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index 2ac9753..76a08d4 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -5,17 +5,21 @@ + android:title="@string/drawer_item_title_xml_sample" /> + android:title="@string/drawer_item_title_dynamic_sample" /> + android:title="@string/drawer_item_title_configurable_page" /> + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0a10fd5..b15664f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -47,5 +47,6 @@ Endless Feed Required + Feed inside list \ No newline at end of file diff --git a/build.gradle b/build.gradle index 284d239..820cb7b 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.2' + classpath 'com.android.tools.build:gradle:3.1.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 0c9f44fd66074f31af57234dc0024126351e6730 Mon Sep 17 00:00:00 2001 From: Tzahie Date: Mon, 20 Aug 2018 11:35:57 +0300 Subject: [PATCH 2/5] adding full example of RV --- .../taboola/taboolasample/FeedAdapter.java | 185 +++++------------- .../com/taboola/taboolasample/ListItems.java | 96 +++++++++ .../java/com/taboola/taboolasample/Utils.java | 33 ++++ .../fragment_endless_feed_with_list.xml | 4 +- app/src/main/res/layout/random_item.xml | 2 - app/src/main/res/layout/taboola_row_item.xml | 14 -- 6 files changed, 185 insertions(+), 149 deletions(-) create mode 100644 app/src/main/java/com/taboola/taboolasample/ListItems.java create mode 100644 app/src/main/java/com/taboola/taboolasample/Utils.java delete mode 100644 app/src/main/res/layout/taboola_row_item.xml diff --git a/app/src/main/java/com/taboola/taboolasample/FeedAdapter.java b/app/src/main/java/com/taboola/taboolasample/FeedAdapter.java index 4964590..8f1ded8 100644 --- a/app/src/main/java/com/taboola/taboolasample/FeedAdapter.java +++ b/app/src/main/java/com/taboola/taboolasample/FeedAdapter.java @@ -1,92 +1,74 @@ package com.taboola.taboolasample; -import android.support.annotation.IntDef; +import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; -import com.squareup.picasso.Picasso; import com.taboola.android.TaboolaWidget; import com.taboola.android.utils.SdkDetailsHelper; -import java.lang.annotation.Retention; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.Random; - -import static java.lang.annotation.RetentionPolicy.SOURCE; public class FeedAdapter extends RecyclerView.Adapter { - private final List mData; + private final List mData; public FeedAdapter() { - List randomImages = new ArrayList<>(); - randomImages.add(new RandomItem("https://images.unsplash.com/photo-1426170042593-200f250dfdaf?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9&s=c1627023e5cc6260cf97930623becf89")); - randomImages.add(new RandomItem("https://images.unsplash.com/photo-1519255680055-56f0a6b27366?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9&s=8a1648322dd34c05f80ad3034b38be5d")); - randomImages.add(new RandomItem("https://images.unsplash.com/photo-1522150461590-90b858186658?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9&s=a0a0f55a60b16d28d192da080ca29d0b")); - randomImages.add(new RandomItem("https://images.unsplash.com/photo-1521851935320-f0583e21bcff?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9&s=095cb4b5c5553cba16f4924240f05414")); - randomImages.add(new RandomItem("https://images.unsplash.com/photo-1462926795244-b273f8a5454f?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9&s=8cbc77dfb4814087f45a8db614d335fd")); - randomImages.add(new RandomItem("https://images.unsplash.com/photo-1463717738788-85fcacb6ac3d?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9&s=def20d19c740de15f45ce13ef66fbee7")); - randomImages.add(new RandomItem("https://images.unsplash.com/photo-1526781000967-49cfae83f5ac?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9&s=0233a3b85f66d4610fc21a32d8286898")); - randomImages.add(new RandomItem("https://images.unsplash.com/photo-1528399258088-04d894b1dbd6?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9&s=6de5fdd2170b59afc1f31f41a4f4810f")); - Collections.shuffle(randomImages); - randomImages.add(new TaboolaView()); - mData = randomImages; + mData = ListItems.getGeneratedData(); } - public static class RandomImageViewHolder extends RecyclerView.ViewHolder { - private final ImageView imageView; - private final TextView textView; + private static void buildTaboolaWidget(Context context, TaboolaWidget taboolaWidget) { + int height = SdkDetailsHelper.getDisplayHeight(context); + ViewGroup.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height); + taboolaWidget.setLayoutParams(params); + taboolaWidget + .setPageType("article") + .setPageUrl("www.eonline.com") + .setMode("thumbnails-a") + .setPlacement("App Below Article Thumbnails") + .setTargetType("mix") + .setPublisher("eonline-androidapp"); + + taboolaWidget.setInterceptScroll(true); + taboolaWidget.fetchContent(); + } - RandomImageViewHolder(View view) { - super(view); - imageView = view.findViewById(R.id.feed_item_iv); - textView = view.findViewById(R.id.feed_item_tv); - } + + @Override + public int getItemViewType(int position) { + ListItems.FeedListItem item = getItem(position); + return item.type; } - public static class ViewHolderTaboola extends RecyclerView.ViewHolder{ - private TaboolaWidget mTaboolaWidget; - - ViewHolderTaboola(View v) { - super(v); - mTaboolaWidget = v.findViewById(R.id.taboola_widget); - mTaboolaWidget - .setPageType("article") - .setPageUrl("http://www.example.com") - .setMode("thumbnails-feed") - .setPlacement("feed-sample-app") - .setTargetType("mix") - .setPublisher("betterbytheminute-app") - .setInterceptScroll(true); - - mTaboolaWidget.fetchContent(); - } + + @Override + public int getItemCount() { + return mData.size(); + } + + @NonNull + private ListItems.FeedListItem getItem(int position) { + return mData.get(position); } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - switch (viewType){ + switch (viewType) { - case FeedListItem.ItemType.TABOOLA_ITEM: - View v = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.taboola_row_item, parent, false); - RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) v.getLayoutParams(); - params.height = SdkDetailsHelper.getDisplayHeight(v.getContext()); - v.setLayoutParams(params); - return new ViewHolderTaboola(v); + case ListItems.FeedListItem.ItemType.TABOOLA_ITEM: + return new ViewHolderTaboola(new TaboolaWidget(parent.getContext())); default: - case FeedListItem.ItemType.RANDOM_ITEM: + case ListItems.FeedListItem.ItemType.RANDOM_ITEM: View appCompatImageView = LayoutInflater.from(parent.getContext()).inflate(R.layout.random_item, parent, false); return new RandomImageViewHolder(appCompatImageView); } @@ -94,97 +76,36 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { - FeedListItem item = getItem(position); + ListItems.FeedListItem item = getItem(position); - if(item.type == FeedListItem.ItemType.RANDOM_ITEM){ - RandomImageViewHolder vh = (RandomImageViewHolder)holder; - RandomItem randomItem = (RandomItem) item; + if (item.type == ListItems.FeedListItem.ItemType.RANDOM_ITEM) { + RandomImageViewHolder vh = (RandomImageViewHolder) holder; + ListItems.RandomItem randomItem = (ListItems.RandomItem) item; final ImageView imageView = vh.imageView; - Picasso.with(imageView.getContext()).load(randomItem.url).into(imageView); + imageView.setBackgroundColor(randomItem.color); vh.textView.setText(randomItem.randomText); } } - @Override - public int getItemCount() { - return mData.size(); - } - - @NonNull - private FeedListItem getItem(int position) { - return mData.get(position); - } - - @Override - public int getItemViewType(int position) { - FeedListItem item = getItem(position); - return item.type; - } - - abstract static class FeedListItem { - - @Retention(SOURCE) - @IntDef({ItemType.TABOOLA_ITEM, ItemType.RANDOM_ITEM,}) - public @interface ItemType { - int TABOOLA_ITEM = 1; - int RANDOM_ITEM = 2; - } - - @ItemType - int type; + public static class RandomImageViewHolder extends RecyclerView.ViewHolder { + private final ImageView imageView; + private final TextView textView; - FeedListItem(@ItemType int type) { - this.type = type; + RandomImageViewHolder(View view) { + super(view); + imageView = view.findViewById(R.id.feed_item_iv); + textView = view.findViewById(R.id.feed_item_tv); } } - static class TaboolaView extends FeedListItem { + public static class ViewHolderTaboola extends RecyclerView.ViewHolder { - TaboolaView() { - super(ItemType.TABOOLA_ITEM); + ViewHolderTaboola(TaboolaWidget taboolaWidget) { + super(taboolaWidget); + buildTaboolaWidget(taboolaWidget.getContext(), taboolaWidget); } } - static class RandomItem extends FeedListItem { - - private final String url; - private final String randomText; - - RandomItem(String imageUrl) { - super(ItemType.RANDOM_ITEM); - url = imageUrl; - randomText = getRandomText(); - } - - private String getRandomText() { - Random random = new Random(); - int newValue = random.nextInt(); - - switch (newValue % 10){ - - default: - case 1: - case 9: - return "Jack Tar me keel lanyard grog doubloon gabion furl Yellow Jack flogging. Booty galleon cable Sail ho lugsail yard draught driver run a rig draft. Wench nipperkin mutiny bowsprit lad Arr draft overhaul salmagundi bilged on her anchor."; - - case 2: - case 8: - return "SFire in the hole grapple plunder matey swing the lead clipper hang the jib skysail handsomely Blimey. Sink me poop deck pressgang hands Yellow Jack lugger haul wind run a rig Sea Legs walk the plank. Boatswain fluke pinnace salmagundi nipper plunder landlubber or just lubber gibbet barque topgallant"; - - case 3: - case 7: - return "Transom bilged on her anchor deadlights Chain Shot topgallant doubloon lugger code of conduct man-of-war spanker. Cackle fruit ahoy fore walk the plank main sheet crimp ye nipper coffer Sea Legs. Bowsprit gangplank long boat gangway strike colors parley gibbet jib take a caulk fathom."; - - case 4: - case 6: - return "Shrimps paste has to have a sun-dried, puréed carrots component. Herring tastes best with fish sauce and lots of cinnamon. Flatten a dozen oysters, tuna, and cumin in a large bucket over medium heat, warm for a handfull minutes and whisk with some squid."; - - case 5: - return "Stern capstan chantey sloop Sea Legs ye Jack Tar rigging sheet booty. Jack Tar jib hogshead grog belay cable keelhaul sloop Shiver me timbers jolly boat. Grog blossom lanyard handsomely chandler run a rig dance the hempen jig Spanish Main landlubber or just lubber measured fer yer chains topsail."; - - } - } - } } diff --git a/app/src/main/java/com/taboola/taboolasample/ListItems.java b/app/src/main/java/com/taboola/taboolasample/ListItems.java new file mode 100644 index 0000000..dcb37cb --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/ListItems.java @@ -0,0 +1,96 @@ +package com.taboola.taboolasample; + +import android.graphics.Color; +import android.support.annotation.IntDef; + +import java.lang.annotation.Retention; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import static java.lang.annotation.RetentionPolicy.SOURCE; + +public class ListItems { + + abstract static class FeedListItem { + + @Retention(SOURCE) + @IntDef({ItemType.TABOOLA_ITEM, ItemType.RANDOM_ITEM,}) + + public @interface ItemType { + int TABOOLA_ITEM = 1; + int RANDOM_ITEM = 2; + } + + @ItemType + int type; + + FeedListItem(@ItemType int type) { + this.type = type; + } + } + + static class TaboolaView extends FeedListItem { + + TaboolaView() { + super(ItemType.TABOOLA_ITEM); + } + } + + static class RandomItem extends FeedListItem { + + final int color; + final String randomText; + + RandomItem(int color) { + super(ItemType.RANDOM_ITEM); + this.color = color; + randomText = getRandomText(); + } + + private String getRandomText() { + Random random = new Random(); + int newValue = random.nextInt(); + + switch (newValue % 10) { + + default: + case 1: + case 9: + return "Jack Tar me keel lanyard grog doubloon gabion furl Yellow Jack flogging. Booty galleon cable Sail ho lugsail yard draught driver run a rig draft. Wench nipperkin mutiny bowsprit lad Arr draft overhaul salmagundi bilged on her anchor."; + + case 2: + case 8: + return "SFire in the hole grapple plunder matey swing the lead clipper hang the jib skysail handsomely Blimey. Sink me poop deck pressgang hands Yellow Jack lugger haul wind run a rig Sea Legs walk the plank. Boatswain fluke pinnace salmagundi nipper plunder landlubber or just lubber gibbet barque topgallant"; + + case 3: + case 7: + return "Transom bilged on her anchor deadlights Chain Shot topgallant doubloon lugger code of conduct man-of-war spanker. Cackle fruit ahoy fore walk the plank main sheet crimp ye nipper coffer Sea Legs. Bowsprit gangplank long boat gangway strike colors parley gibbet jib take a caulk fathom."; + + case 4: + case 6: + return "Shrimps paste has to have a sun-dried, puréed carrots component. Herring tastes best with fish sauce and lots of cinnamon. Flatten a dozen oysters, tuna, and cumin in a large bucket over medium heat, warm for a handfull minutes and whisk with some squid."; + + case 5: + return "Stern capstan chantey sloop Sea Legs ye Jack Tar rigging sheet booty. Jack Tar jib hogshead grog belay cable keelhaul sloop Shiver me timbers jolly boat. Grog blossom lanyard handsomely chandler run a rig dance the hempen jig Spanish Main landlubber or just lubber measured fer yer chains topsail."; + + } + } + } + + public static List getGeneratedData() { + List randomImages = new ArrayList<>(); + randomImages.add(new RandomItem(Color.GRAY)); + randomImages.add(new RandomItem(Color.RED)); + randomImages.add(new RandomItem(Color.BLACK)); + randomImages.add(new RandomItem(Color.MAGENTA)); + randomImages.add(new RandomItem(Color.BLUE)); + randomImages.add(new RandomItem(Color.YELLOW)); + randomImages.add(new RandomItem(Color.GREEN)); + randomImages.add(new RandomItem(Color.DKGRAY)); + Collections.shuffle(randomImages); + randomImages.add(new TaboolaView()); + return randomImages; + } +} diff --git a/app/src/main/java/com/taboola/taboolasample/Utils.java b/app/src/main/java/com/taboola/taboolasample/Utils.java new file mode 100644 index 0000000..70f6446 --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/Utils.java @@ -0,0 +1,33 @@ +package com.taboola.taboolasample; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.TypedValue; + +import com.taboola.android.utils.SdkDetailsHelper; + +public class Utils { + public static int getActionBarHeight(Context context) { + int[] textSizeAttr = new int[]{R.attr.actionBarSize}; + TypedArray a = context.obtainStyledAttributes(new TypedValue().data, textSizeAttr); + int height = a.getDimensionPixelSize(0, 0); + a.recycle(); + return height; + } + + public static int getStatusBarHeight(Context context) { + int resource = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); + if (resource > 0) { + return context.getResources().getDimensionPixelSize(resource); + } + + return 0; + } + + public static int getTaboolaViewHeight(Context context) { + final int screenHeight = SdkDetailsHelper.getDisplayHeight(context); + int statusBarHeight = getStatusBarHeight(context); + int actionBarHeight = getActionBarHeight(context); + return screenHeight - statusBarHeight - actionBarHeight; + } +} diff --git a/app/src/main/res/layout/fragment_endless_feed_with_list.xml b/app/src/main/res/layout/fragment_endless_feed_with_list.xml index 7e1004b..3e09cec 100644 --- a/app/src/main/res/layout/fragment_endless_feed_with_list.xml +++ b/app/src/main/res/layout/fragment_endless_feed_with_list.xml @@ -3,4 +3,6 @@ android:id="@+id/feed_rv" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="8dp" /> + android:layout_marginLeft="16dp" + android:layout_marginBottom="10dp" + android:layout_marginRight="16dp" /> diff --git a/app/src/main/res/layout/random_item.xml b/app/src/main/res/layout/random_item.xml index 5034e75..ad297f7 100644 --- a/app/src/main/res/layout/random_item.xml +++ b/app/src/main/res/layout/random_item.xml @@ -4,8 +4,6 @@ android:layout_width="match_parent" android:orientation="vertical" android:layout_marginTop="10dp" - android:layout_marginLeft="10dp" - android:layout_marginRight="10dp" android:layout_height="wrap_content"> - - - - - \ No newline at end of file From 955b3e5552d53c8e673fef4ee054211707592dda Mon Sep 17 00:00:00 2001 From: Tzahie Date: Mon, 20 Aug 2018 15:30:15 +0300 Subject: [PATCH 3/5] update sample with RV and LV samples --- .../taboola/taboolasample/MainActivity.java | 28 +++- .../{ => adapters}/ListItems.java | 8 +- .../adapters/ListViewAdapter.java | 145 ++++++++++++++++++ .../RecyclerViewAdapter.java} | 15 +- .../taboolasample/{ => data}/Properties.java | 2 +- .../{ => fragments}/ConfigFragment.java | 8 +- .../DynamicSampleFragment.java | 3 +- .../EndlessFeedSampleFragment.java} | 28 ++-- .../fragments/ListViewSampleFragment.java | 38 +++++ .../RecyclerViewSampleFragment.java} | 11 +- .../SettingsDialogFragment.java} | 10 +- .../{ => fragments}/XmlSampleFragment.java | 3 +- .../taboolasample/{ => utils}/Utils.java | 3 +- app/src/main/res/layout/dialog_config.xml | 2 +- app/src/main/res/layout/fragment_config.xml | 2 +- .../res/layout/fragment_dynamic_sample.xml | 2 +- .../main/res/layout/fragment_endless_feed.xml | 3 +- .../main/res/layout/fragment_lv_sample.xml | 8 + .../main/res/layout/fragment_xml_sample.xml | 2 +- .../main/res/menu/activity_main_drawer.xml | 8 +- app/src/main/res/values/strings.xml | 4 +- 21 files changed, 275 insertions(+), 58 deletions(-) rename app/src/main/java/com/taboola/taboolasample/{ => adapters}/ListItems.java (94%) create mode 100644 app/src/main/java/com/taboola/taboolasample/adapters/ListViewAdapter.java rename app/src/main/java/com/taboola/taboolasample/{FeedAdapter.java => adapters/RecyclerViewAdapter.java} (88%) rename app/src/main/java/com/taboola/taboolasample/{ => data}/Properties.java (99%) rename app/src/main/java/com/taboola/taboolasample/{ => fragments}/ConfigFragment.java (92%) rename app/src/main/java/com/taboola/taboolasample/{ => fragments}/DynamicSampleFragment.java (95%) rename app/src/main/java/com/taboola/taboolasample/{EndlessFeedFragment.java => fragments/EndlessFeedSampleFragment.java} (56%) create mode 100644 app/src/main/java/com/taboola/taboolasample/fragments/ListViewSampleFragment.java rename app/src/main/java/com/taboola/taboolasample/{EndlessFeedWithListFragment.java => fragments/RecyclerViewSampleFragment.java} (80%) rename app/src/main/java/com/taboola/taboolasample/{SettingsDialog.java => fragments/SettingsDialogFragment.java} (94%) rename app/src/main/java/com/taboola/taboolasample/{ => fragments}/XmlSampleFragment.java (94%) rename app/src/main/java/com/taboola/taboolasample/{ => utils}/Utils.java (93%) create mode 100644 app/src/main/res/layout/fragment_lv_sample.xml diff --git a/app/src/main/java/com/taboola/taboolasample/MainActivity.java b/app/src/main/java/com/taboola/taboolasample/MainActivity.java index 2aa40df..39b7fd6 100644 --- a/app/src/main/java/com/taboola/taboolasample/MainActivity.java +++ b/app/src/main/java/com/taboola/taboolasample/MainActivity.java @@ -11,6 +11,13 @@ import android.support.v7.widget.Toolbar; import android.view.MenuItem; +import com.taboola.taboolasample.fragments.ConfigFragment; +import com.taboola.taboolasample.fragments.DynamicSampleFragment; +import com.taboola.taboolasample.fragments.EndlessFeedSampleFragment; +import com.taboola.taboolasample.fragments.ListViewSampleFragment; +import com.taboola.taboolasample.fragments.RecyclerViewSampleFragment; +import com.taboola.taboolasample.fragments.XmlSampleFragment; + public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { @@ -18,13 +25,13 @@ public class MainActivity extends AppCompatActivity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + DrawerLayout drawer = findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); - drawer.setDrawerListener(toggle); + drawer.addDrawerListener(toggle); toggle.syncState(); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); @@ -37,7 +44,7 @@ protected void onCreate(Bundle savedInstanceState) { @Override public void onBackPressed() { - DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + DrawerLayout drawer = findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { @@ -66,12 +73,17 @@ public boolean onNavigationItemSelected(MenuItem item) { break; case R.id.endless_feed_sample: - fragmentToOpen = new EndlessFeedFragment(); + fragmentToOpen = new EndlessFeedSampleFragment(); + break; + + case R.id.rv_sample: + fragmentToOpen = new RecyclerViewSampleFragment(); break; - case R.id.endless_feed_with_list: - fragmentToOpen = new EndlessFeedWithListFragment(); + case R.id.lv_sample: + fragmentToOpen = new ListViewSampleFragment(); break; + default: return false; } @@ -79,7 +91,7 @@ public boolean onNavigationItemSelected(MenuItem item) { transaction.replace(R.id.container_main, fragmentToOpen); transaction.commit(); - DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + DrawerLayout drawer = findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; } diff --git a/app/src/main/java/com/taboola/taboolasample/ListItems.java b/app/src/main/java/com/taboola/taboolasample/adapters/ListItems.java similarity index 94% rename from app/src/main/java/com/taboola/taboolasample/ListItems.java rename to app/src/main/java/com/taboola/taboolasample/adapters/ListItems.java index dcb37cb..052c74f 100644 --- a/app/src/main/java/com/taboola/taboolasample/ListItems.java +++ b/app/src/main/java/com/taboola/taboolasample/adapters/ListItems.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample; +package com.taboola.taboolasample.adapters; import android.graphics.Color; import android.support.annotation.IntDef; @@ -13,7 +13,7 @@ public class ListItems { - abstract static class FeedListItem { + public abstract static class FeedListItem { @Retention(SOURCE) @IntDef({ItemType.TABOOLA_ITEM, ItemType.RANDOM_ITEM,}) @@ -31,14 +31,14 @@ abstract static class FeedListItem { } } - static class TaboolaView extends FeedListItem { + public static class TaboolaView extends FeedListItem { TaboolaView() { super(ItemType.TABOOLA_ITEM); } } - static class RandomItem extends FeedListItem { + public static class RandomItem extends FeedListItem { final int color; final String randomText; diff --git a/app/src/main/java/com/taboola/taboolasample/adapters/ListViewAdapter.java b/app/src/main/java/com/taboola/taboolasample/adapters/ListViewAdapter.java new file mode 100644 index 0000000..2495906 --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/adapters/ListViewAdapter.java @@ -0,0 +1,145 @@ +package com.taboola.taboolasample.adapters; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.taboola.android.TaboolaWidget; +import com.taboola.taboolasample.R; +import com.taboola.taboolasample.utils.Utils; + +import java.util.List; + + +public class ListViewAdapter extends BaseAdapter { + + private final List mData; + + TaboolaWidget mTaboolaWidget; + + public ListViewAdapter(Context context) { + mData = ListItems.getGeneratedData(); + mTaboolaWidget = new TaboolaWidget(context); + buildTaboolaWidget(context); + } + + private void buildTaboolaWidget(Context context) { + int height = Utils.getTaboolaViewHeight(context); + ViewGroup.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height); + mTaboolaWidget.setLayoutParams(params); + mTaboolaWidget + .setPageType("article") + .setPageUrl("http://www.example.com") + .setMode("thumbnails-feed") + .setPlacement("feed") + .setTargetType("mix") + .setPublisher("betterbytheminute-app"); + + mTaboolaWidget.setInterceptScroll(true); + mTaboolaWidget.fetchContent(); + } + + + @Override + public @ListItems.FeedListItem.ItemType + int getItemViewType(int position) { + ListItems.FeedListItem item = getItem(position); + return item.type; + } + + + @Override + public int getCount() { + return mData.size(); + } + + @Override + public ListItems.FeedListItem getItem(int position) { + return mData.get(position); + } + + @Override + public long getItemId(int position) { + return 0; + } + + + ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + switch (viewType) { + + case ListItems.FeedListItem.ItemType.TABOOLA_ITEM: + return new ViewHolderTaboola(mTaboolaWidget, viewType); + + default: + case ListItems.FeedListItem.ItemType.RANDOM_ITEM: + View appCompatImageView = LayoutInflater.from(parent.getContext()).inflate(R.layout.random_item, parent, false); + return new RandomImageViewHolder(appCompatImageView, viewType); + } + } + + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + + @ListItems.FeedListItem.ItemType int viewType = getItemViewType(position); + ViewHolder viewHolder; + if (convertView == null || convertView.getTag() == null || ((ViewHolder) convertView.getTag()).mViewType != viewType) { + viewHolder = onCreateViewHolder(parent, viewType); + convertView = viewHolder.mView; + } else { + viewHolder = (ViewHolder) convertView.getTag(); + } + + + if (viewType == ListItems.FeedListItem.ItemType.RANDOM_ITEM) { + RandomImageViewHolder vh = (RandomImageViewHolder) viewHolder; + ListItems.FeedListItem item = getItem(position); + ListItems.RandomItem randomItem = (ListItems.RandomItem) item; + final ImageView imageView = vh.imageView; + imageView.setBackgroundColor(randomItem.color); + vh.textView.setText(randomItem.randomText); + } + + + return convertView; + } + + + public static class RandomImageViewHolder extends ViewHolder { + private final ImageView imageView; + private final TextView textView; + + RandomImageViewHolder(View view, int viewType) { + super(view, viewType); + imageView = view.findViewById(R.id.feed_item_iv); + textView = view.findViewById(R.id.feed_item_tv); + } + } + + static abstract class ViewHolder { + + private final @ListItems.FeedListItem.ItemType + int mViewType; + View mView; + + ViewHolder(View view, int viewType) { + mView = view; + this.mViewType = viewType; + view.setTag(this); + } + } + + public static class ViewHolderTaboola extends ViewHolder { + + ViewHolderTaboola(View view, int viewType) { + super(view, viewType); + } + } + +} diff --git a/app/src/main/java/com/taboola/taboolasample/FeedAdapter.java b/app/src/main/java/com/taboola/taboolasample/adapters/RecyclerViewAdapter.java similarity index 88% rename from app/src/main/java/com/taboola/taboolasample/FeedAdapter.java rename to app/src/main/java/com/taboola/taboolasample/adapters/RecyclerViewAdapter.java index 8f1ded8..cf3e43c 100644 --- a/app/src/main/java/com/taboola/taboolasample/FeedAdapter.java +++ b/app/src/main/java/com/taboola/taboolasample/adapters/RecyclerViewAdapter.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample; +package com.taboola.taboolasample.adapters; import android.content.Context; import android.support.annotation.NonNull; @@ -12,15 +12,16 @@ import com.taboola.android.TaboolaWidget; import com.taboola.android.utils.SdkDetailsHelper; +import com.taboola.taboolasample.R; import java.util.List; -public class FeedAdapter extends RecyclerView.Adapter { +public class RecyclerViewAdapter extends RecyclerView.Adapter { private final List mData; - public FeedAdapter() { + public RecyclerViewAdapter() { mData = ListItems.getGeneratedData(); } @@ -30,11 +31,11 @@ private static void buildTaboolaWidget(Context context, TaboolaWidget taboolaWid taboolaWidget.setLayoutParams(params); taboolaWidget .setPageType("article") - .setPageUrl("www.eonline.com") - .setMode("thumbnails-a") - .setPlacement("App Below Article Thumbnails") + .setPageUrl("http://www.example.com") + .setMode("thumbnails-feed") + .setPlacement("feed-sample-app") .setTargetType("mix") - .setPublisher("eonline-androidapp"); + .setPublisher("betterbytheminute-app"); taboolaWidget.setInterceptScroll(true); taboolaWidget.fetchContent(); diff --git a/app/src/main/java/com/taboola/taboolasample/Properties.java b/app/src/main/java/com/taboola/taboolasample/data/Properties.java similarity index 99% rename from app/src/main/java/com/taboola/taboolasample/Properties.java rename to app/src/main/java/com/taboola/taboolasample/data/Properties.java index 30cfaa9..7fcc271 100644 --- a/app/src/main/java/com/taboola/taboolasample/Properties.java +++ b/app/src/main/java/com/taboola/taboolasample/data/Properties.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample; +package com.taboola.taboolasample.data; import android.os.Parcel; diff --git a/app/src/main/java/com/taboola/taboolasample/ConfigFragment.java b/app/src/main/java/com/taboola/taboolasample/fragments/ConfigFragment.java similarity index 92% rename from app/src/main/java/com/taboola/taboolasample/ConfigFragment.java rename to app/src/main/java/com/taboola/taboolasample/fragments/ConfigFragment.java index 856e661..cfaab7f 100644 --- a/app/src/main/java/com/taboola/taboolasample/ConfigFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/fragments/ConfigFragment.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample; +package com.taboola.taboolasample.fragments; import android.os.Bundle; import android.support.annotation.NonNull; @@ -12,11 +12,13 @@ import com.taboola.android.TaboolaWidget; import com.taboola.android.utils.Const; import com.taboola.android.utils.Logger; +import com.taboola.taboolasample.data.Properties; +import com.taboola.taboolasample.R; import java.util.HashMap; import java.util.Map; -public class ConfigFragment extends Fragment implements SettingsDialog.SettingsCallback { +public class ConfigFragment extends Fragment implements SettingsDialogFragment.SettingsCallback { private TaboolaWidget mTaboolaWidget; private Map mWidgetProperties = new HashMap<>(); private Properties mProperties = new Properties(); @@ -82,6 +84,6 @@ private void reloadWidget() { } private void showSettingsDialog() { - SettingsDialog.showSettingsDialog(getFragmentManager(), mProperties, this); + SettingsDialogFragment.showSettingsDialog(getFragmentManager(), mProperties, this); } } \ No newline at end of file diff --git a/app/src/main/java/com/taboola/taboolasample/DynamicSampleFragment.java b/app/src/main/java/com/taboola/taboolasample/fragments/DynamicSampleFragment.java similarity index 95% rename from app/src/main/java/com/taboola/taboolasample/DynamicSampleFragment.java rename to app/src/main/java/com/taboola/taboolasample/fragments/DynamicSampleFragment.java index 4c0fda5..09e284f 100644 --- a/app/src/main/java/com/taboola/taboolasample/DynamicSampleFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/fragments/DynamicSampleFragment.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample; +package com.taboola.taboolasample.fragments; import android.os.Bundle; @@ -10,6 +10,7 @@ import com.taboola.android.TaboolaWidget; import com.taboola.android.listeners.TaboolaEventListener; +import com.taboola.taboolasample.R; public class DynamicSampleFragment extends Fragment { diff --git a/app/src/main/java/com/taboola/taboolasample/EndlessFeedFragment.java b/app/src/main/java/com/taboola/taboolasample/fragments/EndlessFeedSampleFragment.java similarity index 56% rename from app/src/main/java/com/taboola/taboolasample/EndlessFeedFragment.java rename to app/src/main/java/com/taboola/taboolasample/fragments/EndlessFeedSampleFragment.java index ce0c63a..860431d 100644 --- a/app/src/main/java/com/taboola/taboolasample/EndlessFeedFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/fragments/EndlessFeedSampleFragment.java @@ -1,34 +1,27 @@ -package com.taboola.taboolasample; +package com.taboola.taboolasample.fragments; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.taboola.android.TaboolaWidget; +import com.taboola.android.utils.SdkDetailsHelper; +import com.taboola.taboolasample.R; -public class EndlessFeedFragment extends Fragment { - - private TaboolaWidget mTaboolaWidget; +public class EndlessFeedSampleFragment extends Fragment { @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_endless_feed, container, false); - } - - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - mTaboolaWidget = view.findViewById(R.id.taboola_widget); - mTaboolaWidget + View view = inflater.inflate(R.layout.fragment_endless_feed, container, false); + TaboolaWidget taboolaWidget = view.findViewById(R.id.taboola_widget); + taboolaWidget .setPageType("article") .setPageUrl("http://www.example.com") .setMode("thumbnails-feed") @@ -36,7 +29,12 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat .setTargetType("mix") .setPublisher("betterbytheminute-app"); - mTaboolaWidget.fetchContent(); + taboolaWidget.setInterceptScroll(true); + taboolaWidget.fetchContent(); + + return view; + } + } diff --git a/app/src/main/java/com/taboola/taboolasample/fragments/ListViewSampleFragment.java b/app/src/main/java/com/taboola/taboolasample/fragments/ListViewSampleFragment.java new file mode 100644 index 0000000..ce56ddb --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/fragments/ListViewSampleFragment.java @@ -0,0 +1,38 @@ +package com.taboola.taboolasample.fragments; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.app.AppCompatActivity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ListView; + +import com.taboola.taboolasample.R; +import com.taboola.taboolasample.adapters.ListViewAdapter; + +public class ListViewSampleFragment extends Fragment { + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_lv_sample, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + ListView listView = view.findViewById(R.id.feed_lv); + listView.setAdapter(new ListViewAdapter(view.getContext())); + + if (isAdded() && getActivity() != null && !getActivity().isFinishing()) { + android.support.v7.app.ActionBar ab = ((AppCompatActivity) getActivity()).getSupportActionBar(); + if (ab != null) { + ab.setTitle(R.string.lv_screen_name); + } + } + } +} diff --git a/app/src/main/java/com/taboola/taboolasample/EndlessFeedWithListFragment.java b/app/src/main/java/com/taboola/taboolasample/fragments/RecyclerViewSampleFragment.java similarity index 80% rename from app/src/main/java/com/taboola/taboolasample/EndlessFeedWithListFragment.java rename to app/src/main/java/com/taboola/taboolasample/fragments/RecyclerViewSampleFragment.java index 42c9e48..c175642 100644 --- a/app/src/main/java/com/taboola/taboolasample/EndlessFeedWithListFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/fragments/RecyclerViewSampleFragment.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample; +package com.taboola.taboolasample.fragments; import android.content.Context; import android.os.Bundle; @@ -11,14 +11,17 @@ import android.view.View; import android.view.ViewGroup; -public class EndlessFeedWithListFragment extends Fragment { +import com.taboola.taboolasample.R; +import com.taboola.taboolasample.adapters.RecyclerViewAdapter; - private FeedAdapter mAdapter; +public class RecyclerViewSampleFragment extends Fragment { + + private RecyclerViewAdapter mAdapter; @Override public void onAttach(Context context) { super.onAttach(context); - mAdapter = new FeedAdapter(); + mAdapter = new RecyclerViewAdapter(); } @Override diff --git a/app/src/main/java/com/taboola/taboolasample/SettingsDialog.java b/app/src/main/java/com/taboola/taboolasample/fragments/SettingsDialogFragment.java similarity index 94% rename from app/src/main/java/com/taboola/taboolasample/SettingsDialog.java rename to app/src/main/java/com/taboola/taboolasample/fragments/SettingsDialogFragment.java index 8e5e662..6a0e4ed 100644 --- a/app/src/main/java/com/taboola/taboolasample/SettingsDialog.java +++ b/app/src/main/java/com/taboola/taboolasample/fragments/SettingsDialogFragment.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample; +package com.taboola.taboolasample.fragments; import android.app.Dialog; import android.databinding.BindingAdapter; @@ -15,14 +15,16 @@ import android.widget.Button; import android.widget.EditText; +import com.taboola.taboolasample.data.Properties; +import com.taboola.taboolasample.R; import com.taboola.taboolasample.databinding.DialogConfigBinding; import java.util.ArrayList; import java.util.List; -public class SettingsDialog extends DialogFragment { +public class SettingsDialogFragment extends DialogFragment { - private static final String TAG = "SettingsDialog"; + private static final String TAG = "SettingsDialogFragment"; private static final String ARG_PROPERTIES = TAG + "ARG_PROPERTIES"; @@ -35,7 +37,7 @@ public class SettingsDialog extends DialogFragment { static void showSettingsDialog(FragmentManager fragmentManager, Properties properties, SettingsCallback callback) { - SettingsDialog propertiesDialogFragment = new SettingsDialog(); + SettingsDialogFragment propertiesDialogFragment = new SettingsDialogFragment(); propertiesDialogFragment.mCallback = callback; Bundle args = new Bundle(); diff --git a/app/src/main/java/com/taboola/taboolasample/XmlSampleFragment.java b/app/src/main/java/com/taboola/taboolasample/fragments/XmlSampleFragment.java similarity index 94% rename from app/src/main/java/com/taboola/taboolasample/XmlSampleFragment.java rename to app/src/main/java/com/taboola/taboolasample/fragments/XmlSampleFragment.java index 132a08b..067e6ea 100644 --- a/app/src/main/java/com/taboola/taboolasample/XmlSampleFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/fragments/XmlSampleFragment.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample; +package com.taboola.taboolasample.fragments; import android.os.Bundle; @@ -9,6 +9,7 @@ import com.taboola.android.TaboolaWidget; import com.taboola.android.listeners.TaboolaEventListener; +import com.taboola.taboolasample.R; public class XmlSampleFragment extends Fragment { diff --git a/app/src/main/java/com/taboola/taboolasample/Utils.java b/app/src/main/java/com/taboola/taboolasample/utils/Utils.java similarity index 93% rename from app/src/main/java/com/taboola/taboolasample/Utils.java rename to app/src/main/java/com/taboola/taboolasample/utils/Utils.java index 70f6446..c02e6e7 100644 --- a/app/src/main/java/com/taboola/taboolasample/Utils.java +++ b/app/src/main/java/com/taboola/taboolasample/utils/Utils.java @@ -1,10 +1,11 @@ -package com.taboola.taboolasample; +package com.taboola.taboolasample.utils; import android.content.Context; import android.content.res.TypedArray; import android.util.TypedValue; import com.taboola.android.utils.SdkDetailsHelper; +import com.taboola.taboolasample.R; public class Utils { public static int getActionBarHeight(Context context) { diff --git a/app/src/main/res/layout/dialog_config.xml b/app/src/main/res/layout/dialog_config.xml index 0e9b733..2568883 100644 --- a/app/src/main/res/layout/dialog_config.xml +++ b/app/src/main/res/layout/dialog_config.xml @@ -10,7 +10,7 @@ + type="com.taboola.taboolasample.data.Properties" /> + tools:context="com.taboola.taboolasample.fragments.ConfigFragment"> + tools:context="com.taboola.taboolasample.fragments.DynamicSampleFragment"> + android:layout_height="match_parent"> + diff --git a/app/src/main/res/layout/fragment_xml_sample.xml b/app/src/main/res/layout/fragment_xml_sample.xml index 434856f..9e00bfb 100644 --- a/app/src/main/res/layout/fragment_xml_sample.xml +++ b/app/src/main/res/layout/fragment_xml_sample.xml @@ -3,7 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="com.taboola.taboolasample.DynamicSampleFragment"> + tools:context="com.taboola.taboolasample.fragments.DynamicSampleFragment"> + android:id="@+id/rv_sample" + android:title="@string/rv_sample" /> + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b15664f..564b5d0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -47,6 +47,8 @@ Endless Feed Required - Feed inside list + RecyclerViewSample + ListViewSample + ListViewSampleFragment \ No newline at end of file From d1196fc135a00b67d03ac65df9eb402f8beb6ebb Mon Sep 17 00:00:00 2001 From: Tzahie Date: Wed, 26 Sep 2018 11:56:32 +0300 Subject: [PATCH 4/5] adding more samples for view pager and listview --- app/src/main/AndroidManifest.xml | 1 + .../taboola/taboolasample/MainActivity.java | 31 ++++-- .../taboolasample/{data => }/Properties.java | 2 +- .../adapters/FragmentsAdapter.java | 55 +++++++++ .../ConfigFragment.java | 4 +- .../DynamicSampleFragment.java | 2 +- .../EndlessFeedSampleFragment.java | 3 +- .../ListViewSampleFragment.java | 2 +- .../RecyclerViewSampleFragment.java | 4 +- .../SettingsDialogFragment.java | 4 +- .../XmlSampleFragment.java | 2 +- .../samples/tabs/PageFragment.java | 85 ++++++++++++++ .../samples/tabs/TabsContract.java | 42 +++++++ .../samples/tabs/TabsPresenterImp.java | 59 ++++++++++ .../samples/tabs/TabsSampleFragment.java | 104 ++++++++++++++++++ app/src/main/res/drawable/sample_img.xml | 11 ++ app/src/main/res/layout/dialog_config.xml | 2 +- app/src/main/res/layout/fragment_config.xml | 2 +- .../res/layout/fragment_dynamic_sample.xml | 2 +- .../main/res/layout/fragment_page_sample.xml | 34 ++++++ ...d_with_list.xml => fragment_rv_sample.xml} | 0 app/src/main/res/layout/fragment_tabs.xml | 25 +++++ .../main/res/layout/fragment_xml_sample.xml | 2 +- .../main/res/menu/activity_main_drawer.xml | 4 + app/src/main/res/values/strings.xml | 5 + 25 files changed, 464 insertions(+), 23 deletions(-) rename app/src/main/java/com/taboola/taboolasample/{data => }/Properties.java (99%) create mode 100644 app/src/main/java/com/taboola/taboolasample/adapters/FragmentsAdapter.java rename app/src/main/java/com/taboola/taboolasample/{fragments => samples}/ConfigFragment.java (97%) rename app/src/main/java/com/taboola/taboolasample/{fragments => samples}/DynamicSampleFragment.java (97%) rename app/src/main/java/com/taboola/taboolasample/{fragments => samples}/EndlessFeedSampleFragment.java (91%) rename app/src/main/java/com/taboola/taboolasample/{fragments => samples}/ListViewSampleFragment.java (96%) rename app/src/main/java/com/taboola/taboolasample/{fragments => samples}/RecyclerViewSampleFragment.java (90%) rename app/src/main/java/com/taboola/taboolasample/{fragments => samples}/SettingsDialogFragment.java (98%) rename app/src/main/java/com/taboola/taboolasample/{fragments => samples}/XmlSampleFragment.java (96%) create mode 100644 app/src/main/java/com/taboola/taboolasample/samples/tabs/PageFragment.java create mode 100644 app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsContract.java create mode 100644 app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsPresenterImp.java create mode 100644 app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsSampleFragment.java create mode 100644 app/src/main/res/drawable/sample_img.xml create mode 100644 app/src/main/res/layout/fragment_page_sample.xml rename app/src/main/res/layout/{fragment_endless_feed_with_list.xml => fragment_rv_sample.xml} (100%) create mode 100644 app/src/main/res/layout/fragment_tabs.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a260c74..46c78e9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ android:theme="@style/AppTheme"> diff --git a/app/src/main/java/com/taboola/taboolasample/MainActivity.java b/app/src/main/java/com/taboola/taboolasample/MainActivity.java index 39b7fd6..72a542e 100644 --- a/app/src/main/java/com/taboola/taboolasample/MainActivity.java +++ b/app/src/main/java/com/taboola/taboolasample/MainActivity.java @@ -11,15 +11,20 @@ import android.support.v7.widget.Toolbar; import android.view.MenuItem; -import com.taboola.taboolasample.fragments.ConfigFragment; -import com.taboola.taboolasample.fragments.DynamicSampleFragment; -import com.taboola.taboolasample.fragments.EndlessFeedSampleFragment; -import com.taboola.taboolasample.fragments.ListViewSampleFragment; -import com.taboola.taboolasample.fragments.RecyclerViewSampleFragment; -import com.taboola.taboolasample.fragments.XmlSampleFragment; +import com.taboola.taboolasample.samples.ConfigFragment; +import com.taboola.taboolasample.samples.DynamicSampleFragment; +import com.taboola.taboolasample.samples.EndlessFeedSampleFragment; +import com.taboola.taboolasample.samples.ListViewSampleFragment; +import com.taboola.taboolasample.samples.RecyclerViewSampleFragment; +import com.taboola.taboolasample.samples.XmlSampleFragment; +import com.taboola.taboolasample.samples.tabs.PageFragment; +import com.taboola.taboolasample.samples.tabs.TabsSampleFragment; public class MainActivity extends AppCompatActivity - implements NavigationView.OnNavigationItemSelectedListener { + implements NavigationView.OnNavigationItemSelectedListener, PageFragment.OnFragmentInteractionListener { + + private String mViewId; + @Override protected void onCreate(Bundle savedInstanceState) { @@ -84,6 +89,10 @@ public boolean onNavigationItemSelected(MenuItem item) { fragmentToOpen = new ListViewSampleFragment(); break; + case R.id.view_pager_sample: + fragmentToOpen = new TabsSampleFragment(); + break; + default: return false; } @@ -95,4 +104,12 @@ public boolean onNavigationItemSelected(MenuItem item) { drawer.closeDrawer(GravityCompat.START); return true; } + + public String getViewID() { + if (mViewId == null) { + mViewId = Long.toString(System.currentTimeMillis()); + } + + return mViewId; + } } \ No newline at end of file diff --git a/app/src/main/java/com/taboola/taboolasample/data/Properties.java b/app/src/main/java/com/taboola/taboolasample/Properties.java similarity index 99% rename from app/src/main/java/com/taboola/taboolasample/data/Properties.java rename to app/src/main/java/com/taboola/taboolasample/Properties.java index 7fcc271..30cfaa9 100644 --- a/app/src/main/java/com/taboola/taboolasample/data/Properties.java +++ b/app/src/main/java/com/taboola/taboolasample/Properties.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample.data; +package com.taboola.taboolasample; import android.os.Parcel; diff --git a/app/src/main/java/com/taboola/taboolasample/adapters/FragmentsAdapter.java b/app/src/main/java/com/taboola/taboolasample/adapters/FragmentsAdapter.java new file mode 100644 index 0000000..bb94e14 --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/adapters/FragmentsAdapter.java @@ -0,0 +1,55 @@ +package com.taboola.taboolasample.adapters; + +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentStatePagerAdapter; +import android.support.v4.app.FragmentTransaction; +import android.view.ViewGroup; + +import java.util.ArrayList; +import java.util.List; + +public class FragmentsAdapter extends FragmentStatePagerAdapter { + + private final List mFragments = new ArrayList<>(); + + + public FragmentsAdapter(FragmentManager fm) { + super(fm); + } + + public void clear() { + mFragments.clear(); + } + + public void addFragment(T fragment) { + mFragments.add(fragment); + } + + @Override + public T getItem(int position) { + return mFragments.get(position); + } + + @Override + public int getCount() { + return mFragments.size(); + } + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + FragmentManager manager = ((Fragment) object).getFragmentManager(); + if (manager != null) { + FragmentTransaction trans = manager.beginTransaction(); + trans.remove((Fragment) object); + trans.commit(); + } + + super.destroyItem(container, position, object); + } + + @Override + public CharSequence getPageTitle(int position) { + return ("page " + position); + } +} diff --git a/app/src/main/java/com/taboola/taboolasample/fragments/ConfigFragment.java b/app/src/main/java/com/taboola/taboolasample/samples/ConfigFragment.java similarity index 97% rename from app/src/main/java/com/taboola/taboolasample/fragments/ConfigFragment.java rename to app/src/main/java/com/taboola/taboolasample/samples/ConfigFragment.java index cfaab7f..caf4de6 100644 --- a/app/src/main/java/com/taboola/taboolasample/fragments/ConfigFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/samples/ConfigFragment.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample.fragments; +package com.taboola.taboolasample.samples; import android.os.Bundle; import android.support.annotation.NonNull; @@ -12,7 +12,7 @@ import com.taboola.android.TaboolaWidget; import com.taboola.android.utils.Const; import com.taboola.android.utils.Logger; -import com.taboola.taboolasample.data.Properties; +import com.taboola.taboolasample.Properties; import com.taboola.taboolasample.R; import java.util.HashMap; diff --git a/app/src/main/java/com/taboola/taboolasample/fragments/DynamicSampleFragment.java b/app/src/main/java/com/taboola/taboolasample/samples/DynamicSampleFragment.java similarity index 97% rename from app/src/main/java/com/taboola/taboolasample/fragments/DynamicSampleFragment.java rename to app/src/main/java/com/taboola/taboolasample/samples/DynamicSampleFragment.java index 09e284f..ab5e9e3 100644 --- a/app/src/main/java/com/taboola/taboolasample/fragments/DynamicSampleFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/samples/DynamicSampleFragment.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample.fragments; +package com.taboola.taboolasample.samples; import android.os.Bundle; diff --git a/app/src/main/java/com/taboola/taboolasample/fragments/EndlessFeedSampleFragment.java b/app/src/main/java/com/taboola/taboolasample/samples/EndlessFeedSampleFragment.java similarity index 91% rename from app/src/main/java/com/taboola/taboolasample/fragments/EndlessFeedSampleFragment.java rename to app/src/main/java/com/taboola/taboolasample/samples/EndlessFeedSampleFragment.java index 860431d..a3365c9 100644 --- a/app/src/main/java/com/taboola/taboolasample/fragments/EndlessFeedSampleFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/samples/EndlessFeedSampleFragment.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample.fragments; +package com.taboola.taboolasample.samples; import android.os.Bundle; @@ -9,7 +9,6 @@ import android.view.ViewGroup; import com.taboola.android.TaboolaWidget; -import com.taboola.android.utils.SdkDetailsHelper; import com.taboola.taboolasample.R; diff --git a/app/src/main/java/com/taboola/taboolasample/fragments/ListViewSampleFragment.java b/app/src/main/java/com/taboola/taboolasample/samples/ListViewSampleFragment.java similarity index 96% rename from app/src/main/java/com/taboola/taboolasample/fragments/ListViewSampleFragment.java rename to app/src/main/java/com/taboola/taboolasample/samples/ListViewSampleFragment.java index ce56ddb..fc82de2 100644 --- a/app/src/main/java/com/taboola/taboolasample/fragments/ListViewSampleFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/samples/ListViewSampleFragment.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample.fragments; +package com.taboola.taboolasample.samples; import android.os.Bundle; import android.support.annotation.NonNull; diff --git a/app/src/main/java/com/taboola/taboolasample/fragments/RecyclerViewSampleFragment.java b/app/src/main/java/com/taboola/taboolasample/samples/RecyclerViewSampleFragment.java similarity index 90% rename from app/src/main/java/com/taboola/taboolasample/fragments/RecyclerViewSampleFragment.java rename to app/src/main/java/com/taboola/taboolasample/samples/RecyclerViewSampleFragment.java index c175642..fd5f5b5 100644 --- a/app/src/main/java/com/taboola/taboolasample/fragments/RecyclerViewSampleFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/samples/RecyclerViewSampleFragment.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample.fragments; +package com.taboola.taboolasample.samples; import android.content.Context; import android.os.Bundle; @@ -27,7 +27,7 @@ public void onAttach(Context context) { @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_endless_feed_with_list, container, false); + return inflater.inflate(R.layout.fragment_rv_sample, container, false); } @Override diff --git a/app/src/main/java/com/taboola/taboolasample/fragments/SettingsDialogFragment.java b/app/src/main/java/com/taboola/taboolasample/samples/SettingsDialogFragment.java similarity index 98% rename from app/src/main/java/com/taboola/taboolasample/fragments/SettingsDialogFragment.java rename to app/src/main/java/com/taboola/taboolasample/samples/SettingsDialogFragment.java index 6a0e4ed..3d0a372 100644 --- a/app/src/main/java/com/taboola/taboolasample/fragments/SettingsDialogFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/samples/SettingsDialogFragment.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample.fragments; +package com.taboola.taboolasample.samples; import android.app.Dialog; import android.databinding.BindingAdapter; @@ -15,7 +15,7 @@ import android.widget.Button; import android.widget.EditText; -import com.taboola.taboolasample.data.Properties; +import com.taboola.taboolasample.Properties; import com.taboola.taboolasample.R; import com.taboola.taboolasample.databinding.DialogConfigBinding; diff --git a/app/src/main/java/com/taboola/taboolasample/fragments/XmlSampleFragment.java b/app/src/main/java/com/taboola/taboolasample/samples/XmlSampleFragment.java similarity index 96% rename from app/src/main/java/com/taboola/taboolasample/fragments/XmlSampleFragment.java rename to app/src/main/java/com/taboola/taboolasample/samples/XmlSampleFragment.java index 067e6ea..11ae50c 100644 --- a/app/src/main/java/com/taboola/taboolasample/fragments/XmlSampleFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/samples/XmlSampleFragment.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample.fragments; +package com.taboola.taboolasample.samples; import android.os.Bundle; diff --git a/app/src/main/java/com/taboola/taboolasample/samples/tabs/PageFragment.java b/app/src/main/java/com/taboola/taboolasample/samples/tabs/PageFragment.java new file mode 100644 index 0000000..63345a5 --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/samples/tabs/PageFragment.java @@ -0,0 +1,85 @@ +package com.taboola.taboolasample.samples.tabs; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.taboola.android.TaboolaWidget; +import com.taboola.taboolasample.R; + +public class PageFragment extends Fragment { + + public static final String SCREEN_NAME = "ScreenName"; + private TaboolaWidget mTaboolaWidget; + private OnFragmentInteractionListener mListener; + private String mScreenName = ""; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mScreenName = getArguments().getString(SCREEN_NAME); + } + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof OnFragmentInteractionListener) { + mListener = (OnFragmentInteractionListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement OnFragmentInteractionListener"); + } + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + + View rootView = inflater.inflate(R.layout.fragment_page_sample, container, false); + + mTaboolaWidget = rootView.findViewById(R.id.taboola_widget); + mTaboolaWidget + .setPageType("article") + .setPageUrl("http://www.example.com") + .setMode("thumbnails-feed") + .setPlacement("feed-sample-app") + .setTargetType("mix") + .setPublisher("betterbytheminute-app"); + + mTaboolaWidget.setViewId(mListener.getViewID()); + mTaboolaWidget.setInterceptScroll(true); + mTaboolaWidget.getSettings().setNeedInitialFocus(false); + + return rootView; + } + + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + } + + + public void onPageSelected() { + mTaboolaWidget.fetchContent(); + } + + public interface OnFragmentInteractionListener { + String getViewID(); + } + + public static PageFragment getInstance(String screenName) { + PageFragment pageFragment = new PageFragment(); + Bundle bundle = new Bundle(); + bundle.putString(SCREEN_NAME, screenName); + pageFragment.setArguments(bundle); + return pageFragment; + } +} diff --git a/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsContract.java b/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsContract.java new file mode 100644 index 0000000..96ca437 --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsContract.java @@ -0,0 +1,42 @@ +package com.taboola.taboolasample.samples.tabs; + +import android.os.Bundle; + +public interface TabsContract { + + interface TabsView { + void setCurrentPage(int currentPage); + } + + interface TabsPresenter extends BasePresenter { + void setCurrentPage(int position); + } + + + interface BasePresenter { + + /** + * Binds presenter with a view when resumed. The Presenter will perform initialization here. + * + * @param view the view associated with this presenter + */ + void takeView(T view); + + /** + * Drops the reference to the view when destroyed + */ + void dropView(); + + void onActivityCreated(Bundle savedInstanceState); + + void onSaveInstanceState(Bundle savedInstanceState); + + void onStart(); + + void onStop(); + + void onDestroyView(); + + } + +} diff --git a/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsPresenterImp.java b/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsPresenterImp.java new file mode 100644 index 0000000..f4b34f4 --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsPresenterImp.java @@ -0,0 +1,59 @@ +package com.taboola.taboolasample.samples.tabs; + +import android.os.Bundle; + +public class TabsPresenterImp implements TabsContract.TabsPresenter { + + private static final String TAG = "PagePresenterImp"; + private static final String PAGE_KEY = TAG + " " + "page_key"; + private TabsContract.TabsView mAlbumTabsView; + private int mCurrentPage; + + + @Override + public void takeView(TabsContract.TabsView view) { + mAlbumTabsView = view; + } + + @Override + public void dropView() { + mAlbumTabsView = null; + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + if (savedInstanceState != null) { + restoreInstanceState(savedInstanceState); + } + } + + private void restoreInstanceState(Bundle savedInstanceState) { + mCurrentPage = savedInstanceState.getInt(PAGE_KEY); + } + + @Override + public void onSaveInstanceState(Bundle out) { + out.putInt(PAGE_KEY, mCurrentPage); + } + + @Override + public void onStart() { + mAlbumTabsView.setCurrentPage(mCurrentPage); + } + + @Override + public void onStop() { + + } + + @Override + public void onDestroyView() { + dropView(); + } + + + @Override + public void setCurrentPage(int position) { + mCurrentPage = position; + } +} diff --git a/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsSampleFragment.java b/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsSampleFragment.java new file mode 100644 index 0000000..243d443 --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsSampleFragment.java @@ -0,0 +1,104 @@ +package com.taboola.taboolasample.samples.tabs; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.view.ViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.taboola.taboolasample.R; +import com.taboola.taboolasample.adapters.FragmentsAdapter; + +public class TabsSampleFragment extends Fragment implements TabsContract.TabsView{ + + protected TabsContract.TabsPresenter mPresenter = new TabsPresenterImp(); + private ViewPager mViewPager; + private FragmentsAdapter mAdapter; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + + if (mAdapter == null) { + mAdapter = new FragmentsAdapter<>(getChildFragmentManager()); + } + + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_tabs, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mViewPager = view.findViewById(R.id.album_tabs_viewpager); + setupViewPager(); + } + + + private void setupViewPager() { + mAdapter.addFragment(PageFragment.getInstance("page 1")); + mAdapter.addFragment(PageFragment.getInstance("page 2")); + mAdapter.addFragment(PageFragment.getInstance("page 3")); + mViewPager.setAdapter(mAdapter); + mViewPager.setSaveEnabled(false); + mViewPager.setOffscreenPageLimit(mAdapter.getCount()); + + final ViewPager.SimpleOnPageChangeListener onPageChangeListener = new ViewPager.SimpleOnPageChangeListener() { + + @Override + public void onPageSelected(int position) { + int currentItem = mViewPager.getCurrentItem(); + mPresenter.setCurrentPage(currentItem); + PageFragment fragment = mAdapter.getItem(currentItem); + fragment.onPageSelected(); + } + }; + mViewPager.addOnPageChangeListener(onPageChangeListener); + mViewPager.post(() -> onPageChangeListener.onPageSelected(mViewPager.getCurrentItem())); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mPresenter.takeView(this); + mPresenter.onActivityCreated(savedInstanceState); + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + mPresenter.onSaveInstanceState(outState); + } + + @Override + public void onStart() { + super.onStart(); + mPresenter.takeView(this); + mPresenter.onStart(); + } + + @Override + public void onStop() { + super.onStop(); + mPresenter.onStop(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + mPresenter.onDestroyView(); + } + + @Override + public void setCurrentPage(int currentPage) { + mViewPager.setCurrentItem(currentPage, false); + } +} diff --git a/app/src/main/res/drawable/sample_img.xml b/app/src/main/res/drawable/sample_img.xml new file mode 100644 index 0000000..d7ae6c2 --- /dev/null +++ b/app/src/main/res/drawable/sample_img.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_config.xml b/app/src/main/res/layout/dialog_config.xml index 2568883..0e9b733 100644 --- a/app/src/main/res/layout/dialog_config.xml +++ b/app/src/main/res/layout/dialog_config.xml @@ -10,7 +10,7 @@ + type="com.taboola.taboolasample.Properties" /> + tools:context="com.taboola.taboolasample.samples.ConfigFragment"> + tools:context="com.taboola.taboolasample.samples.DynamicSampleFragment"> + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_endless_feed_with_list.xml b/app/src/main/res/layout/fragment_rv_sample.xml similarity index 100% rename from app/src/main/res/layout/fragment_endless_feed_with_list.xml rename to app/src/main/res/layout/fragment_rv_sample.xml diff --git a/app/src/main/res/layout/fragment_tabs.xml b/app/src/main/res/layout/fragment_tabs.xml new file mode 100644 index 0000000..bca669e --- /dev/null +++ b/app/src/main/res/layout/fragment_tabs.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_xml_sample.xml b/app/src/main/res/layout/fragment_xml_sample.xml index 9e00bfb..8ddf650 100644 --- a/app/src/main/res/layout/fragment_xml_sample.xml +++ b/app/src/main/res/layout/fragment_xml_sample.xml @@ -3,7 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="com.taboola.taboolasample.fragments.DynamicSampleFragment"> + tools:context="com.taboola.taboolasample.samples.DynamicSampleFragment"> + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 564b5d0..3cbd7a2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -44,11 +44,16 @@ The ferengi goes friendship like a dead phenomenan. It is a cloudy understanding, sir. Transformator of a senior metamorphosis, desire the modification! + Hercle, coordinatae camerarius!. + Travel heavily like a cloudy lagoon. + Tremble, scotty, mystery! + Endless Feed Required RecyclerViewSample ListViewSample ListViewSampleFragment + View Pager Sample \ No newline at end of file From 7b8d53e6cf3f94e3909f9728e10d9bff644a0dfb Mon Sep 17 00:00:00 2001 From: Tzahie Date: Wed, 26 Sep 2018 15:47:14 +0300 Subject: [PATCH 5/5] refactoring view pager --- .../taboola/taboolasample/MainActivity.java | 14 +- .../adapters/ListViewAdapter.java | 24 +--- .../adapters/RecyclerViewAdapter.java | 19 +-- .../samples/tabs/BasePresenter.java | 29 +++++ .../samples/tabs/BaseTabFragment.java | 109 ++++++++++++++++ .../samples/tabs/BaseTaboolaFragment.java | 8 ++ .../samples/tabs/PageFragment.java | 85 ------------- .../samples/tabs/TabsContract.java | 30 +---- .../samples/tabs/TabsSampleFragment.java | 120 +++++++----------- .../taboola/taboolasample/utils/Utils.java | 40 +++--- .../main/res/layout/fragment_lv_sample.xml | 5 +- .../main/res/layout/fragment_page_sample.xml | 26 ++-- app/src/main/res/layout/fragment_tabs.xml | 3 +- app/src/main/res/values/strings.xml | 12 +- 14 files changed, 244 insertions(+), 280 deletions(-) create mode 100644 app/src/main/java/com/taboola/taboolasample/samples/tabs/BasePresenter.java create mode 100644 app/src/main/java/com/taboola/taboolasample/samples/tabs/BaseTabFragment.java create mode 100644 app/src/main/java/com/taboola/taboolasample/samples/tabs/BaseTaboolaFragment.java delete mode 100644 app/src/main/java/com/taboola/taboolasample/samples/tabs/PageFragment.java diff --git a/app/src/main/java/com/taboola/taboolasample/MainActivity.java b/app/src/main/java/com/taboola/taboolasample/MainActivity.java index 72a542e..da33947 100644 --- a/app/src/main/java/com/taboola/taboolasample/MainActivity.java +++ b/app/src/main/java/com/taboola/taboolasample/MainActivity.java @@ -17,14 +17,9 @@ import com.taboola.taboolasample.samples.ListViewSampleFragment; import com.taboola.taboolasample.samples.RecyclerViewSampleFragment; import com.taboola.taboolasample.samples.XmlSampleFragment; -import com.taboola.taboolasample.samples.tabs.PageFragment; import com.taboola.taboolasample.samples.tabs.TabsSampleFragment; -public class MainActivity extends AppCompatActivity - implements NavigationView.OnNavigationItemSelectedListener, PageFragment.OnFragmentInteractionListener { - - private String mViewId; - +public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { @Override protected void onCreate(Bundle savedInstanceState) { @@ -105,11 +100,4 @@ public boolean onNavigationItemSelected(MenuItem item) { return true; } - public String getViewID() { - if (mViewId == null) { - mViewId = Long.toString(System.currentTimeMillis()); - } - - return mViewId; - } } \ No newline at end of file diff --git a/app/src/main/java/com/taboola/taboolasample/adapters/ListViewAdapter.java b/app/src/main/java/com/taboola/taboolasample/adapters/ListViewAdapter.java index 2495906..0970451 100644 --- a/app/src/main/java/com/taboola/taboolasample/adapters/ListViewAdapter.java +++ b/app/src/main/java/com/taboola/taboolasample/adapters/ListViewAdapter.java @@ -7,7 +7,6 @@ import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.TextView; import com.taboola.android.TaboolaWidget; @@ -16,33 +15,16 @@ import java.util.List; - public class ListViewAdapter extends BaseAdapter { private final List mData; - TaboolaWidget mTaboolaWidget; + private TaboolaWidget mTaboolaWidget; public ListViewAdapter(Context context) { mData = ListItems.getGeneratedData(); mTaboolaWidget = new TaboolaWidget(context); - buildTaboolaWidget(context); - } - - private void buildTaboolaWidget(Context context) { - int height = Utils.getTaboolaViewHeight(context); - ViewGroup.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height); - mTaboolaWidget.setLayoutParams(params); - mTaboolaWidget - .setPageType("article") - .setPageUrl("http://www.example.com") - .setMode("thumbnails-feed") - .setPlacement("feed") - .setTargetType("mix") - .setPublisher("betterbytheminute-app"); - - mTaboolaWidget.setInterceptScroll(true); - mTaboolaWidget.fetchContent(); + Utils.buildTaboolaWidget(context, mTaboolaWidget); } @@ -142,4 +124,4 @@ public static class ViewHolderTaboola extends ViewHolder { } } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/taboola/taboolasample/adapters/RecyclerViewAdapter.java b/app/src/main/java/com/taboola/taboolasample/adapters/RecyclerViewAdapter.java index cf3e43c..9c1c9d8 100644 --- a/app/src/main/java/com/taboola/taboolasample/adapters/RecyclerViewAdapter.java +++ b/app/src/main/java/com/taboola/taboolasample/adapters/RecyclerViewAdapter.java @@ -13,6 +13,7 @@ import com.taboola.android.TaboolaWidget; import com.taboola.android.utils.SdkDetailsHelper; import com.taboola.taboolasample.R; +import com.taboola.taboolasample.utils.Utils; import java.util.List; @@ -25,21 +26,7 @@ public RecyclerViewAdapter() { mData = ListItems.getGeneratedData(); } - private static void buildTaboolaWidget(Context context, TaboolaWidget taboolaWidget) { - int height = SdkDetailsHelper.getDisplayHeight(context); - ViewGroup.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height); - taboolaWidget.setLayoutParams(params); - taboolaWidget - .setPageType("article") - .setPageUrl("http://www.example.com") - .setMode("thumbnails-feed") - .setPlacement("feed-sample-app") - .setTargetType("mix") - .setPublisher("betterbytheminute-app"); - - taboolaWidget.setInterceptScroll(true); - taboolaWidget.fetchContent(); - } + @Override @@ -104,7 +91,7 @@ public static class ViewHolderTaboola extends RecyclerView.ViewHolder { ViewHolderTaboola(TaboolaWidget taboolaWidget) { super(taboolaWidget); - buildTaboolaWidget(taboolaWidget.getContext(), taboolaWidget); + Utils.buildTaboolaWidget(taboolaWidget.getContext(), taboolaWidget); } } diff --git a/app/src/main/java/com/taboola/taboolasample/samples/tabs/BasePresenter.java b/app/src/main/java/com/taboola/taboolasample/samples/tabs/BasePresenter.java new file mode 100644 index 0000000..0d84314 --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/samples/tabs/BasePresenter.java @@ -0,0 +1,29 @@ +package com.taboola.taboolasample.samples.tabs; + +import android.os.Bundle; + +public interface BasePresenter { + + /** + * Binds presenter with a view when resumed. The Presenter will perform initialization here. + * + * @param view the view associated with this presenter + */ + void takeView(T view); + + /** + * Drops the reference to the view when destroyed + */ + void dropView(); + + void onActivityCreated(Bundle savedInstanceState); + + void onSaveInstanceState(Bundle savedInstanceState); + + void onStart(); + + void onStop(); + + void onDestroyView(); + +} \ No newline at end of file diff --git a/app/src/main/java/com/taboola/taboolasample/samples/tabs/BaseTabFragment.java b/app/src/main/java/com/taboola/taboolasample/samples/tabs/BaseTabFragment.java new file mode 100644 index 0000000..8ece6ff --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/samples/tabs/BaseTabFragment.java @@ -0,0 +1,109 @@ +package com.taboola.taboolasample.samples.tabs; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.view.ViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.taboola.taboolasample.R; +import com.taboola.taboolasample.adapters.FragmentsAdapter; + +import java.util.Locale; + +public abstract class BaseTabFragment extends Fragment implements TabsContract.TabsView { + + protected TabsContract.TabsPresenter mPresenter = new TabsPresenterImp(); + private FragmentsAdapter mAdapter; + private ViewPager mViewPager; + private ViewPager.SimpleOnPageChangeListener mOnPageChangeListener; + private TextView mTitleTextView; + + + @Override + public void onAttach(Context context) { + super.onAttach(context); + + if (mAdapter == null) { + mAdapter = new FragmentsAdapter<>(getChildFragmentManager()); + } + } + + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_tabs, container, false); + } + + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mViewPager = view.findViewById(R.id.tabs_viewpager); + setupViewPagerAdapter(mAdapter); + mViewPager.setAdapter(mAdapter); + mViewPager.setOffscreenPageLimit(mAdapter.getCount()); + + mOnPageChangeListener = new ViewPager.SimpleOnPageChangeListener() { + + @Override + public void onPageSelected(int position) { + int currentItem = mViewPager.getCurrentItem(); + mPresenter.setCurrentPage(currentItem); + T fragment = mAdapter.getItem(currentItem); + fragment.onPageSelected(); + } + }; + mViewPager.addOnPageChangeListener(mOnPageChangeListener); + mViewPager.post(() -> mOnPageChangeListener.onPageSelected(mViewPager.getCurrentItem())); + + } + + protected void setupViewPagerAdapter(FragmentsAdapter adapter) { + adapter.clear(); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mPresenter.takeView(this); + mPresenter.onActivityCreated(savedInstanceState); + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + mPresenter.onSaveInstanceState(outState); + } + + @Override + public void onStart() { + super.onStart(); + mPresenter.takeView(this); + mPresenter.onStart(); + } + + @Override + public void onStop() { + super.onStop(); + mPresenter.onStop(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + mPresenter.onDestroyView(); + } + + @Override + public void setCurrentPage(int currentPage) { + mViewPager.setCurrentItem(currentPage, false); + } + +} diff --git a/app/src/main/java/com/taboola/taboolasample/samples/tabs/BaseTaboolaFragment.java b/app/src/main/java/com/taboola/taboolasample/samples/tabs/BaseTaboolaFragment.java new file mode 100644 index 0000000..7cb98b6 --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/samples/tabs/BaseTaboolaFragment.java @@ -0,0 +1,8 @@ +package com.taboola.taboolasample.samples.tabs; + +import android.support.v4.app.Fragment; + +public abstract class BaseTaboolaFragment extends Fragment { + + public abstract void onPageSelected(); +} diff --git a/app/src/main/java/com/taboola/taboolasample/samples/tabs/PageFragment.java b/app/src/main/java/com/taboola/taboolasample/samples/tabs/PageFragment.java deleted file mode 100644 index 63345a5..0000000 --- a/app/src/main/java/com/taboola/taboolasample/samples/tabs/PageFragment.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.taboola.taboolasample.samples.tabs; - -import android.content.Context; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.taboola.android.TaboolaWidget; -import com.taboola.taboolasample.R; - -public class PageFragment extends Fragment { - - public static final String SCREEN_NAME = "ScreenName"; - private TaboolaWidget mTaboolaWidget; - private OnFragmentInteractionListener mListener; - private String mScreenName = ""; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (getArguments() != null) { - mScreenName = getArguments().getString(SCREEN_NAME); - } - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - if (context instanceof OnFragmentInteractionListener) { - mListener = (OnFragmentInteractionListener) context; - } else { - throw new RuntimeException(context.toString() - + " must implement OnFragmentInteractionListener"); - } - } - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - - View rootView = inflater.inflate(R.layout.fragment_page_sample, container, false); - - mTaboolaWidget = rootView.findViewById(R.id.taboola_widget); - mTaboolaWidget - .setPageType("article") - .setPageUrl("http://www.example.com") - .setMode("thumbnails-feed") - .setPlacement("feed-sample-app") - .setTargetType("mix") - .setPublisher("betterbytheminute-app"); - - mTaboolaWidget.setViewId(mListener.getViewID()); - mTaboolaWidget.setInterceptScroll(true); - mTaboolaWidget.getSettings().setNeedInitialFocus(false); - - return rootView; - } - - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - } - - - public void onPageSelected() { - mTaboolaWidget.fetchContent(); - } - - public interface OnFragmentInteractionListener { - String getViewID(); - } - - public static PageFragment getInstance(String screenName) { - PageFragment pageFragment = new PageFragment(); - Bundle bundle = new Bundle(); - bundle.putString(SCREEN_NAME, screenName); - pageFragment.setArguments(bundle); - return pageFragment; - } -} diff --git a/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsContract.java b/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsContract.java index 96ca437..f24950c 100644 --- a/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsContract.java +++ b/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsContract.java @@ -1,42 +1,14 @@ package com.taboola.taboolasample.samples.tabs; -import android.os.Bundle; - public interface TabsContract { interface TabsView { void setCurrentPage(int currentPage); + } interface TabsPresenter extends BasePresenter { void setCurrentPage(int position); } - - interface BasePresenter { - - /** - * Binds presenter with a view when resumed. The Presenter will perform initialization here. - * - * @param view the view associated with this presenter - */ - void takeView(T view); - - /** - * Drops the reference to the view when destroyed - */ - void dropView(); - - void onActivityCreated(Bundle savedInstanceState); - - void onSaveInstanceState(Bundle savedInstanceState); - - void onStart(); - - void onStop(); - - void onDestroyView(); - - } - } diff --git a/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsSampleFragment.java b/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsSampleFragment.java index 243d443..2520ea6 100644 --- a/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsSampleFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsSampleFragment.java @@ -1,104 +1,76 @@ package com.taboola.taboolasample.samples.tabs; -import android.content.Context; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import com.taboola.android.TaboolaWidget; import com.taboola.taboolasample.R; import com.taboola.taboolasample.adapters.FragmentsAdapter; +import com.taboola.taboolasample.utils.Utils; -public class TabsSampleFragment extends Fragment implements TabsContract.TabsView{ - - protected TabsContract.TabsPresenter mPresenter = new TabsPresenterImp(); - private ViewPager mViewPager; - private FragmentsAdapter mAdapter; +public class TabsSampleFragment extends BaseTabFragment { @Override - public void onAttach(Context context) { - super.onAttach(context); + protected void setupViewPagerAdapter(FragmentsAdapter adapter) { + super.setupViewPagerAdapter(adapter); + adapter.addFragment(SampleTaboolaFragment.getInstance()); + adapter.addFragment(SampleTaboolaFragment.getInstance()); + adapter.addFragment(SampleTaboolaFragment.getInstance()); + } - if (mAdapter == null) { - mAdapter = new FragmentsAdapter<>(getChildFragmentManager()); - } - } + public static class SampleTaboolaFragment extends BaseTaboolaFragment { - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_tabs, container, false); - } + private TaboolaWidget mTaboolaWidget; + private boolean mShouldFetch; - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - mViewPager = view.findViewById(R.id.album_tabs_viewpager); - setupViewPager(); - } + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setRetainInstance(true); + } - private void setupViewPager() { - mAdapter.addFragment(PageFragment.getInstance("page 1")); - mAdapter.addFragment(PageFragment.getInstance("page 2")); - mAdapter.addFragment(PageFragment.getInstance("page 3")); - mViewPager.setAdapter(mAdapter); - mViewPager.setSaveEnabled(false); - mViewPager.setOffscreenPageLimit(mAdapter.getCount()); - final ViewPager.SimpleOnPageChangeListener onPageChangeListener = new ViewPager.SimpleOnPageChangeListener() { + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_page_sample, container, false); + } - @Override - public void onPageSelected(int position) { - int currentItem = mViewPager.getCurrentItem(); - mPresenter.setCurrentPage(currentItem); - PageFragment fragment = mAdapter.getItem(currentItem); - fragment.onPageSelected(); - } - }; - mViewPager.addOnPageChangeListener(onPageChangeListener); - mViewPager.post(() -> onPageChangeListener.onPageSelected(mViewPager.getCurrentItem())); - } - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - mPresenter.takeView(this); - mPresenter.onActivityCreated(savedInstanceState); - } + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mTaboolaWidget = view.findViewById(R.id.taboola_widget); + Utils.buildTaboolaWidget(view.getContext(), mTaboolaWidget); - @Override - public void onSaveInstanceState(@NonNull Bundle outState) { - super.onSaveInstanceState(outState); - mPresenter.onSaveInstanceState(outState); - } + if (mShouldFetch) { + mShouldFetch = false; + mTaboolaWidget.fetchContent(); + } + } - @Override - public void onStart() { - super.onStart(); - mPresenter.takeView(this); - mPresenter.onStart(); - } + @Override + public void onPageSelected() { + if (mTaboolaWidget == null) { + mShouldFetch = true; + } else { + mTaboolaWidget.fetchContent(); + } + } - @Override - public void onStop() { - super.onStop(); - mPresenter.onStop(); - } - @Override - public void onDestroyView() { - super.onDestroyView(); - mPresenter.onDestroyView(); - } + public static SampleTaboolaFragment getInstance() { + SampleTaboolaFragment baseTaboolaFragment = new SampleTaboolaFragment(); + Bundle bundle = new Bundle(); + baseTaboolaFragment.setArguments(bundle); + return baseTaboolaFragment; + } - @Override - public void setCurrentPage(int currentPage) { - mViewPager.setCurrentItem(currentPage, false); } } diff --git a/app/src/main/java/com/taboola/taboolasample/utils/Utils.java b/app/src/main/java/com/taboola/taboolasample/utils/Utils.java index c02e6e7..96ba1ec 100644 --- a/app/src/main/java/com/taboola/taboolasample/utils/Utils.java +++ b/app/src/main/java/com/taboola/taboolasample/utils/Utils.java @@ -1,34 +1,26 @@ package com.taboola.taboolasample.utils; import android.content.Context; -import android.content.res.TypedArray; -import android.util.TypedValue; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import com.taboola.android.TaboolaWidget; import com.taboola.android.utils.SdkDetailsHelper; -import com.taboola.taboolasample.R; public class Utils { - public static int getActionBarHeight(Context context) { - int[] textSizeAttr = new int[]{R.attr.actionBarSize}; - TypedArray a = context.obtainStyledAttributes(new TypedValue().data, textSizeAttr); - int height = a.getDimensionPixelSize(0, 0); - a.recycle(); - return height; - } - - public static int getStatusBarHeight(Context context) { - int resource = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); - if (resource > 0) { - return context.getResources().getDimensionPixelSize(resource); - } - - return 0; - } + public static void buildTaboolaWidget(Context context, TaboolaWidget taboolaWidget) { + int height = SdkDetailsHelper.getDisplayHeight(context); + ViewGroup.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height); + taboolaWidget.setLayoutParams(params); + taboolaWidget + .setPageType("article") + .setPageUrl("http://www.example.com") + .setMode("thumbnails-feed") + .setPlacement("feed-sample-app") + .setTargetType("mix") + .setPublisher("betterbytheminute-app"); - public static int getTaboolaViewHeight(Context context) { - final int screenHeight = SdkDetailsHelper.getDisplayHeight(context); - int statusBarHeight = getStatusBarHeight(context); - int actionBarHeight = getActionBarHeight(context); - return screenHeight - statusBarHeight - actionBarHeight; + taboolaWidget.setInterceptScroll(true); + taboolaWidget.fetchContent(); } } diff --git a/app/src/main/res/layout/fragment_lv_sample.xml b/app/src/main/res/layout/fragment_lv_sample.xml index f137d96..5d8e2f0 100644 --- a/app/src/main/res/layout/fragment_lv_sample.xml +++ b/app/src/main/res/layout/fragment_lv_sample.xml @@ -3,6 +3,7 @@ android:id="@+id/feed_lv" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="16dp" android:layout_marginBottom="10dp" - android:layout_marginRight="16dp" /> + android:layout_marginLeft="16dp" + android:layout_marginRight="16dp" + android:layout_marginTop="10dp" /> diff --git a/app/src/main/res/layout/fragment_page_sample.xml b/app/src/main/res/layout/fragment_page_sample.xml index 30ee8e6..0eb4f75 100644 --- a/app/src/main/res/layout/fragment_page_sample.xml +++ b/app/src/main/res/layout/fragment_page_sample.xml @@ -1,33 +1,33 @@ + android:layout_height="match_parent"> + android:layout_marginLeft="10dp" + android:layout_marginRight="10dp" + android:focusable="true" + android:focusableInTouchMode="true" + android:orientation="vertical" + android:paddingTop="10dp"> + + + android:text="@string/fake_text" + app:fontFamily="casual" /> - + android:layout_height="wrap_content" /> diff --git a/app/src/main/res/layout/fragment_tabs.xml b/app/src/main/res/layout/fragment_tabs.xml index bca669e..82e2416 100644 --- a/app/src/main/res/layout/fragment_tabs.xml +++ b/app/src/main/res/layout/fragment_tabs.xml @@ -10,9 +10,8 @@ android:orientation="vertical" app:layout_behavior="@string/appbar_scrolling_view_behavior"> - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3cbd7a2..f9b6d80 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -47,8 +47,18 @@ Hercle, coordinatae camerarius!. Travel heavily like a cloudy lagoon. Tremble, scotty, mystery! - + Favere sensim ducunt ad audax boreas. + Galataes studere in talis piscinam! + When simmering bitter chicken, be sure they are room temperature. + Belay, love! + Queens are the tribbles of the ancient sonic shower. + Pol, a bene sectam, grandis tabes! + The fish ransacks with fortune, haul the fortress. + Where is the stormy seashell? + O, haul me mast, ye golden wind! + All of those transformators control bare, dead admirals. + Endless Feed Required RecyclerViewSample