From a060f7d325a53fbf56a13a97876faeb03f1f856d Mon Sep 17 00:00:00 2001 From: stevenw Date: Fri, 15 Jan 2016 10:54:13 +0100 Subject: [PATCH 01/26] I: about page with recycler view --- .../java/team/io/youcodeio/HomeActivity.java | 2 + .../team/io/youcodeio/model/AboutModel.java | 92 +++++++++ .../about/AboutRecyclerViewAdapter.java | 101 ++++++++++ .../ConferencesRecyclerViewAdapter.java | 3 +- .../ui/fragment/about/AboutFragment.java | 188 ++++++++++++++++++ .../conferences/ConferencesFragment.java | 2 +- .../src/main/res/layout/fragment_about.xml | 14 ++ .../main/res/layout/fragment_conferences.xml | 2 +- .../res/layout/recyclerview_item_about.xml | 53 +++++ .../layout/recyclerview_item_conferences.xml | 2 +- .../mobile/src/main/res/values/styles.xml | 6 +- 11 files changed, 459 insertions(+), 6 deletions(-) create mode 100644 youcodeio/mobile/src/main/java/team/io/youcodeio/model/AboutModel.java create mode 100644 youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/about/AboutRecyclerViewAdapter.java create mode 100644 youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/about/AboutFragment.java create mode 100644 youcodeio/mobile/src/main/res/layout/fragment_about.xml create mode 100644 youcodeio/mobile/src/main/res/layout/recyclerview_item_about.xml diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/HomeActivity.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/HomeActivity.java index 3ce14bd..a223874 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/HomeActivity.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/HomeActivity.java @@ -11,6 +11,7 @@ import br.liveo.model.HelpLiveo; import br.liveo.model.Navigation; import br.liveo.navigationliveo.NavigationLiveo; +import team.io.youcodeio.ui.fragment.about.AboutFragment; import team.io.youcodeio.ui.fragment.conferences.ConferencesFragment; import team.io.youcodeio.ui.fragment.search.SearchFragment; @@ -91,6 +92,7 @@ public void onItemClick(int i) { case 4: // TODO change this to AboutFragment //MySaveActvity.start(this); + mFragment = new AboutFragment(); break; default: diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/model/AboutModel.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/model/AboutModel.java new file mode 100644 index 0000000..8efaf4d --- /dev/null +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/model/AboutModel.java @@ -0,0 +1,92 @@ +package team.io.youcodeio.model; + +import java.util.Map; + +/** + * Created by stevenwatremez on 15/01/16. + * + */ +public class AboutModel { + + /***************************************************************** + * DATA + ****************************************************************/ + private long id; + private String mName; + private String mDescription; + private Map mSocialNetworkLink; + + /***************************************************************** + * CONSTRUCTOR + ****************************************************************/ + public AboutModel() { + } + + /***************************************************************** + * GETTER + ****************************************************************/ + public long getId() { + return id; + } + + public String getName() { + return mName; + } + + public String getDescription() { + return mDescription; + } + + public Map getSocialNetworkLink() { + return mSocialNetworkLink; + } + + /***************************************************************** + * SETTER + ****************************************************************/ + public void setId(long id) { + this.id = id; + } + + public void setTitle(String text) { + this.mName = text; + } + + public void setSubtitle(String subtitle) { + this.mDescription = subtitle; + } + + public void setSocialNetworkLink(Map socialNetworkLink) { + mSocialNetworkLink = socialNetworkLink; + } + + public static class Builder { + + private AboutModel mAboutModel; + + public Builder() { + mAboutModel = new AboutModel(); + } + + public Builder setName(String name) { + mAboutModel.mName = name; + return this; + } + + public Builder setDescription(String description) { + mAboutModel.mDescription = description; + return this; + } + + public Builder setSocialNetworkLink(Map socialNetworkLink) { + mAboutModel.mSocialNetworkLink = socialNetworkLink; + return this; + } + + public AboutModel build() { + return mAboutModel; + } + + } + +} diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/about/AboutRecyclerViewAdapter.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/about/AboutRecyclerViewAdapter.java new file mode 100644 index 0000000..54a23e1 --- /dev/null +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/about/AboutRecyclerViewAdapter.java @@ -0,0 +1,101 @@ +package team.io.youcodeio.ui.adapter.about; + +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.TextView; + +import java.util.List; +import java.util.Map; + +import team.io.youcodeio.R; +import team.io.youcodeio.model.AboutModel; + +/** + * Created by stevenwatremez on 15/01/16. + * + */ +public class AboutRecyclerViewAdapter extends RecyclerView.Adapter{ + + /***************************************************************** + * DATA + ****************************************************************/ + private int mPosition; + private List mItems; + private int mItemLayout = R.layout.recyclerview_item_about; + private Map mIdToSocialNetworkLink; + + + /***************************************************************** + * CONSTRUCTOR + ****************************************************************/ + public AboutRecyclerViewAdapter(List items) { + this.mItems = items; + } + + /***************************************************************** + * OVERRIDE METHODS + ****************************************************************/ + @Override + public AboutRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()).inflate(mItemLayout, parent, false); + return new ViewHolder(v); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + final AboutModel item = mItems.get(position); + holder.itemView.setTag(item); + holder.name.setText(item.getName()); + holder.description.setText(item.getDescription()); + } + + @Override + public int getItemCount() { + return mItems.size(); + } + + /***************************************************************** + * INNER CLASS + ****************************************************************/ + // TODO need to implements View.OnCreateContextMenuListener + public static class ViewHolder extends RecyclerView.ViewHolder { + public TextView name; + public TextView description; + public ImageButton menuButton; + + public ViewHolder(View itemView) { + super(itemView); + name = (TextView) itemView.findViewById(R.id.name); + description = (TextView) itemView.findViewById(R.id.description); + menuButton = (ImageButton) itemView.findViewById(R.id.contextual_menu_about); + // TODO implement Context Menu in Recycler view + //itemView.setOnCreateContextMenuListener(this); + } + + /*@Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + //menuInfo is null + for (AboutModel item : mItems) { + + } + menu.add(); + menu.add(); + }*/ + } + /***************************************************************** + * PUBLIC METHOD + ****************************************************************/ + + public int getPosition() { + return mPosition; + } + + public void setPosition(int position) { + this.mPosition = position; + } + + // TODO create the Getter of the mIdToSocialNetworkLink Map +} diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/conferences/ConferencesRecyclerViewAdapter.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/conferences/ConferencesRecyclerViewAdapter.java index cfc5f42..ec2ea92 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/conferences/ConferencesRecyclerViewAdapter.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/conferences/ConferencesRecyclerViewAdapter.java @@ -1,7 +1,6 @@ package team.io.youcodeio.ui.adapter.conferences; import android.support.v7.widget.RecyclerView; -import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -71,7 +70,7 @@ public ViewHolder(View itemView) { super(itemView); title = (TextView) itemView.findViewById(R.id.title); subtitle = (TextView) itemView.findViewById(R.id.subtitle); - menuButton = (ImageButton) itemView.findViewById(R.id.contextual_menu); + menuButton = (ImageButton) itemView.findViewById(R.id.contextual_menu_conferences); // TODO implement Context Menu in Recycler view //itemView.setOnCreateContextMenuListener(this); } diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/about/AboutFragment.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/about/AboutFragment.java new file mode 100644 index 0000000..660a8c2 --- /dev/null +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/about/AboutFragment.java @@ -0,0 +1,188 @@ +package team.io.youcodeio.ui.fragment.about; + +import android.os.Bundle; +import android.support.annotation.NonNull; +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 java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import butterknife.Bind; +import butterknife.BindString; +import butterknife.ButterKnife; +import team.io.youcodeio.R; +import team.io.youcodeio.model.AboutModel; +import team.io.youcodeio.ui.adapter.about.AboutRecyclerViewAdapter; + +/** + * Created by stevenwatremez on 15/01/16. + * + */ +public class AboutFragment extends Fragment{ + + + /***************************************************************** + * DATA + ****************************************************************/ + private View mRootView; + private RecyclerView.Adapter mAdapter; + private RecyclerView.LayoutManager mLayoutManager; + private AboutModel.Builder mAboutModelBuilder; + private List mListAboutModel; + + /***************************************************************** + * UI + ****************************************************************/ + @Bind(R.id.about_recycler_view) + RecyclerView mAboutRecyclerView; + + @BindString(R.string.drawer_menu_about) + String mAboutToolbarTitle; + /***************************************************************** + * CONSTRUCTOR + ****************************************************************/ + + /***************************************************************** + * LIFE CYCLE + ****************************************************************/ + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + mRootView = inflater.inflate(R.layout.fragment_about, container, false); + initUI(); + return mRootView; + } + /***************************************************************** + * PROTECTED METHOD + ****************************************************************/ + + /***************************************************************** + * IMPLEMENTS METHOD + ****************************************************************/ + + /***************************************************************** + * PUBLIC METHOD + ****************************************************************/ + + /***************************************************************** + * PRIVATE METHOD + ****************************************************************/ + + private void initUI() { + ButterKnife.bind(this, mRootView); + // set the action Bar title + getActivity().setTitle(mAboutToolbarTitle); + + // use this setting to improve performance if you know that changes + // in content do not change the layout size of the RecyclerView + mAboutRecyclerView.setHasFixedSize(true); + + // use a linear layout manager + mLayoutManager = new LinearLayoutManager(getActivity()); + mAboutRecyclerView.setLayoutManager(mLayoutManager); + + createFakeAboutdata(); + + mAdapter = new AboutRecyclerViewAdapter(mListAboutModel); + mAboutRecyclerView.setAdapter(mAdapter); + } + + private void createFakeAboutdata(){ + Map aboutYearMap = new HashMap<>(); + + // FIXME DATA 1 + mListAboutModel = new ArrayList<>(); + mAboutModelBuilder = new AboutModel.Builder(); + + aboutYearMap.put("2014", "http://youcode.io/#/home"); + aboutYearMap.put("2015", "http://youcode.io/#/home"); + + mAboutModelBuilder + .setName("Pierre Zemb") + .setDescription("Hi! My name is Pierre Zemb, and I'm a French student in a graduate school of engineeringscience called ISEN where I'm currently studying Software Engineering. I'm really enjoying coding in C++, Java or Go and ship them with Docker, but I always end up developping Web apps like this one. Checkout my twitter and my website for more info!") + .setSocialNetworkLink(aboutYearMap); + + mListAboutModel.add(mAboutModelBuilder.build()); + + + // FIXME DATA 2 + aboutYearMap = new HashMap<>(); + mAboutModelBuilder = new AboutModel.Builder(); + + aboutYearMap.put("2014", "http://youcode.io/#/home"); + aboutYearMap.put("2015", "http://youcode.io/#/home"); + + mAboutModelBuilder + .setName("Alexis Hellouin") + .setDescription("Hello, my name is Alexis and I am a french student in engineering school. I like web and software development, and also discovering new framework. I'm really enjoying coding in Java, Android and I try new language when I have the time (next is C++). You can check my twitter and linkedIn account for more info!") + .setSocialNetworkLink(aboutYearMap); + + mListAboutModel.add(mAboutModelBuilder.build()); + + + // FIXME DATA 3 + aboutYearMap = new HashMap<>(); + mAboutModelBuilder = new AboutModel.Builder(); + + aboutYearMap.put("2014", "http://youcode.io/#/home"); + aboutYearMap.put("2015", "http://youcode.io/#/home"); + + mAboutModelBuilder + .setName("Steven Watremez") + .setDescription("Hi! My name is Steven Watremez, and I'm a French student too. In same cursus like Pierre and Alexis.I like coding for the web. It is really awesome to inovate and learn new technologies like AngularJS or Polymer. I'm web designer for my extra-activity and I like it. I designed this web app. Checkout my twitter and my website for more info!") + .setSocialNetworkLink(aboutYearMap); + + mListAboutModel.add(mAboutModelBuilder.build()); + + // FIXME DATA 4 + aboutYearMap = new HashMap<>(); + mAboutModelBuilder = new AboutModel.Builder(); + + aboutYearMap.put("2014", "http://youcode.io/#/home"); + aboutYearMap.put("2015", "http://youcode.io/#/home"); + + mAboutModelBuilder + .setName("Mathieu Sallardon") + .setDescription("Hi! My name is Mathieu Sallardon, and I'm a French student in a graduate school of engineeringscience called ISEN where I'm currently studying Software Engineering. I'm really enjoying coding in C++, Java or Go and ship them with Docker, but I always end up developping Web apps like this one. Checkout my twitter and my website for more info!") + .setSocialNetworkLink(aboutYearMap); + + mListAboutModel.add(mAboutModelBuilder.build()); + + + // FIXME DATA 5 + aboutYearMap = new HashMap<>(); + mAboutModelBuilder = new AboutModel.Builder(); + + aboutYearMap.put("2014", "http://youcode.io/#/home"); + aboutYearMap.put("2015", "http://youcode.io/#/home"); + + mAboutModelBuilder + .setName("Maxime Caruchet") + .setDescription("Hello, my name is Maxime Caruchet and I am a french student in engineering school. I like web and software development, and also discovering new framework. I'm really enjoying coding in Java, Android and I try new language when I have the time (next is C++). You can check my twitter and linkedIn account for more info!") + .setSocialNetworkLink(aboutYearMap); + + mListAboutModel.add(mAboutModelBuilder.build()); + + + // FIXME DATA 6 + aboutYearMap = new HashMap<>(); + mAboutModelBuilder = new AboutModel.Builder(); + + aboutYearMap.put("2014", "http://youcode.io/#/home"); + aboutYearMap.put("2015", "http://youcode.io/#/home"); + + mAboutModelBuilder + .setName("Florian Barreau") + .setDescription("Hi! My name is Florian Barreau, and I'm a French student too. In same cursus like Pierre and Alexis.I like coding for the web. It is really awesome to inovate and learn new technologies like AngularJS or Polymer. I'm web designer for my extra-activity and I like it. I designed this web app. Checkout my twitter and my website for more info!") + .setSocialNetworkLink(aboutYearMap); + + mListAboutModel.add(mAboutModelBuilder.build()); + } +} diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/conferences/ConferencesFragment.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/conferences/ConferencesFragment.java index 1a547d7..9613280 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/conferences/ConferencesFragment.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/conferences/ConferencesFragment.java @@ -38,7 +38,7 @@ public class ConferencesFragment extends Fragment{ /***************************************************************** * UI ****************************************************************/ - @Bind(R.id.my_recycler_view) + @Bind(R.id.conferences_recycler_view) RecyclerView mConferencesRecyclerView; @BindString(R.string.drawer_menu_conferences) diff --git a/youcodeio/mobile/src/main/res/layout/fragment_about.xml b/youcodeio/mobile/src/main/res/layout/fragment_about.xml new file mode 100644 index 0000000..3d0560c --- /dev/null +++ b/youcodeio/mobile/src/main/res/layout/fragment_about.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/youcodeio/mobile/src/main/res/layout/fragment_conferences.xml b/youcodeio/mobile/src/main/res/layout/fragment_conferences.xml index 106a62a..abdbd25 100644 --- a/youcodeio/mobile/src/main/res/layout/fragment_conferences.xml +++ b/youcodeio/mobile/src/main/res/layout/fragment_conferences.xml @@ -6,7 +6,7 @@ diff --git a/youcodeio/mobile/src/main/res/layout/recyclerview_item_about.xml b/youcodeio/mobile/src/main/res/layout/recyclerview_item_about.xml new file mode 100644 index 0000000..2289d0f --- /dev/null +++ b/youcodeio/mobile/src/main/res/layout/recyclerview_item_about.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/youcodeio/mobile/src/main/res/layout/recyclerview_item_conferences.xml b/youcodeio/mobile/src/main/res/layout/recyclerview_item_conferences.xml index 61c9d57..054a915 100644 --- a/youcodeio/mobile/src/main/res/layout/recyclerview_item_conferences.xml +++ b/youcodeio/mobile/src/main/res/layout/recyclerview_item_conferences.xml @@ -32,7 +32,7 @@ android:ellipsize="end"/> + + From 73d0de5dfdf47254b73115eb6ddb59cb59eb6b36 Mon Sep 17 00:00:00 2001 From: stevenw Date: Fri, 15 Jan 2016 17:04:13 +0100 Subject: [PATCH 02/26] I: Channel page with recycler view --- .../java/team/io/youcodeio/HomeActivity.java | 15 +-- .../model/{ => about}/AboutModel.java | 2 +- .../youcodeio/model/channel/ChannelModel.java | 95 ++++++++++++++ .../ConferencesModel.java} | 3 +- .../about/AboutRecyclerViewAdapter.java | 2 +- .../channel/ChannelRecylcerViewAdapter.java | 86 +++++++++++++ .../ConferencesRecyclerViewAdapter.java | 2 +- .../ui/fragment/about/AboutFragment.java | 2 +- .../ui/fragment/channels/ChannelFragment.java | 116 ++++++++++++++++++ .../conferences/ConferencesFragment.java | 5 +- .../ui/fragment/search/SearchFragment.java | 104 ++++++++-------- youcodeio/mobile/src/main/res/ailye_logo.png | Bin 0 -> 20275 bytes .../src/main/res/drawable/ailye_logo.png | Bin 0 -> 20275 bytes .../src/main/res/layout/content_search.xml | 17 --- .../src/main/res/layout/fragment_channel.xml | 14 +++ .../src/main/res/layout/fragment_search.xml | 37 ++---- .../res/layout/recyclerview_item_channel.xml | 41 +++++++ .../mobile/src/main/res/menu/menu_search.xml | 9 +- .../mobile/src/main/res/values/styles.xml | 23 ---- 19 files changed, 428 insertions(+), 145 deletions(-) rename youcodeio/mobile/src/main/java/team/io/youcodeio/model/{ => about}/AboutModel.java (98%) create mode 100644 youcodeio/mobile/src/main/java/team/io/youcodeio/model/channel/ChannelModel.java rename youcodeio/mobile/src/main/java/team/io/youcodeio/model/{conferencesModel.java => conferences/ConferencesModel.java} (97%) create mode 100644 youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/channel/ChannelRecylcerViewAdapter.java create mode 100644 youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/channels/ChannelFragment.java create mode 100644 youcodeio/mobile/src/main/res/ailye_logo.png create mode 100644 youcodeio/mobile/src/main/res/drawable/ailye_logo.png delete mode 100644 youcodeio/mobile/src/main/res/layout/content_search.xml create mode 100644 youcodeio/mobile/src/main/res/layout/fragment_channel.xml create mode 100644 youcodeio/mobile/src/main/res/layout/recyclerview_item_channel.xml diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/HomeActivity.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/HomeActivity.java index a223874..a085bcd 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/HomeActivity.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/HomeActivity.java @@ -12,6 +12,7 @@ import br.liveo.model.Navigation; import br.liveo.navigationliveo.NavigationLiveo; import team.io.youcodeio.ui.fragment.about.AboutFragment; +import team.io.youcodeio.ui.fragment.channels.ChannelFragment; import team.io.youcodeio.ui.fragment.conferences.ConferencesFragment; import team.io.youcodeio.ui.fragment.search.SearchFragment; @@ -25,8 +26,8 @@ public class HomeActivity extends NavigationLiveo implements OnItemClickListener ***********************************************************************************************/ @Override public void onInt(Bundle bundle) { - // TODO User Information - /* TODO ------- create a MODEL for this information ------ */ + + /* -------------------------------------------------- */ this.userBackground.setImageResource(R.drawable.background_drawer_menu_youcodeio); /* -------------------------------------------------- */ @@ -75,23 +76,15 @@ public void onItemClick(int i) { Fragment mFragment = null; switch (i) { case 0: - // Launch the SearchFragment when this item on the drawer menu are selected - //mFragment = new SearchFragment(); mFragment = new SearchFragment(); - //SearchActivity.start(this); break; case 1: - // TODO change this to ConferencesFragment - //AnnonceCreationOrUpdateActivity.start(this); mFragment = new ConferencesFragment(); break; case 2: - // TODO change this to ChannelsFragment - //mFragment = new MyAdsFragment(); + mFragment = new ChannelFragment(); break; case 4: - // TODO change this to AboutFragment - //MySaveActvity.start(this); mFragment = new AboutFragment(); break; diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/model/AboutModel.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/model/about/AboutModel.java similarity index 98% rename from youcodeio/mobile/src/main/java/team/io/youcodeio/model/AboutModel.java rename to youcodeio/mobile/src/main/java/team/io/youcodeio/model/about/AboutModel.java index 8efaf4d..a4dc868 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/model/AboutModel.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/model/about/AboutModel.java @@ -1,4 +1,4 @@ -package team.io.youcodeio.model; +package team.io.youcodeio.model.about; import java.util.Map; diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/model/channel/ChannelModel.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/model/channel/ChannelModel.java new file mode 100644 index 0000000..914abfe --- /dev/null +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/model/channel/ChannelModel.java @@ -0,0 +1,95 @@ +package team.io.youcodeio.model.channel; + +import android.graphics.Bitmap; + +import java.util.Map; + +/** + * Created by stevenwatremez on 15/01/16. + * + */ +public class ChannelModel { + + + /***************************************************************** + * DATA + ****************************************************************/ + private long id; + private String mTitle; + private String mDescription; + private Bitmap mLogo; + + /***************************************************************** + * CONSTRUCTOR + ****************************************************************/ + public ChannelModel() { + } + + /***************************************************************** + * GETTER + ****************************************************************/ + public long getId() { + return id; + } + + public String getTitle() { + return mTitle; + } + + public String getSubtitle() { + return mDescription; + } + + public Bitmap getLogo() { + return mLogo; + } + + /***************************************************************** + * SETTER + ****************************************************************/ + public void setId(long id) { + this.id = id; + } + + public void setTitle(String text) { + this.mTitle = text; + } + + public void setSubtitle(String subtitle) { + this.mDescription = subtitle; + } + + public void setLogo(Bitmap logo) { + mLogo = logo; + } + + public static class Builder { + + private ChannelModel mChannelModel; + + public Builder() { + mChannelModel = new ChannelModel(); + } + + public Builder setTitle(String title) { + mChannelModel.mTitle = title; + return this; + } + + public Builder setDescription(String description) { + mChannelModel.mDescription = description; + return this; + } + + public Builder setLogo(Bitmap logo) { + mChannelModel.mLogo = logo; + return this; + } + + public ChannelModel build() { + return mChannelModel; + } + + } + +} diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/model/conferencesModel.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/model/conferences/ConferencesModel.java similarity index 97% rename from youcodeio/mobile/src/main/java/team/io/youcodeio/model/conferencesModel.java rename to youcodeio/mobile/src/main/java/team/io/youcodeio/model/conferences/ConferencesModel.java index 5517575..0cf62ff 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/model/conferencesModel.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/model/conferences/ConferencesModel.java @@ -1,6 +1,5 @@ -package team.io.youcodeio.model; +package team.io.youcodeio.model.conferences; -import java.util.List; import java.util.Map; /** diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/about/AboutRecyclerViewAdapter.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/about/AboutRecyclerViewAdapter.java index 54a23e1..2193bd6 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/about/AboutRecyclerViewAdapter.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/about/AboutRecyclerViewAdapter.java @@ -11,7 +11,7 @@ import java.util.Map; import team.io.youcodeio.R; -import team.io.youcodeio.model.AboutModel; +import team.io.youcodeio.model.about.AboutModel; /** * Created by stevenwatremez on 15/01/16. diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/channel/ChannelRecylcerViewAdapter.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/channel/ChannelRecylcerViewAdapter.java new file mode 100644 index 0000000..25d177c --- /dev/null +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/channel/ChannelRecylcerViewAdapter.java @@ -0,0 +1,86 @@ +package team.io.youcodeio.ui.adapter.channel; + +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 java.util.List; + +import team.io.youcodeio.R; +import team.io.youcodeio.model.channel.ChannelModel; + +/** + * Created by stevenwatremez on 15/01/16. + * + */ +public class ChannelRecylcerViewAdapter extends RecyclerView.Adapter { + + + /***************************************************************** + * DATA + ****************************************************************/ + private int mPosition; + private List mItems; + private int mItemLayout = R.layout.recyclerview_item_channel; + + + /***************************************************************** + * CONSTRUCTOR + ****************************************************************/ + public ChannelRecylcerViewAdapter(List items) { + this.mItems = items; + } + + /***************************************************************** + * OVERRIDE METHODS + ****************************************************************/ + @Override + public ChannelRecylcerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()).inflate(mItemLayout, parent, false); + return new ViewHolder(v); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + final ChannelModel item = mItems.get(position); + holder.itemView.setTag(item); + holder.title.setText(item.getTitle()); + holder.description.setText(item.getSubtitle()); + // TODO holder.logoChannel.setImageBitmap(item.getLogo()); + } + + @Override + public int getItemCount() { + return mItems.size(); + } + + /***************************************************************** + * INNER CLASS + ****************************************************************/ + public static class ViewHolder extends RecyclerView.ViewHolder { + public TextView title; + public TextView description; + // TODO public ImageView logoChannel; + + public ViewHolder(View itemView) { + super(itemView); + title = (TextView) itemView.findViewById(R.id.title); + description = (TextView) itemView.findViewById(R.id.description); + // TODO logoChannel = (ImageView) itemView.findViewById(R.id.logo_channel); + } + } + /***************************************************************** + * PUBLIC METHOD + ****************************************************************/ + + public int getPosition() { + return mPosition; + } + + public void setPosition(int position) { + this.mPosition = position; + } +} diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/conferences/ConferencesRecyclerViewAdapter.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/conferences/ConferencesRecyclerViewAdapter.java index ec2ea92..ecbab77 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/conferences/ConferencesRecyclerViewAdapter.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/conferences/ConferencesRecyclerViewAdapter.java @@ -11,7 +11,7 @@ import java.util.Map; import team.io.youcodeio.R; -import team.io.youcodeio.model.ConferencesModel; +import team.io.youcodeio.model.conferences.ConferencesModel; /** * Created by stevenwatremez on 11/01/16. diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/about/AboutFragment.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/about/AboutFragment.java index 660a8c2..30f5f76 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/about/AboutFragment.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/about/AboutFragment.java @@ -18,7 +18,7 @@ import butterknife.BindString; import butterknife.ButterKnife; import team.io.youcodeio.R; -import team.io.youcodeio.model.AboutModel; +import team.io.youcodeio.model.about.AboutModel; import team.io.youcodeio.ui.adapter.about.AboutRecyclerViewAdapter; /** diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/channels/ChannelFragment.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/channels/ChannelFragment.java new file mode 100644 index 0000000..4931b9b --- /dev/null +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/channels/ChannelFragment.java @@ -0,0 +1,116 @@ +package team.io.youcodeio.ui.fragment.channels; + +import android.os.Bundle; +import android.support.annotation.NonNull; +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 java.util.ArrayList; +import java.util.List; + +import butterknife.Bind; +import butterknife.BindString; +import butterknife.ButterKnife; +import team.io.youcodeio.R; +import team.io.youcodeio.model.channel.ChannelModel; +import team.io.youcodeio.ui.adapter.channel.ChannelRecylcerViewAdapter; + +/** + * Created by stevenwatremez on 15/01/16. + */ +public class ChannelFragment extends Fragment { + + + /***************************************************************** + * DATA + ****************************************************************/ + private View mRootView; + private RecyclerView.Adapter mAdapter; + private RecyclerView.LayoutManager mLayoutManager; + private ChannelModel.Builder mChannelModelBuilder; + private List mListChannelModel; + + /***************************************************************** + * UI + ****************************************************************/ + @Bind(R.id.conferences_recycler_view) + RecyclerView mConferencesRecyclerView; + + @BindString(R.string.drawer_menu_conferences) + String mConferencesToolbarTitle; + /***************************************************************** + * CONSTRUCTOR + ****************************************************************/ + + /***************************************************************** + * LIFE CYCLE + ****************************************************************/ + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + mRootView = inflater.inflate(R.layout.fragment_conferences, container, false); + initUI(); + return mRootView; + } + /***************************************************************** + * PROTECTED METHOD + ****************************************************************/ + + /***************************************************************** + * PRIVATE METHOD + ****************************************************************/ + + private void initUI() { + ButterKnife.bind(this, mRootView); + // set the action Bar title + getActivity().setTitle(mConferencesToolbarTitle); + + // use this setting to improve performance if you know that changes + // in content do not change the layout size of the RecyclerView + mConferencesRecyclerView.setHasFixedSize(true); + + // use a linear layout manager + mLayoutManager = new LinearLayoutManager(getActivity()); + mConferencesRecyclerView.setLayoutManager(mLayoutManager); + + createFakeChanneldata(); + + mAdapter = new ChannelRecylcerViewAdapter(mListChannelModel); + mConferencesRecyclerView.setAdapter(mAdapter); + } + + private void createFakeChanneldata() { + mListChannelModel = new ArrayList<>(); + + // FIXME DATA 1 + mChannelModelBuilder = new ChannelModel.Builder(); + + mChannelModelBuilder + .setTitle("vaadinofficial") + .setDescription("This is the official Vaadin channel. We will post our videos, tutorials and webinars through this channel."); + + mListChannelModel.add(mChannelModelBuilder.build()); + + // FIXME DATA 2 + mChannelModelBuilder = new ChannelModel.Builder(); + + mChannelModelBuilder + .setTitle("Docker") + .setDescription("Docker is an open platform for developers and SysAdmins to build, ship and run distributed applications."); + + mListChannelModel.add(mChannelModelBuilder.build()); + + // FIXME DATA 3 + mChannelModelBuilder = new ChannelModel.Builder(); + + mChannelModelBuilder + .setTitle("Grafikart.fr") + .setDescription("Retrouvez un concentré du web autour du monde du développement web et du graphisme..."); + + mListChannelModel.add(mChannelModelBuilder.build()); + } +} diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/conferences/ConferencesFragment.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/conferences/ConferencesFragment.java index 9613280..0805f44 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/conferences/ConferencesFragment.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/conferences/ConferencesFragment.java @@ -18,11 +18,12 @@ import butterknife.BindString; import butterknife.ButterKnife; import team.io.youcodeio.R; -import team.io.youcodeio.model.ConferencesModel; +import team.io.youcodeio.model.conferences.ConferencesModel; import team.io.youcodeio.ui.adapter.conferences.ConferencesRecyclerViewAdapter; /** * Created by stevenwatremez on 11/01/16. + * */ public class ConferencesFragment extends Fragment{ @@ -94,9 +95,9 @@ private void initUI() { private void createFakeConferencesdata(){ Map conferencesYearMap = new HashMap<>(); + mListConferencesModel = new ArrayList<>(); // FIXME DATA 1 - mListConferencesModel = new ArrayList<>(); mConferencesModelBuilder = new ConferencesModel.Builder(); conferencesYearMap.put("2014", "http://youcode.io/#/home"); diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/search/SearchFragment.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/search/SearchFragment.java index 8b6add5..4b5f549 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/search/SearchFragment.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/search/SearchFragment.java @@ -1,23 +1,18 @@ package team.io.youcodeio.ui.fragment.search; -import android.content.Intent; +import android.graphics.Color; import android.os.Bundle; -import android.speech.RecognizerIntent; import android.support.annotation.NonNull; -import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; -import android.text.TextUtils; +import android.support.v4.view.MenuItemCompat; +import android.support.v7.widget.SearchView; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; - -import com.miguelcatalan.materialsearchview.MaterialSearchView; - -import java.util.ArrayList; - import butterknife.Bind; import butterknife.BindString; import butterknife.ButterKnife; @@ -27,18 +22,18 @@ * Created by stevenwatremez on 10/01/16. * */ -public class SearchFragment extends Fragment implements MaterialSearchView.OnQueryTextListener, MaterialSearchView.SearchViewListener { +public class SearchFragment extends Fragment implements SearchView.OnQueryTextListener{ /***************************************************************** * DATA ****************************************************************/ private View mRootView; + private SearchView mSearchView; /***************************************************************** * UI ****************************************************************/ - @Bind(R.id.search_view) - MaterialSearchView mSearchView; + private MenuItem mSearchItem; @BindString(R.string.drawer_menu_search) String mSearchToolBarTitle; @@ -46,7 +41,9 @@ public class SearchFragment extends Fragment implements MaterialSearchView.OnQue /***************************************************************** * CONSTRUCTOR ****************************************************************/ - public SearchFragment() {} + public SearchFragment() { + + } /***************************************************************** * LIFE CYCLE @@ -73,47 +70,47 @@ public void onCreate(Bundle savedInstanceState) { /***************************************************************** * PROTECTED METHOD ****************************************************************/ - @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.menu_search, menu); + mSearchItem = menu.findItem(R.id.action_search); + mSearchView = (SearchView) MenuItemCompat.getActionView(mSearchItem); + mSearchView.setOnQueryTextListener(this); + } - MenuItem item = menu.findItem(R.id.action_search); - mSearchView.setMenuItem(item); - + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // handle item selection + switch (item.getItemId()) { + case R.id.action_search: + // Handle this selection + return true; + default: + return super.onOptionsItemSelected(item); + } } /***************************************************************** - * IMPLEMENTS METHOD + * IMPLEMENTS METHODS ****************************************************************/ @Override public boolean onQueryTextSubmit(String query) { - Snackbar.make(getActivity().findViewById(R.id.container), "Query: " + query, Snackbar.LENGTH_LONG) - .show(); + // perform query here + + // workaround to avoid issues with some emulators and keyboard devices firing twice if a keyboard enter is used + // see https://code.google.com/p/android/issues/detail?id=24599 + mSearchView.clearFocus(); + Log.e("QUERRY TEXT SUBMIT",query); return false; } @Override public boolean onQueryTextChange(String newText) { + Log.e("QUERRY TEXT CHANGE", newText); return false; } - @Override - public void onSearchViewShown() { - - } - - @Override - public void onSearchViewClosed() { - - } - - /***************************************************************** - * PUBLIC METHOD - ****************************************************************/ - /***************************************************************** * PRIVATE METHOD ****************************************************************/ @@ -121,29 +118,24 @@ private void initUI() { ButterKnife.bind(this, mRootView); // set the action Bar title getActivity().setTitle(mSearchToolBarTitle); - setMenuVisibility(true); - mSearchView.setVoiceSearch(false); - //mSearchView.setCursorDrawable(R.drawable.custom_cursor); - mSearchView.setSuggestions(getResources().getStringArray(R.array.query_suggestions)); - mSearchView.setOnQueryTextListener(this); - - mSearchView.setOnSearchViewListener(this); } - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == MaterialSearchView.REQUEST_VOICE ) { - ArrayList matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); - if (matches != null && matches.size() > 0) { - String searchWrd = matches.get(0); - if (!TextUtils.isEmpty(searchWrd)) { - mSearchView.setQuery(searchWrd, false); - } - } - return; - } - super.onActivityResult(requestCode, resultCode, data); - } + +// +// @Override +// public void onActivityResult(int requestCode, int resultCode, Intent data) { +// if (requestCode == MaterialSearchView.REQUEST_VOICE ) { +// ArrayList matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); +// if (matches != null && matches.size() > 0) { +// String searchWrd = matches.get(0); +// if (!TextUtils.isEmpty(searchWrd)) { +// mSearchView.setQuery(searchWrd, false); +// } +// } +// return; +// } +// super.onActivityResult(requestCode, resultCode, data); +// } /***************************************************************** * INNER CLASS diff --git a/youcodeio/mobile/src/main/res/ailye_logo.png b/youcodeio/mobile/src/main/res/ailye_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..28e0e3f9a29eb94f1dbdd3a105eeab0d2e412ba1 GIT binary patch literal 20275 zcmZ^|1B@m>vo`vUZDYqacWfIwwr$(CZQJ&aZQHgzcfWJaJ^!EF+)lc?x~iV4uIi*y zNrlVHioro+LjwQ+I0&ku_9mjqO}Pn1MhnnYMY z{x2}-9-d(D&QIsh$L7iP$(rf5x@UFsPWMVoqX}Tw-~|>2MvxJJh>I*y&$@iz>asQv z>j^^u01@>ALCz@(W6-v=gt_HQ$(=#8E`pV?eSOb;`tA*$+aM1B1sFx^(ceHSG6d8D z`5lu4D-Z$oJrX5a zAaTCm3MG8P@C7mFhf()s;02WaAXSOnzdVBbHA2j-A>rb7_@5xrTtDIae17BS>iBwl zc)WiNX&SE4D1je_)e+3J{Tw)b-jK3WoXg<{h!;PUrmfmUVWqcb^vOTKNr ks@w zgEAAo@~(OQ@dfF9jAgQ4UCt#IIVE-kR|Db)vXujI1SNJ1H;9IIn%x?{&qf~G98Cf*gIEjxVnBZ%hOtmtK&@(E|uNnH-;Ih6GeiBan zMT;cOZ|5tVm;KiAZPwM>bA|@#z>!CB*^6z%6{DxmZ(Z<&Q*)Ghg#fI3$NBOijh?(>x`YDaMKq4 z#$RzGf9oj_ZlqmvlkOq>Z!C0k>)s)_XmE6Xd`y53Vz3fDA~Z0d-L}RY{;g%n0F)aD z>=g)~pquv1aIa|%Ie`0$pZhh403Y#gMb@@)2|}3oe#f_1Q_g(1a}B%O90_upm>qK} zd|A*kk2bCpUh!zI!mOFk<@3?kV+h*-u8vHNxN1-rk0i($QIXQ`bI15c&0yOQoB<_G ze-iT;j6qDpJC4zo0rriHN$l2UVdB}<)dBiQck=D84MWH(mUZkjOnuH5D zYzCxn5LX7;6jae%#HhH_-1_Kh65^RJQ`Gy!es24xt1r&yw`0_XLjZ|@d1mm6?)STI z^Y@j=58v@9&Kt{5E14H)5A;r;?Eu2=?>4C0f!1A=LD&1N?J&53zw|J>1eb?V)4(2f$<_P`AR+b$i3Wl01c>5LNf62fHR1@3 zfYt=*;vfzog83EXiJTzE1Mc$-PHB{2v_mxVHfBN003JZmLd>(Orx?(pbNOis+!P9n zvPo2u7{)OTVpl?M`TYuaWlBo$6_CpQ9bp~*9nl^^*rL(-CJKCdfQA05Isgq^W&e8} zS{KA~Fr^(+78FJw+AV1tTKE$pH~7ro2{W3EuwyYP;)?~)D?hUQfw{3$D<{SdaBq;U zKs>?N!jm~mOzsdI;$Vf5G=nTgpEOKq&Jw_%==PZQz{@hqNjVzyi3qfT3IfjsFdRRb zJ`+PZL!7$oRiI0fX9)PvgFcBp7JC(TIV}>pU#`%uNUkt!VVV833Ui8g3S)n;6t422 z^Ck1C@;dmJ1X#tN{4Ihr{566!vezTlGdW}4F`dzzsh?2JDbLZcMX?#NWw1Rn02zTS zA}pz9*Rx$EZ=zCC)Z&$*mO@e`Jp7u%8{(e1E?F+=G2yZavbodAbP;r+*WB9VTQD8A zZrnPkwShZXT2C-jfeB(lik?F*Nlwq%>DFhE)ue6qS^g zh!>2@)KxQTzV&x?XAN(4#&y~TI7XUACk89}FZwe^wtDy`KSO_K^hc3K<0s|@??O2q(;cf@?qeYC#`zKOo^zTJUrfKdD?{2PJ2fvE!w0^kEE z1K%M@!p_rx0{+?PkVB$7$qA88dVzUjxmmqHwuFF!y3d~ApCVhjvanx98u~Jl$S5kVc zKE+7uLyJ(&tYNqgyq>d;wvNIn$hpnA#EI`j>IC9Mf9|uKxKwzmy`s6Ox*|7!!{P@Q z1;+&U4x0}93pNr?EE+WWGwM9*I665BC5lUif$W&9os77IyM$yxW5Jynt&yY=&ymxS z>%rgw3Pu7ZLgd0`(WY^W+@-e#wH~(KssUJ~M1{O+TP;#ORCA~4@4DJX(rQ<0a-&RB zx2af@V{510%Yx3#ciI;aFbUt%a`&h~a^;gMg8W(qz-%69oD{ zwTiXw3B2WTEEm-W**81~g=dK;4}Vn`*k)YU?@cn9L#CVk((Y*Ta=&F z$x`Ta*YtAsmnpkJ>WKSD{it_3ZibuB((73?*i1x#w1uhT-aFZFsoSyQ#G;a;va!N9 z7lDIM#ZYtMPo<)!r~gNPJ*Sek($=KNO61oQ_|sHs5q-9`p7p2&XtY8!KE0=wkIT@f zB{&seW{)mpK8-cVI>rE=lZyG(lK$p+}U zkxSK1MDJ4}bCu(D%g)sp-Aj$?*7TN~r$T;!t!LhM-ckPf zK#ACRtj#0Ula6oIDHf3_zG9wvf>3NOuD)X_}(?ST_cs<*R$&E6As+%Ja!Vq;q!T{!ho%&ZM9anH+j$?{u0J&dlysbnZ|83iB zP*~QfemxtqWWq@CaS@y`m21sd`*~d4PH-Sd-=m({{z2$9&41?85d2;nZE!g7S$b-IgckOH14D%Ssn&XTIzBeXQ#v z(S}=SG&V7d^v;1z{uF*T8U5ufn$u<3C7=;Vkm zv=@dRcK@uhj360oNxB_;C;po}JLm_(ccl=PVW*IRSK>vi)2OG(qpI4qMlo^+9XuTF zZ;Dpx+M~hZ&+)`kXa{HnG}5dHYFSE3s&1c-UaJDH>&efxw}`iKdga_1?}{8AKJAAZ zm(PBqEkT|G(yx%i;gSj4S{m&EZSw71%LFSGi#Z$CZu6DnCAbWT?_zJtFF`M0GZ1GodZxz4euyf41_ zp9WvXCzY=&(6uMqi?O0zTdX0!aB%6fZ?ls!wcK4@seZa=AfC)i&SIH=;WwIQAA=s7 z@M?eK{)pJ-xcIo`e_O7#TJB)@zSH$+Ex#rAGCgbR)B1XQGk*)p6OV(L1l$xZFdnO+ zU*c>kS6H1BU_)qtaDsJ#3Iyq7>5~^CCnC+oa|DqlHz!nwdZ#4DOGRc*{+ZmEXr;@e z!lZPPcr7eTO6zrt9;`}wgpYW1PB&J!ZV$YFK{ZdNNpe&IUkp26#^&h6v(RsDb}n$X zeAL03#je0{$1+V@Oy_0FtmnTnX+&*QtW#-KXjQI5X(36`bV=RTev@1Q&QLoU9t{8K^0cGobIcZnSMtLaM$ zBrz~Hw1%4&SJvZS?dV(c8gN2-e6(3vT5H==j?44@+n&aX+m6VM>0WzY>HT99fpp=- z1e>pA+GU34`|jrJ0` zCi|SB873N-*54)L8t9uUKkA!efNOcc>xzLi$`mwo$q1)E$HnD zlp7QQN*Q_wDIJM8Y(j!voJ>6V<}^NMZH%Ils8x(tAYb|}Wxnh_gDN#6qoW$!UA4ia zMy2@KIQ#b&mj}X=CmbHuHgkuu*HTeG%L2{d=4Qao{>OD^O0bHNB`Z$W6!V6o3(_+u zyc0ZejIyl$G&Y@D>Nn4jr?-}|mhbh2os?_qBY{Vh8#?g`D8BjRM^tR+zhY3cm-!pd zi1*&C?~Ff{z(8KtPBcuP0@Z_=hDnR&ljBG{NOCZAG=L(otai@SfW}b8!14h1K;aG! z$`ge#JX*ptk#Q{gV+)=EACp}zZr@RyH93wmc{wM?m;E-(23&KvbaF%eZLLR4*}=?V zIEEE}W}^6TEn9y4WK@^yt!7tWUuZ7;&)g6l>3MP1s5OU{OLy1dd9boX*xq;D(824>jnSD!rLw*5n)XPEA`K zD{r^Yfi+xPt)A;QEIZvEwcp=w5Jw1dJmVKrK3UtYrxF^z*Zfnvf%(DuIi@AVb2HRB zkKI~6w4cK^kEi7?^JI3HVHPN6r>YZ??jG;$B`6{Z0^dQRa~@(~ey zn1TpPov{P~#&D@le---@GzRA+YGMRVkx_9?K06P)uwPLPQS_Nz zOati?n(S94YIqHtCfX(oMjzuj>jD#u;O#d(*9x0B7akjMH`nJ17aU^ycgxTA_i)c# z`@X@Sl=7q$#IM$64y$*!GoxQFq#2}SOwan zUOPW~vxYL7`7u6!4sdv_M@O?Fz&_g5c_XUXb++nZ;UANpaAcG!DVKNmGV>$I8* zS~)vJ*SPrz{D7MLAl>{x<$*-|pyC9GM!`-5Al$%v_*vp0iy+#C#^kXUfuafPF+|ey z`{lvP;1@m9fK)=gceP&8KcS|gx1)_tQ|E3Na51H%u}gl9^%&O+h;Qy32;23vVQcHo}sGFpAO- z$4c7^d+dXm7#^Fa(5P@Mr&^s|MqJ)-NU~qGW43{}N4j;nx!wcy=zn|o!wT>bGV607 z(J4^Pq1E5)?~tk#-*N>NH5+len2ffJdMoX!G^va$UMm|bIV$oMGZsOahg;yBy`JOE zRj%Ow7RDOG`N+un{fp7G*=|!?kHbi&j;PYe&_UIhJZ> zhXm&^>;1HJH&@sPbrb~^&x zz0?(7VXSNhd6I5gpGzgDGUtV|w>__pqL{sFv3v3|$^c9kZEy4at+x5*B4=gC)~s{W z;pzE_T*g+z#Fox=*6H50{Dpldx>NVQuDP}MM)~LA?{=y63>`1u7t_nr-rSd=JqqKE z!4A3fh|eb5$b0!a%m%l6{{6*m>kz&b9~ydfDp88umq%B`hjpV$^DkeTK9Ju=FB3pK zdI+Ba$fFQXyLf4U3q*t_nDx-XZyF~I_X#7x@l!ZMRZROujReP}HxKA}H_&2hhc zk$8gl1}=wC^>g&q>t$CBE-7RoG5k6sGz*yusR}YmR7!azdBO*|b4_xVBU<8P#4*I! z{96ZGQH-EYPTx+Yu-vdJFpn@j(>B8?NVa8Z*i$mA;;kC29xhkd6WC?iSKE)m zuTO~YG$G5NB%z@oAHpHSB*Q2pGbP)kh9%Ih&60Cg$4D&6Qt5W8!xS16YE(%pu2gkb zMV7Oc;pgAVQ*HXJS1m4WBrTUs1X>2wjMo4g@||q(DKXlk*^6DOQ_Txg^WK}xDZ)3} zXO*Wb62B2Jp@_ifgYaNY^I3$iV=`hn&`eVRq`%1%pKE_jat!8Z#M61V@eJ@fQhq4P zj@plH=A!_;?LZem`({N@>d?y28`9PCRw^(mp=rrD_LM9i_D>F7N=3lk(B*bxJ8k7j z)PZerF8rRI+g9IEp8Mm)_TzIsVAwtK-te9XzLhf$|AX0nPxP8Rc=1wrGVDc8LXJ_g z&RaBv>7|v%b$@n&vG8^oT=K6hnDW;BW_)}2Yp^|EQ~WYfJ~7cN=p$3ZUc0GbtV3Gs z@@eud^SxCs+HBIT()8@2ZN=l%ZBG1+)B}B=xdI_v3IQ;2^8U)C0JL!fd`@a=Yn7^M ze`9ux3wYok6nEOTW2R8 zBBK8|`rq;2_cV4h|398=9RDY*e*x0}M?%j?$3XwTw*Nu7|HI{!H+M6(QWG|}Hnws6 z=YyA#fsy;a^#4DS|KsuhLaP7&BL6SR{~)>P{}aIf70`cY>%X}F(!~qSP5-~C=Y@7t z;vxb7Sn(u;1(e)?uCgJrv{b!seq4`bx3(8O8#74jqG9RmTkD}h_yx^|`3Vq4LjilF zpyHpSCrF9>0gSm~yK|L7_2uBO;8F3E{Vg;>##J@S8_6xLXO1V{zNRKAOCHM0of;dt zGhFjq<}W#()4i>ZH7jdt>J2|TIVy;^d~P#xSKTYR_9_rZo}?2PATYt+)WQAep#I5{ zBGhOw=u9)v^>M+Cq>*>EYNP2GcU6a;=y${^GAC0n>@x_C-jmQ-d|A^PrgFKzF3uXh zzX`dRvg)1Uc#&CiFElPJXws!M{%BV>vo5W5EvsZMZ5q|fk3t7m zxfgRkAgIePvPWMST>A_eB3-*9QswTKQsyDh$uMRf~1GO4+*j>-{-AJjBX4&kxJ9TTB))g40F6T zo*YSoJgtrkJbolPNiQP6zX=UA3JIn{;eY6sP=D;MyT4h7)_@f$=56@8u>NVr&Q$$N zc2S)I77#5F1_K*&m&Z~@H+a}ERCSPotCam>nZF#cB(%i?0^)LW6qbt!k;A51oM4z8gAF> z`%eEYKo|`Lwe;k{ogIYW>_hOcB7hZkX=wzxrPZ{r=YC`E+o&Z&Pqf$_2cq8=T$6>k`PbIPFKMZ?jhpT2?Xhc#H(`baH_Jr@na))ZEK@f z{~^=zQUpWSj7`U>XUR|W)~wxYIeY=o6L)A}7ex%3uuB$Z&6%moZB6x;=VYEKT)rwwu9T3J@Lpd0}C5SfKViS zjqf`2ba4XT?X!>d1UnU!X9*~Sg@XD#m9iolbfY#LD4Y@Jh5GQLn0_)+BADxzuZBYx zdTy`%S@ii%{J4@~>s?Qowh%li%JyeSkj;$EF)GqC@hFa-*%BjnYS|9zH?Ei>+$fZH zfd>p)BrLPBo8kW~mR|N8_%}DxwTRONTM79N)=j5bL6YK7lG30EVzl$_G5{nIaKmt4 zvSGs;nvaAF4iKk`4lzY<24y$~jo^V{2N-kk8)09^2T1peG608$e&Uk`5E?){gbFy( zZz;!FLT71T1HImh-{(UsYmsz2K@D;OkPVx4)57Kpn_e=9R;|*6R;=bc< zVLfuh*WBTP>fT_o{95B(nsm+sGZH$VL@`0N%p zUQ4ioir#X0@Cs+85Z)$%C2iMOs$P4ovZs7r`NQEnP+ZP9ELVeB+ib^zoj@D@?PGQVW z;dYulvMxX8-VJ%YQ3#93k*h7rq#bUE!3sQ+FU){Y5G+CsraE7IgJD)bd~jd z=T(cc66X^Z1wns)8Q?m|f-r8$i3&z>2)8MqhuL0Ww)}jJ{j|gvOdhh}hEhxz)lCbg zjQf#HVGIyNDr4G<{x!E@x;~K?aCov}Git_%s;VWowEdX;rIJ`y4=LGg2DO{PLCH|r zM;BPnEzaS;n@^OJ=RrOqo8<>^-v?r1H>QyzQqHsLp2cUJw;_M^aSI6--~ucZ@kCXdKeNrS^$*=ubhFr6RB|VRJL6 z$QgMbTY!Sqs5`0t$2;44%e#-)^X2P!Wmz+48m$_#ZV(kYp&Z$6hT(^7gUZ6OAywx3 zbKNfbtG3p61zb^$14!0@(T0+y0<)wFBMI%J++*>uB2+kLq|A9#%9T^$_hs9_A5{HE zEeKlwgoSQxdJ&?E*IH5%_8#3uIf3oO=G^G%XM!bHwCt7YAPP%(~F>A9p72 zwmk~PB%*{2M8%|op4ivbhzrw%H)1tteL?>He!p@v*nR};L$8l5)>gXjJdMG*1vmWV zLzEu%aVO0uN|3`+b;Bs0?jMW`LItalboaE=!5BgjvC9B@Q1KW|w+kZ|0YHCBy+=P+ zTYp@wOLbVQTQ2U~N!5#E7qB17CYz*7KTM3fFr{+eZPElrBg4!bSVPE5!uk%rB(@md zAZ>J5caoww%XOJevKcrZ@dP0%r165_K>+w7z6BU2261sQTZF`1G+lN1?r|JB!6WjY zK~px%GlawTjRS=dL%`pwzxX+rww9L-98ITw_k#Nd+QAuJO~&xw@xLqcii$>f6@_P9 zsP4l?R>qhOo%Fs4eT-`AS`$+~7R&jR`jrW5$+f&e@5?lUQM4hJR0o9e!lU0={h|2Q z|J=Gho%Lf;?q6sh2ZufiBPq$1f8yWAI5>0fx}P$pHQe#{^1>2Emm{hD$h8^ zRIHN5=3^IV({GAZgUYLZ(HN@ICY zX7RlE7J8mNfUq8Da2EziYAhGaDu^Y6+Mi8S5I%r71)`Wz569;S2ijW>4BEwab7I>+ zSyZa(G1{=i1miA$U^$@e=c{!)uNsCYl{>XK??{rEy*0{hDFASxPcG5w={b7kK8h84a zw74pB#+=T#e`W#sW86d{)gYbS8(7(`=#OvR8xYJ23wt9X=|d1s?2n*}ca+3f09Hxw zml*uIJ+d|)WQ4(X3^4w-a_>?3OXg7gy(gS6Lr*ahq(3KKI>WBej z94>jh4qg1t+RB`{=Q;whAR!>hr8yc|^eJ+@^3S(81cKV|=_O8PYx@U>R6Lh#OK^!$ zshh9@%;BUITI$>1krxfTin~0#R6o9{vLbP1`8hTw1K(BOzWyRlW3GSS1 z5ayO<2d!8U7tp%(voE#)MQz3AWL`xh^PI(KWfQVCL;zI=a*P%Zx-GKrTE)pRL zUA@=7|Jx+S5^+QpJ}!2BHw3~yjGLXrx;jf4f@$>8nb^&Mn%+HQ7W=LTk*sWQ)P>jQ z)aD~7JL&jh5={8tx&G#cXRI(u?|IKPJAwl3{gA-0+AB}jPD|M*a(aZEBw?Ze|0*-~ zh@X{Ccs1alw%N&Yx}04$12dZlluxH)-8Y~!O)3G=elV_iE;G#yPa3RZ7D#?@_bSRs z1a(Hl#6mX&s^p1^SOtnZ3QX^=19q|^!4G}tX!+53nO7=~D*8}J07Z9UuNt{5g*Yll z1$kx|t>})LX;xr%Y>bf6SRWXI`~3x2&!1r?g3=r!EvBI6R56kW$o^U5aCv$D98y29 z4Jpm>t)oM1J#T+#U%nG^H1Mvq^JTHLz2@YkY=ixPJdhJeSXb);Imv?{jQQR!(!Bn8=zPSJrLWdtn#3{wR9CVAa5gRn}KA=V= zD;}$X-7i8RJwZu4NU^|g?FK3~X?~fBU63jxB9)th%ygc0(YmwD%lrweG4@Vz zk9~;f@U}v^UB@pKa--f5LY7Vx(lOTxgfhx0f>sVzY7gwKyLYo5f>bP5p2NvNvLl%y zE{u^~m3qjN1!RZVXBI-NUg>ZV3MnHksV;-8bmrPKj=YBQA?0K3sn+vU9&(Ue9&;eT z0isXkmO+wHG@$AP5?u@YdeWUenpHuSC$S#_Ti@!Q{NB#(w~}cfsuisNqHHfh5NFtO>XnM8V*HD$ z6NXXQDC`ez>#XaOYxjFyITdxWrzoNTh`@SC7=Nk3;QBs=V`{L<6KT$e-C)96-4OHs zX5YLpYy%j+LI}HHaxufe&U=5Q)z&8X#1rg>^TbJ;(__1o>Bd)VtD_7wHBv5=LWubR zEPOkugNgFL=7__PxWw}Ex-I?&T%ugx+5r&zH8W?hY{{xHBcv;rL)S`3nJl6o7|pQg z0fHYbQO_c(Af-RW8V>{)Cm=+S#^{z^S0*KaH#Pq6Csl!9SiC{%q$^}T!c*Y@^^#uJ zkediDl6TBq#vq?K5q=`Of4F|lWHOBi0tiLr!M`42nE%k;krDcrzaX9@+*;OfpU+*r zZv$N8Og(Mp%PK9Ku5G5xs*zh!=BI+@LJp=+FpEKO%SFff8z$X*eq zBSqd$%MH)rCkIp9BbPOc`_Q!6IB5 zLDPfe2sq3VW2*7OrYiw?b;ODpDbxwEo)ix0;}*xJAyv0ETy0Ci^T9f|;iLB!zr|+D zO7nYN^U^i9YpcfhK=bn68OHh{#wBxweFJ+m2YoMD19uP*PjjanASFdrnrt7S-`LwZ z6C%c>!X}{)dLozo=WsH)PSmHAY1EtoDUyo*8c^bXUEDzrcF7sziWESo z7|BkZ??x&a1RBo3N+`Y)ZureE$S(crVk#aDrA`3&Aw`8NWSd_M*uy0{iJW%~`*UgL z`8Nda`4eWk{^EBvxej`B>-WXgbEOzwV>vgAX zD>v&@?(4jq^+#{_hzoDaP>%0jHxCtlHLjbBc&7Nm|-t!>Q=E5_-M3 zG4cys=Nmrztj$S{+TpN!i7y2cjohU)ecCDa5rX8MU!OiiUlj;J7%DqCpiZ9(TG^+1 zy%rN%wOLh+iwp8qpH^T@olw&6WGS4Kj54UKJYm~?T@kwJ4if34yx4&tRjF#PYsy@D zJ^7@%HF8?p7$=pc$ruJ>^>Q@s*9-Qg;m&9H*7w-Vnx?H!diRg5u6bqZG(@2tvyVbV zgL-ZK@b*VXZ{9PRUn0b1$O&C@OH11?T9(ynTi?K~_qp12uAk4D%PIW#FxE+3Ge?{> z>XZyvwPL?W0^t}_%(=9`KM!M~c!NOMEQ%yQrR)3h<2umiW$?|MQ9eg?5BidJkjX{6 z$7b*d+F;H;DG@J8PjN7m@3amC{O}@+sOHq(IM4evM8e6DKry26!qJ+*`DKidzc58n zV2~bfFqodRjv}wRmMSm1L|9v#_J}kE(7gY6gYX7cP*NtLprLU7d=7|NuRP0WLVHf%W7=1?}RkuT-~f$VraKO zPgD#&<8j%*B%l^i^F(1j)cNv+i6KE40~yrGHl?-f;7+YZD@0ULA?tBBIXfpmRJsum zaC|qN%O$#jQBoSH7}o?!9WF0ynqHqTAzB&9H+&%c!V|u>ll9@xDa;R~g#tcev9R0E zF#!LAxxgaW(!j?BdfTAIXT_%7Fjk|}JHAYtWm%a*TTp~{2Zv}RKTF(4S`{zgDqaf3 zzR4Wu{4(!|p>9540Gz`}vK|I!F90b*dm1c-3C^y>L{UH>luu-ubgT2VfE0{`7;L=77hKNbm6bHh<2pfPZn=27e)7Yr9jqf(RMe8F{i zC9E8pm_Vu;%;t{=ar&kNtwkTM|KnXRc-UbYKF0M$atdPX%_g0~6naOP$T9svGztY| zHe_&*7#*q}qdG+W4$I7e_#z>sLK2 zkX)rOR#9PjOOp=5JkqBJAn6N(Cm3!{kgldt9E#7HQOnLB!W{W+HC&IMyXl$U_rFiNU*7sUYTtR>jNjdUK@Y$UW;;TEGgElMH6ZI;#~$yZ6F`_!47+4-7=17VnFlH1kZ z2B^(B@@QB$fJ)GORQEHqfDAjXn?Z9Ir&t`gaS%<$mXF|yNqf+^sBZM_!^X+HoWcBH zyZ%N>q|qQxpD1p`{>3I9q)gHZ($;iSk3G&rWMyRPYB?+xc)v zFRRM$T{4I<#t`fgg|EZt%fWLE?PTpr_pRlZI7E=3#}$aJ4=Zm!+%hKl-{4oynEE(9 z##p&%n|M6~q?>egU}5$kpF+lc!?5l=KRh9)Ln)fA1z|u5nGPV1e*;JqieVqj2$4P4 zS3{0caV$Sg>J`Nvw;R_-Hc1N_2@ASGeSh~ozb(_}T=+IP4Gt;HtIj*t`}yjIpT0Pp zpivgAfMb5aR_dgwAL|rr_?U=fQwMs-9%PW1T5-z0!Bh2{`P=b{T-^HHOd&zcVF4&4 zhZWORsHe|H5H{#)jt{ra*Jp^;WxL8>jo(F5XE*uSaBb*ImXrmk^?zu^B(_`35m{EqIH0j0A-?p> zx9w*g$<8=AO!t>~aLuj>l{oc~*3|_$ZEcXwIl%>y6xd1KzE=H)&V+7N;!E|V{TU)f zq?E2MKd^We;yH7CLMsn2R;l}W2szm(2tHXguJwql=CW<}zVx;w?qON!A4nSui@o`I zXZ+Yry>1AFcLC52li)+>fmca7PptBO!}lP4fd*+O z*iApB>YCiRA33)G`5t|;UI<_=88Uth>57K=wmZ&I;HInDWnfe%>xstLV>V^o+Pg;Vm+Eu^Hc}x#9 zJa_&TFWc`aY#eVjc0Eg^SJC)y0bA}b2x?ebH_)_3UX^7R5e_DWv<=H7S0GrUlzm<7o8x$LLd;Vx~EWV&^*Lw}}NYTj$NuJvJ=~57)jBBgL&QB+jh(`*={zo(KgxAK8@A=Cr&G0uvby^tqhj&ur%Qr=oj z-|=_3Rwvw0Tuo3Cae*;b+3{~9o5l{k?zCS$%&Y7Ki70qzR%mrs>%N78XH0ig+$F>} zm96#`kIT-@%Z6Cb9q~q&bMKbN$;_oTef#PgiD1Amg9=R;6LWpluV;(Px0^Q%>b~gO z&POlLH)D*Aj3esmV)Tj1+1PeiL28dtpwO3Hg^0i3XVFinr3mXi16N8NG!2F$5SL^r zYi|S}^U){uZqKsPJ2dDe=coYQ2BiQAeL@5ndLSfo>7{xoEKZi~aO~m9K?m!CM7ihe zuH9i_EJ_c0dQE__0>FGfp<0JKw*pm7&4jL`qySPQv`nBzw=v^r{VR;?5s1~`YxSEj zu4-LZfw~_Csc%qCCEFk7D@CL8E~5E4H8sm}=R>=*dq42Um`%57Gb1xoTc?Cm{{%#d z44(-6X~)%TL&yCL+;ikY*A%Ato_$GdX6tv70vbG$iC?WE3E>D(lA}y-{2r)+|vO<@$DVJmBl-eHNc%sEQs8?~s9I+O@9=>J10vhGHYBi_mi+%tf zL2*?Y+3QtQ?>O-3a)<|#axhVyV46J8h}BRQdSy6um9~ltvN|$jK?3_7jdJY?kzEm34p?!h~G(W7~3kq zzM4h(oyt0zO9()Kq?(zSbwHsVrqau~SaBot#HiWnQ~zY&o1kji9Q5iKHm%r|T(=Hc zpjfX!OGX>Xpsm@*H~-X7!W1Q74~oFt77`~LqNa^>IF-&k661_NA~;#kI);c0EbJJ4 zDhDov6wlRL?CxZ>FWP+0{?x;%(p}p!>qOGtKNxGW7tCdgRIz|9R?3jRIu7Rerb7do zCy)?BbaK1X%mOrkyI(Gj55#egns2Kmh{1bjH=h8ggL+^RR3i(ZP(rMa8~Ubi5D#sJ zia?iw9k)#J%?nqJ&&PoT98ppE6h7|^D8d4NqPL(()FbW?TW3LJxL1+>Qimr!0p52Y zC0cVr-)k+xjy)x1Ueic+xh59Z3>2 zOm=wD%&GGAyXB1uzqD|vagYFfOd{0?E6RZejKYjJ`HF*_Ys{BMBOICyQ~r`HZ7v6f zETACC#Rq*ADR36ynx20UP4Rj}Mw<^8s)(Cl$j@A(ttKbPr=nz;PHZlxMtz!` zYW(c9WBe-uj`vqbvhY%Jk3|-b5R$C2uPfBKxGvm)iwdjyxBFKf(l5}9gVdxXUxFGX zf*GO{a)3Hju)}gx62&NGLybr#{vd@>nL|k2Sy_`{yhp7{&^cNYto*5n;1d$0s1XC~ z?t8>Q9Ebu$Qp50BTehuMTF}j-Ci=okq##34@=!d~IiO%M{OJ#nV^Qmb&TAFNB}iY| zYcv>Jig9=da9(he>BY%`67*h_NLJO0GGoaL3Ssz8X$*!cVVIgmvse33+y|9PBIU;V z?CCbwD0kowq~LT`@a~|uMp;n_=Gxz95SQFmi| zbAbp{N7M=~(>*~Wh)N&QaKesuqvIxmll1M)d)RQg@9?m#3^ZXUDjoxB6}tMKZGB|z zaifIEz=h`W%&5?z2aT#6)CVJ+7mA6eF&(%5H$@FtvwvTLO=AGVKE!krsdZymnJkZi zU4M5@0Rpe2E~~c2?YRnYA8#NCkIMk7>PAZT$F1@zIe{1{+(Qfi;Y}NZCVQj=BCJW` z_xaJdgKNS{wp~Y=m_5xVlIQk2D}_jw@O$=@#sj~4fvMY{BGuu*3@84lZUYVL>M3DN z7i4>QbqM$xT-j!)>BdM^`oAqXT@!!rqsl>Kj%$f3!K7EEepiX?Dd+@|Zw|_eR1o`= zutDN~#Uc#joS{=%pG~G5i{hN$G%hl{2Zo7oL_*@)FVow@di`8Aa#gXD>XLUIJ^CyEI^!lLL9g4=K4 z=vwx!cLaJV7Haocq|?^?C6IsOsjnUT?ew^4?1R)^P7;&hB!z>tfuZZ2eC6?~k6Csv z^mbx;s2ff*CCK5{ooc1vr0rpR79g@L*vBaQN~S9H^sQIheVrkNuPbO%Ib!#M}Bh)YdMMERhgQ!l%L9qT#3v?3<|Wm_`XG|jk}Db)e=&w z#}eF3XoC_GM>-+T*ECvvJ8J0s6w6DxDj4O-v_+$V$LKRIkKWGLZ111c&0sZRdC57C z97I{Be-Adcot9{}PoF+cwScp>eD|V(H*r=I(Zy zzx|6D7pYyS6Qw3lT-EjdaHPj**ldhI)Vvo(PzZzavEqs2e`S!uqDM~;eeQ% zBJ2mc#&QN9cUg}(U?IY>;TGl521t8e^Bmwix|YJ<&+XvKR`<+fziF3ONNzaJ77|Ii zlKvnBKb66fR*MfKCtKST_Zu0{Kg+AW+%AV||7MU(HvE4APY$s0Et}QIGD;JZlGmMV zYO=MYrB}?R;)P0-A{F}?Rsm2L>8cnh)5P%wx)7G*3PcpO5~O$2L?jT!Pa=Lb=}C^c zU|Q}by^4cau~{PeDO=IgPn*T z*|yEPxoE*at1Xz*Wb<1ot)<#NM_4^db<79_+k_8qXFv0Kt(M>>&bP&wOBY3a1vlH}9( zI3=K+R0HV&=?&z4gmT#Du3BVQu32Q~^Wd5_E0Lr zA}HQ4nL-%`D(==MoU#tL>_29k_Z?$Xn4elCJ!oJ2&;PKOte%hJSLLQc^ZcVP`5>+- zaXQ1U*0j`pRfd1oUV_@CcIzj;X5W6`K?}9cwh%jJ$0-$UqCPk=$f{%@sLj)~vI`ps z?!bSbrYWG1PO&)5EBpyKfb){P)?+9nsP+%F&9_&)=L2@%;e(VNvHXo?7krB@QQQi1 zi#OW0Xr^0ey6V2p=Dxp**6w4|2k)!n016!U7{A!E#l6U{TwNt~a9V$Z9ss+@9 z(VL43$Ek*#={ECZFu@GvVCDgk>a#qkTHD)74Z!bRh#UZ^Hy5tu`c`KkAKTDg#otV$XXf;KpS|%GMLls z(}JnoJ5pfZ$eaxy3+(1wK5M`I@S9j+hC!iyyC{N?N7U~Pz+qE&uqT-INxz~jw<6u zW;I(gH3MNnLL+$T`|xKD?AmTGdBHW-^xgX@BJ8js7Sm=BUnMw6OTyhVyPksB9e&CT zn-&xBUAbfwr3#m5UlU(3aRPlgsNJWA%*SJIQU{g8 zDlnp@+OoiOXj3;8?gE{FTeChUMEk9)FZtH!Ld(8+IK&1|mT$&ajpwXnlN< zXPoG1rYgpcYCSvY+j(%+bIx5+UYJDne4@6&YT--~C*bFmkfJs=z`wz9p+pLer1vw} zo)*@ZmPrWWdStF@lCfY>+=}FC4WT{|>R^dnn%GsCjS?aNdT~q47GJW__8mHCJNI>4 z1QR#|Rm=OX$L9z@Od`or3a-y<-+9E~h3nSaJPPCj*2Jh{Kh8RpC_8`FQJP=#my(-Qm>nj9sl+DvaIbgJa=(0*-j|Y;vHTybEka=;Oa65O?v$HY}(H7d?)!RBuG9iP_e@6lt;EToiM7 z0eppL4pJ4g^jR;d$C^ub6nG@A3bDf>H~i+@12{z$Dc}jDE2*X>b~D?adWCWZ^Ubp{TR)zDKU}R1Lp_Dr;gX=p!#e|3 z=0ejOsrFZkk}cFubpf?k+B-i?+557&Ea`^o6@%B)?A$iJ!h>RM(K`3!Ii3dUkRl1D zjTNNhoH3?ULZUi-~syIJJQuB&7n6&7%NgP}{x`$5h; zQl1tj@#(OXt(|2r|CbNj4bQunWe1CF9$Ls8Qvm&-? z@p4E-@6~t8#T=!W3-iZ z6tQ}c!BgvqvFS;CfpR)5dLpY+4*iUtKQnKzzGl`jnrK=Ax|~=&^imd)c9~F^Ls4HL zVD#W(2@-u))2nD$*Hqg?f@bXR)${b~`r%sbDxsvj+aBF%cUjyb1}S@WK2fh@dz#+& z(^4Th)ge`Z?f}8sL2-_rupnzm$*=0~0*wwW*iney0aZ7z08($&#;;S-P8DO@=yjDZ z9Zsb?)UWQXaElNnggq5VnU4Lw#!mRjyf0H_c?*y77F1;sCBP`hGPYI6tKS@Q^ds+2 zKm_otR?53;9n^JN1v{0`qy1t6JGQKRq4CJWSF0kY^3#mG5N2UOPjPcdsic4f1o;W_ z7s?`R>L%$ZGEOqjGT{GMxGmh3^_adx(a&(Gg@EK!kCZB`gdA;Wu6SI4* zxdVApMUexVzOP(7Rz!(woSvw5e3I8HvecKFi-Ga#KJ#7qcX3zsE;{S%x2Hvcx692} zbch4CG(1g6(pG=^&K*KZ1z4l!LDp5^>KcL2dZ=<84_O8y{4X!(tcn%^TEKP4s#t9T zUKNBD?ePS7jz@@2a6~~YO-6-~;!0fACrBwLzMjy{S^eT^5&KduTy?)%gW`h-?SKbf z*oCfOuess^d*HVB+6z|9u}puL4Pc!Okmul;5bm5hRmIEaD9e-ca(3H`FR;!p-fE3CJnz?~kE0ZPmsf7NFu++w!4o@wT9p_* zad_o#R?Ij1iY`3#qC zE`wQqj(dDAzr;xs3o%MfM?i@5j5x)ue3o3C!A99Y$^Pf(zfO@`9|Ni0oUjKJA{N%* z%GL{tPZQ%i=d>|Ur(`Q+#MJ7KhB*){d;B3d{hL>qmX) zTrCXZmM+Sx`&RqWwHjab(7F1pEOrPgGM?)A^}WWT&-`&AozeT!kFFK)wdJ7p6V_+7 z@#B}}r*Wwt2OrHBL#fE2&+1#(j31}^Qvdp0+^2h2&#m64`hAkp-2Vqcv!(vbwf?&R O0000vo`vUZDYqacWfIwwr$(CZQJ&aZQHgzcfWJaJ^!EF+)lc?x~iV4uIi*y zNrlVHioro+LjwQ+I0&ku_9mjqO}Pn1MhnnYMY z{x2}-9-d(D&QIsh$L7iP$(rf5x@UFsPWMVoqX}Tw-~|>2MvxJJh>I*y&$@iz>asQv z>j^^u01@>ALCz@(W6-v=gt_HQ$(=#8E`pV?eSOb;`tA*$+aM1B1sFx^(ceHSG6d8D z`5lu4D-Z$oJrX5a zAaTCm3MG8P@C7mFhf()s;02WaAXSOnzdVBbHA2j-A>rb7_@5xrTtDIae17BS>iBwl zc)WiNX&SE4D1je_)e+3J{Tw)b-jK3WoXg<{h!;PUrmfmUVWqcb^vOTKNr ks@w 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 O0000 - - - - - diff --git a/youcodeio/mobile/src/main/res/layout/fragment_channel.xml b/youcodeio/mobile/src/main/res/layout/fragment_channel.xml new file mode 100644 index 0000000..fcfd5f4 --- /dev/null +++ b/youcodeio/mobile/src/main/res/layout/fragment_channel.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/youcodeio/mobile/src/main/res/layout/fragment_search.xml b/youcodeio/mobile/src/main/res/layout/fragment_search.xml index c771deb..9bcf93c 100644 --- a/youcodeio/mobile/src/main/res/layout/fragment_search.xml +++ b/youcodeio/mobile/src/main/res/layout/fragment_search.xml @@ -1,29 +1,14 @@ - - - - + + + - - - \ No newline at end of file + \ No newline at end of file diff --git a/youcodeio/mobile/src/main/res/layout/recyclerview_item_channel.xml b/youcodeio/mobile/src/main/res/layout/recyclerview_item_channel.xml new file mode 100644 index 0000000..73007cc --- /dev/null +++ b/youcodeio/mobile/src/main/res/layout/recyclerview_item_channel.xml @@ -0,0 +1,41 @@ + + + + + + + + + + \ No newline at end of file diff --git a/youcodeio/mobile/src/main/res/menu/menu_search.xml b/youcodeio/mobile/src/main/res/menu/menu_search.xml index b724726..f3c7738 100644 --- a/youcodeio/mobile/src/main/res/menu/menu_search.xml +++ b/youcodeio/mobile/src/main/res/menu/menu_search.xml @@ -1,12 +1,13 @@ + tools:context="team.io.youcodeio.SearchActivity"> + android:textColor="#FFF" + app:showAsAction="ifRoom|collapseActionView" + app:actionViewClass="android.support.v7.widget.SearchView"/> diff --git a/youcodeio/mobile/src/main/res/values/styles.xml b/youcodeio/mobile/src/main/res/values/styles.xml index 9a014cb..16a0afd 100644 --- a/youcodeio/mobile/src/main/res/values/styles.xml +++ b/youcodeio/mobile/src/main/res/values/styles.xml @@ -14,27 +14,6 @@ - - - From 8e84eac19b51a4639dac5054039cd700c7ee7533 Mon Sep 17 00:00:00 2001 From: stevenw Date: Tue, 8 Mar 2016 14:51:30 +0100 Subject: [PATCH 03/26] Manage about page with model and recyclerView --- youcodeio/.idea/gradle.xml | 2 +- youcodeio/build.gradle | 2 +- youcodeio/gradle/wrapper/gradle-wrapper.properties | 4 ++-- .../team/io/youcodeio/model/about/AboutModel.java | 14 ++++++++++++++ .../ui/adapter/about/AboutRecyclerViewAdapter.java | 11 ++++++++++- .../youcodeio/ui/fragment/about/AboutFragment.java | 6 ++++++ .../main/res/layout/recyclerview_item_about.xml | 13 +++++++++++++ youcodeio/mobile/src/main/res/values/strings.xml | 2 ++ 8 files changed, 49 insertions(+), 5 deletions(-) diff --git a/youcodeio/.idea/gradle.xml b/youcodeio/.idea/gradle.xml index b9e6fb7..581a140 100644 --- a/youcodeio/.idea/gradle.xml +++ b/youcodeio/.idea/gradle.xml @@ -3,7 +3,7 @@ This a subtitle to test. + + %s - %s From 0d2515dc284bc822c0b5b46f44b35bd924c12b07 Mon Sep 17 00:00:00 2001 From: stevenw Date: Tue, 8 Mar 2016 14:57:57 +0100 Subject: [PATCH 04/26] reformat code and optimize import --- youcodeio/mobile/src/main/AndroidManifest.xml | 10 +++++----- .../src/main/java/team/io/youcodeio/HomeActivity.java | 4 ++-- .../java/team/io/youcodeio/model/about/AboutModel.java | 1 - .../team/io/youcodeio/model/channel/ChannelModel.java | 3 --- .../youcodeio/model/conferences/ConferencesModel.java | 3 +-- .../team/io/youcodeio/ui/activity/SplashScreen.java | 1 - .../ui/adapter/about/AboutRecyclerViewAdapter.java | 6 ++---- .../ui/adapter/channel/ChannelRecylcerViewAdapter.java | 5 ++--- .../conferences/ConferencesRecyclerViewAdapter.java | 2 +- .../io/youcodeio/ui/fragment/about/AboutFragment.java | 5 ++--- .../ui/fragment/conferences/ConferencesFragment.java | 5 ++--- .../youcodeio/ui/fragment/search/SearchFragment.java | 8 +++----- .../src/main/res/layout/activity_splashscreen.xml | 4 ++-- youcodeio/mobile/src/main/res/menu/menu_search.xml | 6 +++--- youcodeio/mobile/src/main/res/values-v21/styles.xml | 8 ++++---- youcodeio/mobile/src/main/res/values/strings.xml | 5 ++++- .../test/java/team/io/youcodeio/ExampleUnitTest.java | 2 +- 17 files changed, 34 insertions(+), 44 deletions(-) diff --git a/youcodeio/mobile/src/main/AndroidManifest.xml b/youcodeio/mobile/src/main/AndroidManifest.xml index a33b522..b28630a 100644 --- a/youcodeio/mobile/src/main/AndroidManifest.xml +++ b/youcodeio/mobile/src/main/AndroidManifest.xml @@ -1,25 +1,25 @@ + package="team.io.youcodeio"> + android:theme="@style/nLiveoDrawer"> - - + + + android:label="@style/nLiveoDrawer"> diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/HomeActivity.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/HomeActivity.java index a085bcd..ae3e205 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/HomeActivity.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/HomeActivity.java @@ -1,8 +1,8 @@ package team.io.youcodeio; +import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; -import android.os.Bundle; import android.view.Menu; import android.view.View; @@ -92,7 +92,7 @@ public void onItemClick(int i) { break; } - if (mFragment != null){ + if (mFragment != null) { FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.container, mFragment).commit(); diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/model/about/AboutModel.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/model/about/AboutModel.java index 9ea00b4..f7a421a 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/model/about/AboutModel.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/model/about/AboutModel.java @@ -4,7 +4,6 @@ /** * Created by stevenwatremez on 15/01/16. - * */ public class AboutModel { diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/model/channel/ChannelModel.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/model/channel/ChannelModel.java index 914abfe..247b43f 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/model/channel/ChannelModel.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/model/channel/ChannelModel.java @@ -2,11 +2,8 @@ import android.graphics.Bitmap; -import java.util.Map; - /** * Created by stevenwatremez on 15/01/16. - * */ public class ChannelModel { diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/model/conferences/ConferencesModel.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/model/conferences/ConferencesModel.java index 0cf62ff..60f6790 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/model/conferences/ConferencesModel.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/model/conferences/ConferencesModel.java @@ -4,7 +4,6 @@ /** * Created by stevenwatremez on 11/01/16. - * */ public class ConferencesModel { @@ -79,7 +78,7 @@ public Builder setSubtitle(String subtitle) { } public Builder setConferencesYear(Map conferencesYear) { - mConferencesModel.mConferencesYear= conferencesYear; + mConferencesModel.mConferencesYear = conferencesYear; return this; } diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/activity/SplashScreen.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/activity/SplashScreen.java index f5cc912..8938b1c 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/activity/SplashScreen.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/activity/SplashScreen.java @@ -10,7 +10,6 @@ /** * Created by stevenwatremez on 11/01/16. - * */ public class SplashScreen extends Activity { diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/about/AboutRecyclerViewAdapter.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/about/AboutRecyclerViewAdapter.java index aa81ac0..98902cf 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/about/AboutRecyclerViewAdapter.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/about/AboutRecyclerViewAdapter.java @@ -8,8 +8,6 @@ import android.widget.ImageButton; import android.widget.TextView; -import org.w3c.dom.Text; - import java.util.List; import java.util.Map; @@ -20,9 +18,8 @@ /** * Created by stevenwatremez on 15/01/16. - * */ -public class AboutRecyclerViewAdapter extends RecyclerView.Adapter{ +public class AboutRecyclerViewAdapter extends RecyclerView.Adapter { @BindString(R.string.about_skill_text) @@ -94,6 +91,7 @@ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMen menu.add(); }*/ } + /***************************************************************** * PUBLIC METHOD ****************************************************************/ diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/channel/ChannelRecylcerViewAdapter.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/channel/ChannelRecylcerViewAdapter.java index 25d177c..0ce12eb 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/channel/ChannelRecylcerViewAdapter.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/channel/ChannelRecylcerViewAdapter.java @@ -4,7 +4,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; import android.widget.TextView; import java.util.List; @@ -14,9 +13,8 @@ /** * Created by stevenwatremez on 15/01/16. - * */ -public class ChannelRecylcerViewAdapter extends RecyclerView.Adapter { +public class ChannelRecylcerViewAdapter extends RecyclerView.Adapter { /***************************************************************** @@ -72,6 +70,7 @@ public ViewHolder(View itemView) { // TODO logoChannel = (ImageView) itemView.findViewById(R.id.logo_channel); } } + /***************************************************************** * PUBLIC METHOD ****************************************************************/ diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/conferences/ConferencesRecyclerViewAdapter.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/conferences/ConferencesRecyclerViewAdapter.java index ecbab77..99e921f 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/conferences/ConferencesRecyclerViewAdapter.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/conferences/ConferencesRecyclerViewAdapter.java @@ -15,7 +15,6 @@ /** * Created by stevenwatremez on 11/01/16. - * */ public class ConferencesRecyclerViewAdapter extends RecyclerView.Adapter { @@ -85,6 +84,7 @@ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMen menu.add(); }*/ } + /***************************************************************** * PUBLIC METHOD ****************************************************************/ diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/about/AboutFragment.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/about/AboutFragment.java index ffba704..1398d0b 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/about/AboutFragment.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/about/AboutFragment.java @@ -23,9 +23,8 @@ /** * Created by stevenwatremez on 15/01/16. - * */ -public class AboutFragment extends Fragment{ +public class AboutFragment extends Fragment { /***************************************************************** @@ -94,7 +93,7 @@ private void initUI() { mAboutRecyclerView.setAdapter(mAdapter); } - private void createFakeAboutdata(){ + private void createFakeAboutdata() { Map aboutYearMap = new HashMap<>(); // FIXME DATA 1 diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/conferences/ConferencesFragment.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/conferences/ConferencesFragment.java index 0805f44..2942090 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/conferences/ConferencesFragment.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/conferences/ConferencesFragment.java @@ -23,9 +23,8 @@ /** * Created by stevenwatremez on 11/01/16. - * */ -public class ConferencesFragment extends Fragment{ +public class ConferencesFragment extends Fragment { /***************************************************************** * DATA @@ -93,7 +92,7 @@ private void initUI() { mConferencesRecyclerView.setAdapter(mAdapter); } - private void createFakeConferencesdata(){ + private void createFakeConferencesdata() { Map conferencesYearMap = new HashMap<>(); mListConferencesModel = new ArrayList<>(); diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/search/SearchFragment.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/search/SearchFragment.java index 4b5f549..9ea5213 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/search/SearchFragment.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/fragment/search/SearchFragment.java @@ -1,6 +1,5 @@ package team.io.youcodeio.ui.fragment.search; -import android.graphics.Color; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; @@ -13,16 +12,15 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import butterknife.Bind; + import butterknife.BindString; import butterknife.ButterKnife; import team.io.youcodeio.R; /** * Created by stevenwatremez on 10/01/16. - * */ -public class SearchFragment extends Fragment implements SearchView.OnQueryTextListener{ +public class SearchFragment extends Fragment implements SearchView.OnQueryTextListener { /***************************************************************** * DATA @@ -101,7 +99,7 @@ public boolean onQueryTextSubmit(String query) { // workaround to avoid issues with some emulators and keyboard devices firing twice if a keyboard enter is used // see https://code.google.com/p/android/issues/detail?id=24599 mSearchView.clearFocus(); - Log.e("QUERRY TEXT SUBMIT",query); + Log.e("QUERRY TEXT SUBMIT", query); return false; } diff --git a/youcodeio/mobile/src/main/res/layout/activity_splashscreen.xml b/youcodeio/mobile/src/main/res/layout/activity_splashscreen.xml index d19ba00..70e6bfc 100644 --- a/youcodeio/mobile/src/main/res/layout/activity_splashscreen.xml +++ b/youcodeio/mobile/src/main/res/layout/activity_splashscreen.xml @@ -27,7 +27,7 @@ android:layout_width="match_parent" android:layout_height="400dp" android:src="@drawable/splash_screen_bottom_material_design" - android:scaleType="centerCrop" - android:layout_alignParentBottom="true"/> + android:scaleType="centerCrop" + android:layout_alignParentBottom="true"/> \ No newline at end of file diff --git a/youcodeio/mobile/src/main/res/menu/menu_search.xml b/youcodeio/mobile/src/main/res/menu/menu_search.xml index f3c7738..45427ef 100644 --- a/youcodeio/mobile/src/main/res/menu/menu_search.xml +++ b/youcodeio/mobile/src/main/res/menu/menu_search.xml @@ -1,7 +1,7 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + tools:context="team.io.youcodeio.SearchActivity"> + + diff --git a/youcodeio/tv/src/main/res/values/themes.xml b/youcodeio/tv/src/main/res/values/themes.xml index e8b4aba..90c0f86 100644 --- a/youcodeio/tv/src/main/res/values/themes.xml +++ b/youcodeio/tv/src/main/res/values/themes.xml @@ -1,4 +1,5 @@ + - - + + - From cdfb48df14c3c5845a7a7dcb8e1d6a02bfbafb09 Mon Sep 17 00:00:00 2001 From: Steven Watremez Date: Mon, 25 Apr 2016 19:32:44 +0200 Subject: [PATCH 26/26] Add video detail activity. You can access with video swipe --- youcodeio/mobile/src/main/AndroidManifest.xml | 3 + .../io/youcodeio/model/search/Search.java | 38 +++++++- .../model/search/VideoFromSearch.java | 44 ++++++++- .../search/SearchRecyclerViewAdapter.java | 33 ++++--- .../adapter/search/VideoDetailsActivity.java | 92 +++++++++++++++++++ .../res/layout/activity_video_details.xml | 54 +++++++++++ 6 files changed, 248 insertions(+), 16 deletions(-) create mode 100644 youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/search/VideoDetailsActivity.java create mode 100644 youcodeio/mobile/src/main/res/layout/activity_video_details.xml diff --git a/youcodeio/mobile/src/main/AndroidManifest.xml b/youcodeio/mobile/src/main/AndroidManifest.xml index ae8c588..033e0da 100644 --- a/youcodeio/mobile/src/main/AndroidManifest.xml +++ b/youcodeio/mobile/src/main/AndroidManifest.xml @@ -44,6 +44,9 @@ + CREATOR = new Creator() { + @Override + public Search createFromParcel(Parcel in) { + return new Search(in); + } + + @Override + public Search[] newArray(int size) { + return new Search[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeString(youtubeId); + parcel.writeString(kind); + parcel.writeParcelable(snippet, i); + } } diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/model/search/VideoFromSearch.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/model/search/VideoFromSearch.java index f8e5d68..d5c722d 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/model/search/VideoFromSearch.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/model/search/VideoFromSearch.java @@ -1,12 +1,15 @@ package team.io.youcodeio.model.search; +import android.os.Parcel; +import android.os.Parcelable; + import com.google.gson.annotations.SerializedName; /** * Created by stevenwatremez on 03/04/16. * */ -public class VideoFromSearch { +public class VideoFromSearch implements Parcelable { /***************************************************************** * DATA @@ -18,6 +21,8 @@ public class VideoFromSearch { @SerializedName("title") public String title; @SerializedName("thumbnails") public Thumbnail thumbnails; + + public class Thumbnail { @SerializedName("default") public DefaultResolution defaultResolution; @SerializedName("high") public HighResolution highResolution; @@ -38,4 +43,41 @@ public class MediumResolution { * CONSTRUCTOR ****************************************************************/ public VideoFromSearch() {} + + /***************************************************************** + * PARCELABLE + ****************************************************************/ + protected VideoFromSearch(Parcel in) { + channelId = in.readString(); + channelTitle = in.readString(); + description = in.readString(); + publishedAt = in.readString(); + title = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public VideoFromSearch createFromParcel(Parcel in) { + return new VideoFromSearch(in); + } + + @Override + public VideoFromSearch[] newArray(int size) { + return new VideoFromSearch[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeString(channelId); + parcel.writeString(channelTitle); + parcel.writeString(description); + parcel.writeString(publishedAt); + parcel.writeString(title); + } } diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/search/SearchRecyclerViewAdapter.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/search/SearchRecyclerViewAdapter.java index 334d32c..74ba1d7 100644 --- a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/search/SearchRecyclerViewAdapter.java +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/search/SearchRecyclerViewAdapter.java @@ -11,6 +11,7 @@ import android.widget.Toast; import com.squareup.picasso.Picasso; +import com.tubb.smrv.SwipeMenuLayout; import java.util.List; @@ -26,6 +27,12 @@ */ public class SearchRecyclerViewAdapter extends RecyclerView.Adapter{ + /***************************************************************** + * DATA + ****************************************************************/ + final private static int VIEW_TYPE_ENABLE = 0; + final private static int VIEW_TYPE_DISABLE = 1; + /***************************************************************** * DATA ****************************************************************/ @@ -53,7 +60,8 @@ public SearchRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, @Override public void onBindViewHolder(ViewHolder holder, int position) { final Search item = mItems.get(position); - holder.setItem(item); + boolean swipeEnable = swipeEnableByViewType(getItemViewType(position)); + holder.setItem(item, swipeEnable); } @Override @@ -71,6 +79,7 @@ public static class ViewHolder extends RecyclerView.ViewHolder { public ImageView searchVideoImage; private Context mContext; private Search mItem; + private SwipeMenuLayout sml; public ViewHolder(@NonNull final View itemView, @NonNull final Context context) { super(itemView); @@ -79,11 +88,13 @@ public ViewHolder(@NonNull final View itemView, @NonNull final Context context) searchVideotitle = (TextView) itemView.findViewById(R.id.search_video_title); searchVideoDescription = (TextView) itemView.findViewById(R.id.search_video_description); searchVideoImage = (ImageView) itemView.findViewById(R.id.search_video_logo); + sml = (SwipeMenuLayout) itemView.findViewById(R.id.sml); itemView.findViewById(R.id.btLeft).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext, "left button onclick", Toast.LENGTH_SHORT).show(); + VideoDetailsActivity.start(mContext, mItem); } }); @@ -95,7 +106,7 @@ public void onClick(View v) { }); } - public void setItem(Search item) { + public void setItem(@NonNull final Search item, final boolean swipeEnable) { mItem = item; itemView.setTag(item); searchVideotitle.setText(item.snippet.title); @@ -105,18 +116,12 @@ public void setItem(Search item) { .placeholder(R.mipmap.ic_launcher_youcodeio) .error(R.mipmap.ic_launcher_youcodeio) .into(searchVideoImage); + + sml.setSwipeEnable(swipeEnable); } -/* - @Override - public void onClick(View view) { - //ChannelLatestVideosActivity.start(mContext, mItem); - Toast.makeText(mContext, "implement click", Toast.LENGTH_SHORT).show(); - }*/ -/* - @Override - public boolean onLongClick(View view) { - Toast.makeText(mContext, "implement Long click", Toast.LENGTH_SHORT).show(); - return true; - }*/ + } + + private boolean swipeEnableByViewType(int viewType) { + return viewType == VIEW_TYPE_ENABLE; } } diff --git a/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/search/VideoDetailsActivity.java b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/search/VideoDetailsActivity.java new file mode 100644 index 0000000..d171443 --- /dev/null +++ b/youcodeio/mobile/src/main/java/team/io/youcodeio/ui/adapter/search/VideoDetailsActivity.java @@ -0,0 +1,92 @@ +package team.io.youcodeio.ui.adapter.search; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; +import android.widget.ImageButton; +import android.widget.TextView; + +import com.f2prateek.dart.Dart; +import com.f2prateek.dart.InjectExtra; + +import org.w3c.dom.Text; + +import butterknife.Bind; +import butterknife.ButterKnife; +import butterknife.OnClick; +import team.io.youcodeio.R; +import team.io.youcodeio.model.search.Search; + +/** + * Created by steven_watremez on 25/04/16. + * + */ +public class VideoDetailsActivity extends AppCompatActivity { + + /***************************************************************** + * STATIC + ****************************************************************/ + final private static String BUNDLE_VIDEO = "BUNDLE_VIDEO"; + + /***************************************************************** + * DATA + ****************************************************************/ + @InjectExtra(BUNDLE_VIDEO) + Search mVideo; + + /***************************************************************** + * UI + ****************************************************************/ + @Bind(R.id.details_video_title) + TextView mVideoTitleTextView; + + @Bind(R.id.details_video_description) + TextView mVideoDescriptionTextView; + + @Bind(R.id.details_video_channel_title) + TextView mChannelTitleTextView; + + @Bind(R.id.details_video_channel_description) + TextView mChannelDescriptionTextView; + + /***************************************************************** + * STARTER + ****************************************************************/ + public static void start(@NonNull final Context context, @NonNull final Search video) { + Intent starter = new Intent(context, VideoDetailsActivity.class); + starter.putExtra(BUNDLE_VIDEO, video); + context.startActivity(starter); + } + + /***************************************************************** + * LIFE CYCLE + ****************************************************************/ + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_video_details); + Dart.inject(this); + ButterKnife.bind(this); + initUI(); + } + + @OnClick(R.id.details_close_image_button) + public void onClickClose() { + finish(); + } + + /***************************************************************** + * PRIVATE METHODS + ****************************************************************/ + private void initUI() { + Bundle bundle = getIntent().getExtras(); // getArguments() for a Fragment + mVideo = Dart.get(bundle, BUNDLE_VIDEO); // User implements Parcelable + + mVideoTitleTextView.setText(mVideo.snippet.title); + mVideoDescriptionTextView.setText(mVideo.snippet.description); + mChannelTitleTextView.setText(mVideo.snippet.channelTitle); + } +} diff --git a/youcodeio/mobile/src/main/res/layout/activity_video_details.xml b/youcodeio/mobile/src/main/res/layout/activity_video_details.xml new file mode 100644 index 0000000..1408e2f --- /dev/null +++ b/youcodeio/mobile/src/main/res/layout/activity_video_details.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + \ No newline at end of file