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/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 ad0d6e9..da33947 100644 --- a/app/src/main/java/com/taboola/taboolasample/MainActivity.java +++ b/app/src/main/java/com/taboola/taboolasample/MainActivity.java @@ -11,20 +11,27 @@ import android.support.v7.widget.Toolbar; import android.view.MenuItem; -public class MainActivity extends AppCompatActivity - implements NavigationView.OnNavigationItemSelectedListener { +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.TabsSampleFragment; + +public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { @Override 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,17 +73,31 @@ 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.lv_sample: + fragmentToOpen = new ListViewSampleFragment(); break; + + case R.id.view_pager_sample: + fragmentToOpen = new TabsSampleFragment(); + break; + default: - return false; + return false; } 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; } + } \ No newline at end of file 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/adapters/ListItems.java b/app/src/main/java/com/taboola/taboolasample/adapters/ListItems.java new file mode 100644 index 0000000..052c74f --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/adapters/ListItems.java @@ -0,0 +1,96 @@ +package com.taboola.taboolasample.adapters; + +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 { + + public 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; + } + } + + public static class TaboolaView extends FeedListItem { + + TaboolaView() { + super(ItemType.TABOOLA_ITEM); + } + } + + public 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/adapters/ListViewAdapter.java b/app/src/main/java/com/taboola/taboolasample/adapters/ListViewAdapter.java new file mode 100644 index 0000000..0970451 --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/adapters/ListViewAdapter.java @@ -0,0 +1,127 @@ +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.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; + + private TaboolaWidget mTaboolaWidget; + + public ListViewAdapter(Context context) { + mData = ListItems.getGeneratedData(); + mTaboolaWidget = new TaboolaWidget(context); + Utils.buildTaboolaWidget(context, mTaboolaWidget); + } + + + @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); + } + } + +} \ 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 new file mode 100644 index 0000000..9c1c9d8 --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/adapters/RecyclerViewAdapter.java @@ -0,0 +1,99 @@ +package com.taboola.taboolasample.adapters; + +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.taboola.android.TaboolaWidget; +import com.taboola.android.utils.SdkDetailsHelper; +import com.taboola.taboolasample.R; +import com.taboola.taboolasample.utils.Utils; + +import java.util.List; + +public class RecyclerViewAdapter extends RecyclerView.Adapter { + + + private final List mData; + + public RecyclerViewAdapter() { + mData = ListItems.getGeneratedData(); + } + + + + + @Override + public int getItemViewType(int position) { + ListItems.FeedListItem item = getItem(position); + return item.type; + } + + + @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) { + + case ListItems.FeedListItem.ItemType.TABOOLA_ITEM: + return new ViewHolderTaboola(new TaboolaWidget(parent.getContext())); + + default: + case ListItems.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) { + ListItems.FeedListItem item = getItem(position); + + if (item.type == ListItems.FeedListItem.ItemType.RANDOM_ITEM) { + RandomImageViewHolder vh = (RandomImageViewHolder) holder; + ListItems.RandomItem randomItem = (ListItems.RandomItem) item; + final ImageView imageView = vh.imageView; + imageView.setBackgroundColor(randomItem.color); + vh.textView.setText(randomItem.randomText); + } + } + + + 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 { + + ViewHolderTaboola(TaboolaWidget taboolaWidget) { + super(taboolaWidget); + Utils.buildTaboolaWidget(taboolaWidget.getContext(), taboolaWidget); + } + } + + +} diff --git a/app/src/main/java/com/taboola/taboolasample/ConfigFragment.java b/app/src/main/java/com/taboola/taboolasample/samples/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/samples/ConfigFragment.java index 856e661..caf4de6 100644 --- a/app/src/main/java/com/taboola/taboolasample/ConfigFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/samples/ConfigFragment.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample; +package com.taboola.taboolasample.samples; 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.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/samples/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/samples/DynamicSampleFragment.java index 4c0fda5..ab5e9e3 100644 --- a/app/src/main/java/com/taboola/taboolasample/DynamicSampleFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/samples/DynamicSampleFragment.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample; +package com.taboola.taboolasample.samples; 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/samples/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/samples/EndlessFeedSampleFragment.java index ce0c63a..a3365c9 100644 --- a/app/src/main/java/com/taboola/taboolasample/EndlessFeedFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/samples/EndlessFeedSampleFragment.java @@ -1,34 +1,26 @@ -package com.taboola.taboolasample; +package com.taboola.taboolasample.samples; 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 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 +28,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/samples/ListViewSampleFragment.java b/app/src/main/java/com/taboola/taboolasample/samples/ListViewSampleFragment.java new file mode 100644 index 0000000..fc82de2 --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/samples/ListViewSampleFragment.java @@ -0,0 +1,38 @@ +package com.taboola.taboolasample.samples; + +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/samples/RecyclerViewSampleFragment.java b/app/src/main/java/com/taboola/taboolasample/samples/RecyclerViewSampleFragment.java new file mode 100644 index 0000000..fd5f5b5 --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/samples/RecyclerViewSampleFragment.java @@ -0,0 +1,42 @@ +package com.taboola.taboolasample.samples; + +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; + +import com.taboola.taboolasample.R; +import com.taboola.taboolasample.adapters.RecyclerViewAdapter; + +public class RecyclerViewSampleFragment extends Fragment { + + private RecyclerViewAdapter mAdapter; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + mAdapter = new RecyclerViewAdapter(); + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_rv_sample, 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/SettingsDialog.java b/app/src/main/java/com/taboola/taboolasample/samples/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/samples/SettingsDialogFragment.java index 8e5e662..3d0a372 100644 --- a/app/src/main/java/com/taboola/taboolasample/SettingsDialog.java +++ b/app/src/main/java/com/taboola/taboolasample/samples/SettingsDialogFragment.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample; +package com.taboola.taboolasample.samples; import android.app.Dialog; import android.databinding.BindingAdapter; @@ -15,14 +15,16 @@ import android.widget.Button; import android.widget.EditText; +import com.taboola.taboolasample.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/samples/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/samples/XmlSampleFragment.java index 132a08b..11ae50c 100644 --- a/app/src/main/java/com/taboola/taboolasample/XmlSampleFragment.java +++ b/app/src/main/java/com/taboola/taboolasample/samples/XmlSampleFragment.java @@ -1,4 +1,4 @@ -package com.taboola.taboolasample; +package com.taboola.taboolasample.samples; 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/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/TabsContract.java b/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsContract.java new file mode 100644 index 0000000..f24950c --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsContract.java @@ -0,0 +1,14 @@ +package com.taboola.taboolasample.samples.tabs; + +public interface TabsContract { + + interface TabsView { + void setCurrentPage(int currentPage); + + } + + interface TabsPresenter extends BasePresenter { + void setCurrentPage(int position); + } + +} 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..2520ea6 --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/samples/tabs/TabsSampleFragment.java @@ -0,0 +1,76 @@ +package com.taboola.taboolasample.samples.tabs; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +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 BaseTabFragment { + + @Override + protected void setupViewPagerAdapter(FragmentsAdapter adapter) { + super.setupViewPagerAdapter(adapter); + adapter.addFragment(SampleTaboolaFragment.getInstance()); + adapter.addFragment(SampleTaboolaFragment.getInstance()); + adapter.addFragment(SampleTaboolaFragment.getInstance()); + } + + + public static class SampleTaboolaFragment extends BaseTaboolaFragment { + + private TaboolaWidget mTaboolaWidget; + private boolean mShouldFetch; + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setRetainInstance(true); + } + + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_page_sample, container, false); + } + + + @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); + + if (mShouldFetch) { + mShouldFetch = false; + mTaboolaWidget.fetchContent(); + } + } + + @Override + public void onPageSelected() { + if (mTaboolaWidget == null) { + mShouldFetch = true; + } else { + mTaboolaWidget.fetchContent(); + } + } + + + public static SampleTaboolaFragment getInstance() { + SampleTaboolaFragment baseTaboolaFragment = new SampleTaboolaFragment(); + Bundle bundle = new Bundle(); + baseTaboolaFragment.setArguments(bundle); + return baseTaboolaFragment; + } + + } +} diff --git a/app/src/main/java/com/taboola/taboolasample/utils/Utils.java b/app/src/main/java/com/taboola/taboolasample/utils/Utils.java new file mode 100644 index 0000000..96ba1ec --- /dev/null +++ b/app/src/main/java/com/taboola/taboolasample/utils/Utils.java @@ -0,0 +1,26 @@ +package com.taboola.taboolasample.utils; + +import android.content.Context; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +import com.taboola.android.TaboolaWidget; +import com.taboola.android.utils.SdkDetailsHelper; + +public class Utils { + 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"); + + taboolaWidget.setInterceptScroll(true); + taboolaWidget.fetchContent(); + } +} 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/fragment_config.xml b/app/src/main/res/layout/fragment_config.xml index f5aa913..84f76f6 100644 --- a/app/src/main/res/layout/fragment_config.xml +++ b/app/src/main/res/layout/fragment_config.xml @@ -2,7 +2,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="com.taboola.taboolasample.ConfigFragment"> + tools:context="com.taboola.taboolasample.samples.ConfigFragment"> + tools:context="com.taboola.taboolasample.samples.DynamicSampleFragment"> + android:layout_height="match_parent"> + diff --git a/app/src/main/res/layout/fragment_page_sample.xml b/app/src/main/res/layout/fragment_page_sample.xml new file mode 100644 index 0000000..0eb4f75 --- /dev/null +++ b/app/src/main/res/layout/fragment_page_sample.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_rv_sample.xml b/app/src/main/res/layout/fragment_rv_sample.xml new file mode 100644 index 0000000..3e09cec --- /dev/null +++ b/app/src/main/res/layout/fragment_rv_sample.xml @@ -0,0 +1,8 @@ + + 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..82e2416 --- /dev/null +++ b/app/src/main/res/layout/fragment_tabs.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_xml_sample.xml b/app/src/main/res/layout/fragment_xml_sample.xml index 434856f..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.DynamicSampleFragment"> + tools:context="com.taboola.taboolasample.samples.DynamicSampleFragment"> + + + + + + + + diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index 2ac9753..7d17acf 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -5,17 +5,29 @@ + 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..f9b6d80 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -44,8 +44,26 @@ 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! + 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 + ListViewSample + ListViewSampleFragment + View Pager Sample \ 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