+ * See the Android Training lesson Communicating with Other Fragments for more information. + */ + interface OnLoginFragmentInteractionListener { + // TODO: Update argument type and name + void onLoginFragmentInteraction(Uri uri); + } +} diff --git a/app/src/main/java/de/hwr_berlin/it14/postgrachelor/MainActivity.java b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/MainActivity.java index 303162c..7445ca3 100644 --- a/app/src/main/java/de/hwr_berlin/it14/postgrachelor/MainActivity.java +++ b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/MainActivity.java @@ -1,9 +1,11 @@ package de.hwr_berlin.it14.postgrachelor; +import android.app.FragmentManager; +import android.app.FragmentTransaction; +import android.net.Uri; import android.os.Bundle; -import android.support.design.widget.FloatingActionButton; -import android.support.design.widget.Snackbar; -import android.view.View; +import android.support.annotation.NonNull; +import android.util.Log; import android.support.design.widget.NavigationView; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; @@ -12,34 +14,109 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; +import android.widget.TextView; + +import de.hwr_berlin.it14.postgrachelor.Exceptions.NotInstantiatedException; +import de.hwr_berlin.it14.postgrachelor.Services.LoginService; public class MainActivity extends AppCompatActivity - implements NavigationView.OnNavigationItemSelectedListener { + implements NavigationView.OnNavigationItemSelectedListener, + MainFragment.OnMainFragmentInteractionListener, + LoginFragment.OnLoginFragmentInteractionListener, + QuestionEndFragment.OnQuestionEndFragmentInteractionListener, + QuestionFragment.OnQuestionFragmentInteractionListener, + QuestionStartFragment.OnQuestionStartFragmentInteractionListener { + + FragmentManager myFragmentManager; + MainFragment mainFragment; + LoginFragment loginFragment; + QuestionStartFragment questionStartFragment; + QuestionEndFragment questionEndFragment; + QuestionFragment questionFragment; + boolean listenerAdded; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Log.d("Activity fragment", "create"); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); - FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); + /*FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } - }); + });*/ DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); - drawer.setDrawerListener(toggle); + drawer.addDrawerListener(toggle); toggle.syncState(); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); + + // content + myFragmentManager = getFragmentManager(); + mainFragment = MainFragment.newInstance("a", "b"); + loginFragment = LoginFragment.newInstance("a", "b"); + questionEndFragment = QuestionEndFragment.newInstance("a", "b"); + questionStartFragment = QuestionStartFragment.newInstance("a", "b"); + questionFragment = QuestionFragment.newInstance("a", "b"); + + /*Log.d("Activity fragment", "test2"); + JsonRequestPG requester = new JsonRequestPG("register.php", null, this, new JsonRequestPG.AsyncResponse() { + @Override + public void processFinish(JSONObject output) { + Log.d("Activity fragment", "output"); + Log.d("Activity fragment", output.toString()); + } + + @Override + public void processError(int status, String message) { + Log.d("Activity fragment", "error"); + Log.d("Activity fragment", "status: "+status+" - message: "+message); + } + }); + requester.execute();*/ + + LoginService.instantiate(this); + listenerAdded = false; + } + + @Override + protected void onStart() { + super.onStart(); + final MainActivity that = this; + if (!listenerAdded) { + LoginService.addLoginEventListener(new LoginService.OnLoginEventListener() { + @Override + public void onLoginEvent(String name, String uid) { + Log.d("Activity fragment", "onLogin - name: " + name + " - uid: " + uid); + NavigationView nav_view = (NavigationView) that.findViewById(R.id.nav_view); + TextView user_uid = (TextView) nav_view.getHeaderView(0).findViewById(R.id.user_uid); + TextView user_name = (TextView) nav_view.getHeaderView(0).findViewById(R.id.user_name); + Log.d("Activity fragment", "user_name "+user_name); + Log.d("Activity fragment", "user_uid "+user_uid); + Log.d("Activity fragment", "nav_view "+nav_view); + user_name.setText(name); + user_uid.setText(uid); + that.onNavigationItemSelectedID(R.id.nav_gallery); + } + + @Override + public void onLogoutEvent(int status, String message) { + Log.d("Activity fragment", "onLogout - name: " + status + " - uid: " + message); + that.onNavigationItemSelectedID(R.id.nav_camera); + } + }); + listenerAdded = true; + } } @Override @@ -74,28 +151,96 @@ public class MainActivity extends AppCompatActivity return super.onOptionsItemSelected(item); } - @SuppressWarnings("StatementWithEmptyBody") @Override - public boolean onNavigationItemSelected(MenuItem item) { + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + return this.onNavigationItemSelectedID(item.getItemId()); + } + + public boolean onNavigationItemSelectedID(int item) { + Log.d("Activity fragment", "itemselect"+item); // Handle navigation view item clicks here. - int id = item.getItemId(); + try { + boolean isLoggedIn = LoginService.isLoggedIn(); + if (!isLoggedIn && (item != R.id.nav_camera)) { + return false; + } else if (isLoggedIn && (item == R.id.nav_camera)) { + return false; + } + } catch (NotInstantiatedException e) { + e.printStackTrace(); + } - if (id == R.id.nav_camera) { + if (item == R.id.nav_camera) { // Handle the camera action - } else if (id == R.id.nav_gallery) { - - } else if (id == R.id.nav_slideshow) { - - } else if (id == R.id.nav_manage) { - - } else if (id == R.id.nav_share) { - - } else if (id == R.id.nav_send) { - + LoginFragment fragment = (LoginFragment) myFragmentManager.findFragmentByTag(LoginFragment.NAME); + if (fragment == null) { + FragmentTransaction fragmentTransaction = myFragmentManager.beginTransaction(); + fragmentTransaction.replace(R.id.relative_content, loginFragment, LoginFragment.NAME); + fragmentTransaction.commit(); + } + } else if (item == R.id.nav_gallery) { + MainFragment fragment = (MainFragment) myFragmentManager.findFragmentByTag(MainFragment.NAME); + if (fragment == null) { + FragmentTransaction fragmentTransaction = myFragmentManager.beginTransaction(); + fragmentTransaction.replace(R.id.relative_content, mainFragment, MainFragment.NAME); + fragmentTransaction.commit(); + } + } else if (item == R.id.nav_slideshow) { + QuestionEndFragment fragment = (QuestionEndFragment) myFragmentManager.findFragmentByTag(QuestionEndFragment.NAME); + if (fragment == null) { + FragmentTransaction fragmentTransaction = myFragmentManager.beginTransaction(); + fragmentTransaction.replace(R.id.relative_content, questionEndFragment, QuestionEndFragment.NAME); + fragmentTransaction.commit(); + } + } else if (item == R.id.nav_manage) { + QuestionFragment fragment = (QuestionFragment) myFragmentManager.findFragmentByTag(QuestionFragment.NAME); + if (fragment == null) { + FragmentTransaction fragmentTransaction = myFragmentManager.beginTransaction(); + fragmentTransaction.replace(R.id.relative_content, questionFragment, QuestionFragment.NAME); + fragmentTransaction.commit(); + } + } else if (item == R.id.nav_share) { + QuestionStartFragment fragment = (QuestionStartFragment) myFragmentManager.findFragmentByTag(QuestionStartFragment.NAME); + if (fragment == null) { + FragmentTransaction fragmentTransaction = myFragmentManager.beginTransaction(); + fragmentTransaction.replace(R.id.relative_content, questionStartFragment, QuestionStartFragment.NAME); + fragmentTransaction.commit(); + } } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + NavigationView navigation = (NavigationView) drawer.findViewById(R.id.nav_view); drawer.closeDrawer(GravityCompat.START); return true; } + + @Override + public void onMainFragmentInteraction(Uri uri) { + System.out.print("fragment message"); + System.out.print(uri); + } + + @Override + public void onLoginFragmentInteraction(Uri uri) { + System.out.print("fragment message login"); + System.out.print(uri); + } + + @Override + public void onQuestionEndFragmentInteraction(Uri uri) { + System.out.print("fragment message question end"); + System.out.print(uri); + } + + @Override + public void onQuestionFragmentInteraction(Uri uri) { + System.out.print("fragment message question"); + System.out.print(uri); + } + + @Override + public void onQuestionStartFragmentInteraction(Uri uri) { + System.out.print("fragment message question"); + System.out.print(uri); + } } diff --git a/app/src/main/java/de/hwr_berlin/it14/postgrachelor/MainFragment.java b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/MainFragment.java new file mode 100644 index 0000000..1100f3c --- /dev/null +++ b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/MainFragment.java @@ -0,0 +1,128 @@ +package de.hwr_berlin.it14.postgrachelor; + +import android.content.Context; +import android.net.Uri; +import android.os.Bundle; +import android.app.Fragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import de.hwr_berlin.it14.postgrachelor.Services.LoginService; + +/** + * A simple {@link Fragment} subclass. + * Activities that contain this fragment must implement the + * {@link MainFragment.OnMainFragmentInteractionListener} interface + * to handle interaction events. + * Use the {@link MainFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class MainFragment extends Fragment { + public static final String NAME = "MAIN_FRAGMENT"; + // TODO: Rename parameter arguments, choose names that match + // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + private static final String ARG_PARAM1 = "param1"; + private static final String ARG_PARAM2 = "param2"; + + // TODO: Rename and change types of parameters + private String mParam1; + private String mParam2; + + private boolean listener = false; + private OnMainFragmentInteractionListener mListener; + + public MainFragment() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment MainFragment. + */ + // TODO: Rename and change types and number of parameters + public static MainFragment newInstance(String param1, String param2) { + MainFragment fragment = new MainFragment(); + Bundle args = new Bundle(); + args.putString(ARG_PARAM1, param1); + args.putString(ARG_PARAM2, param2); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mParam1 = getArguments().getString(ARG_PARAM1); + mParam2 = getArguments().getString(ARG_PARAM2); + } + this.listener = false; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + final View view = inflater.inflate(R.layout.fragment_main, container, false); + if (!this.listener) { + LoginService.addLoginEventListener(new LoginService.OnLoginEventListener() { + @Override + public void onLoginEvent(String name, String uid) { + TextView textView = (TextView) view.findViewById(R.id.fragment_main_status).findViewById(R.id.fragment_user_name); + textView.setText(name); + Log.d(NAME, "onLogin"); + } + + @Override public void onLogoutEvent(int status, String message) {} + }); + this.listener = true; + } + // Inflate the layout for this fragment + return view; + } + + // TODO: Rename method, update argument and hook method into UI event + public void onButtonPressed(Uri uri) { + if (mListener != null) { + mListener.onMainFragmentInteraction(uri); + } + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof OnMainFragmentInteractionListener) { + mListener = (OnMainFragmentInteractionListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement OnMainFragmentInteractionListener"); + } + } + + @Override + public void onDetach() { + super.onDetach(); + mListener = null; + } + + /** + * 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. + */ + interface OnMainFragmentInteractionListener { + // TODO: Update argument type and name + void onMainFragmentInteraction(Uri uri); + } +} diff --git a/app/src/main/java/de/hwr_berlin/it14/postgrachelor/QuestionEndFragment.java b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/QuestionEndFragment.java new file mode 100644 index 0000000..efeffeb --- /dev/null +++ b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/QuestionEndFragment.java @@ -0,0 +1,109 @@ +package de.hwr_berlin.it14.postgrachelor; + +import android.content.Context; +import android.net.Uri; +import android.os.Bundle; +import android.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + + +/** + * A simple {@link Fragment} subclass. + * Activities that contain this fragment must implement the + * {@link QuestionEndFragment.OnQuestionEndFragmentInteractionListener} interface + * to handle interaction events. + * Use the {@link QuestionEndFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class QuestionEndFragment extends Fragment { + public static final String NAME = "QUESTION_END_FRAGMENT"; + // TODO: Rename parameter arguments, choose names that match + // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + private static final String ARG_PARAM1 = "param1"; + private static final String ARG_PARAM2 = "param2"; + + // TODO: Rename and change types of parameters + private String mParam1; + private String mParam2; + + private OnQuestionEndFragmentInteractionListener mListener; + + public QuestionEndFragment() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment QuestionEndFragment. + */ + // TODO: Rename and change types and number of parameters + public static QuestionEndFragment newInstance(String param1, String param2) { + QuestionEndFragment fragment = new QuestionEndFragment(); + Bundle args = new Bundle(); + args.putString(ARG_PARAM1, param1); + args.putString(ARG_PARAM2, param2); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mParam1 = getArguments().getString(ARG_PARAM1); + mParam2 = getArguments().getString(ARG_PARAM2); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_question_end, container, false); + } + + // TODO: Rename method, update argument and hook method into UI event + public void onButtonPressed(Uri uri) { + if (mListener != null) { + mListener.onQuestionEndFragmentInteraction(uri); + } + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof OnQuestionEndFragmentInteractionListener) { + mListener = (OnQuestionEndFragmentInteractionListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement OnQuestionEndFragmentInteractionListener"); + } + } + + @Override + public void onDetach() { + super.onDetach(); + mListener = null; + } + + /** + * 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. + */ + interface OnQuestionEndFragmentInteractionListener { + // TODO: Update argument type and name + void onQuestionEndFragmentInteraction(Uri uri); + } +} diff --git a/app/src/main/java/de/hwr_berlin/it14/postgrachelor/QuestionFragment.java b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/QuestionFragment.java new file mode 100644 index 0000000..290c46f --- /dev/null +++ b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/QuestionFragment.java @@ -0,0 +1,109 @@ +package de.hwr_berlin.it14.postgrachelor; + +import android.content.Context; +import android.net.Uri; +import android.os.Bundle; +import android.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + + +/** + * A simple {@link Fragment} subclass. + * Activities that contain this fragment must implement the + * {@link QuestionFragment.OnQuestionFragmentInteractionListener} interface + * to handle interaction events. + * Use the {@link QuestionFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class QuestionFragment extends Fragment { + public static final String NAME = "QUESTION_FRAGMENT"; + // TODO: Rename parameter arguments, choose names that match + // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + private static final String ARG_PARAM1 = "param1"; + private static final String ARG_PARAM2 = "param2"; + + // TODO: Rename and change types of parameters + private String mParam1; + private String mParam2; + + private OnQuestionFragmentInteractionListener mListener; + + public QuestionFragment() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment QuestionFragment. + */ + // TODO: Rename and change types and number of parameters + public static QuestionFragment newInstance(String param1, String param2) { + QuestionFragment fragment = new QuestionFragment(); + Bundle args = new Bundle(); + args.putString(ARG_PARAM1, param1); + args.putString(ARG_PARAM2, param2); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mParam1 = getArguments().getString(ARG_PARAM1); + mParam2 = getArguments().getString(ARG_PARAM2); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_question, container, false); + } + + // TODO: Rename method, update argument and hook method into UI event + public void onButtonPressed(Uri uri) { + if (mListener != null) { + mListener.onQuestionFragmentInteraction(uri); + } + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof OnQuestionFragmentInteractionListener) { + mListener = (OnQuestionFragmentInteractionListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement OnFragmentInteractionListener"); + } + } + + @Override + public void onDetach() { + super.onDetach(); + mListener = null; + } + + /** + * 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. + */ + interface OnQuestionFragmentInteractionListener { + // TODO: Update argument type and name + void onQuestionFragmentInteraction(Uri uri); + } +} diff --git a/app/src/main/java/de/hwr_berlin/it14/postgrachelor/QuestionStartFragment.java b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/QuestionStartFragment.java new file mode 100644 index 0000000..66cc412 --- /dev/null +++ b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/QuestionStartFragment.java @@ -0,0 +1,109 @@ +package de.hwr_berlin.it14.postgrachelor; + +import android.app.Fragment; +import android.content.Context; +import android.net.Uri; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + + +/** + * A simple {@link Fragment} subclass. + * Activities that contain this fragment must implement the + * {@link QuestionStartFragment.OnQuestionStartFragmentInteractionListener} interface + * to handle interaction events. + * Use the {@link QuestionStartFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class QuestionStartFragment extends Fragment { + public static final String NAME = "QUESTION_START_FRAGMENT"; + // TODO: Rename parameter arguments, choose names that match + // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + private static final String ARG_PARAM1 = "param1"; + private static final String ARG_PARAM2 = "param2"; + + // TODO: Rename and change types of parameters + private String mParam1; + private String mParam2; + + private OnQuestionStartFragmentInteractionListener mListener; + + public QuestionStartFragment() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment QuestionStartFragment. + */ + // TODO: Rename and change types and number of parameters + public static QuestionStartFragment newInstance(String param1, String param2) { + QuestionStartFragment fragment = new QuestionStartFragment(); + Bundle args = new Bundle(); + args.putString(ARG_PARAM1, param1); + args.putString(ARG_PARAM2, param2); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mParam1 = getArguments().getString(ARG_PARAM1); + mParam2 = getArguments().getString(ARG_PARAM2); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_question_start, container, false); + } + + // TODO: Rename method, update argument and hook method into UI event + public void onButtonPressed(Uri uri) { + if (mListener != null) { + mListener.onQuestionStartFragmentInteraction(uri); + } + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof OnQuestionStartFragmentInteractionListener) { + mListener = (OnQuestionStartFragmentInteractionListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement OnQuestionStartFragmentInteractionListener"); + } + } + + @Override + public void onDetach() { + super.onDetach(); + mListener = null; + } + + /** + * 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.
+ */
+ interface OnQuestionStartFragmentInteractionListener {
+ // TODO: Update argument type and name
+ void onQuestionStartFragmentInteraction(Uri uri);
+ }
+}
diff --git a/app/src/main/java/de/hwr_berlin/it14/postgrachelor/Services/JsonRequest.java b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/Services/JsonRequest.java
new file mode 100644
index 0000000..4667e48
--- /dev/null
+++ b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/Services/JsonRequest.java
@@ -0,0 +1,141 @@
+package de.hwr_berlin.it14.postgrachelor.Services;
+
+import android.app.Activity;
+import android.app.ProgressDialog;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.util.Log;
+import android.widget.Toast;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.StringTokenizer;
+
+import static android.content.ContentValues.TAG;
+
+abstract class JsonRequest extends AsyncTask