diff --git a/app/build.gradle b/app/build.gradle index ace5310..5946b7b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -29,5 +29,7 @@ dependencies { compile 'com.android.volley:volley:1.0.0' compile 'com.google.code.gson:gson:2.4' compile 'com.android.support:support-v4:24.2.1' + compile 'com.android.support:recyclerview-v7:24.2.1' testCompile 'junit:junit:4.12' + compile 'com.android.support:gridlayout-v7:24.2.1' } diff --git a/app/src/main/java/net/plil/clubinfo/etunicorn/app/ConsomationRecyclerViewAdapter.java b/app/src/main/java/net/plil/clubinfo/etunicorn/app/ConsomationRecyclerViewAdapter.java new file mode 100644 index 0000000..1e187ac --- /dev/null +++ b/app/src/main/java/net/plil/clubinfo/etunicorn/app/ConsomationRecyclerViewAdapter.java @@ -0,0 +1,77 @@ +package net.plil.clubinfo.etunicorn.app; + +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import net.plil.clubinfo.etunicorn.R; +import net.plil.clubinfo.etunicorn.data.Consomation; + +import java.util.List; +import java.util.Locale; + + +public class ConsomationRecyclerViewAdapter extends RecyclerView.Adapter { + + private final List mValues; + private final FragmentConsomation.OnListFragmentInteractionListener mListener; + + public ConsomationRecyclerViewAdapter(List items, FragmentConsomation.OnListFragmentInteractionListener listener) { + mValues = items; + mListener = listener; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.fragment_consomation_item, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(final ViewHolder holder, int position) { + holder.mItem = mValues.get(position); + holder.mIdView.setText(String.format(Locale.FRANCE, "%d", mValues.get(position).getIdConsomation())); + holder.mContentView.setText(mValues.get(position).getNomConsomation()); + holder.mPriceView.setText(String.format(Locale.FRANCE, "%f",mValues.get(position).getPrix())); + + holder.mView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (null != mListener) { + // Notify the active callbacks interface (the activity, if the + // fragment is attached to one) that an item has been selected. + mListener.onListFragmentInteraction(holder.mItem); + } + } + }); + } + + @Override + public int getItemCount() { + return mValues.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + public final View mView; + public final TextView mIdView; + public final TextView mContentView; + public final TextView mPriceView; + public Consomation mItem; + + public ViewHolder(View view) { + super(view); + mView = view; + mIdView = (TextView) view.findViewById(R.id.consomation_id); + mContentView = (TextView) view.findViewById(R.id.consomation_name); + mPriceView = (TextView) view.findViewById(R.id.consomation_price); + } + + @Override + public String toString() { + return super.toString() + " '" + mContentView.getText() + "'"; + } + } +} diff --git a/app/src/main/java/net/plil/clubinfo/etunicorn/app/Crediter.java b/app/src/main/java/net/plil/clubinfo/etunicorn/app/Crediter.java index 62d2b5a..575d59e 100644 --- a/app/src/main/java/net/plil/clubinfo/etunicorn/app/Crediter.java +++ b/app/src/main/java/net/plil/clubinfo/etunicorn/app/Crediter.java @@ -1,21 +1,26 @@ package net.plil.clubinfo.etunicorn.app; import android.content.Context; -import android.content.Intent; import android.net.Uri; -import android.nfc.NdefMessage; -import android.nfc.NfcAdapter; -import android.nfc.NfcEvent; import android.os.Bundle; -import android.os.Parcelable; -import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.ProgressBar; import android.widget.Toast; +import com.android.volley.Request; +import com.android.volley.Response; +import com.android.volley.VolleyError; +import com.android.volley.toolbox.JsonObjectRequest; + import net.plil.clubinfo.etunicorn.R; +import net.plil.clubinfo.etunicorn.utils.VolleyUtils; + +import org.json.JSONException; +import org.json.JSONObject; /** * A simple {@link Fragment} subclass. @@ -26,44 +31,33 @@ import net.plil.clubinfo.etunicorn.R; * create an instance of this fragment. */ public class Crediter extends FragmentNFC { - NfcAdapter mNfcAdapter; + private OnFragmentInteractionListener mListener; + private EditText mMoneyEditText; + private ProgressBar mProgressBar; + public Crediter() { // Required empty public constructor } - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @return A new instance of fragment Crediter. - */ public static Crediter newInstance() { - Crediter fragment = new Crediter(); - return fragment; + return new Crediter(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mNfcAdapter = NfcAdapter.getDefaultAdapter(getContext()); - if (mNfcAdapter == null) { - Toast.makeText(getActivity(), "NFC is not available", Toast.LENGTH_LONG).show(); - return; - } - if (!mNfcAdapter.isEnabled()){ - Toast.makeText(getActivity(), "NFC is not enabled, please turn it on", Toast.LENGTH_LONG).show(); - } - } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_crediter, container, false); + View view = inflater.inflate(R.layout.fragment_crediter, container, false); + mMoneyEditText = (EditText) view.findViewById(R.id.crediter_ask_money); + mProgressBar = (ProgressBar) view.findViewById(R.id.crediter_progress_bar); + return view; } @@ -88,7 +82,29 @@ public class Crediter extends FragmentNFC { @Override public void processNFC() { - Toast.makeText(getContext(), "DONE !!!!", Toast.LENGTH_LONG).show(); + mProgressBar.setVisibility(View.VISIBLE); + JSONObject jsonObject = new JSONObject(); + try { + jsonObject.put("participant", 1); + jsonObject.put("acteur", 2); + jsonObject.put("prix", Double.parseDouble(mMoneyEditText.getText().toString())); + } catch (JSONException e){ + e.printStackTrace(); + } + JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, VolleyUtils.baseUri + "/transaction/debit" ,jsonObject , new Response.Listener() { + @Override + public void onResponse(JSONObject response) { + mProgressBar.setVisibility(View.GONE); + } + }, new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + mProgressBar.setVisibility(View.GONE); + } + } + ); + + VolleyUtils.getInstance(getContext()).addToRequestQueue(jsonObjectRequest); } diff --git a/app/src/main/java/net/plil/clubinfo/etunicorn/app/Debiter.java b/app/src/main/java/net/plil/clubinfo/etunicorn/app/Debiter.java index d4d647c..7450a82 100644 --- a/app/src/main/java/net/plil/clubinfo/etunicorn/app/Debiter.java +++ b/app/src/main/java/net/plil/clubinfo/etunicorn/app/Debiter.java @@ -36,7 +36,7 @@ import org.json.JSONObject; * create an instance of this fragment. */ public class Debiter extends FragmentNFC { - // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + private EditText mMoneyEditText; private ProgressBar mProgressBar; @@ -49,8 +49,7 @@ public class Debiter extends FragmentNFC { } public static Debiter newInstance() { - Debiter fragment = new Debiter(); - return fragment; + return new Debiter(); } @Override diff --git a/app/src/main/java/net/plil/clubinfo/etunicorn/app/FragmentConsomation.java b/app/src/main/java/net/plil/clubinfo/etunicorn/app/FragmentConsomation.java new file mode 100644 index 0000000..b7cdfa4 --- /dev/null +++ b/app/src/main/java/net/plil/clubinfo/etunicorn/app/FragmentConsomation.java @@ -0,0 +1,117 @@ +package net.plil.clubinfo.etunicorn.app; + +import android.content.Context; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v7.widget.GridLayoutManager; +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 net.plil.clubinfo.etunicorn.R; +import net.plil.clubinfo.etunicorn.data.Consomation; + +import java.util.ArrayList; +import java.util.List; + +/** + * A fragment representing a list of Items. + *

+ * Activities containing this fragment MUST implement the {@link OnListFragmentInteractionListener} + * interface. + */ +public class FragmentConsomation extends FragmentNFC { + + private int mColumnCount = 1; + private OnListFragmentInteractionListener mListener; + + /** + * Mandatory empty constructor for the fragment manager to instantiate the + * fragment (e.g. upon screen orientation changes). + */ + public FragmentConsomation() { + } + + public static FragmentConsomation newInstance() { + return new FragmentConsomation(); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_consomation_item_list, container, false); + RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.consomation_list); + // Set the adapter + Context context = recyclerView.getContext(); + if (mColumnCount <= 1) { + recyclerView.setLayoutManager(new LinearLayoutManager(context)); + } else { + recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount)); + } + List consomationList = new ArrayList<>(); + Consomation c1 = new Consomation(); + c1.setIdConsomation(1); + c1.setNomConsomation("Hello"); + c1.setPrix(12.5); + consomationList.add(c1); + c1 = new Consomation(); + c1.setIdConsomation(2); + c1.setNomConsomation("World"); + c1.setPrix(42.407); + consomationList.add(c1); + for (int i = 0; i< 100; ++i){ + c1 = new Consomation(); + c1.setIdConsomation(i); + c1.setNomConsomation("World"); + c1.setPrix(42.407); + consomationList.add(c1); + } + recyclerView.setAdapter(new ConsomationRecyclerViewAdapter(consomationList, mListener)); + + return view; + } + + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof OnListFragmentInteractionListener) { + mListener = (OnListFragmentInteractionListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement OnListFragmentInteractionListener"); + } + } + + @Override + public void onDetach() { + super.onDetach(); + mListener = null; + } + + @Override + public void processNFC() { + + } + + /** + * This interface must be implemented by activities that contain this + * fragment to allow an interaction in this fragment to be communicated + * to the activity and potentially other fragments contained in that + * activity. + *

+ * See the Android Training lesson Communicating with Other Fragments for more information. + */ + public interface OnListFragmentInteractionListener { + void onListFragmentInteraction(Consomation item); + } +} diff --git a/app/src/main/java/net/plil/clubinfo/etunicorn/app/MainActivity.java b/app/src/main/java/net/plil/clubinfo/etunicorn/app/MainActivity.java index 1a485f6..6a304a1 100644 --- a/app/src/main/java/net/plil/clubinfo/etunicorn/app/MainActivity.java +++ b/app/src/main/java/net/plil/clubinfo/etunicorn/app/MainActivity.java @@ -4,24 +4,22 @@ import android.app.PendingIntent; import android.content.Intent; import android.net.Uri; import android.nfc.NfcAdapter; +import android.os.Bundle; import android.support.design.widget.TabLayout; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; - import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; -import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; -import android.widget.Toast; - import net.plil.clubinfo.etunicorn.R; +import net.plil.clubinfo.etunicorn.data.Consomation; -public class MainActivity extends AppCompatActivity implements Crediter.OnFragmentInteractionListener, Debiter.OnFragmentInteractionListener{ +public class MainActivity extends AppCompatActivity implements Crediter.OnFragmentInteractionListener, Debiter.OnFragmentInteractionListener, FragmentConsomation.OnListFragmentInteractionListener{ /** * The {@link android.support.v4.view.PagerAdapter} that will provide @@ -121,6 +119,11 @@ public class MainActivity extends AppCompatActivity implements Crediter.OnFragme } + @Override + public void onListFragmentInteraction(Consomation item) { + + } + /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to * one of the sections/tabs/pages. @@ -133,20 +136,19 @@ public class MainActivity extends AppCompatActivity implements Crediter.OnFragme @Override public Fragment getItem(int position) { - // getItem is called to instantiate the fragment for the given page. - // Return a PlaceholderFragment (defined as a static inner class below). if (position == Action.CREDITER.getValue()) return Crediter.newInstance(); else if (position == Action.DEBITER.getValue()) return Debiter.newInstance(); + else if (position == Action.CONSOMATION.getValue()) + return FragmentConsomation.newInstance(); else return null; } @Override public int getCount() { - // Show 3 total pages. - return 2; + return 3; } @Override @@ -155,12 +157,14 @@ public class MainActivity extends AppCompatActivity implements Crediter.OnFragme return "Debiter"; else if (position == Action.CREDITER.getValue()) return "Crediter"; + else if (position == Action.CONSOMATION.getValue()) + return "Consomation"; return null; } } private enum Action { - DEBITER(0), CREDITER(1); + DEBITER(0), CREDITER(1), CONSOMATION(2); private final int value; Action(int value) { diff --git a/app/src/main/java/net/plil/clubinfo/etunicorn/data/Consomation.java b/app/src/main/java/net/plil/clubinfo/etunicorn/data/Consomation.java new file mode 100644 index 0000000..6a09b48 --- /dev/null +++ b/app/src/main/java/net/plil/clubinfo/etunicorn/data/Consomation.java @@ -0,0 +1,38 @@ +package net.plil.clubinfo.etunicorn.data; + +/** + * Created by badetitou on 29/01/2017. + */ + +public class Consomation { + private int idConsomation; + private String nomConsomation; + private double prix; + + public Consomation() { + } + + public int getIdConsomation() { + return idConsomation; + } + + public void setIdConsomation(int idConsomation) { + this.idConsomation = idConsomation; + } + + public String getNomConsomation() { + return nomConsomation; + } + + public void setNomConsomation(String nomConsomation) { + this.nomConsomation = nomConsomation; + } + + public double getPrix() { + return prix; + } + + public void setPrix(double prix) { + this.prix = prix; + } +} diff --git a/app/src/main/java/net/plil/clubinfo/etunicorn/utils/ScrollAwareFABBehavior.java b/app/src/main/java/net/plil/clubinfo/etunicorn/utils/ScrollAwareFABBehavior.java new file mode 100644 index 0000000..37b883b --- /dev/null +++ b/app/src/main/java/net/plil/clubinfo/etunicorn/utils/ScrollAwareFABBehavior.java @@ -0,0 +1,41 @@ +package net.plil.clubinfo.etunicorn.utils; + +import android.content.Context; +import android.support.design.widget.CoordinatorLayout; +import android.support.design.widget.FloatingActionButton; +import android.support.v4.view.ViewCompat; +import android.util.AttributeSet; +import android.view.View; + +/** + * Created by badetitou on 29/01/2017. + */ + +public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior { + + public ScrollAwareFABBehavior(Context context, AttributeSet attrs) { + super(); + } + + + @Override + public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, + FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) { + return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL || + super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, + nestedScrollAxes); + } + + @Override + public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, + View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { + super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, + dyUnconsumed); + + if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) { + child.hide(); + } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) { + child.show(); + } + } +} diff --git a/app/src/main/res/layout/fragment_consomation_item.xml b/app/src/main/res/layout/fragment_consomation_item.xml new file mode 100644 index 0000000..e6759a0 --- /dev/null +++ b/app/src/main/res/layout/fragment_consomation_item.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_consomation_item_list.xml b/app/src/main/res/layout/fragment_consomation_item_list.xml new file mode 100644 index 0000000..154803a --- /dev/null +++ b/app/src/main/res/layout/fragment_consomation_item_list.xml @@ -0,0 +1,36 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_crediter.xml b/app/src/main/res/layout/fragment_crediter.xml index 78d4c1a..4cde597 100644 --- a/app/src/main/res/layout/fragment_crediter.xml +++ b/app/src/main/res/layout/fragment_crediter.xml @@ -1,13 +1,29 @@ - - - + - + + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index cef3abc..7d9415a 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -4,4 +4,5 @@ 16dp 16dp 8dp + 16dp -- libgit2 0.21.2